/**
 * I pity the fool who attempts to put a hand on this code.
 */

var map;

var Markers = Array();
var GeoCoder = new GClientGeocoder();
var MarkerLayers;
var MarkColor = 'red';
var MarkerSet = false;
var MarkerType = '';
var lastUsedSearchLevel = "";
var filtersChanged="";

function initialize() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map_canvas"));
		map.setCenter(new GLatLng(39.4419, -96.1419), 3);
		//map.setMapType(G_PHYSICAL_MAP);
		map.setUIToDefault();

		GEvent.addListener(map, "zoomend", function(oldZoomLevel, newZoomLevel) {
			//alert("changed zoom");
			setSearchData();
		});
		//fixit: uncomment this.
		//do initial search
		setSearchData();
		
	}
}
// Initialization Callback
google.setOnLoadCallback(initialize);





/*

*************************************************************************************  NEW MAP LOGIC

*/


function searchschools( city, state, school,forceautocenter) {

	var url = 'index.php?option=com_classes&view=search&Itemid=58&action=findschoolsincache';
	var params = '&city=' + city + '&state=' + state + '&school=' + school;

	
	/*define zoom level*/
	var zoomlevel = map.getZoom();
	var newsearchlevel = "";
	
	
	//alert("zoomlevel"+zoomlevel);
	switch(true){
		case (zoomlevel<6):
			newsearchlevel="states";	
		break;
		
		case (zoomlevel>=6 && zoomlevel < 12):
			newsearchlevel="cities";
		break;
		
		case (zoomlevel>=12):
			newsearchlevel="schools";
		break;
		default:
			newsearchlevel="states";
		break;
	}

	//alert("level: "+newsearchlevel);
	
	params+="&level="+newsearchlevel;
	
	if ((lastUsedSearchLevel == newsearchlevel) && !filtersChanged){
		return;
	}
	if (filtersChanged){
		forceautocenter=true;
	}
	
	lastUsedSearchLevel = newsearchlevel;
	
	$("map_canvas").style.display="none";
	$("map_wait").style.display="block";
	
	Markers.length = 0;
	MarkerSet = false;

	/*determine next autozoom level*/
	var newzoom=5;
	if (school && city){
		newzoom=13;
	}else if (city && state){
		newzoom=7;
	}else if (state){
		newzoom=5;
	}else{
		newzoom=3;
	}

	
	
	new Ajax.Request(url, {
		method:'get',
		parameters: params,
		onSuccess: function(transport) {
			
			var response = transport.responseText || "{status:'no text'}";
			/*
			alert(transport.responseText);
			return;
			*/
			var schoolsJSON = response.evalJSON();
			
			//unset the filters changed flag
			filtersChanged=false;
			
			
			$("map_wait").style.display="none";
			$("map_canvas").style.display="block";
			
			map.clearOverlays();
			var bounds = new GLatLngBounds();
			for(ind=0; ind < schoolsJSON.length; ind++) {
				//need to place markers
				
				//create point
				var point = new GLatLng((schoolsJSON[ind].latitude),(schoolsJSON[ind].longitude));
				bounds.extend(point);
				
				//create icon
				switch(schoolsJSON[ind].pin_type){
					case "registered": 
						var icon = getIconColor(3);
					break;
					case "active":
						var icon = getIconColor(2);
					break;
				}
				
				//create marker
				var marker = new createMarker(point, icon, schoolsJSON[ind].pin_html);
				
				//add marker
				map.addOverlay(marker);
			}
			if (ind==0){
				map.setCenter(new GLatLng(39.4419, -96.1419), 3);
				//need to update stats
				return;
			}

			
			//need to auto center
			zoomlevel = map.getBoundsZoomLevel(bounds);
			if(zoomlevel > 15) {
				zoomlevel = 15;
			}
			//alert("force: "+forceautocenter);
			if (forceautocenter){
//				map.setZoom(zoomlevel);
				map.setZoom(newzoom);
				map.setCenter(bounds.getCenter());
			}else{
				//map.setCenter(bounds.getCenter());
			}
			
			//need to update stats
			
			
		}, onFailure: function(){ alert('Request Error...');}
	});
}

function createMarker(point, icon,pin_html) {
	var marker = new GMarker(point, icon);
	var html = pin_html;
	GEvent.addListener(marker, 'mouseover', function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}


/*

************************************************************************************* / NEW MAP LOGIC /

*/








function getIconColor( colorInfo ){
 	var baseIcon = new GIcon(G_DEFAULT_ICON);
	baseIcon.image = getIconImage( colorInfo );
	baseIcon.iconAnchor = new GPoint(5, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(9, 2);

  	return baseIcon;
}

function getIconImage( colorInfo ) {
  	
	if( colorInfo == '1') {
		color = "red";
	} else {
		if(colorInfo == '2') {
			color = "city";
		} else {
			color = "blue";
		}
	}

	switch(color) {
  		case "blue": return ("images/map_icon_1.png"); break;
  		case "red": return ("images/map_icon_2.png"); break;
		case "city": return ("images/map_icon_city.png"); break;
		default: alert("undefined color: " + color);
  	}
}

function getStateCities( state ) {
	triggerMapFiltersChanged();
	var url = 'index.php?option=com_classes&view=search&Itemid=58&action=getStateCities';
	var params = '&state=' + state;
	$('city').length = 0;
	$('city').style.display = "none";
	$('loadingcities').style.display = "block";
	new Ajax.Request(url, {
		method:'get',
		parameters: params,
		onSuccess: function(transport) {
			$('city').style.display = "block";
			$('loadingcities').style.display = "none";
			var response = transport.responseText || "{status:'no text'}";
			var citiesJSON = response.evalJSON();

			var option = document.createElement("OPTION");
				option.text = '-- All Cities --';
				option.value = '0';
				$('city').options.add(option);


			for(ind=0; ind < citiesJSON.length; ind++) {
				var option = document.createElement("OPTION");
				option.text = citiesJSON[ind].City.capitalize();
				option.value = citiesJSON[ind].City;
				$('city').options.add(option);
			}

		},
    	onFailure: function(){ alert('Request Error...');}
	});
}

function triggerMapFiltersChanged(){
	filtersChanged=true;
}

/**
 * start search
 */
function setSearchData(forceautocenter) {
	var school = '';
	var city = '';
	var state = '';

	if($('school').value != 'School Name Keyword Search') {
		school = $('school').value;
	} else {
		school = '';
	}

	if($('city').value != '0') {
		city = $('city').value;
		state= $('states').value;
	} else {
		city = '';
		state = $('states').value;
	}

	
	
	//new method
	//findSchools(city,state,school);
	searchschools(city,state,school,forceautocenter);

}

/**
 * clear filters and overlay
 */
function clearData() {
	$("states").value = 0;
	
	$("city").options.length = 0;
	
	var option = document.createElement("OPTION");
	option.text = '-- All Cities --';
	option.value = '0';
	$('city').options.add(option);

	
	//$('city').value = 'City';
	$('school').value = 'School Name Keyword Search';
	
	setSearchData();
	
}

/*
* update localized stats
*/
function updateStats(){

	
	var school = '';
	var city = '';
	var state = '';

	if($('school').value != 'School Name Keyword Search') {
		school = $('school').value;
	} else {
		school = '';
	}

	if($('city').value != '0') {
		city = $('city').value;
		state= $('states').value;
	} else {
		city = '';
		state = $('states').value;
	}
	
	var url = 'index.php?option=com_classes&view=search&Itemid=58&action=getLocalizedStats';
	var params = '&city=' + city + '&state=' + state + '&school=' + school;
	url = url+params;
	
//	prompt("url",url);
	
	new Ajax.Request(url, {
		method:'get',
		parameters: params,
		onSuccess: function(transport) {
			var response = transport.responseText || "{status:'no text'}";
			var stats = response.evalJSON();
			
			//UPDATE GENERAL STATS
			if ($("states").value == 0){ 
				$("stats_statescount").style.display = "block";
				$("stats_headername").style.display = "none";
				
				$("statsold_classes").innerHTML = stats.statsold.classes;
				$("statsold_schools").innerHTML = stats.statsold.schools;
				$("statsold_students").innerHTML = stats.statsold.students;
				$("statsnew_classes").innerHTML = stats.statsnew.classes;
				$("statsnew_schools").innerHTML = stats.statsnew.schools;
				$("statsnew_students").innerHTML = stats.statsnew.students;
				return;
			}else{
			
			//UPDATE LOCAL STATS
				$("stats_statescount").style.display = "none";
				$("stats_headername").style.display = "block";
				
				$("stats_headername").innerHTML = "Participation in: "+$("states").options[$("states").selectedIndex].text+"";
				
				$("statsold_classes").innerHTML = stats.statsold.classes;
				$("statsold_schools").innerHTML = stats.statsold.schools;
				$("statsold_students").innerHTML = stats.statsold.students;
				$("statsnew_classes").innerHTML = stats.statsnew.classes;
				$("statsnew_schools").innerHTML = stats.statsnew.schools;
				$("statsnew_students").innerHTML = stats.statsnew.students;
			}
		}
	});
	
}

/**
 *
 */
function getKey( e ) {
	if( e.keyCode == 13) {
		setSearchData();
	}
}


String.prototype.capitalize = function(){ //v1.0
    return this.replace(/\w+/g, function(a){
        return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
    });
};

