// ========================== // :: Default setting // :: mapviewer var show_mapviewer = true; var mapviewer_id = 'mapviewer'; //var start_position = new MMLocation ( new MMLatLon( 59.33272, -0.111258 ), 15 ); var mapviewer_units = 'km'; // or 'miles' var widget_types = { pan_zoom : 'panzoom', small_pan_zoom : 'smallpanzoom', small_zoom : 'smallzoom', map_type_ : 'maptype', location : 'location', overview : 'overview', tools : 'tools', local_info : 'localinfo' } var mapviewer_widgets = { // pan_zoom_widget : { type : widget_types.pan_zoom, position : undefined, class_name : undefined, slider : undefined }, //small_pan_zoom_widget : { type : widget_types.small_pan_zoom, position : undefined, class_name : undefined, slider : undefined }, //small_zoom_widget : { type : widget_types.small_zoom, position : undefined, class_name : undefined, slider : undefined }, // map_type_widget : { type : widget_types.map_type, types : undefined, position : undefined, class_name : undefined }, // location_widget : { type : widget_types.location, options : undefined, position : undefined , class_name : undefined }, // overview_widget : { type : widget_types.overview, delta : undefined, dimensions : undefined, position : undefined, class_name : undefined }, // tool_widget : { type : widget_types.tools, label : undefined, position : undefined, class_name : undefined }, // local_info_widget : { type : widget_types.local_info, label : undefined, position : undefined, class_name : undefined } }; var mapviewer_events = { //event_handler : { event_name: 'event_name', function_name: func_name }, }; // :: geocoder var show_geocoder = true; var geocoder_id = 'geocoder'; // :: search var show_search = true; var search_id = 'search-mm'; var perform_initial_search = false; // :: search results display var show_total_results_found = false var total_results_div = ''; var total_results_text = ''; var search_params = { count : 10, start_index: undefined, order_by_fields : undefined, order_by_order : undefined, min_distance : undefined, max_distance : undefined, distance_units : 'miles', return_fields : undefined } // :: search result icon var search_result_icon = MM_DEFAULT_ICON.copy(); search_result_icon.groupName = 'search_results'; // :: search/geocoder results list var show_results_list = true; var results_list_id = 'resultslist'; var results_list_text_field = 'name'; // :: search result zoom in, will show in info box if info_box_text != '' var search_result_zoom_in = { info_box_text : 'Zoom in to this location', zoom_factor : 18 } // :: route var route_id = 'routesteps'; var route_params = { optimize_for : 'distance', // or 'time' mode : 'driving', // or 'walking' exclude : '', lang : 'en', distance_units : 'miles' // or 'km' } // :: route steps var show_route_steps = true; // :: errors var errors_id = 'errors'; var show_error_code = false; // :: error messages //var err_no_results = '

No results found.

'; var err_no_results = '

No results found.

'; //var err_ambiguous_location = '

Your search returned more than one result, please select the correct location from the drop-down box.

'; var err_ambiguous_location = '

Your search returned more than one result, please select the correct location from the list below the search fields.

'; //var err_no_location = '

Could not find any matches for your location search.

'; var err_no_location = '

Could not find any matches for your location search.

'; //var err_timeout = '

Your query has been stopped as it took too long to complete.

'; var err_timeout = '

Your query has been stopped as it took too long to complete.

'; //var err_search_failed = '

Your request failed.

'; var err_search_failed = '

Your request failed

'; //var err_search_no_results = '

No results found.

'; var err_search_no_results = '

No results found.

'; //var err_geocoder_failed = '

Your request failed.

'; var err_geocoder_failed = '

Your request failed

'; //var err_geocoder_no_matches = '

Could not find any matches for your location search.

'; var err_geocoder_no_matches = '

Could not find any matches for your location search.

'; var err_routing_failed = '

Your request failed

'; // :: ambiguous results var ambiguous_id = 'ambiguous'; // :: pois var show_poi = true; var poi_id = 'poi'; var poi_type_url = '/clients/browse.cgi?client=julian_revgeo_poi&poi_default_radius=50&poi_howmany=100&rt=browse.json'; var poi_type_callback = 'poiCallback'; var poi_type_checkbox_first = true; // label or checkbox // :: poi types var poi_types = { airline_access : { code: '7356', value: 'Airline Access' }, airport : { code: '7383', value: 'Airport' }, amusement_park : { code: '9902', value: 'Amusement Park' }, beach : { code: '9357', value: 'Beach' }, camping_ground : { code: '7360', value: 'Camping Ground' }, car_dealer : { code: '9910', value: 'Car Dealer' }, car_repair_facility : { code: '7310', value: 'Car Repair Facility' }, cash_dispenser : { code: '7397', value: 'Cash Dispenser' }, casino : { code: '7341', value: 'Casino' }, cemetery : { code: '9390', value: 'Cemetery' }, cinema : { code: '7342', value: 'Cinema' }, college_university : { code: '7377', value: 'College / University' }, commercial_building : { code: '9382', value: 'Commercial Building' }, company : { code: '9352', value: 'Company' }, concert_hall : { code: '9367', value: 'Concert Hall' }, condominium : { code: '9381', value: 'Condominium' }, convention_centre : { code: '9377', value: 'Convention Centre' }, courthouse : { code: '9363', value: 'Courthouse' }, cultural_centre : { code: '7319', value: 'Cultural Centre' }, dentist : { code: '9374', value: 'Dentist' }, doctor : { code: '9373', value: 'Doctor' }, embassy : { code: '7365', value: 'Embassy' }, exhibition_centre : { code: '7385', value: 'Exhibition Centre' }, ferry_terminal : { code: '7352', value: 'Ferry Terminal' }, forest_area : { code: '9387', value: 'Forest Area' }, frontier_crossing : { code: '7366', value: 'Frontier Crossing' }, general : { code: '9600', value: 'General POI' }, golf_course : { code: '9911', value: 'Golf Course' }, government_office : { code: '7367', value: 'Government Office' }, hospital_polyclinic : { code: '7321', value: 'Hospital/Polyclinic' }, hotel_or_motel : { code: '7314', value: 'Hotel or Motel' }, ice_skating_rink : { code: '9360', value: 'Ice Skating Rink' }, important_tourist_attraction : { code: '7376', value: 'Important Tourist Attraction' }, industrial_building : { code: '9383', value: 'Industrial Building' }, leisure_centre : { code: '9378', value: 'Leisure Centre' }, library : { code: '9913', value: 'Library' }, military_cemetery : { code: '9915', value: 'Military Cemetery' }, military_installation : { code: '9388', value: 'Military Installation' }, monument : { code: '9917', value: 'Monument' }, mountain_pass : { code: '9935', value: 'Mountain Pass' }, mountain_peak : { code: '9364', value: 'Mountain Peak' }, museum : { code: '7317', value: 'Museum' }, music_centre : { code: '9372', value: 'Music Centre' }, nightlife : { code: '9379', value: 'Nightlife' }, open_parking_area : { code: '7369', value: 'Open Parking Area' }, opera : { code: '9365', value: 'Opera' }, park_and_recreation_area : { code: '9362', value: 'Park and Recreation Area' }, parking_garage : { code: '7313', value: 'Parking Garage' }, petrol_station : { code: '7311', value: 'Petrol Station' }, pharmacy : { code: '7326', value: 'Pharmacy' }, place_of_worship : { code: '7339', value: 'Place of Worship' }, police_station : { code: '7322', value: 'Police Station' }, post_office : { code: '7324', value: 'Post Office' }, public_transport_stop : { code: '9942', value: 'Public Transport Stop' }, railway_station : { code: '7380', value: 'Railway Station' }, rent_a_car_facility : { code: '7312', value: 'Rent-a-Car Facility' }, rent_a_car_parking : { code: '9930', value: 'Rent-a-Car Parking' }, rest_area : { code: '7395', value: 'Rest Area' }, restaurant : { code: '7315', value: 'Restaurant' }, restaurant_area : { code: '9359', value: 'Restaurant Area' }, scenic_panoramic_view : { code: '7337', value: 'Scenic / Panoramic View' }, school : { code: '7372', value: 'School' }, shop : { code: '9361', value: 'Shop' }, shopping_centre : { code: '7373', value: 'Shopping Centre' }, sports_centre : { code: '7320', value: 'Sports Centre' }, stadium : { code: '7374', value: 'Stadium' }, swimming_pool : { code: '7338', value: 'Swimming Pool' }, tennis_court : { code: '9369', value: 'Tennis Court' }, theatre : { code: '7318', value: 'Theatre' }, tourist_information_office : { code: '7316', value: 'Tourist Information Office' }, veterinarian : { code: '9375', value: 'Veterinarian' }, water_sport : { code: '9371', value: 'Water Sport' }, winery : { code: '7349', value: 'Winery' }, yacht_basin : { code: '9380', value: 'Yacht Basin' }, zoo : { code: '9927', value: 'Zoo' } } // :: poi overlays var poi_overlays = { transport_links : { label: 'Transport Links', filter : poi_types.ferry_terminal.code + ',' + poi_types.railway_station.code + ',' + poi_types.public_transport_stop.code, image : '/share/travel_demo/i/train1.gif', size : new MMDimensions( 24, 24 ) }, schools_and_colleges : { label: 'Schools and Colleges', filter : poi_types.college_university.code + ',' + poi_types.school.code, image : '/share/travel_demo/i/college_new.gif', size : new MMDimensions( 24, 24 ) }, healthcare : { label: 'Healthcare', filter : poi_types.hospital_polyclinic.code, image : '/share/travel_demo/i/hospital_new.gif', size : new MMDimensions( 24, 24 ) }, recreation : { label: 'Recreation', filter : poi_types.golf_course.code + ',' + poi_types.park_and_recreation_area.code+ ',' + poi_types.beach.code + ',' + poi_types.stadium.code + ',' + poi_types.yacht_basin.code + ',' + poi_types.sports_centre.code, image : '/share/travel_demo/i/leisure_new.gif', size : new MMDimensions( 28, 26) }, shopping : { label : 'Shopping', filter : poi_types.shopping_centre.code + ',' + poi_types.shop.code, image : '/share/travel_demo/i/shop_new.gif', size : new MMDimensions( 26, 23 ) } }; // :: /Default setting // ==================================================== // ==================================================== var mapviewer = false; var mapviewer_zoom_in_on_marker_click = false; var poi_el = false; var script_tag, timeout; var last_request_num = 0; var old_script_tags = []; var geocoder_el = false; var geocoder_form = false; var geocoder; var search_el = false; var search_form = false; var search_new = true; var search, seacher, search_start_location; var route_el = false; var route_finder, route; var route_overlays = []; var errors_el = false; var ambiguous_el = false; var results_list_el = false; // ==================================================== // ==================================================== function initMapviewer () { if ( !document.getElementById ( mapviewer_id ) ) return false; if ( !show_mapviewer) { document.getElementById ( mapviewer_id ).style.display = 'none'; return false; } // Add the map mapviewer = new MultimapViewer ( document.getElementById ( mapviewer_id ) ); mapviewer.setOption ( 'units', mapviewer_units ); makeGEMap(); mapviewer.removeMapType( MM_WORLD_AERIAL ); mapviewer.removeMapType( MM_WORLD_HYBRID ); mapviewer.addMapType( gemap ); mapviewer.drawAndPositionMap ( start_position ); // Add widgets for( var key in mapviewer_widgets ) { addWidget ( mapviewer_widgets [ key ] ) } // Add events handlers for( var key in mapviewer_events ) { addEventHandler ( mapviewer_events [ key ] ) } // Add marker onclick zoom in if required if (mapviewer_zoom_in_on_marker_click) { mapviewer.addEventHandler( 'openInfoBox', function( eventType, eventTarget, marker ) { var location = marker.getPosition(); location.zoom_factor = search_result_zoom_in.zoom_factor; mapviewer.goToPosition(location); }); } return true; } // ==================================================== // ==================================================== function initPOIs() { if (!document.getElementById(poi_id)) return false; if (!show_poi) { document.getElementById(poi_id).style.display = 'none'; return false; } // Populate POI types poi_el = document.getElementById(poi_id); for( var key in poi_overlays ) { if (!ul) { var ul = document.createElement('ul'); ul.className = 'poiTypes'; poi_el.appendChild(ul); } var li = document.createElement('li'); if (poi_type_checkbox_first) { li.innerHTML = '<' + 'input type="checkbox" id ="show_' + key + '" name="" onclick="displayCheckedPois()"/>' + '<' + 'label for="show_' + key + '" >' + poi_overlays[key].label + ''; } else { li.innerHTML = '<' + 'label for="show_' + key + '" >' + poi_overlays[key].label + '' + '<' + 'input type="checkbox" id ="show_' + key + '" name="" onclick="displayCheckedPois()"/>'; } ul.appendChild(li); } // Add event handlers to update POIs mapviewer.addEventHandler( 'endPan', mapChanged ); mapviewer.addEventHandler( 'changeZoom', mapChanged ); return true; } // ========================== // Called on pans/zooms to re-search POIs function mapChanged(first, second, third, fourth, reason) { // If the map moved because an infobox popped up, don't re-search if (reason == 'infobox') { return; } displayCheckedPois(); } // ========================== function displayCheckedPois() { for( var key in poi_overlays ) { var el = document.getElementById( 'show_'+key ); if( el ) { if( el.checked ) { displayPoiType( key ); } else { hidePoiType( key ); } } } } // ========================== function hidePoiType ( key ) { var results = poi_overlays[key].results; // Remove all the markers from this type of POI from the map if( results ) { var result_count = results.length; for( var i = 0; i < result_count; i++ ) { if( results[i].infoBoxOpened() ) results[i].closeInfoBox(); mapviewer.removeOverlay( results[i] ); } } } // ========================== function displayPoiType( key ) { var centre = mapviewer.getCurrentPosition(); var url = poi_type_url; url += '&lon='+centre.lon+'&lat='+centre.lat; url += '&poi_types='+escape(poi_overlays[key].filter); url += '&callback=poiCallback&identifier='+key; // Create JSON script tag if( poi_overlays[key].script_tag ) old_script_tags.push( poi_overlays[key].script_tag ); var st = document.createElement( 'script' ); st.type = 'text/javascript'; st.src = url; poi_overlays[key].script_tag = st; loadingStatus(poi_el, true); document.getElementsByTagName( 'head' )[0].appendChild( st ); } // ========================== function poiCallback( key, results ) { // Don't display anything if check-box unchecked for this POI type if( ! document.getElementById( 'show_'+key ).checked ) return; // Remove old icons for POI type var old_results = poi_overlays[key].results; if( old_results ) { var result_count = old_results.length; for( var i = 0; i < result_count; i++ ) { if( old_results[i].infoBoxOpened() ) old_results[i].closeInfoBox(); mapviewer.removeOverlay( old_results[i] ); } } poi_overlays[key].results = null; // Turn off POI loading spinner loadingStatus(poi_el, false); var poi_markers = []; // Loop round JSON results from browse.cgi for( var i = 0; i < results.locationData.length - 1; i++ ) { var poi_results = results.locationData[i]; var point = new MMLatLon( Number(poi_results.lat), Number(poi_results.lon) ); // Grab the icon and icon size for this POI type var icon = undefined; if ( poi_overlays[key].image ) { var icon = new MMIcon (); icon.image = poi_overlays[key].image; icon.iconSize = poi_overlays[key].size; icon.iconAnchor = new MMPoint( Math.floor( icon.iconSize.width / 2 ), Math.floor( icon.iconSize.height / 2 ) ); icon.infoBoxAnchor = new MMPoint( Math.floor( icon.iconSize.width / 2 ), 0 ); } // Create POI marker var marker = mapviewer.createMarker( point, { label: poi_results.name, icon: icon} ); // Create info box HTML var html = "

"+poi_results.name+"

"; var addr = ''; if (poi_results.street && poi_results.street != '') {addr += poi_results.street + '
'; } if (poi_results.town && poi_results.town != '') {addr += poi_results.town + '
'; } if (poi_results.pc && poi_results.pc != '') {addr += poi_results.pc; } if (addr != '') html += '

'+addr+'

'; if( poi_results.telephone && poi_results.telephone != '' ) html += '

Telephone: '+poi_results.telephone.replace( / /g, " " )+'

'; if( poi_results.url && poi_results.url != '' ) { if( poi_results.url.substring( 0, 7 ) != 'http://' ) { poi_results.url = 'http://'+poi_results.url; } html += '

Visit Website

'; } marker.setInfoBoxContent ( html ); poi_markers.push( marker ); } poi_overlays[key].results = poi_markers; } // ==================================================== // ==================================================== function addWidget ( widget ) { //Add widget switch ( widget.type ) { case widget_types.pan_zoom : var obj = new MMPanZoomWidget(widget.position, widget.class_name, widget.slider); break; case widget_types.small_pan_zoom : var obj = new MMSmallPanZoomWidget(widget.position, widget.class_name, widget.slider); break; case widget_types.small_zoom : var obj = new MMSmallZoomWidget(widget.position, widget.class_name, widget.slider ); break; case widget_types.map_type : var obj = new MMMapTypeWidget(widget.types, widget.position, widget.class_name); break; case widget_types.location : var obj = new MMLocationWidget(widget.options, widget.position, widget.class_name); break; case widget_types.overview : var obj = new MMOverviewWidget(widget.delta, widget.dimensions, widget.position, widget.class_name); break; case widget_types.tools : var obj = new MMToolsWidget(widget.label, widget.position, widget.class_name); break; case widget_types.local_info : var obj = new MMLocalInfoWidget(widget.label, widget.position, widget.class_name); break; } mapviewer.addWidget( obj ); } // ========================== function addEventHandler ( event_handler ) { //Add event handler mapviewer.addEventHandler ( event_handler.event_name, event_handler.function_name ); } // ==================================================== // ==================================================== function initGeocoder () { if ( !document.getElementById ( geocoder_id ) || !document.getElementById ( geocoder_id ).getElementsByTagName ( 'form' )[0]) return false; if ( !show_geocoder ) { document.getElementById ( geocoder_id ).style.display = 'none'; if ( document.getElementById ( errors_id ) ) { document.getElementById ( errors_id ).style.display = 'none'; } if ( document.getElementById ( results_list_id ) ) { document.getElementById( results_list_id ).style.display = 'none'; } return false; } geocoder_el = document.getElementById(geocoder_id); geocoder_form = geocoder_el.getElementsByTagName('form')[0]; if (document.getElementById(errors_id)) errors_el = document.getElementById(errors_id); if (show_results_list && document.getElementById(results_list_id)) results_list_el = document.getElementById(results_list_id); // Use standard geocoder for location search geocoder = new MMGeocoder( processGeocoderResults ); geocoder_form.onsubmit = function () {return doGeocoder ();document.getElementById('pic').style.visibility = 'hidden'; }; return true; } // ========================== function doGeocoder () { // clear any existing items from previous geocoding requests cleanUp (); // Add dynamic geocoder params: // format for address param input filed name is 'a_/param_name' var address = new MMAddress(); var form_elements = geocoder_form.elements; for (i = 0; i < form_elements.length; i++) { var el = form_elements[i]; if ( el.name ) { var name_parts = el.name.split('/'); var tag_name = el.tagName.toLowerCase(); var value = undefined; if ( ( tag_name == 'input' && el.type && ((el.type == 'checkbox' || el.type == 'radio' ) && el.checked) || el.type == 'text' || el.type == 'hidden' ) || tag_name == 'select' || tag_name == 'textarea' ) { value = el.value; } if ( value && name_parts.length == 2 && name_parts[0] == 'a_') { address [ name_parts[1] ] = value; } } } // perform the geocode loadingStatus ( geocoder_el, true ) geocoder.geocode ( address ); return false; } // ========================== function processGeocoderResults() { //console.log ( geocoder ); // callback function registered with the Geocoder to handle geocoding results // Error - no results if (geocoder.error_code && geocoder.error_code != 'MM_GEOCODE_MULTIPLE_MATCHES') { var msg = err_geocoder_failed; if ( geocoder.error_code == 'MM_GEOCODE_NO_MATCHES' ) { msg = err_geocoder_no_matches; } displayError( true, msg ); loadingStatus( geocoder_el, false ); return false; } // Process results var results = geocoder.result_set; var markers = []; if (results.length > 0) { for( var i = 0; i < results.length; i++ ) { // Add a marker for each result var marker = createGeocoderResultMarker ( results[i], i ); markers.push(marker); // Create list DOM elements if (results_list_el) { if (!list) { } var li = createGeocoderResultListItem (results[i], i, marker ); list.appendChild( li ); } } //display all the results var location = mapviewer.getAutoScaleLocation( markers ); if( location.zoom_factor > 17 ) location.zoom_factor = 17; mapviewer.goToPosition( location ); loadingStatus( geocoder_el, false ); return false; } } // ========================== function createGeocoderResultMarker ( record, num ) { // Add a marker for each result var marker = mapviewer.createMarker( record, { 'label' : record.address.display_name, 'text' : num + 1 }); // Add an infobox for each result marker.setInfoBoxContent('

' + record.address.display_name + '<' + '/p>'); return marker; } // ========================== function createGeocoderResultListItem ( record, num, marker ) { var li = document.createElement( 'li' ); var a = document.createElement( 'a' ); a.href = '#'; a.onclick = onClickResult ( marker ); var a_text = record.address.display_name; a.appendChild( document.createTextNode( a_text ) ); li.appendChild( a ); return li; } // ==================================================== // ==================================================== function initSearch() { if (!document.getElementById(search_id) || !document.getElementById(search_id).getElementsByTagName('form')[0]) return false; if (!show_search) { document.getElementById(search_id).style.display = 'none'; if (document.getElementById(errors_id)) {document.getElementById(errors_id).style.display = 'none';} if (document.getElementById(ambiguous_id)) {document.getElementById(ambiguous_id).style.display = 'none';} if (document.getElementById(results_list_id)) {document.getElementById(results_list_id).style.display = 'none';} return false; } search_el = document.getElementById(search_id); search_form = search_el.getElementsByTagName('form')[0]; search_form.onsubmit = function () { return doSearch() }; if (document.getElementById(errors_id)) errors_el = document.getElementById(errors_id); if (document.getElementById(ambiguous_id)) ambiguous_el = document.getElementById(ambiguous_id); if (show_results_list && document.getElementById(results_list_id)) results_list_el = document.getElementById(results_list_id); // Set up new search and searcher objects search = new MMSearch(); searcher = new MMSearchRequester( processSearchResults ); loadingStatus( search_el, false ); if (perform_initial_search) { initialSearch(); } return true; } // ========================== function doSearch(lat, lon) { search_new = true; // Clear any existing items from previous search requests cleanUp(); // Search from new location if ( search_new ) { search = new MMSearch(); if (lat && lon) { var point = new MMLatLon(lat, lon); search.point = point; } while ( ambiguous_el && ambiguous_el.firstChild) { ambiguous_el.removeChild(ambiguous_el.firstChild); } ambiguous_el.style.display = 'none'; } // Add configuration search params for( var key in search_params ) { search [ key ] = search_params [key]; } // Add dynamic search params and filters: // format for address param input filed name is 'a_/param_name' // format for search param input filed name is 'p_/param_name' // format for filter input filed name is 'f_/field_name/operator' search.filters = []; var form_elements = search_form.elements; var address = new MMAddress(); for (i = 0; i < form_elements.length; i++) { var el = form_elements[i]; if ( el.name ) { var name_parts = el.name.split('/'); var tag_name = el.tagName.toLowerCase(); var value = undefined; if ( ( tag_name == 'input' && el.type && ((el.type == 'checkbox' || el.type == 'radio' ) && el.checked) || el.type == 'text' || el.type == 'hidden' ) || tag_name == 'select' || tag_name == 'textarea' ) { value = el.value; } if ( value && name_parts.length == 2 && name_parts[0] == 'a_') { address [ name_parts[1] ] = value; el.onchange = function () { search_new = true; } } if ( value && name_parts.length > 2 && name_parts[0] == 'f_' ) { search.filters.push( new MMSearchFilter( name_parts[1], name_parts[2], value ) ); } if ( value && name_parts.length == 2 && name_parts[0] == 'p_') { search [ name_parts[1] ] = value; } } } if ( search_new ) { search.address = address; search_new = false; } loadingStatus( search_el, true ); searcher.search ( search ); return false; } // ========================== function processSearchResults() { //console.log ( search ); //console.log ( searcher ); loadingStatus( search_el, false ); // Error - geocode had no matches if ( searcher.error_code && searcher.error_code == 'MM_GEOCODE_NO_MATCHES' ) { var msg = err_geocoder_no_matches; search_new = true; displayError ( true, msg ); loadingStatus ( search_el, false ); return false; } // Error - request failed if ( searcher.error_code && searcher.error_code != 'MM_GEOCODE_MULTIPLE_MATCHES' ) { var msg = err_search_failed; if ( show_error_code ) { msg += '

' + ( (searcher.error_explanation) ? searcher.error_explanation : '') + ' (' + searcher.error_code + ') <' + '/em><' + '/p>'; } search_new = true; displayError ( true, msg ); loadingStatus ( search_el, false ); return false; } // Error - multiple results if ( searcher.error_code && searcher.error_code == 'MM_GEOCODE_MULTIPLE_MATCHES' ) { results = searcher.result_set; var choicessel = false; // Find out if choices select is available var sels = ambiguous_el.getElementsByTagName('select'); for (i = 0; i < sels.length; i++) { if (sels[i].name == 'choices') { choicessel = sels[i]; break; } } // Clear if exists or create a new if (choicessel) { while( choicessel.childNodes.length > 0 ) { choicessel.removeChild( choicessel.childNodes[0] ); } } else { choicessel = document.createElement( 'select' ); choicessel.setAttribute('name', 'choices'); choicessel.setAttribute('id', 'choicessel'); choicessel.onchange = function () { if (this.value != '' ) { var coords = this.value.split(','); search.address = new MMAddress(); search.point = new MMLocation(new MMLatLon(coords[0], coords[1])); loadingStatus( search_el, true ); searcher.search ( search ); return false; } }; ambiguous_el.appendChild(choicessel); } // Create

' + caption + '

';} var addr = ''; if (record.street && record.street != '') {addr += record.street + '
'; } if (record.town && record.town != '') {addr += record.town + '
'; } if (record.pc && record.pc != '') {addr += record.pc; } if (addr != '') {html += '

'+addr+'

'; } if ( record.url ) { if ( record.url.substring( 0, 7 ) != 'http://' ) { record.url = 'http://'+record.url; } html += '

Visit Website

'; } if ( search_result_zoom_in.info_box_text != '' ) { html += '

' + search_result_zoom_in.info_box_text + '

'; } // Declutter search results markers if ( search_result_icon.groupName != '' ) mapviewer.declutterGroup( search_result_icon.groupName, {}, MM_DECLUTTER_AGGREGATE ); // Create marker var marker = mapviewer.createMarker( new MMLatLon( record.point.lat, record.point.lon) , { 'label': caption, icon: search_result_icon, text : num + 1 } ); marker.setInfoBoxContent (html); marker.setAttribute('lon', record.point.lon); marker.setAttribute('lat', record.point.lat); return marker; } // ========================== function createSearchResultListItem ( record, num, marker ) { var arrTmp = getResultFields(record, results_fields, ",").split(","); // creates row var row = document.createElement("tr"); row.onclick = onClickResult ( marker ); // cell 1 cell = document.createElement("td"); cellText = document.createTextNode((num+1)); cell.setAttribute("valign", "top"); cell.appendChild(cellText); cell.className = "td-bold"; row.appendChild(cell); // cell 2 cell = document.createElement("td"); var a = document.createElement( 'a' ); a.title = "Click to see dealer on map"; // a.onclick = onClickResult ( marker ); a.className = "td-bold"; a.href = '#'; var a_text = arrTmp[0]; a.appendChild( document.createTextNode( a_text ) ); cell.appendChild( a ); cell.setAttribute("valign", "top"); row.appendChild(cell); // cell 3 cell = document.createElement("td"); cellText = document.createTextNode(arrTmp[1]); cell.appendChild(cellText); cell.setAttribute("valign", "top"); row.appendChild(cell); //cell 4 cell = document.createElement("td"); cellText = document.createTextNode(arrTmp[2]); var br = document.createElement("br"); var cellText2 = document.createTextNode(arrTmp[3] + " " + arrTmp[4]); cell.appendChild(cellText); cell.appendChild(br); cell.appendChild(cellText2); cell.setAttribute("valign", "top"); row.appendChild(cell); return row; } // ==================================================== // ==================================================== function initRouting() { if ( show_route_steps && document.getElementById( route_id ) ) route_el = document.getElementById( route_id ); route_finder = new MMRouteRequester( processRoutingResults ); } function doRouting ( locations ) { loadingStatus( search_el, true ); //console.log ( locations ); route = new MMRoute( locations ); route_finder = new MMRouteRequester( processRoutingResults ); for( var key in route_params ) { route[ key ] = route_params [key]; } for( var i = 0, l = route_overlays.length; i < l; ++i ) { mapviewer.removeOverlay( route_overlays[i] ); } route_finder.request(route); } // ========================== function processRoutingResults () { //console.log ( route ); if (route.error_code) { var msg = err_routing_failed; if ( show_error_code ) { msg += '

' + ( (route.error_explanation) ? route.error_explanation : '') + ' (' + route.error_code + ') <' + '/em><' + '/p>'; } displayError(true, msg); loadingStatus( search_el, false ); return false; } route_overlays = []; displayError (false); mapviewer.goToPosition( mapviewer.getAutoScaleLocation( route.bounds ) ); if ( route_el ) { while (route_el.firstChild) { route_el.removeChild(route_el.firstChild); } displayStages (route, route_el); } for( var i = 0, l = route.polyLine.length; i < l; ++i ) { route_overlays.push ( route.polyLine[i] ); mapviewer.addOverlay( route.polyLine[i] ); } loadingStatus( search_el, false ); } var max_zindex = 1000; // ========================== function displayStages(route, container) { var curr_step = 1; var stages = route.stages; var h2 = document.createElement('h2'); h2.appendChild(document.createTextNode('Travel directions')); container.appendChild(h2); //var summary = ''; //summary += 'Start: ' + stages[0].start_address; //summary += '
End: ' + stages[stages.length - 1].end_address; //summary += '
Total Distance: ' + route.distance.miles + ' mile(s)'; //summary += '
Estimated Total Time: '; //if (route.duration.days > 0) { summary += route.duration.days + ' day(s) '; } //if (route.duration.hours > 0) { summary += route.duration.hours + ' hour(s) '; } //if (route.duration.minutes > 0) { summary += route.duration.minutes + ' minute(s) '; } //var p = document.createElement('p'); //p.innerHTML = summary; //container.appendChild(p); for (var count=0; count < stages.length; count++) { if (count == 0 ) createOverviewMarker(stages[count].start_point, 'Animate route...'); if (stages.length > 1) { var p = document.createElement('p'); p.appendChild(document.createTextNode('Stage ' + (count + 1))); container.appendChild(p); } var ol = document.createElement('ol'); ol.id = 'stage_' + count; ol.start = curr_step; var steps = stages[count].steps; for (var step_count=0; step_count < steps.length; step_count++) { var li = createRouteStepListItem ( steps[step_count], count, step_count, curr_step ) ol.appendChild(li); ++curr_step; } container.appendChild(ol); } container.style.display = 'block'; } // globalexplorer stuff var gemap; function makeGEMap() { var copyright = new MMCopyright( 1, [ new MMBounds( new MMLatLon( -90, -180 ), new MMLatLon( 90, 180 ) ) ], 1, "Microsoft" ); var copyrightCollection = new MMCopyrightCollection( 'Imagery: ' ); copyrightCollection.addCopyright( copyright ); var tilelayers = [ new MMTileLayer( copyrightCollection, 3, 19 ) ]; tilelayers[0].getTileUrl = GEGetTileUrl; gemap = new MMMapType( tilelayers, new MMMercatorProjection(20), "MS Aerial" ); } // ========================== function createRouteStepListItem ( record, stage, step, global_step_num ) { var instruction = record.instruction; var roadname = record.road_name; var roadnumber = record.road_number; var turndirection = record.turn_direction; if (roadname && roadnumber) { instruction += ' ' + roadname + ' (' + roadnumber + ') '; } else if (roadname) { instruction += ' ' + roadname + ' '; } else if (roadnumber) { instruction += ' ' + roadnumber + ' '; } var turnicon = ''; turnicon += ''; var distance = ''; if (record.distance.miles > 0 && route_params.distance_units == 'miles' ) { distance += record.distance.miles + ' mile(s) '; } if (record.distance.km > 0 && route_params.distance_units == 'km' ) { distance += record.distance.km + ' km '; } if (distance != '') { distance = ' | ' + distance }; var li = document.createElement('li'); var a = document.createElement( 'a' ); a.href = '#'; a.mmStage = stage; a.mmStep = step; a.mmInstruction = instruction; a.mmStepNum = global_step_num; a.onclick = function () { moveToStep (this.mmStage, this.mmStep, this.mmInstruction, this.mmStepNum); return false; }; a.innerHTML = instruction + distance + turnicon; li.appendChild( a ); return li; } var animationCurrentStage = 0; var animationCurrentStep = 0; var animationStageTotal = 0; var animationCurrentStepTotal = 0; var overviewMarkers = new Array(); var stepMarkers = new Array(); // ========================== function moveToNextStep () { var stepsList = document.getElementById('stage_' + animationCurrentStage); if (animationCurrentStep != 0) { var prevStepNode = stepsList.childNodes[animationCurrentStep-1].firstChild; prevStepNode.style.background = 'white'; } var stepNode = stepsList.childNodes[animationCurrentStep].firstChild; stepNode.style.background = 'yellow'; moveToStep (stepNode.mmStage, stepNode.mmStep, stepNode.mmInstruction, stepNode.mmStepNum ); animationCurrentStep++; if (animationCurrentStep == animationCurrentStepTotal) { stepNode.style.background = 'white'; clearInterval(animationInterval); } } // ========================== function moveToStep (stage, step, instruction, num) { for (var markerCount=0; markerCount < stepMarkers.length; markerCount++) { mapviewer.removeOverlay(stepMarkers[markerCount]); } var step_start = route.stages[stage].steps[step].start_point; var step_end = route.stages[stage].steps[step].end_point; createStepMarker ( step_start, instruction, num ); mapviewer.panToPosition(mapviewer.getAutoScaleLocation([step_start, step_end])); } // ========================== function createStepMarker(location, instruction, num ) { var marker = mapviewer.createMarker(location, { text: num } ); marker.setInfoBoxContent ('

' + instruction + '<' + '/p>'); stepMarkers.push ( marker ); marker.openInfoBox (); } // ========================== function createOverviewMarker(location, display_name) { var marker = mapviewer.createMarker( location, {text : 'x' } ); marker.setInfoBoxContent ('

' + display_name + '

'); overviewMarkers.push(marker); } // ========================== function playRoute () { animationCurrentStage = 0; animationCurrentStep = 0; animationStageTotal = route.stages.length; animationCurrentStepTotal = document.getElementById('stage_0').childNodes.length; //console.log( 'playRoute' ); moveToNextStep(); animationInterval = setInterval(moveToNextStep,2000); } // ==================================================== // ==================================================== function loadingStatus( container, bool ) { // If we're loading values we want to disable the form elements // and change presentation to show activity var form_elements = container.getElementsByTagName('input'); for (i = 0; i < form_elements.length; i++) { form_elements[i].disabled = bool; } var form_elements = container.getElementsByTagName('select'); for (i = 0; i < form_elements.length; i++) { form_elements[i].disabled = bool; } var form_elements = container.getElementsByTagName('textarea'); for (i = 0; i < form_elements.length; i++) { form_elements[i].disabled = bool; } class_name = container.className; class_name = class_name.replace( /loading/, '' ); if (bool) class_name += 'loading'; container.className = class_name; } // ========================== function cleanUp() { // Remove any existing markers from the map mapviewer.removeAllOverlays(); // Clean up prev results if ( search_new ) { while ( ambiguous_el && ambiguous_el.firstChild) { ambiguous_el.removeChild(ambiguous_el.firstChild); } ambiguous_el.style.display = 'none'; } while (results_list_el && results_list_el.firstChild) { results_list_el.removeChild(results_list_el.firstChild); } while (route_el && route_el.firstChild) { route_el.removeChild(route_el.firstChild); } displayError (false); } // ========================== function displayError ( show, msg ) { if (!errors_el) { if (show && msg) alert(msg); } else { if (show && msg) { errors_el.innerHTML = msg; errors_el.style.display = 'block'; } else { errors_el.innerHTML = ''; errors_el.style.display = 'none'; } } } // ========================== function onClickResult ( marker ) { return function() { marker.openInfoBox(); mapviewer.goToPosition( marker.getPosition() ); pageTracker._trackPageview('/dealer/view'); return false; }; } // ==================================================== // ==================================================== MMAttachEvent( window, 'load', function () { if (initMapviewer()) { initPOIs (); initSearch (); initGeocoder (); initRouting (); } } ); // var show_mapviewer = true; // populates mapviewer var start_position = new MMLocation ( new MMLatLon ( 52.01273, 5.67853 ), 7 ); var show_poi = true; // populates POI div var show_search = true; // populates search div var show_results_list = true; // populates resultslist div var results_list_text_field = 'name'; var mapviewer_zoom_in_on_marker_click = false; //var search_result_zoom_in = true; widget_types.local_info = {} var search_params = { data_source : 'mm.clients.electrolux_api_au', count : 10, start_index: undefined, order_by_fields : undefined, order_by_order : undefined, min_distance : undefined, max_distance : undefined, distance_units : 'miles', return_fields : undefined } search_result_icon.groupName = 'store_results'; // Create info box html function createSearchResultMarker ( record, num ) { var html =''; var caption = record.name; html += ''; if (caption != '') {html += "

"+caption+"

";} var addr = ''; if (record.street && record.street != '') {addr += record.street + '
'; } if (record.town && record.town != '') {addr += record.town + '
'; } if (record.pc && record.pc != '') {addr += record.pc + '
'; } if (record.telephone && record.telephone != '') {addr += record.telephone + "
"; } if (addr != '') {html += '

'+addr+'

'; } if ( record.url ) { if ( record.url.substring( 0, 7 ) != 'http://' ) { record.url = 'http://'+record.url; } html += '

Visit Website

'; } // html += "

Get directions to this Station

"; if ( search_result_zoom_in.info_box_text != '' && false) { html += '

' + search_result_zoom_in.info_box_text + '

'; } var store_info_tab = new MMInfoBoxTab( 'Station', html ); var tab_array = [store_info_tab]; // Create point and icon if ( search_result_icon.groupName != '' ) mapviewer.declutterGroup( search_result_icon.groupName, {}, MM_DECLUTTER_AGGREGATE ); // Create marker var marker = mapviewer.createMarker( new MMLatLon( record.point.lat, record.point.lon) , { 'label': caption, icon: search_result_icon, text: num + 1 } ); marker.setInfoBoxContent ( tab_array ); return marker; } // :: route var route_id = 'routesteps'; var route_params = { optimize_for : 'distance', // or 'time' mode : 'driving', // or 'walking' exclude : '', lang : 'en_gb', distance_units : 'miles' // or 'km' } var markers = [], infoboxes, mapviewer, polygon, osmmap, gemap, osmtilelayers, osmoverlay, mmmap; function makeGEMap() { var copyright = new MMCopyright( 1, [ new MMBounds( new MMLatLon( -90, -180 ), new MMLatLon( 90, 180 ) ) ], 1, "Globexplorer" ); var copyrightCollection = new MMCopyrightCollection( 'Imagery: ' ); copyrightCollection.addCopyright( copyright ); var tilelayers = [ new MMTileLayer( copyrightCollection, 3, 19 ) ]; tilelayers[0].getTileUrl = GEGetTileUrl; gemap = new MMMapType( tilelayers, new MMMercatorProjection(20), "Aerial" ); } function loadMap() { var widget = new MMPanZoomWidget(); var mapviewerdiv = document.getElementById( 'mapviewer' ); //makeGEMap(); mapviewer = new MultimapViewer( mapviewerdiv, gemap ); //mapviewer.addMapType( MM_WORLD_MAP ); mapviewer.goToPosition( new MMLocation( new MMLatLon(53.4796,-2.2553), 14 ) ); //mapviewer.goToPosition( new MMLocation( new MMLatLon(53.4114,-2.9808), 18 ) ); //mapviewer.goToPosition( new MMLocation( new MMLatLon( 51.51642,-0.1252 ), 14 ) ); //mapviewer.addWidget( widget ); //mapviewer.addWidget( new MMMapTypeWidget() ); } function GEGetTileUrl( a, b ) { return 'http://www.globexplorer.com/tiles/img?p=1&key=sRLcLRc0f0CYyCZAzaVhtEHkmNe7YuXA1lRbYQ44YzWKug75FoUSc91RAyUb6G8Z&n=1&l=4&t=a&xi='+a.x+'&yi='+(a.y-0)+'&z='+(b-1); } // END // ========================== function getResultFields(result, fields, separator) { var fields = fields.split(','); var str = ''; for (j = 0; j < fields.length; j++) { if (j >0) { str += separator; } str += result[fields[j]]; } return str; } // SETTINGS START var show_mapviewer = true; // populates mapviewer var show_poi = false; // populates POI div var show_search = true; // populates search div var show_results_list = true; // populates resultslist div client_name = 'electrolux_api_au'; // table name var poi_type_checkbox_first = false; var results_fields = 'name,telephone,street,pc,town'; poi_type_url = 'http://www.multimap.com' + poi_type_url; // store_search_url = 'http://www.multimap.com' + store_search_url; // :: icon params var store_icon_scr_prefix = 'http://www.electrolux.com.au/Files/images/DealerLocator/Location/store'; var store_icon_size = new MMDimensions( 32, 37 ); var store_icon_anchor = new MMPoint( 32, 37 ); var store_icon_info_box_anchor = new MMPoint( 16, 10 ); //var start_position = new MMLocation ( new MMLatLon( 59.33272, 18.06445 ), 5 ); var start_position = new MMLocation ( new MMLatLon( -25.38024, 138.41177 ), 4 ); // SETTINGS END