
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(this.useThumbnailIcons){icon.image="/servlet/CamImage?thumbWidth=35&thumbHeight=35&id="+id;icon.iconSize=new GSize(35,35);}
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);}
if(this.useCustomMapTypeControl){mapApp.map.addControl(new TextMapTypeControl());mapApp.map.addControl(new TextOverlayTypeControl());}}
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","","");radarLayer.getZIndex=function(lat){return 1;}
radarLayer.isPng=function(){return false;}
var radarOverlayLayer=new GTileLayerOverlay(radarLayer);radarOverlayLayer.getZIndex=function(lat){return 1;}
var radarControlToggle=new RadarControlToggle(radarOverlayLayer);mapApp.radarLayer=radarLayer;mapApp.radarControlToggle=radarControlToggle;mapApp.map.addControl(radarControlToggle,new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(7,29)));}}
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;  <a href='#' onclick=\"mapApp.openInfoWindow('"+jsonDoc.alertMessageId+"');\">Click</a> alerts below for more info.</div>";el("mapInfo").style.display="block";}else{el("mapInfo").innerHTML="";}}
if(!isUpdate&&isDefined(this.showFog)){if(this.map.getBounds().intersects(FOG_BOUNDS)&&this.map.getZoom()>7){if(isDefined(this.showMapInfo)&&this.isSatVisUseful){el("mapInfo").innerHTML=el("mapInfo").innerHTML+"<span id='viewFogButtonInfo' class='spanLink' onclick='showFog(el(\"showFogButton\"),false)'></span> View live Bay Area fog: Select 'Clouds' in the Overlay bar. &nbsp;&nbsp;  <a href='/weather/about.jsp#fog' target='_new' style='font-size:10px;font-weight:normal'>[what is this?]</span>";el("mapInfo").style.display="block";}}}
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){if(!this.useCustomMapTypeControl){this.map.addControl(new GMapTypeControl(true));}
this.map.addControl(new GSmallMapControl());}else{if(!this.useCustomMapTypeControl){this.map.addControl(new GMapTypeControl);}
this.map.addControl(new GLargeMapControl());}
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(G_DEFAULT_ICON,"/weather/image/greenarrow.png");icon.iconSize=new GSize(21,32);icon.png=true;var marker=new GMarker(point,{draggable:"true",icon:icon});this.greenArrowIcon=marker;this.map.addOverlay(marker);this.map.disableDoubleClickZoom();if(isDefined(this.greenArrowDragEnd)){GEvent.addListener(marker,"dragend",function(){mapApp.greenArrowDragEnd();});}}else{this.greenArrowIcon.setLatLng(point);}}
function setBubbleSpon(){var bubbleSponDiv=document.getElementById("bubblespon");if(true){var request=GXmlHttp.create();request.open("GET","/weather/fragments/BubbleSpon.jsp",false);request.send(null);if((request.readyState==4)&&(request.status==200)){bubbleSponDiv.innerHTML=request.responseText;}}}
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' onclick=\"sc_linkCode(this,this.href,location.pathname)\">"+marker.json.name+"</a>";if(marker.json.iconGroup=="cam"){linkText="<div id=\"cam_detail_link\"><a href=\"/weather/camDetail.jsp?id="+marker.id+"\">"+marker.json.name+"</a></div>";linkText=linkText+"<span id=\"bubblespon\"></span>";linkText="<span style='float:left;' onclick='toggleFavoriteStar(this,\""+marker.id+"\");'><img src='/servlet/FavoriteStar?id="+marker.id+"&ts="+new Date().getTime()+"'/></span>"+linkText;}
var html="<div style='height:30px; width:250px; padding:0px'>"+linkText+"</div><br/>";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)||this.pageMode=="lite"){linkText="<a href='/weather/summary.jsp?where="+marker.point.lat()+","+marker.point.lng()+"' "+(this.pageMode=="lite"?" target='_new' ":"")+" >"+marker.json.name+"</a>";}}
if(this.pageMode=="wb_mapplet"){linkText="<a href='http://www.weatherbonk.com/weather/summary.jsp?where="+marker.point.lat()+","+marker.point.lng()+"' "+" 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:10px;text-decoration:underline' onclick='mapApp.onDoubleClick(null,new GLatLng("+marker.point.lat()+","+marker.point.lng()+"))'>Show Forecast</span><br/>"+wuGraph;}
if(this.pageMode=="lite"){wuGraph="<span style='font-size:10px;text-decoration:underline'><a target='_new' href='/weather/summary.jsp?where="+marker.point.lat()+","+marker.point.lng()+"'>Get forecast</a></span><br/> "+wuGraph;}
html='<div id="popupWeather" style="border: thin solid gray; font-size: 12px;padding:4px"><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:10px"><a style="border: 0px solid 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),];gTabWorkaroundTab=dom2;this.map.openInfoWindowTabs(marker.point,infoTabs);}else{this.map.openInfoWindowHtml(marker.point,html);}
if(marker.json.iconGroup=="cam"){setTimeout("setBubbleSpon()",1000);}}
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;mapApp.showMonth=document.getElementById("monthVar").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'><font size='2'><b>"+m.json.closestCity+"</b></font><br/>"+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:12px' 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="";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. Use the slider on the map to zoom in [+] and 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);}