var customIcon = new GIcon();
customIcon.image = "/Content/2009/images/googleMaps/pointer.png";
customIcon.shadow = "/Content/2009/images/googleMaps/shadow.png";
customIcon.iconSize = new GSize(32, 32);
customIcon.shadowSize = new GSize(49, 32);
customIcon.iconAnchor = new GPoint(16, 24);
customIcon.infoWindowAnchor = new GPoint(16, 16);

// Address class
function Address(streetAddress, friendlyName, latLng) {
	this.friendlyName = friendlyName;
	this.streetAddress = streetAddress;
	this.latLng = latLng;
}

function Initialize() {
	if (GBrowserIsCompatible()) {
		var geoCoder = new GClientGeocoder();
		if(geoCoder) {
			addresses.each(
				function(address) {
					address.streetAddress = address.streetAddress.replace(/\bSPACE\b/, 'SUITE').replace(/\bSPC\b/, 'STE');
				}
			);
			
			addresses.each(
				function(address) {
					geoCoder.getLatLng(address.streetAddress, SetLatLngForAddress.bind(null, address));
				}
			);
		}

		if(addresses.size() > 0) {
			addressesTimer = setInterval("CheckLatLngForAddress()", 500);
		}
		else {
			SetDefaultMap();
		}
	}
}

function SetDefaultMap() {
    var zoom = false;
	var map = GetMap(zoom);
	//map.setCenter(new GLatLng(59.5, -98.5), 3);
	//map.setCenter(new GLatLng(39.50, -98.35), 3);
	map.setCenter(defaultLatLng, 3);
	map.clearOverlays();
}

function SetLatLngForAddress(address, latLng) {
	if(latLng)
		address.latLng = latLng;
	else
		address.latLng = undefined;
}

function CheckLatLngForAddress() {
	var notFinished = addresses.find(
		function(address) {
			return (address.latLng === null);
		}
	);

	if(!notFinished) {
		clearInterval(addressesTimer);
		MapAddresses();
	}
}

function MapAddresses() {
	var addressesWithLatLng = addresses.inject($A([]),
		function(array, address) {
			if(address.latLng) {
				array.push(address);
			}
			return array;
		}
	);

	if(addressesWithLatLng.size() == 0) {
		SetDefaultMap();
		return;
	}

	var bounds = new GLatLngBounds(addressesWithLatLng[0].latLng, addressesWithLatLng[0].latLng);

	addressesWithLatLng.each(
		function(address) {
			if(address.latLng) {
				bounds.extend(address.latLng);
			}
		}
	);

	var zoom = true;
	var map = GetMap(zoom);
	map.clearOverlays();
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)-3);

	addressesWithLatLng.each(
		function(address) {
			if(address.latLng) {
				var marker = new GMarker(address.latLng, { icon:customIcon });

				GEvent.addListener(marker, "click", function() {
					marker.openInfoWindowHtml(address.friendlyName);
				});
			
				map.addOverlay(marker);
				if (addressesWithLatLng.length==1)
				{
				    marker.openInfoWindowHtml(address.friendlyName);
				}
			}
		}
	);
}

function GetMap(zoom) {
	var map = new GMap2(document.getElementById("map_canvas"));
	map.addControl(new GMapTypeControl());
	if (zoom) {
	map.addControl(new GSmallMapControl());
	}
	else {
	    map.disableDoubleClickZoom();
	}
	return map;
}

function ShowStoreLocation(itemIndex) {
    var zoom = true;
	var map = GetMap(zoom);
	var geocoder = new GClientGeocoder();

	if(geocoder) {
		geocoder.getLatLng(addresses[itemIndex].streetAddress,
			function(point)
			{
				if(point) {
					map.setCenter(point, 13);
					var marker = new GMarker(point, { icon:customIcon });
					map.addOverlay(marker);
					marker.openInfoWindowHtml(addresses[itemIndex].friendlyName);
					window.scrollTo(0,0);
				}
				else
				{
					SetDefaultMap();
					alert('We\'re sorry, this location cannot be mapped.');
				}
			}
		);
	}
}

function ShowNewStoreLocation(streetAddress, friendlyName)
{
	ShowStoreLocation(AddAddress(streetAddress, friendlyName, null));
}

function AddAddress(streetAddress, friendlyName, latLng)
{
    var rtrn = -1;
    if (addresses)
    {
        addresses.push(new Address(streetAddress, friendlyName, latLng));
        rtrn = addresses.length - 1;
    }
    return rtrn;
}

Event.observe(window, 'load', Initialize);
Event.observe(window, 'unload', GUnload);
