var recording_flag = 0;
var route;
var totalDist = 0;
var currPolyline;
var currMarker;
var currSegDist = 0;
var markers = new Array();
var currRouteID = -1;
var siteURL = 'http://veloroutes.org/bikemaps'; ///localhost/bikemaps_test
var editMode = false;
var routeColor = "#00FF00";//#0F0";
var trailColor = ""; //default
var badRouteColor = "#FF0000";

var currElevation = 0;
var twoBackElevation = 0;
var totalEleGain = 0;
var lastElevation = null;
var elevationPts = new Array();
var currMaxEle = 0;
var eleUnit = 'ft';
var distUnit = "mi";
var speedUnit = " mph";

var useMetric = false;
var metricRatio = 1.0;//609344;
var footRatio = 1.0;
var lastEle;
var feetInMile = 5280;

var imgRegex = new RegExp("\.jpg|png|gif");//htm|asp|cfm|php", "i");
var infoBarShown = true;

var doGisSearch = false;
var doJumpToLoc = false;

function toggleGisSearch() {
 this.doGisSearch = !this.doGisSearch;
}

function toggleLocJump() {
 this.doJumpToLoc = !this.doJumpToLoc;
}


//create the xmlhttp obj
function createAjaxObj(){
	var httprequest=false;
	httprequest = GXmlHttp.create();
	return httprequest;
} //end func

//change precision so we only have 6 digits after decimal point
function toFixedPrecision(point) {
	var newPoint = new GPoint(point.lat().toFixed(6), point.lng().toFixed(6));
	return newPoint;
}

//get the xml node's value
function getNode(elem) {
	var ret = elem.childNodes;
	return (ret.length > 0) ? ret[0].nodeValue : "";
}

//wrapper for setting an element's value (or innerHTML if applicable)
function setVal(elem,val) {
	var e = getElem(elem);
	if (e.innerHTML) {getElem(elem).innerHTML=val;}
	else if(e.value){getElem(elem).value=val;}
	//e.value=val;
}

function getVal(elem) {
	return document.getElementById(elem).value;
}

//get a document element by name
function getElem(name) {
	return document.getElementById(name);
}


//make it bigger depending on size
function formatDist(dist) {
	return dist;
}

//wrapper for debug output
function dbg(out) {
	GLog.write(out);
}


//load the weather info from local cache
function loadWeather() {
	
try {	
	
	//return; //TODO: not loading weather for now

	var ajaxObj = createAjaxObj();
	
	if(!city) { city = "seattle"; }
	ajaxObj.open("GET", "/rssweather_" + city.replace(/ /,"_") + ".xml", true); 
	
	ajaxObj.onreadystatechange = function() {
	if (ajaxObj.readyState == 4) {
		if (ajaxObj.status==200 || ajaxObj.status==302 || ajaxObj.status==304)
		{ //if request was successful
			var xmldata=ajaxObj.responseXML;
			
			if (xmldata.getElementsByTagName("item").length==0)
			{ //if no <item> elements found in returned content
				document.getElementById("rssweather").innerHTML="<b>Error</b> fetching weather RSS feed...<br />";
				
			}
			else {
				
				document.getElementById("rssweather").innerHTML = '<b>current weather:</b><br>' +
				transformWeather(xmldata.getElementsByTagName("item")[0].getElementsByTagName("description")[0].firstChild.nodeValue.toLowerCase()) + " <br><b>" + transformWeather(xmldata.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].firstChild.nodeValue.toLowerCase()) + " "
				+ xmldata.getElementsByTagName("item")[1].getElementsByTagName("title")[0].firstChild.nodeValue.toLowerCase() + "</b>: " 
				+ transformWeather(xmldata.getElementsByTagName("item")[1].getElementsByTagName("description")[0].firstChild.nodeValue.toLowerCase()) + ' <a TARGET="about:blank" href="http://www.rssweather.com/hw3.php?pands=' + cityZip + '">details</a>';

				ajaxObj = null;
			}
		}
		else {
			document.getElementById("rssweather").innerHTML="<b>Error</b> fetching weather RSS feed...<br />";
		}	
	} 
		
	} //end func
	ajaxObj.send(null);
	
}catch(e) { document.getElementById("rssweather").innerHTML="<b>Error</b> fetching weather RSS feed...<br />"; }
} //end func

//take the weather description and highlight kewords. not the 
// most effecient way
function transformWeather(str) {
	return str.replace(/(freezing|sprinkles|rain|drizzle|showers)/ig,"<b class=\"bb\">$1</b>").replace(/(wind)(\w*)/ig,"<b class=\"bg\">$1$2</b>").replace(/(breezy|gusts|thunderstorms*|cloudy|overcast|fog|haze|mist|smog)/ig,"<b  class=\"bg\">$1</b>").replace(/(clear)/ig,"<b class=\"bc\">$1</b>").replace(/(snow|ice|sleet)/ig, "<b class=\"bw\">$1</b>").replace(/(\d+)/g,"<b class=\"medText\">$1</b>").replace(/(sunny)/ig,"<b class=\"by\">$1</b>");
}
//callback for browser action

//copies an object
function copyTo(o) {
	var c=new Object(); 
	for (var e in o) { c[e] = o[e]; }
	return c;
}

//search routes
function searchRoutes(resCnt,extLink,ignoreGis) {

	var name = getVal("searchValue");

	if(this.doJumpToLoc) {
		findAddrOnMap(name, true, true);
		return;
	}

	var ajaxObj = createAjaxObj();//GXmlHttp.create();

	var elem = getElem("loading");
	if(elem) {elem.innerHTML='<img src="/images/loading.gif" alt="searching..."/>';}

	document.getElementById("searchBtn").disabled = true;

	var MAX_RES = 1000;
	var res_len = (resCnt ? resCnt : MAX_RES);

	if(!ignoreGis && this.doGisSearch) { //skip regular search if so
		if(findAddrOnMap(name, true)) { //gis-search is done here
				
		}
		return;
	}

	ajaxObj.open("GET", "/perl/search_routes.cgi?search_data=" + name + "&result_cnt=" + res_len, true);
	ajaxObj.onreadystatechange = function() {
	try {
		if (ajaxObj && ajaxObj.readyState == 4) {
			if (ajaxObj.status==200 || ajaxObj.status==302 || ajaxObj.status==304)
			{ //if request was successful
	
				//GLog.write("=---->" + ajaxObj);
	
				var xmldata=ajaxObj.responseText;
				
				if (!ignoreGis && (this.doGisSearch || !xmldata))// xmldata.getElementsByTagName("route").length==0))
				{ 	//if no <item> elements found in returned content
					findAddrOnMap(name, true, true); //gis-search is NOT done here
				}
				else 
				{
					getElem("searchResults").innerHTML=xmldata;
					//showXmlResults(xmldata);
				}
			}
			else {
				alert('There was a problem getting the route!\nError Code: ' + ajaxObj.status);
			}
				document.getElementById("searchBtn").disabled = false;	
				var elem = getElem("loading");
				if(elem) {elem.innerHTML="";}
			} 
		} 
		catch(e) { alert("Error getting route data: " + e); }
	}
	ajaxObj.send(null);

	//8/1/07 adding tracking
	urchinTracker('/home/route_search');
}



/* do a search based on a lat/long */
function searchGis(coord,name) {
	var ret = 0;
	             try {
		     
		             if(coord) {
			               var ajaxObj = createAjaxObj();
			            ajaxObj.open("GET", "/perl/search_routes.cgi?g=1&latLong=" + coord.lat() + "," + coord.lng() + "&name=" + name, true);
                           ajaxObj.onreadystatechange = function() {
                                  if(ajaxObj.readyState == 4) {
	                                             //alert(ajaxObj.status);
                                   if (ajaxObj.status==200 || ajaxObj.status==302 || ajaxObj.status==304)
                                         {
                                                var xmldata = ajaxObj.responseText;
                                                if (!xmldata)//.getElementsByTagName("routes").length==0)
                                                   {
						   	alert("no routes found via gis-search");
                                                        //no routes found
                                                   }
                                                   else {
                                                        //showXmlResults(xmldata,true);
							getElem("searchResults").innerHTML=xmldata;
							ret=1;
                                                     }
                                           }
				document.getElementById("searchBtn").disabled = false;	
				var elem = getElem("loading");
				if(elem) {elem.innerHTML="";}
                                   }
			   }
	                  ajaxObj.send(null);
	
			  //8/1/07 adding tracking
 			  urchinTracker('/home/route_search_gis');

			} 													                } catch(e) {
			   alert("Error doing GIS search: " + e.toString());
			     }
	return ret;		     
} //end func

//resolve the addr to latLng
function findAddrOnMap(addr,skipLocal,skipGis) {
	geoCodeAddr(null,addr,true,skipGis);
}

//jump to a coord
function jumpToLoc(latLng,zoom,addr) {
	var r = new RegExp('\d{5}');
	//dbg(addr);
	var req = siteURL + "/?x=" + latLng.lng() + "&y=" + latLng.lat() + "&z=" + zoom;
	window.location = req;
}

//take in a local addr, attemp to geocode it	
function geoCodeAddr(map, addr,nonLocal,skipGis) {

	var geo = new GClientGeocoder();
	var ret;
	if(!nonLocal && this.localSearch) {
		var regex = new RegExp(mapCity, "i");
		//need to add sea-town to the addr?
		if(!regex.test(addr)) { 
			addr += ", " + mapCity + ", " + mapState;
		}
	}

	geo.getLatLng( addr, function(latLong) { 
		
		if(!skipGis && this.doGisSearch) {
				var gis = searchGis(latLong,addr);
				return gis;
		}

		if(map != null && latLong != null) {
			moveMapTo(map, latLong.lat(), latLong.lng(), 16);
		}
		else if(latLong){ jumpToLoc(latLong,12,addr); }
		else {alert("sorry, google can't find the address: " + addr + ". be more specific."); }
		
	});

	return ret;
}

//take an addr and center the map on it
function findAddr() {
	var text = document.getElementById("addrTB").value;
	if(text == null || text.length == 0) { alert("enter an address!"); }
	else {
		geoCodeAddr(this.map, text,false,true);
	}
}

//turn militry time into civilian, and take out leading zeroes from hour
function formatTime(time) {
 var HHMM = time.split(/:/);
 var hrs = parseInt(HHMM[0]);
 return (((hrs < 12) ? hrs : (hrs%12)) + ":" + HHMM[1]);
}

//to handle pressing 'enter' on search boxes
function entsub(event,type) {
  if (event && event.which == 13) {
      if(!type) {
    	searchRoutes(300,true); return;
       }
       else if(type == 1) { findAddr(); }
      else {    return true; }
  }
}

//from bulletproof ajax book by J Keith
function fadeUp(ele,red,green,blue) {
	if(!ele) {dbg("invalid ele");return;}

	if(ele.fade){
		clearTimeout(ele.fade);
	}

	ele.style.backgroundColor = "rgb("+red+","+green+","+blue+")";
	if(red == 255 && green == 255 && blue == 255) {
		return;
	}
	var nred=red+Math.ceil((255-red)/10);
	var ngreen=green+Math.ceil((255-green)/10);
	var nblue=blue+Math.ceil((255-blue)/10);
	var repeat = function() {
		fadeUp(ele,nred,ngreen,nblue);
	};
	ele.fade=setTimeout(repeat,100);
}

function fadeBlueToWhite(_name) {
	//fadeUp(getElem(_name),221,232,241);//#dde8f1
	fadeUp(getElem(_name),172,211,243);//acd3f3
}
