
﻿var BmlGoogleMaps=Class.create({geoTolerance:0.000001,postcodeTolerance:0.004,milesInLat:1/60,milesInLng:1/38,initialize:function(mapElementId){var myOptions={zoom:16,mapTypeId:google.maps.MapTypeId.ROADMAP}
this.map=new google.maps.Map($(mapElementId),myOptions);this.geocoder=new google.maps.Geocoder();this.markers=[];this.initSearchAPI();},initSearchAPI:function(){this.searchControl=new google.search.SearchControl();this.localSearch=new google.search.LocalSearch();this.searchControl.addSearcher(this.localSearch);var searchControlDiv=new Element('div');this.searchControl.draw(searchControlDiv);},initClickHandler:function(callbackFn){var thisObj=this;google.maps.event.addListener(this.map,'click',function(event){thisObj.geocoder.geocode({'latLng':event.latLng,'region':'UK'},function(results,status){if(status==google.maps.GeocoderStatus.OK){thisObj.extractAddressFromGeoResult(null,event.latLng,results,callbackFn);}else{alert("Geocoder failed - "+status);}});});},zoomToPostcode:function(postcode,callbackFn){var thisObj=this;this.doGeocodeSearchApi(postcode,function(point){if(point!=null){thisObj.map.setCenter(point,14);callbackFn(point.lat(),point.lng());}else{alert("Couldn't find location for postcode '"+postcode+"'");}});},clearMarkers:function(){for(var index=0;index<this.markers.length;index++){this.markers[index].setMap(null);if(this.markers[index].markerArea){this.markers[index].markerArea.setMap(null);}}
this.markers=[];},removeMarker:function(marker){marker.setMap(null);if(marker.markerArea){marker.markerArea.setMap(null);}
for(var i=0;i<this.markers.length;i++){if(this.markers[i]==marker){this.markers.splice(i,1);return;}}},removeLocationFromMarker:function(locMarker,mappedLoc){if(locMarker.companies.length>1){for(var i=0;i<locMarker.companies.length;i++){if(locMarker.companies[i].locations[0].locid==mappedLoc.locid){locMarker.companies.splice(i,1);}}
if(locMarker.companies.length>1){locMarker.setTitle("Multiple companies (click for list)");}else{locMarker.setTitle(locMarker.companies[0].locations[0].office);}}else{this.removeMarker(locMarker);}},geocodeShowAddress:function(location){var thisObj=this;thisObj.doGeocodeMapsApi(location.loc,function(pointLoc){thisObj.doGeocodeSearchApi(location.postcode,function(pointCode){var point=pointCode;if((pointLoc!=null)&&((pointCode==null)||((Math.abs(pointLoc.lat()-pointCode.lat())<thisObj.postcodeTolerance)&&(Math.abs(pointLoc.lng()-pointCode.lng())<thisObj.postcodeTolerance)))){point=pointLoc;}
if(point!=null){location.lat=point.lat();location.lng=point.lng();thisObj.storeGeocodeResult(location,point);}
thisObj.showAddress(location,point);});});},storeGeocodeResult:function(location,point){new Ajax.Request("AjaxRequest.aspx",{method:'get',parameters:{type:"updatelatlong",rnd:Math.random(),deliveryid:location.locid,lat:point.lat(),lng:point.lng()}});},showAddress:function(location,point){var bAddedLoc=false;if(point!=null){for(var index=0;index<this.markers.length;index++){var enumMarker=this.markers[index];if((Math.abs(enumMarker.position.lat()-point.lat())<this.geoTolerance)&&(Math.abs(enumMarker.position.lng()-point.lng())<this.geoTolerance)){this.addLocationToMarker(enumMarker,location);bAddedLoc=true;}}
if(!bAddedLoc){this.addMarker(location,point);}}
this.onAfterShowAddress(location,point);},onAfterShowAddress:function(){},addMarker:function(location,point){var iconPath="";var title=location.office;var bShowArea=false;if(location.locType=="deliver"){iconPath="images/mapDeliveryPin.png";}else if(location.locType=="collect"){iconPath="images/mapCollectPin.png";}else{iconPath="images/mapBuffetPin.png";bShowArea=true;}
var marker=new google.maps.Marker({map:this.map,position:point,icon:iconPath,title:title});marker.locations=[];marker.companies=[];this.addLocationToMarker(marker,location);this.markers.push(marker);var thisObj=this;google.maps.event.addListener(marker,"click",function(){thisObj.onMarkerClick(marker);});if(bShowArea){this.addMarkerArea(location,point,marker);}},addMarkerArea:function(location,point,marker){if(location.distance>0){var points=[];for(var n=0;n<32;n++){var angle=n*(2*Math.PI)/32;points.push(new google.maps.LatLng(point.lat()+location.distance*this.milesInLat*Math.cos(angle),point.lng()+location.distance*this.milesInLng*Math.sin(angle)));}
var markArea=new google.maps.Polygon({paths:points,strokeColor:"#FF0000",strokeOpacity:0.5,strokeWeight:2,fillColor:"#FF0000",fillOpacity:0.2});markArea.setMap(this.map);marker.markerArea=markArea;}},getLocationFromId:function(locId){for(var mark=0;mark<this.markers.length;mark++){for(var index=0;index<this.markers[mark].companies.length;index++){var company=this.markers[mark].companies[index];if(company.locations!=null){for(var loc=0;loc<company.locations.length;loc++){if(company.locations[loc].locid==locId){return company.locations[loc];}}}}}
return null;},addLocationToMarker:function(marker,location){marker.locations.push(location);var bFoundCompany=false;for(var index=0;index<marker.companies.length;index++){if(marker.companies[index].office==location.office){marker.companies[index].locations.push(location);bFoundCompany=true;}}
if(!bFoundCompany){var company={office:location.office,locations:[location]};marker.companies.push(company);if(marker.companies.length>1){marker.setTitle("Multiple companies (click for list)");}
this.onAddedCompanyToMarker(marker,company);}},onAddedCompanyToMarker:function(marker,company){},doGeocodeMapsApi:function(address,callbackFn){this.geocoder.geocode({'address':address,'region':'UK'},function(results,status){if(status==google.maps.GeocoderStatus.OK){callbackFn(results[0].geometry.location);}else{callbackFn(null);}});},doGeocodeSearchApi:function(address,callbackFn){var thisObj=this;this.searchControl.setSearchCompleteCallback(this,function(sc,searcher){if(searcher.results&&searcher.results.length>0){var resultLat=searcher.results[0].lat;var resultLng=searcher.results[0].lng;var point=new google.maps.LatLng(resultLat,resultLng);callbackFn(point);}else{callbackFn(null);}});this.searchControl.execute(address);},onMarkerClick:function(marker){if(marker.companies.length>1){this.showCompanyListPopup(marker);}else{this.showCompanyInfoPopup(marker,marker.companies[0]);}},showCompanyInfoPopup:function(marker,company){this.closeInfoWindow();this.showPopup(marker,this.getCompanyInfoContent(marker,company));},showCompanyListPopup:function(marker){this.closeInfoWindow();this.showPopup(marker,this.getCompanyListContent(marker));},showPopup:function(marker,content){this.infoWindow=new google.maps.InfoWindow({content:content});this.infoWindow.open(this.map,marker);},getCompanyInfoContent:function(marker,company){var thisObj=this;var location=company.locations[0];var contentHtml='<span class="mappopuphead">'+location.office+'</span><br/>'+location.loc+'<br/>';var linkText=this.getCompanyLinkText(location);var contentDiv=new Element('div');contentDiv.className="mappopup";contentDiv.style.width='160px';contentDiv.style.height='100px';contentDiv.innerHTML=contentHtml;if(linkText.length>0){var linkElement=appendNewElement(contentDiv,'a',"mappopup",-1,{href:'#'});linkElement.innerHTML=linkText;linkElement.onclick=function(){thisObj.onSelectedCompany(company);return false;};}
return contentDiv;},getCompanyLinkText:function(location){},getCompanyListContent:function(marker){var contentHtml="Select company name"+'<br/>';var contentDiv=new Element('div');contentDiv.className="mappopup";contentDiv.style.width='160px';contentDiv.style.height='100px';contentDiv.innerHTML=contentHtml;for(var index=0;index<marker.companies.length;index++){var company=marker.companies[index];var linkElement=appendNewElement(contentDiv,'a',"mappopup",-1,{href:'#'});linkElement.innerHTML=company.office;linkElement.onclick=this.createLocationPopupFunction(marker,company);contentDiv.appendChild(new Element('br'));}
return contentDiv;},createLocationPopupFunction:function(marker,company){var thisObj=this;return function(){thisObj.showCompanyInfoPopup(marker,company);return false;};},onSelectedCompany:function(company){},closeInfoWindow:function(){if(this.infoWindow){this.infoWindow.close();}},geocodePostcode:function(postcode,callbackFn){var thisObj=this;this.searchControl.setSearchCompleteCallback(this,function(sc,searcher){if(searcher.results&&searcher.results.length>0){var resultLat=searcher.results[0].lat;var resultLng=searcher.results[0].lng;var point=new google.maps.LatLng(resultLat,resultLng);thisObj.map.setCenter(point);thisObj.map.setZoom(16);thisObj.reverseGeocodePoint(postcode,point,callbackFn);}else{alert(postcode+" not found");}});this.searchControl.execute(postcode);},reverseGeocodePoint:function(postcode,point,callbackFn){var thisObj=this;this.geocoder.geocode({'latLng':point,'region':'UK'},function(results,status){if(status==google.maps.GeocoderStatus.OK){thisObj.extractAddressFromGeoResult(postcode,point,results,callbackFn);}else{alert(point+" not found - "+status);}});},extractAddressFromGeoResult:function(postcode,point,results,callbackFn){var streetAddress=this.findTypeInList(results,"street_address");if(streetAddress==null){streetAddress=results[0];}
var addressObj=null;if(streetAddress!=null){addressObj={address1:this.getAddressName(streetAddress.address_components,"route"),address2:this.getAddressName(streetAddress.address_components,"locality"),address3:this.getAddressName(streetAddress.address_components,"administrative_area_level_2"),postcode:(postcode!=null&&postcode.length>0)?postcode.toUpperCase():this.getAddressName(streetAddress.address_components,"postal_code"),lat:point.lat(),lng:point.lng()};}else{addressObj={address1:'',address2:'',address3:'',postcode:'',lat:0,lng:0};}
callbackFn(addressObj);},getAddressName:function(list,typeName){var addressLine=this.findTypeInList(list,typeName);if(addressLine!=null){return addressLine.long_name;}
return"";},findTypeInList:function(list,typeName){for(var n=0;n<list.length;n++){if(list[n].types){for(var m=0;m<list[n].types.length;m++){if(list[n].types[m]===typeName){return list[n];}}}}
return null;}});