var EventMap = {
	_map : null,
	_hasOverlay : false,
	_categoryType : null,
	
	mappedEvents : [],
	markersArray : {},
	pointMap : {},
	
	showEventMarker : function (index) {
		if (this.markersArray[index]) {
			GEvent.trigger(this.markersArray[index], 'click');
		}
	},
	
	createMap : function () {
		if (GBrowserIsCompatible()) {
			this._map = new GMap2(document.getElementById("map"));
				
			this._map.setCenter(new GLatLng(37.4419, 0), 1);
			this._map.addControl(new GSmallZoomControl());
			//this.initCoordinates();
		}
	},
	
	initCoordinates : function () {
		this.pointMap.size = 0;
		
		//loop through all of the events to be mapped.
		for (var ci = 0; ci < events.length; ci++) {
			//check if the current event has an address
			if (events[ci].venue_address != undefined) {
				//add the current event to the mapped events array
				this.mappedEvents.push(events[ci]);
				//load coordinates in an orderly fashion - This is all because of IE!	
				setTimeout('EventMap.orderedLoadingOfCoordinates()', (ci + 1) * 1750);
			} 
		}
	},
	
	getMap : function () {
		return this._map;
	},
	
	resetMarkers : function () {
		if (this._hasOverlay) {
			this._map.clearOverlays();
			this.markersArray = {};
		}
	},
	
	setHasOverlay : function (boolVal) {
		this._hasOverlay = boolVal;
	},
	
	setCategoryType : function (catType) {
		this._categoryType = catType;
	},
	
	addEventMarker : function (point, currentEvent) {
		var eventIcon = new GIcon();
		eventIcon.image = '/common/assets/images/events/buttons/' + currentEvent.icon + '.png'; 
		eventIcon.shadow = '/common/assets/images/events/buttons/shadow-md.png'; 
		eventIcon.iconSize = new GSize(18, 23); 
		eventIcon.shadowSize = new GSize(53, 26); 
		eventIcon.iconAnchor = new GPoint(14, 23); 
		eventIcon.infoWindowAnchor = new GPoint(7, 1);
		
		var markerOptions = {icon:eventIcon,title:currentEvent.Event_Display_Name__c + ": " + currentEvent.Display_City__c};
		var marker = new GMarker(point, markerOptions);
		
		GEvent.addListener(marker, 'click', function() {
			var display_city = currentEvent.Event_Display_Name__c + ": " + currentEvent.Display_City__c;
			var venue_address = currentEvent.venue_address;
			var venue_city = currentEvent.venue_city;
			var venue_state = currentEvent.venue_state;
			var venue_zip = currentEvent.venue_zip;
			var venue_phone = currentEvent.venue_phone;
			var venue_name = currentEvent.venue_name;
			var eventId = currentEvent.id;
			var start_date = currentEvent.Event_Start_Date__c;
			var markerHTML = '<a class="marker_display_city"' + Events.getEventDetailsLink(currentEvent) + '>' + display_city + '</a><br/>' + start_date + '<br/><br/>';
			var cityStateZip;
			
			if (venue_name) {
				markerHTML += venue_name + '<br/>';
			}
			
			if (venue_address) {
				markerHTML += venue_address + '<br/>';
			}
			 
			if (venue_city) {
				cityStateZip = venue_city;
			}
			
			if (venue_state) {
				if (cityStateZip) {
					cityStateZip += ', '; 
				}
				
				cityStateZip += venue_state;
			}
			
			if (venue_zip) {
				if (cityStateZip) {
					cityStateZip += ' '; 
				}
				
				cityStateZip += venue_zip;
			}
			
			if (cityStateZip) {
				markerHTML += cityStateZip + '<br/>' 
			}
			
			if (venue_phone) {
				markerHTML += venue_phone + '<br/>';
			}
			
			
			markerHTML += '<br/><a class="maplink"' + Events.getEventDetailsLink(currentEvent) + '>Details</a>';
			
			marker.html = markerHTML;
		
			marker.openInfoWindowHtml(marker.html);
		});	
		
		this.markersArray[currentEvent.id] = marker;
						
		return marker;
	},
	
	mapEvents : function (arrEvents){
		this.resetMarkers();
		this.mappedEvents = [];
		
		//loop through all of the events to be mapped.
		for (var ci = 0; ci < arrEvents.length; ci++) {
			//check if the current event has an address
			if (arrEvents[ci].venue_lat != undefined && arrEvents[ci].venue_lon) {
				//add the current event to the mapped events array
				this.mappedEvents.push(arrEvents[ci]);
			} 
		}
		
		//add all mappable points to the map
		EventMap.addPointsToMap();
	},
	
	orderedLoadingOfCoordinates : function () {
		var cEvent = this.mappedEvents[this.pointMap.size];
		var address = cEvent.venue_address + ", " + cEvent.venue_city + ", " + cEvent.venue_state + ", " + cEvent.venue_zip;
					
		this.loadCoordinates(address);
	},
		
	loadCoordinates : function (address) {
		var geocoder= new GClientGeocoder();
		
		geocoder.getLatLng(address, function(point){
			try {
				var cpoint = point;
				
				EventMap.pointMap[EventMap.mappedEvents[EventMap.pointMap.size].id] = cpoint;
				
				EventMap.pointMap.size++;
			} catch(err) {
				var txt="There was an error on this page.\n\n";
				txt+="Error description: " + err.description + "\n\n";
				txt+="Event mapping: " + address + "\n\n";
				txt+="Click OK to continue.\n\n";
				alert(txt);
			}
		});
	},
	
	addPointsToMap : function() {
		//if (this.pointMap.size < this.mappedEvents.length) {
			//setTimeout("EventMap.addPointsToMap()", 750);
		//} else {
			var bounds = new GLatLngBounds();
			var currentEvent;
			var eventId;
			var map = this.getMap();
			var point;
			var web_category;
			var zoomLevel;
			
			for (var ei = 0; ei < this.mappedEvents.length; ei++) {
				try {
					currentEvent = this.mappedEvents[ei];
					eventId = currentEvent.id;
					
					point = new GLatLng(currentEvent.venue_lat , currentEvent.venue_lon); //this.pointMap[eventId];
					
					bounds.extend(new GLatLng(point.lat(), point.lng()));
					
					zoomLevel = map.getBoundsZoomLevel(bounds);
					
					if (zoomLevel > 4) {
						zoomLevel = 4; 
					};
					
					if (ei == (this.mappedEvents.length - 1)) {
						map.setCenter(bounds.getCenter(), zoomLevel);
					}
					
					if (this._categoryType != null) {
						web_category = this._categoryType
					} else {
						web_category = currentEvent.Web_Category__c;
					}
					
					//if this event field has multiple values, break them into an array
					if (web_category.indexOf(";") != -1) {
						var arrCategories = web_category.split(";");
						
						for (var catIndex = 0; catIndex < arrCategories.length; catIndex++) {
							if (catIndex > 0) {
								point = new GLatLng((new Number(point.lat()) - .00001), (new Number(point.lng()) + .00007));
							}
							currentEvent.icon = Events.getCategoryMarkerIcons(arrCategories[catIndex]);
							map.addOverlay(this.addEventMarker(point, currentEvent));
						}
					} else {
						currentEvent.icon = Events.getCategoryMarkerIcons(web_category);
						map.addOverlay(this.addEventMarker(point, currentEvent));
					}
					
					this.setHasOverlay(true);
				} catch(err) {
					var txt="There was an error on this page.\n\n";
					txt+="Error description: " + err.description + "\n\n";
					txt+="Event id: " + currentEvent.id + "\n\n";
					txt+="Click OK to continue.\n\n";
					//alert(txt);
				}
			}
		//}
	}
}

//wOnLoadAdd('EventMap.createMap()');
//wOnLoadSet();
