var map = false;
var geocoder = false;

var barTemplate = false;

var startCView = false;

var defaultStartDate = false;
var defaultEndDate = false;

var mapFilter = true;

Event.observe(window,'load',function(event){
	
	Event.observe('searchForm','submit',function(event){
		Event.stop(event);
		filterEvents();
	});
	
	eves = $$('.event');
	for(var i=0;i<eves.length;i++){
		eves[i].hide();
	}
	
	startCView = Calendar.setup({
		triggerElement : 'startCalIcon',
		selectHandler : calSelect
	})
	defaultStartDate = new Date();
	
	$('mapMessage').hide();
		
	geocoder = new GClientGeocoder();
	loadMap();
	setTimeout("filterEvents(false)",15);
	//filterEvents(false);
	//map.savePosition();
});

function calSelect(){
	setCalDate(this.date)
}

function setCalDate(date){
	str="start";
	setDropDownValue(str+'Month',date.getMonth()+1);
	setDropDownValue(str+'Day',date.getDate());
}

function setDropDownValue(elementName,newValue){
	if($(elementName)){
		options = $(elementName).childElements();
		for(var i=0;i<options.length;i++){
			if(options[i].value == newValue){
				options[i].selected = "selected";
			}else{
				options[i].selected = false;
			}
		}
	}
}

function collectEvents(){
	var events = new Array();
	var event = $('content').down('.event');
	var i = 0;
	while(event){
		events.push(event);
		i++;
		event = $('content').down('.event',i);
	}
	return events;
}

function eventDetail(key,detail){
	var children = $(key).childElements();
	data = "";
	for(var i=0;i<children.length;i++){
		if(children[i].className == detail){
			data = children[i].innerHTML;
		}
	}
	if((data!=undefined)||(data!='')){
		return data;
	}else{
		return false;
	}
}

function showMarkers(events){		
	
	
	map.clearOverlays();
	

	
	for(var i=0;i<events.length;i++){
		lat = eventDetail(events[i].id,'lat');
		lng = eventDetail(events[i].id,'lng');
		
		name = eventDetail(events[i].id,'name');
		address = eventDetail(events[i].id,'address');
		state = eventDetail(events[i].id,'state');
		city = eventDetail(events[i].id,'city');
		
		//  Make Marker
		
		var point = new GLatLng(lat,lng);
		var marker = new GMarker(point);
		//marker.bindInfoWindowHtml($(events[i].id).innerHTML);
		GEvent.addListener(marker,"click",function(latlng,marker){
		    zoom=map.getZoom();
			if(zoom<=10){
				map.setCenter(latlng,11);
			}else{
				filterByLatLng(latlng.lat(),latlng.lng());
			}
		})
		map.addOverlay(marker);
		
	}
	
}

function listEvents(events){
	//A$('content').innerHTML="";
	allEvents = collectEvents();
	for(var i=0;i<allEvents.length;i++){
		allEvents[i].hide();
	}
	for(var i=0;i<events.length;i++){
		events[i].show();
	}
}
	

function loadMap() {
	if (GBrowserIsCompatible()) {
		GEvent.addDomListener($('map'),'load',function(){
			alert('map loaded now');
		})
		map = new GMap2(document.getElementById("map"));

		map.addControl(new GSmallMapControl());
		map.setCenter(new GLatLng(38.3771763, -99.64414), 2);
	//	setTimeout("map.setCenter(new GLatLng(38.3771763, -99.64414), 2);",10);
	//	alert('set center'+map.getCenter().lat());
	
		GEvent.addListener(map,'moveend',function(){
				filterByMap();				
		});
	}
}

function centerMap(events){
	var north = false;
	var east = false;
	var south = false;
	var west = false;
	
	for(var i=0;i<events.length;i++){
		lat = eventDetail(events[i].id,'lat');
		lng = eventDetail(events[i].id,'lng');
		if((lat!='0.0000000000')||(lng!='0.0000000000')){
			//  Modify bounding box . .. compare N/E/S/W
			if(north == false){
				north = lat;
			}else if(lat>north){
				north = lat;
			}
		
			if(east == false){
				east = lng;
			}else if(lng>east){
				east = lng;
			}
		
			if(south == false){
				south = lat;
			}else if(lat<south){
				south = lat;
			}
		
			if(west == false){
				west = lng;
			}else if(lng<west){
				west = lng;
			}
		}
	}
	
	if(north&&south&&east&&west){
		if((east-west)>=0){
			sw = new GLatLng(south,west);
			ne = new GLatLng(north,east);			
		}else{
			sw = new GLatLng(south,east);
			ne = new GLatLng(north,west);
		}
		var bounds = new GLatLngBounds(sw,ne);
		var zoomLevel = map.getBoundsZoomLevel(bounds);
		//alert(zoomLevel);
		if(zoomLevel>13){
			
			zoomLevel=13;
		}else if(zoomLevel-1>=2){
			zoomLevel = zoomLevel-1;
		}
		map.setCenter(bounds.getCenter(),zoomLevel);
	}
}

function updateDisplay(events,noCenter){
	if(map.isLoaded()){
		if(events.length>0){
			$('messageBox').innerHTML="Displaying "+events.length+" events.";
		}else{
			$('messageBox').innerHTML = "Currently, no events match the location and date you entered. Please try modifying your search."
		}		
		showMarkers(events);
		listEvents(events);
	
		if((noCenter==null)&&(events.length>0)){
			centerMap(events);
		}
		if($('mapMessage').innerHTML==""){
			$('mapMessage').hide();
		}else{
			$('mapMessage').show();
		}
	}else{
		alert('not loaded, try again');
		map.setCenter(new GLatLng(38.3771763, -99.64414), 2);
		setTimeout("updateDisplay()",100);
	}
}

function filterEvents(ignoreZip,events){
	if((ignoreZip)||($('zip').value=="")){
		if(events==null){
			events = collectEvents();
		}
		
		events = filterByTime(events);

		updateDisplay(events);
	}else{
		filterByZip();
	}
}
function filterByZip(events){
	newEvents=new Array();
	if($('zip').value!=""){
		$('messageBox').value = "Searching for "+$('zip').value;

		geocoder.getLatLng($('zip').value,function(point){
			
			radius = Number($('radius').value);
			
			map.setCenter(point,radius);
			filterByMap();
		})
	}
	return events;
}

function filterByTime(events){
	newEvents = new Array();
	now = new Date();
	year = now.getFullYear();

	startDate = Date.parse($('startMonth').value+'/'+$('startDay').value+'/'+year);
	
	for(var i=0;i<events.length;i++){
		eventStart = Date.parse(eventDetail(events[i].id,'start'));
		if(startDate<=eventStart){
			newEvents.push(events[i]);
		}
	}
	return newEvents;
}

function filterByMap(events){
	if(mapFilter){
		newEvents = new Array();
		bounds = map.getBounds();
		if(events==null){
			events = collectEvents();
		}
		for(var i=0;i<events.length;i++){
			lat = eventDetail(events[i].id,'lat');
			lng = eventDetail(events[i].id,'lng');
			if(bounds.containsLatLng(new GLatLng(lat,lng))){
				newEvents.push(events[i]);
			}
		}
		events = filterByTime(newEvents);
		
		updateDisplay(newEvents,true);
	}
}

function filterByLatLng(lat,lng){
	
	map.clearOverlays();
	map.addOverlay(new GMarker(lat,lng));
	events = collectEvents();
	
	newEvents = new Array();
	
	for(var i=0;i<events.length;i++){
		eventLat = eventDetail(events[i].id,'lat');
		eventLng = eventDetail(events[i].id,'lng');
		if((lat==eventLat)&&(lng==eventLng)){
			newEvents.push(events[i]);
		}
	}
	
	events = filterByTime(newEvents);
	events = filterByKeyword(newEvents);
	if(events){
		map.clearOverlays();
		
		$('messageBox').innerHTML += "<a href='javascript:void(0)' onclick='filterEvents();'>Show events at other locations</a>";
	}
	updateDisplay(newEvents,false);
}

function clearFilters(){
	$('zip').value = "";
	setCalDate(defaultStartDate);
	filterEvents(false);
}
