// JavaScript Document
/*
  copyright (c) 2009 Google inc.

  You are free to copy and use this sample.
  License can be found here: http://code.google.com/apis/ajaxsearch/faq/#license
  
  
  how it works:
  1. get the value of the postalcode field
  2. look for this point on google map and get long and lat
  3. check one by one in the list calculating distance
  3.a if is close to the point get it
  3.b if not, not.
  
*/
var localSearch = new GlocalSearch();
var icon = new GIcon();
var map;
 var side_bar_html = "";
    var gmarkers = [];
    var htmls = [];
    var i = 0;
    var timeOut = 10;
    var timeOut1 = 700;
    var ii = 0;
	 
var icons = [];	 
var cnt = 0;	 
var resultLat;
var resultLng;

icon.image = "http://www.google.com/mapfiles/marker.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(10, 34);
icon.infoWindowAnchor = new GPoint(10,2); 
function mapLoad()
{
 
    if (GBrowserIsCompatible()) {
	 
    var baseIcon = new GIcon;
    baseIcon.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
    baseIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    baseIcon.iconSize = new GSize(12, 20);
    baseIcon.shadowSize = new GSize(22, 20);
    baseIcon.iconAnchor = new GPoint(6, 20);
    baseIcon.infoWindowAnchor = new GPoint(5, 1);
    
    icons[0] = baseIcon;
	
	map = new GMap2(document.getElementById("map"));
    map.addControl(new GLargeMapControl);
    map.addControl(new GMapTypeControl);
    map.setCenter(new GLatLng(54.622978,-2.592773), 5, G_HYBRID_MAP);
 
    
    //readMap("data.xml");	 
	 
} else {
    alert("Sorry, the Google Maps API is not compatible with this browser!");
}

}
	function createMarker(point, name, html, flag) {
        var marker = new GMarker(point, icons[flag]);
      GEvent.addListener(marker, "click", function () {marker.openInfoWindowHtml(html);});        
//	marker.openInfoWindowHtml(html);
        gmarkers[i] = marker;
        htmls[i] = html;
        side_bar_html += "<div style=\"padding:5px;\"><a href=\"javascript:myclick(" + i + ")\">" + name + "</a><br></div>";
	
	var obj = document.getElementById("info");
	//alert(obj.value);
	obj.style.visibility = "visible";

	if(obj.innerHTML == "undefined")
	{obj.innerHTML = "";}
	obj.innerHTML = obj.innerHTML + html + "<hr />";

        i++;
        return marker;
    }

 	function myclick(i) {		
        gmarkers[i].openInfoWindowHtml(htmls[i]);		
    }
 
    function readMap(url) {
        var request = GXmlHttp.create();
        request.open("GET", url, true);
        request.onreadystatechange = function () 
		{
			  if (request.readyState == 4) 
			  {
				  var xmlDoc = GXml.parse(request.responseText);
				  markers = xmlDoc.documentElement.getElementsByTagName("marker");
				  var iMax = markers.length;
				  // document.getElementById("loading").style.visibility = "visible";
				  window.setTimeout(startmap, timeOut1);
			  }
		 };
        request.send(null);
    }
 

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//:::                                                                         :::
//:::  This routine calculates the distance between two points (given the     :::
//:::  latitude/longitude of those points). It is being used to calculate     :::
//:::  the distance between two ZIP Codes or Postal Codes using our           :::
//:::  ZIPCodeWorld(TM) and PostalCodeWorld(TM) products.                     :::
//:::                                                                         :::
//:::  Definitions:                                                           :::
//:::    South latitudes are negative, east longitudes are positive           :::
//:::                                                                         :::
//:::  Passed to function:                                                    :::
//:::    lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees)  :::
//:::    lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees)  :::
//:::    unit = the unit you desire for results                               :::
//:::           where: 'M' is statute miles                                   :::
//:::                  'K' is kilometers (default)                            :::
//:::                  'N' is nautical miles                                  :::
//:::                                                                         :::
//:::  United States ZIP Code/ Canadian Postal Code databases with latitude   :::
//:::  & longitude are available at http://www.zipcodeworld.com               :::
//:::                                                                         :::
//:::  For enquiries, please contact sales@zipcodeworld.com                   :::
//:::                                                                         :::
//:::  Official Web site: http://www.zipcodeworld.com                         :::
//:::                                                                         :::
//:::  Hexa Software Development Center © All Rights Reserved 2004            :::
//:::                                                                         :::
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

	function distance(lat1, lon1, lat2, lon2, unit) {
		var radlat1 = Math.PI * lat1/180
		var radlat2 = Math.PI * lat2/180
		var radlon1 = Math.PI * lon1/180
		var radlon2 = Math.PI * lon2/180
		var theta = lon1-lon2
		var radtheta = Math.PI * theta/180
		var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
		dist = Math.acos(dist)
		dist = dist * 180/Math.PI
		dist = dist * 60 * 1.1515
		if (unit=="K") { dist = dist * 1.609344 }
		if (unit=="N") { dist = dist * 0.8684 }
		return dist
	}   


     function startmap() {
      //  if (ii < markers.length) {
           // var keep = Math.min(ii + 1, markers.length);
			
			// reset counter
			var cnt = 0;
			var ii=0;
			var radius = document.getElementById("radius").value;

            while (ii < markers.length) {
                var lat = parseFloat(markers[ii].getAttribute("dLat"));
                var lng = parseFloat(markers[ii].getAttribute("dLng"));	
				var txt = "";
				
				// 115 is the counter: we dont have images before that id
				if( (markers[ii].getAttribute("vImg") != '') && (markers[ii].getAttribute("vImg").indexOf(".")>0))
					txt = txt+"<img src='/images/"+markers[ii].getAttribute("vImg")+"'><br/>";
				
				txt = txt+"<b>"+markers[ii].getAttribute("vCompany")+"</b>";			
				
				txt = txt+"<br/>"+markers[ii].getAttribute("vAdd1")+", "+markers[ii].getAttribute("vAdd2")+"<br/>";
				//txt = txt+"<br/>*"+markers[ii].getAttribute("vSearchtxt")+"*";
				
				if(markers[ii].getAttribute("vAdd3") != '')				
					txt = txt+markers[ii].getAttribute("vAdd3")+", ";
				if(markers[ii].getAttribute("vAdd4") != '')				
					txt = txt+markers[ii].getAttribute("vAdd4")+"<br/>";
				if(markers[ii].getAttribute("vAdd5") != '')				
					txt = txt+markers[ii].getAttribute("vAdd5")+"<br/>";					
				if(markers[ii].getAttribute("vTel") != '')				
					txt = txt+"Tel: "+markers[ii].getAttribute("vTel")+"";
				if(markers[ii].getAttribute("vInfo") != '')				
					txt = txt+"<br/>("+markers[ii].getAttribute("vInfo")+")";
					

/*

				//nirali
				var R = 6371; // km
				var dLat = (lat2-lat1).toRad();
				var dLon = (lon2-lon1).toRad(); 
				var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * Math.sin(dLon/2) * Math.sin(dLon/2); 
				var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
				var d = R * c;
				//alert()
				//nirali
				//if((lat > latcal1 && lat < latcal2) || (lng > lngcal1 && lng < lngcal2)) //nirali
*/

				if (distance(resultLat,resultLng,lat,lng,"K")<radius)
				{	
					cnt = cnt + 1; // update counter
					var point = new GLatLng(lat, lng);
						 var mNumber = ii + 1;
						 //var html = "Marker" + mNumber;
						 var html = txt;
					var label = "Marker" + mNumber;
					var flag = 0;
					var marker = createMarker(point, label, html, flag);
	
					map.addOverlay(marker);
				}	//nirali

                ii++;
            }
			
			document.getElementById("loading").style.display = "none";
			document.getElementById("buttsearch").disabled=false;
			//window.setTimeout(startmap, timeOut);
			//alert(cnt)
			if (cnt == 0) 
			{ 
				alert("Sorry there are no results within a radius of "+radius+" Km")
			}
			
			/* else 
			{ */
           /* if (document.getElementById("loadingMessage")) {
                document.getElementById("loadingMessage").innerHTML = "Loading Markers...<br><b>" + cnt + " of " + markers.length + "</b><br>";
	            document.getElementById("loading").style.visibility = "visible";				
            }*/
 

			/* } 
        } else {
           // document.getElementById("side_bar").innerHTML = side_bar_html;
			//	document.getElementById("side_bar").style.display = "block";
            document.getElementById("loading").style.visibility = "hidden";
            map.setMapType(G_HYBRID_MAP);
            ii = 0;
        }*/
    }
 

function placeMarkerAtPoint(point)
{
	var marker = new GMarker(point,icon);
	map.addOverlay(marker);	
	var zoomtmp = 7;	
	map.setCenter(marker.getLatLng(),zoomtmp);
}

function usePointFromPostcode(postcode, callbackFunction) {
	
	document.getElementById("loading").style.display = "block";
	document.getElementById("buttsearch").disabled=true;
	// clear "info" div
	clearDiv("info");

	// clear map
	clearMap();
	
	localSearch.setSearchCompleteCallback(null, 
		function() {			
			if (localSearch.results[0])	{		
				resultLat = localSearch.results[0].lat;
				resultLng = localSearch.results[0].lng;
				var point = new GLatLng(resultLat,resultLng);
				callbackFunction(point);
			}else{
				alert("Sorry, not found");
			}
		});	
		
	localSearch.execute(postcode + ", UK");
	readMap("/js/companies.xml");
}
 
/*
 function usePointFromAddress(address,dv, callbackFunction) {
	localSearch.setSearchCompleteCallback(null, 
		function() {	
			//alert(localSearch.results[0].lat);		
			if (localSearch.results[0])	{		
				resultLat = localSearch.results[0].lat;
				resultLng = localSearch.results[0].lng;
				//document.getElementById("res").innerText = resultLat + " and " + resultLng

				//document.getElementById(dv).innerText = document.getElementById(dv).innerText + resultLat + " and " + resultLng+"<br>";
				//alert(resultLat);
				//alert(resultLng);
				var point = new GLatLng(resultLat,resultLng);
				callbackFunction(point);
			}else{
				alert("Address not found!");
			}
		});	
		
	localSearch.execute(address + ", UK");
	readMap("companies.xml");
}
*/

// clear Google map
function clearMap() { 
	map.clearOverlays(); 
	return true;
} 

// clear Google map
function clearDiv(param) { 
	var obj = document.getElementById(param);
	if(obj.innerHTML != "undefined") {obj.innerHTML = "";}
	return true;
}
