

var map;
var geocoder;
var directions;
var directionsPanel;
var poly;
var myPano;
var selectedSidebarEntry;
var svOverlay;
var loading_image = new Image();


// ====== Array for decoding the failure codes ======
var reasons=[];


initStoreLocator = function() {

	reasons[G_GEO_SUCCESS]            = "Success";
	reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
	reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
	reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
	reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
	reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
	reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
	reasons[G_GEO_BAD_REQUEST]        = "A directions request could not be successfully parsed.";
	reasons[G_GEO_MISSING_QUERY]      = "No query was specified in the input.";
	reasons[G_GEO_UNKNOWN_DIRECTIONS] = "The GDirections object could not compute directions between the points.";


	selectedSidebarEntry=false;
	svOverlay=false;

	if (google.maps.BrowserIsCompatible()) {
		geocoder = new GClientGeocoder();
		map = new google.maps.Map2(document.getElementById("map"));
		//map = new GMap2(document.getElementById('map'));
		map.setMapType(G_HYBRID_MAP);
		map.addControl(new google.maps.LargeMapControl3D());
		map.addControl(new google.maps.MapTypeControl());
		map.addControl(new google.maps.ScaleControl());
		map.setCenter(new google.maps.LatLng(40, -100), 4);
		directionsPanel = document.getElementById("directions_container");
		directions = new google.maps.Directions(null, directionsPanel);
	  }


  search_btn = document.getElementById('btn_search_locations');
  google.maps.Event.addDomListener(search_btn, 'click', searchLocations);
}

searchLocations = function() {
	var address = document.getElementById('addressInput').value;
	geocoder.getLocations(address, function(response) {
		if (!response || response.Status.code != 200) {
			alert("Sorry, we were unable to geocode that address. Reason: " + reasons[response.Status.code]);
		} else {
			 point = new google.maps.LatLng(response.Placemark[0].Point.coordinates[1],response.Placemark[0].Point.coordinates[0]);
			searchLocationsNear(point);
		}
	});

}

searchLocationsNear = function(center) {

	var radius = document.getElementById('radiusSelect').value;
	var searchUrl = 'store_locator.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;

	if(!document.getElementById('loading_image'))
		document.getElementById('address_form_container').appendChild(loading_image);

	//show the loading image
	loading_image.src = '/skin1/images/loading.gif';
	loading_image.id = "loading_image";
	loading_image.style.display = 'inline';
	loading_image.style.position = 'relative';
	loading_image.style.top = '7px';
	loading_image.style.left = '0px';
	loading_image.style.clear = 'none';
	loading_image.style.width = '20px';
	loading_image.style.height = '20px';
	loading_image.style.margin = loading_image.style.padding ='0';

	google.maps.DownloadUrl(searchUrl, function(data) {
		var xml = google.maps.Xml.parse(data);
		var markers = xml.documentElement.getElementsByTagName('marker');
		map.clearOverlays();

		//hide the loading image
		loading_image.src = '';

		var sidebar = document.getElementById('sidebar');
		if(sidebar)sidebar.innerHTML = '';
		if (markers.length == 0) {
			//sidebar.innerHTML = 'No results found.';
			map.setCenter(new GLatLng(40, -100), 4);
			alert("Sorry, we were unable to find any locations within " + radius + " miles of that address. If you just entered a zipcode, please try your full address.");
			return;
		}

	   var bounds = new google.maps.LatLngBounds();
	   for (var i = 0; i < markers.length; i++) {
		 var name = markers[i].getAttribute('name');
		 var address = markers[i].getAttribute('address');
		 var city = markers[i].getAttribute('city');
		 var state = markers[i].getAttribute('state');
		 var zipcode = markers[i].getAttribute('zipcode');
		 var phone = markers[i].getAttribute('phone');
		 address += ", " + city + ", " + state + ", " + zipcode;

		var distance = parseFloat(markers[i].getAttribute('distance'));
		var point = new google.maps.LatLng(parseFloat(markers[i].getAttribute('lat')),parseFloat(markers[i].getAttribute('lng')));
		var image =  markers[i].getAttribute('image');
		var sidebar_image = markers[i].getAttribute('sidebar_image');
		var marker = createMarker(point, name, address, image,phone);

		map.addOverlay(marker);

		//var sidebarEntry = createSidebarEntry(marker, name, address, distance,sidebar_image);
		//sidebar.appendChild(sidebarEntry);
		bounds.extend(point);


	   }
	   map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
 });
}

createMarker = function (point, name, address, image, phone) {
	var storeIcon = new google.maps.Icon(G_DEFAULT_ICON);
	if(image)storeIcon.image = image;
	storeIcon.iconSize = new google.maps.Size(24,36);
	// Set up our GMarkerOptions object
	markerOptions = { icon:storeIcon };

	var marker = new google.maps.Marker(point,markerOptions);
	var html = '<b>' + name + '</b> <br/>' + address;
	if(phone){
		html += '<br/>Tel: '  + phone + '<br/>';
	}
	html += '<br/><a href="javascript:var a=document.getElementById(\'addressInput\').value;getDirections(a ,\''+ address + '\');" title="get directions">get directions</a>';
	html += '<br/><a href="javascript:createStreetViewOverlay('+point.lat()+','+point.lng()+');" title="enable street view">street view</a>';

	markerClick = function() {
		try{
			this.openInfoWindowHtml(html);
		}catch(e){}
	}
	google.maps.Event.addListener(marker, 'click', markerClick);


	return marker;
}



createStreetViewOverlay =function(lat,lng){
	if(lat && lng){
		point = new google.maps.LatLng(lat,lng);
	}
	if(!svOverlay){
	   svOverlay = new google.maps.StreetviewOverlay();
	   map.addOverlay(svOverlay);
	}

	el = document.getElementById("pano");

	myPano= new google.maps.StreetviewPanorama(el);
	if(myPano){
		try{
			//GEvent.addListener(map,"click", function(overlay,latlng) {
			 // myPano.setLocationAndPOV(latlng);
			//});
			if(point){
				myPano.setLocationAndPOV(point);
			}
		}catch(e){}
	}

}

createSidebarEntry = function(marker, name, address, distance,image) {
	var div = document.createElement('div');
	div.style.styleFloat = 'left';
	div.style.position = 'relative';
	div.style.clear = 'both';
	div.style.backgroundColor = '#FFF';
	div.style.padding = "2px";
	var html = '<img src="'+ image +'" style="float:left;clear:none;position:relative;"/><b>' + name + '</b> (' + distance.toFixed(1) + 'miles)<br/>' + address;
	div.innerHTML = html;
	div.style.cursor = 'pointer';
	div.style.marginBottom = '5px';


	sidebarClick = function() {

		google.maps.Event.trigger(marker, 'click');

		if(selectedSidebarEntry){
			previousSidebarEntry = selectedSidebarEntry;
			previousSidebarEntry.style.backgroundColor='#FFF';
			previousSidebarEntry.style.color='#1b4d89';
		}
		selectedSidebarEntry=this;
		this.style.backgroundColor='#1b4d89';
		this.style.color='#FFF';
	}
	google.maps.Event.addDomListener(div, 'click', sidebarClick);


	sidebarOver = function() {
		if(this!=selectedSidebarEntry){
			this.style.backgroundColor='#1b4d89';
			this.style.color='#FFF';
		}
	}
	google.maps.Event.addDomListener(div, 'mouseover', sidebarOver);

	sidebarOut = function() {
		if(this!=selectedSidebarEntry){
			div.style.backgroundColor = '#fff';
			div.style.color='#1b4d89';
		}
	}
	google.maps.Event.addDomListener(div, 'mouseout', sidebarOut);


	return div;
}


getDirections = function(from,to){
	//map.setCenter(new GLatLng(49.496675,-102.65625), 3);
	directions = new google.maps.Directions(map, directionsPanel);
	var a = 'from: ' + from + ' to: ' + to;
	//map.removeOverlay();
	directionsPanel.innerHTML="";
	directions.load(a,{getPolyline:true});

	var directionsErrorFunction =  function() {
		var code = directions.getStatus().code;
		var reason="Code "+code;
		if (reasons[code]) {
		  reason = "Code "+code +" : "+reasons[code]
		}
		alert("Failed to obtain directions, "+reason);
	}
	google.maps.Event.addListener(directions,"error", directionsErrorFunction);


  var directionsLoadFunction = function() {
	//alert('loaded');
	if (poly) map.removeOverlay(poly);
	poly = directions.getPolyline();
	map.addOverlay(poly);

  }
  google.maps.Event.addListener(directions, "load", directionsLoadFunction);

}

getStreetView = function(){
	try{
	   myPano.setLocationAndPOV(latlng);
	}catch(e){}

}


$(document).ready(function (){

	$("#addressInput").keypress(function (e) {
		if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
			$('#btn_search_locations').click();
			return false;
		} else {
			return true;
		}
	});
});