Advertisement
Guest User

my script so far for geolocation in the compherensive g maps

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