var map;
var icon = new GIcon();
var to_htmls = [];
var from_htmls = [];
var htmls = [];
var gmarkers = [];
var x = 0
 var gdir
/*icon.image = "../images/mapIcon.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(26, 24);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(10, 34);*/
///////
/////car////////
var dirn = new GDirections();
var step = 5; // metres
      var tick = 10; // milliseconds
      var poly;
      var eol;
      var car = new GIcon();
          car.image="torquay_map/turtle.png"
          car.iconSize=new GSize(32,18);
          car.iconAnchor=new GPoint(16,9);
var k=0;
      var stepnum=0;
      var speed = "";   

      function animate(d) {
        if (d>eol) {
          document.getElementById("step").innerHTML = "<b>Trip completed</b>";
          document.getElementById("distance").innerHTML =  "Miles: "+(d/1609.344).toFixed(2);
          return;
        }
        var p = poly.GetPointAtDistance(d);
        if (k++>=180/step) {
          map.panTo(p);
          k=0;
        }
        marker.setPoint(p);
        document.getElementById("distance").innerHTML =  "Miles: "+(d/1609.344).toFixed(2)+speed;
        if (stepnum+1 < dirn.getRoute(0).getNumSteps()) {
          if (dirn.getRoute(0).getStep(stepnum).getPolylineIndex() < poly.GetIndexAtDistance(d)) {
            stepnum++;
            var steptext = dirn.getRoute(0).getStep(stepnum).getDescriptionHtml();
            document.getElementById("step").innerHTML = "<b>Next:</b> "+steptext;
            var stepdist = dirn.getRoute(0).getStep(stepnum-1).getDistance().meters;
            var steptime = dirn.getRoute(0).getStep(stepnum-1).getDuration().seconds;
            var stepspeed = ((stepdist/steptime) * 2.24).toFixed(0);
            step = stepspeed/2.5;
            speed = "<br>Current speed: " + stepspeed +" mph";
          }
        } else {
          if (dirn.getRoute(0).getStep(stepnum).getPolylineIndex() < poly.GetIndexAtDistance(d)) {
            document.getElementById("step").innerHTML = "<b>Next: Arrive at your destination</b>";
          }
        }
        setTimeout("animate("+(d+step)+")", tick);
      }
   GEvent.addListener(dirn,"load", function() {
        document.getElementById("controls").style.display="none";
        poly=dirn.getPolyline();
        eol=poly.Distance();
        map.setCenter(poly.getVertex(0),17);
        map.addOverlay(new GMarker(poly.getVertex(0),G_START_ICON));
        map.addOverlay(new GMarker(poly.getVertex(poly.getVertexCount()-1),G_END_ICON));
        marker = new GMarker(poly.getVertex(0),{icon:car});
        map.addOverlay(marker);
        var steptext = dirn.getRoute(0).getStep(stepnum).getDescriptionHtml();
        document.getElementById("step").innerHTML = steptext;
        setTimeout("animate(0)",2000);  // Allow time for the initial map display
      });

      GEvent.addListener(dirn,"error", function() {
        alert("Location(s) not recognised. Code: "+dirn.getStatus().code);
      });

      function start() {
        var startpoint = document.getElementById("saddr").value;
        var endpoint = document.getElementById("daddr").value;
        dirn.loadFromWaypoints([startpoint,endpoint],{getPolyline:true,getSteps:true});
      }          


////////////
function Markers(color){

// map.closeInfoWindow();
map.getInfoWindow().hide() 
   if (document.getElementById(color).checked==false) { // hide the marker
      for (var i=0;i<gmarkers.length;i++) {
         if (gmarkers[i].type==color)  {
            map.removeOverlay(gmarkers[i]);
         }
      }
   } else { // show the marker again
      for (var i=0;i<gmarkers.length;i++) {
         if (gmarkers[i].type==color)  {
            map.addOverlay(gmarkers[i]);
         }
      }
   }
}

//
GMap.prototype.centerAndZoomOnBounds = function(bounds) {
   var center_lat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) / 2.0;
   var center_lng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) / 2.0;
   var center = new GLatLng(center_lat,center_lng)
   map.setCenter(center, map.getBoundsZoomLevel(bounds));
}
//
var request;
// var bounds = new GBounds(Number.MAX_VALUE, Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); 
var bounds = new GLatLngBounds();
// Create our "tiny" marker icon 
var baseIcon = new GIcon();
/*baseIcon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
baseIcon.iconSize = new GSize(12, 20);
baseIcon.iconAnchor = new GPoint(6, 20);*/

baseIcon.image = "images/mapIcon.png";
baseIcon.iconSize = new GSize(76, 63);
baseIcon.iconAnchor = new GPoint(38, 63);
baseIcon.infoWindowAnchor = new GPoint(38, 63);

//baseIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
//baseIcon.shadowSize = new GSize(22, 20);
//baseIcon.infoWindowAnchor = new GPoint(5, 1);
baseIcon.imageMap = [4,0,0,4,0,7,3,11,4,19,7,19,8,11,11,7,11,4,7,0]; 
baseIcon.transparent = "mapIcons/mm_20_transparent.png";

var icons=[];

function coloredRideshareIcon(iconColor) {

      var icon = new GIcon(baseIcon);
      icon.image = "http://labs.google.com/ridefinder/images/mm_20_"+ color +".png";
      icons[iconColor]=icon;
   return icons[iconColor];
}
	

function addMarker(point, title, iconStr, infoUrl, x) {
   bounds.extend(point);
   var icon = baseIcon;
   var marker = new GMarker(point, icon);
 	gmarkers.push(marker);
   marker.type = iconStr; 
        htmls[x] ='<div id="googleForm"><div style="font-size:14px;font-weight:bold;margin-bottom:5px;color:#1e569f;">Website Vision</div><img src="images/googleImg.jpg" width="99" height="76" alt="website vision" style="float:left;border:1px solid #848484;margin-right:5px;" />90 Long Acre<br>Covent Garden<br>exeter<br>London, WC2E 9RZ<br>Tel: 0207 849 3260<br><br>For directions, enter your postcode below:' +
           '<form action="javascript:getDirections()">' +
           '<input type="text" style="width:100px;" SIZE=10 MAXLENGTH=40 name="saddr" id="saddr" value="" />&nbsp;&nbsp;' +
           '<INPUT value="Get Directions" TYPE="SUBMIT" class="but" style="width:90px;">' +
           '<input type="hidden" id="daddr" value="'+title+"@"+ point.lat() + ',' + point.lng() + 
           '"/></div>';

   
   
   
   GEvent.addListener(marker, "click", function () {
      marker.openInfoWindowHtml( htmls[x], {maxurl:infoUrl});
   });
  
   map.addOverlay(marker);


}

 function getDirections() {
	 
        var saddr = document.getElementById("saddr").value
        var daddr = document.getElementById("daddr").value
        
        //geocode supplied address
        
        var localSearch = new GlocalSearch();
			localSearch.setSearchCompleteCallback(null, 
			function() {
				if (localSearch.results[0])
				{		
					resultLat = localSearch.results[0].lat;
					resultLng = localSearch.results[0].lng;
					point = new GLatLng(resultLat,resultLng);
                    LtLng = String(resultLat+","+resultLng)
                    saddr = String(saddr + "@" + LtLng)
					setDirections(saddr, daddr, "en")
                    //dirn.loadFromWaypoints([saddr,daddr],{getPolyline:true,getSteps:true}); 
					}else{
					alert("Postcode not found!");
				}
			});	
		
		localSearch.execute(saddr + ", UK");
     //geocode supplied address
	
        
      }
function getDirectionsF() {

        var saddr = document.getElementById("saddr").value
        var daddr = document.getElementById("daddr").value

        //geocode supplied address
        
        var localSearch = new GlocalSearch();
			localSearch.setSearchCompleteCallback(null, 
			function() {
			
				if (localSearch.results[0])
				{		
					resultLat = localSearch.results[0].lat;
					resultLng = localSearch.results[0].lng;
					point = new GLatLng(resultLat,resultLng);
                    LtLng = String(resultLat+","+resultLng)
                    daddr = String(daddr + "@" + LtLng)
					setDirections(saddr, daddr, "en")
                    //dirn.loadFromWaypoints([saddr,daddr],{getPolyline:true,getSteps:true}); 
					}else{
					alert("Postcode not found!");
				}
			});	
		
		localSearch.execute(daddr + ", UK");
        
     //geocode supplied address
        
      }

      // This function picks up the click and opens the corresponding info window
      function myclick(x) {
        gmarkers[x].openInfoWindowHtml(htmls[x]);
      }

      // functions that open the directions forms
      function tohere(x) {
        gmarkers[x].openInfoWindowHtml(to_htmls[x]);
      }
      function fromhere(x) {
        gmarkers[x].openInfoWindowHtml(from_htmls[x]);
      }
      
 
function createRequest() {
	
	// create an Ajax Request
	
	var ajaxRequest;
	
	try
	{
		ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
	}		
		catch (e1)
		{
			try
			{
				ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
			}
				catch (e2)
				{
					ajaxRequest = new XMLHttpRequest();
				}
		}
	
	return ajaxRequest;
}

function usePointFromPostcodeViaCache(postcode, callbackFunction, pCode, cl, propUrl,x) {
	
	//map.clearOverlays();
	var ajax_connection = createRequest();
	
	ajax_connection.open('get', "includes/geocode.asp?postcode=" + postcode);
	
	// setup the function to deal with the reply
	ajax_connection.onreadystatechange = function(){
		
		if (ajax_connection.readyState == 4) {
			var xmlDoc = ajax_connection.responseXML;
			var markers = xmlDoc.documentElement.getElementsByTagName("location");
			
			if (markers.length > 0)
			{
				var resultLat = markers[0].getAttribute('latitude');
				var resultLng = markers[0].getAttribute('longitude');

				var point = new GLatLng(resultLat,resultLng);
				//document.getElementById("result").innerHTML += "Result forcame from cache."
				callbackFunction(point, pCode, cl, propUrl, x);
			}else{
				usePointFromPostcode(postcode, callbackFunction, pCode, cl, propUrl, x);
				//alert("Get postcodes")
			}
		}
	}	
	
	ajax_connection.send(null);
}

function usePointFromPostcode(postcode, callbackFunction, pCode, cl, propUrl,x) {
var localSearch = new GlocalSearch();
			localSearch.setSearchCompleteCallback(null, 
			function() {
			
				if (localSearch.results[0])
				{		
					var resultLat = localSearch.results[0].lat;
					var resultLng = localSearch.results[0].lng;
					var point = new GLatLng(resultLat,resultLng);
					//document.getElementById("result").innerHTML += "Result for " + postcode + " came from Google.";
					var ajax_connection = createRequest();
					ajax_connection.open('get', "includes/cache.asp?postcode=" + postcode + "&latitude=" + resultLat + "&longitude=" + resultLng);
					ajax_connection.send(null);
					callbackFunction(point, pCode, cl, propUrl,x);
				}else{
					alert("Postcode not found!");
				}
			});	
		
		localSearch.execute(postcode + ", UK");
}

function placeMarkerAtPoint(point)
{
	var marker = new GMarker(point,icon);
	map.addOverlay(marker);
}

function setCenterToPoint(point)
{
	map.setCenter(point, 17);
}
 function createMarker(point,html,infoUrl) {
        var marker = new GMarker(point);
        GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowHtml(html, {maxUrl:infoUrl});
        });
        return marker;
      }
function showPointLatLng(point)
{
	alert("Latitude: " + point.lat() + "\nLongitude: " + point.lng());
}
function addOverlayMap(point, propHTML, propURL) {
	map.addOverlay(createMarker(point, propHTML , propURL));
}

function mapLoad() {
	if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
		map.addControl(new GMapTypeControl ());
		map.addControl(new GSmallMapControl());
		map.enableContinuousZoom()
		//map.enableScrollWheelZoom()
		map.setCenter(new GLatLng(51.516431,-0.123296), 14, G_NORMAL_MAP);

		gdir = new GDirections(map, document.getElementById("directions")); 
        GEvent.addListener(gdir, "load", onGDirectionsLoad); 
        GEvent.addListener(gdir, "error", handleErrors); 
		//GDownloadUrl("includes/allProp.xml", function(data, responseCode) {  var xml = GXml.parse(data);
											//var markers = xml.documentElement.getElementsByTagName("location");
											//for (var i = 0; i < markers.length; i++) {    
												var point = new GLatLng(parseFloat(51.514031), parseFloat(-0.123296));
												var propUrl = "";
												var propHTML = String("Website Vision");
												var pCode = String("EX6 8HD");
												//
												//var color= Number(markers[i].getAttribute("typeID"));
												//var cl = 'red'
																								//var pNumber = x ++
										addMarker(point, "Website Vision", 'red', propUrl, 1)
							
																					//} 
											    
									//})
		
		
	}
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function addUnLoadEvent(func) {
	var oldonunload = window.onunload;
	if (typeof window.onunload != 'function') {
	  window.onunload = func;
	} else {
	  window.onunload = function() {
	    oldonunload();
	    func();
	  }
	}
}

///// directions ////
 
 
        
 function setDirections(fromAddress, toAddress, locale) { 
      gdir.load("from: " + fromAddress + " to: " + toAddress, 
                { "locale": locale }); 
    } 
function onGDirectionsLoad(){ 
          // Use this function to access information about the latest load() 
          // results. 
          enteredPostcode = document.getElementById("saddr").value;
            document.getElementById("directions").innerHTML = '<a href="http://maps.google.com/maps?f=d&hl=en&geocode=8926868973704302352,50.626217,-3.510218&time=&date=&ttype=&saddr=' + enteredPostcode + '&daddr=CoventGarden,+London,+WC2E+9RZ,+UK&mra=pi&mrcr=0&sll=50.626217,-3.510218&sspn=0.003415,0.007231&ie=UTF8&z=10&om=1&pw=2" target="_blank"><img src="images/print.gif" width="16" height="14" alt="print directions" border="0" style="margin-bottom:-4px;" /> Print Directions</a>'
          // e.g. 
     //document.getElementById("getStatus").innerHTML = gdir.getStatus().code; 
      // and yada yada yada... 
	  map.closeInfoWindow();
    } 


    function handleErrors(){ 
       if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS) 
         alert("Either the \"To\" or \"From\" geographic location cannot be found.\nPlease use a postal code or recognised city instead.\nThe postal code for St Thomas Church is NE1 7PF.\nError code: " + gdir.getStatus().code); 
       else if (gdir.getStatus().code == G_GEO_SERVER_ERROR) 
         alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code); 

       else if (gdir.getStatus().code == G_GEO_MISSING_QUERY) 
         alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code); 

    //   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong 
    //     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code); 

       else if (gdir.getStatus().code == G_GEO_BAD_KEY) 
         alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code); 

       else if (gdir.getStatus().code == G_GEO_BAD_REQUEST) 
         alert("A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code); 

       else alert("An unknown error occurred."); 

    }        

///////////////


addLoadEvent(mapLoad);
addUnLoadEvent(GUnload);