var FW = function() {

	// Private
	var map;
	var markers = [];
	var highlightedMarkers = [];
	var photos;
	var collections;
	var mapdiv = "gmaps";
	
	var icons = {
		"white":new GIcon(),
		"green":new GIcon()
	};
	icons.white.image = "/img/marker.png";
	icons.white.shadow = "/img/markershadow.png";
	icons.white.iconSize = new GSize(20,30);
	icons.white.shadowSize = new GSize(44,30);
	icons.white.iconAnchor = new GPoint(9,27);
	icons.white.infoShadowAnchor = new GPoint(0,29);
	icons.white.infoWindowAnchor = new GPoint(5,1);
	icons.green.image = "/img/markerh.png";

	var startCoords = {
		"lat":-34.92577,
		"long":138.599732,
		"zoom":13
	};

	// Public Methods
	return {

		'$':function(e) {
			return document.getElementById(e);
		},
		
		'maps':{
			'init':function() {
				photos = PDB.getPhotos();
				collections = PDB.getCollections();
				FW.maps.drawMap();
				FW.maps.addDropBox();
				FW.maps.addPhotoMarkers();
			},
			'drawMap':function() {
				var e = FW.$(mapdiv);
				e.innerHTML = "";
				if (PDB.compileFailed()) {
					e.innerHTML = "<p>We're sorry, due to a database error we are unable to display the map at this time.<br\/>Please try again later.<\/p>";
				} else if (!GBrowserIsCompatible() || !e) {
					e.innerHTML = "<p>We're sorry, you're browser does not support the JavaScript required to display Google Maps.<\/p>";
				} else {
					map = new GMap2(e);
					map.addControl(new GSmallMapControl());
					map.addControl(new GMapTypeControl());
					map.setCenter(new GLatLng(startCoords.lat,startCoords.long),startCoords.zoom);
				}
			},
			'addDropBox':function() {
				var s = '<select name="pJump" id="pJump" onchange="FW.maps.addCollectionButton();"><option value="-1">Adelaide City Center<\/option>';
				for (var i=0,l=collections.length; i<l; i++) {
					if (collections[i]) {
						var p = PDB.getPhotosInCollection(i);
						if (p) {
							s += '<optgroup label="'+collections[i].title+'">';
							for (var n=0,nl=p.length; n<nl; n++) {
								s += '<option value="'+p[n].id+'">'+p[n].title+'<\/option>';
							}
							s += '<\/optgroup>';
						}
					}
				}
				s += '<\/select><button type="button" onclick="FW.maps.adjustCenter();">Go<\/button><div id="colbutton"></div>';
				FW.$('dropbox').innerHTML = s;
			},
			'addCollectionButton':function() {
				var e = FW.$('colbutton');
				var v = FW.$('pJump').value;
				if (e && photos[v]) {
					if (collections[photos[v].cid]) {
						e.innerHTML = '<button onclick="FW.maps.highlightCollection('+photos[v].cid+')">Highlight "'+collections[photos[v].cid].title+'"</button>';
					} else {
						e.innerHTML = "";	
					}
				} else {
					e.innerHTML = "";
				}
			},
			'addPhotoMarkers':function() {
				for (var i=0, l=photos.length; i<l; i++) {
					if (photos[i]) {
						FW.maps.addMarker(photos[i]);
					}
				}
			},
			'addMarker':function(p) {
				var point = new GLatLng(p.lat,p.long);
				var icon = icons.white;
				var marker = new GMarker(point,icon);
				GEvent.addListener(marker,"click",function() {
					marker.openInfoWindowHtml(FW.maps.photoInfoWindow(p));
				});
				markers[p.id] = marker;
				map.addOverlay(marker);
			},
			'adjustCenter':function() {
				var v = FW.$('pJump').value;
				if (v) {
					if (v == -1) {
						map.panTo(new GLatLng(startCoords.lat,startCoords.long));
					} else if (markers[v]) {
						FW.maps.highlightSingle(v);
						map.setZoom(16);
						map.panTo(markers[v].getPoint());
					}
				}
			},
			'highlightSingle':function(id) {
				if (markers[id]) {
					highlightedMarkers = []
					highlightedMarkers[0] = markers[id];
					FW.maps.highlightUpdate();
				}
			},
			'highlightCollection':function(id) {
				highlightedMarkers = [];
				FW.maps.highlightReset();
				for (var i=0,l=markers.length; i<l; i++) {
					if (markers[i] && photos[i].cid == id) {
						highlightedMarkers[highlightedMarkers.length] = markers[i];
					}
				}
				FW.maps.highlightUpdate();
			},
			'highlightUpdate':function() {
				FW.maps.highlightReset();
				for (var i=0,l=highlightedMarkers.length; i<l; i++) {
					if (highlightedMarkers[i]) {
						highlightedMarkers[i].setImage(icons.green.image);
					}
				}
			},
			'highlightReset':function() {
				for (var i=0,l=markers.length; i<l; i++) {
					if (markers[i]) {
						markers[i].setImage(markers[i].getIcon().image);
					}
				}
			},
			'photoInfoWindow':function(p) {
				var c = PDB.getCollection(p.cid);
				return '<div class="ginfo"><h3><a href="/view/'+p.id+'#photo">'+p.title+'<\/a><\/h3><p><a href="/collection/'+c.directory+'">&ldquo;'+c.title+'&rdquo; Collection<\/a><\/p><a href="/view/'+p.id+'#photo"><img src="/thumbs/photos/'+c.directory+'/'+p.filename+'" alt="'+p.title+'" title="'+p.title+'"/></a><\/div>';
			}
		}

	};
}();