var AAIMaps = {
	geocoder: null,
	map:null,
	initialize: function() {
		this.geocoder = new google.maps.Geocoder();
		this.map = new google.maps.Map(document.getElementById("mapCanvas"),
					{
						zoom:12,
						center: new google.maps.LatLng(-36.84885106479408,174.763099),
						mapTypeId: google.maps.MapTypeId.ROADMAP
					});
		var path = "/static/gfx/";
		this.yellowImage = new google.maps.MarkerImage(path + "marker-yellow.png",
				new google.maps.Size(21,35),
				new google.maps.Point(0,0),
				new google.maps.Point(10,33)
		);
		this.greyImage = new google.maps.MarkerImage(path + "marker-grey.png",
				new google.maps.Size(21,35),
				new google.maps.Point(0,0),
				new google.maps.Point(10,33)
		);
		this.blueImage = new google.maps.MarkerImage(path + "marker-blue.png",
				new google.maps.Size(21,35),
				new google.maps.Point(0,0),
				new google.maps.Point(10,33)
		);
		this.shadowImage = new google.maps.MarkerImage(path + "shadow50.png",
				new google.maps.Size(37, 34),
				new google.maps.Point(0,0),
				new google.maps.Point(10,33)
		);
		AAIMaps.createMarkers(AAIMaps.aaCentres, AAIMaps.yellowMarkers, AAIMaps.yellowImage);
		AAIMaps.createMarkers(AAIMaps.customerServiceCentres, AAIMaps.greyMarkers, AAIMaps.greyImage);
		AAIMaps.createMarkers(AAIMaps.collisionRepairers, AAIMaps.blueMarkers, AAIMaps.blueImage);
		AAIMaps.createMarkers(AAIMaps.qualityRepairers, AAIMaps.blueMarkers, AAIMaps.blueImage);
		
		this.addListener(document.getElementById("viewCentres"), "change", this.toggleYellow);
		this.addListener(document.getElementById("viewCustSerCentres"), "change", this.toggleGrey);
		this.addListener(document.getElementById("viewRepairers"), "change", this.toggleBlue);
		if(document.getElementById("viewCentres").checked) AAIMaps.showMarkers(AAIMaps.yellowMarkers);
		if(document.getElementById("viewCustSerCentres").checked) AAIMaps.showMarkers(AAIMaps.greyMarkers);
		if(document.getElementById("viewRepairers").checked) AAIMaps.showMarkers(AAIMaps.blueMarkers);
		
		this.addListener(document.forms[1], "submit", this.searchAddress);
		this.addListener(document.getElementById("loc"), "focus", function(e) {
						if(document.getElementById("loc").value == "e.g. Newtown, Wellington") {
							document.getElementById("loc").value = "";
						}
			});
		this.addListener(document.getElementById("loc"), "blur", function(e) {
						if(document.getElementById("loc").value == "") {
							document.getElementById("loc").value = "e.g. Newtown, Wellington";
						}
			});
	},
	insuranceOffices: [],
	customerServiceCentres: [],
	qualityRepairers: [],
	collisionRepairers: [],
	aaCentres: [],
	yellowMarkers: [],
	greyMarkers: [],
	blueMarkers: [],
	yellowImage: null,
	greyImage: null,
	blueImage: null,
	shadowImage: null,
	createMarkers: function(arrLocations, arrMarkers, img) {
		var x, marker, contentString;
		for(x = 0; x < arrLocations.length; x++) {
			marker = new google.maps.Marker({
							position: new google.maps.LatLng(arrLocations[x].latitude, arrLocations[x].longitude),
							icon: img,
							shadow: AAIMaps.shadowImage
			});
			
			google.maps.event.addListener(marker, "click", function(e) { if(console){console.debug(e);}});
			
			arrMarkers.push(marker);
			
			contentString = "<strong>" + arrLocations[x].name + "</strong><br />";
			if(arrLocations[x].postalLine1 != "")
				contentString += arrLocations[x].postalLine1 + "<br />";
			if(arrLocations[x].postalLine2 != "")
				contentString += arrLocations[x].postalLine2 + "<br />";
			if(arrLocations[x].postalLine3 != "") 
				contentString += arrLocations[x].postalLine3 + "<br />";
			if(arrLocations[x].postalLine4 != "") 
				contentString += arrLocations[x].postalLine4 + "<br />";
			if(arrLocations[x].postalCode != "")
				contentString += arrLocations[x].postalCode + "<br />";
			if(arrLocations[x].phone != "")
				contentString += "Phone: " + arrLocations[x].phone;
			
			marker.infoWindow = new google.maps.InfoWindow({
					content: contentString,
					maxWidth:500
			});
			AAIMaps.attachInfoWindow(marker);
		}
	},
	showMarkers: function(arrMarkers) {
		for(var x = 0; x < arrMarkers.length; x++) {
			arrMarkers[x].setMap(AAIMaps.map);
		}
	},
	hideMarkers: function(arrMarkers) {
		for(var x = 0; x < arrMarkers.length; x++) {
			arrMarkers[x].setMap(null);
		}
	},
	addListener: function(elem, type, func) {
		if(elem.addEventListener) {
			elem.addEventListener(type, func, false);
		} else {
			elem.attachEvent("on" + type, func);
		}
	},
	removeListener: function(elem, type, func) {
		if(elem.removeEventListener) {
			elem.removeEventListener(type, func, false);
		} else {
			elem.detachEvent("on" + type, func);
		}
	},
	getEvent: function(e) {
		if(!e) {e = window.event};
		return e;
	},
	cancelEvent: function(e) {
		e.cancelBubble = true;
		if(e.stopPropagation) {e.stopPropagation();}
		if(e.preventDefault) {e.preventDefault();}
		else {return false};
	},
	getTarget: function(e) {
		var targ;
		if(e.target) {targ = e.target;}
		else if (e.srcElement){ targ = e.srcElement;}
		if(targ.nodeType == 3) {targ = targ.parentNode;}
		return targ;
	},
	attachInfoWindow: function(marker) {
		google.maps.event.addListener(marker, "click", function() { marker.infoWindow.open(this.map, marker) });
	},
	toggleYellow: function(e) {
		var chk = AAIMaps.getTarget(e);
		if(chk.checked) {
			AAIMaps.showMarkers(AAIMaps.yellowMarkers);
		} else {
			AAIMaps.hideMarkers(AAIMaps.yellowMarkers);
		}
	},
	toggleGrey: function(e) {
		var chk = AAIMaps.getTarget(e);
		if(chk.checked) {
			AAIMaps.showMarkers(AAIMaps.greyMarkers);
		} else {
			AAIMaps.hideMarkers(AAIMaps.greyMarkers);
		}
	},
	toggleBlue: function(e) {
		var chk = AAIMaps.getTarget(e);
		if(chk.checked) {
			AAIMaps.showMarkers(AAIMaps.blueMarkers);
		} else {
			AAIMaps.hideMarkers(AAIMaps.blueMarkers);
		}
	},
	searchAddress: function(e) {
		var address = document.getElementById("loc").value;
		var ret = AAIMaps.cancelEvent(AAIMaps.getEvent(e));
		document.getElementById("searchResult").innerHTML = "";
		AAIMaps.geocoder.geocode({address: address + ", New Zealand"}, AAIMaps.searchReturned);
		return ret;
	},
	searchReturned: function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			AAIMaps.map.setCenter(results[0].geometry.location);
			AAIMaps.map.setZoom(13);
		} else {
			document.getElementById("searchResult").innerHTML = "<p>Location not found. Please try again.</p>";
		}
	}
}