Date.prototype.getISO8601=function(){var b=10>this.getMonth()+1?"0"+this.getMonth()+1:this.getMonth()+1,a=10>this.getDate()?"0"+this.getDate():this.getDate(),c=10>this.getHours()?"0"+this.getHours():this.getHours(),d=10>this.getMinutes()?"0"+this.getMinutes():this.getMinutes(),e=10>this.getSeconds()?"0"+this.getSeconds():this.getSeconds(),f=this.getTimezoneOffset()/60;return this.getFullYear()+"-"+b+"-"+a+"T"+c+":"+d+":"+e+"-0"+f+"00"};
Date.prototype.getPrettyTime=function(){var b=10>this.getMinutes()?"0"+this.getMinutes():this.getMinutes(),a=this.getHours(),c="AM";12<a?(c="PM",a-=12):0==a&&(a="12");return a+":"+b+" "+c};Date.prototype.getPrettyDateTime=function(){var b=this.getMonth()+1,a=10>this.getDate()?"0"+this.getDate():this.getDate();return b+"/"+a+"/"+this.getFullYear()+" "+this.getPrettyTime()};
Date.prototype.ago=function(){var b=((new Date).getTime()-this.getTime())/1E3,a=Math.floor(b/86400),c=1==a?"":"s";if(60>b)return"less than a minute ago";if(3600>b)return a=Math.round(b/60),a.toString()+" minute"+(1==a?"":"s")+" ago";if(86400>b)return a=Math.floor(b/3600),c=1==a?"":"s",1==a&&(a="an"),"over "+a.toString()+" hour"+c+" ago"};var Incident=function(b){for(var a in b)this[a]=b[a]};
Incident.prototype.makeListItem=function(b){var a=this,c=new Date(1E3*this.LogTime),d=this.geolocation?this.geolocation:null,b=jQuery("<li/>").attr("id",this.ID).addClass("incident").addClass("vevent").appendTo(b);this.moreButton=jQuery("<div/>").addClass("more").click(function(){jQuery(this).hasClass("opened")?a.hideDetailBox():a.showDetailBox()}).mousedown(function(){jQuery(this).addClass("mousedown")}).mouseup(function(){jQuery(this).removeClass("mousedown")}).appendTo(b);jQuery("<div/>").addClass("marker").css("background-position",
this.getIcon().cssPosition).appendTo(b);jQuery("<div/>").addClass("logtype summary").html(this.LogType).appendTo(b);var e=this.city?this.city:this.Area;jQuery("<div/>").addClass("location").html(this.Location+"<br/>"+e).appendTo(b);jQuery("<div/>").addClass("logtime").html(c.getPrettyDateTime()).append(jQuery("<span/>").addClass("dtstart").html(c.getISO8601())).appendTo(b);d&&jQuery("<div/>").addClass("geo").append(jQuery("<span/>").addClass("latitude").html(d.lat)).append(jQuery("<span/>").addClass("longitude").html(d.lon)).appendTo(b)};
Incident.prototype.showDetailBox=function(){var b=jQuery("#detailbox"),a=jQuery("#detailbox .content").empty(),c=this.geolocation;jQuery("#detailbox .closebox").unbind("click").click(this.hideDetailBox);jQuery("#detailbox .showonmap").unbind("click").click(function(){trafficmap&&trafficmap.centerOnGeo(c.lat,c.lon)});jQuery("<div/>").addClass("incidentID").html(this.ID).appendTo(a);jQuery("<div/>").addClass("logtype").html(this.LogType).appendTo(a);var d=this.city?this.city:this.Area;jQuery("<div/>").addClass("location").html(this.Location+
"<br/>"+d).appendTo(a);a=jQuery("<ul/>").addClass("details").appendTo(a);for(d=0;d<this.LogDetails.details.length;d++){var e=this.LogDetails.details[d],f=jQuery("<li/>").addClass("detail").appendTo(a);jQuery("<span/>").addClass("detailtime").html(e.DetailTime.replace(/.*\d\d\d\d\s+/,"")+": ").appendTo(f);jQuery("<span/>").addClass("incidentdetail").html(e.IncidentDetail).appendTo(f)}0===this.LogDetails.details.length&&jQuery("<div/>").addClass("details").html("No details.").replaceAll(a);jQuery(".opened").removeClass("opened");
this.moreButton.addClass("opened");b.show().animate({width:"40%","min-width":"300px"},"fast")};Incident.prototype.hideDetailBox=function(){var b=jQuery("#detailbox");b.animate({width:"0","min-width":"0"},"fast",function(){b.hide();jQuery("#detailbox .content").empty();jQuery(".opened").removeClass("opened")})};
Incident.prototype.getIcon=function(){var b,a;/Traffic Hazard|Disabled Vehicle/.test(this.LogType)?(b="Hazard",a="-18px 0px"):/Collision|Fatality|Hit \& Run/.test(this.LogType)?(b="Collision",a="0px 0px"):(b=/Fire/.test(this.LogType)?"Fire":/Ped/.test(this.LogType)?"Pedestrian":"Hazard",a="-18px 0px");return{name:b,cssPosition:a}};var IncidentList=function(b){this.length=b.length;this._incidents=[];this._index={};for(var a=0;a<b.length;a++){var c=new Incident(b[a]);this._incidents.push(c);this._index[c.ID]=a}};IncidentList.prototype.getIncident=function(b){return this._incidents[b]};IncidentList.prototype.getIncidentById=function(b){return this._incidents[this._index[b]]};IncidentList.prototype.makeList=function(b){b.empty();for(var b=jQuery("<ul/>").addClass("incidents").appendTo(b),a=0;a<this.length;a++)this.getIncident(a).makeListItem(b)};var RequestArgs=function(){var b;return{get:function(a){"undefined"===typeof $_GET&&(b={},document.location.search.replace(/\??(?:([^=]+)(?:=([^&]*))?&?)/g,function(a,d,e){function f(b){if("undefined"!==typeof b)return decodeURIComponent(b.split("+").join(" "))}b[f(d)]=f(e)}));return b[a]}}}();var TrafficMap=function(b,a){this.loadState(a);this.center=new google.maps.LatLng(38.56,-121.4);this.live_cams=[];this.traffic_overlay=null;this.marker_list={};this.cameraInfoWindow=new google.maps.InfoWindow;this.default_icon=new google.maps.MarkerImage("/images/map_markers.png",new google.maps.Size(18,18),new google.maps.Point(18,0),new google.maps.Point(9,9));this.accident_icon=new google.maps.MarkerImage("/images/map_markers.png",new google.maps.Size(18,18),new google.maps.Point(0,0),new google.maps.Point(9,
9));this.default_icon_shadow=new google.maps.MarkerImage("/images/map_markers.png",new google.maps.Size(23,23),new google.maps.Point(60,0),new google.maps.Point(9,9));var c=new google.maps.StyledMapType([{featureType:"landscape",elementType:"all",stylers:[{lightness:100}]},{featureType:"road.highway",elementType:"geometry",stylers:[{hue:"#ff0000"},{saturation:-25}]},{featureType:"road.arterial",elementType:"geometry",stylers:[{saturation:-100},{visibility:"simplified"}]},{featureType:"road.arterial",
elementType:"labels",stylers:[{saturation:-100},{lightness:10}]}],{name:"SacTraffic"}),d={zoom:11,center:this.center,mapTypeId:google.maps.MapTypeId.ROADMAP,streetViewControl:!1,mapTypeControl:!1,scrollwheel:!1,navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL}};this.gmap=new google.maps.Map(document.getElementById(b),d);this.gmap.mapTypes.set("sactraffic",c);this.gmap.setMapTypeId("sactraffic");var e=this;google.maps.event.addListener(this.gmap,"dragend",function(){e.center=
e.gmap.getCenter()});this.make_traffic_button();this.make_camera_button();this.getState("live_cams")&&this.show_live_cams();this.getState("traffic")&&this.show_gtraffic()};TrafficMap.prototype.make_traffic_button=function(){var b=this,a=document.createElement("div");a.style.paddingBottom="2px";a.style.paddingTop="2px";this.traffic_button=jQuery("<div/>").html("Show Traffic").click(function(){b.getState("traffic")?b.hide_gtraffic():b.show_gtraffic()}).addClass("awesome blue").appendTo(a);this.gmap.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(a)};
TrafficMap.prototype.make_camera_button=function(){var b=this,a=document.createElement("div");a.style.paddingBottom="2px";a.style.paddingTop="2px";this.camera_button=jQuery("<div/>").html("Show Cameras").click(function(){b.getState("live_cams")?b.hide_live_cams():b.show_live_cams()}).addClass("awesome blue").appendTo(a);this.gmap.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(a)};
TrafficMap.prototype.update=function(b){this.hide_incidents();this.marker_list={};for(var a=0,c=b.length;a<c;a++){var d=b.getIncident(a);if("inactive"!=d.status&&d.geolocation&&"Media Information"!=d.LogType){var e=this.make_marker(d);this.marker_list[d.ID]=e}}};TrafficMap.prototype.show_incident=function(b,a){for(var c=0,d=b.length;c<d;c++){var e=b[c];if(e.ID==a){if(e.geolocation)this.center=this.make_marker(e).getPosition(),this.recenter(),this.gmap.setZoom(13);break}}};
TrafficMap.prototype.show_live_cams=function(){if(0===this.live_cams.length){var b=this;jQuery.ajax({url:"/cameras.txt",dataType:"text",success:function(a){function c(a){var d=new google.maps.Marker({position:new google.maps.LatLng(a.location.lat,a.location.lon),icon:f,title:a.name,map:b.gmap});google.maps.event.addListener(d,"click",function(){b.cameraInfoWindow.setContent('<div class="camera marker"><div class="name">Live Video</div><div class="button"><div class="awesome blue" onclick="window.open(\''+
a.url+"')\">"+a.name+"</div></div>");b.cameraInfoWindow.open(b.gmap,d)});return d}for(var f=new google.maps.MarkerImage("/images/map_markers.png",new google.maps.Size(24,24),new google.maps.Point(36,0),new google.maps.Point(12,12)),a=a.split(/\n/),g=1,i=a.length;g<i;g++)if(!(""===a[g]||a[g].match(/^#/))){var h=a[g].split(/,/);b.live_cams.push(c({name:h[0],url:h[1],location:{lat:h[2],lon:h[3]}}))}}})}else for(var a=0,c=this.live_cams.length;a<c;a++)this.live_cams[a].setMap(this.gmap);this.camera_button.html("Hide Cameras");
this.setState("live_cams",!0)};TrafficMap.prototype.hide_live_cams=function(){for(var b=0,a=this.live_cams.length;b<a;b++)this.live_cams[b].setMap(null);this.camera_button.html("Show Cameras");this.setState("live_cams",!1)};TrafficMap.prototype.show_gtraffic=function(){this.traffic_overlay=new google.maps.TrafficLayer;this.traffic_overlay.setMap(this.gmap);this.traffic_button.html("Hide Traffic");this.setState("traffic",!0)};
TrafficMap.prototype.hide_gtraffic=function(){this.traffic_overlay&&this.traffic_overlay.setMap(null);this.traffic_button.html("Show Traffic");this.setState("traffic",!1)};TrafficMap.prototype.center_on_id=function(b){this.marker_list[b]&&this.gmap.panTo(this.marker_list[b].getPosition())};TrafficMap.prototype.recenter=function(){this.gmap.panTo(this.center)};TrafficMap.prototype.centerOnGeo=function(b,a){this.gmap.panTo(new google.maps.LatLng(b,a))};
TrafficMap.prototype.loadState=function(b){var a=null;"localStorage"in window&&null!==window.localStorage&&(a=JSON.parse(localStorage.getItem("trafficmap_state"))||null);!a&&"object"===typeof b&&(a=b);this._mapstate=a||{}};TrafficMap.prototype.getState=function(b){return this._mapstate[b]};TrafficMap.prototype.setState=function(b,a){this._mapstate[b]=a;"localStorage"in window&&null!==window.localStorage&&localStorage.setItem("trafficmap_state",JSON.stringify(this._mapstate))};
TrafficMap.prototype.hide_incidents=function(){for(var b in this.marker_list)this.marker_list[b].setMap(null)};
TrafficMap.prototype.make_marker=function(b){var a=this,c=this.default_icon,d=new Date(1E3*b.LogTime);if(!/Traffic Hazard|Disabled Vehicle/.test(b.LogType)&&/Collision|Fatality|Hit \& Run/.test(b.LogType))c=this.accident_icon;var e=new google.maps.Marker({position:new google.maps.LatLng(b.geolocation.lat,b.geolocation.lon),icon:c,shadow:this.default_icon_shadow,title:b.LogType,map:this.gmap}),f=new google.maps.InfoWindow({content:'<div class="marker"><div class="logtype">'+b.LogType+'</div><div class="location">'+
b.Location+'</div><div class="logtime">'+d.getPrettyDateTime()+"</div></div>"});google.maps.event.addListener(e,"click",function(){f.open(a.gmap,e)});return e};var TrafficNews=function(){return{show:function(b,a,c){(new google.feeds.Feed(a)).load(function(a){if(!a.error){var e=!1;jQuery(b).empty();jQuery.each(a.feed.entries,function(a,d){if(c){var i=new Date((new Date).getTime()-864E5*c);if(new Date(d.publishedDate)<i)return!1}e=!0;jQuery(b).append(jQuery("<li/>").append(jQuery("<a/>").attr("href",d.link).html(d.title)).append("<br/>").append(jQuery("<span/>").html(d.contentSnippet)))});e&&jQuery("#sitenews").show("slow")}})}}}();var trafficmap,init_index=function(){480<screen.width&&(trafficmap=new TrafficMap("map",{live_cams:!0}));get_incidents(RequestArgs.get("id"))},get_incidents=function(b){jQuery.getJSON("/json?dispatch=SACC&active_only=1",function(a){a=new IncidentList(a);a.makeList(jQuery("#incidentlist"));var c=jQuery("#detailbox .incidentID").html();c?"undefined"===typeof a.getIncidentById(c)?a.getIncident(0).hideDetailBox():a.getIncidentById(c).showDetailBox():"undefined"!==typeof b&&a.getIncidentById(b).showDetailBox();
"undefined"!==typeof trafficmap&&trafficmap.update(a);setTimeout(get_incidents,6E4)})};
