ソースを参照

Initial commit

logicp 8 年 前
コミット
73808e260b
100 ファイル変更4581 行追加0 行削除
  1. 5 0
      boutique_data/boutique_data.info.yml
  2. 7 0
      boutique_data/boutique_data.links.menu.yml
  3. 475 0
      boutique_data/boutique_data.module
  4. 23 0
      boutique_data/boutique_data.routing.yml
  5. 39 0
      boutique_data/src/Controller/ZoneClearController.php
  6. 46 0
      boutique_data/src/Controller/boutique_dataController.php
  7. 5 0
      mapui/mapui.info.yml
  8. 6 0
      mapui/mapui.module
  9. 309 0
      mapui/src/Form/MapUiForm.php
  10. 36 0
      mapui/src/Plugin/Block/MapUIBlock.php
  11. 123 0
      mapui/src/Plugin/EntityReferenceSelection/BoutiqueSelection.php
  12. 14 0
      qd30map/composer.json
  13. BIN
      qd30map/css/19/0119-map_css.zip
  14. 381 0
      qd30map/css/map-util.css
  15. 353 0
      qd30map/css/map-utilOLD.css
  16. 423 0
      qd30map/css/minimap-util.css
  17. 578 0
      qd30map/css/qd30map.css
  18. 513 0
      qd30map/css/qd30mapOLD.css
  19. 352 0
      qd30map/css/qd30minimap.css
  20. 343 0
      qd30map/css/qd30minimapOLD.css
  21. 8 0
      qd30map/gfx/bg-grid.svg
  22. 34 0
      qd30map/gfx/bg-grill.svg
  23. 38 0
      qd30map/gfx/down.svg
  24. BIN
      qd30map/gfx/example-map.png
  25. 59 0
      qd30map/gfx/globe.svg
  26. 11 0
      qd30map/gfx/icon_calendar-b.svg
  27. 12 0
      qd30map/gfx/icon_calendar-w.svg
  28. 40 0
      qd30map/gfx/icon_car-b.svg
  29. 17 0
      qd30map/gfx/icon_grill.svg
  30. 8 0
      qd30map/gfx/icon_home.svg
  31. 9 0
      qd30map/gfx/icon_mappointer-b.svg
  32. 9 0
      qd30map/gfx/icon_mappointer-grey_outlined.svg
  33. 9 0
      qd30map/gfx/icon_mappointer-w.svg
  34. 9 0
      qd30map/gfx/icon_mappointer-w_outlined.svg
  35. 8 0
      qd30map/gfx/icon_menuclose-greydk.svg
  36. 9 0
      qd30map/gfx/icon_search-b.svg
  37. 10 0
      qd30map/gfx/icon_search.svg
  38. 36 0
      qd30map/gfx/in.svg
  39. 38 0
      qd30map/gfx/left.svg
  40. 20 0
      qd30map/gfx/map-navigate.svg
  41. 12 0
      qd30map/gfx/map-zoom.svg
  42. BIN
      qd30map/gfx/mapsearch.png
  43. BIN
      qd30map/gfx/markPin.png
  44. BIN
      qd30map/gfx/marker.png
  45. 36 0
      qd30map/gfx/out.svg
  46. 42 0
      qd30map/gfx/reset.svg
  47. 38 0
      qd30map/gfx/right.svg
  48. 38 0
      qd30map/gfx/up.svg
  49. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json
  50. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json
  51. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json
  52. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json
  53. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json
  54. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json
  55. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json
  56. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json
  57. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json
  58. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json
  59. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json
  60. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json
  61. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json
  62. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json
  63. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json
  64. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json
  65. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json
  66. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json
  67. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json
  68. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json
  69. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json
  70. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json
  71. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json
  72. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json
  73. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json
  74. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json
  75. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json
  76. 0 0
      qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json
  77. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg
  78. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg
  79. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg
  80. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg
  81. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg
  82. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg
  83. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg
  84. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg
  85. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg
  86. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg
  87. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg
  88. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg
  89. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg
  90. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg
  91. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg
  92. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg
  93. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg
  94. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg
  95. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg
  96. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg
  97. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg
  98. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg
  99. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg
  100. BIN
      qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg

+ 5 - 0
boutique_data/boutique_data.info.yml

@@ -0,0 +1,5 @@
+name: Boutique Data Controller 
+type: module
+description: Builds and Updates a Geo Json dataset for Quartier Dix 30's Interactive 3D Map
+core: 8.x
+package: Custom

+ 7 - 0
boutique_data/boutique_data.links.menu.yml

@@ -0,0 +1,7 @@
+boutique_data.admin:
+  title: 'Rebuild Map Data'
+  description: 'Rebuild the geojson data for interactive 3D map. This will ensure it reflects any recent changes made to boutique nodes.'
+  parent: system.admin_config_development
+  route_name: boutique_data.content
+  weight: 100
+  menu_name: devel

+ 475 - 0
boutique_data/boutique_data.module

@@ -0,0 +1,475 @@
+<?php
+
+use Drupal\node\Entity\Node;
+use Drupal\Core\Url;
+use Drupal\Core\Language\Language;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Language\LanguageDefault;
+
+
+function boutique_data_rebuild_json_en() {
+
+    $boutiqueGeoJson = '{"type":"FeatureCollection","generator":"overpass-turbo","copyright":"The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.","timestamp":"2016-09-12T19:22:48Z","features":[';
+    $query = \Drupal::entityQuery('node')
+        ->condition('status', 1)
+        ->condition('type', 'boutique');
+    $result = array_values($query->execute());
+    $count = count($result);
+    for ($i = 0; $i < $count; $i++) {
+        $entity = entity_load('node', $result[$i])->toArray();
+        $sectorName = '';
+        if (!empty($entity['field_zone_code'])) {
+            $zEntityQuery = \Drupal::entityQuery('node')
+                ->condition('type', 'zone')
+                ->condition('field_zone_code', $entity['field_zone_code'][0])
+                ->condition('status', 1)->execute();
+            if (count($zEntityQuery) > 0) {
+                $mZone = entity_load('node', array_values($zEntityQuery)[0])->toArray();
+                if (count($mZone) > 0) {
+                    $sectorName = trim(str_replace('&nbsp;', ' ', (db_query('SELECT description__value FROM taxonomy_term_field_data WHERE tid = :tid', array(
+                        ':tid' => $mZone['field_sector_code'][0]['target_id']
+                    ))->fetchField())));
+                }
+            }
+        }
+        $nid = $entity['nid'][0]['value'];
+        $rawUrl = '/node/' . $entity['nid'][0]['value'];
+        $aliasUrl = db_query('SELECT alias FROM url_alias WHERE source = :source', array(':source' => $rawUrl))->fetchField();
+        $sTypes = null;
+        if (!empty($entity['field_boutique_logo'])) {
+            $imgUrl = str_replace('public://', '/sites/quartierdix30/files/', db_query("SELECT uri FROM file_managed WHERE fid = :fid", array(':fid' => $entity['field_boutique_logo'][0]['target_id']))->fetchField());
+        } else {
+            $imgUrl = str_replace('public://', '/sites/quartierdix30/files/', db_query("SELECT uri FROM file_managed WHERE fid = :fid", array(':fid' => 105))->fetchField());
+        }
+        $aliasUrl = !$aliasUrl ? $rawUrl : $aliasUrl;
+        $hoursMarkup = '<div class="boutique-map-hours">';
+        $todayHours = '<p class="hours-day"><span>Open Today</span>';
+        $todayFound = false;
+        if (!empty($entity['field_boutique_hours'])) {
+            $daysArray = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
+            $today = date('l');
+            //ICON REMOVED => <img class="icon" src="/sites/quartierdix30/themes/quartierdix30/images/icons/icon_b-hours.svg" alt="Icon of a clock to display with the hours">
+            foreach ($entity['field_boutique_hours'] as $day) {
+//                $hours .= '<p class="hours-day"><span>' . $daysArray[$day['day']] . '</span> <span>' . $day['starthours'] . ' to ' . $day['endhours'] . '</span></p>';
+                if ($today == $daysArray[$day['day']]) {
+                    $todayHours .= '<span>' . $day['starthours'] . ' to ' . $day['endhours'] . '</span></p>';
+                    $todayFound = true;
+                }
+            }
+        }
+
+        if (!$todayFound) {
+            $todayHours = '<p class="hours-day"><span>Closed Today</span></p>';
+        }
+        $hoursMarkup .= $todayHours;
+        $boutiqueTitle = isset($entity['title'][0]['value']) ? $entity['title'][0]['value'] : 'QD30' . $i;
+
+        $description = trim("<div class='boutique-infobox' id='boutique-" . $boutiqueTitle . "'><div id='marker-img'></div><div id='sector'>" . str_replace(array('"', 'è'), array('\"', 'È'), preg_replace('/[\n\r]/', '', strtoupper(strip_tags($sectorName)))) . "</div><h2>". $boutiqueTitle . "</h2><a target='_parent' href='". $aliasUrl . "'><img src='" . $imgUrl . "'></img></a><div id='business-details'>". str_replace('"', '\"', preg_replace('/[\n\r]/', '<br>', $hoursMarkup)) . "</div></div>");
+
+
+        if (!empty($entity['field_store_type'])) {
+            $storeTypes = array();
+            foreach ($entity['field_store_type'] as $storeType) {
+                $typeQ = db_query('SELECT name FROM taxonomy_term_field_data WHERE tid = :tid', array(
+                    ':tid' => $storeType['target_id']
+                ))->fetchField();
+                if (strlen($typeQ) > 0) {
+                    $storeTypes[] = $typeQ;
+                }
+            }
+            if (count($storeTypes) > 0) {
+                $sTypes = '"storetypes":"';
+                foreach ($storeTypes as $tag) {
+                    $sTypes .= $tag . ',';
+                }
+                $sTypes = rtrim($sTypes, ',');
+                $sTypes .= '",';
+            }
+        }
+
+        $boutiqueGeoJson .= '{"type":"Feature",';
+        $boutiqueGeoJson .= '"id":"way/' . $i . '",';
+        $boutiqueGeoJson .= '"properties":{';
+//        if (!empty($entity['field_levels'])) {
+        if (!empty($entity['title'])) {
+            $boutiqueGeoJson .= '"name":"' . trim($entity['title'][0]['value']) . '",';
+        }
+        if ($nid != null && strlen($nid) > 0) {
+          $boutiqueGeoJson .= '"nid":"' . $nid . '",';
+        }
+        if (!empty($entity['field_zone_code']) && !empty($entity['field_levels'])) {
+            $boutiqueGeoJson .= '"level":"' . trim($entity['field_levels'][0]['value']) . '",';
+        } else {
+            $boutiqueGeoJson .= '"level":"1",';
+        }
+//        if (!empty($entity['field_boutique_address'])) {
+//            $boutiqueAddress = trim($entity['field_boutique_address'][0]['value']);
+//            $boutiqueGeoJson .= '"addr":"'. $boutiqueAddress . '",';
+//            $description .= "<div class='boutique-info-address'><img class='icon' src='/sites/quartierdix30/modules/custom/qd30map/gfx/icon_mappointer-b.svg' alt='icon'><span>". $boutiqueAddress . "</span></div>";
+//        }
+        if (!empty($entity['field_boutique_phone_number'])) {
+            $phoneNum = trim($entity['field_boutique_phone_number'][0]['value']);
+            $boutiqueGeoJson .= '"phone":"' . $phoneNum . '",';
+            //ICON REMOVED => <img class='icon' src='/sites/quartierdix30/themes/quartierdix30/images/icons/icon_b-phone.svg' alt='icon'>
+            $description .= "<div class='boutique-info-phone'><span>". $phoneNum . "</span></div>";
+        }
+        if (!empty($entity['field_boutique_website'])) {
+            $website = trim($entity['field_boutique_website'][0]['value']);
+            $boutiqueGeoJson .= '"website":"' . $website . '",';
+            //ICON REMOVED => <img class='icon' src='/sites/quartierdix30/themes/quartierdix30/images/icons/icon_b-cursor.svg' alt='icon'>
+            $description .= "<div class='boutique-info-website'><a target='_parent' href='". $website . "'>" . $website . "</a></div>";
+        }
+        if ($aliasUrl) {
+            $description .= "<div class='boutique-view-full'><div class='readmore'><a target='_parent' href='". $aliasUrl . "'>View full listing →</a></div></div>";
+        }
+        //This includes a logo property
+//        if ($imgUrl) {
+//            $boutiqueGeoJson .= '"logo":"' . $imgUrl .'",';
+//        }
+        if (!empty($entity['field_boutique_events'])) {
+            $boutiqueGeoJson .= '"event":"true",';
+            //ICON REMOVED => <img class='icon' src='/sites/quartierdix30/modules/custom/qd30map/gfx/icon_calendar-w.svg' alt='icon'>
+            $description .= "<div id='event-before'></div><div class='event'><div class='readmore'><a target='_parent' href='". $aliasUrl . "'>Event happening now →</a></div></div>";
+        }
+        if ($sTypes) {
+            $boutiqueGeoJson .= $sTypes;
+        }
+        if ($description) {
+            $boutiqueGeoJson .= '"description":"' . $description . '"';
+        }
+        if (!empty($entity['field_zone_code'])) {
+            $zQuery = array_values(\Drupal::entityQuery('node')
+                ->condition('status', 1)
+                ->condition('type', 'zone')
+                ->condition('field_zone_code', $entity['field_zone_code'][0])
+                ->execute());
+            if (count($zQuery) > 0) {
+                $tQuery = db_query("SELECT name FROM taxonomy_term_field_data WHERE tid = :tid", array(
+                    ':tid' => $entity['field_zone_code'][0]['target_id']
+                ))
+                    ->fetchField();
+
+                if (strlen($tQuery) > 0) {
+                    $zoneEntity = entity_load('node', $zQuery[0])->toArray();
+                    if ($zoneEntity != null) {
+                        $sectorQuery = db_query("SELECT field_sector_code_target_id FROM node__field_sector_code 
+                                                     WHERE bundle = :bundle AND entity_id = :nid", array(
+                            ':bundle' => 'zone',
+                            ':nid' => $zoneEntity['nid'][0]['value'],
+                        ))->fetchField();
+
+                        if (strlen($sectorQuery) > 0) {
+                            $sectorTaxVerify = array_values(\Drupal::entityQuery('taxonomy_term')
+                                ->condition('vid', 'sector')
+                                ->condition('tid', is_array($sectorQuery) ? $sectorQuery[0] : $sectorQuery)
+                                ->execute());
+
+                            if (count($sectorTaxVerify) > 0) {
+                                $sectorEntityQuery = db_query("SELECT entity_id FROM node__field_sector_code 
+                                                     WHERE bundle = :bundle AND field_sector_code_target_id = :tid", array(
+                                    ':bundle' => 'sector',
+                                    ':tid' => is_array($sectorQuery) ? $sectorQuery[0] : $sectorQuery,
+                                ))->fetchField();
+
+                                if (!empty($sectorEntityQuery)) {
+                                    $sectorEntity = entity_load('node', is_array($sectorEntityQuery) ? $sectorEntityQuery[0] : $sectorEntityQuery)->toArray();
+                                    if (null != $sectorEntity && !empty($sectorEntity['field_zone_colour'])) {
+                                        $boutiqueGeoJson .= ',';
+                                        $boutiqueGeoJson .= '"colour":"' . $sectorEntity['field_zone_colour'][0]['value'] . '"}';
+                                    } else {
+                                        $boutiqueGeoJson .= ',';
+                                        $boutiqueGeoJson .= '"colour":"' . '#000000' . '"}';
+                                    }
+                                }
+                            }
+                        }
+
+                        if (!empty($zoneEntity['field_feature_data'])) {
+                            $boutiqueGeoJson .= ',';
+                            $boutiqueGeoJson .= '"geometry":' . $zoneEntity['field_feature_data'][0]['value'];
+                        } else {
+                            //Purposely don't set the geometry property so we can choose the default camera view in its absence
+                            $boutiqueGeoJson .= ',';
+                            $boutiqueGeoJson .= '"geometry":' . '{"type":"Polygon","coordinates":[[[1,1]]]}';
+                        }
+                    }
+                }
+            }
+        } else {
+            $boutiqueGeoJson .= '},';
+            $boutiqueGeoJson .= '"geometry":' . '{"type":"Polygon","coordinates":[[[1,1]]]}';
+        }
+
+//            $boutiqueGeoJson .= '},';
+//            $boutiqueGeoJson .= '"geometry":' . '{"type":"Polygon","coordinates":[[[1,1]]]}';
+        $boutiqueGeoJson .= $i == ($count -1) ? '}' : '},';
+    }
+    $boutiqueGeoJson .= ']}';
+//    print '<pre>'; print_r($boutiqueGeoJson); print '</pre>';
+    $file = file_save_data($boutiqueGeoJson, "public://geojson/quartier_en.json", FILE_EXISTS_REPLACE);
+
+    if ($file != false) {
+        return $file->id();
+    } else {
+        return false;
+    }
+}
+
+
+function boutique_data_rebuild_json_fr() {
+    setlocale(LC_TIME, "fr_FR");
+
+    $boutiqueGeoJson = '{"type":"FeatureCollection","generator":"overpass-turbo","copyright":"The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.","timestamp":"2016-09-12T19:22:48Z","features":[';
+    $query = \Drupal::entityQuery('node')
+        ->condition('status', 1)
+        ->condition('langcode', 'fr')
+        ->condition('type', 'boutique');
+    $result = array_values($query->execute());
+    $count = count($result);
+    for ($i = 0; $i < $count; $i++) {
+        $entity = entity_load('node', $result[$i])->toArray();
+        $sectorName = '';
+        if (!empty($entity['field_zone_code'])) {
+            $zEntityQuery = \Drupal::entityQuery('node')
+                ->condition('type', 'zone')
+                ->condition('field_zone_code', $entity['field_zone_code'][0])
+                ->condition('status', 1)->execute();
+            if (count($zEntityQuery) > 0) {
+                $mZone = entity_load('node', array_values($zEntityQuery)[0])->toArray();
+                if (count($mZone) > 0) {
+                    $sectorName = trim(str_replace('&nbsp;', ' ', (db_query('SELECT description__value FROM taxonomy_term_field_data WHERE tid = :tid', array(
+                        ':tid' => $mZone['field_sector_code'][0]['target_id']
+                    ))->fetchField())));
+                }
+            }
+        }
+        $nid = $entity['nid'][0]['value'];
+        $rawUrl = '/node/' . $entity['nid'][0]['value'];
+        $aliasUrl = db_query('SELECT alias FROM url_alias WHERE source = :source', array(':source' => $rawUrl))->fetchField();
+        $sTypes = null;
+        if (!empty($entity['field_boutique_logo'])) {
+            $imgUrl = str_replace('public://', '/sites/quartierdix30/files/', db_query("SELECT uri FROM file_managed WHERE fid = :fid", array(':fid' => $entity['field_boutique_logo'][0]['target_id']))->fetchField());
+        } else {
+            $imgUrl = str_replace('public://', '/sites/quartierdix30/files/', db_query("SELECT uri FROM file_managed WHERE fid = :fid", array(':fid' => 105))->fetchField());
+        }
+        $aliasUrl = !$aliasUrl ? $rawUrl : $aliasUrl;
+        $hoursMarkup = '<div class="boutique-map-hours">';
+        $todayFound = false;
+        $todayHours = '<p class="hours-day"><span>Ouvert aujourd\'hui</span>';
+
+        if (!empty($entity['field_boutique_hours'])) {
+            $daysArrayEn = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
+            $daysArray = array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi');
+
+            $today = date('l');
+
+            //ICON REMOVED => <img class="icon" src="/sites/quartierdix30/themes/quartierdix30/images/icons/icon_b-hours.svg" alt="Icon of a clock to display with the hours">
+            foreach ($entity['field_boutique_hours'] as $day) {
+
+                if ($today == $daysArrayEn[$day['day']]) {
+                    $todayHours .= '<span>' . $day['starthours'] . ' à ' . $day['endhours'] . '</span></p>';
+                    $todayFound = true;
+                }
+            }
+        }
+
+        $boutiqueTitle = isset($entity['title'][0]['value']) ? $entity['title'][0]['value'] : 'QD30' . $i;
+
+        if (!$todayFound) {
+            $todayHours = '<p class="hours-day"><span>Fermé aujourd\'hui</span></p>';
+        }
+        $hoursMarkup .= $todayHours;
+
+        $description = trim("<div class='boutique-infobox' id='boutique-" . $boutiqueTitle . "'><div id='marker-img'></div><div id='sector'>" . str_replace(array('"', 'è'), array('\"', 'È'), preg_replace('/[\n\r]/', '', strtoupper(strip_tags($sectorName)))) . "</div><h2>". $boutiqueTitle . "</h2><a target='_parent' href='". $aliasUrl . "'><img src='" . $imgUrl . "'></img></a><div id='business-details'>". str_replace('"', '\"', preg_replace('/[\n\r]/', '<br>', $hoursMarkup)) . "</div></div>");
+
+        if (!empty($entity['field_store_type'])) {
+            $storeTypes = array();
+            foreach ($entity['field_store_type'] as $storeType) {
+                $typeQ = db_query('SELECT name FROM taxonomy_term_field_data WHERE tid = :tid', array(
+                    ':tid' => $storeType['target_id']
+                ))->fetchField();
+                if (strlen($typeQ) > 0) {
+                    $storeTypes[] = $typeQ;
+                }
+            }
+            if (count($storeTypes) > 0) {
+                $sTypes = '"storetypes":"';
+                foreach ($storeTypes as $tag) {
+                    $sTypes .= $tag . ',';
+                }
+                $sTypes = rtrim($sTypes, ',');
+                $sTypes .= '",';
+            }
+        }
+
+        $boutiqueGeoJson .= '{"type":"Feature",';
+        $boutiqueGeoJson .= '"id":"way/' . $i . '",';
+        $boutiqueGeoJson .= '"properties":{';
+//        if (!empty($entity['field_levels'])) {
+        if (!empty($entity['title'])) {
+            $boutiqueGeoJson .= '"name":"' . trim($entity['title'][0]['value']) . '",';
+        }
+      if ($nid != null && strlen($nid) > 0) {
+        $boutiqueGeoJson .= '"nid":"' . $nid . '",';
+      }
+
+      if (!empty($entity['field_zone_code']) && !empty($entity['field_levels'])) {
+            $boutiqueGeoJson .= '"level":"' . trim($entity['field_levels'][0]['value']) . '",';
+        } else {
+            $boutiqueGeoJson .= '"level":"1",';
+        }
+//        if (!empty($entity['field_boutique_address'])) {
+//            $boutiqueAddress = trim($entity['field_boutique_address'][0]['value']);
+//            $boutiqueGeoJson .= '"addr":"'. $boutiqueAddress . '",';
+//            $description .= "<div class='boutique-info-address'><img class='icon' src='/sites/quartierdix30/modules/custom/qd30map/gfx/icon_mappointer-b.svg' alt='icon'><span>". $boutiqueAddress . "</span></div>";
+//        }
+        if (!empty($entity['field_boutique_phone_number'])) {
+            $phoneNum = trim($entity['field_boutique_phone_number'][0]['value']);
+            $boutiqueGeoJson .= '"phone":"' . $phoneNum . '",';
+            //ICON REMOVED => <img class='icon' src='/sites/quartierdix30/themes/quartierdix30/images/icons/icon_b-phone.svg' alt='icon'>
+            $description .= "<div class='boutique-info-phone'><span>". $phoneNum . "</span></div>";
+        }
+        if (!empty($entity['field_boutique_website'])) {
+            $website = trim($entity['field_boutique_website'][0]['value']);
+            $boutiqueGeoJson .= '"website":"' . $website . '",';
+            //ICON REMOVED => <img class='icon' src='/sites/quartierdix30/themes/quartierdix30/images/icons/icon_b-cursor.svg' alt='icon'>
+            $description .= "<div class='boutique-info-website'><a target='_parent' href='". $website . "'>" . $website . "</a></div>";
+        }
+        if ($aliasUrl) {
+            $description .= "<div class='boutique-view-full'><div class='readmore'><a target='_parent' href='". $aliasUrl . "'>View full listing →</a></div></div>";
+        }
+        if ($imgUrl) {
+            $boutiqueGeoJson .= '"logo":"' . $imgUrl .'",';
+        }
+        if (!empty($entity['field_boutique_events'])) {
+            $boutiqueGeoJson .= '"event":"true",';
+            //ICON REMOVED => <img class='icon' src='/sites/quartierdix30/modules/custom/qd30map/gfx/icon_calendar-w.svg' alt='icon'>
+            $description .= "<div class='event'><div class='readmore'><a target='_parent' href='". $aliasUrl . "'>Event happening now →</a></div></div>";
+        }
+        if ($sTypes) {
+            $boutiqueGeoJson .= $sTypes;
+        }
+        if ($description) {
+            $boutiqueGeoJson .= '"description":"' . $description . '"';
+        }
+        if (!empty($entity['field_zone_code'])) {
+            $zQuery = array_values(\Drupal::entityQuery('node')
+                ->condition('status', 1)
+                ->condition('type', 'zone')
+                ->condition('field_zone_code', $entity['field_zone_code'][0])
+                ->execute());
+            if (count($zQuery) > 0) {
+                $tQuery = db_query("SELECT name FROM taxonomy_term_field_data WHERE tid = :tid", array(
+                    ':tid' => $entity['field_zone_code'][0]['target_id']
+                ))
+                    ->fetchField();
+
+                if (strlen($tQuery) > 0) {
+                    $zoneEntity = entity_load('node', $zQuery[0])->toArray();
+                    if ($zoneEntity != null) {
+                        $sectorQuery = db_query("SELECT field_sector_code_target_id FROM node__field_sector_code 
+                                                     WHERE bundle = :bundle AND entity_id = :nid", array(
+                            ':bundle' => 'zone',
+                            ':nid' => $zoneEntity['nid'][0]['value'],
+                        ))->fetchField();
+                        if (strlen($sectorQuery) > 0) {
+                            $sectorTaxVerify = array_values(\Drupal::entityQuery('taxonomy_term')
+                                ->condition('vid', 'sector')
+                                ->condition('tid', is_array($sectorQuery) ? $sectorQuery[0] : $sectorQuery)
+                                ->execute());
+                            $test = 'test';
+                            if (count($sectorTaxVerify) > 0) {
+                                $sectorEntityQuery = db_query("SELECT entity_id FROM node__field_sector_code 
+                                                     WHERE bundle = :bundle AND field_sector_code_target_id = :tid", array(
+                                    ':bundle' => 'sector',
+                                    ':tid' => is_array($sectorQuery) ? $sectorQuery[0] : $sectorQuery,
+                                ))->fetchField();
+//                                $sectorEntityQuery = \Drupal::entityQuery('node')
+//                                    ->condition('type', 'sector')
+//                                    ->condition('field_sector_code', is_array($sectorQuery) ? $sectorQuery[0] : $sectorQuery)
+//                                    ->execute();
+                                if (!empty($sectorEntityQuery)) {
+                                    $sectorEntity = entity_load('node', is_array($sectorEntityQuery) ? $sectorEntityQuery[0] : $sectorEntityQuery)->toArray();
+                                    if (null != $sectorEntity && !empty($sectorEntity['field_zone_colour'])) {
+                                        $boutiqueGeoJson .= ',';
+                                        $boutiqueGeoJson .= '"colour":"' . $sectorEntity['field_zone_colour'][0]['value'] . '"}';
+                                    } else {
+                                        $boutiqueGeoJson .= ',';
+                                        $boutiqueGeoJson .= '"colour":"' . '#000000' . '"}';
+                                    }
+                                }
+                            }
+                        }
+                        if (!empty($zoneEntity['field_feature_data'])) {
+                            $boutiqueGeoJson .= ',';
+                            $boutiqueGeoJson .= '"geometry":' . $zoneEntity['field_feature_data'][0]['value'];
+                        } else {
+                            //Purposely don't set the geometry property so we can choose the default camera view in its absence
+                            $boutiqueGeoJson .= ',';
+                            $boutiqueGeoJson .= '"geometry":' . '{"type":"Polygon","coordinates":[[[1,1]]]}';
+                        }
+                    }
+                }
+            }
+        } else {
+            $boutiqueGeoJson .= '},';
+            $boutiqueGeoJson .= '"geometry":' . '{"type":"Polygon","coordinates":[[[1,1]]]}';
+        }
+
+//            $boutiqueGeoJson .= '},';
+//            $boutiqueGeoJson .= '"geometry":' . '{"type":"Polygon","coordinates":[[[1,1]]]}';
+        $boutiqueGeoJson .= $i == ($count -1) ? '}' : '},';
+    }
+    $boutiqueGeoJson .= ']}';
+//    print '<pre>'; print_r($boutiqueGeoJson); print '</pre>';
+    $file = file_save_data($boutiqueGeoJson, "public://geojson/quartier_fr.json", FILE_EXISTS_REPLACE);
+
+    if ($file != false) {
+        return $file->id();
+    } else {
+        return false;
+    }
+}
+
+
+function boutique_data_node_clear()  {
+    $nodeTest = null;
+//
+//    $NboutiqueNode = Drupal\node\Entity\Node::load(216);
+//    $MboutiqueNode = \Drupal::entityTypeManager()->getStorage('node')->load(216);
+//    $EboutiqueNode = entity_load('node', 216);
+
+    $nResult = \Drupal::entityQuery('node')
+        ->condition('type', 'zone')
+        ->execute();
+    $delAttempt = entity_delete_multiple('node', $nResult);
+
+    $tResult = \Drupal::entityQuery('taxonomy_term')
+        ->condition('vid', 'zone')
+        ->execute();
+    $delAttempt = entity_delete_multiple('taxonomy_term', $tResult);
+
+
+    $myvar = 'variability';
+
+    return $delAttempt;
+}
+
+function boutique_data_boutique_levels_update() {
+//    $bEntities = \Drupal::entityQuery('node')
+//        ->condition('type', 'boutique')
+//        ->condition('status', 1)
+//        ->execute();
+    $bEntities = db_query('SELECT nid FROM node_field_data WHERE type = :type AND status = :status AND nid > :min', array(
+        ':type' => 'boutique',
+        ':status' => 1,
+        ':min' => 212,
+    ));
+
+    foreach ($bEntities as $nid) {
+        $node = Node::load($nid->nid);
+        $node->field_levels = 1;
+        $node->save();
+    }
+}

+ 23 - 0
boutique_data/boutique_data.routing.yml

@@ -0,0 +1,23 @@
+boutique_data.content:
+  path: '/mapdatajson'
+  defaults:
+    _controller: '\Drupal\boutique_data\Controller\boutique_dataController::content'
+    _title: 'Map Data'
+  requirements:
+    _permission: 'administer content'
+  options:
+    _admin_route: 'true'
+boutique_data.update:
+  path: '/zone/levels/update'
+  defaults:
+    _controller: '\Drupal\boutique_data\Controller\boutique_dataController::levels_update'
+    _title: 'Levels Update'
+  requirements:
+    _permission: 'administer content'
+boutique_data.clear:
+  path: '/zones/clear'
+  defaults:
+    _controller: '\Drupal\boutique_data\Controller\ZoneClearController::clear'
+    _title: 'Zone Clear'
+  requirements:
+    _permission: 'administer content'

+ 39 - 0
boutique_data/src/Controller/ZoneClearController.php

@@ -0,0 +1,39 @@
+<?php
+/**
+*@file
+*Contains \Drupal\boutique_data\Controller\ZoneClearController.
+*/
+namespace Drupal\boutique_data\Controller;
+
+/**
+*ZoneClearController.
+*/
+
+class ZoneClearController  {
+
+  public function clear()  {
+      $result = null;
+      $result = boutique_data_node_clear();
+//      boutique_data_boutique_levels_update();
+//      if (boutique_data_rebuild_json_en() != false) {
+//          $result = 'English: updated<br>';
+//      }
+
+//      if (boutique_data_rebuild_json_en() != false) {
+//          $result .= 'French: updated<br>';
+//      }
+
+      if ($result != null) {
+          return array(
+              '#type' => 'markup',
+              '#value' => t('Success')
+          );
+      } else {
+          return array(
+              '#type' => 'markup',
+              '#value' => t('Error updating data')
+          );
+      }
+  }
+
+}

+ 46 - 0
boutique_data/src/Controller/boutique_dataController.php

@@ -0,0 +1,46 @@
+<?php
+/**
+*@file
+*Contains \Drupal\boutique_data\Controller\boutique_dataController.
+*/
+namespace Drupal\boutique_data\Controller;
+
+/**
+*boutique_dataController.
+*/
+
+class boutique_dataController  {
+
+  public function content()  {
+      $result = null;
+//      $result = boutique_data_node_test();
+      if (boutique_data_rebuild_json_en() != false) {
+          $result = 'English: updated<br>';
+      } else {
+          $result = false;
+      }
+
+      if (boutique_data_rebuild_json_fr() != false) {
+          $result .= 'French: updated<br>';
+      } else {
+          $result = false;
+      }
+
+      if ($result) {
+          return array(
+              '#type' => 'markup',
+              '#value' => t('Success')
+          );
+      } else {
+          return array(
+              '#type' => 'markup',
+              '#value' => t('Error updating data')
+          );
+      }
+  }
+
+  public function levels_update() {
+      boutique_data_boutique_levels_update();
+  }
+
+}

+ 5 - 0
mapui/mapui.info.yml

@@ -0,0 +1,5 @@
+name: Map UI 
+type: module
+description: Provides a block with an Interface for controlling the 3D Interactive Map.
+package: Custom
+core: 8.x

+ 6 - 0
mapui/mapui.module

@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @file
+ * This is the primary module file.
+ */

+ 309 - 0
mapui/src/Form/MapUiForm.php

@@ -0,0 +1,309 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\mapui\Form\MapUiForm.
+ */
+
+namespace Drupal\mapui\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\mapui\Plugin\BoutiqueSelection;
+
+/**
+ * Directory Search form.
+ */
+
+class MapUiForm extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+
+  public function getFormId() {
+      return 'map_ui_form';
+  }
+
+    /**
+     * @param array $form
+     * @param FormStateInterface $form_state
+     * @return array
+     */
+    public function buildForm(array $form, FormStateInterface $form_state) {
+
+        $data = array();
+
+        $langCode= \Drupal::languageManager()->getCurrentLanguage()->getId();
+
+        //Get tid for "Stores", the parent term of the store hierarchy
+        //Since these terms do not have a parent, we must name them explicitly at the outset and then run the differentiate by langcode
+        $taxonomyTermArray = [
+            'en' => array(
+                ':name1' => 'Stores',
+                ':name2' => 'Entertainment',
+                ':name3' => 'Restaurant',
+                ':name4' => 'Other',
+                ':name5' => 'Features',
+                ':name6' => 'Brands'),
+            'fr' => array(
+                ':name1' => 'Boutiques',
+                ':name2' => 'Divertissement',
+                ':name3' => 'Restaurant',
+                ':name4' => 'Autre',
+                ':name5' => 'Particularités',
+                ':name6' => 'Marques')
+        ];
+        $tidMaster = db_query("SELECT fd.tid, fd.name FROM taxonomy_term_hierarchy th JOIN taxonomy_term_field_data fd
+                       ON fd.tid = th.tid WHERE fd.name = :name1 OR fd.name = :name2 OR fd.name = :name3 OR fd.name = :name4 OR fd.name = :name5 OR fd.name = :name6 ORDER BY fd.weight",
+
+        $taxonomyTermArray[$langCode])->fetchAll();
+
+
+        if (count($tidMaster) > 0) {
+            foreach ($tidMaster as $parent) {
+                //Get the tids representing the main types of stores (Ex: Fashion, Restaurants, Entertainment)
+                $sTypes = db_query("SELECT fd.tid, fd.name FROM taxonomy_term_field_data fd JOIN taxonomy_term_hierarchy th 
+                            ON fd.tid = th.tid WHERE fd.langcode = :langcode AND th.parent = :tid",
+                    array(
+                        ':langcode' => $langCode,
+                        ':tid' => $parent->tid,
+                    ))->fetchAll();
+                if (count($sTypes) > 0) {
+                    $count = count($sTypes);
+                    $data['storeTypes'] = isset($data['storeTypes']) ? $data['storeTypes'] : array();
+                    foreach ($sTypes as $sType) {
+                      //Get the tids representing the subtypes for each type of store (Ex: Fashion - Men's, Women's, Children's, Sport)
+                      $subTypes = db_query("SELECT fd.tid, fd.name FROM taxonomy_term_field_data fd JOIN taxonomy_term_hierarchy th 
+                            ON fd.tid = th.tid WHERE fd.langcode = :langcode AND th.parent = :tid",
+                        array(
+                          ':langcode' => $langCode,
+                          ':tid' => $sType->tid,
+                        ))->fetchAll();
+                      if (count($subTypes) > 0) {
+                        $data['storeTypes'][$parent->name] = isset($data['storeTypes'][$parent->name]) ? $data['storeTypes'][$parent->name] : array();
+                        foreach ($subTypes as $type) {
+                          //Get the nids for stores within each subtype
+                          $stores = db_query("SELECT entity_id FROM node__field_store_type WHERE field_store_type_target_id = :tid AND langcode = :langcode",
+                            array(
+                              ':tid' => $type->tid,
+                              ':langcode' => $langCode,
+                            ))->fetchAll();
+                          if (count($stores) > 0) {
+                            $data['storeTypes'][$parent->name][$sType->name] = isset($data['storeTypes'][$parent->name][$sType->name]) ? $data['storeTypes'][$parent->name][$sType->name] : array();
+                            foreach (($stores) as $store) {
+                              //Add the nids to our Data Array
+                              $node = db_query("SELECT title FROM node_field_data WHERE nid = :nid AND langcode = :langcode",
+                                array(
+                                  ':nid' => $store->entity_id,
+                                  ':langcode' => $langCode,
+                                ))->fetchField();
+                              $data['storeTypes'][$parent->name][$sType->name][$type->name][$node] = new \stdClass();
+                              $data['storeTypes'][$parent->name][$sType->name][$type->name][$node]->title = $node;
+                              $data['storeTypes'][$parent->name][$sType->name][$type->name][$node]->nid = $store->entity_id;
+
+
+                            }
+                          }
+//                                if (  is_object($type) &&
+//                                      is_array($data['storeTypes'][$parent->name][$sType->name][$type->name]) &&
+//                                      $data['storeTypes'][$parent->name][$sType->name][$type->name] != null) {
+//                                  if (!is_object($data['storeTypes'][$parent->name][$sType->name][$type->name])) {
+////                                    $data['storeTypes'][$parent->name][$sType->name][$type->name] = array_values(array_unique($data['storeTypes'][$parent->name][$sType->name][$type->name]));
+//                                    $wehere = ' now';
+//                                  } else {
+//                                    $wehere = ' now';
+//                                  }
+//                                }
+                        }
+                      } else {
+                        //Get the nids for stores within this parent
+                        $stores = db_query("SELECT entity_id FROM node__field_store_type WHERE field_store_type_target_id = :tid AND langcode = :langcode",
+                          array(
+                            ':tid' => $sType->tid,
+                            ':langcode' => $langCode,
+                          ))->fetchAll();
+                        if (count($stores) > 0) {
+                          $data['storeTypes'][$parent->name] = isset($data['storeTypes'][$parent->name]) ? $data['storeTypes'][$parent->name] : array();
+                          $nCount = 0;
+                          foreach (($stores) as $store) {
+                            //Add the nids to our Data Array
+                            $node = db_query("SELECT title FROM node_field_data WHERE nid = :nid AND langcode = :langcode",
+                              array(
+                                ':nid' => $store->entity_id,
+                                ':langcode' => $langCode,
+                              ))->fetchField();
+                            $data['storeTypes'][$parent->name][$sType->name][$node . $nCount] = new \stdClass();
+                            $data['storeTypes'][$parent->name][$sType->name][$node . $nCount]->title = $node;
+                            $data['storeTypes'][$parent->name][$sType->name][$node . $nCount]->nid = $store->entity_id;
+                          $nCount++;
+                          }
+                        }
+
+                      }
+                    }
+                } else {
+                    //Get the nids for stores within this parent
+                    $stores = db_query("SELECT entity_id FROM node__field_store_type WHERE field_store_type_target_id = :tid AND langcode = :langcode",
+                        array(
+                            ':tid' => $parent->tid,
+                            ':langcode' => $langCode,
+                        ))->fetchAll();
+                    if (count($stores) > 0) {
+                        $data['storeTypes'][$parent->name] = isset($data['storeTypes'][$parent->name]) ? $data['storeTypes'][$parent->name] : array();
+                        foreach (($stores) as $store) {
+                            //Add the nids to our Data Array
+                            $node = db_query("SELECT title FROM node_field_data WHERE nid = :nid and langcode = :langcode",
+                                array(
+                                    ':nid' => $store->entity_id,
+                                    ':langcode' => $langCode,
+                                ))->fetchField();
+                          $data['storeTypes'][$parent->name][$node] = new \stdClass();
+                          $data['storeTypes'][$parent->name][$node]->title = $node;
+                          $data['storeTypes'][$parent->name][$node]->nid = $store->entity_id;
+                        }
+                    }
+                }
+            }
+//            $data = array_map("unserialize", array_unique(array_map("serialize", $data)));
+          $plugins = \Drupal::service('plugin.manager.entity_reference_selection')->getDefinitions();
+            $test = 'test';
+            if ($data != null) {
+
+                $form['Search'] = array(
+                    '#type' => 'entity_autocomplete',
+                    '#placeholder' => 'Search',
+                    '#entity_type' => 'node',
+                    '#target_type' => 'node',
+                    '#bundles' => array('boutique'),
+                    '#autocomplete_route_name' => 'entity-autocomplete/node/boutique/',
+                    '#selection_settings' => ['target_bundles' => ['boutique']],
+                    '#selection_handler' => 'default:boutique',
+                );
+
+                $form['mapSubmit'] = array(
+                    '#type' => 'button',
+                    '#value' => t('Submit'),
+                );
+
+                $z = 0;
+
+                foreach ($data['storeTypes'] as $key => $type) {
+                    if (is_array($type)) {
+                        if (!is_array(current($type))) {
+
+                            $form[$key] = array(
+                                '#type' => 'details',
+                                '#title' => t(strtoupper($key)),
+                                '#collapsible' => TRUE,
+                                '#collapsed' => TRUE,
+                                '#states' => array(
+                                    'expanded' => array(
+                                        ':input[name="'.$key.'"]' => array('value' => 'expand'),
+                                    ),
+                                ),
+                            );
+                            $s = 0;
+                            foreach ($type as $store) {
+                                if (!is_array($store)) {
+
+                                $form[$key][$store->title] = array(
+                                    '#type' => 'item',
+//                                    '#title' => t('Store'),
+                                    '#markup' => t($store->title) . '<span class="hidden-nid">' . $store->nid . '</span>',
+                                    '#attributes' => array('tabindex' => 20+$z)
+                                    );
+                                } else {
+                                    foreach ($store as $key => $subStore) {
+
+                                        $form[$key][is_array($subStore) ? key($subStore) : $subStore] = array(
+                                            '#type' => 'details',
+                                            '#title' => t('Store'),
+                                            '#collapsible' => TRUE,
+                                            '#collapsed' => TRUE,
+                                            '#states' => array(
+                                                ':input[name="'.is_array($subStore) ? key($subStore) : $subStore.'"]' => array('value' => 'expand2'),
+                                            ));
+                                    }
+                                }
+                                $s++;
+                            }
+                            ksort($form[$key]);
+                        } else {
+                            $form[$key] = array(
+                                '#type' => 'details',
+                                '#title' => t(strtoupper($key)),
+                                '#collapsible' => TRUE,
+                                '#collapsed' => TRUE,
+                                '#states' => array(
+                                    'expanded' => array(
+                                        ':input[name="'.$key.'"]' => array('value' => 'expand'),
+                                    ),
+                                ),
+                            );
+                            foreach ($type as $skey => $subType) {
+                                if (is_array($subType)) {
+                                    $form[$key][$skey] = array(
+                                        '#type' => 'details',
+                                        '#title' => t($skey),
+                                        '#collapsible' => TRUE,
+                                        '#collapsed' => TRUE,
+                                        '#states' => array(
+                                            'expanded' => array(
+                                                ':input[name="'.$skey.'"]' => array('value' => 'expand'),
+                                            ),
+                                        ),
+                                    );
+                                    foreach ($subType as $vskey => $store) {
+                                        if (!is_array($store)) {
+                                            $form[$key][$skey][$vskey] = array(
+                                                '#type' => 'item',
+//                                            '#title' => t(is_array($store) ? $vskey : $store),
+                                                '#markup' => t($store->title) . '<span class="hidden-nid">' . $store->nid . '</span>',
+                                                '#attributes' => array('tabindex' => 20+$z)
+                                            );
+                                        } else {
+                                            $form[$key][$skey][$vskey] = array(
+                                                '#type' => 'details',
+                                                '#title' => $vskey,
+                                                '#collapsible' => TRUE,
+                                                '#collapsed' => TRUE,
+                                                '#states' => array(
+                                                    'expanded' => array(
+                                                        ':input[name="'.$vskey.'"]' => array('value' => 'expand'),
+                                                    ),
+                                                ),
+                                            );
+                                            foreach ($store as $subKey => $subStore) {
+                                                $form[$key][$skey][$vskey][is_array($subStore->title) ? $subKey : $subStore->title] = array(
+                                                    '#type' => 'item',
+                                                    '#markup' => t(is_array($subStore) ? $subKey : $subStore->title) . '<span class="hidden-nid">' . $subStore->nid . '</span>',
+                                                );
+                                            }
+                                        }
+                                    }
+                                  ksort($form[$key][$skey]);
+                                }
+                            }
+                        }
+                    } else {
+                        $form[$key][$store == null ? 'null' : $store] = array(
+                            '#type' => 'details',
+                            '#title' => t($store == null ? 'null' : $store),
+                            '#markup' => t($store == null ? 'null' : $store),
+                           );
+                    }
+                    $z++;
+                }
+            }
+        }
+
+    return $form;
+  }
+
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+      /**
+       * This function is ignored. Form submissions are handled in qd30-cesium.js
+       */
+  }
+}

+ 36 - 0
mapui/src/Plugin/Block/MapUIBlock.php

@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\mapui\Plugin\Block\MapUIBlock.
+ */
+
+namespace Drupal\MapUI\Plugin\Block;
+
+use Drupal\Core\Block\BlockBase;
+
+/**
+* Provides mapUI Block.
+*
+* @Block(
+* id = "mapuiblock",
+* admin_label = @Translation("Map UI Block"),
+* category = @Translation("Blocks")
+* )
+*/
+
+class MapUIBlock extends BlockBase {
+
+/**
+* {@inheritdoc}
+*/
+
+public function build() {
+
+
+
+    $form = \Drupal::formBuilder()->getForm('Drupal\mapui\Form\MapUiForm');
+    return $form;
+  }
+}
+?>

+ 123 - 0
mapui/src/Plugin/EntityReferenceSelection/BoutiqueSelection.php

@@ -0,0 +1,123 @@
+<?php
+
+
+namespace Drupal\mapui\Plugin\EntityReferenceSelection;
+
+use Drupal\Component\Utility\Html;
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\Core\Entity\Annotation\EntityReferenceSelection;
+use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection;
+use \Drupal\Core\StringTranslation\TranslationManager;
+//use Drupal\Core\Entity\Plugin\EntityReferenceSelection;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\node\Entity\Node;
+use Drupal\taxonomy\Entity\Vocabulary;
+use Drupal\node\Plugin\EntityReferenceSelection\NodeSelection;
+
+
+/**
+ * Provides specific access control for the boutique node type.
+ *
+ * @EntityReferenceSelection(
+ *   id = "default:boutique",
+ *   label = @Translation("Boutique Selection minus Empty Buildings"),
+ *   entity_types = {"node"},
+ *   group = "default",
+ *   weight = 1
+ * )
+ */
+class BoutiqueSelection extends NodeSelection {
+
+
+  public function entityQueryAlter(SelectInterface $query) {
+    parent::entityQueryAlter($query);
+
+    //Get the tid for the term which was used to tag nodes which should be EXCLUDED from the results
+
+    $emptyTid = array_values(\Drupal::entityQuery('taxonomy_term')
+      ->condition('name', 'Empty')
+      ->execute())[0];
+
+    if ($emptyTid != null && $emptyTid > -1) {
+
+    //Get nids for nodes which were tagged with this term
+
+      $excludeQuery = db_query('
+        SELECT entity_id 
+        FROM node__field_store_type 
+        WHERE field_store_type_target_id = :tid',
+
+        array(
+          ':tid' => $emptyTid
+        )
+      )->fetchAllKeyed(0, 0);
+
+      //Reset array keys
+      $result = array_values($excludeQuery);
+
+      $typecastedResult = array();
+      //Typecast all the values to int, just to be safe
+      foreach ($result as $k => $v) {
+        $typecastedResult[] = (int)$v;
+      }
+      //Add a condition to the query such as to exclude the nodes found above
+      $query->condition('node_field_data.nid', $typecastedResult, 'NOT IN');
+    }
+    return $query;
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildConfigurationForm($form, $form_state);
+    $form['target_bundles']['#title'] = $this->t('Content types');
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
+    $query = parent::buildEntityQuery($match, $match_operator);
+    // Adding the 'node_access' tag is sadly insufficient for nodes: core
+    // requires us to also know about the concept of 'published' and
+    // 'unpublished'. We need to do that as long as there are no access control
+    // modules in use on the site. As long as one access control module is there,
+    // it is supposed to handle this check.
+    if (!$this->currentUser->hasPermission('bypass node access') && !count($this->moduleHandler->getImplementations('node_grants'))) {
+      $query->condition('status', NODE_PUBLISHED);
+      $query->condition('type', 'boutique');
+    }
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createNewEntity($entity_type_id, $bundle, $label, $uid) {
+    $node = parent::createNewEntity($entity_type_id, $bundle, $label, $uid);
+
+    // In order to create a referenceable node, it needs to published.
+    /** @var \Drupal\node\NodeInterface $node */
+    $node->setPublished(TRUE);
+
+    return $node;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateReferenceableNewEntities(array $entities) {
+    $entities = parent::validateReferenceableNewEntities($entities);
+    // Mirror the conditions checked in buildEntityQuery().
+    if (!$this->currentUser->hasPermission('bypass node access') && !count($this->moduleHandler->getImplementations('node_grants'))) {
+      $entities = array_filter($entities, function ($node) {
+        /** @var \Drupal\node\NodeInterface $node */
+        return $node->isPublished();
+      });
+    }
+    return $entities;
+  }
+}

+ 14 - 0
qd30map/composer.json

@@ -0,0 +1,14 @@
+{
+  "name": "drupal/jigga",
+  "type": "drupal-module",
+  "description": "Make it jigga",
+  "keywords": ["Drupal"],
+  "license": "GPL-2.0+",
+  "homepage": "https://www.drupal.org/project/jigga",
+  "minimum-stability": "dev",
+  "support": {
+    "issues": "http://drupal.org/project/issues/jigga",
+    "source": "http://cgit.drupalcode.org/jigga"
+  },
+  "require": { }
+}

BIN
qd30map/css/19/0119-map_css.zip


+ 381 - 0
qd30map/css/map-util.css

@@ -0,0 +1,381 @@
+.nav-ui-wrap  {
+  position: absolute;
+  display: none;
+  margin-left: 10px; /* edit CHANGE */
+  /* edit REMOVE margin-top: 1%; */
+}
+
+.nav-ui-wrap div{
+  border: 4px solid #5555ff;
+}
+
+.map-button {
+  border: 1px solid #6d6f72;
+  width: 24px;
+  height: 24px;
+  margin: 1px -6px 1px 1px;
+  background-color: white;
+  color: black;
+  padding: 0;
+  align-items: flex-start;
+  text-align: center;
+  cursor: default;
+}
+
+#nav-arrows {
+  border: none;
+  display: block;
+  position: relative;
+  margin-top: 15%;
+  margin-left: -3px
+}
+
+/* edit ADD start */
+#nav-arrows > button {
+  line-height: 30px;
+}
+/* edit ADD end */
+
+#zoom {
+  border: none;
+  display: block;
+  margin-top: 20px; /* edit ADD */
+  margin-left: 20px; /* edit ADD */
+  position: relative;
+}
+
+/* edit ADD */ #zoom button { line-height: 28px; }
+
+#zoom-in {
+  border: 1px solid #6d6f72;
+  /* edit REMOVE   margin: 1px; */
+  background-color: white;
+  color: black;
+  padding: 0;
+  align-items: flex-start;
+  text-align: center;
+  cursor: default;
+  display: block;
+  /* edit ADD */ margin-bottom: -2px;
+}
+
+#zoom-out {
+  /* edit REMOVE   margin-top: 3%; */
+  background-color: #ffffff;
+  display: block;
+}
+
+#nav-up {
+  position: relative;
+  margin-bottom: -2px; /* edit CHANGE */
+  left: 35%;
+  background-color: #ffffff;
+  display: block;
+}
+
+#nav-left {
+  display: inline-block;
+  background-color: #ffffff;
+}
+#nav-right {
+  display: inline-block;
+  background-color: #ffffff;
+  /* edit REMOVE   margin-left: -1px; */
+}
+#nav-down {
+  /*position: relative;
+  left: 14.25%;*/
+  /* edit REMOVE   margin-left: -1px; */
+  display: inline-block;
+  /*margin-top: -1%;*/
+  background-color: #ffffff;
+}
+
+#nav-up > a, #nav-down > a, #nav-left > a, #nav-right > a {
+  min-width: 100%;
+  min-height: 100%;
+}
+
+#nav-up:hover, #nav-down:hover, #nav-left:hover, #nav-right:hover, #zoom-in:hover, #zoom-out:hover,
+#nav-up:focus, #nav-down:focus, #nav-left:focus, #nav-right:focus, #zoom-in:focus, #zoom-out:focus {
+  /*opacity: 0.3;*/
+  background-color: #5555ff;
+}
+
+#nav-reset {
+  display: block; /* edit CHANGE */
+  position: relative;
+  margin-left: 21px; /* edit CHANGE */
+  /* edit ADD */
+  margin-top: 5px;
+  /*width: 32px;*/
+  background-color: #ffffff;
+  background-image: url(../gfx/icon_home.svg);
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 110%;
+}
+
+#nav-reset:hover, #nav-reset:focus {
+  /*opacity: 0.3;*/
+  background-color: #5555ff;
+}
+
+#map-search {
+  position: relative;
+  margin-left: 21px;
+  margin-top: 5px;
+  background-color: #ffffff;
+  background-image: url(../gfx/mapsearch.png);
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 95%;
+}
+
+#map-search:hover, #map-search:focus {
+  background-color: #5555ff;
+}
+
+/* edit ADD start */
+#open-legend {
+  display: none;
+  position: relative;
+  margin-top: -10px;
+}
+/* edit ADD end */
+
+#layer-toggle {
+  width: 2em;
+  height: 2em;
+  margin-left: 30%;
+  position: relative;
+  display: none;
+  background-color: #ffffff;
+  /*background-image: url(../gfx/globe.svg);*/
+  /*background-position: center;*/
+  /*background-repeat: no-repeat;*/
+  /*background-si1ze: 90%;*/
+}
+
+#layer-toggle:hover {
+  background-color: #5555ff;
+}
+
+.map-legend {
+  position: relative;
+}
+.map-legend button.legend {
+  background-color: #000000;
+  color: #ffffff;
+}
+
+.map-legend button.legend:hover, .map-legend button.legend:focus {
+  background-color: #6d6f72;
+  border: 1px solid #000000;
+}
+
+.map-legend-info {
+  font-family: Metric, sans-serif;
+  position: absolute;
+  top: 10em;
+  left: 0;
+  height: 14em;
+  background-color: #ffffff;
+  width: 15%;
+  min-width: 11em;
+  text-align: left;
+  padding: 10px;
+}
+
+.map-legend-info .icon {
+  width: 20px!important;
+  height: 20px!important;
+  vertical-align: middle;
+}
+
+.map-legend-info .legend-title {
+  /*
+  .smallcaps {
+  font-size: 75%;
+  font-weight: 400;
+  letter-spacing: 1px;
+  text-transform: uppercase; }  */
+  /* shadow-bottom= box-shadow: 0 6px 10px -8px #000;;*/
+  font-size: 80%;
+  position: relative;
+  margin-left: -10px;
+  padding-left: 10px;
+
+  height: 30px;
+  width: 90px;
+  line-height: 32px;
+
+  letter-spacing: 3px;
+
+  background-color: #000000;
+  color: #ffffff;
+}
+
+.map-legend-info .legend-title::after {
+  position: absolute;
+  left: 100%;
+  top: 50%;
+  content: ' ';
+  pointer-events: none;
+  height: 0;
+  width: 0;
+  border-color: rgba(105, 192, 186, 0);
+  border-width: 15px;
+  border-left: 10px solid #000000;
+  margin-top: -15px;
+}
+
+.nav-ui-wrap #open-legend {
+  background-color: #000000;
+  color: #ffffff;
+  position: relative;
+  left: 20px; /* edit CHANGE */
+  top: 1em;
+  line-height: 28px;
+}
+
+.nav-ui-wrap #open-legend:hover {
+  background-color: #ffffff;
+  color: #000000;
+}
+
+
+.map-legend-info .closelegend {
+  position: absolute;
+  right: 5px;
+  top: 5px;
+}
+
+.map-legend-info .closemenu {
+  border: 0;
+}
+
+.map-legend-info .closemenu:hover, .map-legend-info .closemenu:focus {
+  border: 0;
+  background-color: transparent;
+  color: #000000;
+}
+
+.map-legend-info .legend-row {
+  font-size: 70%;
+  margin-top: 10px;
+}
+
+.map-legend-info .legend-row div, .map-legend-info .legend-controls > div {
+  display: inline;
+}
+
+.map-legend-info .legend-controls {
+  font-size: 65%;
+  margin: 20px 0 10px 0;
+  padding: 20px 0;
+  border-top: 1px solid black;
+  height: 100px;
+  text-align: center;
+}
+
+.map-legend-info .legend-control-icon {
+  display: inline;
+  vertical-align: middle;
+}
+
+.map-legend-info .legend-control-icon:first-of-type{
+  width: 20px;
+  height: 41px;
+}
+.map-legend-info .legend-control-icon:nth-of-type(2) {
+  width: 61px;
+  height: 41px;
+}
+
+#legend {
+  display: none;
+}
+
+/* @media screen and (max-width: 531px) {
+
+  #legend, #open-legend {
+    display: none;
+  }
+
+  .nav-ui-wrap {
+    margin-top: 0;
+  }
+
+  #nav-arrows {
+    margin-right: 16%;
+    float: right;
+    display: block;
+  }
+
+  #nav-reset {
+    margin-top: 10%;
+    margin-left: 5.6%;
+  }
+
+  #nav-up {
+    left: 37%;
+  }
+
+  #zoom {
+    display: block;
+    left: 5.6%;
+  }
+} */
+
+/*!* Portrait and Landscape *!*/
+/* @media (min-width: 523px)
+and (max-width: 768px) {
+
+  #legend, #open-legend {
+    display: none;
+  }
+
+  #zoom {
+    left: 5%;
+    display: inline-block;
+  }
+
+  #nav-arrows {
+    display: inline-block;
+    float: right;
+    margin-right: 10%;
+  }
+  #nav-reset {
+    margin-left: 5.6%;
+  }
+} */
+
+
+/*@media screen and (min-width: 768px)*/
+/*and (max-width: 1370px) {*/
+
+/*#cesiumContainer {*/
+/*width: 100%;*/
+/*}*/
+/*#legend {*/
+/*font-size: 65%;*/
+/*transform: translateY(53.5em);*/
+/*}*/
+
+/*#legend-pre {*/
+/*display: none;*/
+/*}*/
+/*}*/
+
+/*@media screen and (min-width: 1370px)*/
+/*and (max-width: 1600px) {*/
+/*#legend {*/
+/*transform: translateY(44em);*/
+/*}*/
+
+/*#legend-group div.legend-text {*/
+/*font-size: 1em;*/
+/*}*/
+
+/*}*/

+ 353 - 0
qd30map/css/map-utilOLD.css

@@ -0,0 +1,353 @@
+.nav-ui-wrap  {
+  position: absolute;
+  margin-left: 10px;
+}
+
+.nav-ui-wrap div{
+  border: 4px solid #fcc300;
+}
+
+.map-button {
+  border: 1px solid #6d6f72;
+  width: 24px;
+  height: 24px;
+  margin: 1px -6px 1px 1px;
+  background-color: white;
+  color: black;
+  padding: 0;
+  align-items: flex-start;
+  text-align: center;
+  cursor: default;
+}
+
+#nav-arrows {
+  border: none;
+  display: block;
+  position: relative;
+  margin-top: 15%;
+  margin-left: -3px
+}
+
+#nav-arrows > button {
+  line-height: 28px;
+}
+
+#zoom {
+  border: none;
+  display: block;
+  margin-top: 20px;
+  margin-left: 20px;
+  position: relative;
+}
+
+#zoom button { line-height: 28px; }
+
+#zoom-in {
+  border: 1px solid #6d6f72;
+  background-color: white;
+  color: black;
+  padding: 0;
+  align-items: flex-start;
+  text-align: center;
+  cursor: default;
+  display: block;
+  margin-bottom: -2px;
+}
+
+#zoom-out {
+  background-color: #ffffff;
+  display: block;
+}
+
+#nav-up {
+  position: relative;
+  margin-bottom: -2px;
+  left: 35%;
+  background-color: #ffffff;
+  display: block;
+}
+
+#nav-left {
+  display: inline-block;
+  background-color: #ffffff;
+}
+#nav-right {
+  display: inline-block;
+  background-color: #ffffff;
+}
+#nav-down {
+  display: inline-block;
+  background-color: #ffffff;
+}
+
+#nav-up > a, #nav-down > a, #nav-left > a, #nav-right > a {
+  min-width: 100%;
+  min-height: 100%;
+}
+
+#nav-up:hover, #nav-down:hover, #nav-left:hover, #nav-right:hover, #zoom-in:hover, #zoom-out:hover,
+#nav-up:focus, #nav-down:focus, #nav-left:focus, #nav-right:focus, #zoom-in:focus, #zoom-out:focus {
+  background-color: #fcc300;
+}
+
+#nav-reset {
+  display: block;
+  position: relative;
+  margin-left: 21px;
+  margin-top: 5px;
+  background-color: #ffffff;
+  background-image: url(../gfx/icon_home.svg);
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 110%;
+}
+
+#nav-reset:hover, #nav-reset:focus {
+  background-color: #fcc300;
+}
+
+#map-search {
+  position: relative;
+  margin-left: 21px;
+  margin-top: 5px;
+  background-color: #ffffff;
+  background-image: url(../gfx/mapsearch.png);
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 95%;
+}
+
+#map-search:hover, #map-search:focus {
+  background-color: #fcc300;
+}
+
+#open-legend {
+  display: none;
+  position: relative;
+  margin-top: -10px;
+}
+
+#layer-toggle {
+  width: 2em;
+  height: 2em;
+  margin-left: 30%;
+  position: relative;
+  display: none;
+  background-color: #ffffff;
+}
+
+#layer-toggle:hover {
+  background-color: #fcc300;
+}
+
+.map-legend {
+  position: relative;
+}
+.map-legend button.legend {
+  background-color: #000000;
+  color: #ffffff;
+}
+
+.map-legend button.legend:hover, .map-legend button.legend:focus {
+  background-color: #6d6f72;
+  border: 1px solid #000000;
+}
+
+.map-legend-info {
+  font-family: Metric, sans-serif;
+  position: absolute;
+  top: 10em;
+  left: 0;
+  height: 14em;
+  background-color: #ffffff;
+  width: 15%;
+  min-width: 11em;
+  text-align: left;
+  padding: 10px;
+}
+
+.map-legend-info .icon {
+  width: 20px!important;
+  height: 20px!important;
+  vertical-align: middle;
+}
+
+.map-legend-info .legend-title {
+  font-size: 80%;
+  position: relative;
+  margin-left: -10px;
+  padding-left: 10px;
+
+  height: 30px;
+  width: 90px;
+  line-height: 32px;
+
+  letter-spacing: 3px;
+
+  background-color: #000000;
+  color: #ffffff;
+}
+
+.map-legend-info .legend-title::after {
+  position: absolute;
+  left: 100%;
+  top: 50%;
+  content: ' ';
+  pointer-events: none;
+  height: 0;
+  width: 0;
+  border-color: rgba(105, 192, 186, 0);
+  border-width: 15px;
+  border-left: 10px solid #000000;
+  margin-top: -15px;
+}
+
+.nav-ui-wrap #open-legend {
+  background-color: #000000;
+  color: #ffffff;
+  position: relative;
+  left: 20px;
+  top: 1em;
+  line-height: 28px;
+}
+
+.nav-ui-wrap #open-legend:hover {
+  background-color: #ffffff;
+  color: #000000;
+}
+
+
+.map-legend-info .closelegend {
+  position: absolute;
+  right: 5px;
+  top: 5px;
+}
+
+.map-legend-info .closemenu {
+  border: 0;
+}
+
+.map-legend-info .closemenu:hover, .map-legend-info .closemenu:focus {
+  border: 0;
+  background-color: transparent;
+  color: #000000;
+}
+
+.map-legend-info .legend-row {
+  font-size: 70%;
+  margin-top: 10px;
+}
+
+.map-legend-info .legend-row div, .map-legend-info .legend-controls > div {
+  display: inline;
+}
+
+.map-legend-info .legend-controls {
+  font-size: 65%;
+  margin: 20px 0 10px 0;
+  padding: 20px 0;
+  border-top: 1px solid black;
+  height: 100px;
+  text-align: center;
+}
+
+.map-legend-info .legend-control-icon {
+  display: inline;
+  vertical-align: middle;
+}
+
+.map-legend-info .legend-control-icon:first-of-type{
+  width: 20px;
+  height: 41px;
+}
+.map-legend-info .legend-control-icon:nth-of-type(2) {
+  width: 61px;
+  height: 41px;
+}
+
+#legend {
+  display: none;
+}
+
+/* @media screen and (max-width: 531px) {
+
+  #legend, #open-legend {
+    display: none;
+  }
+
+  .nav-ui-wrap {
+    margin-top: 0;
+  }
+
+  #nav-arrows {
+    margin-right: 16%;
+    float: right;
+    display: block;
+  }
+
+  #nav-reset {
+    margin-top: 10%;
+    margin-left: 5.6%;
+  }
+
+  #nav-up {
+    left: 37%;
+  }
+
+  #zoom {
+    display: block;
+    left: 5.6%;
+  }
+} */
+
+/*!* Portrait and Landscape *!*/
+/* @media (min-width: 523px)
+and (max-width: 768px) {
+
+  #legend, #open-legend {
+    display: none;
+  }
+
+  #zoom {
+    left: 5%;
+    display: inline-block;
+  }
+
+  #nav-arrows {
+    display: inline-block;
+    float: right;
+    margin-right: 10%;
+  }
+  #nav-reset {
+    margin-left: 5.6%;
+  }
+} */
+
+
+/*@media screen and (min-width: 768px)*/
+/*and (max-width: 1370px) {*/
+
+/*#cesiumContainer {*/
+/*width: 100%;*/
+/*}*/
+/*#legend {*/
+/*font-size: 65%;*/
+/*transform: translateY(53.5em);*/
+/*}*/
+
+/*#legend-pre {*/
+/*display: none;*/
+/*}*/
+/*}*/
+
+/*@media screen and (min-width: 1370px)*/
+/*and (max-width: 1600px) {*/
+/*#legend {*/
+/*transform: translateY(44em);*/
+/*}*/
+
+/*#legend-group div.legend-text {*/
+/*font-size: 1em;*/
+/*}*/
+
+/*}*/

+ 423 - 0
qd30map/css/minimap-util.css

@@ -0,0 +1,423 @@
+.nav-ui-wrap  {
+  position: absolute;
+  margin-left: 1%;
+  margin-top: 0.5%;
+}
+
+.nav-ui-wrap div{
+  border: 4px solid #5555ff;
+}
+
+.map-button {
+  border: 1px solid #6d6f72;
+  width: 24px;
+  height: 24px;
+  margin: 1px -6px 1px 1px;
+  background-color: white;
+  color: black;
+  padding: 0;
+  align-items: flex-start;
+  text-align: center;
+  cursor: default;
+}
+
+#nav-arrows {
+  border: none;
+  display: block;
+  position: relative;
+  margin-top: 15%;
+}
+
+#zoom {
+  border: none;
+  display: block;
+  left: 35%;
+  position: relative;
+}
+
+#zoom-in {
+  border: 1px solid #6d6f72;
+  margin: 1px;
+  background-color: white;
+  color: black;
+  padding: 0;
+  align-items: flex-start;
+  text-align: center;
+  cursor: default;
+  display: block;
+}
+
+#zoom-out {
+  margin-top: 3%;
+  background-color: #ffffff;
+  display: block;
+}
+
+#nav-up {
+  position: relative;
+  margin-bottom: 2.5%;
+  left: 35%;
+  background-color: #ffffff;
+  display: block;
+
+}
+
+#nav-left {
+  display: inline-block;
+  background-color: #ffffff;
+}
+#nav-right {
+  display: inline-block;
+  background-color: #ffffff;
+  margin-left: -1px;
+}
+#nav-down {
+  /*position: relative;
+  left: 14.25%;*/
+  margin-left: -1px;
+  display: inline-block;
+  /*margin-top: -1%;*/
+  background-color: #ffffff;
+}
+
+#nav-up > a, #nav-down > a, #nav-left > a, #nav-right > a {
+  min-width: 100%;
+  min-height: 100%;
+}
+
+#nav-up:hover, #nav-down:hover, #nav-left:hover, #nav-right:hover, #zoom-in:hover, #zoom-out:hover,
+#nav-up:focus, #nav-down:focus, #nav-left:focus, #nav-right:focus, #zoom-in:focus, #zoom-out:focus {
+  /*opacity: 0.3;*/
+  background-color: #5555ff;
+}
+
+#nav-reset {
+  display: inline-block;
+  position: relative;
+  margin-left: 36.5%;
+  /*width: 32px;*/
+  background-color: #ffffff;
+  background-image: url(../gfx/icon_home.svg);
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: 110%;
+}
+
+#nav-reset:hover, #nav-reset:focus {
+  /*opacity: 0.3;*/
+  background-color: #5555ff;
+}
+
+#layer-toggle {
+  width: 2em;
+  height: 2em;
+  margin-left: 30%;
+  position: relative;
+  display: none;
+  background-color: #ffffff;
+  /*background-image: url(../gfx/globe.svg);*/
+  /*background-position: center;*/
+  /*background-repeat: no-repeat;*/
+  /*background-si1ze: 90%;*/
+}
+
+#layer-toggle:hover {
+  background-color: #5555ff;
+}
+
+.map-legend {
+  position: relative;
+}
+.map-legend button.legend {
+  background-color: #000000;
+  color: #ffffff;
+}
+
+.map-legend button.legend:hover, .map-legend button.legend:focus {
+            background-color: #6d6f72;
+            border: 1px solid #000000;
+}
+
+.map-legend-info {
+  font-family: Metric, sans-serif;
+  position: absolute;
+  top: 10em;
+  left: 0;
+  height: 14em;
+  background-color: #ffffff;
+  width: 15%;
+  min-width: 11em;
+  text-align: left;
+  padding: 10px;
+}
+
+.map-legend-info .icon {
+  width: 20px!important;
+  height: 20px!important;
+  vertical-align: middle;
+}
+
+.map-legend-info .legend-title {
+  /*
+  .smallcaps {
+  font-size: 75%;
+  font-weight: 400;
+  letter-spacing: 1px;
+  text-transform: uppercase; }  */
+  /* shadow-bottom= box-shadow: 0 6px 10px -8px #000;;*/
+  font-size: 80%;
+  position: relative;
+  margin-left: -10px;
+  padding-left: 10px;
+
+  height: 30px;
+  width: 90px;
+  line-height: 32px;
+
+  letter-spacing: 3px;
+
+  background-color: #000000;
+  color: #ffffff;
+}
+
+.map-legend-info .legend-title::after {
+   position: absolute;
+   left: 100%;
+   top: 50%;
+   content: ' ';
+   pointer-events: none;
+   height: 0;
+   width: 0;
+   border-color: rgba(105, 192, 186, 0);
+   border-width: 15px;
+   border-left: 10px solid #000000;
+   margin-top: -15px;
+}
+
+.nav-ui-wrap #open-legend {
+  background-color: #000000;
+  color: #ffffff;
+  position: relative;
+  left: 35%;
+  top: 1em;
+}
+
+.nav-ui-wrap #open-legend:hover {
+  background-color: #ffffff;
+  color: #000000;
+}
+
+
+.map-legend-info .closelegend {
+  position: absolute;
+  right: 5px;
+  top: 5px;
+}
+
+.map-legend-info .closemenu {
+  border: 0;
+}
+
+.map-legend-info .closemenu:hover, .map-legend-info .closemenu:focus {
+  border: 0;
+  background-color: transparent;
+  color: #000000;
+}
+
+.map-legend-info .legend-row {
+  font-size: 70%;
+  margin-top: 10px;
+}
+
+.map-legend-info .legend-row div, .map-legend-info .legend-controls > div {
+  display: inline;
+}
+
+.map-legend-info .legend-controls {
+  font-size: 65%;
+  margin: 20px 0 10px 0;
+  padding: 20px 0;
+  border-top: 1px solid black;
+  height: 100px;
+  text-align: center;
+}
+
+.map-legend-info .legend-control-icon {
+  display: inline;
+  vertical-align: middle;
+}
+
+.map-legend-info .legend-control-icon:first-of-type{
+   width: 20px;
+   height: 41px;
+}
+.map-legend-info .legend-control-icon:nth-of-type(2) {
+   width: 61px;
+   height: 41px;
+}
+
+#legend {
+  display: none;
+}
+
+/*#legend {*/
+  /*transform: translateY(52em);*/
+  /*margin-left: 2%;*/
+/*}*/
+
+/*#legend-pre {*/
+  /*display: inline-block;*/
+  /*float: left;*/
+  /*font-size: 120%;*/
+  /*margin-top: 2.5%;*/
+/*}*/
+
+/*#legend-group {*/
+  /*display: inline;*/
+/*}*/
+
+/*#legend-group div > div.colour-block {*/
+  /*font-size: 1.5em;*/
+  /*font-weight: 700;*/
+  /*width: 16em;*/
+  /*height: 2em;*/
+  /*margin-top: 2%;*/
+  /*border: 1px solid black;*/
+  /*text-align: center;*/
+  /*line-height: 2em;*/
+  /*vertical-align: middle;*/
+/*}*/
+
+/*#legend-group div.legend-row-left {*/
+  /*float: left;*/
+  /*max-width: 50%;*/
+  /*display: inline;*/
+  /*margin-left: 5%;*/
+/*}*/
+
+/*#legend-group div.legend-row-right {*/
+  /*float: right;*/
+  /*max-width: 50%;*/
+  /*display: inline;*/
+  /*margin-right: 5%;*/
+
+/*}*/
+
+/*#legend-group div.legend-text {*/
+  /*display: inline;*/
+  /*width: 10em;*/
+  /*line-height: 2em;*/
+  /*font-size: 1.4em;*/
+  /*vertical-align: middle;*/
+/*}*/
+
+/*.colour-block {*/
+  /*border: 4px solid #5555ff!important;*/
+/*}*/
+/*.colour-block:focus, .colour-block:hover {*/
+  /*background-color: #5555ff!important;*/
+/*}*/
+
+/*!* Portrait and Landscape *!*/
+/*@media screen and (max-width: 768px) {*/
+
+  /*#zoom-in, #zoom-out, #nav-up, #nav-down, #nav-left, #nav-right {*/
+    /*width: 1em;*/
+    /*height: 1em;*/
+    /*background-repeat: no-repeat;*/
+    /*background-position: center center;*/
+    /*display: inline-block;*/
+  /*}*/
+
+  /*#zoom-out {*/
+    /*margin-top: 0;*/
+  /*}*/
+
+    /*#nav-reset {*/
+    /*width: 1.2em;*/
+    /*height: 1.2em;*/
+    /*margin-left: 0;*/
+  /*}*/
+
+  /*.nav-ui-wrap {*/
+    /*transform: translateY(155%);*/
+  /*}*/
+
+  /*#nav-arrows {*/
+    /*margin-top: 0;*/
+    /*width: 50%;*/
+    /*height: auto;*/
+  /*}*/
+
+  /*#zoom {*/
+    /*display: inline;*/
+    /*left: 0;*/
+  /*}*/
+
+  /*#nav-up {*/
+    /*left: 0;*/
+    /*margin-bottom: 0;*/
+  /*}*/
+
+  /*#legend {*/
+    /*float: right;*/
+    /*height: 0;*/
+    /*width: 100%;*/
+    /*text-align: center;*/
+    /*transform: translateY(26.5em);*/
+  /*}*/
+
+  /*#legend-group div > div.colour-block  {*/
+    /*width: 10%;*/
+    /*font-size: 60%;*/
+    /*margin-left: 5%;*/
+    /*float: none;*/
+    /*display: inline-block;*/
+  /*}*/
+
+  /*#legend-group div.legend-text {*/
+    /*display: none;*/
+  /*}*/
+
+  /*#legend-group div.legend-row-left {*/
+    /*margin-left: 0;*/
+    /*float: none;*/
+    /*}*/
+
+  /*#legend-group div.legend-row-right  {*/
+    /*float: none;*/
+  /*}*/
+
+  /*#legend-pre {*/
+    /*display: none;*/
+  /*}*/
+/*}*/
+
+
+/*@media screen and (min-width: 768px)*/
+/*and (max-width: 1370px) {*/
+
+  /*#cesiumContainer {*/
+    /*width: 100%;*/
+  /*}*/
+  /*#legend {*/
+    /*font-size: 65%;*/
+    /*transform: translateY(53.5em);*/
+  /*}*/
+
+  /*#legend-pre {*/
+    /*display: none;*/
+  /*}*/
+/*}*/
+
+/*@media screen and (min-width: 1370px)*/
+/*and (max-width: 1600px) {*/
+  /*#legend {*/
+      /*transform: translateY(44em);*/
+  /*}*/
+
+  /*#legend-group div.legend-text {*/
+    /*font-size: 1em;*/
+  /*}*/
+
+/*}*/

+ 578 - 0
qd30map/css/qd30map.css

@@ -0,0 +1,578 @@
+#block-quartierdix30-page-title > .box.main.title.bg-black {
+  top: -25px!important;
+}
+
+#app-container {
+  width: 70%;
+  display: inline-block;
+  height: 70vh;
+  float: left;
+  position: relative;
+  font-family: Metric, sans-serif;
+}
+
+#loading-placeholder {
+  background: red;
+  height: 70vh;
+  text-align: center;
+}
+
+#map-ui-form {
+  width: 24%;
+  display: none;
+  background-color: #ffffff;
+  float: right;
+  margin-left: 1%;
+  margin-right: 5%;
+  margin-bottom: 100px;
+  padding: 20px;
+  height: 70vh;
+  overflow-y: auto;
+  border: 1px solid black;
+}
+
+.cesium-selection-wrapper svg {
+  fill: #e5fffd;
+}
+
+
+::-webkit-scrollbar {
+  width: 13px;
+  height: 13px;
+}
+
+::-webkit-scrollbar-track {
+  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
+  border-radius: 5px;
+}
+
+::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
+}
+
+
+.cesium-viewer-geocoderContainer {
+  display: none;
+}
+
+/*#block-quartierdix30-content {*/
+/*min-height: 360px;*/
+/*}*/
+
+.page-qd30map .region-side-navigation {
+  display: none;
+}
+.cesium-widget-credits, .cesium-viewer-fullscreenContainer {
+  display: none!important;
+}
+
+.cesium-infoBox  {
+  width: 18em;
+  height: 15em;
+  position: absolute;
+  left: 0;
+  top: calc(100% - 320px);
+  background: white;
+  text-align: center;
+  box-shadow: none;
+  font-family: Metric, sans-serif;
+  border: 0;
+  -webkit-transform: translate(-100%, 0);
+  -moz-transform: translate(-100%, 0);
+  transform: translate(-100%, 0);
+}
+
+.cesium-infoBox-visible {
+  -webkit-transform: translate(0%, 0);
+  -moz-transform: translate(0%, 0);
+  transform: translate(0%, 0);
+}
+
+.cesium-infoBox-title {
+  display: none;
+}
+
+.cesium-infoBox-iframe  {
+  width: 18em;
+  background: white;
+  height: 15em!important;
+  box-shadow: 0 0 10px -2px #000;
+}
+
+.cesium-infoBox-camera {
+  display: none!important;
+}
+
+.cesium-infoBox-description {
+  color: #000000;
+  font-family: Metric, sans-serif;
+}
+
+.cesium-infoBox-description > div {
+
+}
+
+.cesium-infoBox-description a:link {
+  color: #000000;
+}
+
+.cesium-infoBox-description a:hover {
+  text-decoration: underline!important;
+  background-color: #fcc300!important;
+}
+
+.cesium-infoBox-description .boutique-infobox > a:hover {
+  background-color: inherit!important;
+}
+
+.cesium-infoBox-description h1 h2{
+  color: #000000;
+  text-align: center;
+  display: inline-block!important;
+}
+
+.cesium-infoBox-description #marker-img {
+  height: 36px;
+  background-image: url('../gfx/icon_mappointer-b.svg');
+  width: 36px;
+  background-size: 100%;
+  display: block;
+  float: left;
+  position: relative;
+  top: 16px;
+}
+
+
+.cesium-infoBox-description img {
+  display: none;
+  height: 20%;
+  max-width: 16em;
+}
+
+.cesium-selection-wrapper svg {
+  -webkit-transition:visibility 0s 0s,opacity 0s ease-in;
+  -moz-transition: visibility 0s 0s, opacity 0s ease-in;
+  transition:visibility 0s 0s,opacity 0s ease-in;
+}
+
+.cesium-selection-wrapper-visible {
+  -webkit-transition: opacity 0s ease-out;
+  -moz-transition: opacity 0s ease-out;
+  transition: opacity 0s ease-out;
+}
+
+.boutique-infobox {
+}
+.boutique-infobox #sector {
+  position: relative;
+  top: 20px
+}
+
+#msg-extra  {
+  padding-left: 30%;
+  position: absolute;
+  font-size: 75%;
+}
+
+#qd30map-cesium  {
+  width: 100%;
+  height: 100%;
+  display: none;
+  position: absolute;
+}
+
+.cesium-viewer-infoBoxContainer {
+}
+
+.boutique-map-hours {
+  font-family: Metric, sans-serif;
+}
+
+.hours-day {
+  min-height: 14px;
+  -webkit-margin-after: 0.33em;
+  padding-right: 5%;
+}
+
+#business-details, .boutique-info-phone, .boutique-info-website {
+  display: block;
+  padding-left: 36px
+}
+#business-details > *, .boutique-info-phone > *, .boutique-info-website > * {
+  font-size: 1.2em;
+}
+.boutique-info-website {
+  width: 200px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.hours-day img.icon,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon,
+.boutique-info-website img.icon {
+  display: none;
+  width: 18px;
+  height: 18px;
+  margin-top: -4px;
+  padding-right: 5px;
+  float: left;
+}
+
+.hours-day img.icon + span,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+
+}
+
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+
+}
+
+.boutique-info-phone img + span,
+.boutique-info-address img + span,
+.boutique-info-website img + a {
+}
+
+.hours-day > span {
+  padding-right: 4px;
+}
+
+.boutique-view-full {
+  font-style: italic;
+  text-decoration: underline;
+  float: right;
+  margin-top: 1em;
+}
+
+.event {
+  padding-top: 0.5em;
+  margin-top: 3em;
+  margin-left: -1em;
+  padding-right: 2em;
+  height: 2.5em;
+  background-color: #333333;
+  width: 100%;
+}
+
+.event .icon {
+  width: 20px;
+  height: 20px;
+  float: left;
+  margin-top: 0.5em;
+  padding-left: 1em;
+}
+
+#event-before {
+  position: absolute;
+  left: 0;
+  margin-top: 2.5em;
+  height: 0.5em;
+  width: 100%;
+  background-image: url(../gfx/bg-grill.svg);
+  background-size: 60%;
+}
+
+.event .readmore {
+  display: inline;
+  line-height: 2.5;
+  float: right;
+}
+
+.event a {
+  color: #ffffff!important;
+  font-style: italic;
+}
+
+details summary::-webkit-details-marker { display:none; }
+
+form > .form-wrapper > summary {
+  font-size: 120%;
+  min-height: 1.3em;
+  font-weight: 600;
+  margin-top: 10px;
+}
+
+form > .form-wrapper > summary > a {
+  font-weight: 600;
+  text-decoration: none;
+}
+
+
+details > details {
+  margin-left: 3%;
+  font-size: 20px;
+  font-weight: 300;
+}
+
+details > details > summary {
+  min-height: 1.2em;
+}
+
+details > details > summary > a {
+  text-transform: uppercase;
+  font-size: 75%;
+  text-decoration: none;
+  font-weight: 600;
+}
+
+
+details > details > details > summary {
+  min-height: 1.1em;
+  font-size: 18px;
+}
+
+#map-ui-form div.form-item {
+  font-size: 16px;
+  padding-top: 0px;
+  padding-left: 10px;
+}
+
+#map-ui-form div.form-item:last-child {
+  padding-bottom: 5px;
+}
+
+#map-ui-form .form-item:hover {
+  font-weight: 700;
+  font-size: 16px;
+  background-color: #e2e2e2;
+  color: #000000;
+  cursor: pointer;
+}
+
+#map-ui-form .form-item-search:hover {
+  font-weight: 500;
+  cursor: default;
+  background-color: #ffffff;
+}
+
+#map-ui-form > div.form-item-search.js-form-type-entity-autocomplete {
+  padding-left: 0;
+  background-color: transparent;
+}
+
+#map-ui-form > .form-item-search {
+  background-color: transparent;
+  padding-bottom: 10px;
+}
+
+#map-ui-form span.hidden-nid {
+  display: none;
+}
+
+#edit-search  {
+  padding-left: 0;
+  min-height: 2em;
+  margin-bottom: 4%;
+  background-color: white;
+  width: calc(100% - 65px);
+  font-weight: 300;
+
+}
+
+#edit-search:focus {
+  outline: 1px solid #fcc300;
+}
+
+#edit-mapsubmit {
+  display: none;
+  margin-bottom: 2%;
+  margin-top: -2%;
+}
+
+.selected-store, .selected-store > * {
+  color: #ffffff;
+  background-color: #000000;
+  font-weight: 700;
+}
+
+
+@media only screen and (max-width: 531px) {
+
+  #app-container {
+    min-height: 32em;
+  }
+
+  form > .form-wrapper > summary {
+    min-height: 1.3em;
+    font-weight: 500;
+  }
+
+  details > details {
+    margin-left: 2%;
+    font-weight: 300;
+  }
+
+  details > details > details > summary {
+    min-height: 1.1em;
+  }
+
+  #map-ui-form div.form-item {
+    padding-left: 3%;
+  }
+
+  #map-ui-form .form-item:hover {
+    font-weight: 700;
+    background-color: #e2e2e2;
+    cursor: pointer;
+  }
+}
+
+
+
+
+
+@media (min-width: 532px)
+and (max-width: 767px) {
+
+  #app-container {
+    min-height: 38em;
+  }
+
+
+}
+
+@media (min-width: 300px) and (max-width: 420px)
+and (min-height: 640px) and (max-height: 768px) {
+
+}
+
+@media (min-width: 532px) and (max-height: 370px) and (max-width: 767px) {
+}
+
+.boutique-infobox {
+}
+
+
+@media all and (min-width: 768px) and (max-width: 960px) {
+
+  form > .form-wrapper > summary {
+  }
+
+  details > details {
+  }
+
+  details > details > details > summary {
+  }
+
+  #map-ui-form div.form-item {
+  }
+}
+
+@media (min-height: 320px) and (max-height: 420px) and (max-width: 768px) {
+
+  #main {
+    height: 22em;
+  }
+
+  #main, #content-area {
+    box-shadow: none;
+  }
+
+  #header {
+    box-shadow: none!important;
+  }
+
+  #mobile-menu-logo {
+
+  }
+
+  .boutique-infobox {
+    font-size: 1.2em!important;
+  }
+
+
+  #mobile-menu-button {
+    height: 36px!important;
+    float: left!important;
+  }
+
+  #mobile-top-bar {
+    height: 0!important;
+  }
+
+  #mobile-menu-logo a {
+    margin-left: -50px!important;
+  }
+
+  #mobile-menu-logo a img {
+    width: 75%!important;
+  }
+
+  #block-quartierdix30-page-title {
+    display: none!important;
+  }
+
+  #map-ui-form {
+    transform: translateY(-139%);
+  }
+}
+
+@media (min-height: 420px) and (max-width: 768px) {
+  #content-area > div,
+  #content-area > div {
+    top: 48px!important;
+  }
+}
+
+@media (min-width: 960px) {
+  .boutique-infobox {
+    font-size: 1.5em!important;
+  }
+}
+
+@media all and (max-width: 767px) {
+  #app-container {
+    width: 100%;
+    display: block;
+    min-height: 50vh;
+    height: 80vh;
+    float: none;
+  }
+  #map-ui-form {
+    display: block;
+
+    width: 90%;
+    min-height: 200px;
+    padding: 5%;
+    margin: 5%;
+
+    float: none;
+    clear: both;
+
+    border: 1px solid black;
+  }
+
+  #map-ui-form div.form-item {
+    padding-bottom: 5px;
+  }
+
+  .cesium-infoBox {
+    width: 100vw;
+    height: 150px;
+    top: calc(100% - 120px);
+  }
+  .cesium-infoBox-iframe {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+@media all and (min-width: 300px) {
+  #business-details {
+    top: 0;
+    margin-top: -10px;
+    line-height: 0;
+  }
+  .boutique-info-address, .boutique-info-website, .boutique-info-phone {
+    display: none;
+  }
+  .boutique-view-full {
+    margin-top: 0;
+    line-height: 0;
+    padding-right: 20px;
+  }
+}

+ 513 - 0
qd30map/css/qd30mapOLD.css

@@ -0,0 +1,513 @@
+#block-quartierdix30-page-title > .box.main.title.bg-black {
+  top: -25px!important;
+}
+
+#app-container {
+  width: 75%;
+  display: inline-block;
+  min-height: 40em;
+  height: 80vh;
+  float: left;
+  position: relative;
+  font-family: Metric, sans-serif;
+}
+
+
+#map-ui-form {
+  width: 24%;
+  display: inline-block;
+  background-color: #ffffff;
+  float: right;
+  margin-left: 1%;
+  padding-bottom: 50px;
+}
+
+.cesium-selection-wrapper svg {
+  fill: #e5fffd;
+}
+
+
+::-webkit-scrollbar {
+  width: 13px;
+  height: 13px;
+}
+
+::-webkit-scrollbar-track {
+  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
+  border-radius: 5px;
+}
+
+::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
+}
+
+
+.cesium-viewer-geocoderContainer {
+  display: none;
+}
+
+/*#block-quartierdix30-content {*/
+/*min-height: 360px;*/
+/*}*/
+
+.page-qd30map .region-side-navigation {
+  display: none;
+}
+.cesium-widget-credits, .cesium-viewer-fullscreenContainer {
+  display: none!important;
+}
+
+.cesium-infoBox  {
+  width: 18em;
+  height: 15em;
+  position: absolute;
+  left: 0;
+  top: calc(100% - 320px);
+  background: white;
+  text-align: center;
+  box-shadow: none;
+  font-family: Metric, sans-serif;
+  border: 0;
+}
+
+.cesium-infoBox-title {
+  display: none;
+}
+
+.cesium-infoBox-iframe  {
+  width: 18em;
+  background: white;
+  height: 15em!important;
+  box-shadow: 0 0 10px -2px #000;
+}
+
+.cesium-infoBox-camera {
+  display: none!important;
+}
+
+.cesium-infoBox-description {
+  color: #000000;
+  font-family: Metric, sans-serif;
+
+}
+
+.cesium-infoBox-description > div {
+
+}
+
+.cesium-infoBox-description a:link {
+  color: #000000;
+}
+
+.cesium-infoBox-description a:hover {
+  text-decoration: underline!important;
+  background-color: #fcc300!important;
+}
+
+.cesium-infoBox-description .boutique-infobox > a:hover {
+  background-color: inherit!important;
+}
+
+.cesium-infoBox-description h1 h2{
+  color: #000000;
+  text-align: center;
+  display: inline-block!important;
+}
+
+.cesium-infoBox-description #marker-img {
+  height: 36px;
+  background-image: url('../gfx/icon_mappointer-b.svg');
+  width: 36px;
+  background-size: 100%;
+  display: block;
+  float: left;
+  position: relative;
+  top: 16px;
+}
+
+
+.cesium-infoBox-description img {
+  display: none;
+  height: 20%;
+  max-width: 16em;
+}
+
+.boutique-infobox h2 {
+  display: inline-block;
+  max-width: 200px;
+  line-height: 0.8em;
+  padding-top: 5px;
+}
+
+.boutique-infobox #sector {
+  position: relative;
+  top: 20px
+}
+
+#msg-extra  {
+  padding-left: 30%;
+  position: absolute;
+  font-size: 75%;
+}
+
+#qd30map-cesium  {
+  width: 100%;
+  height: 100%;
+  display: inline-block;
+  position: absolute;
+}
+
+.cesium-viewer-infoBoxContainer {
+}
+
+.boutique-map-hours {
+  font-family: Metric, sans-serif;
+}
+
+.hours-day {
+  min-height: 14px;
+  -webkit-margin-after: 0.33em;
+  padding-right: 5%;
+  margin-bottom: 0;
+}
+
+#business-details, .boutique-info-phone, .boutique-info-website {
+  display: block;
+  padding-left: 36px
+}
+#business-details > *, .boutique-info-phone > *, .boutique-info-website > * {
+  font-size: 1.2em;
+}
+.boutique-info-website {
+  width: 200px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.hours-day img.icon,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon,
+.boutique-info-website img.icon {
+  display: none;
+  width: 18px;
+  height: 18px;
+  margin-top: -4px;
+  padding-right: 5px;
+  float: left;
+}
+
+.hours-day > span {
+  padding-right: 4px;
+}
+
+.boutique-view-full {
+  font-style: italic;
+  text-decoration: underline;
+  float: right;
+  margin-top: 1em
+}
+
+.event {
+  padding-top: 0.5em;
+  margin-top: 3em;
+  margin-left: -1em;
+  padding-right: 2em;
+  height: 2.5em;
+  background-color: #333333;
+  width: 100%;
+}
+
+.event .icon {
+  width: 20px;
+  height: 20px;
+  float: left;
+  margin-top: 0.5em;
+  padding-left: 1em;
+}
+
+#event-before {
+  position: absolute;
+  /*bottom: -258px;*/
+  left: 0;
+  margin-top: 2.5em;
+  /*content: ' ';*/
+  height: 0.5em;
+  width: 100%;
+  background-image: url(../gfx/bg-grill.svg);
+  background-size: 60%;
+}
+
+.event .readmore {
+  display: inline;
+  line-height: 2.5;
+  float: right;
+}
+
+.event a {
+  color: #ffffff!important;
+  font-style: italic;
+}
+
+
+details summary::-webkit-details-marker { display:none; }
+
+form > .form-wrapper > summary {
+  font-size: 120%;
+  min-height: 1.3em;
+  font-weight: 600;
+  margin-top: 10px;
+}
+
+form > .form-wrapper > summary > a {
+  font-weight: 600;
+  text-decoration: none;
+}
+
+
+details > details {
+  margin-left: 3%;
+  font-size: 20px;
+  font-weight: 300;
+}
+
+details > details > summary {
+  min-height: 1.2em;
+}
+
+details > details > summary > a {
+  text-transform: uppercase;
+  font-size: 75%;
+  text-decoration: none;
+  font-weight: 600;
+}
+
+
+details > details > details > summary {
+  min-height: 1.1em;
+  font-size: 18px;
+}
+
+#map-ui-form div.form-item {
+  font-size: 16px;
+  padding-top: 0px;
+  padding-left: 10px;
+}
+
+#map-ui-form div.form-item:last-child {
+  padding-bottom: 5px;
+}
+
+#map-ui-form .form-item:hover {
+  font-weight: 700;
+  font-size: 16px;
+  background-color: #e2e2e2;
+  color: #000000;
+  cursor: pointer;
+}
+
+#map-ui-form .form-item-search:hover {
+  font-weight: 500;
+  cursor: default;
+  background-color: #ffffff;
+}
+
+#map-ui-form > div.form-item-search.js-form-type-entity-autocomplete {
+  padding-left: 0;
+  background-color: transparent;
+}
+
+#map-ui-form > .form-item-search {
+  background-color: transparent;
+  padding-bottom: 10px;
+}
+
+#edit-search  {
+  padding-left: 0;
+  min-height: 2em;
+  margin-bottom: 4%;
+
+  background-color: white;
+  width: calc(100% - 65px);
+  font-weight: 300;
+
+}
+
+#edit-search:focus {
+  outline: 1px solid #fcc300;
+}
+
+#edit-mapsubmit {
+  display: none;
+  margin-bottom: 2%;
+  margin-top: -2%;
+}
+
+.selected-store, .selected-store > * {
+  color: #ffffff;
+  background-color: #000000;
+  font-weight: 700;
+}
+
+
+@media only screen and (max-width: 531px) {
+
+  #app-container {
+    min-height: 32em;
+  }
+
+
+  form > .form-wrapper > summary {
+    min-height: 1.3em;
+    font-weight: 500;
+  }
+
+  details > details {
+    margin-left: 2%;
+    font-weight: 300;
+  }
+
+  details > details > details > summary {
+    min-height: 1.1em;
+  }
+
+  #map-ui-form div.form-item {
+    padding-left: 3%;
+  }
+
+  #map-ui-form .form-item:hover {
+    font-weight: 700;
+    background-color: #e2e2e2;
+    cursor: pointer;
+  }
+}
+
+
+
+
+
+@media (min-width: 532px)
+and (max-width: 767px) {
+
+  #app-container {
+    min-height: 38em;
+  }
+}
+
+
+@media (min-height: 320px) and (max-height: 420px) and (max-width: 768px) {
+
+  #main {
+    height: 22em;
+  }
+
+  #main, #content-area {
+    box-shadow: none;
+  }
+
+  #header {
+    box-shadow: none!important;
+  }
+
+  #mobile-menu-logo {
+
+  }
+
+  .boutique-infobox {
+    font-size: 1.2em!important;
+  }
+
+
+  #mobile-menu-button {
+    height: 36px!important;
+    float: left!important;
+  }
+
+  #mobile-top-bar {
+    height: 0!important;
+  }
+
+  #mobile-menu-logo a {
+    margin-left: -50px!important;
+  }
+
+  #mobile-menu-logo a img {
+    width: 75%!important;
+  }
+
+  #block-quartierdix30-page-title {
+    display: none!important;
+  }
+
+  #map-ui-form {
+    transform: translateY(-139%);
+  }
+
+}
+
+@media (min-height: 420px) and (max-width: 768px) {
+  #content-area > div,
+  #content-area > div {
+    top: 48px!important;
+  }
+}
+
+@media (min-width: 960px) {
+  .boutique-infobox {
+    font-size: 1.5em!important;
+  }
+}
+
+@media all and (max-width: 767px) {
+  #app-container {
+    width: 100%;
+    display: block;
+    min-height: 50vh;
+    height: 80vh;
+    float: none;
+  }
+  #map-ui-form {
+    display: block;
+
+    width: 90%;
+    min-height: 200px;
+    padding: 5%;
+    margin: 5%;
+
+    float: none;
+    clear: both;
+
+    border: 1px solid black;
+  }
+
+  #map-ui-form div.form-item {
+    padding-bottom: 5px;
+  }
+
+  .cesium-infoBox {
+    width: 100vw;
+    height: 150px;
+    top: calc(100% - 120px);
+  }
+  .cesium-infoBox-iframe {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+@media all and (min-width: 300px) {
+  #business-details {
+    top: 0;
+    margin-top: -10px;
+    line-height: 0;
+  }
+  .boutique-info-address, .boutique-info-website, .boutique-info-phone {
+    display: none;
+  }
+  .boutique-view-full {
+    margin-top: 0;
+    line-height: 0;
+    padding-right: 20px;
+  }
+}

+ 352 - 0
qd30map/css/qd30minimap.css

@@ -0,0 +1,352 @@
+#block-nodemapblock {
+  z-index: 1;
+  position: relative;
+  width: 55%;
+  float: left;
+  margin-left: 20px;
+}
+
+#block-views-block-miscellaneous-galleries-boutique-information-block > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery),
+#block-views-block-miscellaneous-galleries-block-2 > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+  position: absolute;
+  width: 440px;
+  left: calc(60% - 40px);
+  z-index: 1;
+  padding: 0;
+  margin: 0;
+}
+
+@media all and (max-width: 767px) {
+  body.lang-fr #block-views-block-miscellaneous-galleries-block-2 > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+    position: relative;
+    left: 50%;
+    margin-left: -180px;
+  }
+}
+
+#block-views-block-miscellaneous-galleries-events-promotions-gallery > .box.wide {
+  /*width: 75%!important;*/
+}
+
+#boutique-info-container {
+  border-top: none!important;
+  padding: 0!important;
+}
+
+#block-views-block-miscellaneous-galleries-boutique-information-block > div > .container-center {
+  /*z-index: 1;*/
+  padding: 0px 8%;
+}
+
+@media all and (max-width: 767px) {
+  #block-views-block-miscellaneous-galleries-boutique-information-block > div > .container-center {
+    padding: 0 4%;
+  }
+}
+
+#block-views-block-miscellaneous-galleries-boutique-information-block .container-center {
+}
+
+.cesium-selection-wrapper svg {
+  fill: #e5fffd;
+}
+
+#boutique-map, #boutique-info > hr {
+  display: none;
+  width: 0;
+}
+
+#boutique-info {
+  float: none;
+}
+
+#boutique-div {
+  width: 50%;
+  margin-left: 25%;
+  margin-bottom: 1.5%;
+  border-bottom: 1px solid #000000;
+}
+
+.boutique-map-hours {
+  font-family: Metric, sans-serif;
+}
+
+#app-container {
+  width: 100%;
+  display: block;
+  /*min-height: 34em;*/
+  /*float: left;*/
+  position: relative;
+  font-family: "andale mono", "lucida console", monospace;
+  margin-top: 45px;
+  margin-bottom: 45px;
+}
+
+#boutique-map-cesium {
+  display: block;
+  height: 20em;
+}
+
+#block-viewfullmap,
+#block-viewfullmapfr{
+  position:  relative;
+  left: 4%;
+  transform: translateY(175%);
+  height: 42px;
+  z-index: 2;
+  display: inline-flex;
+  background-image: url(/sites/quartierdix30/themes/quartierdix30/images/icons/icon_fullmap.svg);
+  background-size: 25px;
+  background-repeat: no-repeat;
+  background-position: 7px 6px;
+  padding: 5px 10px;
+  color: black;
+  border: 1px solid black;
+  background-color: transparent;
+  box-shadow: none;
+}
+
+#block-viewfullmap { width: 160px; }
+#block-viewfullmapfr { width: 200px; }
+
+#block-viewfullmapfr .field--name-body > p > a {
+	right: 0;
+	width: 180px;
+}
+
+@media all and (max-width: 767px) {
+  #block-viewfullmap, #block-viewfullmapfr {
+    transform: none;
+  }
+}
+
+#viewfullmap {
+  display: inline-block;
+  padding: 5px 10px;
+  color: black;
+  border: 1px solid black;
+  background-color: transparent;
+  box-shadow: none;
+}
+
+#viewfullmap:hover, #viewfullmap:focus,
+#block-viewfullmap:hover, #block-viewfullmap:focus,
+#block-viewfullmapfr:hover, #block-viewfullmapfr:focus {
+  background-color: #fcc300;
+}
+
+#block-viewfullmap .field--name-body > p > a,
+#block-viewfullmapfr .field--name-body > p > a,
+#block-viewfullmapfr .field--name-body > a {
+  position: relative;
+  top: -22px;
+  right: 11px;
+  display: block;
+  width: 160px!important;
+  height: 42px!important;
+  line-height: 2.75;
+  text-align: center;
+  padding-left: 25px;
+}
+
+#block-viewfullmapfr .field--name-body > a {
+  line-height: 4.75;
+}
+
+#block-viewfullmap .field--name-body > p > a:hover, #block-viewfullmap .field--name-body > p > a:focus,
+#block-viewfullmapfr .field--name-body > p > a:hover, #block-viewfullmapfr .field--name-body > p > a:focus,
+#block-viewfullmapfr .field--name-body > a:hover, #block-viewfullmapfr .field--name-body > a:focus {
+  background-color: transparent!important;
+}
+
+/*Fixing discrepancy between English and French*/
+
+.lang-fr #boutique-info {
+  margin-top: 40px;
+  padding: 30px 0 0 8%;
+  max-width: 360px;
+}
+
+@media all and (max-width: 767px) {
+  #boutique-info, .lang-fr #boutique-info {
+    margin-top: 0;
+    margin-bottom: 80px;
+  }
+
+  .lang-fr #boutique-info {
+    padding: 30px 4%;
+  }
+}
+
+.hours-day {
+  min-height: 8px;
+  padding-left: 15%;
+  padding-right: 15%;
+}
+
+.boutique-info-address,
+.boutique-info-phone,
+.boutique-info-website {
+  min-height: 2em;
+  padding-top: 1em;
+}
+
+.hours-day img.icon,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+  width: 18px;
+  height: 18px;
+  margin-top: -4px;
+  padding-right: 5px;
+  float: left;
+}
+
+.hours-day img.icon + span,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+  font-weight: 700;
+  float: left;
+}
+
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+  margin-bottom: -1em;
+}
+
+.boutique-info-phone img + span,
+.boutique-info-address img + span{
+  float: left;
+  padding-left: 5%;
+}
+
+.hours-day > span {
+  padding-left: 2%;
+  padding-right: 2%;
+}
+
+.hours-day > span:first-child {
+  float: left;
+}
+.hours-day > span:last-child {
+  float: right;
+}
+
+.cesium-widget-credits, .cesium-viewer-fullscreenContainer {
+  display: none!important;
+}
+
+.cesium-infoBox  {
+  width: 18em;
+  height: 15em!important;
+  position: absolute;
+  left: 0;
+  background: white;
+  text-align: center;
+  transform: translateY(58%);
+  box-shadow: none;
+  font-family: "andale mono", "lucida console", monospace;
+}
+
+.cesium-infoBox-title {
+  display: none;
+}
+
+.cesium-infoBox-iframe  {
+  width: 18em;
+  background: white;
+  height: 15em!important;
+  box-shadow: 0 0 10px 1px #000;
+}
+
+.cesium-infoBox-camera {
+  display: none!important;
+}
+
+.cesium-infoBox-description {
+  color: #001919;
+  text-align: center;
+  font-family: "andale mono", "lucida console", monospace;
+  min-height: 15em;
+  max-height: 25em;
+}
+
+.cesium-infoBox-description > div > div {
+  padding-bottom: 1em;
+}
+
+.cesium-infoBox-description a:link {
+  color: #000000;
+}
+
+.cesium-infoBox-description > div {
+
+}
+
+.cesium-infoBox-description h1 h2{
+  color: #000000;
+  text-align: center;
+  display: inline-block!important;
+}
+
+.cesium-infoBox-description #marker-img {
+  max-width: 2.5em;
+  content: url('../gfx/icon_mappointer-b.svg');
+  display: inline;
+  float: left;
+}
+
+
+.cesium-infoBox-description img {
+  height: 20%;
+}
+
+@media (min-width: 0px) and (max-width: 768px) {
+  #boutique-map-cesium {
+    height: 20em;
+  }
+
+  #block-nodemapblock {
+    width: 100%;
+
+
+    margin-left: 0;
+    margin-right: 0;
+
+    float: none;
+  }
+
+  #block-views-block-miscellaneous-galleries-boutique-information-block > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+    float: none;
+    width: 100%;
+  }
+
+  .boutique-info .store-hours > span {
+
+  }
+
+  #block-views-block-miscellaneous-galleries-boutique-information-block > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+    position: relative;
+    width: 350px;
+    left: calc(50% - 175px);
+    z-index: 1;
+    padding: 0;
+    margin: 0;
+  }
+
+  #block-viewfullmap {
+		margin-left: calc( 50% - 80px );
+    left: 0;
+	}
+
+  #block-viewfullmapfr {
+		margin-left: calc( 50% - 100px );
+    left: 0;
+  }
+}
+
+
+@media (min-width: 768px) and (max-width: 1600px) {
+  #boutique-map-cesium {
+    height: 26em;
+  }
+}

+ 343 - 0
qd30map/css/qd30minimapOLD.css

@@ -0,0 +1,343 @@
+#block-nodemapblock {
+  z-index: 1;
+  position: relative;
+  width: 55%;
+  float: left;
+  margin-left: 20px;
+}
+
+#block-views-block-miscellaneous-galleries-boutique-information-block > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery),
+#block-views-block-miscellaneous-galleries-block-2 > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+  position: absolute;
+  width: 440px;
+  left: calc(60% - 40px);
+  z-index: 1;
+  padding: 0;
+  margin: 0;
+}
+
+@media all and (max-width: 767px) {
+  body.lang-fr #block-views-block-miscellaneous-galleries-block-2 > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+    position: relative;
+    left: 50%;
+    margin-left: -180px;
+  }
+}
+
+#block-views-block-miscellaneous-galleries-events-promotions-gallery > .box.wide {
+  /*width: 75%!important;*/
+}
+
+#boutique-info-container {
+  border-top: none!important;
+  padding: 0!important;
+}
+
+#block-views-block-miscellaneous-galleries-boutique-information-block > div > .container-center {
+  /*z-index: 1;*/
+  padding: 0px 8%;
+}
+
+@media all and (max-width: 767px) {
+  #block-views-block-miscellaneous-galleries-boutique-information-block > div > .container-center {
+    padding: 0 4%;
+  }
+}
+
+#block-views-block-miscellaneous-galleries-boutique-information-block .container-center {
+}
+
+.cesium-selection-wrapper svg {
+  fill: #e5fffd;
+}
+
+#boutique-map, #boutique-info > hr {
+  display: none;
+  width: 0;
+}
+
+#boutique-info {
+  float: none;
+}
+
+#boutique-div {
+  width: 50%;
+  margin-left: 25%;
+  margin-bottom: 1.5%;
+  border-bottom: 1px solid #000000;
+}
+
+.boutique-map-hours {
+  font-family: Metric, sans-serif;
+}
+
+#app-container {
+  width: 100%;
+  display: block;
+  /*min-height: 34em;*/
+  /*float: left;*/
+  position: relative;
+  font-family: "andale mono", "lucida console", monospace;
+  margin-top: 45px;
+  margin-bottom: 45px;
+}
+
+#boutique-map-cesium {
+  display: block;
+  height: 20em;
+}
+
+#block-viewfullmap,
+#block-viewfullmapfr{
+  position:  relative;
+  /* top: 65px; */
+  left: 4%;
+  transform: translateY(175%);
+  width: 160px;
+  height: 42px;
+  z-index: 2;
+  display: inline-flex;
+  background-image: url(/sites/quartierdix30/themes/quartierdix30/images/icons/icon_fullmap.svg);
+  background-size: 25px;
+  background-repeat: no-repeat;
+  background-position: 7px 6px;
+  padding: 5px 10px;
+  color: black;
+  border: 1px solid black;
+  background-color: transparent;
+  box-shadow: none;
+}
+
+@media all and (max-width: 767px) {
+  #block-viewfullmap, #block-viewfullmapfr {
+    transform: none;
+  }
+}
+
+#viewfullmap {
+  display: inline-block;
+  padding: 5px 10px;
+  color: black;
+  border: 1px solid black;
+  background-color: transparent;
+  box-shadow: none;
+}
+
+#viewfullmap:hover, #viewfullmap:focus,
+#block-viewfullmap:hover, #block-viewfullmap:focus,
+#block-viewfullmapfr:hover, #block-viewfullmapfr:focus {
+  color: white;
+  background-color: black;
+}
+
+#block-viewfullmap .field--name-body > p > a,
+#block-viewfullmapfr .field--name-body > p > a,
+#block-viewfullmapfr .field--name-body > a {
+  position: relative;
+  top: -22px;
+  right: 11px;
+  display: block;
+  width: 160px!important;
+  height: 42px!important;
+  line-height: 2.75;
+  text-align: center;
+  padding-left: 25px;
+}
+
+#block-viewfullmapfr .field--name-body > a {
+  line-height: 4.75;
+}
+
+#block-viewfullmap .field--name-body > p > a:hover, #block-viewfullmap .field--name-body > p > a:focus,
+#block-viewfullmapfr .field--name-body > p > a:hover, #block-viewfullmapfr .field--name-body > p > a:focus,
+#block-viewfullmapfr .field--name-body > a:hover, #block-viewfullmapfr .field--name-body > a:focus {
+  background-color: transparent!important;
+}
+
+/*Fixing discrepancy between English and French*/
+
+.lang-fr #boutique-info {
+  margin-top: 60px;
+  padding: 30px 0 0 8%;
+  max-width: 360px;
+}
+
+@media all and (max-width: 767px) {
+  #boutique-info, .lang-fr #boutique-info {
+    margin-top: 0;
+    margin-bottom: 80px;
+  }
+
+  .lang-fr #boutique-info {
+    padding: 30px 4%;
+  }
+}
+
+.hours-day {
+  min-height: 8px;
+  padding-left: 15%;
+  padding-right: 15%;
+}
+
+.boutique-info-address,
+.boutique-info-phone,
+.boutique-info-website {
+  min-height: 2em;
+  padding-top: 1em;
+}
+
+.hours-day img.icon,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+  width: 18px;
+  height: 18px;
+  margin-top: -4px;
+  padding-right: 5px;
+  float: left;
+}
+
+.hours-day img.icon + span,
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+  font-weight: 700;
+  float: left;
+}
+
+.boutique-info-address img.icon,
+.boutique-info-phone img.icon {
+  margin-bottom: -1em;
+}
+
+.boutique-info-phone img + span,
+.boutique-info-address img + span{
+  float: left;
+  padding-left: 5%;
+}
+
+.hours-day > span {
+  padding-left: 2%;
+  padding-right: 2%;
+}
+
+.hours-day > span:first-child {
+  float: left;
+}
+.hours-day > span:last-child {
+  float: right;
+}
+
+.cesium-widget-credits, .cesium-viewer-fullscreenContainer {
+  display: none!important;
+}
+
+.cesium-infoBox  {
+  width: 18em;
+  height: 15em!important;
+  position: absolute;
+  left: 0;
+  background: white;
+  text-align: center;
+  transform: translateY(58%);
+  box-shadow: none;
+  font-family: "andale mono", "lucida console", monospace;
+}
+
+.cesium-infoBox-title {
+  display: none;
+}
+
+.cesium-infoBox-iframe  {
+  width: 18em;
+  background: white;
+  height: 15em!important;
+  box-shadow: 0 0 10px 1px #000;
+}
+
+.cesium-infoBox-camera {
+  display: none!important;
+}
+
+.cesium-infoBox-description {
+  color: #001919;
+  text-align: center;
+  font-family: "andale mono", "lucida console", monospace;
+  min-height: 15em;
+  max-height: 25em;
+}
+
+.cesium-infoBox-description > div > div {
+  padding-bottom: 1em;
+}
+
+.cesium-infoBox-description a:link {
+  color: #000000;
+}
+
+.cesium-infoBox-description > div {
+
+}
+
+.cesium-infoBox-description h1 h2{
+  color: #000000;
+  text-align: center;
+  display: inline-block!important;
+}
+
+.cesium-infoBox-description #marker-img {
+  max-width: 2.5em;
+  content: url('../gfx/icon_mappointer-b.svg');
+  display: inline;
+  float: left;
+}
+
+
+.cesium-infoBox-description img {
+  height: 20%;
+}
+
+@media (min-width: 0px) and (max-width: 768px) {
+  #boutique-map-cesium {
+    height: 20em;
+  }
+
+  #block-nodemapblock {
+    width: 100%;
+
+
+    margin-left: 0;
+    margin-right: 0;
+
+    float: none;
+  }
+
+  #block-views-block-miscellaneous-galleries-boutique-information-block > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+    float: none;
+    width: 100%;
+  }
+
+  .boutique-info .store-hours > span {
+
+  }
+
+  #block-views-block-miscellaneous-galleries-boutique-information-block > div:not(#block-views-block-miscellaneous-galleries-events-promotions-gallery):not(#block-views-block-miscellaneous-galleries-boutique-description-block):not(#block-views-block-miscellaneous-galleries-blog-gallery) {
+    position: relative;
+    width: 350px;
+    left: calc(50% - 175px);
+    z-index: 1;
+    padding: 0;
+    margin: 0;
+  }
+
+  #block-viewfullmap,
+  #block-viewfullmapfr {
+    margin-left: calc( 50% - 80px );
+    left: 0;
+  }
+}
+
+
+@media (min-width: 768px) and (max-width: 1600px) {
+  #boutique-map-cesium {
+    height: 26em;
+  }
+}

+ 8 - 0
qd30map/gfx/bg-grid.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="3px" height="3px" viewBox="3.5 3.5 3 3" enable-background="new 3.5 3.5 3 3" xml:space="preserve">
+<rect x="-2.75" y="-5.875" fill="#FFFFFF" width="14.25" height="23.312"/>
+<circle fill="#9C9D9F" cx="5.001" cy="4.917" r="0.936"/>
+</svg>

+ 34 - 0
qd30map/gfx/bg-grill.svg

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="201.3px" height="142.6px" viewBox="0 0 201.3 142.6" enable-background="new 0 0 201.3 142.6" xml:space="preserve">
+<g>
+	<path fill="#333333" d="M0,0l-18.4,142.6H-22L-3.4,0H0z"/>
+	<path fill="#333333" d="M8.8,0L-9.7,142.6h-3.6L5.4,0H8.8z"/>
+	<path fill="#333333" d="M17.5,0L-0.9,142.6h-3.6L14.1,0H17.5z"/>
+	<path fill="#333333" d="M26.3,0L7.8,142.6H4.3L22.9,0H26.3z"/>
+	<path fill="#333333" d="M35,0L16.6,142.6H13L31.6,0H35z"/>
+	<path fill="#333333" d="M43.8,0L25.3,142.6h-3.6L40.4,0H43.8z"/>
+	<path fill="#333333" d="M52.5,0L34.1,142.6h-3.6L49.1,0H52.5z"/>
+	<path fill="#333333" d="M61.3,0L42.9,142.6h-3.6L57.9,0H61.3z"/>
+	<path fill="#333333" d="M70,0L51.6,142.6H48L66.6,0H70z"/>
+	<path fill="#333333" d="M78.8,0L60.4,142.6h-3.6L75.4,0H78.8z"/>
+	<path fill="#333333" d="M87.5,0L69.1,142.6h-3.6L84.1,0H87.5z"/>
+	<path fill="#333333" d="M96.3,0L77.9,142.6h-3.6L92.9,0H96.3z"/>
+	<path fill="#333333" d="M105,0L86.6,142.6h-3.6L101.7,0H105z"/>
+	<path fill="#333333" d="M113.8,0L95.4,142.6h-3.6L110.4,0H113.8z"/>
+	<path fill="#333333" d="M122.5,0l-18.4,142.6h-3.6L119.2,0H122.5z"/>
+	<path fill="#333333" d="M131.3,0l-18.4,142.6h-3.6L127.9,0H131.3z"/>
+	<path fill="#333333" d="M140,0l-18.4,142.6h-3.6L136.7,0H140z"/>
+	<path fill="#333333" d="M148.8,0l-18.4,142.6h-3.6L145.4,0H148.8z"/>
+	<path fill="#333333" d="M157.6,0l-18.4,142.6h-3.6L154.2,0H157.6z"/>
+	<path fill="#333333" d="M166.3,0l-18.4,142.6h-3.6L162.9,0H166.3z"/>
+	<path fill="#333333" d="M175.1,0l-18.4,142.6h-3.6L171.7,0H175.1z"/>
+	<path fill="#333333" d="M183.8,0l-18.4,142.6h-3.6L180.4,0H183.8z"/>
+	<path fill="#333333" d="M192.6,0l-18.4,142.6h-3.6L189.2,0H192.6z"/>
+	<path fill="#333333" d="M201.3,0l-18.4,142.6h-3.6L197.9,0H201.3z"/>
+	<path fill="#333333" d="M210.1,0l-18.4,142.6h-3.6L206.7,0H210.1z"/>
+	<path fill="#333333" d="M218.8,0l-18.4,142.6h-3.6L215.4,0H218.8z"/>
+</g>
+</svg>

+ 38 - 0
qd30map/gfx/down.svg

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 31.479 31.479" style="enable-background:new 0 0 31.479 31.479;" xml:space="preserve">
+<path style="fill:#1E201D;" d="M26.485,21.206c0.429-0.444,0.429-1.143,0-1.587c-0.444-0.429-1.159-0.429-1.587,0l-8.047,8.047
+	V1.111C16.851,0.492,16.359,0,15.74,0c-0.619,0-1.127,0.492-1.127,1.111v26.555l-8.031-8.047c-0.444-0.429-1.143-0.429-1.587,0
+	c-0.429,0.444-0.429,1.143,0,1.587l9.952,9.952c0.429,0.429,1.143,0.429,1.587,0L26.485,21.206z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

BIN
qd30map/gfx/example-map.png


+ 59 - 0
qd30map/gfx/globe.svg

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 58 58" style="enable-background:new 0 0 58 58;" xml:space="preserve">
+<path d="M50.688,48.222C55.232,43.101,58,36.369,58,29c0-7.667-2.996-14.643-7.872-19.834c0,0,0-0.001,0-0.001
+	c-0.004-0.006-0.01-0.008-0.013-0.013c-5.079-5.399-12.195-8.855-20.11-9.126l-0.001-0.001L29.439,0.01C29.293,0.005,29.147,0,29,0
+	s-0.293,0.005-0.439,0.01l-0.563,0.015l-0.001,0.001c-7.915,0.271-15.031,3.727-20.11,9.126c-0.004,0.005-0.01,0.007-0.013,0.013
+	c0,0,0,0.001-0.001,0.002C2.996,14.357,0,21.333,0,29c0,7.369,2.768,14.101,7.312,19.222c0.006,0.009,0.006,0.019,0.013,0.028
+	c0.018,0.025,0.044,0.037,0.063,0.06c5.106,5.708,12.432,9.385,20.608,9.665l0.001,0.001l0.563,0.015C28.707,57.995,28.853,58,29,58
+	s0.293-0.005,0.439-0.01l0.563-0.015l0.001-0.001c8.185-0.281,15.519-3.965,20.625-9.685c0.013-0.017,0.034-0.022,0.046-0.04
+	C50.682,48.241,50.682,48.231,50.688,48.222z M2.025,30h12.003c0.113,4.239,0.941,8.358,2.415,12.217
+	c-2.844,1.029-5.563,2.409-8.111,4.131C4.585,41.891,2.253,36.21,2.025,30z M8.878,11.023c2.488,1.618,5.137,2.914,7.9,3.882
+	C15.086,19.012,14.15,23.44,14.028,28H2.025C2.264,21.493,4.812,15.568,8.878,11.023z M55.975,28H43.972
+	c-0.122-4.56-1.058-8.988-2.75-13.095c2.763-0.968,5.412-2.264,7.9-3.882C53.188,15.568,55.736,21.493,55.975,28z M28,14.963
+	c-2.891-0.082-5.729-0.513-8.471-1.283C21.556,9.522,24.418,5.769,28,2.644V14.963z M28,16.963V28H16.028
+	c0.123-4.348,1.035-8.565,2.666-12.475C21.7,16.396,24.821,16.878,28,16.963z M30,16.963c3.179-0.085,6.3-0.566,9.307-1.438
+	c1.631,3.91,2.543,8.127,2.666,12.475H30V16.963z M30,14.963V2.644c3.582,3.125,6.444,6.878,8.471,11.036
+	C35.729,14.45,32.891,14.881,30,14.963z M40.409,13.072c-1.921-4.025-4.587-7.692-7.888-10.835
+	c5.856,0.766,11.125,3.414,15.183,7.318C45.4,11.017,42.956,12.193,40.409,13.072z M17.591,13.072
+	c-2.547-0.879-4.991-2.055-7.294-3.517c4.057-3.904,9.327-6.552,15.183-7.318C22.178,5.38,19.512,9.047,17.591,13.072z M16.028,30
+	H28v10.038c-3.307,0.088-6.547,0.604-9.661,1.541C16.932,37.924,16.141,34.019,16.028,30z M28,42.038v13.318
+	c-3.834-3.345-6.84-7.409-8.884-11.917C21.983,42.594,24.961,42.124,28,42.038z M30,55.356V42.038
+	c3.039,0.085,6.017,0.556,8.884,1.4C36.84,47.947,33.834,52.011,30,55.356z M30,40.038V30h11.972
+	c-0.113,4.019-0.904,7.924-2.312,11.58C36.547,40.642,33.307,40.126,30,40.038z M43.972,30h12.003
+	c-0.228,6.21-2.559,11.891-6.307,16.348c-2.548-1.722-5.267-3.102-8.111-4.131C43.032,38.358,43.859,34.239,43.972,30z
+	 M9.691,47.846c2.366-1.572,4.885-2.836,7.517-3.781c1.945,4.36,4.737,8.333,8.271,11.698C19.328,54.958,13.823,52.078,9.691,47.846
+	z M32.521,55.763c3.534-3.364,6.326-7.337,8.271-11.698c2.632,0.945,5.15,2.209,7.517,3.781
+	C44.177,52.078,38.672,54.958,32.521,55.763z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 11 - 0
qd30map/gfx/icon_calendar-b.svg

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<g>
+	<path d="M99.403,133.05H9.595V10.15h122.9v89.808L99.403,133.05z M15.968,126.677h80.795l29.359-29.359V16.522H15.968V126.677z"/>
+	<rect x="12.326" y="13.792" width="116.527" height="37.325"/>
+	<polygon points="129.218,96.635 96.08,96.635 96.08,129.681 	"/>
+</g>
+</svg>

+ 12 - 0
qd30map/gfx/icon_calendar-w.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<g>
+	<path fill="#FFFFFF" d="M99.402,133.049H9.595V10.15h122.9v89.808L99.402,133.049z M15.968,126.676h80.796l29.358-29.358V16.522
+		H15.968V126.676z"/>
+	<rect x="12.326" y="13.792" fill="#FFFFFF" width="116.527" height="37.325"/>
+	<polygon fill="#FFFFFF" points="129.218,96.635 96.08,96.635 96.08,129.681 	"/>
+</g>
+</svg>

+ 40 - 0
qd30map/gfx/icon_car-b.svg

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+	 id="Layer_1" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100px" height="100px"
+	 viewBox="130 194 100 100" enable-background="new 130 194 100 100" xml:space="preserve">
+<g>
+	<path d="M179.977,210.067c-3.956,0.002-7.898,0.007-7.898,0.007l-9.719,0.142c-3.673-0.13-6.836,1.059-8.788,5.328l-7.056,17.637
+		c-5.135,1.416-7.368,5.148-7.486,8.208v23.108h6.771v7.775c-0.328,7.412,11.822,7.708,12.094-0.066l0.142-7.635h43.936l0.141,7.632
+		c0.272,7.775,12.422,7.479,12.093,0.067v-7.777h6.765v-23.106c-0.117-3.061-2.35-6.792-7.484-8.208l-7.057-17.637
+		c-1.951-4.27-5.107-5.459-8.781-5.329l-9.72-0.141c-0.031-0.008-3.996-0.009-7.952-0.007L179.977,210.067z M163.169,216.34
+		c0.308-0.001,0.623,0.007,0.951,0.02l31.87,0.102c2.917-0.068,4.155-0.006,5.395,2.752l5.08,13.685l-52.86-0.074l5.018-13.308
+		C159.405,216.852,161.018,216.353,163.169,216.34L163.169,216.34z M152.067,239.737c3.16,0,5.726,2.56,5.726,5.72
+		s-2.566,5.727-5.726,5.727c-3.161,0-5.72-2.566-5.72-5.727S148.907,239.737,152.067,239.737z M208.25,239.737
+		c3.161,0,5.727,2.56,5.727,5.72s-2.565,5.727-5.727,5.727c-3.16,0-5.719-2.566-5.719-5.727S205.09,239.737,208.25,239.737z"/>
+	<path d="M151.691,278.199c-1.864,0-3.583-0.68-4.716-1.864c-1.012-1.058-1.509-2.465-1.438-4.072v-7.502h-6.771V241.39
+		c0.113-2.941,2.161-6.888,7.553-8.426l7.007-17.517c1.719-3.758,4.421-5.503,8.51-5.503c0.176,0,0.354,0.003,0.532,0.009
+		l9.707-0.142c0.003,0,3.71-0.004,7.542-0.006l0.359-0.002l3.47-0.001c3.572,0,4.31,0.002,4.485,0.01v-0.002l9.72,0.142
+		c0.165-0.006,0.343-0.009,0.519-0.009c4.085,0,6.785,1.745,8.499,5.491l7.013,17.529c5.391,1.539,7.438,5.486,7.553,8.417v23.381
+		h-6.765v7.513c0.071,1.596-0.427,3.005-1.438,4.062c-1.135,1.185-2.854,1.863-4.717,1.863c-3.014,0-6.322-1.872-6.466-5.982
+		l-0.137-7.379h-43.418l-0.136,7.376C158.015,276.326,154.705,278.199,151.691,278.199z M139.293,264.234h6.772v8.039
+		c-0.065,1.473,0.381,2.746,1.292,3.696c1.034,1.082,2.614,1.701,4.335,1.701c2.769,0,5.808-1.712,5.939-5.474l0.146-7.889h44.453
+		l0.146,7.892c0.131,3.756,3.171,5.47,5.939,5.47c1.721,0,3.301-0.62,4.335-1.702c0.909-0.951,1.356-2.225,1.292-3.684v-8.053h6.765
+		v-22.844c-0.107-2.766-2.082-6.517-7.292-7.955l-0.127-0.034l-7.104-17.759c-1.612-3.525-4.16-5.172-8.015-5.172
+		c-0.17,0-0.341,0.003-0.514,0.009l-9.767-0.143c-0.143-0.003-0.953-0.006-4.443-0.006l-3.469,0.003
+		c-3.956,0.002-7.897,0.007-7.897,0.007l-9.716,0.141c-0.185-0.006-0.356-0.009-0.527-0.009c-3.858,0-6.408,1.647-8.025,5.184
+		l-7.099,17.748l-0.126,0.035c-5.211,1.436-7.186,5.188-7.293,7.964L139.293,264.234z M208.25,251.448
+		c-3.299,0-5.983-2.688-5.983-5.991c0-3.299,2.685-5.983,5.983-5.983c3.304,0,5.99,2.685,5.99,5.983
+		C214.24,248.76,211.554,251.448,208.25,251.448z M208.25,240.001c-3.009,0-5.455,2.447-5.455,5.456
+		c0,3.013,2.446,5.463,5.455,5.463c3.012,0,5.464-2.45,5.464-5.463C213.714,242.448,211.262,240.001,208.25,240.001z
+		 M152.067,251.448c-3.299,0-5.984-2.688-5.984-5.991c0-3.299,2.685-5.983,5.984-5.983c3.303,0,5.99,2.685,5.99,5.983
+		C158.057,248.76,155.37,251.448,152.067,251.448z M152.067,240.001c-3.009,0-5.457,2.447-5.457,5.456
+		c0,3.013,2.448,5.463,5.457,5.463c3.012,0,5.462-2.45,5.462-5.463C157.53,242.448,155.079,240.001,152.067,240.001z
+		 M206.844,233.163l-53.62-0.076l5.152-13.664c0.809-2.757,2.501-3.335,4.792-3.347h0.08c0.257,0,0.539,0.006,0.884,0.021
+		l31.859,0.101c0.345-0.008,0.673-0.014,0.979-0.014c2.356,0,3.524,0.406,4.657,2.922L206.844,233.163z M153.986,232.562
+		l52.099,0.073l-4.946-13.33c-1.057-2.347-2.083-2.594-4.169-2.594c-0.303,0-0.627,0.006-0.974,0.014l-31.877-0.101
+		c-0.348-0.015-0.622-0.021-0.872-0.021h-0.077l-0.001-0.264l0.001,0.264c-2.113,0.012-3.568,0.515-4.294,2.988L153.986,232.562z"/>
+</g>
+</svg>

+ 17 - 0
qd30map/gfx/icon_grill.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
+<g>
+	<path fill="#333333" d="M9.6-46.3L-8.8,96.3h-3.6L6.2-46.3H9.6z"/>
+	<path fill="#333333" d="M18.3-46.3L-0.1,96.3h-3.6L14.9-46.3H18.3z"/>
+	<path fill="#333333" d="M27.1-46.3L8.7,96.3H5.1L23.7-46.3H27.1z"/>
+	<path fill="#333333" d="M35.8-46.3L17.4,96.3h-3.6L32.4-46.3H35.8z"/>
+	<path fill="#333333" d="M44.6-46.3L26.2,96.3h-3.6L41.2-46.3H44.6z"/>
+	<path fill="#333333" d="M53.3-46.3L34.9,96.3h-3.6L50-46.3H53.3z"/>
+	<path fill="#333333" d="M62.1-46.3L43.7,96.3h-3.6L58.7-46.3H62.1z"/>
+	<path fill="#333333" d="M70.8-46.3L52.4,96.3h-3.6L67.5-46.3H70.8z"/>
+</g>
+<rect fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" width="50" height="50"/>
+</svg>

+ 8 - 0
qd30map/gfx/icon_home.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<polygon points="22.25,54.89 22.25,119.188 59.188,119.188 59.188,87.04 83.812,87.04 83.812,119.188 120.75,119.188 120.75,54.89 
+	132.822,54.89 112.864,42.828 112.861,25.58 94.532,25.58 94.533,31.748 71.5,17.827 10.178,54.89 "/>
+</svg>

+ 9 - 0
qd30map/gfx/icon_mappointer-b.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" d="M114,45.2
+	c0,23.6-42.7,95.6-42.7,95.6s-42.7-72-42.7-95.6c0-23.6,19.1-42.7,42.7-42.7C94.9,2.5,114,21.6,114,45.2z M71.3,28.6
+	c-10.3,0-18.6,8.3-18.6,18.6c0,10.3,8.3,18.6,18.6,18.6c10.3,0,18.6-8.3,18.6-18.6C89.8,36.9,81.5,28.6,71.3,28.6z"/>
+</svg>

+ 9 - 0
qd30map/gfx/icon_mappointer-grey_outlined.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#A4A6A8" stroke="#000000" stroke-width="2" stroke-miterlimit="10" d="
+	M114.3,45.2c0,23.6-42.7,95.6-42.7,95.6s-42.7-72-42.7-95.6C28.9,21.6,48,2.5,71.6,2.5C95.2,2.5,114.3,21.6,114.3,45.2z M71.6,28.6
+	C61.4,28.6,53,36.9,53,47.1c0,10.3,8.3,18.6,18.6,18.6c10.3,0,18.6-8.3,18.6-18.6C90.2,36.9,81.9,28.6,71.6,28.6z"/>
+</svg>

+ 9 - 0
qd30map/gfx/icon_mappointer-w.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M114.7,44.2c0,23.9-43.2,96.8-43.2,96.8S28.2,68.1,28.2,44.2
+	C28.2,20.4,47.6,1,71.5,1C95.3,1,114.7,20.4,114.7,44.2z M71.5,27.4c-10.4,0-18.8,8.4-18.8,18.8c0,10.4,8.4,18.8,18.8,18.8
+	c10.4,0,18.8-8.4,18.8-18.8C90.3,35.8,81.9,27.4,71.5,27.4z"/>
+</svg>

+ 9 - 0
qd30map/gfx/icon_mappointer-w_outlined.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" stroke="#000000" stroke-width="2" stroke-miterlimit="10" d="
+	M114.2,45c0,23.6-42.7,95.6-42.7,95.6S28.8,68.6,28.8,45c0-23.6,19.1-42.7,42.7-42.7C95.1,2.3,114.2,21.4,114.2,45z M71.5,28.4
+	c-10.3,0-18.6,8.3-18.6,18.6c0,10.3,8.3,18.6,18.6,18.6c10.3,0,18.6-8.3,18.6-18.6C90.1,36.7,81.8,28.4,71.5,28.4z"/>
+</svg>

+ 8 - 0
qd30map/gfx/icon_menuclose-greydk.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143px" viewBox="0 0 143 143" enable-background="new 0 0 143 143" xml:space="preserve">
+<line fill="none" stroke="#6D6F72" stroke-width="4" stroke-miterlimit="10" x1="8" y1="8.5" x2="134.7" y2="135.2"/>
+<line fill="none" stroke="#6D6F72" stroke-width="4" stroke-miterlimit="10" x1="8" y1="135.2" x2="134.7" y2="8.5"/>
+</svg>

+ 9 - 0
qd30map/gfx/icon_search-b.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<path d="M124.7,137c-2.5,0-5-1-6.8-2.9L81.7,96.9c-7.4,4.4-16.1,6.9-25.4,6.9c-27.5,0-49.9-22.4-49.9-49.9C6.4,26.4,28.8,4,56.3,4
+	c27.5,0,49.9,22.4,49.9,49.9c0,11.4-3.8,21.9-10.3,30.3l35.5,36.5c3.7,3.8,3.6,9.8-0.2,13.5C129.5,136.1,127.1,137,124.7,137z
+	 M56.3,23.1c-17,0-30.8,13.8-30.8,30.8c0,17,13.8,30.8,30.8,30.8c17,0,30.8-13.8,30.8-30.8C87.1,36.9,73.3,23.1,56.3,23.1z"/>
+</svg>

+ 10 - 0
qd30map/gfx/icon_search.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="143px" height="143.2px" viewBox="0 0 143 143.2" enable-background="new 0 0 143 143.2" xml:space="preserve">
+<path d="M123.2,137.3c-2.5,0-5-1-6.8-2.9L80.2,97.3c-7.4,4.4-16.1,6.9-25.4,6.9c-27.5,0-49.9-22.4-49.9-49.9
+	c0-27.5,22.4-49.9,49.9-49.9c27.5,0,49.9,22.4,49.9,49.9c0,11.4-3.8,21.9-10.3,30.3l35.5,36.5c3.7,3.8,3.6,9.8-0.2,13.5
+	C128,136.4,125.6,137.3,123.2,137.3z M54.8,23.4c-17,0-30.8,13.8-30.8,30.8s13.8,30.8,30.8,30.8c17,0,30.8-13.8,30.8-30.8
+	S71.8,23.4,54.8,23.4z"/>
+</svg>

+ 36 - 0
qd30map/gfx/in.svg

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 42 42" style="enable-background:new 0 0 42 42;" xml:space="preserve">
+<polygon points="42,20 22,20 22,0 20,0 20,20 0,20 0,22 20,22 20,42 22,42 22,22 42,22 "/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 38 - 0
qd30map/gfx/left.svg

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 31.494 31.494" style="enable-background:new 0 0 31.494 31.494;" xml:space="preserve">
+<path style="fill:#1E201D;" d="M10.273,5.009c0.444-0.444,1.143-0.444,1.587,0c0.429,0.429,0.429,1.143,0,1.571l-8.047,8.047h26.554
+	c0.619,0,1.127,0.492,1.127,1.111c0,0.619-0.508,1.127-1.127,1.127H3.813l8.047,8.032c0.429,0.444,0.429,1.159,0,1.587
+	c-0.444,0.444-1.143,0.444-1.587,0l-9.952-9.952c-0.429-0.429-0.429-1.143,0-1.571L10.273,5.009z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 20 - 0
qd30map/gfx/map-navigate.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="74px" height="49px" viewBox="0 0 74 49" enable-background="new 0 0 74 49" xml:space="preserve">
+<g>
+	<rect x="26" y="1" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="22" height="22"/>
+	<rect x="26" y="26" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="22" height="22"/>
+	<rect x="1" y="26" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="22" height="22"/>
+	<rect x="51" y="26" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="22" height="22"/>
+	<path stroke="#000000" stroke-miterlimit="10" d="M34.9,9.2c0.6-0.5,1-1,1.3-1.3s0.5-0.7,0.7-1.1h0.3c0.2,0.4,0.4,0.8,0.7,1.1
+		s0.7,0.8,1.3,1.3v0.5c-0.8-0.4-1.4-0.8-1.8-1.2v8.6h-0.6V8.5C36.3,8.8,36,9,35.9,9.2s-0.5,0.3-1,0.5V9.2z"/>
+	<path stroke="#000000" stroke-miterlimit="10" d="M8.9,34.9h0.4c-0.2,0.5-0.4,0.8-0.5,1s-0.3,0.5-0.6,0.8h9.3v0.6H8.2
+		c0.4,0.4,0.8,1,1.2,1.8H8.9c-0.5-0.6-0.9-1-1.3-1.3s-0.7-0.5-1.1-0.7v-0.3c0.3-0.1,0.7-0.4,1.1-0.7S8.4,35.5,8.9,34.9z"/>
+	<path stroke="#000000" stroke-miterlimit="10" d="M34.9,39.8v-0.4c0.5,0.2,0.8,0.4,1,0.5s0.5,0.3,0.8,0.6v-8.6h0.6v8.6
+		c0.4-0.4,1-0.8,1.8-1.2v0.5c-0.6,0.5-1,0.9-1.3,1.3s-0.5,0.7-0.7,1.1h-0.3c-0.1-0.3-0.4-0.7-0.7-1.1S35.5,40.3,34.9,39.8z"/>
+	<path stroke="#000000" stroke-miterlimit="10" d="M65.1,34.9c0.5,0.6,1,1,1.3,1.3s0.7,0.5,1.1,0.7v0.3c-0.4,0.2-0.8,0.4-1.1,0.7
+		s-0.8,0.7-1.3,1.3h-0.5c0.4-0.8,0.8-1.4,1.2-1.8h-9.3v-0.6h9.3c-0.3-0.4-0.5-0.7-0.6-0.8s-0.3-0.5-0.5-1H65.1z"/>
+</g>
+</svg>

+ 12 - 0
qd30map/gfx/map-zoom.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="24px" height="49px" viewBox="0 0 24 49" enable-background="new 0 0 24 49" xml:space="preserve">
+<g>
+	<rect x="1" y="1" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="22" height="22"/>
+	<rect x="1" y="26" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="22" height="22"/>
+	<path d="M12.6,8.1v3.3h3.3v1.2h-3.3v3.3h-1.2v-3.3H8.1v-1.2h3.2V8.1H12.6z"/>
+	<path d="M9.6,36.4h4.7v1.4H9.6V36.4z"/>
+</g>
+</svg>

BIN
qd30map/gfx/mapsearch.png


BIN
qd30map/gfx/markPin.png


BIN
qd30map/gfx/marker.png


+ 36 - 0
qd30map/gfx/out.svg

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 42 42" style="enable-background:new 0 0 42 42;" xml:space="preserve">
+<rect y="20" width="42" height="2"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 42 - 0
qd30map/gfx/reset.svg

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 30.143 30.143" style="enable-background:new 0 0 30.143 30.143;" xml:space="preserve">
+<g>
+	<path style="fill:#030104;" d="M20.034,2.357v3.824c3.482,1.798,5.869,5.427,5.869,9.619c0,5.98-4.848,10.83-10.828,10.83
+		c-5.982,0-10.832-4.85-10.832-10.83c0-3.844,2.012-7.215,5.029-9.136V2.689C4.245,4.918,0.731,9.945,0.731,15.801
+		c0,7.921,6.42,14.342,14.34,14.342c7.924,0,14.342-6.421,14.342-14.342C29.412,9.624,25.501,4.379,20.034,2.357z"/>
+	<path style="fill:#030104;" d="M14.795,17.652c1.576,0,1.736-0.931,1.736-2.076V2.08c0-1.148-0.16-2.08-1.736-2.08
+		c-1.57,0-1.732,0.932-1.732,2.08v13.496C13.062,16.722,13.225,17.652,14.795,17.652z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 38 - 0
qd30map/gfx/right.svg

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 31.49 31.49" style="enable-background:new 0 0 31.49 31.49;" xml:space="preserve">
+<path style="fill:#1E201D;" d="M21.205,5.007c-0.429-0.444-1.143-0.444-1.587,0c-0.429,0.429-0.429,1.143,0,1.571l8.047,8.047H1.111
+	C0.492,14.626,0,15.118,0,15.737c0,0.619,0.492,1.127,1.111,1.127h26.554l-8.047,8.032c-0.429,0.444-0.429,1.159,0,1.587
+	c0.444,0.444,1.159,0.444,1.587,0l9.952-9.952c0.444-0.429,0.444-1.143,0-1.571L21.205,5.007z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 38 - 0
qd30map/gfx/up.svg

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 31.479 31.479" style="enable-background:new 0 0 31.479 31.479;" xml:space="preserve">
+<path style="fill:#1E201D;" d="M26.477,10.274c0.444,0.444,0.444,1.143,0,1.587c-0.429,0.429-1.143,0.429-1.571,0l-8.047-8.047
+	v26.555c0,0.619-0.492,1.111-1.111,1.111c-0.619,0-1.127-0.492-1.127-1.111V3.813l-8.031,8.047c-0.444,0.429-1.159,0.429-1.587,0
+	c-0.444-0.444-0.444-1.143,0-1.587l9.952-9.952c0.429-0.429,1.143-0.429,1.571,0L26.477,10.274z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json


ファイルの差分が大きいため隠しています
+ 0 - 0
qd30map/js/cesium/Build/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg


BIN
qd30map/js/cesium/Build/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません