var monthArrayLong=new Array('January','February','March','April','May','June','July','August','September','October','November','December');
function WeatherMap(){}
WeatherMap.prototype=new GenericMapJson();
WeatherMap.prototype.createMarkerFromJson=function(json){
var mapApp=this;
var point=json.point;
var iconClass=json.iconClass;
var id=json.id;
var image=json.iconImage;
var icon=new GIcon(this.getIconClassFromName(json.iconClass),image);
var hoverText=json.hoverText;
var marker;
if(this.iconMode=="BIG"&&json.iconGroup=="weather"){
icon.iconSize=new GSize(41,24);
icon.image=json.bigIcon;
marker=new LiteMarker(point,icon,hoverText,json);
marker.png=true;
if(!isBlank(json.secondaryIcon)){
var second=new GIcon();
second.iconSize=new GSize(32,32);
second.image=json.secondaryIcon;
marker.setSecondaryIcon(second,new GSize(7,10));}}else
if(this.iconMode=="NORMALS"){
icon.iconSize=new GSize(41,24);
icon.image=this.computeNormalImage(json);
marker=new LiteMarker(point,icon,hoverText,json);
marker.png=true;
var second=new GIcon();
second.iconSize=new GSize(32,32);
second.image=this.computeNormalPcpImage(json);
marker.setSecondaryIcon(second,new GSize(7,10));}
else
if(this.iconMode=="CLASSIC"&&json.iconGroup=="cam"){
icon.iconSize=new GSize(20,34);
icon.image=json.classicIcon;
if(json.iconImage=='/weather/image/smallcam2_lit.png'){icon.image=json.classicIcon.replace(".png","_lit.png");}
marker=new LiteMarker(point,icon,hoverText,json);
marker.png=true;
marker.opacity=1;
marker.addFeedbackTab=true;}else{
if(this.iconMode=="ROUTE"){
marker=new LiteMarker(point,icon,hoverText,json);
marker.zIndex=100;
marker.opacity=1;
marker.png=true;
if(!isBlank(json.secondaryIcon)){
var second=new GIcon();
second.iconSize=new GSize(30,20);
second.image=json.secondaryIcon;
marker.setSecondaryIcon(second,new GSize(20,20));}}else{
marker=new LiteMarker(point,icon,hoverText,json);
marker.zIndex=100;
if(json.iconClass=='alert')marker.zIndex=1000;
marker.opacity=1;
marker.png=true;}}
marker.json=json;
marker.id=id;
marker.icon=icon;
marker.point=point;
if(mapApp.pageMode=="powermap"&&json.iconGroup=="cam"){
marker.addFeedbackTab=true;}
if(this.iconMode!="NORMALS"&&!isDefined(this.useGlobalMapHandler)){
GEvent.addListener(marker,"click",function(){
mapApp.openInfoWindow(marker.id);});}
return marker;}
WeatherMap.prototype.removeOverlap=function(){
var set=[];
for(var id in this.markers){
if(this.markers[id].json.iconGroup=="weather"||this.markers[id].json.iconGroup=="normal"){
if(isDefined(this.markers[id].secondIcon)){
set.unshift(this.markers[id]);}else{
set.push(this.markers[id]);}
this.markers[id]._canshow=true;}}
for(var i=0;i<set.length;i++){
if(set[i]._canshow){
for(var j=i+1;j<set.length;j++){
var touches=set[i].touches(set[j]);
if(touches)set[j]._canshow=false;}}}
for(var i=0;i<set.length;i++){
if(set[i]._canshow)set[i].show()
else set[i].hide();}}
WeatherMap.prototype.init=function(){
GenericMap.prototype.init.call(this);
GEvent.bind(this.map,"zoomend",this,this.removeOverlap);
if(isDefined(this.onDoubleClick)){
GEvent.addListener(mapApp.map,"dblclick",this.onDoubleClick);}
if(isDefined(this.onClick)){
GEvent.addListener(mapApp.map,"click",this.onClick);}}
WeatherMap.prototype.adjustZoom=function(gZoomLevel,jsonDoc){
if(logEnabled)GLog.write('computed zoom is '+gZoomLevel);
if(jsonDoc.locations.length<5){
gZoomLevel=gZoomLevel-1;}else{
if(jsonDoc.isRadialSearch){
if(gZoomLevel<15){
gZoomLevel=gZoomLevel+1;
mapApp.autoZoomIn=true;}
if(jsonDoc.locations.length>30){}}}
try{
var proj=G_NORMAL_MAP.getProjection();
var top=proj.fromLatLngToPixel(new GLatLng(85,-100),gZoomLevel)
var bot=proj.fromLatLngToPixel(new GLatLng(-85,100),gZoomLevel)
var projHeight=bot.y-top.y
var mapHeight=this.map.getSize().height;}catch(e){}
if(projHeight<mapHeight){
gZoomLevel=gZoomLevel+1;}
if(jsonDoc.zoomLevelOverride>0){
gZoomLevel=jsonDoc.zoomLevelOverride;}
if(logEnabled)GLog.write('adjusted zoom is '+gZoomLevel);
return gZoomLevel;}
WeatherMap.prototype.afterLoad=function(isUpdate,jsonDoc){
if(!isUpdate&&isDefined(this.showRadar)){
if(this.map.getBounds().intersects(USA_BOUNDS)){
var radarLayer=new WMSTileLayer().makeTileLayer("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi?","nexrad-n0r","image/gif","","");
var layers=[G_NORMAL_MAP.getTileLayers()[0],radarLayer];
var radarMap=new GMapType(layers,G_NORMAL_MAP.getProjection(),"Radar",{errorMessage:"No chart data available"});
mapApp.map.addMapType(radarMap);}}
if(!isUpdate&&isDefined(this.showSatVisIr)){
if(this.map.getBounds().intersects(USA_BOUNDS)){
var satVisLayer=new WMSTileLayer().makeTileLayer("http://mesonet.agron.iastate.edu/cgi-bin/wms/goes/conus_vis.cgi?","goes_conus_vis","image/png","","");
var visLayers=[satVisLayer,G_HYBRID_MAP.getTileLayers()[1]];
var satVisMap=new GMapType(visLayers,G_NORMAL_MAP.getProjection(),"Live Sat Vis",{errorMessage:"No chart data available"});
mapApp.map.addMapType(satVisMap);
var satIrLayer=new WMSTileLayer().makeTileLayer("http://mesonet.agron.iastate.edu/cgi-bin/wms/goes/conus_ir.cgi?","goes_conus_ir","image/png","","");
var irLayers=[satIrLayer,G_HYBRID_MAP.getTileLayers()[1]];
var satIrMap=new GMapType(irLayers,G_NORMAL_MAP.getProjection(),"Live Sat IR",{errorMessage:"No chart data available"});
mapApp.map.addMapType(satIrMap);}}
if(!isUpdate&&isDefined(this.showMapInfo)){
if(jsonDoc.alertMessage!=null){
var color=jsonDoc.alertMessageSeverity>=20?"red":"orange";
if(jsonDoc.alertMessageSeverity<5)color="green";
el("mapInfo").innerHTML="<div style='color:"+color+"'>Alert: "+jsonDoc.alertMessage+" for your area. &nbsp;   Click alerts below for more info.</div>";}else{
el("mapInfo").innerHTML="";}}
if(!isUpdate&&isDefined(this.showFog)){
if(this.map.getBounds().intersects(FOG_BOUNDS)&&this.map.getZoom()>7){
var fg=el('fogbutton');
fg.style.display='block';
if(isDefined(this.showMapInfo)&&this.isSatVisUseful){
el("mapInfo").innerHTML=el("mapInfo").innerHTML+"<span id='viewFogButtonInfo' class='spanLink' onclick='showFog(el(\"showFogButton\"),false)'>Show</span> live Bay Area fog overlay. &nbsp;&nbsp;  <a href='/weather/about.jsp#fog' target='_new' style='font-size:10;font-weight:normal'>[what is this?]</span>";}}}
if(!isUpdate&&isDefined(jsonDoc.errors)&&jsonDoc.errors.length>0){
for(var i=0;i<jsonDoc.errors.length;i++){
var msg=document.createElement("div");
msg.innerHTML=jsonDoc.errors[i].msg+"<br>"+jsonDoc.errors[i].typeMsg;
msg.setAttribute('class','error');
try{
el('map').parentNode.insertBefore(msg,el('map'));}catch(e){}}}
if(!isUpdate&&isDefined(this.greenArrowLoc)){
this.makeOrMoveGreenArrow(this.greenArrowLoc);}
drawOutPath(jsonDoc);
if(!isUpdate){
this.avoidBrokenMap(this.map.getCenter(),this.map.getZoom(),G_NORMAL_MAP,G_SATELLITE_MAP);}
if(isDefined(this.routeWeather)){
writePointConditionsToGrid(jsonDoc);}
if(!isUpdate&&(!isDefined(this.pageMode)||!(this.pageMode=="lite"))){
if(this.map.getSize().width<380){
this.map.addControl(new GMapTypeControl(true));
this.map.addControl(new GSmallMapControl());}else{
this.map.addControl(new GLargeMapControl());
this.map.addControl(new GMapTypeControl);}
if(this.showOverviewMap){
this.map.addControl(new GOverviewMapControl());}}}
function drawOutPath(jsonDoc){
if(isDefined(jsonDoc.encodedPath)){
if(document.all){
var points=[];
for(var i=0;i<jsonDoc.locations.length;i++){
points.push(jsonDoc.locations[i].point);}
var line=new GPolyline(points);
mapApp.map.addOverlay(line);}else{
var encodedPolyline=new GPolyline.fromEncoded({
color:"#3333cc",
weight:10,
points:jsonDoc.encodedPath.points,
levels:jsonDoc.encodedPath.levels,
zoomFactor:jsonDoc.encodedPath.zoomFactor,
numLevels:jsonDoc.encodedPath.numLevels});
mapApp.map.addOverlay(encodedPolyline);}}else if(isDefined(jsonDoc.drawPath)){
var line=new GPolyline(jsonDoc.drawPath);
mapApp.map.addOverlay(line);}}
WeatherMap.prototype.makeOrMoveGreenArrow=function(point){
if(point==null)return;
if(!isDefined(this.greenArrowIcon)){
var icon=new GIcon(this.getIconClassFromName("cam"),"/weather/image/greenarrow.png");
icon.iconSize=new GSize(21,32);
icon.png=true;
marker=new LiteMarker(point,icon,null,"");
marker.zIndex=200;
this.greenArrowIcon=marker;
this.map.addOverlay(marker)}else{
marker.point=point;
marker.redraw(true);}}
WeatherMap.prototype.openInfoWindow=function(id){
var marker=this.markers[id];
if(marker==null||!isDefined(marker)||!isDefined(marker.json))return;
var linkText=isBlank(marker.json.url)?marker.json.name:"<a href='"+marker.json.url+"' target='_new'>"+marker.json.name+"</a>";
if(marker.json.iconGroup=="cam"){
linkText="<a href=\"/weather/camDetail.jsp?id=" + marker.id + "\">"+marker.json.name+"</a>";
linkText="<span onclick='toggleFavoriteStar(this,\"" + marker.id + "\");'><img src='/servlet/FavoriteStar?id="+marker.id+"&ts="+new Date().getTime()+"'/></span>"+linkText;}
var html="<div style='width:250'>"+linkText+"</div>";
if(isDefined(marker.json.popup)){
html=marker.json.popup;}
if(marker.json.iconGroup=="weather"){
var weatherDetailUrl=marker.json.weatherDetailUrl;
var weatherDetailUrlTarget=" target='_new' ";
if(this.pageMode=="region"||this.pageMode=="lite"){
if(marker.json.logo.indexOf('nws_med.jpg')>0){
weatherDetailUrl="/weather/summary.jsp?where="+marker.point.lat()+","+marker.point.lng();
if(this.pageMode=="region")weatherDetailUrlTarget="";
linkText="<a href='/weather/summary.jsp?where="+marker.point.lat()+","+marker.point.lng()+"' "+(this.pageMode=="lite"?" target='_new' ":"")+" >"+marker.json.name+"</a>";}
if(isBlank(marker.json.url)){
linkText="<a href='/weather/summary.jsp?where="+marker.point.lat()+","+marker.point.lng()+"' "+(this.pageMode=="lite"?" target='_new' ":"")+" >"+marker.json.name+"</a>";}}
var wuGraph=this.pageMode!="powermap"||marker.json.logo.indexOf('wunderground')<0?"":"<img height='120' src='http://www.weatherunderground.com/cgi-bin/wxStationGraphAll?type=3&showtemp=1&showtitle=0&width=195&ID="+id+"'/>";
if(this.pageMode=="powermap"){
wuGraph="<span style='text-decoration:underline' onclick='popupForecast(new GLatLng("+marker.point.lat()+","+marker.point.lng()+"))'>Get Forecast</span><br/>"+wuGraph;}
if(this.pageMode=="summary"){
wuGraph="<span style='font-size:10;text-decoration:underline' onclick='mapApp.onDoubleClick(null,new GLatLng("+marker.point.lat()+","+marker.point.lng()+"))'>Show Forecast</span><br/>"+wuGraph;}
html='<div id="popupWeather" style="border: thin solid gray; font-size: 12px;padding:4;"><b>'+linkText+'</b></a><table style="font-size: 10px;" border="0" cellpadding="0" cellspacing="0"><tbody><tr valign="top"><td><span style="position:absolute;right:10"><a style="border: 0pt none ;" '+weatherDetailUrlTarget+' href="'+weatherDetailUrl+'"><img valign="top" src="'+marker.json.logo+'" border="0" width="70"></a></span><b>Temp: </b>'+marker.json.temperatureString+'<br><b>Wind: </b> '+marker.json.windString+' <br><b>Wind Gust: </b>'+marker.json.windGustString+'<br><b>Humidity: </b>'+marker.json.humidity+'% <br><b>Rain: </b>'+marker.json.rainString+'<br><b>Barometer: </b>'+marker.json.barometerString+'<br><b>Observation Time: </b> '+marker.json.formattedAge+'<br></td></tr></tbody></table>'+wuGraph+'</div>';}
if(marker.json.iconGroup=="cam"){
var imw=marker.json.width>250?250:marker.json.width;
var imh=(marker.json.height/marker.json.width)*imw;
var img=marker.json.imageUrl;
if(!isDefined(marker.json.width)||!isDefined(marker.json.height)){
imw=250;
imh=200;}
html=html+'<a href="/weather/camDetail.jsp?id='+marker.id+'"><img name="popupCam" border="0" src="'+img+'" width="'+imw+'" height="'+imh+'" /></a><br/><a href="#" onclick="refreshImage(document.images.popupCam);" >refresh</a> <a href="#" onclick="modifyObject(\'' + marker.json.id + '\',\'weathermaps.weather.cams.WebCamPoint\',\'\')" >edit</a>';}
if(marker.json.iconGroup=="route"){
html='<div id="popup" style="border: thin solid gray; font-size: 12px;padding:4;"><b>'+marker.json.hoverText+'</b></div>';}
if(marker.addFeedbackTab){
var feedback='<script type="text/javascript">setTimeout("fixtabs()",1000);</script>  <iframe id="feedbackframe" src="/user/feedback_popup.jsp?_noEmail=true&_commentWidth=25&_className=weathermaps.weather.cams.WebCamPoint&_id='+id+'" width="250" height="200" frameborder="0" ></iframe>';
var dom1=document.createElement("div");
dom1.innerHTML=html;
var dom2=document.createElement("div");
dom2.innerHTML=feedback;
var infoTabs=[
new GInfoWindowTab("Cam",dom1),
new GInfoWindowTab("Cam Blog",dom2)];
gTabWorkaroundTab=dom2;
this.map.openInfoWindowTabs(marker.point,infoTabs);}else{
this.map.openInfoWindowHtml(marker.point,html);}}
function refreshImage(img){
img.src=nocache(img.src);}
function nocache(src){
now=new Date();
if(src.indexOf("?")==-1){
return src+"?"+now.getTime();
z}else{
return src+"&"+now.getTime();}}
function updateNormals(){
mapApp.showProp=document.getElementById("mapVar").value;
for(var i=0;i<document.mapControl.monthVar.length;i++){
if(document.mapControl.monthVar[i].checked){
mapApp.showMonth=document.mapControl.monthVar[i].value;}}
mapApp.updateTitle();
mapApp.updateIcons();}
WeatherMap.prototype.updateTitle=function(){
var text=monthArrayLong[this.showMonth];
if(this.showProp=='max')text=text+" Highs";
if(this.showProp=='min')text=text+" Lows ";
if(this.showProp=='avg')text=text+" Average Temperature ";
document.getElementById("mapLabel").innerHTML=text;}
WeatherMap.prototype.updateIcons=function(){
for(var id in this.markers){
if(this.markers[id].json.iconGroup=="normal"){
var marker=this.markers[id];
marker.icon.image=this.computeNormalImage(marker.json,this.isFahrenheit);
marker.secondIcon.image=this.computeNormalPcpImage(marker.json);
marker.redraw(true);}}}
function makeIcon(num,fah){
if(fah)return parseInt(num);
return parseInt((5/9)*(num-32))+"C";}
WeatherMap.prototype.computeNormalImage=function(json,fah){
try{
if(this.showProp=='max')return '/cachedimages/v2/'+makeIcon(json.max[this.showMonth],fah)+".png";
if(this.showProp=='min')return '/cachedimages/v2/'+makeIcon(json.min[this.showMonth],fah)+".png";
if(this.showProp=='avg')return '/cachedimages/v2/'+makeIcon(json.avg[this.showMonth],fah)+".png";}catch(e){
return "/images/twc/none.png";}}
WeatherMap.prototype.computeNormalPcpImage=function(json){
try{
return '/images/twc/'+json.pcpIcon[this.showMonth]+".png";}catch(e){
return "/images/twc/none.png";}}
WeatherMap.prototype.addControls=function(){}
var gTabWorkaroundTab;
var gTabWorkaroundTab2;
function fixtabs(){
if(document.all)return;
gTabWorkaroundTab.innerHTML=gTabWorkaroundTab.innerHTML+" ";
if(isDefined(gTabWorkaroundTab2)){
gTabWorkaroundTab2.innerHTML=gTabWorkaroundTab2.innerHTML+" ";}}
function writePointConditionsToGrid(jsonDoc){
var html="";
html+="<table id='gridTable'>";
for(var id in mapApp.markers){
var m=mapApp.markers[id];
html+="<tr><td style='color:gray' colspan='3'>"+" "+m.json.niceDate+"</td></tr>";
html+="<tr style='cursor:pointer;' onclick='mapApp.openInfoWindow(\"" + m.id + "\")' onmouseover='mapApp.rollover(\"" + m.id + "\")' onmouseout='mapApp.rollout(\"" + m.id + "\")' >";
html+="<td ><img src='"+m.json.iconImage+"'></td>";
html+="<td style='font-size:12' width='100'>"+m.json.text+"</td>";
html+="<td><img width='31' src='/cachedimages/v3/"+m.json.tempBase+".gif'></td></tr>";}
html=html+"</table>";
html+="Trip Time: "+jsonDoc.tripTime+"<br/>";
html+="Distance: "+jsonDoc.tripDistance+"<br/>";
el("grid").innerHTML=html;
el('loadingStatus').innerHMTL="";
el('loadingStatus').style.display='none';
el('loadingStatus').style.visibility='hidden';
el('resultWrapper').style.display='block';}
function showFog(div,animate){
if(!animate){
if(isDefined(mapApp._fogOverlay)){
mapApp._fogOverlay.isRunning=false;
mapApp.map.removeOverlay(mapApp._fogOverlay);
div.innerHTML="[Show Fog]";
mapApp._fogOverlay=undefined;
el("animateButton").style.display='none';
el("fogCaption").innerHTML="";
if(el("viewFogButtonInfo")!=null){
el("viewFogButtonInfo").innerHTML="Show";}}else{
var image="/servlet/weathermaps.weather.image.RemoveBackgroundServlet";
mapApp._fogOverlay=new EInsert(new GLatLngBounds(new GLatLng(36.404,-124.065),new GLatLng(39.1944,-120.792)),image,.7,50);
mapApp.map.addOverlay(mapApp._fogOverlay);
div.innerHTML="[Hide Fog]";
el("animateButton").style.display='inline';
if(el("viewFogButtonInfo")!=null){
el("viewFogButtonInfo").innerHTML="Hide";}}}
if(animate){
if(!isDefined(mapApp._fogOverlay))return;
if(mapApp._fogOverlay.isRunning){
el("animateButton").innerHTML="[Animate Fog]";
mapApp._fogOverlay.isRunning=false;}else{
el("animateButton").innerHTML="[Stop Animation]";
mapApp.downloadFogSequenceAndAnimate();}}}
WeatherMap.prototype.updateStatusDiv=function(state){
var msg="";
if(isDefined(this.statusDiv)){
switch(state){
case "PRUNED":msg="Too many points to display. Zoom in to see more.";break;
case "LOADING":msg="<img height='10' src='/images/loading_cir.gif'> Loading data.";break;
case "NORESULTS":msg="<b>Sorry: No results returned.</b> Try revising your search.";break;
case "NOEXACTMATCH":msg="<b>Error: </b> Could not find your exact location. Check your search.";break;
case "":msg="";break;}
this.statusDiv.innerHTML=msg;}}
WeatherMap.prototype.rollover=function(id){
var marker=this.markers[id];
if(!isDefined(this.rolloverMarker)){
var icon=new GIcon(golfIconHover,'/golf/image/trans_hover.png');
var hovermkr=new LiteMarker(marker.point,icon);
hovermkr.png=true;
this.rolloverMarker=hovermkr;
this.map.addOverlay(this.rolloverMarker);}else{
this.rolloverMarker.point=marker.point;
this.rolloverMarker.redraw(true);
this.rolloverMarker.show();}}
WeatherMap.prototype.rollout=function(id){
if(isDefined(this.rolloverMarker)){
this.rolloverMarker.hide();}}
WeatherMap.prototype.downloadFogSequenceAndAnimate=function(){
var request=GXmlHttp.create();
request.open("GET","/servlet/genradar?id=_sf_fog",true);
request.onreadystatechange=function(){
if(request.readyState==4){
var xmlDoc=request.responseXML;
var points=xmlDoc.documentElement.getElementsByTagName("point");
imgUrlArray=new Array(points.length);
imgCaptionArray=new Array(points.length);
for(var i=0;i<points.length;i++){
var point=points[i];
imgUrlArray[i]=point.getAttribute("img");
imgCaptionArray[i]=point.getAttribute("date");}
if(!isDefined(mapApp._fogOverlay))return;
mapApp._fogOverlay.isRunning=true;
mapApp._fogOverlay.captionDiv=el("fogCaption");
mapApp._fogOverlay.startAnimate(imgUrlArray,500,0,imgCaptionArray);}}
request.send(null);}