var GmapController = new Class({
	_map: null,
	_placeZoom: 16,
	_areaZoom: 14,
	_cityZoom: 13,
	_countryZoom: 13,
	_markers: [],
	initialize: function (latitude, longitude, zoom) {
		this._lat = latitude;
		this._lng = longitude;
		switch(zoom) {
			case 'place':
				this._currentZoom = this._placeZoom;
			break;
			case 'area':
				this._currentZoom = this._areaZoom;
			break;
			case 'city':
				this._currentZoom = this._cityZoom;
			break;
			default:
				this._currentZoom = this._countryZoom;
		}
	},
	dispose: function() {
		GUnload();
	},
	_addMarker: function(latlng, icon, html) {
		var marker = new GMarker(latlng, icon)
		
		GEvent.addListener(marker,"click", function() {
			marker.openInfoWindowHtml(html);
		});
		
		this._markers[this._markers.length] = marker;
		this._map.addOverlay(marker);
	},
	_createCurrentIcon: function() {
		var icon = new GIcon();
		icon.image = '/images/icons/mapcurrent.png';
		icon.iconSize = new GSize(27, 41);
		icon.iconAnchor = new GPoint(14, 33); // y = 33 to lower the icon since it has a shadow
		icon.infoWindowAnchor = new GPoint(14, 6);
		
		return icon;
	},
	_createNumberIcon: function(num) {
		var icon = new GIcon();
		icon.image = '/images/icons/listmap'+(num)+'.png';
		icon.iconSize = new GSize(27, 41);
		icon.iconAnchor = new GPoint(14, 33); // y = 33 to lower the icon since it has a shadow
		icon.infoWindowAnchor = new GPoint(14, 6);
		
		return icon;
	},
	_createCategoryIcon: function(cat) {
		var icon = new GIcon();
		icon.image = '/images/icons/'+cat+'.png';
		icon.iconSize = new GSize(23, 33);
		icon.iconAnchor = new GPoint(12, 27); // y = 27 to lower the icon since it has a shadow
		icon.infoWindowAnchor = new GPoint(12, 6);
		
		return icon;
	},
	loadMap: function(mapDiv) {
		if (GBrowserIsCompatible()) { 
			this._map = new GMap2(mapDiv);
			
			// Sets the controls for User Interface
			var customUI = this._map.getDefaultUI();
			customUI.zoom.scrollwheel = false;
			customUI.maptypes.satellite  = false;
			
			this._map.setUI(customUI);
			
			GEvent.addListener(this._map,"maptypechanged", function(){
				this.currentMapType = this._map.getCurrentMapType();
			}.bind(this));
			if (this.currentMapType) {
				this._map.setMapType(this.currentMapType);
			}
			
			this._map.setCenter(new GLatLng(this._lat, this._lng), this._currentZoom);
		}
		else {
			alert('Sorry your web browser is not compatible...');
		}
	},
	loadPlaces: function(url, page, limit) {
		this.clearPlaces();
		var startNumbering = (page-1) * limit;
		var endNumbering = startNumbering + limit;
		
		var req = new Request.HTML({url:url, method: 'get',
			onComplete: function(nodes) {
				var results = nodes[0].getElements('.sz_mapPoint');
				var avgLat = 0;
				var avgLng = 0;
				var counter = 0;
				for (var i = 0; i < results.length; i++) {
					var category = results[i].getElements('span.sz_mapCategory')[0].get('text');
					var lat = results[i].getElements('span.sz_mapLatitude')[0].get('text');
					var lng = results[i].getElements('span.sz_mapLongitude')[0].get('text');
					var icon = null;
					
					if ((i >= startNumbering) && (i < endNumbering)) { 
						avgLat += parseFloat(lat);
						avgLng += parseFloat(lng);
						counter++;
						icon = this._createNumberIcon(i-startNumbering+1);
					}
					else {
						icon = this._createCategoryIcon(category);
					}
					this._addMarker(new GLatLng(lat, lng), icon, results[i].get('html'));
				}
				avgLat = avgLat/counter;
				avgLng = avgLng/counter;
				this._map.panTo(new GLatLng(avgLat, avgLng));
			}.bind(this),
			//Our request will most likely succeed, but just in case, we'll add an
			//onFailure method which will let the user know what happened.
			onFailure: function() {
				alert('Ooops, the request failed...');
			}
		});
				
		req.send();
	},
	loadResults: function(results) {
		var avgLat = 0;
		var avgLng = 0;
		for (var i = 0; i < results.length; i++) {
			var category = results[i].getElements('span.sz_mapCategory')[0].get('text');
			var lat = results[i].getElements('span.sz_mapLatitude')[0].get('text');
			var lng = results[i].getElements('span.sz_mapLongitude')[0].get('text');
			var icon = null;
			var currentPoint = this._map.getCenter();
			
			icon = this._createNumberIcon(i+1);;

			this._addMarker(new GLatLng(lat, lng), icon, results[i].get('html'));
			
			avgLat += parseFloat(lat);
			avgLng += parseFloat(lng);
		}
		avgLat = avgLat/results.length;
		avgLng = avgLng/results.length;
		this._map.panTo(new GLatLng(avgLat, avgLng));
	},
	loadNearby: function(results) {
		for (var i = 0; i < results.length; i++) {
			var category = results[i].getElements('span.sz_mapCategory')[0].get('text');
			var lat = results[i].getElements('span.sz_mapLatitude')[0].get('text');
			var lng = results[i].getElements('span.sz_mapLongitude')[0].get('text');
			var icon = null;
			var currentPoint = this._map.getCenter();
			if((lat == currentPoint.lat()) && (lng == currentPoint.lng())) {
				icon = this._createCurrentIcon();
			}
			else {
				icon = this._createCategoryIcon(category);
			}
			this._addMarker(new GLatLng(lat, lng), icon, results[i].get('html'));
		}
	},
	isSet: function() {
		return this._map != null;
	},
	clearMap: function() {
		if (this._markers.length) {
			this.clearPlaces();
		}
		this._map = null;
	},
	clearPlaces: function() {
		this._markers = [];
		this._map.clearOverlays();
	},
	openMarker: function(i) {
		var latlng = this._markers[i].getLatLng();
		this._map.setCenter(latlng);
		GEvent.trigger(this._markers[i], 'click');
	}
});