// JavaScript Document

var map;
var directionsPanel;
var directions;
var localSearch = new GlocalSearch();

var icon = new GIcon();
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(9, 2);
icon.infoShadowAnchor = new GPoint(18, 25);


var geocoder = new GClientGeocoder();

function createMarker(point_near, icon_near, popuphtml) {
    var popuphtml = "<div id=\"popup\">" + popuphtml + "<\/div>";
    var marker_near = new GMarker(point_near, icon_near);
    GEvent.addListener(marker_near, "click", function() {
        map.addOverlay(marker_near);
		marker_near.openInfoWindowHtml(popuphtml);
		
    });
    return marker_near;
}

function closestMarkerSearch(map, markers, zoom, address,closest_usr_details,closest_user_ids) {
   $('postcode').innerHTML='<div id="progress"></div>';
   $('postcode').show();
   $('direction').innerHTML="";
   
   if (markers.length == 0) {
        throw new Exception('No stockist');
    }
	address_uk = address + ", UK"; 
	usePointFromPostcode(address,
    					function (point) {
     							var distance;
            					var closestDistance = null;
            					var closestMarker = null;
            					for (var i = 0; i < markers.length; i++) {
               					 distance = point.distanceFrom(markers[i].getLatLng());
                					if (closestDistance === null || distance < closestDistance) {
                   						 closestDistance = distance;
                    				 	 closestMarker = markers[i];
										 closest_usr_detail=closest_usr_details[i];
										 closest_usr_id=closest_user_ids[i];
                					}
            					}
            					map.setCenter(closestMarker.latLng);
								map.setZoom(zoom);
            					add_split_arr = closest_usr_detail.split("<br/>");
								//alert(add_split_arr[0]);
								$('postcode').innerHTML="<h4>Your nearest stockist is:</h4>"+closest_usr_detail;
								$('postcode').show();
								var usr_address= $('address').value;
								$('direction').innerHTML="<br/><h5>For directions to "+add_split_arr[0]+" <a href='#' onclick=\"javascript:getdirection('"+usr_address+"','"+closest_usr_id+"');\">click here</a></h5>";
   								$('direction').show();
								GEvent.trigger(closestMarker, 'click');
			
								 
								 
      					});
	
}

function showAddress(range,address,source) {
  var uk_address=address+" UK";
  geocoder.getLatLng(
    uk_address,
    function(point) {
      if (!point) {
        alert("Your "+uk_address + " not found");
      } 
	  else 
	  	get_codes(range,address,source);
    }
  );
}


function showAddress_Dest(address) {
  var uk_address=address+" UK";
  geocoder.getLatLng(
    uk_address,
    function(point) {
      if (!point) {
        alert("Stokiest "+uk_address + " not found");
      } else {
       		map.setCenter(point, 13);
        	var marker = new GMarker(point);
        	map.addOverlay(marker);
        	marker.openInfoWindowHtml(uk_address);
	  }
    }
  );
}



function getdirection(from,to) {
  path = from+", UK to "+to+", UK";
  //alert(path);
  directionsPanel = document.getElementById("my_textual_div");
  document.getElementById("my_textual_div").innerHTML="";
  map.setCenter(new GLatLng(54.622978,-2.592773), 15);
  directions = new GDirections(map, directionsPanel);
  directions.clear();
  directions.load(path);
}

function usePointFromPostcode(postcode, callbackFunction) {
	
	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);
				callbackFunction(point);
			}else{
				alert("Postcode not found!");
			}
		});	
		
	localSearch.execute(postcode + ", UK");
}

function placeMarkerAtPoint(point)
{
	map.setCenter(point, 5);
	var marker = new GMarker(point,icon);
	map.addOverlay(marker);
	
	
}

function setCenterToPoint(point)
{
	map.setCenter(point, 13);
}

function showPointLatLng(point)
{
	alert("Latitude: " + point.lat() + "\nLongitude: " + point.lng());
}


function get_codes(range,code,source)
{ 

var post_val="range="+range+"&code="+code;
var source_file = source+"/stockist.php";

new Ajax.Request(source_file, {
		
			method:'post', asynchronous:true,
			onComplete: function show(transport) {
				
				 var respose = transport.responseText;
				
				 if (transport.responseText == "Error" )  {
				 
					 	$('postcode').innerHTML='error';
					 	$('postcode').show();
						return false;
							 
				 
				 } else {
				    
				 		newpoints = new Array();
						near_user_details = new Array();
						near_user_id = new Array();
						var markers = new Array();
						
						eval(transport.responseText);
						
						if(newpoints.length > 0 ) {
						
						map.clearOverlays();				
		
						for(var i = 0; i < newpoints.length; i++) {
							var point_near = new GPoint(newpoints[i][1],newpoints[i][0]);
							var popuphtml = newpoints[i][4];
							near_user_details[i] = newpoints[i][5];
							near_user_id[i] = newpoints[i][6];
							var marker_near = createMarker(point_near,newpoints[i][2],popuphtml);
							markers.push(marker_near);
							
						}
                       
                        closestMarkerSearch(map,markers, 13, $('address').value,near_user_details,near_user_id);
						}
						else
							{
								$('postcode').innerHTML='Sorry, We could not find your nearest stockist.';
   								map.clearOverlays();
								map.setCenter(new GLatLng(54.622978,-2.592773), 5);
								$('postcode').show();
							}
					
						
				 } 
			}, 
			
			onLoading:function(transport) {
			
				$('postcode').innerHTML='<div id="progress"></div>';
				$('postcode').show(); 
			
			}, postBody:post_val
		});
}




function mapLoad() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		
		
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(54.622978,-2.592773), 5);
		
	}
}

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();
	  }
	}
}

addLoadEvent(mapLoad);
addUnLoadEvent(GUnload);
