var UPDATE_VEHICLES_INTERVAL=10000;var INTERPOLATION_CNT=20;var TIMEOUT_BETWEEN_SCOOTCHING=30;var DISTANCE_AT_WHICH_SHOULD_ZOOM_OUT=250;var DEFAULT_ZOOM_LEVEL=15;var USER_LOCATION_ZINDEX=10002;var VEHICLE_MARKER_ZINDEX=10001;var NEAREST_STOP_MARKER_ZINDEX=10000;var STOP_MARKER_ZINDEX=1000;var ROUTE_COLOR="00FFFF";var MAX_GPS_AGE_FOR_GETTING_USER_LOC=30*1000;var globalAgencyTag;var globalRouteTag;var globalStopTag;var globalUserLat;var globalUserLng;var keyForNextTime;var lastTimeVehicleLocsRead=0;var vehicles;var vehiclesBeingScootched=new Array();var map=null;function VehicleObject(d,a,b,c){this.id=d;this.previousLatLng=a;this.latLng=b;this.heading=c;this.marker=null;vehicles[d]=this}function getRoundedHeading(b){var a=Math.round(b/15)*15;if(a==360){a=0}return a}VehicleObject.prototype.addMarker=function(){if(this.heading<0){return}var c=getRoundedHeading(this.heading);var e="white";e="black";var b="/webkit/images/arrow_"+c+".gif";debug("In addmarker(), drawing vehicle="+this.id+" this.heading="+this.heading+" roundedHeading="+c);var d=new google.maps.MarkerImage(b,new google.maps.Size(25,25),new google.maps.Point(0,0),new google.maps.Point(12,12));var a=new google.maps.Marker({position:this.latLng,map:map,icon:d,zIndex:VEHICLE_MARKER_ZINDEX,clickable:false});this.marker=a};VehicleObject.prototype.removeMarker=function(){if(this.marker!=null){this.marker.setMap(null);this.marker=null}};VehicleObject.prototype.addInterpolatedMarker=function(e,c){var d=this.previousLatLng.lat()+(this.latLng.lat()-this.previousLatLng.lat())*e/c;var a=this.previousLatLng.lng()+(this.latLng.lng()-this.previousLatLng.lng())*e/c;var b=new google.maps.LatLng(d,a);this.marker.setPosition(b)};function scootchVehicles(){if(currentInterpolationCnt>INTERPOLATION_CNT){debug("Should not be here!");vehiclesBeingScootched=new Array();return}for(var a=0;a<vehiclesBeingScootched.length;++a){var b=vehiclesBeingScootched[a];b.addInterpolatedMarker(currentInterpolationCnt,INTERPOLATION_CNT)}if(currentInterpolationCnt<INTERPOLATION_CNT){++currentInterpolationCnt;setTimeout("scootchVehicles()",TIMEOUT_BETWEEN_SCOOTCHING)}else{vehiclesBeingScootched=new Array()}}function distance(b,e,a,c){var d=Math.PI/180;var h=1851.85185185185;var f=a-b;var i=c-e;i*=Math.cos(0.5*(b+a)*d);var g=Math.sqrt(f*f+i*i);return g*60*h}function downloadUrl(b,f){var a=-1;var c=new XMLHttpRequest();c.onreadystatechange=function(){if(c.readyState==4){try{a=c.status}catch(g){}if(a==200){f(c.responseXML,c.responseText,c.status);c.onreadystatechange=function(){}}}};c.open("GET",b,true);try{c.send(null)}catch(d){alert("GOT ERROR");changeStatus(d)}}var routeColor;var routeOppositeColor;var googleMapJavascriptLoaded=false;function initializeMap(c,e,f,a,d,b){vehicles=new Array();userLocationMarker=null;globalAgencyTag=c;globalRouteTag=e;globalStopTag=f;globalUserLat=a;globalUserLng=d;keyForNextTime=b;if(googleMapJavascriptLoaded){finishInitingMapSinceAPILoaded()}else{loadGoogleMapJavascript()}}function loadGoogleMapJavascript(){if(googleMapJavascriptLoaded){return}var a=document.createElement("script");a.type="text/javascript";a.src="http://maps.google.com/maps/api/js?v=3.3&sensor=true&callback=finishInitingMapSinceAPILoaded";document.body.appendChild(a)}function finishInitingMapSinceAPILoaded(){googleMapJavascriptLoaded=true;var a="/service/googleMapXMLFeed?command=routeConfig&a="+globalAgencyTag+"&r="+globalRouteTag+"&key="+keyForNextTime;downloadUrl(a,readRouteFromXML)}function readRouteFromXML(d,q){var o=d.documentElement.getElementsByTagName("Error");if(o.length>0){var c=o[0].getAttribute("shouldRetry");if(c!=null&&c.match("true")){debug("In readRouteFromXML(). Agency not yet initted so setting timeout to load data again");setTimeout("finishInitingMapSinceAPILoaded()",1000)}else{error(o[0].firstChild.data)}return}var r;var a=d.documentElement.getElementsByTagName("route");for(var z=0;z<a.length;z++){var m=a[z].getElementsByTagName("stop");for(var x=0;x<m.length;++x){var h=m[x].getAttribute("tag");if(h==globalStopTag){var l=m[x].getAttribute("lat");if(l==null){break}var f=m[x].getAttribute("lon");r=new google.maps.LatLng(parseFloat(l),parseFloat(f));break}}}var p;var t=null;if(globalUserLat!=null&&globalUserLng!=null){t=new google.maps.LatLng(globalUserLat,globalUserLng)}var e=null;if(t==null){p=r}else{p=new google.maps.LatLng((t.lat()+r.lat())/2,(t.lng()+r.lng())/2);var s=distance(t.lat(),t.lng(),r.lat(),r.lng());if(s>=DISTANCE_AT_WHICH_SHOULD_ZOOM_OUT){e=new google.maps.LatLngBounds();e.extend(r);e.extend(t)}}var B={zoom:DEFAULT_ZOOM_LEVEL,center:p,mapTypeId:google.maps.MapTypeId.ROADMAP,mapTypeControl:true,mapTypeControlOptions:{style:google.maps.MapTypeControlStyle.DEFAULT},zoomControl:true,zoomControlOptions:{style:google.maps.ZoomControlStyle.SMALL},scaleControl:true,streetViewControl:false};map=new google.maps.Map(document.getElementById("map_canvas"),B);if(e!=null){map.fitBounds(e)}showUserLocation(t);var C=new google.maps.Marker({position:r,map:map,zIndex:NEAREST_STOP_MARKER_ZINDEX,clickable:false});for(var z=0;z<a.length;z++){routeColor=a[z].getAttribute("color");routeOppositeColor=a[z].getAttribute("oppositeColor");var g=new google.maps.MarkerImage("/webkit/images/stopMarkerRed.gif",new google.maps.Size(7,7),new google.maps.Point(0,0),new google.maps.Point(4,4));var m=a[z].getElementsByTagName("stop");for(var x=0;x<m.length;++x){var l=m[x].getAttribute("lat");if(l==null){continue}var f=m[x].getAttribute("lon");var u=new google.maps.LatLng(parseFloat(l),parseFloat(f));var n=new google.maps.Marker({position:u,map:map,icon:g,zIndex:STOP_MARKER_ZINDEX,clickable:false})}var v=a[z].getElementsByTagName("path");for(var x=0;x<v.length;++x){var b=[];var y=v[x].getElementsByTagName("point");for(var w=0;w<y.length;++w){var l=parseFloat(y[w].getAttribute("lat"));var f=parseFloat(y[w].getAttribute("lon"));var u=new google.maps.LatLng(l,f);b.push(u)}var A=new google.maps.Polyline({path:b,strokeColor:"#"+ROUTE_COLOR,strokeWeight:5,strokeOpacity:0.7});A.setMap(map)}}readVehicleXMLAndDisplay()}function readVehicleXMLAndDisplay(){var a="/service/googleMapXMLFeed?command=vehicleLocations&a="+globalAgencyTag+"&r="+globalRouteTag+"&t="+lastTimeVehicleLocsRead+"&key="+keyForNextTime;downloadUrl(a,readVehiclesFromXML)}function readVehiclesFromXML(k,n){vehiclesBeingScootched=new Array();var f=k.documentElement.getElementsByTagName("lastTime");lastTimeVehicleLocsRead=f[0].getAttribute("time");var g=k.documentElement.getElementsByTagName("keyForNextTime");keyForNextTime=g[0].getAttribute("value");var o=k.documentElement.getElementsByTagName("vehicle");for(var j=0;j<o.length;++j){var c=o[j];var l=c.getAttribute("predictable");if("true"!=l){continue}var b=c.getAttribute("id");var m=parseFloat(c.getAttribute("lat"));var a=parseFloat(c.getAttribute("lon"));var e=new google.maps.LatLng(m,a);var p=parseInt(c.getAttribute("heading"));var d=vehicles[b];if(d==null){d=new VehicleObject(b,e,e,p);d.addMarker()}else{var h=c.getAttribute("routeTag");if(h=="null"){h=""}if(h==globalRouteTag){d.previousLatLng=d.latLng;d.latLng=e;vehiclesBeingScootched.push(d);if(getRoundedHeading(p)!=getRoundedHeading(d.heading)){d.removeMarker();d.heading=p;d.addMarker()}d.addInterpolatedMarker(1,INTERPOLATION_CNT,p)}else{d.removeMarker();delete vehicles[b]}}}if(vehiclesBeingScootched.length>0){currentInterpolationCnt=2;setTimeout("scootchVehicles()",TIMEOUT_BETWEEN_SCOOTCHING)}}function getCurrentLocAndShowOnMap(a){debug("In getCurrentLocAndShowOnMap() and reason="+a);navigator.geolocation.getCurrentPosition(gotCurrentLocSoShowOnMap,noLocationHandler2,{enableHighAccuracy:true,maximumAge:0,timeout:20000})}function gotCurrentLocSoShowOnMap(a){var c=(new Date()).getTime();if(c>a.timestamp+MAX_GPS_AGE_FOR_GETTING_USER_LOC){var b=""+Math.round((c-a.timestamp)/(60*1000))+" min";debug("Got old GPS for user loc so trying again (age was "+b+")...");setTimeout("getCurrentLocAndShowOnMap('old gps')",0);return}var d=new google.maps.LatLng(a.coords.latitude,a.coords.longitude);debug("Updating user loc in map to "+d.lat()+","+d.lng());showUserLocation(d)}function noLocationHandler2(){}var userLocationMarker=null;function showUserLocation(b){if(b==null||map==null){return}if(userLocationMarker==null){var a=new google.maps.MarkerImage("/webkit/images/gpsLoc.gif",new google.maps.Size(17,17),new google.maps.Point(0,0),new google.maps.Point(8,8));userLocationMarker=new google.maps.Marker({position:b,map:map,icon:a,zIndex:USER_LOCATION_ZINDEX,clickable:false})}else{userLocationMarker.setPosition(b)}};
