if(typeof Object.newObject!=="function"){Object.newObject=function(A){return{};};}if(typeof Object.extend!=="function"){Object.extend=function(B){var A=function(){};A.prototype=B;return new A();};}Function.prototype.method=function(A,B){if(!this.prototype[A]){this.prototype[A]=B;}};Array.method("reduce",function(C,B){var A;for(A=0;A<this.length;A+=1){B=C(this[A],B);}return B;});var WEATHERMOLE=Object.newObject();WEATHERMOLE.newUrlQuery=function(G){var D=Object.newObject();if(!G){G="";}var A=G.split("&");var F,C,E;for(var B=0;B<A.length;B++){F=A[B].split("=",2);if(F[0]&&F[1]){C=F[0].replace(/\+/g," ");E=F[1].replace(/\+/g," ");D[C]=E;}}return D;};WEATHERMOLE.newUrl=function(C){var B=Object.newObject();if(!C){C="";}var D=/^(?:([^:\/?\#]+):)?(?:\/\/([^\/?\#]*))?([^?\#]*)(?:\?([^\#]*))?(?:\#(.*))?/;var A=C.match(D);B.getScheme=function(){return A[1]||null;};B.getAuthority=function(){return A[2]||null;};B.getPath=function(){return A[3]||null;};B.getQuery=function(){return WEATHERMOLE.newUrlQuery(A[4]||null);};B.getFragment=function(){return A[5]||null;};return B;};WEATHERMOLE.newLatLon=function(C,D){var A=Object.newObject();var E=parseFloat(C);var B=parseFloat(D);A.isLat=function(){return E>=-90&&E<=90;}();A.isLon=function(){return B>=-180&&B<=180;}();A.isLatLon=function(){return A.isLat&&A.isLon;}();A.lat=function(){return A.isLat?E:undefined;}();A.lon=function(){return A.isLon?B:undefined;}();return A;};WEATHERMOLE.newUserMessage=function(){var C=Object.newObject();var B=Object.newObject();B.addMessage=function(D){C[D]=0;};B.addMessages=function(E){var D;for(D=0;D<E.length;D+=1){B.addMessage(E[D]);}};var A;B.getMessages=function(){var E="";var D=0;for(A in C){E=E+(D++==0?A:" | "+A);}return E;};B.hasMessages=function(){for(A in C){return true;}return false;};B.clearMessages=function(){C=Object.newObject();};return B;};var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(C){var A="";var J,H,F,I,G,E,D;var B=0;C=Base64._utf8_encode(C);while(B<C.length){J=C.charCodeAt(B++);H=C.charCodeAt(B++);F=C.charCodeAt(B++);I=J>>2;G=((J&3)<<4)|(H>>4);E=((H&15)<<2)|(F>>6);D=F&63;if(isNaN(H)){E=D=64;}else{if(isNaN(F)){D=64;}}A=A+this._keyStr.charAt(I)+this._keyStr.charAt(G)+this._keyStr.charAt(E)+this._keyStr.charAt(D);}return A;},decode:function(C){var A="";var J,H,F;var I,G,E,D;var B=0;C=C.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(B<C.length){I=this._keyStr.indexOf(C.charAt(B++));G=this._keyStr.indexOf(C.charAt(B++));E=this._keyStr.indexOf(C.charAt(B++));D=this._keyStr.indexOf(C.charAt(B++));J=(I<<2)|(G>>4);H=((G&15)<<4)|(E>>2);F=((E&3)<<6)|D;A=A+String.fromCharCode(J);if(E!=64){A=A+String.fromCharCode(H);}if(D!=64){A=A+String.fromCharCode(F);}}A=Base64._utf8_decode(A);return A;},_utf8_encode:function(B){B=B.replace(/\r\n/g,"\n");var A="";for(var D=0;D<B.length;D++){var C=B.charCodeAt(D);if(C<128){A+=String.fromCharCode(C);}else{if((C>127)&&(C<2048)){A+=String.fromCharCode((C>>6)|192);A+=String.fromCharCode((C&63)|128);}else{A+=String.fromCharCode((C>>12)|224);A+=String.fromCharCode(((C>>6)&63)|128);A+=String.fromCharCode((C&63)|128);}}}return A;},_utf8_decode:function(A){var C="";var E=0;var G=0;var F=0;var D=0;while(E<A.length){G=A.charCodeAt(E);if(G<128){C+=String.fromCharCode(G);E++;}else{if((G>191)&&(G<224)){D=A.charCodeAt(E+1);C+=String.fromCharCode(((G&31)<<6)|(D&63));E+=2;}else{D=A.charCodeAt(E+1);var B=A.charCodeAt(E+2);C+=String.fromCharCode(((G&15)<<12)|((D&63)<<6)|(B&63));E+=3;}}}return C;}};var map;var mgr;var currentPoint;var newMessages=function(H){var E=Object.newObject();var G=false;var B=H;var F=WEATHERMOLE.newUserMessage();var C=WEATHERMOLE.newUserMessage();var A=new YAHOO.util.Anim(B,{opacity:{from:0,to:1}},2,YAHOO.util.Easing.easeOut);var D=new YAHOO.util.Anim(B,{opacity:{from:1,to:0}},2,YAHOO.util.Easing.easeOut);E.clearMessages=function(){YAHOO.util.Dom.get(B).innerHTML="&nbsp;";F.clearMessages();C.clearMessages();};E.clearMessages();E.addInfoMsg=function(I){F.addMessage(I);};E.addErrorMsg=function(I){C.addMessage(I);};E.addInfoMsgs=function(I){F.addMessages(I);};E.addErrorMsgs=function(I){C.addMessages(I);};E.displayUsrMessages=function(){if(F.hasMessages()||C.hasMessages()){var I='<b style="color:green">'+F.getMessages()+"</b>";var J='<b style="color:red">'+C.getMessages()+"</b>";YAHOO.util.Dom.get(B).innerHTML=I+" "+J;if(!G){G=true;A.animate();setTimeout(function(){D.animate();},3000);setTimeout(function(){E.clearMessages();G=false;},5000);}}};return E;};var wmUserMessages=newMessages("userMessage");var cccMessages=newMessages("dialogMsg");function isValidLoc(A){return(YAHOO.lang.isValue(A)&&A.length>1);}function isValidZoom(A){return(YAHOO.lang.isNumber(A)&&A>=0&&num<=17);}function getLatLonLoc(){var D=WEATHERMOLE.newUrl(window.location.href).getQuery();var G=WEATHERMOLE.newLatLon(D.lat,D.lon);var E=D.loc;var A=WEATHERMOLE.newLatLon(YAHOO.util.Cookie.get("lat"),YAHOO.util.Cookie.get("lon"));var C=YAHOO.util.Cookie.get("loc");var F=function(){return G.isLatLon||isValidLoc(E);}();var B=function(){return A.isLatLon||isValidLoc(C);}();var I;var H;if(F){I=G;H=E;}else{if(B){I=A;H=C;}else{I=WEATHERMOLE.newLatLon(38,-99);H=undefined;}}return{lat:I.lat,lon:I.lon,loc:H,isIPRequest:(!F&&!B)};}function getWeatherIcon(B){var A;if(B==="green"){A=new GIcon(G_DEFAULT_ICON);A.image="/WeatherMole/img/"+B+".png";}else{A=new GIcon();A.image="/WeatherMole/img/"+B+".png";A.iconAnchor=new GPoint(15,15);A.infoWindowAnchor=new GPoint(15,0);A.iconSize=new GSize(30,30);}return A;}function parseTimeString(C){var B=(C.getMinutes().toString().length>1)?C.getMinutes():("0"+C.getMinutes());var A=C.getHours();if(A<12){B=B+" AM";}else{if((A===12)&&(B>=0)){B=B+" PM";}else{A=A-12;B=B+" PM";}}return A+":"+B;}function createMarker(K,A){var B=parseTimeString(new Date(parseInt(A.time,10)));var F=new GMarker(K,{icon:getWeatherIcon(A.icon)});var I=A.temperature||"";var D=A.precipitation||"";var C=A.wind||"";var H=A.sky||"";var J=H+" "+C+" "+D;var E=((I.length<1)?"":I+" temperatures ")+((J.length<3)?"":" with "+J+" conditions");var G=(A.comment.length>0)?"Comment: <i>"+A.comment+"</i>":"";GEvent.addListener(F,"click",function(){F.openInfoWindowHtml("At <b>"+B+"</b> in <b>"+A.location+"</b>, "+A.userName+" reported <br>"+E+"<br>"+G,{suppressMapPan:true});});return F;}var handleRCCSuccess=function(H){map.clearOverlays();var C=YAHOO.lang.JSON.parse(H.responseText);wmUserMessages.addInfoMsgs(C.userMessages);var F=C.currentSurfaceObs;for(var B=0;B<F.length;B++){var E=F[B].y;var G=F[B].x;var A=new GIcon(G_DEFAULT_ICON);A.iconSize=new GSize(30,50);A.image="/WeatherMole/img/tempF/t"+F[B].t+".png";map.addOverlay(new GMarker(new GLatLng(E,G),{icon:A}));}var D=C.currentConditions;for(var B=0;B<D.length;B++){var E=D[B].lat;var G=D[B].lon;map.addOverlay(createMarker(new GLatLng(E,G),D[B]));}if(currentPoint){map.addOverlay(new GMarker(new GLatLng(currentPoint.lat,currentPoint.lon)));}if(D.length>0||F.length>0){mgr.refresh();}wmUserMessages.displayUsrMessages();};var handleRCCFailure=function(A){wmUserMessages.addErrorMessage("Sorry, problem getting weather. Please try back later.");wmUserMessages.displayUsrMessages();};var readCCcallback={success:handleRCCSuccess,failure:handleRCCFailure};function readCurrentConditions(){var A=map.getBounds();var H=A.getSouthWest();var C=A.getNorthEast();var F=H.lat();var B=H.lng();var I=C.lat();var G=C.lng();var E="northLat="+I+"&eastLon="+G+"&southLat="+F+"&westLon="+B;var D=YAHOO.util.Connect.asyncRequest("GET","/WeatherMole/ReadMapData?"+E,readCCcallback);}var handleCCCSuccess=function(B){var A=YAHOO.lang.JSON.parse(B.responseText);if(A.success){cccMessages.addInfoMsgs(A.userMessages);readCurrentConditions();clearDialog();}else{cccMessages.addErrorMsgs(A.userMessages);}cccMessages.displayUsrMessages();};var handleCCCFailure=function(A){cccMessages.addErrorMessage("Sorry, problem adding your weather. Please try back later.");cccMessages.displayUsrMessages();};var createCCCallback={success:handleCCCSuccess,failure:handleCCCFailure};function createCurrentCondition(){YAHOO.util.Dom.get("dialogMsg").innerHTML="<img src='/WeatherMole/img/ajax-loader.gif'>";var B=YAHOO.util.Dom.get("ccForm");var C=YAHOO.weathermole.ccDialog.getData();if(C.Password){YAHOO.util.Dom.get("hash").value=Base64.encode(C.UserName+":"+C.Password);YAHOO.util.Dom.get("password").value="";}YAHOO.util.Connect.setForm(B);var A=YAHOO.util.Connect.asyncRequest("POST","/WeatherMole/CreateCurrentCondition",createCCCallback);YAHOO.util.Connect.setForm(null);}function clearDialog(){var A=YAHOO.util.Dom.get("ccForm");A.reset();}var handleCCDialogSubmit=function(){createCurrentCondition();};var handleCCDialogCancel=function(){clearDialog();cccMessages.clearMessages();this.cancel();};YAHOO.weathermole.ccDialog=new YAHOO.widget.Dialog("ccDialog",{width:"400px",fixedcenter:true,close:true,visible:false,constraintoviewport:true,buttons:[{text:"Submit",handler:handleCCDialogSubmit,isDefault:true},{text:"Cancel",handler:handleCCDialogCancel}]});function readForecastByLocation(A){var C=document.getElementById("rfForm");YAHOO.util.Connect.setForm(C);YAHOO.weathermole.waitPanel.show();var B=YAHOO.util.Connect.asyncRequest("GET","/WeatherMole/"+A,wfCallback);YAHOO.util.Connect.setForm(null);}YAHOO.weathermole.ACJson=function(){var B=new YAHOO.util.XHRDataSource("CitySuggestController");B.responseType=YAHOO.util.XHRDataSource.TYPE_TEXT;B.responseSchema={recordDelim:"\n",fieldDelim:"\t"};B.maxCacheEntries=5;var A=new YAHOO.widget.AutoComplete("ysearchinput","ysearchcontainer",B);A.doBeforeExpandContainer=function(){var C=YAHOO.util.Dom;C.setXY("ysearchcontainer",[C.getX("ysearchinput"),C.getY("ysearchinput")+C.get("ysearchinput").offsetHeight]);return true;};return{oDS:B,oAC:A};}();initWaitPanel=function(A){A.waitPanel=new YAHOO.widget.Panel("wait",{width:"240px",fixedcenter:true,close:false,draggable:false,zindex:4,modal:true,visible:false});A.waitPanel.setHeader("Getting forecast from NOAA");A.waitPanel.setBody('<img src="http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif" />');A.waitPanel.render(document.body);};var clearForecast=function(){YAHOO.util.Dom.get("forecastTitle").innerHTML="";YAHOO.util.Dom.get("weatherForecast").innerHTML="";};var writeCookies=function(C,B,A){if(WEATHERMOLE.newLatLon(C,B).isLatLon){YAHOO.util.Cookie.set("lat",C,{expires:new Date("January 12, 2025")});YAHOO.util.Cookie.set("lon",B,{expires:new Date("January 12, 2025")});}if(isValidLoc(A)){YAHOO.util.Cookie.set("loc",A,{expires:new Date("January 12, 2025")});}};var mapOptions={googleBarOptions:{style:"new",adsOptions:{client:"partner-pub-8408382381727722",channel:"AdSense for Search channel",adsafe:"high",language:"en"}}};function initialize(){YAHOO.weathermole.ccDialog.render();YAHOO.util.Event.addListener("addWeather","click",YAHOO.weathermole.ccDialog.show,YAHOO.weathermole.ccDialog,true);var E=new YAHOO.widget.TabView("weatherTabs");var D=E.getTab(1);function A(I){window.location.href="/WeatherMole/WeatherMole48.html";}D.addListener("click",A);var B=E.getTab(2);function H(I){window.location.href="/WeatherMole/about.html";}B.addListener("click",H);if(GBrowserIsCompatible()){var G=getLatLonLoc();map=new GMap2(YAHOO.util.Dom.get("map_canvas"),mapOptions);map.addMapType(G_PHYSICAL_MAP);map.setCenter(new GLatLng(G.lat,G.lon),7);GEvent.addListener(map,"click",weatherForecastListener);GEvent.addListener(map,"moveend",readCurrentConditions);GEvent.addListener(map,"zoomend",readCurrentConditions);mgr=new GMarkerManager(map);map.setUIToDefault();map.enableGoogleBar();readCurrentConditions();initWaitPanel(YAHOO.weathermole);wmUserMessages.clearMessages();YAHOO.weathermole.waitPanel.show();var F;var C;if(G.isIPRequest){F="/ReadFiveDayForecastByIP";C=YAHOO.util.Connect.asyncRequest("GET","/WeatherMole"+F,wfCallback);}else{F=isValidLoc(G.loc)?"/ReadFiveDayForecastByLocation?loc="+encodeURI(G.loc):"/ReadFiveDayForecastByLatLon?lat="+G.lat+"&lon="+G.lon;C=YAHOO.util.Connect.asyncRequest("GET","/WeatherMole"+F,wfCallback);}}else{alert("Sorry, WeatherMole is not compatible with your web browser.");}}function createIconRow(B){var C="";C+="<tr>";for(var A=0;A<B.length;A++){C+="<td>"+'<img src="'+B[A]+'"  />'+"</td>";}C+="</tr>";return C;}function createTempRow(E,A,B){var D="";D+="<tr>";var C;if(B==="true"){for(C=0;C<E.length;C++){D+='<td class="lo">Lo '+E[C]+'&deg;F</td><td class="hi">Hi '+A[C]+"&deg;F</td>";}}else{for(C=0;C<A.length;C++){D+='<td class="hi">Hi '+A[C]+'&deg;F</td><td class="lo">Lo '+E[C]+"&deg;F</td>";}}D+="</tr>";return D;}function createPrecipRow(B){var C="";C+="<tr>";for(var A=0;A<B.length;A++){C+="<td> Chance of precip. "+B[A]+"&#37;</td>";}C+="</tr>";return C;}function createGenericRow(B){var C="";C+="<tr>";for(var A=0;A<B.length;A++){C+="<td>"+B[A]+"</td>";}C+="</tr>";return C;}var handleWFSuccess=function(G){var D=YAHOO.lang.JSON.parse(G.responseText);wmUserMessages.addInfoMsgs(D.userMessages);writeCookies(D.lat,D.lon,isValidLoc(D.locationName)?D.locationName:"");var A=new GLatLng(D.lat,D.lon);map.setCenter(A,D.locUnknown?4:map.getZoom());currentPoint=WEATHERMOLE.newLatLon(D.lat,D.lon);if(D.forecast){var B=isValidLoc(D.locationName)?"loc="+D.locationName:"lat="+D.lat+"&lon="+D.lon;YAHOO.util.Dom.get("forecastTitle").innerHTML="<p>Point forecast for "+(isValidLoc(D.locationName)?D.locationName:"")+" latitude "+D.lat+" longitude "+D.lon+"</p>";var E="http://www.weathermole.com/WeatherMole/index.html?"+encodeURI(B);var F='<p>To save this location bookmark: <a href="'+E+'">'+E+"</a></p>";F+='<table  class="fiveDayTable">';F+=createGenericRow(D.times);F+=createIconRow(D.icons);F+=createGenericRow(D.weatherConditions);F+=createTempRow(D.minTemps,D.maxTemps,D.startsWithNight);F+="</table>";var C=0;for(C=0;C<D.charts.length;C++){F+='<img src="'+D.charts[C]+'">';}YAHOO.util.Dom.get("weatherForecast").innerHTML=F;}else{clearForecast();}YAHOO.weathermole.waitPanel.hide();wmUserMessages.displayUsrMessages();};var handleWFFailure=function(A){YAHOO.weathermole.waitPanel.hide();wmUserMessages.addErrorMessage("Sorry, problem getting weather. Please try back later.");wmUserMessages.displayUsrMessages();};var wfCallback={success:handleWFSuccess,failure:handleWFFailure};function weatherForecastListener(B,A){if(!B){var D="/WeatherMole/ReadFiveDayForecastByLatLon?lat="+A.y+"&lon="+A.x;YAHOO.weathermole.waitPanel.show();var C=YAHOO.util.Connect.asyncRequest("GET",D,wfCallback);}}