var demo=true;var DEFAULT_LAT=37.7759;var DEFAULT_LON=-122.40884;var MAX_GPS_AGE=60*1000;var MAX_AGE_BEFORE_UPDATING=3*60*1000;var REFRESH_PERIOD=20*1000;var USER_MOVED_DISTANCE_THRESHOLD=100;var REFRESH_EVEN_IF_LOADING_PERIOD=REFRESH_PERIOD+10*1000;var MAX_DISTANCE_TO_STOP=2300;var MAX_NUM_STOPS_TO_DISPLAY=28;var MAX_GPS_ACCURACY=2500;var agent=navigator.userAgent.toLowerCase();var isIPhone=agent.indexOf("iphone")!=-1;var isDroid=agent.indexOf("droid")!=-1;var isFirefox=agent.indexOf("firefox")!=-1;var isChrome=agent.indexOf("chrome")!=-1;var shouldUseGoogleMap=isIPhone||isDroid||isFirefox||isChrome;var lang_trans_map={"Determining your location...":{fr:"Determinar su ubicaci&oacute;n...",es:"Para determinar su posici&oacute;n..."},"Sorry, but your browser does not support geolocation.":{fr:"D&eacute;sol&eacute;, mais votre navigateur ne supporte pas la geolocalizaci&oacute;n.",es:"Lo sentimos, pero tu navegador no soporta geoposicionamiento."},"Since your browser does not support geolocation will use a location in San Francisco":{fr:"Debido a que su navegador no soporta geolocalizaci&oacute;n utilizar&aacute; un lugar en San Francisco",es:"Dado que el navegador no admite el geoposicionamiento, se tomar&aacute; una posici&oacute;n en San Francisco"},"Got old GPS location so trying again. Age was: ":{fr:"Envejeci&oacute; de localizaci&oacute; GPS para volver a intentarlo. La edad fue: ",es:"La posici&oacute;n GPS es caduca, as&iacute; que intente de nuevo. Data de: "},"Sorry, but your GPS system returned an invalid location. Will try again...":{fr:"Lo sentimos, pero su sistema GPS devuelve una ubicaci&oacute;n no v&aacute;lida. Lo intentar&aacute; de nuevo...",es:"Perd&oacute;n, pero el sistema GPS encontr&oacute; una posici&oacute;n inv&aacute;lida. Intentar&aacute; de nuevo..."},"Sorry, but could not determine your location accurately enough. Accuracy in meters: ":{fr:"Lo sentimos, pero no pudo determinar su ubicaci&oacute;n con precisi&oacute;n suficiente. La precisi&oacute;n en metros: ",es:"Perd&oacute;n, pero no se pudo determinar su posici&oacute;n con la exactitud suficiente. Exactitud en metros: "},"Sorry, but could not determine your location. Error: ":{fr:"Lo sentimos, pero no pudo determinar su ubicaci&oacute;n. error: ",es:"Perd&oacute;n, pero no se pudo determinar su posici&oacute;n. Error: "},"Sorry, but there was a problem in getting the data":{fr:"Lo sentimos, pero no era un problema en obtener los datos",es:"Perd&oacute;n, pero hubo un problema con la extracci&oacute;n de datos"},"Sorry, but cannot show you predictions based on location because you did not allow the application to use your location":{fr:"Lo sentimos, pero no puede mostrar las predicciones basadas en la localizaci&oacute;, ya que no permite la aplicaci&oacute;n a utilizar su ubicaci&oacute;n",es:"Perd&oacute;n, pero no se podr&aacute;n visualizar los pron&oacute;sticos porque usted no ha dado permiso para que la aplicaci&oacute;n utilice su posici&oacute;n"}};function getClientLang(){var a;if(navigator.language){a=navigator.language.substring(0,2)}else{a="en"}return a}function getI18nStr(a){if(getClientLang()=="en"){return a}else{return(lang_trans_map[a]&&lang_trans_map[a][getClientLang()])}}function output(b,c,a){b=getI18nStr(b);if(c){b+=" "+c}if(a){b+=" "+a}outputNoI18n(b)}function outputNoI18n(b){var a=document.getElementById("predsByLoc");a.innerHTML="<div class='textOnBackground'>"+b+"</div>"}function outputHTML(b){var a=document.getElementById("predsByLoc");a.innerHTML=b}function debug1(b){var a=document.getElementById("debug");if(a!=null){a.innerHTML="debug=["+b+"  "+timeStr((new Date()).getTime())+"]"}}function debug2(b){var a=document.getElementById("debug2");if(a!=null){a.innerHTML+="debug2=["+b+"  "+timeStr((new Date()).getTime())+"]<br>"}}var loading=false;var loadStartedTime=0;var loadFinishedTime=0;var geolocationDisabled=false;function timeStr(e){var f=new Date(e);var c="";var g=f.getHours();if(g<12){c="AM"}else{c="PM"}if(g==0){g=12}if(g>12){g=g-12}var a=f.getMinutes();a=a+"";if(a.length==1){a="0"+a}var b=f.getSeconds();b=b+"";if(b.length==1){b="0"+b}return g+":"+a+":"+b}var showingPredsByLocPage=false;var showingPredsAndMapForStopPage=false;function predsByLocPageOnFocus(){showingPredsByLocPage=true;loadFinishedTime=0;loading=false;loadIfNeeded()}function predsByLocPageOnBlur(){showingPredsByLocPage=false}var predictionsQueryStr;var vehiclesMapURL;function predictionPageOnFocus(g,f,c,e,h,b,a,d){showingPredsAndMapForStopPage=true;initializeMap(c,e,h,a,d,b);predictionsQueryStr=g;vehiclesMapURL=f;loadStartedTime=(new Date()).getTime();loadFinishedTime=loadStartedTime}function predictionPageOnBlur(){showingPredsAndMapForStopPage=false}function loadIfNeeded(){debug1("loading="+loading+"<br>time="+timeStr((new Date()).getTime())+"<br>loadStartedTime="+timeStr(loadStartedTime)+"<br>loadFinishedTime="+timeStr(loadFinishedTime));var a=(new Date()).getTime();if(showingPredsByLocPage&&!geolocationDisabled){if(a>loadFinishedTime+REFRESH_EVEN_IF_LOADING_PERIOD){output("Determining your location...")}}if(((a>loadFinishedTime+REFRESH_PERIOD&&loading==false))||(a>loadStartedTime+REFRESH_EVEN_IF_LOADING_PERIOD)){debug("enough time elapsed");if(showingPredsByLocPage){debug("about to showPredsBasedOnLoc()");showPredsBasedOnLoc()}if(showingPredsAndMapForStopPage){debug("about to updatePredictionsForStopPage()");updatePredictionsForStopPage()}}}function updatePredictionsForStopPage(){loadStartedTime=(new Date()).getTime();loading=true;_updateStopPage();loadFinishedTime=(new Date()).getTime();loading=false}function _updateStopPage(){var d="/webkit/predictionsOnly.jsp?"+predictionsQueryStr;var c=new XMLHttpRequest();c.open("GET",d);c.onreadystatechange=function(){if(c.readyState==4&&c.status==200){var e=document.getElementById("predictionPagePreds");e.innerHTML=c.responseText}};c.send(null);if(shouldUseGoogleMap){readVehicleXMLAndDisplay();getCurrentLocAndShowOnMap("normal")}else{var b=document.getElementById("vehicles");var a=(new Date()).getTime();b.src=vehiclesMapURL+"&soRefresh="+a}}var prevPosition;function showPredsBasedOnLoc(){loadStartedTime=(new Date()).getTime();loading=true;var a=(new Date()).getTime();if(navigator.geolocation!=null){if(prevPosition!=null&&prevPosition.timestamp+MAX_AGE_BEFORE_UPDATING>a){debug("using old position because it is not that old");getAndDisplayPreds(prevPosition.coords.latitude,prevPosition.coords.longitude,prevPosition.coords.accuracy,prevPosition.timestamp,"showPredsBasedOnLoc");return}debug("getting location for time="+timeStr(new Date()));navigator.geolocation.getCurrentPosition(foundLocationHandler,noLocationHandler,{enableHighAccuracy:true,maximumAge:90000,timeout:20000})}else{output("Sorry, but your browser does not support geolocation.")}}var shouldLoadDueToWatch=false;function locationUpdatedViaWatchPositionHandler(a){debug2("locationUpdatedViaWatchPositionHandler() called");if(a==null){return}if(showingPredsAndMapForStopPage){debug2("in locationUpdatedViaWatchPositionHandler() and showingPredsAndMapForStopPage is true so updating user loc and returning");gotCurrentLocSoShowOnMap(a);return}if(!showingPredsByLocPage){return}var d=a.coords.latitude;var e=a.coords.longitude;debug2("locationUpdatedViaWatchPositionHandler() called lat="+d+" lon="+e);if(prevPosition!=null){var b=distance(d,e,prevPosition.coords.latitude,prevPosition.coords.longitude);if(b<USER_MOVED_DISTANCE_THRESHOLD){prevPosition=a;return}}var c=a.coords.accuracy;if(isIPhone||!demo){if(c>MAX_GPS_ACCURACY){debug2("In locationUpdatedViaWatchPositionHandler() but could not determine your location accurately enough ("+c+"m).");loading=false;return}}prevPosition=a;if(loading){debug2("Got a new location via the watch but alreadying loading preds so will load again when done with current load");shouldLoadDueToWatch=true;return}loadStartedTime=(new Date()).getTime();loading=true;getAndDisplayPreds(d,e,c,a.timestamp,"watchPositionHandler")}function foundLocationHandler(a){debug("foundLocationHandler() called");geolocationDisabled=false;var c=(new Date()).getTime();if(c>a.timestamp+MAX_GPS_AGE){var b=""+Math.round((c-a.timestamp)/(60*1000))+" min";if(getClientLang()!="en"){output("Got old GPS location so trying again. Age was: ",b)}else{output("Got old GPS location so trying again (age was "+b+")...")}setTimeout("showPredsBasedOnLoc()",0);return}debug("location not old...");if(a.coords.latitude==0||a.coords.longitude==0){output("Sorry, but your GPS system returned an invalid location. Will try again...");loading=false;return}prevPosition=a;var d=a.coords.accuracy;if(isIPhone||!demo){if(d>MAX_GPS_ACCURACY){if(getClientLang()!="en"){output("Sorry, but could not determine your location accurately enough. Accuracy in meters: ",d)}else{output("Sorry, but could not determine your location accurately enough ("+d+"m).")}loading=false;return}}debug("location accurate enough");debug2("Got new pos via foundLocationHandler() so getting preds");getAndDisplayPreds(a.coords.latitude,a.coords.longitude,d,a.timestamp,"foundLocationHandler")}function noLocationHandler(a){debug("noLocationHandler() called");loading=false;if(a.code==a.PERMISSION_DENIED){geolocationDisabled=true;var b;if(getClientLang()!="es"){b="Sorry, but cannot show you predictions based on location because you did not allow the application to use your location.";if(isIPhone){b+='<br><br>If you accidentaly hit the "Don\'t Allow" button when the system asked you if it could use your current location then you need to reset the GPS location system. <br><br>To do this, from your homepage click on <b>Settings</b> > <b>General</b> > <b>Reset</b> > <b>Reset Location Warnings</b>, and then try again. Unfortunately after you do this it can still take up to 2 days for your iPhone to allow this application to use your location again.'}}else{b="<p>Perd&oacute;n, pero no se pueden visualizar pr&oacute;nosticos basados en su posici&oacute;n debido a que usted no ha dado permiso para que la aplicaci&oacute;n use su posici&oacute;n.</p><p>Favor de consultar el manual de uso de su dispositivo para instrucciones para reiniciar el sistema de posicionamiento GPS y/o reinicie las preferencias del navegador.</p><p>Nota: Usuarios del iPhone tendr&aacute;n que esperar hasta dos d&iacute;as para volver a usar esta aplicaci&oacute;n.</p>"}outputNoI18n(b)}else{geolocationDisabled=false;if(getClientLang()!="en"){output("Sorry, but could not determine your location. Error: ",a.message,timeStr((new Date()).getTime()))}else{output("Sorry, but could not determine your location. "+timeStr((new Date()).getTime())+" Error: "+a.message)}loadFinishedTime=(new Date()).getTime()-REFRESH_PERIOD+1000;if(prevPosition!=null){getAndDisplayPreds(prevPosition.coords.latitude,prevPosition.coords.longitude,prevPosition.coords.accuracy,prevPosition.timestamp,"noLocationHandler")}}}var predsByLocLoadTime=0;function getAndDisplayPreds(h,a,d,f,e){debug("Starting initGettingPreds() to send request. lat="+h+" lon="+a+" accuracy="+d);var b=(new Date()).getTime();if(b<predsByLocLoadTime+REFRESH_PERIOD/2){loading=false;return}predsByLocLoadTime=b;try{var i="/webkit/predsByLoc.jsp?lat="+h+"&lon="+a+"&maxDis="+MAX_DISTANCE_TO_STOP+"&maxNumStops="+MAX_NUM_STOPS_TO_DISPLAY+"&accuracy="+d+"&timestamp="+f+"&reason="+e;for(var j in moreButtonHitForAgency){if(moreButtonHitForAgency[j]==true){i+="&moreStopsSelected="+j}}request=new XMLHttpRequest();var c=!isIPhone;request.open("GET",i,c);request.onreadystatechange=handleGettingPredsForLoc;request.send(null)}catch(g){loading=false}}function handleGettingPredsForLoc(){if(request.readyState==4){if(request.status==200){outputHTML(request.responseText);loadFinishedTime=(new Date()).getTime();loading=false;if(shouldLoadDueToWatch){debug("Finished getting preds for loc but got new position via watch so loading in new predictions");loading=true;getAndDisplayPreds(prevPosition.coords.latitude,prevPosition.coords.longitude,prevPosition.coords.accuracy,prevPosition.timestamp,"handleGettingPredsForLoc");shouldLoadDueToWatch=false}}else{output("Sorry, but there was a problem in getting the data");loading=false}}}var moreButtonHitForAgency=new Array();function showMoreStops(b){moreButtonHitForAgency[b]=true;var c=document.getElementById("moreStopsButton"+b);if(c){c.style.display="none"}var d=document.getElementById("fewerStopsButton"+b);if(d){d.style.display="block"}var a=document.getElementById("moreStops"+b);if(a){a.style.display="block"}}function showFewerStops(b){moreButtonHitForAgency[b]=false;var c=document.getElementById("moreStopsButton"+b);if(c){c.style.display="block"}var d=document.getElementById("fewerStopsButton"+b);if(d){d.style.display="none"}var a=document.getElementById("moreStops"+b);if(a){a.style.display="none"}}setInterval("loadIfNeeded()",300);var watchId=navigator.geolocation.watchPosition(locationUpdatedViaWatchPositionHandler);debug2("started geo watch. WatchId="+watchId);
