Advertisement
Guest User

update script made an error

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