jQuery(document).ready(function(){ /* Colorbox Init */ if(jQuery('.button-plan-my-route').hasClass('button-disabled') == false){ // init the colorbox only if the button hasnt been disabled jQuery('.button-plan-my-route').colorbox({ inline:true, href: jQuery('.button-plan-my-route').parent().find('.directions-popup').clone(true).removeAttr('style'), maxWidth: "95%", overlayClose: true, className: 'directions-colorbox', }); } else { jQuery('.button-plan-my-route').on('click', function(e){ e.preventDefault(); }); } /* Colorbox Init */ // this is triggered for the element jQuery(document).trigger('get_directions_form_init', {inColorbox: false}); }); jQuery(document).bind('get_directions_form_init', function(e, callerParams){ jQuery('.directions-form-container').attr('data-incolorbox', callerParams.inColorbox); jQuery('.directions-form-container .button-turn-by-turn').on('click', function(e){ e.preventDefault(); // get the buttons parent container .. usual way would be .parent().parent() etc // this gets the parents to the top of tree untill directions-form-container (we need this to stop somewhere) // and because we need the mentioned container we get the last known parent (top) and do .parent() to retrieve the wanted container var $formContainer = jQuery(this).parentsUntil('.directions-form-container').last().parent(); var start = $formContainer.find('input[name=directions_address_start]').val(); var end = $formContainer.find('input[name=directions_address_end]').val(); var start_geo_lat = $formContainer.find('input[name=directions_address_geolocation_lat]').length > 0 ? $formContainer.find('input[name=directions_address_geolocation_lat]').val() : ""; var start_geo_lng = $formContainer.find('input[name=directions_address_geolocation_lng]').length > 0 ? $formContainer.find('input[name=directions_address_geolocation_lng]').val() : ""; if(end !== ""){ // geo preference if(start_geo_lat !== "" && start_geo_lng !== ""){ start = start_geo_lat+","+start_geo_lng; var url = "https://www.google.com/maps/dir/"+start+"/"+end; window.open(url); } else { if(start !== ""){ var url = "https://www.google.com/maps/dir/"+start+"/"+end; window.open(url); } else { jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-form-start-address-missing'}); } } } else { jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-form-end-address-missing'}); } }); jQuery('.directions-form-container .button-get-directions').on('click', function(e){ e.preventDefault(); var $formContainer = jQuery(this).parentsUntil('.directions-form-container').last().parent(); var $displayContainer = $formContainer.parent().find('.directions-display-container'); var settings = {}; settings.map = JSON.parse($formContainer.find('.directions-form').attr('data-ait-map-settings')); settings.directions = JSON.parse($formContainer.find('.directions-form').attr('data-ait-directions-settings')); settings.directionsVisual = JSON.parse($formContainer.find('.directions-form').attr('data-ait-directions-visual')); var start = $formContainer.find('input[name=directions_address_start]').val(); var end = $formContainer.find('input[name=directions_address_end]').val(); var start_geo_lat = $formContainer.find('input[name=directions_address_geolocation_lat]').length > 0 ? $formContainer.find('input[name=directions_address_geolocation_lat]').val() : ""; var start_geo_lng = $formContainer.find('input[name=directions_address_geolocation_lng]').length > 0 ? $formContainer.find('input[name=directions_address_geolocation_lng]').val() : ""; var runrequest = true; if(end == ""){ jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-form-end-address-missing'}); runrequest = false; } else { // geo preference if(start_geo_lat !== "" && start_geo_lng !== ""){ start = new google.maps.LatLng(start_geo_lat, start_geo_lng); } else { if(start == ""){ jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-form-start-address-missing'}); runrequest = false; } } } if(runrequest){ var directionsRequest = {}; directionsRequest.origin = start; directionsRequest.destination = end; directionsRequest.travelMode = $formContainer.find('select[name=directions_settings_travelMode]').val(); directionsRequest.avoidHighways = $formContainer.find('input[name=directions_settings_avoidHighways]').is(':checked'); directionsRequest.avoidTolls = $formContainer.find('input[name=directions_settings_avoidTolls]').is(':checked'); var routeBoxerRequest = {}; /* fix for decimal numbers entered into the input */ routeBoxerRequest.radius = false; if($formContainer.find('input[name=directions_settings_category_radius]').length > 0){ var inputval = parseFloat($formContainer.find('input[name=directions_settings_category_radius]').val()); var inputmin = parseFloat($formContainer.find('input[name=directions_settings_category_radius]').attr('min')); // here parse the inputunittype .. always convert into km var inputunits = $formContainer.find('input[name=directions_settings_category_radius]').attr('data-units'); routeBoxerRequest.radius = inputval <= 0 ? inputmin : inputval; routeBoxerRequest.radius = inputunits === 'mi' ? routeBoxerRequest.radius * 1.609344 : routeBoxerRequest.radius; } /* fix for decimal numbers entered into the input */ routeBoxerRequest.category = $formContainer.find('select[name=directions_settings_categories]').length > 0 ? $formContainer.find('select[name=directions_settings_categories]').val() : false; routeBoxerRequest.runrequest = routeBoxerRequest.radius !== false && routeBoxerRequest.category !== false ? true : false; jQuery(document).trigger('get_directions_directions_init', {formContainer: $formContainer, displayContainer: $displayContainer, directionsRequest: directionsRequest, routeBoxerRequest: routeBoxerRequest, settings: settings}); } }); jQuery('.directions-form-container input[name=directions_address_geolocation]').on('click', function(){ var $formContainer = jQuery(this).parentsUntil('.directions-form-container').last().parent(); if(jQuery(this).is(':checked')){ if(navigator.geolocation) { $formContainer.find('.address').addClass('loader'); navigator.geolocation.getCurrentPosition(function(position){ $formContainer.find('input[name=directions_address_geolocation_lat]').val(position.coords.latitude); $formContainer.find('input[name=directions_address_geolocation_lng]').val(position.coords.longitude); // hide the address input //$formContainer.find('input[name="directions_address_start"]').parent().parent().hide(); $startAddress = $formContainer.find('input[name="directions_address_start"]'); $startAddress.attr('disabled', 'disabled'); // try google reverse geocode var geocoder = new google.maps.Geocoder; geocoder.geocode({'location': {lat: position.coords.latitude, lng: position.coords.longitude} }, function(results, status) { if (status === google.maps.GeocoderStatus.OK) { if (results[1]) { $startAddress.val(results[1].formatted_address); } else { // no results = use default text $startAddress.val($startAddress.attr('data-geolocation-text')); } } else { // geocoder failed = use default text $startAddress.val($startAddress.attr('data-geolocation-text')); } // hide loader $formContainer.find('.address').removeClass('loader'); }); }, function(positionError){ jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-geolocation-error'}); $formContainer.find("input[name=directions_address_geolocation]").get(0).checked = false; // hide loader $formContainer.find('.address').removeClass('loader'); }); } else { jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-no-geolocation-support'}); $formContainer.find("input[name=directions_address_geolocation]").get(0).checked = false; } } else { // show the address input //$formContainer.find('input[name="directions_address_start"]').parent().parent().show(); $formContainer.find('input[name="directions_address_start"]').val(""); $formContainer.find('input[name="directions_address_start"]').removeAttr('disabled'); // clear the lat lng fields $formContainer.find('input[name=directions_address_geolocation_lat]').val(""); $formContainer.find('input[name=directions_address_geolocation_lng]').val(""); } }); }); /* Form Messages */ jQuery(document).bind('get_directions_form_message', function(e, callerParams){ var $messageContainer = callerParams.container.find('.'+callerParams.msgid); $messageContainer.fadeIn(0, function(){ if(callerParams.container.attr('data-incolorbox') === "true"){ jQuery.colorbox.resize(); } }).delay(3000).fadeOut(250, function(){ if(callerParams.container.attr('data-incolorbox') === "true"){ jQuery.colorbox.resize(); } }); }); /* Form Messages */ jQuery(document).bind('get_directions_form_reset', function(e, callerParams){ var $formContainer = callerParams.formContainer; // text inputs $formContainer.find('input[type="text"]').val(""); // selects $formContainer.find('select').prop('selectedIndex',0); // checkboxes $formContainer.find('input[type="checkbox"]').each(function(){ if(jQuery(this).parentsUntil('.form-input-container').last().attr('data-default-checked')){ jQuery(this).attr('checked', "checked"); } else { jQuery(this).removeAttr('checked'); } }); }); /* Colorbox */ jQuery(document).bind('cbox_complete', function(){ // set up pretty selectbox if(typeof jQuery.selectbox !== "undefined"){ jQuery('.directions-form-container select').selectbox(); } // this is triggered for the colorbox jQuery(document).trigger('get_directions_form_init', {inColorbox: true}); jQuery.colorbox.resize(); }); /* Colorbox */ jQuery(document).bind('get_directions_map_init', function(e, callerParams){ var $formContainer = callerParams.formContainer; var $displayContainer = callerParams.displayContainer; // jQuery object if($formContainer.attr('data-incolorbox') === "true"){ // create new dom to store the map and panel // check if the item detail has .map-container .. if hasnt ... create the container near the button if(jQuery('.item-content-wrap .map-container').length != 0){ // map exist .. use this var $oldMapContainer = jQuery('.item-content-wrap .map-container'); $oldMapContainer.html(""); $oldMapContainer.addClass('directions-display-container'); $oldMapContainer.append('
'); $displayContainer = $oldMapContainer; } else { if(jQuery('.single-ait-item .directions-display-container').length != 0){ // element is present $displayContainer = jQuery('.single-ait-item .directions-display-container'); } else { // create new dom node // or dont render the data } } } var $mapContainer = $displayContainer.find('.directions-map'); var $mapContent = $mapContainer.find('.content'); var $panelContainer = $displayContainer.find('.directions-panel'); var $panelContent = $panelContainer.find('.content'); $displayContainer.show(); $mapContent.height(500); var mapSettings = callerParams.settings.map; mapSettings.center = {lat: 40.771, lng: -73.974}; var map = new google.maps.Map($mapContent.get(0), mapSettings); /* icon setup */ var directionsVisual = callerParams.settings.directionsVisual; var markerLegs = callerParams.directionsResponse.routes[0].legs[0]; var markerStart = new google.maps.Marker({ position: markerLegs.start_location, map: map }); var markerEnd = new google.maps.Marker({ position: markerLegs.end_location, map: map }); if(directionsVisual.markerStart !== ""){ markerStart.setIcon({ url: directionsVisual.markerStart, size: new google.maps.Size( 100, 100 ), origin: new google.maps.Point( 0, 0 ), anchor: new google.maps.Point( 33, 60 ) }); } else { markerStart.setIcon({ url: "http://mt.googleapis.com/maps/vt/icon/name=icons/spotlight/spotlight-waypoint-a.png&text=A&psize=16&font=fonts/Roboto-Regular.ttf&color=ff333333&ax=44&ay=48&scale=1", }); } if(directionsVisual.markerEnd !== ""){ markerEnd.setIcon({ url: directionsVisual.markerEnd, size: new google.maps.Size( 100, 100 ), origin: new google.maps.Point( 0, 0 ), anchor: new google.maps.Point( 33, 60 ) }); } else { markerEnd.setIcon({ url: "http://mt.googleapis.com/maps/vt/icon/name=icons/spotlight/spotlight-waypoint-b.png&text=B&psize=16&font=fonts/Roboto-Regular.ttf&color=ff333333&ax=44&ay=48&scale=1", }); } /* icon setup */ /* route markers */ if(callerParams.routeBoxerRequest.runrequest){ var routeBoxer = new RouteBoxer(); var routeBoxes = routeBoxer.box(callerParams.directionsResponse.routes[0].overview_path, callerParams.routeBoxerRequest.radius); var routeBounds = {}; routeBounds.northEast = []; routeBounds.southWest = []; for (var i = 0; i < routeBoxes.length; i++){ routeBounds.northEast[i] = routeBoxes[i].getNorthEast().lat()+","+routeBoxes[i].getNorthEast().lng(); routeBounds.southWest[i] = routeBoxes[i].getSouthWest().lat()+","+routeBoxes[i].getSouthWest().lng(); } jQuery.ajax(ait.ajax.url, { data: { 'action': 'getRouteItems', 'data': { 'category': callerParams.routeBoxerRequest.category, 'bounds': routeBounds, } }, method: 'POST', cache: false, dataType: 'json', success: function(json){ for(index in json.data){ jQuery(document).trigger('get_directions_map_attach_marker', {displayContainer: $displayContainer, map: map, item: json.data[index]}); } }, error: function(xhr){ console.error('AIT Get Directions: Ajax failed to retrieve route items'); }, }); } /* route markers */ callerParams.directionsDisplay.setMap(map); $panelContent.html(""); callerParams.directionsDisplay.setPanel($panelContent.get(0)); /* attach checker for a dom change */ jQuery(document).trigger('get_directions_panel_change', {panel: $panelContent, directionsVisual: directionsVisual}); /* attach checker for a dom change */ /* scroll to container */ var mapOffset = $mapContent.offset().top; if(jQuery('body').hasClass('sticky-menu-enabled')){ mapOffset = mapOffset - parseInt(jQuery('body').find('.sticky-menu').outerHeight(true)); } if(jQuery('body').hasClass('admin-bar')){ mapOffset = mapOffset - parseInt(jQuery('body').find('#wpadminbar').outerHeight(true)); } jQuery('html, body').animate({ scrollTop: mapOffset }, 1000); /* scroll to container */ /* map activation button */ if(Modernizr.touchevents){ map.setOptions({ draggable : false }); jQuery(document).trigger('get_directions_map_attach_button', {map: map}); } /* map activation button */ }); jQuery(document).bind('get_directions_directions_init', function(e, callerParams){ var $formContainer = callerParams.formContainer; // jQuery object var directionsSettings = callerParams.settings.directions; var directionsDisplay = new google.maps.DirectionsRenderer({suppressMarkers: true}); var directionsService = new google.maps.DirectionsService; var directionsRequest = directionsSettings; jQuery.extend( directionsRequest, callerParams.directionsRequest ); directionsService.route(directionsRequest, function(response, status) { switch(status){ case google.maps.DirectionsStatus.OK: // trigger map init directionsDisplay.setDirections(response); jQuery(document).trigger('get_directions_map_init', {formContainer: callerParams.formContainer, displayContainer: callerParams.displayContainer, directionsDisplay: directionsDisplay, directionsResponse: response, routeBoxerRequest: callerParams.routeBoxerRequest, settings: callerParams.settings}); if($formContainer.attr('data-incolorbox') === "true"){ /* reset the form */ jQuery(document).trigger('get_directions_form_reset', {formContainer: $formContainer}); /* reset the form */ jQuery.colorbox.close(); } break; case google.maps.DirectionsStatus.NOT_FOUND: // address not found error jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-address-not-found'}); break; case google.maps.DirectionsStatus.ZERO_RESULTS: // route not found error jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-route-not-found'}); break; default: // all other error => google.maps.DirectionsStatus.UNKNOWN_ERROR jQuery(document).trigger('get_directions_form_message', {container: $formContainer, msgid: 'directions-undefined-error'}); break; } }); }); jQuery(document).bind('get_directions_map_attach_marker', function(e, callerParams){ var $displayContainer = callerParams.displayContainer; var map = callerParams.map; var item = callerParams.item; var marker = new google.maps.Marker({ position: new google.maps.LatLng(item.marker.position.lat, item.marker.position.lng), title: item.marker.title, icon: item.marker.icon, map: map, }); marker.addListener('click', function(){ $displayContainer.find('.infoBox').remove(); var infoWindow = new InfoBox({ pixelOffset: new google.maps.Size(-145, -203), closeBoxURL: item.close_image, enableEventPropagation: true, zIndex: 99, disableAutoPan: false, maxWidth: 150, infoBoxClearance: new google.maps.Size(1, 1), boxStyle: { background: "white", opacity: 1, width: "290px" } }); infoWindow.setContent(item.infobox); infoWindow.open(map, marker); map.panTo(marker.getPosition()); }); }); jQuery(document).bind('get_directions_panel_change', function(e, callerParams){ var checkInterval = setInterval(function(){ // check for dom change if(callerParams.panel.html() != ""){ var $markerStart = callerParams.panel.find('img:first'); var $markerEnd = callerParams.panel.find('img:last'); if(callerParams.directionsVisual.markerStart !== ""){ $markerStart.attr('src', callerParams.directionsVisual.markerStart); $markerStart.css({'width': '40px'}); } if(callerParams.directionsVisual.markerEnd !== ""){ $markerEnd.attr('src', callerParams.directionsVisual.markerEnd); $markerEnd.css({'width': '40px'}); } clearInterval(checkInterval); } }, 100); }); jQuery(document).bind('get_directions_map_attach_button', function(e, callerParams){ var map = callerParams.map; var button = document.createElement('div'); button.className = "draggable-toggle-button"; var innerhtmlstyle = 'style="font-size: 14px"' button.innerHTML = ''; button.style.margin = "10px"; button.style.borderRadius = "2px"; button.onclick = function(e){ if(jQuery(this).hasClass('active')){ jQuery(this).removeClass('active').html(''); map.setOptions({ draggable : false }); } else { jQuery(this).addClass('active').html(''); map.setOptions({ draggable : true }); } }; map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(button); }); /* functionality to get directions to the marker displayed on map */ /* beta for now */ /*jQuery(document).bind('get_directions_map_infobox_directions', function(e, callerParams){ var $caller = jQuery(callerParams.caller.srcElement); // this is the span on which the user clicked var $parent = $caller.parent(); // this should be a var lat = parseFloat($parent.attr('data-position-lat')); var lng = parseFloat($parent.attr('data-position-lng')); var $displayContainer = $caller.parentsUntil('.directions-display-container').last().parent(); var $formContainer = $displayContainer.parent().find('.directions-form-container'); // only in element .. try the length var settings = {}; settings.map = JSON.parse($formContainer.find('.directions-form').attr('data-ait-map-settings')); settings.directions = JSON.parse($formContainer.find('.directions-form').attr('data-ait-directions-settings')); settings.directionsVisual = JSON.parse($formContainer.find('.directions-form').attr('data-ait-directions-visual')); var start = $formContainer.find('input[name=directions_address_start]').val(); var start_geo_lat = $formContainer.find('input[name=directions_address_geolocation_lat]').length > 0 ? $formContainer.find('input[name=directions_address_geolocation_lat]').val() : ""; var start_geo_lng = $formContainer.find('input[name=directions_address_geolocation_lng]').length > 0 ? $formContainer.find('input[name=directions_address_geolocation_lng]').val() : ""; if(start_geo_lat !== "" && start_geo_lng !== ""){ start = new google.maps.LatLng(start_geo_lat, start_geo_lng); } var directionsRequest = {}; directionsRequest.origin = start; // this should be the the original requests place directionsRequest.destination = lat+", "+lng; directionsRequest.travelMode = $formContainer.find('select[name=directions_settings_travelMode]').val(); directionsRequest.avoidHighways = $formContainer.find('input[name=directions_settings_avoidHighways]').is(':checked'); directionsRequest.avoidTolls = $formContainer.find('input[name=directions_settings_avoidTolls]').is(':checked'); var routeBoxerRequest = {}; routeBoxerRequest.radius = $formContainer.find('input[name=directions_settings_category_radius]').length > 0 ? parseInt($formContainer.find('input[name=directions_settings_category_radius]').val()) : false; routeBoxerRequest.category = $formContainer.find('select[name=directions_settings_categories]').length > 0 ? $formContainer.find('select[name=directions_settings_categories]').val() : false; routeBoxerRequest.runrequest = routeBoxerRequest.radius !== false && routeBoxerRequest.category !== false ? true : false; jQuery(document).trigger('get_directions_directions_init', { formContainer: $formContainer, displayContainer: $displayContainer, directionsRequest: directionsRequest, routeBoxerRequest: routeBoxerRequest, settings: settings }); });*/ /* beta for now */ /* function to get directions to the marker displayed on map */