Advertisement
Guest User

cgmp.framework.js

a guest
Mar 28th, 2012
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Copyright (C) 2011 - 2012 Alexander Zagniotov
  3.  
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU General Public License for more details.
  13.  
  14. You should have received a copy of the GNU General Public License
  15. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. */
  17.  
  18. //http://stackoverflow.com/questions/4845762/onload-handler-for-script-tag-in-internet-explorer
  19.     (function () {
  20.         if (typeof jQuery === "undefined" || jQuery == null ) {
  21.             var done = false;
  22.             var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
  23.             var script = document.createElement('script');
  24.             script.type= 'text/javascript';
  25.             script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js";
  26.  
  27.             script.onload = script.onreadystatechange = function() {
  28.                 if ( !done && (!this.readyState || /loaded|complete/.test( script.readyState ))) {
  29.                     done = true;
  30.  
  31.                     var jQueryObj = jQuery.noConflict();
  32.                     jQueryLoadCallback(jQueryObj);
  33.                     // Handle memory leak in IE
  34.                     script.onload = script.onreadystatechange = null;
  35.                     if ( head && script.parentNode ) {
  36.                         head.removeChild( script );
  37.                     }
  38.                     script = undefined;
  39.                 }
  40.             };
  41.             // Use insertBefore instead of appendChild  to circumvent an IE6 bug - die IE6, just die! A.Z.
  42.             // head.insertBefore( script, head.firstChild );
  43.             head.appendChild(script);
  44.         } else {
  45.             jQueryLoadCallback();
  46.         }
  47.  
  48.         function jQueryLoadCallback() {
  49.             var jQueryObj = (typeof arguments[0] === "undefined" || arguments[0] == null || !arguments[0]) ? jQuery : arguments[0];
  50.  
  51.             (function ($) {
  52.  
  53.                 var parseJson = function(jsonString) { Logger.fatal("Using parseJson stub.."); }
  54.                 var version = parseFloat($.fn.jquery);
  55.                 if (version >= 1.4) {
  56.                     parseJson = $.parseJSON;
  57.                 } else if (window.JSON && window.JSON.parse) {
  58.                     parseJson =  window.JSON.parse;
  59.                 }
  60.  
  61.                 var CGMPGlobal = {};
  62.                 var GoogleMapOrchestrator = (function() {
  63.  
  64.                     var builder = {};
  65.                     var googleMap = {};
  66.                     var initMap = function initMap(map, bubbleAutoPan, zoom, mapType)  {
  67.                         googleMap = map;
  68.  
  69.                         var mapTypeIds = [];
  70.                         for(var type in google.maps.MapTypeId) {
  71.                             mapTypeIds.push(google.maps.MapTypeId[type]);
  72.                         }
  73.  
  74.                         if (mapType == "OSM") {
  75.                             mapTypeIds.push(mapType);
  76.                             googleMap.mapTypes.set(mapType, new google.maps.ImageMapType({
  77.                                 getTileUrl: function(coord, zoom) {
  78.                                     return "http://tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png";
  79.                                 },
  80.                                 tileSize: new google.maps.Size(256, 256),
  81.                                 name: "OpenStreet",
  82.                                 maxZoom: 20
  83.                             }));
  84.                         } else if (mapType == "roadmap".toUpperCase()) {
  85.                             mapType = google.maps.MapTypeId.ROADMAP;
  86.                         } else if (mapType == "satellite".toUpperCase()) {
  87.                             mapType = google.maps.MapTypeId.SATELLITE;
  88.                         } else if (mapType == "hybrid".toUpperCase()) {
  89.                             mapType = google.maps.MapTypeId.HYBRID;
  90.                         } else if (mapType == "terrain".toUpperCase()) {
  91.                             mapType = google.maps.MapTypeId.TERRAIN;
  92.                         }
  93.  
  94.                         googleMap.setOptions({
  95.                             zoom: zoom,
  96.                             mapTypeId: mapType,
  97.                             mapTypeControlOptions: {mapTypeIds: mapTypeIds}
  98.                         });
  99.                     }
  100.  
  101.                     var setMapControls = function setMapControls(mapControlOptions) {
  102.                         googleMap.setOptions(mapControlOptions);
  103.                     }
  104.  
  105.                     return {
  106.                         initMap: initMap,
  107.                         setMapControls: setMapControls
  108.                     }
  109.                 })();
  110.  
  111.  
  112.                 var LayerBuilder = (function() {
  113.  
  114.                     var googleMap = {};
  115.  
  116.                     var init = function init(map) {
  117.                         googleMap = map;
  118.                     }
  119.  
  120.                     var buildTrafficLayer = function buildTrafficLayer() {
  121.                         var trafficLayer = new google.maps.TrafficLayer();
  122.                         trafficLayer.setMap(googleMap);
  123.                     }
  124.  
  125.                     var buildBikeLayer = function buildBikeLayer() {
  126.                         var bikeLayer = new google.maps.BicyclingLayer();
  127.                         bikeLayer.setMap(googleMap);
  128.                     }
  129.  
  130.                     var buildPanoramioLayer = function buildPanoramioLayer(userId) {
  131.                         if (typeof google.maps.panoramio == "undefined" || !google.maps.panoramio || google.maps.panoramio == null ) {
  132.                             Logger.error("We cannot access Panoramio library. Aborting..");
  133.                             return false;
  134.                         }
  135.                         var panoramioLayer = new google.maps.panoramio.PanoramioLayer();
  136.                         if (panoramioLayer) {
  137.                             if (userId != null && userId != "") {
  138.                                 panoramioLayer.setUserId(userId);
  139.                             }
  140.                             panoramioLayer.setMap(googleMap);
  141.                         } else {
  142.                             Logger.error("Could not instantiate Panoramio object. Aborting..");
  143.                         }
  144.                     }
  145.  
  146.                     var buildKmlLayer = function buildKmlLayer(url) {
  147.                         if (url.toLowerCase().indexOf("http") < 0) {
  148.                             Logger.error("KML URL must start with HTTP(S). Aborting..");
  149.                             return false;
  150.                         }
  151.  
  152.                         var kmlLayer = new google.maps.KmlLayer(url);
  153.                         google.maps.event.addListener(kmlLayer, "status_changed", function() {
  154.                             kmlLayerStatusEventCallback(kmlLayer);
  155.                         });
  156.                         kmlLayer.setMap(googleMap);
  157.                     }
  158.  
  159.                     function kmlLayerStatusEventCallback(kmlLayer)  {
  160.                             var kmlStatus = kmlLayer.getStatus();
  161.                             if (kmlStatus == google.maps.KmlLayerStatus.OK) {
  162.                                 //Hmmm...
  163.                             } else {
  164.                                 var msg = '';
  165.                                 switch(kmlStatus) {
  166.  
  167.                                         case google.maps.KmlLayerStatus.DOCUMENT_NOT_FOUND:
  168.                                             msg = CGMPGlobal.errors.kmlNotFound;
  169.                                         break;
  170.                                         case google.maps.KmlLayerStatus.DOCUMENT_TOO_LARGE:
  171.                                             msg = CGMPGlobal.errors.kmlTooLarge;
  172.                                         break;
  173.                                         case google.maps.KmlLayerStatus.FETCH_ERROR:
  174.                                             msg = CGMPGlobal.errors.kmlFetchError;
  175.                                         break;
  176.                                         case google.maps.KmlLayerStatus.INVALID_DOCUMENT:
  177.                                             msg = CGMPGlobal.errors.kmlDocInvalid;
  178.                                         break;
  179.                                         case google.maps.KmlLayerStatus.INVALID_REQUEST:
  180.                                             msg = CGMPGlobal.errors.kmlRequestInvalid;
  181.                                         break;
  182.                                         case google.maps.KmlLayerStatus.LIMITS_EXCEEDED:
  183.                                             msg = CGMPGlobal.errors.kmlLimits;
  184.                                         break;
  185.                                         case google.maps.KmlLayerStatus.TIMED_OUT:
  186.                                             msg = CGMPGlobal.errors.kmlTimedOut;
  187.                                         break;
  188.                                         case google.maps.KmlLayerStatus.UNKNOWN:
  189.                                             msg = CGMPGlobal.errors.kmlUnknown;
  190.                                         break;
  191.                                     }
  192.                             if (msg != '') {
  193.                                 var error = CGMPGlobal.errors.kml.replace("[MSG]", msg);
  194.                                 error = error.replace("[STATUS]", kmlStatus);
  195.                                 Errors.alertError(error);
  196.                                 Logger.error("Google returned KML error: " + msg + " (" + kmlStatus + ")");
  197.                                 Logger.error("KML file: " + kmlLayer.getUrl());
  198.                             }
  199.                         }
  200.                     }
  201.  
  202.                     return {
  203.                         init: init,
  204.                         buildKmlLayer: buildKmlLayer,
  205.                         buildTrafficLayer: buildTrafficLayer,
  206.                         buildBikeLayer: buildBikeLayer,
  207.                         buildPanoramioLayer: buildPanoramioLayer
  208.                     }
  209.                 })();
  210.  
  211.  
  212.  
  213.                
  214.                 var MarkerBuilder = function () {
  215.  
  216.                     var markers, storedAddresses, badAddresses, wasBuildAddressMarkersCalled, timeout, directionControlsBinded,
  217.                     googleMap, csvString, bubbleAutoPan, originalExtendedBounds, originalMapCenter, updatedZoom, mapDivId,
  218.                     geocoder, bounds, infowindow, streetViewService, directionsRenderer, directionsService;
  219.  
  220.                     var init = function init(map, autoPan) {
  221.  
  222.                         googleMap = map;
  223.                         mapDivId = googleMap.getDiv().id;
  224.                         bubbleAutoPan = autoPan;
  225.  
  226.                         google.maps.event.addListener(googleMap, 'click', function () {
  227.                             resetMap();
  228.                         });
  229.  
  230.                         markers = [];
  231.                         badAddresses = [];
  232.                         storedAddresses = [];
  233.  
  234.                         updatedZoom = 5;
  235.  
  236.                         timeout = null;
  237.                         csvString = null;
  238.                         originalMapCenter = null;
  239.                         originalExtendedBounds = null;
  240.  
  241.                         directionControlsBinded = false;
  242.                         wasBuildAddressMarkersCalled = false;
  243.  
  244.                         geocoder = new google.maps.Geocoder();
  245.                         bounds = new google.maps.LatLngBounds();
  246.                         infowindow = new google.maps.InfoWindow();
  247.                         streetViewService = new google.maps.StreetViewService();
  248.  
  249.                         directionsService = new google.maps.DirectionsService();
  250.  
  251.                         rendererOptions = {
  252.                             draggable: true
  253.                         };
  254.                         directionsRenderer = new google.maps.DirectionsRenderer(rendererOptions);
  255.                         directionsRenderer.setPanel(document.getElementById('rendered-directions-placeholder-' + mapDivId));
  256.                     }
  257.  
  258.                     var isBuildAddressMarkersCalled = function isBuildAddressMarkersCalled() {
  259.                         return wasBuildAddressMarkersCalled;
  260.                     }
  261.  
  262.                     var buildAddressMarkers = function buildAddressMarkers(markerLocations, isGeoMashap, isBubbleContainsPostLink) {
  263.  
  264.                         wasBuildAddressMarkersCalled = true;
  265.                         csvString = Utils.trim(markerLocations);
  266.                         csvString = Utils.searchReplace(csvString, "'", "");
  267.  
  268.                         if (isGeoMashap === "true") {
  269.                             var json = parseJson(csvString);
  270.  
  271.                             if (isBubbleContainsPostLink === "true") {
  272.                                 parseJsonStructure(json, true);
  273.                             } else if (isBubbleContainsPostLink === "false") {
  274.                                 parseJsonStructure(json, false);
  275.                             }
  276.                             queryGeocoderService();
  277.  
  278.                         } else if (isGeoMashap == null || isGeoMashap === "false") {
  279.                             parseCsv();
  280.                             queryGeocoderService();
  281.                         }
  282.                     }
  283.  
  284.  
  285.                     function resetMap()  {
  286.                         if (originalExtendedBounds != null) {
  287.                             if (googleMap.getCenter() != originalExtendedBounds.getCenter()) {
  288.                                 Logger.info("Panning map back to its original bounds center: " + originalExtendedBounds.getCenter());
  289.                                 googleMap.fitBounds(originalExtendedBounds);
  290.                                 googleMap.setCenter(originalExtendedBounds.getCenter());
  291.                             }
  292.                         } else  if (originalMapCenter != null) {
  293.                             Logger.info("Panning map back to its original center: " + originalMapCenter  + " and updated zoom: " + updatedZoom);
  294.                             googleMap.setCenter(originalMapCenter);
  295.                             googleMap.setZoom(updatedZoom);
  296.                         }
  297.                     }
  298.  
  299.                     function resetDirectionAddressFields(dirDivId)  {
  300.                         $(dirDivId + ' input#a_address').val('');
  301.                         $(dirDivId + ' input#b_address').val('');
  302.                         $(dirDivId + ' input#a_address').removeClass('d_error');
  303.                         $(dirDivId + ' input#b_address').removeClass('d_error');
  304.                     }
  305.  
  306.                     function attachEventlistener(marker, markersElement) {
  307.  
  308.                         var localBubbleData = buildBubble(marker.content, markersElement);
  309.                         var dirDivId = 'div#direction-controls-placeholder-' + mapDivId;
  310.                         var targetDiv = $("div#rendered-directions-placeholder-" + mapDivId);
  311.  
  312.                         google.maps.event.addListener(marker, 'click', function () {
  313.  
  314.                             resetDirectionAddressFields(dirDivId);
  315.  
  316.                             $(dirDivId).fadeOut();
  317.                             directionsRenderer.setMap(null);
  318.                             targetDiv.html("");
  319.                             targetDiv.hide();
  320.                             $(dirDivId + ' button#print_sub').hide();
  321.  
  322.                             infowindow.setContent(localBubbleData.bubbleContent);
  323.                             infowindow.setOptions({disableAutoPan: bubbleAutoPan == "true" ? false : true });
  324.                             infowindow.open(googleMap, this);
  325.                         });
  326.  
  327.                         validateMarkerStreetViewExists(marker, localBubbleData, dirDivId);
  328.                         //attachEventstoDirectionControls(marker, localBubbleData, dirDivId, targetDiv);
  329.                     }
  330.  
  331.                     function attachEventstoDirectionControls(marker, localBubbleData, dirDivId, targetDiv)  {
  332.  
  333.                         var parentInfoBubble = 'div#bubble-' + localBubbleData.bubbleHolderId;
  334.                         var addy = marker.content;
  335.  
  336.                         addy = addy.replace("Lat/Long: ", "");
  337.  
  338.                         $(parentInfoBubble + ' a.dirToHereTrigger').live("click", function() {
  339.                             var thisId = this.id;
  340.                             if (thisId == 'toHere-' + localBubbleData.bubbleHolderId) {
  341.                                 $(dirDivId).fadeIn();
  342.                                 $(dirDivId + ' input#a_address').val('');
  343.                                 $(dirDivId + ' input#b_address').val(addy);
  344.                                 $(dirDivId + ' input#radio_miles').attr("checked", "checked");
  345.                             }
  346.                         });
  347.  
  348.                         $(parentInfoBubble + ' a.dirFromHereTrigger').live("click", function() {
  349.                             var thisId = this.id;
  350.                             if (thisId == 'fromHere-' + localBubbleData.bubbleHolderId) {
  351.                                 $(dirDivId).fadeIn();
  352.                                 $(dirDivId + ' input#a_address').val(addy);
  353.                                 $(dirDivId + ' input#b_address').val('');
  354.                                 $(dirDivId + ' input#radio_miles').attr("checked", "checked");
  355.                             }
  356.                         });
  357.  
  358.                         $(dirDivId + ' div.d_close-wrapper').live("click", function(event) {
  359.  
  360.                                 resetDirectionAddressFields(dirDivId);
  361.  
  362.                                 $(this).parent().fadeOut();
  363.                                 directionsRenderer.setMap(null);
  364.                                 targetDiv.html("");
  365.                                 targetDiv.hide();
  366.                                 $(dirDivId + ' button#print_sub').hide();
  367.                                 resetMap();
  368.  
  369.                                 return false;
  370.                         });
  371.                     }
  372.  
  373.                     function validateMarkerStreetViewExists(marker, localBubbleData, dirDivId)  {
  374.  
  375.                         streetViewService.getPanoramaByLocation(marker.position, 50, function (streetViewPanoramaData, status) {
  376.                             if (status === google.maps.StreetViewStatus.OK) {
  377.                                 // ok
  378.                                     $('a#trigger-' + localBubbleData.bubbleHolderId).live("click", function() {
  379.  
  380.                                         var panoramaOptions = {
  381.                                                 navigationControl: true,
  382.                                                 enableCloseButton: true,
  383.                                                 addressControl: false,
  384.                                                 linksControl: true,
  385.                                                 scrollwheel: false,
  386.                                                 addressControlOptions: {
  387.                                                     position: google.maps.ControlPosition.BOTTOM
  388.                                                 },
  389.                                                 position: marker.position,
  390.                                                 pov: {
  391.                                                     heading: 165,
  392.                                                     pitch:0,
  393.                                                     zoom:1
  394.                                                 }
  395.                                         }; 
  396.  
  397.                                         var pano = new google.maps.StreetViewPanorama(document.getElementById("bubble-" + localBubbleData.bubbleHolderId), panoramaOptions);
  398.                                         pano.setVisible(true);
  399.  
  400.                                         google.maps.event.addListener(infowindow, 'closeclick', function() {
  401.  
  402.                                             resetDirectionAddressFields(dirDivId);
  403.                                             $(dirDivId).fadeOut();
  404.  
  405.                                             if (pano != null) {
  406.                                                 pano.unbind("position");
  407.                                                 pano.setVisible(false);
  408.                                             }
  409.  
  410.                                             pano = null;
  411.                                         });
  412.  
  413.                                         google.maps.event.addListener(pano, 'closeclick', function() {
  414.                                             if (pano != null) {
  415.                                                 pano.unbind("position");
  416.                                                 pano.setVisible(false);
  417.                                                 $('div#bubble-' + localBubbleData.bubbleHolderId).css("background", "none");
  418.                                             }
  419.  
  420.                                             pano = null;
  421.                                         });
  422.  
  423.                                 });
  424.                             } else {
  425.                                 // no street view available in this range, or some error occurred
  426.                                 //Logger.warn("There is not street view available for this marker location: " + marker.position + " status: " + status);
  427.                                 $('a#trigger-' + localBubbleData.bubbleHolderId).live("click", function(e) {
  428.                                     e.preventDefault();
  429.                                 });
  430.                                 $('a#trigger-' + localBubbleData.bubbleHolderId).attr("style", "text-decoration: none !important; color: #ddd !important");
  431.  
  432.                                 google.maps.event.addListener(infowindow, 'domready', function () {
  433.                                     $('a#trigger-' + localBubbleData.bubbleHolderId).removeAttr("href");
  434.                                     $('a#trigger-' + localBubbleData.bubbleHolderId).attr("style", "text-decoration: none !important; color: #ddd !important");
  435.                                 });
  436.                             }
  437.                         });
  438.                     }
  439.  
  440.  
  441.                     function bindDirectionControlsToEvents()  {
  442.  
  443.                         var dirDivId = 'div#direction-controls-placeholder-' + mapDivId;
  444.                         var targetDiv = $("div#rendered-directions-placeholder-" + mapDivId);
  445.  
  446.                         $(dirDivId + ' a#reverse-btn').live("click", function(e) {
  447.  
  448.                                 var old_a_addr = $(dirDivId + ' input#a_address').val();
  449.                                 var old_b_addr = $(dirDivId + ' input#b_address').val();
  450.  
  451.                                 $(dirDivId + ' input#a_address').val(old_b_addr);
  452.                                 $(dirDivId + ' input#b_address').val(old_a_addr);
  453.                                 return false;
  454.                         });
  455.  
  456.                         $(dirDivId + ' a#d_options_show').live("click", function() {
  457.                                 $(dirDivId + ' a#d_options_hide').show();
  458.                                 $(dirDivId + ' a#d_options_show').hide();
  459.                                 $(dirDivId + ' div#d_options').show();
  460.                                 return false;
  461.                         });
  462.  
  463.                         $(dirDivId + ' a#d_options_hide').live("click", function() {
  464.                                 $(dirDivId + ' a#d_options_hide').hide();
  465.                                 $(dirDivId + ' a#d_options_show').show();
  466.                                 $(dirDivId + ' div#d_options').hide();
  467.                                 $(dirDivId + ' input#avoid_hway').removeAttr("checked");
  468.                                 $(dirDivId + ' input#avoid_tolls').removeAttr("checked");
  469.                                 $(dirDivId + ' input#radio_km').removeAttr("checked");
  470.                                 $(dirDivId + ' input#radio_miles').attr("checked", "checked");
  471.                                 return false;
  472.                         });
  473.                
  474.                         $(dirDivId + ' button#d_sub').live("click", function() {
  475.                                 var old_a_addr = $(dirDivId + ' input#a_address').val();
  476.                                 var old_b_addr = $(dirDivId + ' input#b_address').val();
  477.                                 var halt = false;
  478.                                 if (old_a_addr == null || old_a_addr == '') {
  479.                                     $(dirDivId + ' input#a_address').addClass('d_error');
  480.                                     halt = true;
  481.                                 }
  482.                    
  483.                                 if (old_b_addr == null || old_b_addr == '') {
  484.                                     $(dirDivId + ' input#b_address').addClass('d_error');
  485.                                     halt = true;
  486.                                 }
  487.  
  488.                                 if (!halt) {
  489.  
  490.                                     $(dirDivId + ' button#d_sub').attr('disabled', 'disabled').html("Please wait..");
  491.                                     // Query direction service
  492.                                     var travelMode = google.maps.DirectionsTravelMode.DRIVING;
  493.                                     if ($(dirDivId + ' a#dir_w_btn').hasClass('selected')) {
  494.                                         travelMode = google.maps.DirectionsTravelMode.WALKING;
  495.                                     }
  496.  
  497.                                     var is_avoid_hway = $(dirDivId + ' input#avoid_hway').is(":checked");
  498.                                     var is_avoid_tolls = $(dirDivId + ' input#avoid_tolls').is(":checked");
  499.                                     var is_miles = $(dirDivId + ' input#radio_miles').is(":checked");
  500.                                     var unitSystem = google.maps.DirectionsUnitSystem.METRIC;
  501.  
  502.                                     var request = {
  503.                                         origin: old_a_addr,
  504.                                         destination: old_b_addr,
  505.                                         travelMode: travelMode,
  506.                                         provideRouteAlternatives: true
  507.                                     };
  508.  
  509.                                     if (is_avoid_hway) {
  510.                                         request.avoidHighways = true;
  511.                                     }
  512.  
  513.                                     if (is_avoid_tolls) {
  514.                                         request.avoidTolls = true;
  515.                                     }
  516.  
  517.                                     if (is_miles) {
  518.                                         request.unitSystem = google.maps.DirectionsUnitSystem.IMPERIAL;
  519.                                     } else {
  520.                                         request.unitSystem = google.maps.DirectionsUnitSystem.METRIC;
  521.                                     }
  522.  
  523.                                     directionsService.route(request, function(response, status) {
  524.  
  525.                                         if (status == google.maps.DirectionsStatus.OK) {
  526.                                             targetDiv.html("");
  527.                                             targetDiv.show();
  528.                                             directionsRenderer.setMap(googleMap);
  529.                                             directionsRenderer.setDirections(response);
  530.                                             $(dirDivId + ' button#d_sub').removeAttr('disabled').html("Get directions");
  531.                                             $(dirDivId + ' button#print_sub').fadeIn();
  532.                                             infowindow.close();
  533.  
  534.                                         } else {
  535.                                             Logger.error('Could not route directions from "' + old_a_addr + '" to "' + old_b_addr + '", got result from Google: ' + status);
  536.                                             targetDiv.html("<span style='font-size: 12px; font-weight: bold; color: red'>Could not route directions from<br />'" + old_a_addr + "' to<br />'" + old_b_addr + "'<br />Got result from Google: [" + status + "]</span>");
  537.  
  538.                                             $(dirDivId + ' button#print_sub').hide();
  539.                                             $(dirDivId + ' button#d_sub').removeAttr('disabled').html("Get directions");
  540.                                         }
  541.                                     });
  542.                                 }
  543.                         });
  544.  
  545.                         $(dirDivId + ' button#print_sub').live("click", function() {
  546.                             var old_a_addr = $(dirDivId + ' input#a_address').val();
  547.                             var old_b_addr = $(dirDivId + ' input#b_address').val();
  548.  
  549.                             var dirflag = "d";
  550.                             if ($(dirDivId + ' a#dir_w_btn').hasClass('selected')) {
  551.                                 dirflag = "w";
  552.                             }
  553.  
  554.                             var url = "http://maps.google.com/?saddr=" + old_a_addr + "&daddr=" + old_b_addr + "&dirflg=" + dirflag + "&pw=2";
  555.                             var is_miles = $(dirDivId + ' input#radio_miles').is(":checked");
  556.                             if (is_miles) {
  557.                                 url += "&doflg=ptm";
  558.                             }
  559.  
  560.                             window.open( url );
  561.                             return false;
  562.                         });
  563.  
  564.                         $(dirDivId + ' input#a_address').live("change focus", function() {
  565.                             $(dirDivId + ' input#a_address').removeClass('d_error');
  566.                             return false;
  567.                         });
  568.  
  569.                         $(dirDivId + ' input#b_address').live("change focus", function() {
  570.                             $(dirDivId + ' input#b_address').removeClass('d_error');
  571.                             return false;
  572.                         });
  573.  
  574.  
  575.                         $(dirDivId + ' .kd-button').live("click", function() {
  576.                             var thisId = this.id;
  577.  
  578.                             if (thisId == 'dir_d_btn') {
  579.                                 if ($(dirDivId + ' a#dir_d_btn').hasClass('selected')) {
  580.                                     Logger.warn("Driving travel mode is already selected");
  581.                                 } else {
  582.                                     $(dirDivId + ' a#dir_d_btn').addClass('selected');
  583.                                     $(dirDivId + ' a#dir_w_btn').removeClass('selected');
  584.                                 }
  585.                             } else  if (thisId == 'dir_w_btn') {
  586.                                 if ($(dirDivId + ' a#dir_w_btn').hasClass('selected')) {
  587.                                     Logger.warn("Walking travel mode is already selected");
  588.                                 } else {
  589.                                     $(dirDivId + ' a#dir_w_btn').addClass('selected');
  590.                                     $(dirDivId + ' a#dir_d_btn').removeClass('selected');
  591.                                 }
  592.                             }
  593.  
  594.                             return false;
  595.                         });
  596.  
  597.                     }
  598.  
  599.                     function buildBubble(contentFromMarker, markersElement) {
  600.  
  601.                         var localBubbleData = [];
  602.                         var randomNumber = Math.floor(Math.random() * 111111);
  603.  
  604.                         randomNumber = randomNumber + "-" + mapDivId;
  605.  
  606.                         var bubble = "<div id='bubble-" + randomNumber + "' style='height: 185px !important; width: 150px !important;' class='bubble-content'>";
  607.                         //var bubble = document.createElement("div");
  608.                         //bubble.id = "bubble-" + randomNumber;
  609.                         //bubble.setAttribute("class", "bubble-content");
  610.                         //bubble.style.cssText = "height: 330px !important; width: 300px !important;";
  611.  
  612.  
  613.                         if (!markersElement.geoMashup) {
  614.                             //bubble += "<h4>" + CGMPGlobal.translations.address + ":</h4>";
  615.                             //bubble += "<p class='custom-bubble-text'>" + contentFromMarker + "</p>";
  616.                             if (markersElement.customBubbleText != '') {
  617.                                 //var decodedHtml = $("<p></p>").html(markersElement.customBubbleText).text();
  618.                                 bubble += "<p class='custom-bubble-text'>" + markersElement.customBubbleText + "</p>";
  619.                             }
  620.                         } else {
  621.                             var substr = markersElement.postTitle.substring(0, 30);
  622.                             bubble += "";
  623.                             bubble += "<p class='geo-mashup-post-title'><a title='Original post: " + markersElement.postTitle + "' href='" +markersElement.postLink+ "'>" + substr + "..</a></p>";
  624.                             bubble += "<p class='geo-mashup-post-excerpt'>" + markersElement.postExcerpt  + "</p>";
  625.                         }
  626.  
  627.                         //bubble += "<hr />";
  628.                         //bubble += "<p class='custom-bubble-text'>" + CGMPGlobal.translations.directions + ": <a id='toHere-" + randomNumber + "' class='dirToHereTrigger' href='javascript:void(0);'>" + CGMPGlobal.translations.toHere + "</a> - <a id='fromHere-" + randomNumber + "' class='dirFromHereTrigger' href='javascript:void(0);'>" + CGMPGlobal.translations.fromHere + "</a> | <a id='trigger-" + randomNumber + "' class='streetViewTrigger' href='javascript:void(0);'>" + CGMPGlobal.translations.streetView + "</a></p>";
  629.                         //bubble += "</div>";
  630.  
  631.                         return {bubbleHolderId : randomNumber, bubbleContent: bubble};
  632.                     }
  633.  
  634.                     function parseCsv() {
  635.                         var locations = csvString.split("|");
  636.  
  637.                         Logger.info("Exploded CSV into locations: " + locations);
  638.  
  639.                         for (var i = 0; i < locations.length; i++) {
  640.                             var target = locations[i];
  641.                             if (target != null && target != "") {
  642.                                 target = Utils.trim(target);
  643.                                 if (target == "") {
  644.                                     Logger.warn("Given extra marker address is empty");
  645.                                     continue;
  646.                                 }
  647.                                 pushGeoDestination(target, (i + 1));
  648.                             }
  649.                         }
  650.                     }
  651.  
  652.                     function parseJsonStructure(json, infoBubbleContainPostLink)  {
  653.  
  654.                         var index = 1;
  655.                         $.each(json, function() {
  656.                             if (this.excerpt == null) {
  657.                                 this.excerpt = '';
  658.                             }
  659.                             //Logger.info("Looping over JSON object:\n\tTitle: " + this.title + "\n\tAddy: " + this.addy + "\n\tLink: " + this.permalink + "\n\tExcerpt: " + this.excerpt);
  660.  
  661.                             var targetArr = this.addy.split(CGMPGlobal.sep);
  662.  
  663.                             if (Utils.isNumeric(targetArr[0])) {
  664.                                 addGeoPoint(index, targetArr, this.title, this.permalink, this.excerpt, infoBubbleContainPostLink);
  665.                             } else if (Utils.isAlphaNumeric(targetArr[0])) {
  666.                                 storeAddress(index, targetArr, this.title, this.permalink, this.excerpt, infoBubbleContainPostLink);
  667.                             } else {
  668.                                 storeAddress(index, targetArr, this.title, this.permalink, this.excerpt, infoBubbleContainPostLink);
  669.                                 Logger.warn("Unknown type of geo destination in regexp: " + targetArr[0] + ", fallingback to store it as an address");
  670.                             }
  671.                             index ++;
  672.                         });
  673.  
  674.                         Logger.info("Have " + (index - 1) + " destinations for marker Geo mashup..");
  675.                     }
  676.                    
  677.                     function pushGeoDestination(target, index) {
  678.  
  679.                          var targetArr = target.split(CGMPGlobal.sep);
  680.  
  681.                          if (Utils.isNumeric(targetArr[0])) {
  682.                              addGeoPoint(index, targetArr, '', '', '', false);
  683.                          } else if (Utils.isAlphaNumeric(targetArr[0])) {
  684.                              storeAddress(index, targetArr, '', '', '', false);
  685.                          } else {
  686.                              storeAddress(index, targetArr, '', '', '', false);
  687.                              Logger.warn("Unknown type of geo destination in regexp: " + targetArr[0] + ", fallingback to store it as an address");
  688.                          }
  689.                     }
  690.  
  691.                     function storeAddress(zIndex, targetArr, postTitle, postLink, postExcerpt, geoMashup) {
  692.  
  693.                             if (targetArr[2] != null) {
  694.                                 if (targetArr[2].indexOf("No description provided") != -1) {
  695.                                     targetArr[2] = '';
  696.                                 }
  697.                             } else {
  698.                                 targetArr[2] = '';
  699.                             }
  700.                             //Logger.info("Storing address: " + targetArr[0] + " for marker-to-be for the map ID: " + mapDivId);
  701.                             storedAddresses.push({
  702.                                 address: targetArr[0],
  703.                                 animation: google.maps.Animation.DROP,
  704.                                 zIndex: zIndex,
  705.                                 markerIcon: targetArr[1],
  706.                                 customBubbleText: targetArr[2],
  707.                                 postTitle: postTitle,
  708.                                 postLink: postLink,
  709.                                 postExcerpt: postExcerpt,
  710.                                 geoMashup: geoMashup
  711.                             });
  712.                         }
  713.                    
  714.                     function addGeoPoint(zIndex, targetArr, postTitle, postLink, postExcerpt, geoMashup) {
  715.                    
  716.                         var latlngArr = [];
  717.                         if (targetArr[0].indexOf(",") != -1) {
  718.                             latlngArr = targetArr[0].split(",");
  719.                         } else  if (targetArr[0].indexOf(";") != -1) {
  720.                             latlngArr = targetArr[0].split(";");
  721.                         }
  722.  
  723.                         if (latlngArr.length == 0) {
  724.                             Logger.warn("Exploded lat/long array has length of zero");
  725.                             return false;
  726.                         }
  727.  
  728.                         latlngArr[0] = Utils.trim(latlngArr[0]);
  729.                         latlngArr[1] = Utils.trim(latlngArr[1]);
  730.  
  731.                         if (latlngArr[0] == '' || latlngArr[1] == '') {
  732.                             Logger.warn("Lat or Long are empty string");
  733.                             return false;
  734.                         }
  735.  
  736.                         targetArr[0] = new google.maps.LatLng(parseFloat(latlngArr[0]), parseFloat(latlngArr[1]));
  737.                         storeAddress(zIndex, targetArr, postTitle, postLink, postExcerpt, geoMashup);
  738.                     }
  739.                    
  740.                     function queryGeocoderService() {
  741.                         clearTimeout(timeout);
  742.                         if (storedAddresses.length > 0) {
  743.                             var element = storedAddresses.shift();
  744.                             Logger.info("Passing [" + element.address + "] to Geo service. Have left " + storedAddresses.length + " items to process!");
  745.  
  746.                             if (element.address instanceof google.maps.LatLng) {
  747.                                 buildLocationFromCoords(element);
  748.                             } else {
  749.                                 var geocoderRequest = {"address": element.address};
  750.                                 geocoder.geocode(geocoderRequest, function (results, status) {
  751.                                     geocoderCallback(results, status, element);
  752.                                 });
  753.                             }
  754.                         } else {
  755.                             setBounds();
  756.  
  757.                             if (badAddresses.length > 0) {
  758.                                 var msg = "";
  759.                                 $.each(badAddresses, function (index, addy) {
  760.                                     msg += "&nbsp;&nbsp;&nbsp;<b>" + (1 + index) + ". " + addy + "</b><br />";
  761.                                 });
  762.  
  763.                                 Errors.alertError(CGMPGlobal.errors.badAddresses.replace('[REPLACE]', msg));
  764.                             }
  765.                             badAddresses = [];
  766.                         }
  767.                     }
  768.  
  769.                     function setBounds() {
  770.  
  771.                         if (markers.length > 1) {
  772.                             $.each(markers, function (index, marker) {
  773.                                 if (!bounds.contains(marker.position)) {
  774.                                     bounds.extend(marker.position);
  775.                                 }
  776.                             });
  777.                             originalExtendedBounds = bounds;
  778.                             if (bounds != null) {
  779.                                 googleMap.fitBounds(bounds);
  780.                             }
  781.                         } else if (markers.length == 1) {
  782.                             googleMap.setCenter(markers[0].position);
  783.                             updatedZoom = googleMap.getZoom();
  784.                             originalMapCenter = googleMap.getCenter();
  785.                         }
  786.                     }
  787.  
  788.                     function buildLocationFromCoords(element)  {
  789.                         var addressPoint = element.address;
  790.  
  791.                         element.address = "Lat/Long: " + addressPoint.lat().toFixed(6) + ", " + addressPoint.lng().toFixed(6);
  792.                         instrumentMarker(addressPoint, element);
  793.                         queryGeocoderService();
  794.                     }
  795.  
  796.                     function geocoderCallback(results, status, element) {
  797.                         if (status == google.maps.GeocoderStatus.OK) {
  798.                             var addressPoint = results[0].geometry.location;
  799.                             instrumentMarker(addressPoint, element);
  800.                             timeout = setTimeout(function() { queryGeocoderService(); }, 330);
  801.                         } else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
  802.                             setBounds();
  803.                             storedAddresses.push(element);      
  804.                             timeout = setTimeout(function() { queryGeocoderService(); }, 3000);
  805.                         } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
  806.                             Logger.warn("Got ZERO results for [" + element.address + "]. Have left " + markers.length + " items to process");
  807.                             badAddresses.push(element.address);
  808.                             timeout = setTimeout(function() { queryGeocoderService(); }, 400);
  809.                         }
  810.  
  811.                     }
  812.  
  813.  
  814.                     function instrumentMarker(point, element) {
  815.                         var marker = new google.maps.Marker({
  816.                             position: point,
  817.                             title: element.address.replace("<br />", " :: "),
  818.                             content: element.address,
  819.                             zIndex: (element.zIndex + 1000),
  820.                             map: googleMap
  821.                         });
  822.                         if (marker) {
  823.  
  824.                             if (element.markerIcon) {
  825.                                 var markerIcon = element.markerIcon;
  826.                                 if (typeof markerIcon == "undefined" || markerIcon === "undefined") {
  827.                                     markerIcon = '1-default.png';
  828.                                 }
  829.                                 marker.setIcon(CGMPGlobal.customMarkersUri + markerIcon);
  830.                                
  831.                                 var shadow = null;
  832.                                 var defaultMarkers = ['1-default.png', '2-default.png'];
  833.                                 var defaultPins = ['4-default.png', '5-default.png', '6-default.png', '7-default.png'];
  834.  
  835.                                 if ($.inArray(markerIcon, defaultMarkers) != -1) {
  836.                                     var url = CGMPGlobal.customMarkersUri + "msmarker.shadow.png";
  837.                                     shadow = buildMarkerImage(url, 59, 32, 0, 0, 16, 33);
  838.                                 } else  if ($.inArray(markerIcon, defaultPins) != -1) {
  839.                                     var url = CGMPGlobal.customMarkersUri + "msmarker.shadow.png";
  840.                                     shadow = buildMarkerImage(url, 59, 32, 0, 0, 21, 34);
  841.                                 } else if (markerIcon.indexOf('3-default') != -1) {
  842.                                     var url = CGMPGlobal.customMarkersUri + "beachflag_shadow.png";
  843.                                     shadow = buildMarkerImage(url, 37, 32, 0, 0, 10, 33);
  844.                                 } else {
  845.                                     shadow = buildMarkerImage(CGMPGlobal.customMarkersUri + "shadow.png", 68, 37, 0, 0, 32, 38);
  846.                                 }
  847.  
  848.                                 marker.setShadow(shadow);
  849.                             }
  850.  
  851.                             attachEventlistener(marker, element);
  852.                             if (!directionControlsBinded) {
  853.                                 bindDirectionControlsToEvents();
  854.                                 directionControlsBinded = true;
  855.                             }
  856.  
  857.                             markers.push(marker);
  858.                         }
  859.                     }
  860.  
  861.                     function buildMarkerImage(url, sizeX, sizeY, pointAX, pointAY, pointBX, pointBY)  {
  862.  
  863.                         var image = new google.maps.MarkerImage(url,
  864.                                     new google.maps.Size(sizeX, sizeY),
  865.                                     new google.maps.Point(pointAX, pointAY),
  866.                                     new google.maps.Point(pointBX, pointBY));
  867.  
  868.                         return image;
  869.                     }
  870.  
  871.                     return {
  872.                         init: init,
  873.                         buildAddressMarkers: buildAddressMarkers,
  874.                         isBuildAddressMarkersCalled: isBuildAddressMarkersCalled
  875.                     }
  876.                 };
  877.  
  878.  
  879.  
  880.                 var Utils = (function() {
  881.                     var isNumeric = function isNumeric(subject) {
  882.                         var numericRegex = /^([0-9?(\-.,;\s{1,})]+)$/;
  883.                         return numericRegex.test(subject);
  884.                     }
  885.                     var isAlphaNumeric = function isAlphaNumeric(subject) {
  886.                         var addressRegex = /^([a-zA-Z0-9?(/\-.,\s{1,})]+)$/;
  887.                         return addressRegex.test(subject);
  888.                     }
  889.                     var trim = function trim(subject) {
  890.                         var leftTrimRegex = /^\s\s*/;
  891.                         var rightTrimRegex = /\s\s*$/;
  892.                         var trimRegex = /^\s+|\s+$/g;
  893.                         return subject.replace(trimRegex, '');
  894.                     }
  895.                     var searchReplace = function searchReplace(subject, search, replace) {
  896.                         return subject.replace(new RegExp(search, "g"), replace);
  897.                     }
  898.                     return {
  899.                         isNumeric: isNumeric,
  900.                         isAlphaNumeric: isAlphaNumeric,
  901.                         trim: trim,
  902.                         searchReplace: searchReplace
  903.                     }
  904.                 })();
  905.  
  906.  
  907.  
  908.                 var Logger = (function() {
  909.                     var info = function info(message) {
  910.                         var msg = "Info :: " + message;
  911.                         print(msg);
  912.                     }
  913.                     var raw = function raw(msg) {
  914.                         print(msg);
  915.                     }
  916.                     var warn = function warn(message) {
  917.                         var msg = "Warning :: " + message;
  918.                         print(msg);
  919.                     }
  920.                     var error = function error(message) {
  921.                         var msg = "Error :: " + message;
  922.                         print(msg);
  923.                     }
  924.                     var fatal = function fatal(message) {
  925.                         var msg = "Fatal :: " + message;
  926.                         print(msg);
  927.                     }
  928.                     var print = function print(message) {
  929.                         if ( $.browser.msie ) {
  930.                             //Die... die... die.... why dont you just, die???
  931.                          } else {
  932.                             if ($.browser.mozilla && parseInt($.browser.version) >= 1 ) {
  933.                                 console.log(message);
  934.                             } else if ($.browser.webkit && parseInt($.browser.version) >= 534) {
  935.                                 console.log(message);
  936.                             } else if ($.browser.opera && parseInt($.browser.version) >= 11 ) {
  937.                                 console.log(message);
  938.                             }
  939.                          }
  940.                     }
  941.  
  942.                     return {
  943.                             info: info,
  944.                             raw: raw,
  945.                             warn: warn,
  946.                             error: error,
  947.                             fatal: fatal
  948.                         }
  949.                 })();
  950.  
  951.  
  952.                     var Errors = (function() {
  953.  
  954.                             var alertError = function alertError(content)  {
  955.  
  956.                                 var mask = $('<div id="cgmp-popup-mask"/>');
  957.                                 var id = Math.random().toString(36).substring(3);
  958.                                 var shortcode_dialog = $('<div id="' + id + '" class="cgmp-popup-shortcode-dialog cgmp-popup-window">');
  959.                                 shortcode_dialog.html("<div class='dismiss-container'><a class='dialog-dismiss' href='javascript:void(0)'>×</a></div><p style='text-align: left; padding: 10px 10px 0 10px'>" + content + "</p><div align='center'><input type='button' class='close-dialog' value='Close' /></div>");
  960.  
  961.                                 $('body').append(mask);
  962.                                 $('body').append(shortcode_dialog);
  963.  
  964.                                 var maskHeight = $(document).height();
  965.                                 var maskWidth = $(window).width();
  966.                                 $('#cgmp-popup-mask').css({'width':maskWidth,'height':maskHeight, 'opacity':0.1});
  967.  
  968.                                 if ($("#cgmp-popup-mask").length == 1) {
  969.                                     $('#cgmp-popup-mask').show();
  970.                                 }
  971.  
  972.                                 var winH = $(window).height();
  973.                                 var winW = $(window).width();
  974.                                 $("div#" + id).css('top',  winH/2-$("div#" + id).height()/2);
  975.                                 $("div#" + id).css('left', winW/2-$("div#" + id).width()/2);
  976.                                 $("div#" + id).fadeIn(500);
  977.                                 $('.cgmp-popup-window .close-dialog').click(function (e) {
  978.                                     close_dialog(e, $(this));
  979.                                 });
  980.                                 $('.cgmp-popup-window .dialog-dismiss').click(function (e) {
  981.                                      close_dialog(e, $(this));
  982.                                 });
  983.  
  984.                                 function close_dialog(e, object) {
  985.                                     e.preventDefault();
  986.  
  987.                                     var parentDialog = $(object).closest("div.cgmp-popup-shortcode-dialog");
  988.                                     if (parentDialog) {
  989.                                         $(parentDialog).remove();
  990.                                     }
  991.  
  992.                                     if ($("div.cgmp-popup-shortcode-dialog").length == 0) {
  993.                                         $('#cgmp-popup-mask').remove();
  994.                                     }
  995.                                 }
  996.  
  997.                                 $('#cgmp-popup-mask').click(function () {
  998.                                     $(this).remove();
  999.                                     $('.cgmp-popup-window').remove();
  1000.                                 });
  1001.                                 $(window).resize(function () {
  1002.                                     var box = $('.window');
  1003.                                     var maskHeight = $(document).height();
  1004.                                     var maskWidth = $(window).width();
  1005.                                     $('#cgmp-popup-mask').css({'width':maskWidth,'height':maskHeight});
  1006.                                     var winH = $(window).height();
  1007.                                     var winW = $(window).width();
  1008.                                     box.css('top',  winH/2 - box.height()/2);
  1009.                                     box.css('left', winW/2 - box.width()/2);
  1010.                                 });
  1011.                             }
  1012.  
  1013.                         return {
  1014.                             alertError: alertError
  1015.                         }
  1016.                     })();
  1017.  
  1018.  
  1019.                 //$(document).ready(function() {
  1020.  
  1021.                     if ($('object#global-data-placeholder').length == 0) {
  1022.                         Logger.fatal("The global HTML <object> element is undefined. Aborting map generation .. d[-_-]b");
  1023.                         return;
  1024.                     }
  1025.  
  1026.                     var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
  1027.                     var link = document.createElement('link');
  1028.                     link.type= 'text/css';
  1029.                     link.rel = 'stylesheet';
  1030.                     link.href = $("object#global-data-placeholder").find("param#cssHref").val();
  1031.                     link.media = 'screen';
  1032.                     head.appendChild(link);
  1033.  
  1034.                     CGMPGlobal.sep = $("object#global-data-placeholder").find("param#sep").val();
  1035.                     CGMPGlobal.customMarkersUri = $("object#global-data-placeholder").find("param#customMarkersUri").val();
  1036.                     CGMPGlobal.errors = $("object#global-data-placeholder").find("param#errors").val();
  1037.  
  1038.                     CGMPGlobal.errors = parseJson(CGMPGlobal.errors);
  1039.                     CGMPGlobal.translations = $("object#global-data-placeholder").find("param#translations").val();
  1040.                     CGMPGlobal.translations = parseJson(CGMPGlobal.translations);
  1041.  
  1042.                     var version = parseFloat($.fn.jquery);
  1043.                     if (version < 1.3) {
  1044.                         alert(CGMPGlobal.errors.oldJquery);
  1045.                         Logger.fatal("Client uses jQuery older than the version 1.3.0. Aborting map generation ..");
  1046.                         return false;
  1047.                     }
  1048.  
  1049.                     if (typeof google == "undefined" || !google) {
  1050.                         Errors.alertError(CGMPGlobal.errors.msgNoGoogle);
  1051.                         Logger.fatal("We do not have reference to Google API. Aborting map generation ..");
  1052.                         return false;
  1053.                     } else if (typeof GMap2 != "undefined" && GMap2) {
  1054.                         Errors.alertError(CGMPGlobal.errors.msgApiV2);
  1055.                         Logger.fatal("It looks like the webpage has reference to GMap2 object from Google API v2. Aborting map generation ..");
  1056.                         return false;
  1057.                     }
  1058.  
  1059.                     CGMPGlobal.language = $("object#global-data-placeholder").find("param#language").val();
  1060.                     google.load('maps', '3', {other_params:'sensor=false&libraries=panoramio&language=' + CGMPGlobal.language, callback: function () { google_map_api_callback(); }});
  1061.  
  1062.                 function google_map_api_callback() {
  1063.  
  1064.                     $("object.cgmp-json-string-placeholder").each(function (index, element) {
  1065.  
  1066.                         var currentElementId = $(element).attr('id');
  1067.                         var jsonString = $(element).find('param#json-string-' + currentElementId).val();
  1068.                         jsonString = Utils.searchReplace(jsonString, "'", "");
  1069.                         jsonString = jsonString.replace("&quot;", "");
  1070.  
  1071.                         var json = parseJson(jsonString);
  1072.  
  1073.                         if (typeof json == "undefined" || !json) {
  1074.                             Logger.fatal("We did not parse JSON from OBJECT param. Aborting map generation ..");
  1075.                             return false;
  1076.                         }
  1077.  
  1078.                         if ($('div#' + json.id).length > 0) {
  1079.  
  1080.                                 var googleMap = new google.maps.Map(document.getElementById(json.id));
  1081.  
  1082.                                 GoogleMapOrchestrator.initMap(googleMap, json.bubbleautopan, parseInt(json.zoom), json.maptype);
  1083.                                 LayerBuilder.init(googleMap);
  1084.                                 var markerBuilder = new MarkerBuilder();
  1085.                                 markerBuilder.init(googleMap, json.bubbleautopan);
  1086.  
  1087.  
  1088.                                 var controlOptions = {
  1089.                                         mapTypeControl: (json.maptypecontrol === 'true'),
  1090.                                         panControl: (json.pancontrol === 'true'),
  1091.                                         zoomControl: (json.zoomcontrol === 'true'),
  1092.                                         scaleControl: (json.scalecontrol === 'true'),
  1093.                                         scrollwheel: (json.scrollwheelcontrol === 'true'),
  1094.                                         streetViewControl: (json.streetviewcontrol === 'true'),
  1095.                                         tilt: (json.tiltfourtyfive === 'true' ? 45 : null),
  1096.                                         draggable: (json.draggable === 'true'),
  1097.                                         overviewMapControl: true,
  1098.                                         overviewMapControlOptions: {opened: false}
  1099.                                 };
  1100.                                 GoogleMapOrchestrator.setMapControls(controlOptions);
  1101.  
  1102.                                 if (json.showpanoramio === "true") {
  1103.                                     LayerBuilder.buildPanoramioLayer(json.panoramiouid);
  1104.                                 }
  1105.  
  1106.                                 if (json.showbike === "true") {
  1107.                                     LayerBuilder.buildBikeLayer();
  1108.                                 }
  1109.                                 if (json.showtraffic === "true") {
  1110.                                     LayerBuilder.buildTrafficLayer();
  1111.                                 }
  1112.  
  1113.                                 if (json.kml != null && Utils.trim(json.kml) != '') {
  1114.                                     LayerBuilder.buildKmlLayer(json.kml);
  1115.                                 } else {
  1116.  
  1117.                                     if (json.markerlist != null && Utils.trim(json.markerlist) != '') {
  1118.                                         markerBuilder.buildAddressMarkers(json.markerlist, json.addmarkermashup, json.addmarkermashupbubble);
  1119.                                     }
  1120.  
  1121.                                     var isBuildAddressMarkersCalled = markerBuilder.isBuildAddressMarkersCalled();
  1122.                                     if (!isBuildAddressMarkersCalled) {
  1123.                                         Errors.alertError(CGMPGlobal.errors.msgMissingMarkers);
  1124.                                     }
  1125.                                 }
  1126.                         } else {
  1127.                             Logger.fatal("It looks like the map DIV placeholder ID [" + json.id + "] does not exist in the page!");
  1128.                         }
  1129.                     });
  1130.  
  1131.                 }
  1132.                     //});
  1133.             }(jQueryObj));
  1134.         }
  1135.     })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement