// JavaScript Document

	var markerList = new Object;
	var thing = "thisthing";
	var returnList = '';
	var watcherCounter=1;
	vehicleMarkerList = new Object;

	vehicleList = new Object;
	vList = new vListObj;

	watcherObjList = new Object();
	vehicleToFollow='';


//alert('watcherjs');
function vRoute(tag)
{
	this.tag = tag;
	this.vehicles = new Object();

	this.watcher='';

	this.setWatcher=function(routeTag){
		var selectors = document.getElementsByTagName('select');
		for(selector in selectors){
			if(selectors[selector].selectedIndex){
				if(document.getElementById(selectors[selector].id).options[selectors[selector].selectedIndex].value==routeTag){
					this.watcher=selectors[selector].parentNode.id;
					return;
				}

				if(document.getElementById(selectors[selector].id).options[selectors[selector].selectedIndex].value=='trains'){
					this.watcher=selectors[selector].parentNode.id;
				}
			}
		}
	}
}

function watcherObj(name,route ){
	this.id=name;
	this.routeTag = route;
	this.vehicleList = new vListObj
}

function vListObj(something){
	//this.routes = new Object();



}
	     
function vObj(vehicleID,routeTag,lat,lng,infoHtml,shortInfoHtml,gMarker,recordID,eLabelOld,vehicleType,heading){
	// from below var gPoint=new GLatLng(lat,lng);
	
	
	this.vehicleID = vehicleID;
	this.routeTag = routeTag;
	this.lat = lat;
	this.lng = lng;
		this.gPoint=new GLatLng(this.lat,this.lng);
	this.heading = heading;
	this.infoHtml = infoHtml;
	this.gMarker = gMarker;
	this.recordID = recordID;
	this.shortInfoHtml = shortInfoHtml;
	//this.arrow = this.setArrow();
	//this.eLabel = eLabel;
	
	this.arrow = function(){
		heading = this.heading;
		   	if((heading >= 0 ) && (heading <= 20 ))
        	arrow='N';
        if((heading > 20 ) && (heading < 70 ))
        	arrow='NE';
        else if((heading >= 70 ) && (heading <= 110 ))
        	arrow='E';
        else if((heading > 110 ) && (heading < 160 ))
        	arrow='SE';
        else if((heading >=160 ) && (heading <=200 ))
        	arrow='S';
        else if((heading > 200 ) && (heading < 250 ))
        	arrow='SW';
        else if((heading >= 250 ) && (heading <= 290 ))
        	arrow='W';
        else if((heading > 290 ) && (heading < 340 ))
        	arrow='NW';
        else if((heading >= 340) && (heading <= 360 ))
        	arrow='N';
	else
	    arrow='onePxClear';
        return arrow;
	}
	
	this.eLabelHTML = function(){
		htmlString = '<div class="vehicleLabel">'
					+ '<span class="vehicleLabel_Id">' + this.vehicleID 
						+ '<img class="arrowIcon" src="images/' + this.arrow() + '.gif">'

					
					+ '</span>' 

			+ ''
			+ '<span class="vehicleLabel_Route">' + this.routeTag + '</span>' 

			+ '</div>';
		return htmlString;
	}
	
	
	this.eLabel= new ELabel(this.gPoint, this.eLabelHTML(), null,new GSize(-27,50));
	//alert('add overlay!');
	map.addOverlay(this.eLabel);

	
	
	//	var eLabelPoint = new GSize(-15,35);

	this.infoLabelState='short';
	this.vehicleType=vehicleType;



	this.update=function(lat,lng,heading){
		point=new GLatLng(lat,lng);

	
		this.gMarker.setPoint(point);
		this.lat = lat;
		this.lng = lng;
				this.gPoint=new GLatLng(lat,lng);
		this.heading = heading;
		this.infoHtml =infoHtml;
		//this.recordID=newVehicleObj.recordID;
		//this.shortInfoHtml=newVehicleObj.shortInfoHtml;
		//this.infoHtml = newVehicleObj.infoHtml;

		//if(vehicleToFollow==this.vehicleID)
         	//document.= this.infoHtml + "stop following me";

		this.eLabel.setPoint(point);
		if(this.infoLabelState=='short'){
          	this.eLabel.setContents(this.eLabelHTML());
         }
         else{
            this.eLabel.setContents(this.infoHtml);
         }

	}
	
	
	
	
	

}
// ====== set up marker mouseover tooltip div ======

function timer(){
	showAll();
	timerVar = setTimeout('timer()',10000);
}

function setFollower(vehicleID){

	if(vehicleToFollow !== ''){
		if(document.getElementById('followLink' + vehicleToFollow)){
		document.getElementById('followLink' + vehicleToFollow).innerHTML=
		'<a onclick="setFollower(\'' + vehicleToFollow +'\')" href="javascript:void(0);">Follow Me</a>';
		}
	}

	vehicleToFollow=vehicleID;

	if(vehicleToFollow !== ''){
		document.getElementById('followLink' + vehicleID).innerHTML=
			'<a onclick="setFollower(\'\')" href="javascript:void(0);">Stop Following Me</a>';
	}
}

function stopFollower(vehicleID){

	//if(vehicleToFollow !== ''){
		document.getElementById('followLink' + vehicleID).innerHTML=
		'<a onclick="setFollower(\'\')" href="javascript:void(0);">Follow Me</a>';
	//}

	vehicleToFollow='';
	/*
	if(vehicleID !== '')
		document.getElementById('followLink' + vehicleID).innerHTML=
		'<a onclick="setFollower(\'\')" href="javascript:void(0);">Stop Following Me</a>';
		*/
}

function getWatcherSelectorList(){
	var selectors = document.getElementsByTagName('select');
	var foundSelectors = new Object();
	for(selector in selectors){
		if(selectors[selector].selectedIndex){

			foundSelectors[selectors[selector].id]=document.getElementById(selectors[selector].id);
			//if(document.getElementById(selectors[selector].id).options[selectors[selector].selectedIndex].value==routeTag)
				//this.watcher=selectors[selector].parentNode.id;
		}
	}
	return foundSelectors;
}

function showAll(){

	query='';
	/*
	for(watcher in watcherObjList){
		if(watcherObjList[watcher].routeTag){
			if(watcherObjList[watcher].routeTag !== 'zilch')
				query += watcherObjList[watcher].routeTag +',';
		}

	}
	*/
	//alert(query);
/*
	var selectors = getWatcherSelectorList();
	for(selector in selectors){
		//alert(selector);


		//alert(document.getElementById(selectors[selector].id).options[selectors[selector].selectedIndex].value)
			//this.watcher=selectors[selector].parentNode.id;
		if(document.getElementById(selectors[selector].id).options[selectors[selector].selectedIndex].value !== 'zilch')
			query += document.getElementById(selectors[selector].id).options[selectors[selector].selectedIndex].value +',';
	}
	*/

for(route in vList){
	query += route + ',';
}


	if(query != ''){
		loadXMLDoc('watcherRouteLocationsGxml',query + '|',null);

	}
}

function setWatcherRoute(watcherSelector){

	routeTag = watcherSelector[watcherSelector.selectedIndex].value;
	//alert(routeTag);

	if(routeTag=='null'){

		var answer = confirm ("There are several hundred non-routed (null) vehicles.  This will take a while to display	and will hang your browser until loading is complete. Continue?")
		if (!answer)
			return;

	}


	if(routeTag !== 'zilch'){
		//document.getElementById(caller + 'loadingImg').src="images/spinner.gif";

		for(route in vList){
			if(vList[route].watcher == watcherSelector.parentNode.id){
			for(vehicle in vList[route].vehicles){
				map.removeOverlay(vList[route].vehicles[vehicle].gMarker);
				map.removeOverlay(vList[route].vehicles[vehicle].eLabel)
				//delete vList[routeTag].vehicles[vehicle];
			}
			delete vList[route];
			}
		}

		document.getElementById(watcherSelector.parentNode.id + '_vehicleIdListBox').innerHTML = '';
		loadXMLDoc('watcherRouteLocationsGxml',routeTag + '|',null);

	}
}

function removeWatcher(watcherId){
	for(route in vList){
		if(vList[route].watcher == watcherId){
			for(vehicle in vList[route].vehicles){
				map.removeOverlay(vList[route].vehicles[vehicle].gMarker);
				map.removeOverlay(vList[route].vehicles[vehicle].eLabel)
				//delete vList[routeTag].vehicles[vehicle];
			}
			delete vList[route];
		}
	}
  	document.getElementById('watchers').removeChild(document.getElementById(watcherId));
}

function centerMapOn(route, vehicleID){
	//alert(watcherObjList[caller]);
	 map.setCenter(new GLatLng(vList[route].vehicles[vehicleID].lat,vList[route].vehicles[vehicleID].lng),15);
}


function getNewWatcherDropdown(){
	loadXMLDoc('getNewWatcherDropdown',watcherCounter +'|');
}

function getNewWatcherDropdownHTTP(caller){
	var watcherDiv = document.getElementById('watchers');
  	var newdiv = document.createElement('div');
  	var watcherName = 'watcher' + watcherCounter;
  	newdiv.setAttribute('id',watcherName);
  	newdiv.setAttribute('class','watcherBox');
  	newdiv.innerHTML = result;
  	watcherDiv.appendChild(newdiv);
			watcherCounter++;

	//watcherObjList[watcherName] = new watcherObj(watcherName);

	if(watcherName=='watcher1'){
		document.getElementById(watcherName + "_selector").selectedIndex=1;
		setWatcherRoute(document.getElementById(watcherName + "_selector"));
	}


}


function getWatcherRouteLocationsGxmlHTTP(caller){
	//if (http_request.readyState == 4){if (http_request.status == 200){result = http_request.responseText;

	var newVehicleMarkerList = new Object;


	try{var xmlDoc = http_request.responseXML;}
	catch(err){document.getElementById('debug').innerHTML = "hosting problem.. will try again shortly";}

	var vehicleSets = xmlDoc.documentElement.getElementsByTagName("vehicles");

	
	
	for (var v = 0; v < vehicleSets.length; v++) {
		document.getElementById('debug').innerHTML = "	";
			var vehicleSetRoutTag = vehicleSets[v].getAttribute('routeTag');

			var markers =vehicleSets[v].getElementsByTagName("marker");

			//alert(caller);
			var vehiclesThisTime = new Object;
			var htmlVehicleIdList = '<ul>';
			for (var i = 0; i < markers.length; i++) {
				// obtain the attribues of each marker

				var recordID = markers[i].getAttribute("recordID");
				var routeTag = markers[i].getAttribute("routeTag");
				var vehicleID = markers[i].getAttribute("label");

				
//alert('Found: '+vehicleID);
				
				if(vList[routeTag]){
					//alert('have ' + routeTag)
				}
				else{
					//alert('dont have' + routeTag)
					vList[routeTag] = new vRoute(routeTag);
					vList[routeTag].setWatcher(routeTag);
				}

				vehiclesThisTime[vehicleID] = vehicleID;
/*
			if(vList[routeTag].vehicles[vehicleID]){
				//if(vList[routeTag].vehicles[vehicleID].recordID == recordID)
				continue;
			}
*/
				var lat = parseFloat(markers[i].getAttribute("lat"));
				var lng = parseFloat(markers[i].getAttribute("lng"));
				var heading = parseFloat(markers[i].getAttribute("heading"));
				var point = new GLatLng(lat,lng);
				var infoHtml = markers[i].getAttribute("html");



				var vehicleType = markers[i].getAttribute("vehicleType");

				if(vehicleID == vehicleToFollow){
					map.setCenter(point,map.getZoom());
					infoHtml = infoHtml
					+ '<div id="followLink' + vehicleID + '" class="followLinkBox">'
					+'<a onclick="stopFollower(\'' + vehicleID + '\')" href="javascript:void(0);">Stop Following Me</a></div>';
				}
				else{

					infoHtml = infoHtml
					+ '<div id="followLink' + vehicleID + '" class="followLinkBox">'
					+'<a onclick="setFollower(\'' + vehicleID + '\')" href="javascript:void(0);">Follow Me</a></div>';

				}

				var gMarker = createMarker(point,vehicleID,'',routeTag,vehicleType);

				var gPoint=new GLatLng(lat,lng);



				if(vehicleType=='service'){
					var eLabelPoint = new GSize(-15,35);
					var shortInfoHtml = '<div class=\"eLabel\"><p>'+ vehicleID + "</p></div>";
				}
				if(vehicleType=='hybrid'){
					var eLabelPoint = new GSize(-15,45);
					var shortInfoHtml = '<div class=\"eLabel\">' + vehicleID + "</p></div>";
				}
				if(vehicleType=='bus'){
					var eLabelPoint = new GSize(-15,55)
					var shortInfoHtml = '<div class=\"eLabel\">' + routeTag + "<p>" + vehicleID + "</p></div>";
				}
				if(vehicleType=='train'){
					var eLabelPoint = new GSize(-15,55)
					var shortInfoHtml = '<div class=\"eLabel\">' + routeTag + "<p>" + vehicleID + "</p></div>";
				}
				if(vehicleType=='cable'){
					var eLabelPoint = new GSize(-15,35)
					var shortInfoHtml = '<div class=\"eLabel\"><p>' + vehicleID + "</p></div>";
				}


					//var eLabel = new ELabel(gPoint, shortInfoHtml, null,eLabelPoint);



    			//var eLabel = new ELabel(gPoint, shortInfoHtml, null,eLabelPoint);
				//var vehicleObj = new vObj(vehicleID,routeTag,lat,lng,infoHtml,shortInfoHtml,gMarker,recordID,eLabelPoint,vehicleType,heading);
				

				if(vList[routeTag].vehicles[vehicleID]){

//					if(vList[routeTag].vehicles[vehicleID].recordID !== recordID){
						vList[routeTag].vehicles[vehicleID].update(lat,lng,heading);

//					}

				}
				else{
									var vehicleObj = new vObj(vehicleID,routeTag,lat,lng,infoHtml,shortInfoHtml,gMarker,recordID,null,vehicleType,heading);

					vList[routeTag].vehicles[vehicleID]=vehicleObj;
					map.addOverlay(vehicleObj.gMarker);
					//map.addOverlay(vehicleObj.eLabel);
				}

			}//for markers
			
			if(!vehiclesThisTime){
				if(vehicleSets.length==0)
				document.getElementById('debug').innerHTML = "None Found";
			}

			for(name in vehiclesThisTime){
				htmlVehicleIdList += '<li><a href="javascript:void(0);" onClick="centerMapOn(\'' + routeTag + '\',\'' + name + '\')">'
				+ name;
				if(vehicleToFollow == name)
					htmlVehicleIdList += '</a> (Following) ';
				htmlVehicleIdList += "</li>";
			}

			//alert('trying' + routeTag);

			//if(!vehiclesThisTime)
				//alert('none found!');



			if(vList[routeTag]){
					document.getElementById(vList[routeTag].watcher + '_vehicleIdListBox').innerHTML = htmlVehicleIdList + "</ul>";

				for(vehicle in vList[routeTag].vehicles){
					//alert(watcherObjList[caller].vehicleList[vehicle].vehicleID);

					var watcherVehicleID = vList[routeTag].vehicles[vehicle].vehicleID;
					//alert(watcherVehicleID);


					if(vehiclesThisTime[watcherVehicleID]){
						//alert('found' + watcherObjList[caller].vehicleList[vehiclesThisTime[vehicle].vehicleID].vehicleID)
					}
					else{
						//alert(watcherVehicleID + " is gone")
						map.removeOverlay(vList[routeTag].vehicles[vehicle].gMarker);
						map.removeOverlay(vList[routeTag].vehicles[vehicle].eLabel);
						delete vList[routeTag].vehicles[vehicle];
					}


				}
			}


			//document.getElementById(caller + 'loadingImg').src="images/onePxClear.gif";
	//document.getElementById(caller + '_vehicleIdListBox').innerHTML = htmlVehicleIdList + "</ul>";

	}//for vehicles










//}
//else {alert('There was a problem with the request2.' + http_request.status);}
	//}
}

////////////////



function createMarker(point,name,html,routeTag,vehicleType) {
	//alert(html);

						//var icon = new GIcon();
					//
//icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";

var icon = new GIcon();
/*
if(name.substring(0,1)>1)
	icon.image = "/map/images/bus.png";
else
	icon.image = "/map/images/train.png";
*/
icon.image = "/spotter/images/" + vehicleType +".png";
//icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";

//icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
icon.iconSize = new GSize(25, 25);
icon.shadowSize = new GSize(25, 25);
icon.iconAnchor = new GPoint(12, 12);
icon.infoWindowAnchor = new GPoint(5, 1);





				if(vehicleType=='service'){
					var eLabelPixelOffset = new GSize(-15,75)

				}
				if(vehicleType=='hybrid'){
					var eLabelPixelOffset = new GSize(-15,55)

				}
				if(vehicleType=='bus'){
					var eLabelPixelOffset = new GSize(-15,55)

				}
				if(vehicleType=='train'){
					var eLabelPixelOffset = new GSize(-15,55)

				}
				if(vehicleType=='cable'){
					var eLabelPixelOffset = new GSize(-15,55)

				}




        var marker = new GMarker(point,icon);
        GEvent.addListener(marker, "click", function() {
        	//thinger=vList[routeTag].vehicles[name].eLabel;
        	//alert(thinger.div_.offsetHeight);
          //marker.openInfoWindowHtml(vMarkerInfoWindow(caller,name));
          
          var theLabel =  vList[routeTag].vehicles[name];
         if(theLabel.infoLabelState=='short'){
          	vList[routeTag].vehicles[name].eLabel.pixelOffset=new GSize(-100,125+vList[routeTag].vehicles[name].eLabel.div_.offsetHeight);
          	thinger=vList[routeTag].vehicles[name].infoHtml;
            vList[routeTag].vehicles[name].eLabel.setContents(vList[routeTag].vehicles[name].infoHtml);
            vList[routeTag].vehicles[name].infoLabelState='long';
         }
         else{
         	vList[routeTag].vehicles[name].eLabel.pixelOffset=new GSize(-27,50);//new GSize(-15,55);
            //vList[routeTag].vehicles[name].eLabel.setContents(vList[routeTag].vehicles[name].shortInfoHtml);
            vList[routeTag].vehicles[name].infoLabelState='short';
            
             vList[routeTag].vehicles[name].eLabel.setContents(vList[routeTag].vehicles[name].eLabelHTML());
         }

        });

        return marker;
      }

function vMarkerInfoWindow(caller, vehicleID){
	//return '<a href="#" onClick="tracker(vehicleID)">follow me</a>';
	thing=watcherObjList[caller].vehicleList[vehicleID].html;
	alert(thing);
	return thing;
}



function displayMarker2(marker, caller){
	//document.getElementById(caller + "_IdList").innerHTML='';
		map.addOverlay(marker.gMarker);




	var labelHtml =  '<div style="background-color:white">' + marker.vehicleID + "</div>";
    //var label = new ELabel(marker.gMarker.latLng, labelHtml, null, null, useUpperRightPointer, 100);
    //var label = new ELabel(new GLatLng(marker.lat,marker.lng), labelHtml, "style1");
    map.addOverlay(marker.eLabel);


}

//////-----HTTP thingies----

function req(what)
{
	//alert(what);
	//this.name = rname;
	//caller=rname;
	//alert(this.caller);
	this.http = function()
	{
		if (http_request.readyState == 4) {
			if (http_request.status == 200){
				    	//alert(http_request.responseText + ' ' + thing);
				    	//alert(rname);
				    	result = http_request.responseText;
				 if (what=="getDirsForRoute")
					return getDirsForRoute();
				if (what=="hybridsGetPickerHTML")
					return http_hybridsGetPickerHTML();
				if (what =="getNewWatcherDropdown")
					return getNewWatcherDropdownHTTP();
				if (what =="watcherRouteLocationsGxml")
					return getWatcherRouteLocationsGxmlHTTP();

			}
		}

	};

  return true;
}

function loadXMLDoc(functionRef, params, what)
{
	    //url = "ajax_scripts/"
    url = "../_includes/ajax.php?action=" + functionRef + "&params=" + params;
    //alert(url);
    if (window.XMLHttpRequest)
	{// branch for native XMLHttpRequest object
        http_request = new XMLHttpRequest();
        //http_request.onreadystatechange = processSomething(functionRef);//getDirsForRoute;

        reqThing = new req(functionRef);
        //reqObjs[caller] = new req(caller,functionRef);
            http_request.onreadystatechange = reqThing.http;
            //http_request.onreadystatechange = reqObjs[caller].http;







        http_request.open("GET", url, true);


        	try{
			http_request.send(null);
	}
	catch(err){
		document.getElementById('debug').innerHTML = "hosting problem.. will try again shortly";
	}

		//document.getElementById('status').innerHTML = document.getElementById('status').innerHTML + "<BR>Firefox start";
    }
	else if (window.ActiveXObject)
	{// branch for IE/Windows ActiveX version
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
		//document.getElementById('status').innerHTML = document.getElementById('status').innerHTML + "<BR>IE Start";
        if (http_request)
		{
			reqThing = new req(caller,functionRef);
            //http_request.onreadystatechange = processSomething(functionRef, caller);//getDirsForRoute;
            http_request.onreadystatechange = reqThing.http;
            http_request.open("GET", url, true);
            http_request.send();
        }
    }

    	if (!http_request)
	{alert('Cannot create XMLHTTP instance');
	 return false;}
} //End LoadXMLDoc


