function trim(str) {
	if(str != null) {
		return(str.replace(/^\s+|\s+$/g, ''));
	} else {
		return "";
	}
}

// valley center point
var valleyCenter = new GLatLng(36.13947684982376, -115.14907836914062);
// google map
var map;
// google directions
var gdir;

function loadSmallMap() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById('smallmap'));
		var anc = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10));
		map.addControl(new GSmallMapControl(), anc);
		
		gdir = new GDirections(map, document.getElementById("gdirectionsdiv"));
		GEvent.addListener(gdir, "load", dirLoaded);
		GEvent.addListener(gdir, "error", handleDirErrors);
	}
}

function load() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById('map'));
		map.setCenter(valleyCenter, 10);
		map.enableScrollWheelZoom();
		var anc = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,35));
		map.addControl(new GLargeMapControl(), anc);
		
		var mapTC = new GMapTypeControl();
		map.addControl(mapTC);
		
		gdir = new GDirections(map, document.getElementById("gdirectionsdiv"));
		GEvent.addListener(gdir, "load", dirLoaded);
		GEvent.addListener(gdir, "error", handleDirErrors);
	
		//map.addControl(new ExtMapTypeControl({showTraffic: true, showTrafficKey: false}));
		//map.addControl(new StreeViewTypeControl({showStreet: true}));
		//svOverlay = new GStreetviewOverlay();
		//map.addOverlay(svOverlay);
		/*
		GEvent.addListener(map, "click", function(overlay,point) {
			if(point != null) {
				document.getElementById('message').innerHTML += "[] = new GLatLng"+point.toString()+"<br>";				
			}
		});
		*/
		
		processAllArrays();
	}
}

function zoom(zoomDir) {
	map.setZoom(map.getZoom()+zoomDir);
}

function changeSize(width, height) {
	var mapdiv = document.getElementById('map');
	mapdiv.style.width = width;
	mapdiv.style.height = height;
	map.checkResize();
}

function togFavs() {
	var showingFavs = ELEM_TYPES_SHOWN[FAVS_ELEM];
	
	if(!showingFavs) {
		var favs = getFavs();
		for(var i=0 ; i<locations.length ; i++) {
			if(locations[i] != null && locations[i].marker != null ) {
				if(favs.contains(locations[i].id)) {
					mgr.addMarker(locations[i].marker, mgrDepth);
				} else if(locations[i].type == 0) {
					mgr.removeMarker(locations[i].marker);
				}
			}
		}
		
		ELEM_TYPES_SHOWN[0] = false; updateIcon(0);
		ELEM_TYPES_SHOWN[1] = false; updateIcon(1);
		
		ELEM_TYPES_SHOWN[FAVS_ELEM] = true;
		updateFavIcon();
	}
	mgr.refresh();	
}

function updateIcon(type_num) {
	elem = document.getElementById(ELEM_TYPES[type_num]);
	if(elem != null) {
		if(!ELEM_TYPES_SHOWN[type_num]) {
			elem.style.background = 'none';
		} else {
			elem.style.background = '#0099cc';
		}
	}	
}

function updateFavIcon() {
	updateIcon(FAVS_ELEM);
}

// last one for this should always be favorites
var ELEM_TYPES_SHOWN = new Array(true, true, false, false, false, false);
var ELEM_TYPES = new Array("feahomesTogIcon", "addhomesTogIcon", "schoolsTogIcon", "hschoolsTogIcon", "hospitalsTogIcon", "favsTogIcon");
var FAVS_ELEM = ELEM_TYPES_SHOWN.length-1;
var ELEM_TYPES_NUM =    new Array(0, 0, 1, 1, 2);
var ELEM_SUBTYPES_NUM = new Array(0, 1, 1, 2, 0);
function locToggle(type_num) {
	showLoading();
	
	setTimeout(function() {
		if(type_num != FAVS_ELEM) {
			atype = ELEM_TYPES_NUM[type_num];
			sub_type = ELEM_SUBTYPES_NUM[type_num];
			elem = document.getElementById(ELEM_TYPES[type_num]);
			if(elem != null) {
				if(ELEM_TYPES_SHOWN[type_num]) {
					ELEM_TYPES_SHOWN[type_num] = false;
				} else {
					ELEM_TYPES_SHOWN[type_num] = true;
					if(ELEM_TYPES_SHOWN[FAVS_ELEM] && atype == 0) {
						ELEM_TYPES_SHOWN[FAVS_ELEM] = false;
						updateFavIcon();
					}
				}
				updateIcon(type_num);
				turnAll(ELEM_TYPES_SHOWN[type_num], atype, sub_type);
				showMap();
			}
		} else {
			togFavs();
		}
		
		hideLoading();
	}, 0);
}

function turnAll(on, atype, sub_type) {
	for(var i=0 ; i<locations.length ; i++) {
		if(locations[i] != null && locations[i].marker != null && locations[i].type == atype && locations[i].subtype == sub_type) {
			if(on) {
				mgr.addMarker(locations[i].marker, mgrDepth);
			} else {
				mgr.removeMarker(locations[i].marker);
			}
		}
	}
	
	mgr.refresh();
}

function showhidespan(spanid) {
	spanobj = document.getElementById(spanid);
	if(spanobj != null) {
		if(spanobj.style.visibility == 'visible' || spanobj.style.visibility == '') {
			spanobj.style.visibility = 'hidden';
		} else {
			spanobj.style.visibility = 'visible';
		}
	}
}

var mgrDepth = 11;
var mgr; var mgOptions;
function processAllArrays() {
	//mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: true };
	mgr = new MarkerManager(map);
	
	mgr.addMarkers(getAllMarkers(0, 0), mgrDepth);
	mgr.refresh();
	
	//mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: true };
	var mgr2 = new MarkerManager(map);
	
	mgr2.addMarkers(getAllMarkers(3, 3), 0, mgrDepth-1);
	mgr2.refresh();
}

function getAllMarkers(imin, imax) {
	var batch = [];
	if(filtered.length == 0 || imin == 3) {
		for(var i=0 ; i<locations.length ; i++) {
			if(locations[i].type >= imin && locations[i].type <= imax)
				batch.push(locations[i].marker);
		}
	} else {
		for(var i=0 ; i<filtered.length ; i++) {
			ELEM_TYPES_SHOWN[0] = false;
			ELEM_TYPES_SHOWN[1] = false;
			updateIcon(0); updateIcon(1);
			var loc = getLocationWithID(filtered[i]);
			batch.push(loc.marker);
		}
	}
	return batch;
}

function createNewMarker(point, icon, img_w, img_h) {
	var markerIcon = new GIcon(G_DEFAULT_ICON);
	markerIcon.image = icon;
	markerIcon.printImage = icon;
	markerIcon.mozPrintImage = icon;
	var img = new Image();
	img.src=icon;
	var w = img_w;
	var h = img_h;
	var max = 200;
	if(w != 0 && h != 0) {
		if(w > h) {
			if(max<w) {
				h = h*(max/w);
				w = max;
			}
		} else {
			if(max<h) {
				w = w*(max/h);
				h = max;
			}
		}
	} else {
		w = 25;
		h = 25;
	}
	markerIcon.iconSize = new GSize(w, h);
	markerIcon.shadowSize = new GSize(0, 0);
	markerIcon.iconAnchor = new GPoint(w/2, h);
	markerOptions = { icon:markerIcon };

	var marker = new GMarker(point, markerOptions);
	
	return marker;
}

var nw = new GLatLng(36.27749304994348, -115.31661987304687);
var nc = new GLatLng(36.2265501474709, -115.18169403076172);
var ne = new GLatLng(36.21131620260199, -115.06668090820312);
var se = new GLatLng(36.13981556713755, -115.05363464355469);
var hn = new GLatLng(36.031609419390634, -115.0656509399414);
var sw = new GLatLng(36.063178163087964, -115.24040222167969);
function changeViewAreaTo(newloc, zoom) {
	var pt = window[newloc];
	showMap();	
	if(pt != null) {
		map.setCenter(pt, zoom);
		//map.setZoom(zoom);
		//map.panTo(pt);
	}
}

function panMap(lat, lon) {
	map.panTo(new GLatLng(lat,lon));
}

function setMapCenter(lat, lon) {
	map.setCenter(new GLatLng(lat, lon), mgrDepth);
}

/*
var myPano;
function showPano(lat, lng) {
	var loc = new GLatLng(42.345573,-71.098326);
	panoramaOptions = { latlng:loc };
	myPano = new GStreetviewPanorama(document.getElementById("favs"), panoramaOptions);
	GEvent.addListener(myPano, "error", handleNoFlash);
	loadPopup('favsMain');
}

function handleNoFlash(errorCode) {
	if (errorCode == FLASH_UNAVAILABLE) {
		alert("Error: Flash doesn't appear to be supported by your browser");
		return;
	}
}
*/

var myPanoClient = null;
var myPano = null;
function initPano() {
	myPanoClient = new GStreetviewClient();	
	resizePano();
	var panodiv = document.getElementById("pano");
	myPano = new GStreetviewPanorama(panodiv);
 	GEvent.addListener(myPano, "error", handleNoFlash);
}

function resizePano() {
	var size = map.getSize();
	if(size.width == 0) {
		showMap();
		size = map.getSize();
		showPano();
	}
	var panodiv = document.getElementById("pano");
	panodiv.style.width=size.width;
	panodiv.style.height=size.height;
	if(myPano != null) {
		myPano.checkResize();
	}
}

function show_street(id) {
	closeDialogue();
	if(myPano == null) {
		initPano();
	}
	var loc = getLocationWithID(id);
	if(loc != null) {
		myPanoClient.getNearestPanorama(loc.latlon, panoResponse);
	}
}

function panoResponse(panoData) {
	if (panoData.code != 200) {
		alert("This location does not have street view.");
		showMap();
		return;
	}
	showPano();
	resizePano();
	myPano.setLocationAndPOV(new GLatLng(panoData.Location.lat, panoData.Location.lng));
}

function handleNoFlash(errorCode) {
	if (errorCode == FLASH_UNAVAILABLE) {
		alert("Error: Flash doesn't appear to be supported by your browser");
		return;
	}
}  

function getGDirectionsFromT(from, to, frmNum) {
	getGDirections(from.value, to.value, frmNum);
}

function getGDirections(from, to, frmNum) {
	clearGDir();
	gdir.load("from: " + from + " to: " + to);
	if(frmNum == 1)
		document.getElementById("commuteCostDiv").innerHTML = "<blink>Loading commute cost...</blink>";
}

function clearGDir() {
	gdir.clear();
	document.getElementById("commuteCostDiv").innerHTML = "";
	document.getElementById("gdirectionsdiv").innerHTML = "";
}

function handleDirErrors(){
	if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
		alert("Sorry could not locate the locations provided. This may be due to the fact that the address is relatively new, or it may be incorrect. Please modify the location values and try again.");
	else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
		alert("Sorry, an unknown error occurred, please try again. If this message continues to appear, please contact us.");
	else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
		alert("Please fill out both the 'From' and 'To' locations and try again.");
	else if (gdir.getStatus().code == G_GEO_BAD_KEY)
		alert("Please contact the administrator about this error, as this error should not occur. Thank you.");	
	else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
		alert("A directions request could not be successfully parsed, please try again.");
	else 
		alert("An unknown error occurred. Please try again.");
	clearGDir();
}

function dirLoaded() {
	if(document.commuteForm) {
		distance = quickRound(gdir.getDistance().meters/1609.344, 2);
		url = "avggas.php?zipcode=89107&distance="+distance+"&mpg="+document.commuteForm.mpg.value+"&numdays=5";
		makeRequest(url, "", parseGas);
	}
}

function parseGas() {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			result = http_request.responseText;
		} else {
			result = "There was a problem while getting details. "+http_request.status;
		}
		
		var gstr = "<b>Estimated</b> yearly commute cost, using today's average gas price and 240 workdays a year, is <b>$"+result+".</b>";
		document.getElementById("commuteCostDiv").innerHTML = gstr;
		
	}
}
