From ecf16644810083bb04ce8647130890491826995f Mon Sep 17 00:00:00 2001 From: "Jesse H. (JesseLikesWeather)" <134172009+JesseLikesWeatherakaYoshiKart@users.noreply.github.com> Date: Wed, 1 Nov 2023 08:38:05 -0400 Subject: [PATCH] Add files via upload --- .../my-website-saratoga/ajaxWDwx3.js | 2691 +++++++++++++++++ .../my-website-saratoga/ajaxgizmo.js | 109 + .../my-website-saratoga/forecasticonmetar.gif | Bin 7779 -> 32258 bytes .../my-website-saratoga/forecasticonnew.gif | Bin 0 -> 14788 bytes .../my-website-saratoga/forecasticonnew.jpg | Bin 0 -> 32453 bytes .../my-website-saratoga/wx.html | 1621 +++++----- 6 files changed, 3610 insertions(+), 811 deletions(-) create mode 100644 website-scripts/weather-display-templates/my-website-saratoga/ajaxWDwx3.js create mode 100644 website-scripts/weather-display-templates/my-website-saratoga/ajaxgizmo.js create mode 100644 website-scripts/weather-display-templates/my-website-saratoga/forecasticonnew.gif create mode 100644 website-scripts/weather-display-templates/my-website-saratoga/forecasticonnew.jpg diff --git a/website-scripts/weather-display-templates/my-website-saratoga/ajaxWDwx3.js b/website-scripts/weather-display-templates/my-website-saratoga/ajaxWDwx3.js new file mode 100644 index 0000000..054b537 --- /dev/null +++ b/website-scripts/weather-display-templates/my-website-saratoga/ajaxWDwx3.js @@ -0,0 +1,2691 @@ +/* +Version 2.24 - 13-Dec-2011 -- Dashboard -- for Ken True's Template Update Tool +*/ +var ajaxVersion = "3.07"; +var ajaxVersDate = "24-NOV-2013"; /* Release date ++------------------------------------------------------------------------------+ +| Project: Cartelake/TNET/Saratoga PWS Website templates (WD) | +| Module: ajaxWDws.js (packed version is: ajaxWDwx-packed.js) | +| Purpose: Ajax update from WD clientraw.txt for weather station websites. | +|Description: This alternative ajaxWDwx.js script has been heavily modified | +| and has many new ajax tags. Setup has been simplified and many | +| new features have been added (see Version History below). | +|Discussions: For a discussion and new releases go to the Weather-Watch forum: | +| http://www.weather-watch.com/smf/index.php/topic,43859.0.html | +| Authors: Matthew Romer .. http://wawaweather.net | +| Kevin Reed ..... http://www.tnetweather.com | +| Pinto .......... http://www.joske-online.be | +| Tom ............ http://CarterLake.org | +| Ken True ....... v2.00 http://Saratoga-weather.org | +| Mike Challis ... http://www.carmosaic.com/weather/ | +| FourOhFour ..... http://skigod.us (at wxforum.net) | +| Jim ............ http://jcweather.us | +| Scott .......... v3.00 http://www.BurnsvilleWeatherLIVE.com | +| Rainer ......... v9.00 http://www.bashewa.com | +| Modifid by: Rainer Finkeldeh, rainer@bashewa.com, www.bashewa.com | +| Copyright: (c) 2006-2010 Copyright Bashewa Weather Station and those above. | +|Source code: http://www.bashewa.com/downloads/bws-script-ajaxWDwx.zip | +| ---------------------------------------------------------------------------- | +| NOTES: This version of "ajaxWDwx.js" has been modified by www.bashewa.com | +| To see how changes to this script have been implemented go to: | +| http://www.bashewa.com/ajax-dashboard.php?sce=view | +| For available "ajax tags" and descriptions go to: | +| http://www.bashewa.com/wxclientrawparser.php | +| ---------------------------------------------------------------------------- | +| JS SIZE REDUCTION: | +| If you want to pack this script after you have made changes, go here: | +| http://dean.edwards.name/packer/ | +| ... make a "ajaxWDwx-packed.js" file and change this line in "top.php" to: | +| | +| ... This will reduce the size to ±34% of it's original size (±38kb). | +| ---------------------------------------------------------------------------- | +| SCRIPT DOWNLOADS: | +| Cloud base graphic: http://www.bashewa.com/download-cloud-base.php | +| Gradient thermometer: http://www.bashewa.com/download-thermometer.php | +| Dynamic condition icon: (not yet implemented) | ++------------------------------------------------------------------------------+ +| USAGE and WARRANTY: | +| ---------------------------------------------------------------------------- | +| You may copy/modify/use this script as you see fit. | +| No warranty is expressed or implied. | +| | +| This program is free software; you can redistribute it and/or modify it | +| under the terms of the GNU General Public License as published by the Free | +| Software Foundation; either version 2 of the License, or (at your option) | +| any later version. | +| | +| This program is distributed in the hope that it will be useful, but | +| WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | +| or FITNESS FOR A PARTICULAR PURPOSE. | +| See the GNU General Public License for more details. | +| | +| You should have received a copy of the GNU General Public License along | +| with this program; if not, write to the: | +| Free Software Foundation, Inc., | +| 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | ++------------------------------------------------------------------------------+ + + ++--------------------------------------------------------------------------------------------+ +| ICON & GRAPHIC DOWNLOADS: | +| ... unzip in root folder with "use folder names" when unziping | +| All of the below icons : http://www.bashewa.com/downloads/bws-iconsets.zip (2.5mb)| +| -------------------------------------------------------------------------------------------| +| Current conditions icons: http://www.bashewa.com/downloads/bws-icons-current.zip (269kb)| +| Forcast icons: http://www.bashewa.com/downloads/bws-icons-forecast.zip (1.1mb)| +| Sun/Moon bg, Moon ph x4: http://www.bashewa.com/downloads/bws-icons-moonphase.zip ( 19kb)| +| Moon pictures x28: http://www.bashewa.com/downloads/bws-icons-moon.zip (188kb)| +| Fire Weather Index: http://www.bashewa.com/downloads/bws-icons-fire.zip (291kb)| +| UV icons: http://www.bashewa.com/downloads/bws-icons-uv.zip ( 20kb)| +| Wind Rose icons: http://www.bashewa.com/downloads/bws-icons-wind.zip (822kb)| ++--------------------------------------------------------------------------------------------+ + + +-------------------------------------------------------------------------------- +VERSION HISTORY v2.00 - Saratoga Weather ........... http://saratoga-weather.org +-------------------------------------------------------------------------------- +Updates available at: http://saratoga-weather.org/scripts-WD-AJAX.php +Special thanks to: Kevin Reed http://www.tnetweather.com/ +Kevin was the first to decode the clientraw in PHP +Special thanks to: Pinto http://www.joske-online.be/ +Pinto wrote the basic AJAX code for this page! +Cheerfully borrowed from Tom at CarterLake.org and adapted by Ken True - Saratoga-weather.org 21-May-2006 +Announcements of new versions will be on weather-watch.com and wxforum.net +-------------------------------------------------------------------------------- +Version 1.00 - 24-Nov-2006 -- added flash-green on data update functions - Ken True +Version 2.00 - 13-Dec-2006 -- -------------------------------------------------- + Ken True -repackaged AJAX function, added metric/english units also included + Mike Challis' counter script to display seconds since last update and error. + Handling for the fetch to fix to fix random error: NS_ERROR_NOT_AVAILABLE + Mike's site: http://www.carmosaic.com/weather/index.php + Thanks to FourOhFour on wxforum.net ( http://skigod.us/ ) for replacing all the + x.responseText.split(' ')[n] calls with a simple array lookup.. much better speed and + for his streamlined version of getUVrange. +Version 2.01 - 17-Dec-2006 -- Corrected cloud height calculation +Version 2.02 - 20-Dec-2006 -- added unescape to set_ajax_obs comparison for lastobs +Version 2.03 - 07-Jan-2006 -- added wind m/s or km/h for metric variables +Version 2.04 - 08-Jan-2006 ----------------------------------------------------- + Added use epoch time for get (thanks to johnnywx on WD forum) + so a numeric time without HTMLencoded characters is used +Version 2.05 - 30-Jan-2006 ----------------------------------------------------- + Added new 'anti-NaN' check from johnnywx to make sure full clientraw.txt is + read by looking for '12345' at start and '!!' at end of record +Version 2.06 - 24-Jun-2007 -- added '/' as delimiter for currentcond +Version 2.07 - 21-Sep-2007 -- added support for dynamic thermometer.php display refresh +Version 2.08 - 07-Nov-2007 ----------------------------------------------------- + Added useMPH to force wind display in Miles-per-hour and + Added optional Wind-Rose, optional new current icon display graphics +Version 2.09 - 23-Dec-2007 -- added maxupdates feature, new ajax variables from K. Reed www.tnetweather.com +Version 2.10 - 18-Jan-2008 -- fixed icon=34 for ra1.jpg +Version 2.11 - 21-Feb-2008 -- added icon=35 for windyrain.gif/.jpg +Version 2.12 - 07-Mar-2008 -- added fix for 'flashing icon/thermometer' from Jim at jcweather.us +Version 2.13 - 11-Mar-2008 -- changed Wind-rose defaults to .png type (Carterlake/AJAX/PHP templates) +Version 2.14 - 29-Mar-2008 -- fixed UV words with color: black; for display on dark/black template (MCHALLIS) +Version 2.15 - 28-Apr-2008 -- added ajaxFixConditions() and translation capability +Version 2.16 - 20-May-2008 -- added headcolorword processing V1.0 from MCHALLIS +Version 2.17 - 25-Jun-2008 -- added gizmo-specific ajax variables +Version 2.18 - 20-Mar-2008 -- added fix for 'green-flash' issue with Internet Explorer 8 +Version 2.19 - 03-Jul-2009 -- additional gizmo-specific ajax added, and useHpa variable for pressure +-------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------- +VERSION HISTORY v3.xx - Burnsville Weather LIVE...... http://www.BurnsvilleWeatherLIVE.com + Formerly: Webster Weather Live +-------------------------------------------------------------------------------- +Updates available at: www.BurnsvilleWeatherLIVE.com or scott@burnsvilleweatherlive.com +Version 2.80 - 15-Apr-2009 -- added Lightning ajax variables +Version 3.00 - 14-May-2009 -- added many additional ajax variables +Version 4.10 - 25-Sep-2009 -- added support for Nexstorm Lightning distance and direction +Version 4.20 - 11-Oct-2009 -- added support for UV reading 0 during the day - shows "updating..." if so. +Version 6.00 - 30-Oct-2010 -- Totally new format and new version of AjaxWDwx with additions and + corrections to Version 9.11 from Bashewa Weather's version, now + labeled 3.00 and dated 30-Oct-2010 +Version 6.50 - 09-Oct-2011 -- Modified to allow animated icons and several minor changes +Version 6.70 - 16-May-2012 -- Added new SI code and minor changes +Version 6.71 - 07-Jul-2012 -- Added additional Heat Index and Wind Chill ajax tags for dashboard update +Version 6.72 - 29-Sep-2012 -- Added Bashewa's version 9.14 mods as listed below +Version 6.80 - 25-Oct-2012 -- Added Soil Moisture, UOM Conversion +version 3.01 - 17-Mar-2013 -- Added Wind Run ajax Code, finished UOM Conversions, made compatible with style-switching (Thanks Jerry) + Filename Changed to put the version back to the 3.xx that it was supposed to be at and prevent being in + conflict with Ken's version! +Version 3.02 - 07-Apr-2013 -- Fix for FWI Image display - Thanks Jerry. More changes to FWI (for 6 images and scale for 0-232) and + re-named images for FWI Only. +Version 3.04 - 15-Sep-2013 -- Added utc_offset for local time zone to correct cloud-level graphic day-night switch times. Plus other minor fixes/additions. +Version 3.05 - 22-Oct-2013 -- Added support for version 6.90 of the alternative Dashboard. Only minor changes here. +Version 3.06 - 03-Nov-2013 -- Added support to split out last Lightning Strike Date and Time +Version 3.07 - 24-Nov-2013 -- Syntax updates for java script.Stefan +-------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------- +VERSION HISTORY v9.00 - Bashewa Weather ................. http://www.bashewa.com +-------------------------------------------------------------------------------- +Updates available at: http://www.bashewa.com/downloads.php + +Version 9.00 - 15-Apr-2009 ----------------------------------------------------- +Overhaul.... major ovehaul of script. +Added....... fetching of "clientrawextra.txt" for history data (e.g. rain etc.). +Added....... tag "ajaxrainSun" ...... for last Sunday's rain + ..thru.. + "ajaxrainSat" ...... for last Saturday's rain +Added....... tag "ajaxwinddeg" ...... for wind in degrees e.g. 334° +Added....... tag "ajaxsnowDepth" .... for current snow depth + "ajaxsnowToday" .... for todays snow + "ajaxsnowMonth" .... for this months snow + "ajaxsnowSeason" ... for this seasons snow +Added....... tag "ajaxwebcamimg" .... for webcam image support +Added....... tag "ajaxmoonimg" ...... for moon image support +Added....... tag "ajaxmoonphase" .... for current phase e.g. "First Quarter" +Added....... tag "ajaxmoonpct" ...... for current moon illumination e.g. 24% +Added....... tag "ajaxcloudheightimg" for cloud height graphic +Added....... tag "ajaxuvimg" ........ for UV graphic (current UV) +Added....... tag "ajaxuvburnrate" ... for UV skin burn rate (in minutes) +Added....... "REFRESH" hyperlink to "Updates paused" for restarting ajax script. +Added....... window.onload function to prevent early ajax loading. +Added....... support for UOM switching [ metric | english ]. +Added....... support for UOM switching on static field values. +Modified.... [url=http://www.weather-watch.com/smf/index.php/topic,43750.0.html][color=blue]thermometer.php[/color][/url] to support UOM switching and different styles. +Modified.... UV color words to official web colors as specified by WHO, WMO & UNEP +Modified.... overall settings setup for easier configuration. +Modified.... UOM conversions and added functions convertSnow & convertDist. + +Version 9.01 - 05-Jan-2010 ----------------------------------------------------- +Fixed....... problem with Moon Phase. + +Version 9.02 - 07-Jan-2010 ----------------------------------------------------- +Added....... Burnsville Weather modifications (v2.80, v3.00, v4.10) +Version 9.03 - 10-Jan-2010 ----------------------------------------------------- +Added....... tag "ajaxRcdRain" ......... rain record (record all-time daily rain) +Added....... tag "ajaxRcdRainTime" ..... rain record time +Added....... tag "ajaxRcdRainDate" ..... rain record date +Added....... tag "ajaxRcdRainHr" ....... rain record Hr (record all-time daily rain in 1 hour) +Added....... tag "ajaxRcdRainHrTime" ... rain record Hr time +Added....... tag "ajaxRcdRainHrDate" ... rain record Hr date +Added....... tag "ajaxDaysRain" ........ rain days (MTD) +Added....... tag "ajaxDaysNoRain" ...... rain absent days + +Version 9.04 - 10-Jan-2010 ----------------------------------------------------- +Implemented. Webcam support for useCamAtNight and delayDayNight + +Version 9.05 - 10-Jan-2010 ----------------------------------------------------- +Fixed....... problem with "number_format" function not showing correct decimal value. +Added....... ALERT when "clientraw.txt" file can not be found (error 404) +Removed..... ajaxLoaderInBody - can no longer be supported i.e. +Added....... ClientExtra will now always be loaded as well. +Implemented. external "ajaxWDwx-settings.js" for separate setup outside of this script. + +Version 9.06 - 11-Jan-2010 ----------------------------------------------------- +Fixed....... problem with incorrect language translations. +Added....... modified "language-??.js" files to installation zip. +Added....... tag "ajaxVPleaf" ... VP leaf wetness +Added....... alert to your visitors if you have Weather Station problems. +Simpilfied.. the setup in the external settings file "ajaxWDwx-settings.js". + +Version 9.07 - 13-Jan-2010 ----------------------------------------------------- +Added....... support to use English Windrose images only (for Multilingual Systems). +Simpilfied.. the setup in the external settings file "ajaxWDwx-settings.js" even more. + Your external settings file will now be compatible with all future versions of the script. + +Version 9.08 - 17-Jan-2010 ----------------------------------------------------- +Fixed ...... problem with dates when set to AM/PM in WDisplay. + +Version 9.09 - 17-Jan-2010[/color][/url] +Fixed ...... problem with JS Date function showing 00:15pm instead of 12:15pm + +Version 9.10 - 19-Jan-2010 ----------------------------------------------------- +Fixed ...... problem with dates showing 19:00pm instead of 07:00pm when switching UOM. + +Version 9.11 - 19-Jan-2010 ----------------------------------------------------- +Fixed ...... added code for displaying JavaScript errors on page. + +Version 9.12 - 19-Jan-2010 ----------------------------------------------------- +Added ...... classes "convDate" and "convTime" for static field UOM switching. +Removed .... Bashewa icon nameing convention function i.e. ajax_getIconName2(). +Implemented. Icon Nr specification on icon names eg. "{0NR}-{PIC}.gif" = "01-nskc.gif" + +Version 9.13 - 16-Jan-2011 ----------------------------------------------------- +Fixed ...... fixed Moon Phase data (Thanks to Ken True, Ken True - Saratoga-weather.org) + +Version 9.14 - 29-Sep-2012 ----------------------------------------------------- +Fixed ...... fixed UOM conversions/switching for static fields. +Fixed ...... tags "convTime" and "convDate" and conversion functions. +Added ...... tags "ajaxLiveFWI10" and "ajaxLiveFWI" for live FWI. +Added ...... tag "ajaxVPforecast" +Fixed ...... "ajax_getUVrange" function. +Fixed ...... "date" prototype function. +-------------------------------------------------------------------------------- + + + + +================================================================================ + HOW TO IMPLEMENT UOM SWITCHING . +================================================================================ +for implementation see: http://www.bashewa.com/ajax-dashboard.php?sce=view +Add the following code somewhere into your "ajax-dashboard.php": + ---------------------------------------------------------------------------- +
+ METRIC | + IMPERIAL +
+ ---------------------------------------------------------------------------- +For static field that don't have an "ajaxtag" you need to add one of the +following classes to your fields: + ---------------------------------------------------------------------------- + 82.7°F ...for temp + +1.1°F ...for temp variation + 2.7 mph ...for wind + 30.30 inHg ...for temp + 1.04 in ...for rain + 4 in ...for soil sensor depth + 1 cb ...for soil moisture + 12.4 in ...for snow + 2793 ft ...for altitude + 15 miles ...for distance + 20-10-2009 ...for dates + 15:32:27 ...for times + ---------------------------------------------------------------------------- +NOTE: the value in the span must include the units-of-measure for them be converted. +You'll also need the modified "thermometer.php" script that supports UOM switching. +Get it here: http://www.weather-watch.com/smf/index.php/topic,43750.0.html +================================================================================ +*/ + + + +//============================================================================\\ +// S E T I N G S \\ +// P L E A S E R E A D T H I S F I R S T \\ +// You can have seperate settings in "ajaxWDwx-settings.js" so that you don't \\ +// have to redo them each time a new version of this script is released. \\ +// I suggest strongly that you do so and also to use the packed version of \\ +// this script i.e. ajaxWDwx-packed.js. \\ +// -------------------------------------------------------------------------- \\ +// If you have seperate settings in a file "ajaxWDwx-settings.js" then you \\ +// need to add the following line to your "top.php" file: \\ +// \\ +// below this line in "top.php": \\ +// \\ +//============================================================================\\ + +//============================================================================== +// Settings (required ... should be done in ajaxWDwx-settings.js) . +//============================================================================== +var clientrawFile = './clientraw.txt'; // location of clientraw.txt relative to this page on website + +var useUOM = 'E'; // [ E | M ] ... Units Of Measure: + // E = English/Imperial + // M = Metric + // NOTE: You can change individual units below in UNITS-OF-MEASURE. + +var showUOM = true; // set to FALSE if no units should be displayed inside "ajaxtags". + // i.e. if your UOM's are outside the of the "ajaxtag" spans. + // Note: If you have implemented UOM switching this needs to + // be TRUE and all your UOM's need to be on the inside + // of your "ajaxtags". + +//============================================================================== +// Settings (optional ... should be done in ajaxWDwx-settings.js) . +//============================================================================== + +var wxStation = // Your Weather Station status + {problemNr : 0 // Pick a problemMsg number from below + ,problemMsg: // Problem reports ... the selected message below by "problemNr" will be reported in the wxStation.useTag box + {0:'No problems' + ,1:'...your msg here...
...your msg here...
' + } // you can add as many problem messages as you like to the above ... just number them properly + ,stopUpdates: false // Stop the ajax updates for the problem reported ... you should do so if your station is out-of-order + ,showAlert : false // Show an alert box instead of a msg in wxStation.useTag box. Use "\n" for line breaks. + ,useTag : "ajaxindicator" // you can specify a different "ajaxtag" here to suit your requirements + }; + +var update = // for ajax update interval + {reloadtime: 5000 // fetch clientraw.txt file every 5 seconds (1000 ms = 1 second ) + ,maxupdates: 0 // Maximum number of updates/fetches allowed (set to zero for unlimited) + // maxupdates * reloadtime / 1000 = (number of seconds to update) + // i.e. 36 x 5000 / 1000 = 180 seconds (3 minutes) + // Note: if you upload your clientraw.txt file every 30 seconds + // then the visitor will see (180/30) = (6 updates in total). + ,showRefresh: true // show REFRESH hyperlink after "maxupdates" have been exceeded. + }; + +var flash = // for update indicator + {color: '#FF0000' // color to flash for changed observations (RGB) (def #00CC00 = green) + ,red : '#FF0000' // color to flash red for warnings/alarms (RGB) (def #FF0000 = red) + ,time : 3000 // milliseconds to keep flash color on (2000 = 2 seconds); + }; + +var utc_offset = -5; // Set your local TZ offset from UTC Time ('America/Chicago' = -6, 'America/Los Angeles = -8, etc.) + +//============================================================================== +// STATIC IMAGES . +//============================================================================== +// IMAGE LOCATION: default root folder for graphic images & icons +// ... (for root folder specify "./") + +var imgDir = './ajax-images/'; // with trailing slash + +// NOTE: do not delete any of the words enclosed in {} in the src parts eg. {PIC} +// They'll get replaced by their corresponding values later in the script. + +//------------------------------------------------------------------------------ +// DASHBOARD ICONS: optional settings for current conditions graphic for dashboard +// tag: "ajaxconditionicon" or "ajaxconditionicon2" ... specify it below in wxIcon.useTag +// e.g. graphic name: "./ajax-images/bkn.gif" +// .... grab the animated icons for set 2 here: http://www.bashewa.com/downloads/bws-icons-current.zip +var wxIcon = + {src : imgDir+"{PIC}.gif" // where {PIC} will = picname from function specified in wxIcon.useName below + ,width : 84 ,height: 84 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" // eg. "border: 2px solid silver" + ,align : "" // [ left | right | top | bottom | middle | texttop | absbottom | absmiddle ] + ,useTag : "ajaxconditionicon2" // [ ajaxconditionicon | ajaxconditionicon2 ] ... ajax tagname to use + ,useName: 1 // [ 0| 1 | 2 | 9 ] function for getting icon names ... + }; // 0 = Anole's icon names ............ see ajax_getIconName0() + // 1 = NWS icon names ................ see ajax_getIconName1() + // 9 = Dynamic current icons ......... NOT IMPLEMENTED + + +//------------------------------------------------------------------------------ +// WIND ROSE: optional settings for the Wind Rose graphic +// tag: "ajaxwindiconwr" +// e.g. graphic name: "./ajax-images/wr-SSE.gif" or "./ajax-images/wr-nl-SSE.gif" +// .... grab the wind rose icons here: http://www.bashewa.com/downloads/bws-icons-wind.zip +var wrImg = + {src : imgDir+"wr-{LANG}{DIR}.gif" // where {DIR} will = wind dir (e.g. NNW), {LANG} = wrImg.lang + ,width : 84 ,height: 84 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" // [ left | right | top | bottom | middle | texttop | absbottom | absmiddle ] + ,lang : "" // with trailing dash (e.g. "nl-" will result in graphic name: "./ajax-images/wr-nl-SSE.gif") + ,calm : "calm" // substitution for {DIR} (e.g "wr-calm.gif") ... specify "" if not to be shown or not available + ,xlate : true // translate wind direction for icon names (multilingual system) + ,useTag: "ajaxwindiconwr" // ajax tagname to use where the windrose icon should be placed + }; + + +//------------------------------------------------------------------------------ +// UV: optional settings for the UV graphic +// tag: "ajaxuvimg" +// e.g. graphic name: "./ajax-images/uv/1/uv12.gif" +// .... grab UV pics here: http://www.bashewa.com/download/bws-icons-uv.zip +var uvImg = + {src : imgDir+"UV{INDEX}.gif" // where {INDEX} will = UV index (0 to 11) + ,width : 34 ,height: 65 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,useTag: "ajaxuvimg" + }; + +//------------------------------------------------------------------------------ +// SI: optional settings for SI graphic +// tags: ajaxsiimg, ajaxsiimg2 +// e.g. graphic name: "./ajax-images/si/1/si1.gif" +var siImg = + {src : imgDir+"SI{INDEX}.gif" // where {INDEX} will = SI index (0 to 10) + ,width : 34 ,height: 65 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,useTag: "ajaxsiimg" + }; +var siImg2 = + {src : imgDir+"SI{INDEX}.gif" // where {INDEX} will = SI index (0 to 10) + ,width : 34 ,height: 65 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,useTag: "ajaxsiimg2" + }; + + +//------------------------------------------------------------------------------ +// MOON: optional settings for the moon phase graphic +// tag: "ajaxmoonimg" +// e.g. graphic name: "./ajax-images/moon/w/NH-moon07.gif" +// .... grab the Moon images here: http://www.bashewa.com/downloads/bws-icons-moon.zip +var moonImg = + {src : imgDir+"moon/{BG}/{NS}-moon{AGE}.gif" // {BG} = [ w | b ] from moonImg.bg, {NS} = [ NH | SH ] from latitude, {AGE} = 2 digit moonage (0 to 28) from getMoonInfo + ,bg : "w" // [ w | b ] moon background (w=white, b=black) + ,width : 50 ,height: 50 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,useTag: "ajaxmoonimg" + }; + + +//------------------------------------------------------------------------------ +// FIRE INDEX: optional setting for the fire risk graphic +// tag: "ajaxfireimg" +// e.g. graphic name: "./ajax-images/fire/fire3.gif" +// .... grab the FWI icons here: http://www.bashewa.com/downloads/bws-icons-fire.zip +var fireImg = + {src : imgDir+"FWIFire{IMGNR}.gif" // where {IMGNR} will = fire index (0=very low, 1=low, 2=moderate, 3=high, 4=extreme) from fireImg.imgNrs below + ,width : 84 ,height: 104 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,imgNrs: // we all have different numbering systems for our FWI icons it seems ... specify the 6 icon numbers below + {0:"0" ,1:"1" ,2:"2" ,3:"3" ,4:"4" ,5:"5"} + ,useTag: "ajaxfireimg" + }; + +//------------------------------------------------------------------------------ +// FIRE INDEX: optional setting for the fire risk graphic +// tag: "ajaxfireimg" +// e.g. graphic name: "./ajax-images/fire/fire3.gif" +// .... grab the FWI icons here: http://www.bashewa.com/downloads/bws-icons-fire.zip +var fireImg2 = + {src : imgDir+"Fire{IMGNR}.gif" // where {IMGNR} will = fire index (0=very low, 1=low, 2=moderate, 3=high, 4=extreme) from fireImg.imgNrs below + ,width : 84 ,height: 104 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,imgNrs: // we all have different numbering systems for our CBI icons it seems ... specify the 5 icon numbers below + {0:"0" ,1:"0" ,2:"16" ,3:"25" ,4:"31" ,5:"32"} + ,useTag: "ajaxcbiimg" + }; + +//------------------------------------------------------------------------------ +// WEBCAM IMAGE: optional setting for the webcam graphic +// tag: "ajaxwebcamimg" +// e.g. picture name: "./ajax-images/webcam/snap00.jpg" +var webcamImg = + {src : "htzwwlcam.gif" // full path and image name of your current webcam picture + ,srcNgt: "htzwwlcam.gif" // full path and image name of your current nightcam picture (after/before "delayDayNight") + ,width : 320 ,height: 240 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,webcamUpdate : 5 // Webcam update interval in minutes (set to 0 for no updates i.e. visitor must reload page for updates) + ,swapIconWithWebcam: false // swap current conditions icon (tag "ajaxconditionicon2") with webcam image during day and night unless useCamAtNight=false; + ,useCamAtNight : true // use current conditions icon at night time instead of webcam image + ,delayDayNight : 15 // day starts given minutes before sunrise and night starts given min after sunset - for night icon switch + ,useTag: "ajaxwebcamimg" + }; + + +//============================================================================== +// DYNAMIC SCRIPT IMAGES . +//============================================================================== + +// THERMOMETER: optional setting for the dynamic thermometer graphic +// tag: "ajaxthermometer" +// ... you'll need the new thermometer.php script from www.bashewa.com for UOM switching. +// ... read here : http://www.weather-watch.com/smf/index.php/topic,39180.0.html +// ... get it here: http://www.bashewa.com/download-thermometer.php +var thermometerImg = + {src : "./thermometer.php" // path and script for dynamic thermometer PNG image (optional) + ,width : 54 ,height: 170 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,useTag: "ajaxthermometer" + }; + +// CELLTHERMOMETER: optional setting for the dynamic thermometer graphic +// tag: "ajaxthermometer" +// ... you'll need the new thermometer.php script from www.bashewa.com for UOM switching. +// ... read here : http://www.weather-watch.com/smf/index.php/topic,39180.0.html +// ... get it here: http://www.bashewa.com/download-thermometer.php +// ... suppresses style switching for cell.php display +var cellthermometerImg = + {src : "./cell-thermometer.php" // path and script for dynamic thermometer PNG image (optional) + ,width : 54 ,height: 170 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,useTag: "ajaxcellthermometer" + }; + + +//------------------------------------------------------------------------------ +// CLOUD BASE: optional setting for the dynamic cloud height graphic +// tag: "ajaxcloudheightimg" +// ... you'll need the cloud-base.php script from www.bashewa.com +// ... get it here: http://www.bashewa.com/download-cloud-base.php +var cloudImg = + {src : "./cloud-base.php" // path and script for dynamic cloud height image (optional) + ,width : 90 ,height: 200 ,hspace: 0 ,vspace: 0 ,border: 0 + ,style : "" + ,align : "" + ,stationAlt: 334.9 // your station altitude in meters for cloud height graphic if you want ASL (meters = ft / 3.2808399) + ,useTag: "ajaxcloudheightimg" + }; + + +//------------------------------------------------------------------------------ +// DYNAMIC CURRENT ICON: settings for the dynamic current conditions graphic +// tag: "ajaxconditionicon2" +// ... you'll need the dynamic-icon.php script from www.bashewa.com +// ... get it here: (NOT YET IMPLEMENTED) +// Set this up in wxIcon in DASHBOARD ICONS above: { src: "./dynamic-icon.php" ,width: 170 ,height: 127, useName: 9 } + + + +//============================================================================== +// UNITS-OF-MEASURE / UOM (optional) +// ... change to your desired UOM's and decimal places +//============================================================================== +// ENGLISH (Imperial) +var imperialUOM = + {Temp: '°F' // [ &dec;C | &dec;F ] ......................... Temp + ,Wind: 'mph' // [ kts | mph | kph | m/s ] ................. Wind + ,Baro: 'mb' // [ hPa | mb | inHg | mmHg ] ................. Baro + ,Rain: 'in' // [ mm | in ] ............................... Rain + ,Soil: 'in' // [ cm | in ] ............................... Soil Sensor Depth + ,Moist:'cb' // [ kp | cb ] ............................... Soil Moisture + ,Snow: 'in' // [ cm | in ] ............................... Snow + ,Alti: 'ft' // [ m | ft ] ........................... Altitude + ,Dist: 'miles' // [ m | km | miles] .................... Distance + ,Deg : '°' // [ deg | ° ] ..................... Direction/UV + ,dateFmt: "m/j/Y" // 04/26/2009 ... same format as "date" function in php ( eg. for US use "m/j/Y", for GB use "d/M/Y" ) + ,timeFmt: "g:i:s a" // 3:27:01 pm ... same format as "date" function in php ( for 24h clock use "H:i:s" ) + ,timeHM : "g:i a" // 3:27 pm ...... same format as "date" function in php ( for 24h clock use "H:i" ) + }; +var imperialDP = // decimal places + { Temp:1 ,Wind:1 ,Baro:2 ,Rain:2 ,Soil:0 ,Moist:0 ,Snow:2 ,Alti:0 ,Dist:2 ,UV:0 }; +//---------------------------------------------------------------------- +// METRIC +var metricUOM = + {Temp: '°C' // [ &dec;C | &dec;F ] ..........................Temp + ,Wind: 'kph' // [ kts | mph | kph | m/s ] ................. Wind + ,Baro: 'hPa' // [ hPa | mb | inHg | mmHg ] ................. Baro + ,Rain: 'mm' // [ mm | in ] ............................... Rain + ,Soil: 'cm' // [ cm | in } ............................... Soil Sensor Depth + ,Moist:'kp' // [ kp | cb ] ............................... Soil Moisture + ,Snow: 'cm' // [ cm | in ] ............................... Snow + ,Alti: 'm' // [ m | ft ] ........................... Altitude + ,Dist: 'km' // [ m | km | miles] .................... Distance + ,Deg : '°' // [ deg | ° ] ........................ Direction + ,dateFmt: "j-M-Y" // 26-04-2009 ... same format as "date" function in php (eg. for DE use "j.M.Y", for NL use "j-M-Y) + ,timeFmt: "H:i:s" // 15:27:01 ..... same format as "date" function in php ( for 12h clock use "g:i:s a" ) + ,timeHM : "H:i" // 15:27 ........ same format as "date" function in php ( for 12h clock use "g:i a" ) + }; +var metricDP = // decimal places + { Temp:1 ,Wind:1 ,Baro:0 ,Rain:1 ,Soil:0 ,Moist:0 ,Snow:2 ,Alti:0 ,Dist:2 ,UV:0 }; + + +//============================================================================== +// I M P O R T A N T . +// LANGUAGE TRANSLATION . +// No need to change if you're using the Multilingual Templates: . +// (af, de, dk, el, en, es, fi, fr, it, nl, no, pl, pt, se, us) . +// =========================================================================== . +// You don't need to customize this area if you're using English or if you're . +// using the Canada/World Mutilingual templates. Instead change your language . +// in "Settings.php" i.e. $SITE['lang']='nl'; . +// If translations are incorrect then edit the "language-??.js" files. . +//============================================================================== +var langRestart = 'Restart live updates'; +var langRefresh = 'REFRESH'; // RESTART +var langPauseMsg = 'Updates paused'; + +var langMonths = new Array ("January","February","March","April","May","June","July","August","September","October","November","December"); +var langDays = new Array ("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"); +var langDaySuf = new Array ("st","nd","rd","th"); // day suffix as in 1st, 2nd, 3rd, 4th +var langAM_PM = new Array ("am","pm","AM","PM"); +var langWindUOM = new Array ("kts", "mph", "km/h", "m/s"); + +var langBaroTrend = new Array ( + "Steady", "Rising Slowly", "Rising Rapidly", "Falling Slowly", "Falling Rapidly"); + +var langUVWords = new Array ( + "None", "Low", "Medium", "High", "Very High", "Extreme", "Unknown" ); + +var langBeaufort = new Array ( /* Beaufort 0 to 12 in array */ + "Calm", "Light Air", "Light Breeze", "Gentle Breeze", "Moderate Breeze", "Fresh Breeze", + "Strong Breeze", "Near Gale", "Gale", "Strong Gale", "Storm", "Violent Storm", "Hurricane"); + +var langWindDir = new Array( /* used for alt and title tags on wind dir arrow and wind direction display */ + "N", "NNE", "NE", "ENE", + "E", "ESE", "SE", "SSE", + "S", "SSW", "SW", "WSW", + "W", "WNW", "NW", "NNW"); + +var langWindCalm = 'Calm'; +var langGustNone = 'Calm'; +var langWindFrom = 'Wind from '; /* used on alt/title tags on wind direction arrow*/ + +var langThermoCurrently = 'Currently: '; /* used on alt/title tags for thermometer */ +var langThermoMax = 'Max: '; +var langThermoMin = 'Min: '; + +var langTempRising = 'Warmer %s'; /* used for trend arrow alt/title tags .. %s marks where value will be placed */ +var langTempFalling = 'Colder %s'; +var langTempLastHour = ' than last hour.'; +var langTempYesterday = ' than same time yesterday.'; + +var langBaroRising = 'Rising %s '; /* used for trend arrow alt/title tags .. %s marks where value will be placed */ +var langBaroFalling = 'Falling %s '; +var langBaroPerHour = '/hour.'; /* will be assembled as rising/falling + value + uom + perhour text */ + +var langHeatWords = new Array ( + 'Unknown', 'Extreme Heat Danger', 'Heat Danger', 'Extreme Heat Caution', 'Extremely Hot', 'Uncomfortably Hot', + 'Hot', 'Warm', 'Comfortable', 'Chilly', 'Cool', 'Cold', 'Very Cold', 'Extremely Cold', 'Dangerously Cold', 'Extreme Cold Danger' ); + +var langMoonPhases = new Array ( + 'NEW MOON' , 'Evening Crescent', 'FIRST QUARTER', 'Waxing Gibbous', + 'FULL MOON', 'Waning Gibbous' , 'LAST QUARTER' , 'Morning Crescent' ); + +var langMinutes = 'Minutes'; +//============================================================================== +// E N D of S E T T I N G S . +//============================================================================== + + + + + +//============================================================================== +// I M P O R T A N T . +// DO NOT customize any of the stuff below this point. . +// Everything is controlled by your settings above. . +//============================================================================== + +;;;var doTooltip = 0; // set to 1 to have ajaxed variable names appear as tooltips (except for graphics) + +// ----------------------------------------------------------------------------- +var ie4 = document.all; +var browser = navigator.appName; +var ie8 = false; +if (ie4 && /MSIE (\d+\.\d+);/.test(navigator.userAgent)) { //test for MSIE x.x; +var ieversion = new Number(RegExp.$1); // capture x.x portion and store as a number + if (ieversion>=8) { + ie4=false; + ie8=true; + } +} + +var langTransLookup = new Object; // storage area for key/value for current conditions translation +var timerAjaxLoader = null; // for resetting loading timeouts +var notifyR = 0; // for error 404 alerts: clientraw +var notifyE = 0; // for error 404 alerts: clientextra +var extraRetry = 6; // retry time in seconds to fetch clientrawextra.txt +var extraRetryInterval = 10000; // fetch retry in milliseconds for clientrawextra.txt +var clientrawextra = null; + +var ajaxUpdates = 0; // update counter for limit by update.maxupdates +var counterSecs = 0; // for MCHALLIS counter script from weather-watch.com (adapted by K. True) +var lastajaxtimeformat = null; // used for reseting the counter when a real update is done + +var ajaxElements = new Array(); // used for reseting green flashing elements +var uomElements = new Array(); // used for storing page values for switching units-of-measure + +var PauseMsg = ""; // leave blank +var Indicator = ""; // leave blank +var gotSettings=false, uom, dp, clientrawextraFile, saveUOM, savedateFmt, savetimeFmt, savetimeHM; + +//-------------------------------------------------------------- functions start +function initialize() { + // FOR DEBUGING -- always override the settings above if testing on a local host + if (document.location.protocol==="file:" + || document.location.href.search("localhost")!==-1) { + //update.maxupdates = 0; + update.reloadtime = 5000; + } + // END DEBUGING -- + + if (typeof jserrNr!=="undefined" && jserrNr!==null) { + str = jserrors.replace(" in "," in:
"); + jsmsg = '
'+str+'
'; + set_ajax_obs(wxStation.useTag,jsmsg); + jsErrNr = null; + } else + if (wxStation.problemNr>0) { + pMsg= wxStation.problemMsg[wxStation.problemNr]; + if (wxStation.showAlert) alert(pMsg); + else set_ajax_obs(wxStation.useTag,pMsg); + if (wxStation.stopUpdates) update.maxupdates = 2; + } + + clientrawextraFile = clientrawFile.replace("clientraw","clientrawextra"); + uom = (useUOM==='M')? metricUOM : imperialUOM; + dp = (useUOM==='M')? metricDP : imperialDP; + saveUOM = useUOM; + savedateFmt = uom.dateFmt; + savetimeFmt = uom.timeFmt; + savetimeHM = uom.timeHM; + + if (!showUOM) { // Strip UOMs if not required i.e. if the UOM is outside the ajaxtag spans + imperialUOM.Temp=''; metricUOM.Temp=''; + imperialUOM.Wind=''; metricUOM.Wind=''; + imperialUOM.Baro=''; metricUOM.Baro=''; + imperialUOM.Rain=''; metricUOM.Rain=''; + imperialUOM.Snow=''; metricUOM.Snow=''; + imperialUOM.Alti=''; metricUOM.Alti=''; + imperialUOM.Dist=''; metricUOM.Dist=''; + imperialUOM.Deg =''; metricUOM.Deg =''; + } +}; + +function ajaxLoader_restart() { + ajaxUpdates = 0; + counterSecs = 0; + lastajaxtimeformat = null; + set_ajax_obs("ajaxindicator",Indicator); + set_ajax_obs("ajaxindicator2",Indicator); + ajaxLoader_clientextra(clientrawextraFile + '?' + new Date().getTime()); + if (timerAjaxLoader!=="null") clearTimeout(timerAjaxLoader); + timerAjaxLoader = setTimeout("ajaxLoader(clientrawFile + '?' + new Date().getTime())", 20); +}; + + +// toggle the units-of-measure between METRIC and ENGLISH +function ajax_changeUnits () { + useUOM = (useUOM==="E") ? "M" : "E" ; + uom = (useUOM==="M") ? metricUOM : imperialUOM; + dp = (useUOM==="M") ? metricDP : imperialDP ; + colorM = (useUOM==="E") ? "gray" : "blue"; + colorE = (useUOM==="M") ? "gray" : "blue"; + var uomM = document.getElementById("uomM"); if (uomM) uomM.style.color = colorM; + var uomE = document.getElementById("uomE"); if (uomE) uomE.style.color = colorE; + var uomM2 = document.getElementById("uomM2"); if (uomM2) uomM2.style.color = colorM; + var uomE2 = document.getElementById("uomE2"); if (uomE2) uomE2.style.color = colorE; + + switch (uom.Wind) { + case "mph": uom.langWind = langWindUOM[1]; break; + case "kph": uom.langWind = langWindUOM[2]; break; + case "m/s": uom.langWind = langWindUOM[3]; break; + default : uom.langWind = langWindUOM[0]; + } + ajax_page_convertTags(); // also convert tags convTemp, convWind ... etc. + ajaxUpdates = 0; + set_ajax_obs("ajaxindicator",new Date().getTime(),Indicator,flash.red); + set_ajax_obs("ajaxindicator2",new Date().getTime(),Indicator,flash.red); + ajaxLoader_restart(); +}; + + +// return all the elements for a given tag name on a page e.g. +function ajax_getElements ( name ) { // name = [span, div, ...] + if (ie4 && browser !== "Opera" && ! ie8) + return (document.body.getElementsByTagName(name)); + else return (document .getElementsByTagName(name)); +}; + +// return the "class name" for a given element (as in: class="ajax convTemp noprint") +function ajax_getClassName( element ) { + if (ie4 && browser !== "Opera" && ! ie8) + return (element.getAttribute("className")); + else return (element.getAttribute("class")); +}; + +String.prototype.getUnits = function() { +// match and return any [ °C |°F | °C | °F | mm | in | in. | cb | kp | cm | ft | mb | hPa | inHg | mmHg | kts | m/s | mph | kph ] + return (this.match(/°C|°F|°F|°C|in\.|[a-z]+\/?[a-z]?/i)); +}; + +// return the value +function ajax_page_getTagValue ( element, type ) { + var html = element.innerHTML; + var val = parseFloat(html); + var uom = html.getUnits(); + return ( val.convertToMetric(uom, type) ); +}; + +// utility functions to navigate the tags on the page and save their values +function ajax_page_saveTags () { + uom = (useUOM==="M") ? metricUOM : imperialUOM; + dp = (useUOM==="M") ? metricDP : imperialDP ; + colorM = (useUOM==="E") ? "gray" : "blue"; + colorE = (useUOM==="M") ? "gray" : "blue"; + var uomM = document.getElementById("uomM"); if (uomM) uomM.style.color = colorM; + var uomE = document.getElementById("uomE"); if (uomE) uomE.style.color = colorE; + var uomM2 = document.getElementById("uomM2"); if (uomM2) uomM2.style.color = colorM; + var uomE2 = document.getElementById("uomE2"); if (uomE2) uomE2.style.color = colorE; + switch (uom.Wind) { + case "mph": uom.langWind = langWindUOM[1]; break; + case "kph": uom.langWind = langWindUOM[2]; break; + case "m/s": uom.langWind = langWindUOM[3]; break; + default : uom.langWind = langWindUOM[0]; + } + var i, clas, name, iC = iF =0; + var pgElements = ajax_getElements('span'); + + for(i=0; i -1) { + name = clas.match(/convTemp|convDdif|convWind|convBaro|convRain|convSoil|convMoist|convSnow|convDist|convAlti|convDate|convTime/i); + name = name[0]; + switch (name) { + case "convDate": + case "convTime": uomElements[iC++] = [ pgElements[i], name, pgElements[i].innerHTML ]; break; + default : uomElements[iC++] = [ pgElements[i], name, ajax_page_getTagValue(pgElements[i],name) ]; + } + ajaxElements[iF++] = pgElements[i]; // also add to flashing elements + } + // flashing elements + if (clas.search(/ajax/i) > -1) + ajaxElements[iF++] = pgElements[i]; + } + } + var element = document.getElementById("ajaxindicator"); + if (element) Indicator = element.innerHTML; + var element = document.getElementById("ajaxindicator2"); + if (element) Indicator = element.innerHTML; + ajax_page_convertTags(); +}; + +// convert "conv..." tags to required UOM +function ajax_page_convertTags () { +var i, name, val, ret; + for(i=0; i styles to have no color override + for(var i=0; i tag + var lastobs = element.getAttribute("lastobs"); + element.setAttribute("lastobs",value); + if (value !== unescape(lastobs)) { + element.style.color = (red)? flash.red : flash.color; + ;;;if ( doTooltip ) element.setAttribute("title",'AJAX tag '+name); + element.innerHTML = ((typeof html==='undefined')?value:html); // moved inside to fix flashing issue (Jim at jcweather.us) + } +}; + +function set_ajax_uom( name, show ) { +// this function will set an ID= to visible or hidden by setting the style="display: " from 'inline' or 'none' + var element = document.getElementById(name); + if (! element ) { return; } + if (show) element.style.display='inline'; + else element.style.display='none'; +}; +// --- end of flash-green functions + + +function ajax_getWindDir (winddir) { +// Take wind direction value, return the +// text label based upon 16 point compass -- function by beeker425 +// see http://www.weather-watch.com/smf/index.php/topic,20097.0.html + windlabel = new Array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"); + return windlabel[Math.floor(((parseInt(winddir) + 11) / 22.5) % 16 )]; +}; + +function ajax_getWindDirLang (winddir) { +// Take wind direction value, return the +// text label based upon 16 point compass -- function by beeker425 +// ... see http://www.weather-watch.com/smf/index.php/topic,20097.0.html + return langWindDir[Math.floor(((parseInt(winddir) + 11) / 22.5) % 16 )]; +}; + +function ajax_getIconName0 ( iconNr ,iconSet ) { +// perform a lookup and return the graphic name for the condition icon +// (using anole's wxsticker icon nameing convention) +iconList = new Array( + "day_clear", // 0 sunny + "night_clear", // 1 clearnight + "day_partly_cloudy", // 2 cloudy + "day_partly_cloudy", // 3 cloudy2 + "night_partly_cloudy", // 4 cloudynight + "day_clear", // 5 dry + "fog", // 6 fog + "haze-sm", // 7 haze + "day_heavy_rain", // 8 heavyrain + "day_mostly_sunny", // 9 mainlyfine + "mist-sm", // 10 mist + "fog", // 11 nightfog + "night_heavy_rain", // 12 nightheavyrain + "night_cloudy", // 13 nightovercast + "night_rain", // 14 nightrain + "night_light_rain", // 15 nightshowers + "night_snow", // 16 nightsnow + "night_tstorm", // 17 nightthunder + "day_cloudy", // 18 overcast + "day_partly_cloudy", // 19 partlycloudy + "day_rain", // 20 rain + "day_rain", // 21 rain2 + "day_light_rain", // 22 showers2 + "day_sleet", // 23 sleet + "day_sleet", // 24 sleetshowers + "day_snow", // 25 snow + "day_snow", // 26 snowmelt + "day_snow", // 27 snowshowers2 + "day_clear", // 28 sunny + "day_tstorm", // 29 thundershowers + "day_tstorm", // 30 thundershowers2 + "day_tstorm", // 31 thunderstorms + "tornado", // 32 tornado + "windy-sm", // 33 windy + "day_partly_cloudy", // 34 stopped rainning + "windyrain-sm" // 35 windy/rain (new with V2.11) + ); + + if (iconNr >= 0 && iconNr <= 35) { + return ('Current conditions'); + } else return ''; +}; + + +function ajax_getIconName1 ( iconNr ,iconSet ) { +// perform a lookup and return the graphic for the condition icon +// (using NWS icon nameing convention) +var i0nr, iSrc; +iconList = new Array( + "skc", // 0 sunny + "nskc", // 1 clearnight + "bkn", // 2 cloudy + "sct", // 3 cloudy2 + "nbkn", // 4 cloudynight + "ovc", // 5 dry + "fg", // 6 fog + "hazy", // 7 haze + "ra", // 8 heavyrain + "few", // 9 mainlyfine + "mist", // 10 mist + "nfg", // 11 nightfog + "nra", // 12 nightheavyrain + "novc", // 13 nightovercast + "nra", // 14 nightrain + "nshra", // 15 nightshowers + "nsn", // 16 nightsnow + "ntsra", // 17 nightthunder + "ovc", // 18 overcast + "sctpart", // 19 partlycloudy + "ra", // 20 rain + "ra", // 21 rain2 + "shra", // 22 showers2 + "ip", // 23 sleet + "ip", // 24 sleetshowers + "sn", // 25 snow + "sn", // 26 snowmelt + "sn", // 27 snowshowers2 + "skc", // 28 sunny + "scttsra", // 29 thundershowers + "hi_tsra", // 30 thundershowers2 + "tsra", // 31 thunderstorms + "nsvrtsra", // 32 tornado + "wind", // 33 windy + "ra1", // 34 stopped rainning + "windyrain", // 35 windy/rain (new with V2.11) + "sunrise", // 36 sunrise + "sunset" // 37 sunset + ); + + if (iconNr >= 0 && iconNr <= 37) { + i0nr = (iconNr).toString().str_pad(2);//,"0","L"); + iSrc = iconSet.src.replace(/(#PIC#|\{PIC\})/i, iconList[iconNr]); + iSrc = iSrc.replace(/(#0NR#|\{0NR\})/i, i0nr); + iSrc = iSrc.replace(/(#NR#|\{NR\})/i , iconNr); + return ('Current conditions'); + } else return ''; +}; + + +//------------------------------------------------------------------------------ +// CONVERSIONS: prototypes to handle conversions from clientraw data to desired units-of-measure +//------------------------------------------------------------------------------ +Number.prototype.convertToMetric = function ( units, type ) { // convert to C, kts, hPa, mm, cm or meters +type = (typeof type === 'undefined')? "" : type; + if (type==="convDate" || type==="convTime") return this; + ;;;if (!units) alert("Error in convertToMetric: type="+type+" units="+units+" val="+this); + switch (units.toString().toLowerCase()) { // lowercase in case we get FT or KMH etc +// temp to °C + case "°f" : + case "°f": return((this - 32) / 1.8); // Celsius = (this - 32) * 0.556 +// wind mph, km/h and m/s to kts + case "kmh" : + case "kph" : + case "km/h" : return (this * 0.539956803); + case "mph" : return (this / 1.150779450); + case "m/s" : return (this / 0.514444444); +// baro inHg, mmHg and kPa to hPa + case "inhg" : return (this * 33.86388667); + case "mmhg" : return (this * 1.3332239); + case "kpa" : return (this * 10.0); +// rain to mm and snow to cm + case "in." : + case "in" : if (type==="convSnow") return (this * 2.54); + else return (this * 25.4); +// distance miles and meters to km + case "m" : return (this / 1000); + case "Km" : return (this * 1); + case "miles" : return (this / 1.6); +// altitude to meters + case "ft" : return (this / 3.2808399); + default : return (this * 1.0); + } +}; + +Number.prototype.convertDdif = function() { // °C + switch (uom.Temp) { + case "°F" : + case "°F": return((this * 1.8) + 32.0); + default : return((this * 1.0) + 17.8); + } +}; + +Number.prototype.convertTemp = function() { // °C + switch (uom.Temp) { + case "°F": return((this * 1.8) + 32.0); + default : return (this * 1.0); + } +}; + +Number.prototype.convertWind = function() { // kts + switch (uom.Wind) { + case "mph" : return (this * 1.15077945); + case "kph" : return (this * 1.852); + case "m/s" : return (this * 0.514444444); + default : return (this * 1.0); + } +}; + +Number.prototype.convertBaro = function() { // hPa + switch (uom.Baro) { + case "inHg": return (this / 33.863886666667); + case "mmHg": return (this / 1.3332239); + case "kPa" : return (this * 0.1); + default : return (this * 1.0); + } +}; + +Number.prototype.convertRain = function() { // mm + switch (uom.Rain) { + case "in.": return (this * 0.0393700787402); + case "in" : return (this * 0.0393700787402); + case "cm" : return (this * 0.1); + default : return (this * 1.0); + } +}; + +Number.prototype.convertSoil = function() { // cm + switch (uom.Soil) { + case "in.": return (this * 0.393700787402); + case "in" : return (this * 0.393700787402); + case "cm" : return (this * 1.0); + default : return (this * 1.0); + } +}; + +Number.prototype.convertMoist = function() { // cm + switch (uom.Moist) { + case "cb": return (this * 1.0); + case "kp": return (this * 1.0); + default : return (this * 1.0); + } +}; + +Number.prototype.convertAlti = function() { // meters + switch (uom.Alti) { + case "ft" : return (this * 3.2808399); break; + case "m" : return (this * 0.3048); break; + default : return (this * 1.0); + } +}; + +Number.prototype.convertSnow = function() { // cm + switch (uom.Snow) { + case "in.": return (this * 0.3937007874020); + case "in" : return (this * 0.3937007874020); + case "ft" : return (this * 0.0328083989501); + case "mm" : return (this * 10.0); + case "m" : return (this * 0.1); + default : return (this * 1.0); + } +}; + +Number.prototype.convertDist = function() { // km + switch (uom.Dist) { + case "Km" : return (this * 1); + case "m" : return (this / 1000); + case "miles" : return (this / 1.6); + default : return (this * 1); + } +}; + +// Switch date between Euro and US format i.e. 21-03-2010 to 3/21/2010 or 27-Sep-2012 to 09/27/2012 +String.prototype.convertDate = function () { +var day,mth,yer,M; +var langM = new Array(); + fmtD = uom.dateFmt; + sep = savedateFmt.substr(1,1); + vals = this.split(sep); + keys = savedateFmt.split(sep); + var today= new Date(); + day = today.getDate(); + mth = today.getMonth()+1; + yer = today.getYear(); + for(var i=0; i=64 ) {return("12"); } + return("0"); +}; + + +function ajax_getBaroTrend(btrnd) { +// routine from Anole's wxsticker PHP (adapted to JS by Ken True) +// input: trend in hPa or millibars +// Barometric Trend(3 hour) + +// Change Rates +// Rapidly: =.06 inHg; 1.5 mmHg; 2.0 hPa; 2.0 mb +// Slowly : =.02 inHg; 0.5 mmHg; 0.7 hPa; 0.7 mb + +// 5 conditions +// Rising Rapidly +// Rising Slowly +// Steady +// Falling Slowly +// Falling Rapidly + +// Page 52 of the PDF Manual +// http://www.davisnet.com/product_documents/weather/manuals/07395.234-VP2_Manual.pdf +// figure out a text value for barometric pressure trend + if ((btrnd >= -0.7) && (btrnd <= 0.7)) { return(langBaroTrend[0]); } + if ((btrnd > 0.7) && (btrnd < 2.0)) { return(langBaroTrend[1]); } + if (btrnd >= 2.0) { return(langBaroTrend[2]); } + if ((btrnd < -0.7) && (btrnd > -2.0)) { return(langBaroTrend[3]); } + if (btrnd <= -2.0) { return(langBaroTrend[4]); } + return(btrnd); +}; + +// Official colours for UV as specified by WHO, WMO & UNEP +var UVColor = new Array + ( "none" // 0 + , "#4EB400" // 1 Low + , "#A0CE00" // 2 + , "#F7E400" // 3 Medium + , "#F8B600" // 4 + , "#F88700" // 5 + , "#F85900" // 6 High + , "#E82C0E" // 7 + , "#D8001D" // 8 Very High + , "#FF0099" // 9 + , "#B54CFF" // 10 + , "#998CFF" // 11+Extreme + ); + +function ajax_getUVrange ( uv ) { // code simplified by FourOhFour on wxforum.net + var uvword = "Unspec."; + if (uv <= 0) { + uvword = langUVWords[0]; + } else if (uv < 3) { + uvword = " "+langUVWords[1]+" "; + } else if (uv < 6) { + uvword = " "+langUVWords[2]+" "; + } else if (uv < 8) { + uvword = " "+langUVWords[3]+" "; + } else if (uv < 11) { + uvword = " "+langUVWords[4]+" "; + } else { + uvword = " "+langUVWords[5]+" "; + } + return uvword; +} // end ajax_getUVrange function + + +function ajax_getUVburnRate ( uv ) { + var uvIdx = Math.min(18,Math.round(uv)); + switch (uvIdx) { + case 0: uvrate = 'NONE'; break; + case 1: uvrate = 112; break; + case 2: uvrate = 56; break; + case 3: uvrate = 37; break; + case 4: uvrate = 28; break; + case 5: uvrate = 22; break; + case 6: uvrate = 19; break; + case 7: uvrate = 16; break; + case 8: uvrate = 14; break; + case 9: uvrate = 12; break; + case 10: uvrate = 11; break; + case 11: uvrate = 10; break; + case 12: uvrate = 9; break; + case 13: uvrate = 9; break; + case 14: uvrate = 8; break; + case 15: uvrate = 7; break; + case 16: uvrate = 6; break; + case 17: uvrate = 5; break; + case 18: uvrate = 4; break; + default: uvrate = "N/A"; + } + return (uvIdx<1)? uvrate : uvrate; +}; // end ajax_getUVburnRate function + + +function ajax_getTrendArrow( nowTemp, yesterTemp, Legend, textUP, textDN, numDp) { +// generate an tag with alt= and title= for rising/falling values +var diff = nowTemp.toFixed(3) - yesterTemp.toFixed(3); +var absDiff = Math.abs(diff); +var diffStr = '' + diff.toFixed(numDp); +var absDiffStr = '' + absDiff.toFixed(numDp); +var image = ''; +var msg = ''; + + if (diff === 0) { // no change + msg = ''; + image = ''    + msg
+            + ''; + } else if (diff > 0) { // today is greater + msg = textUP.replace(/\%s/,absDiffStr); + image = ''    + msg
+            + ''; + } else { // today is lesser + msg = textDN.replace(/\%s/,absDiffStr); + image = ''    + msg
+            + ''; + } + return ((Legend) ? (diff + Legend + image) : image); +}; // end ajax_getTrendArrow function + + +// function to add colored heatColorWord by Mike Challis +function ajax_getHeatColor(temp ,WindChill, Humidex) { +var fg = bg = hw = ""; +var hcWord = langHeatWords[0]; +var val = { fg:'', bg:'', hw:'' }; + if (temp > 32 && Humidex > 32.3) { + switch (true) { + case (Humidex > 52.5): fg = "black"; bg = "#BA1928"; hw = langHeatWords[ 1]; break; + case (Humidex > 47.5): fg = "black"; bg = "#E02538"; hw = langHeatWords[ 2]; break; + case (Humidex > 41.5): fg = "black"; bg = "#E178A1"; hw = langHeatWords[ 3]; break; + case (Humidex > 36.5): fg = "black"; bg = "#FF00E0"; hw = langHeatWords[ 4]; break; + case (Humidex > 32.3): fg = "black"; bg = "#CC6633"; hw = langHeatWords[ 5]; break; + } + } else if (WindChill < 16 ) { + switch (true) { + case (WindChill <-28): fg = "black"; bg = "#91ACFF"; hw = langHeatWords[14]; break; + case (WindChill <-18): fg = "black"; bg = "#91ACFF"; hw = langHeatWords[13]; break; + case (WindChill < -9): fg = "white"; bg = "#806AF9"; hw = langHeatWords[12]; break; + case (WindChill < -1): fg = "black"; bg = "#3366FF"; hw = langHeatWords[11]; break; + case (WindChill < 8): fg = "black"; bg = "#6699FF"; hw = langHeatWords[10]; break; + case (WindChill < 16): fg = "black"; bg = "#C6EF8C"; hw = langHeatWords[ 9]; break; + } + } else if (WindChill >= 16 && temp <= 35.0) { + switch (true) { + case (temp < 26): fg = "black"; bg = "#FFFF00"; hw = langHeatWords[ 8]; break; + case (temp <=30.3): fg = "black"; bg = "#FA6B05"; hw = langHeatWords[ 7]; break; + case (temp <=33.3): fg = "black"; bg = "#FF0000"; hw = langHeatWords[ 6]; break; + case (temp <=35.0): fg = "black"; bg = "#CC6633"; hw = langHeatWords[ 5]; break; + } + } + val = { fg:fg ,bg:bg ,hw:hw }; + return val; +}; // end ajax_getHeatColor function + +function ajax_getHeatColorWord(temp ,WindChill, Humidex) { +var val = ajax_getHeatColor(temp ,WindChill, Humidex); +return ((val.fg==="")? val.hw + : ' '+val.hw+' ' + ); +}; + +function ajax_getHeatColorTemp(temp ,WindChill, Humidex, actTemp) { +var val = ajax_getHeatColor(temp ,WindChill, Humidex); +return ((val.fg==="")? actTemp.toFixed(dp.Temp)+uom.Temp + : ' '+actTemp.toFixed(dp.Temp)+uom.Temp+' ' + ); +}; + + +// slice and dice the clientraw[49] for possible translation of current weather +// +function ajax_fixupCondition( rawcond ) { +var cond = rawcond; + cond = cond.replace(/_/gm,' '); // replace any _ with blank. + cond = cond.replace(/ -/gm,''); // replace any - with null. + cond = cond.replace(/[\r\n]/gm,''); // remove embedded CR and/or LF + var conds = cond.split('/'); // split up the arguments. + var tstr = ''; + for (var i = 0;i newMoons[newMoons.length-1]) alert("Moon date must be before "+newMoons[newMoons.length-1].date()); + + for (mi in newMoons) // find next New Moon from given date + if (newMoons[mi]>dt) break; + + // Get Moon dates + NM = newMoons [mi-1]; // previous new moon + Q1 = Q1Moons [mi-1]; // 1st Q end + Q2 = fullMoons[mi-1]; // 2nd Q end - Full moon + Q3 = Q3Moons [mi-1]; // 3rd Q end + Q4 = newMoons [mi ]; // 4th Q end - next new moon + + // Divide each phase into 7 periods (4 phases x 7 = 28 periods) + Q1p = Math.round((Q1-NM)/7); + Q2p = Math.round((Q2-Q1)/7); + Q3p = Math.round((Q3-Q2)/7); + Q4p = Math.round((Q4-Q3)/7); + + // Determine start and end times for major phases (lasting 1 period of 28) + NMe = NM+(Q1p/2); // 0% .... - New moon + Q1s = Q1-(Q1p/2); Q1e = Q1+(Q2p/2); // 50% 1stQ - First Quarter + Q2s = Q2-(Q2p/2); Q2e = Q2+(Q3p/2); //100% 2ndQ - Full moon + Q3s = Q3-(Q3p/2); Q3e = Q3+(Q4p/2); // 50% 3rdQ - Last Quarter + NMs = Q4-(Q4p/2); // 0% 4thQ - New Moon + +// Determine age of moon in days since last new moon + age = (dt - newMoons[mi-1])/86400; // age in days since last new moon + dd = Math.floor(age); + hh = Math.floor((age-dd)*24); + mm = Math.floor((((age-dd)*24)-hh)*60); + age = dd+' days, '+hh+' hours, '+mm+' minutes'; + +// Illumination + switch (true) { // Determine moon age in degrees (0 to 360) + case (dt<=Q1): ma = (dt - NM) * (90 / (Q1 - NM))+ 0; break; // NM to Q1 + case (dt<=Q2): ma = (dt - Q1) * (90 / (Q2 - Q1))+ 90; break; // Q1 to FM + case (dt<=Q3): ma = (dt - Q2) * (90 / (Q3 - Q2))+180; break; // FM to Q3 + case (dt<=Q4): ma = (dt - Q3) * (90 / (Q4 - Q3))+270; break; // Q3 to NM + } + ill = Math.abs(Math.round(100*(1+Math.cos(ma*(Math.PI/180)))/2)-100); + +// Deterime picture number (0-27) and moon phase + switch (true) { + case (dt<=NMe): pic = 0; ph = langMoonPhases[0]; break; + case (dt< Q1s): pic = 1 +((dt-NMe)/Q1p); ph = langMoonPhases[1]; break; // or Waxing Crescent + case (dt<=Q1e): pic = 7; ph = langMoonPhases[2]; break; + case (dt< Q2s): pic = 7.5+((dt-Q1e)/Q2p); ph = langMoonPhases[3]; break; + case (dt<=Q2e): pic = 14; ph = langMoonPhases[4]; break; + case (dt< Q3s): pic = 14.5+((dt-Q2e)/Q3p); ph = langMoonPhases[5]; break; + case (dt<=Q3e): pic = 21; ph = langMoonPhases[6]; break; + case (dt< NMs): pic = 21.5+((dt-Q3e)/Q4p); ph = langMoonPhases[7]; break; // or Waning Crecent + default : pic = 0; ph = langMoonPhases[0]; + } + info = + {pic : Math.round(pic) + ,phase: ph + ,age : age + ,ill : ill + }; +return info; +}; // end getMoonInfo function + + +// ---------- +// PROTOTYPES (PHP equivalents) +// ---------- + +// Padding: left and right .. similar to "str_pad" function in php +String.prototype.str_pad = function ( cnt, chr, typ ) { +var sPad = ""; +var char = (typeof chr === 'undefined')? "0" : chr; +var type = (typeof typ === 'undefined')? "R" : typ; +var iPad = cnt - Math.floor(this).toString().length; + for (var i=0;i0) ret+=dpSep+frac; +return (ret); +}; + +//============================================================================== +// Get clientrawextra.txt data (only needs to be loaded once) . +// ----------------------------------------------------------------------------- +function ajaxLoader_clientextra(urlExtra) { +var rawextra; +if (document.getElementById) +var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(urlExtra); + +if (x) { // got something back + x.onreadystatechange = function() { + try { + if (x.readyState===4 && x.status===404) { // not found + if (notifyE===1) alert("DASHBOARD ERROR:\nYour \""+clientrawextraFile+"\" file could not be found."); + notifyE++; + } else + if (x.readyState===4 && x.status===200) { // Mike Challis added fix to fix random error: NS_ERROR_NOT_AVAILABLE + rawextra = x.responseText.split(' '); + var wdpattern=/\d+\.\d+.*!!/; // looks for '!!nn.nn!!' version string + if (rawextra[0]==='12345' && (wdpattern.test(x.responseText)) ) + clientrawextra = rawextra; + else // only save if fully downloaded + setTimeout("ajaxLoader_clientextra(clientrawextraFile + '?' + new Date().getTime())", extraRetryInterval); + notifyE=0; + } // END if (x.readyState == 4 && x.status == 200) + } // END try + catch(e){} // Mike Challis added fix to fix random error: NS_ERROR_NOT_AVAILABLE + }; // END x.onreadystatechange = function() + + x.open("GET", urlExtra, true); + x.send(null); +} // END if(x) +}; + +//============================================================================== +// Get clientraw.txt data and format areas +// -------------------------------------------------------------------------------- +function ajaxLoader(url) { +;;;var rand = new Date().getTime(); + +if (document.getElementById) { + var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(url); +} else { + ;;;set_ajax_obs('ajaxProgress',rand+'elem','ERROR: No elements'); +} +if (x) { // got something back +x.onreadystatechange = function() { +try { + ;;;set_ajax_obs('ajaxProgress',rand+'ready','-- READY --'); + if (x.readyState===4 && x.status===200) { // Mike Challis added fix to fix random error: NS_ERROR_NOT_AVAILABLE + var clientraw = x.responseText.split(' '); + // now make sure we got the entire clientraw.txt -- thanks to Johnnywx + // valid clientraw.txt has '12345' at start and '!!' at end of record + var wdpattern=/\d+\.\d+.*!!/; // looks for '!!nn.nn!!' version string + // If we have a valid clientraw file AND ajaxUpdates is < update.maxupdates + + if (clientraw[0] === '12345' + && wdpattern.test(x.responseText) + && (ajaxUpdates <= update.maxupdates || update.maxupdates > 0) ) { + ;;;set_ajax_obs('ajaxProgress',rand+'start','-- START --'); + + if (update.maxupdates > 0) ajaxUpdates++; // increment counter if needed + +// ----------------------------------------------------------------------------- +// Date / Time (WD) + ;;;set_ajax_obs('ajaxProgress',rand+'date','in Dates'); + WDdt = new Date( clientraw[141], clientraw[36]-1, clientraw[35], clientraw[29], clientraw[30], clientraw[31]); + + set_ajax_obs("ajaxndate" , WDdt.date("F d, Y")); // Apr 16, 2009 + set_ajax_obs("ajaxndate2" , WDdt.date("F d, Y")); // April 16, 2009 + set_ajax_obs("ajaxntime" , WDdt.date("g:i a")); // 2:37 pm + set_ajax_obs("ajaxntimess" , WDdt.date("g:i:s a")); // 2:37:07 pm + set_ajax_obs("ajaxntimess2" , WDdt.date("g:i:s a")); // 2:37:07 pm + set_ajax_obs("ajaxdname" , WDdt.date("D")); // Mon + + // current date and time of observation in clientraw.txt + set_ajax_obs("ajaxdatetime", WDdt.date(uom.dateFmt+' '+uom.timeFmt)); // 16/4/2009 02:37:07pm + set_ajax_obs("ajaxdate@" , WDdt.date(uom.dateFmt) + ' @ '); // 6/4/2009 @ + set_ajax_obs("ajaxdate2" , WDdt.date(uom.dateFmt) + ' @ '); // 6/4/2009 @ + set_ajax_obs("ajaxdate3" , WDdt.date(uom.dateFmt) + ' @ '); // 6/4/2009 @ + set_ajax_obs("ajaxdate" , WDdt.date(uom.dateFmt)); // 16/4/2009 + set_ajax_obs("ajaxtime" , WDdt.date(uom.timeFmt)); // 02:37:07pm + set_ajax_obs("gizmodate" , WDdt.date(uom.dateFmt)); // 16/4/2009 + set_ajax_obs("gizmotime" , WDdt.date(uom.timeFmt)); // 02:37:07pm + set_ajax_obs("ajaxvers" , "| Ajax 3.07"); //Set for Alt-Dashboard Ver 6.90+ by Burnsville Weather Live + + +// Outdoor temperature ... (°C) +//clientraw[4] = 40.7; // uncomment this for debugging + ;;;set_ajax_obs('ajaxProgress',rand+'temp','in Temp'); // "ajaxProgress" tag for debugging ... gets removed by packer + temp = parseFloat(clientraw[ 4]).convertTemp(); + templast = parseFloat(clientraw[90]).convertTemp(); // last hours temp + tempmax = parseFloat(clientraw[46]).convertTemp(); + tempmin = parseFloat(clientraw[47]).convertTemp(); + if (clientrawextra!==null) + temp24hAgo = parseFloat(clientrawextra[21]).convertTemp(); + else temp24hAgo = temp; + temp24hDiff = temp - temp24hAgo; + + set_ajax_obs("ajaxtemp" , temp.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxtempNoU", temp.toFixed(dp.Temp)); + set_ajax_obs("gizmotemp" , temp.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxbigtemp", temp.toFixed(0) + uom.Temp); + + temparrow = ajax_getTrendArrow( temp + , templast + , '' + , langTempRising+uom.Temp+langTempLastHour + , langTempFalling+uom.Temp+langTempLastHour + , 1 + ); + set_ajax_obs("ajaxtemparrow" , (temp-templast).toFixed(dp.Temp), temparrow); + set_ajax_obs("gizmotemparrow", temparrow); + + temprate = temp - templast; + temprate = temprate.toFixed(1); + if (temprate > 0.0) { temprate = '+' + temprate; } // add a '+' for positive rates + set_ajax_obs("ajaxtemprate" , temprate + uom.Temp); + set_ajax_obs("gizmotemprate", temprate + uom.Temp); + + set_ajax_obs("ajaxtempmax" , tempmax .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxtempmin" , tempmin .toFixed(dp.Temp) + uom.Temp); + + set_ajax_obs("ajax24hDiff" , temp24hDiff.toFixed(dp.Temp) + uom.Temp); + diffarrow = ajax_getTrendArrow( temp + , temp24hAgo + , '' + , langTempRising+uom.Temp+langTempYesterday + , langTempFalling+uom.Temp+langTempYesterday + , 1 + ); + set_ajax_obs("ajax24hDiffarrow", (temp-temp24hDiff).toFixed(dp.Temp), diffarrow); + + +// Thermometer ... + ;;;set_ajax_obs('ajaxProgress',rand+'term','in Thermometer'); + thermometerText = langThermoCurrently + temp.toFixed(dp.Temp) + uom.Temp + + ", " + langThermoMax + tempmax.toFixed(dp.Temp) + uom.Temp + + ", " + langThermoMin + tempmin.toFixed(dp.Temp) + uom.Temp; + + param = '?uom=' + useUOM + + '&t=' + temp.toFixed(dp.Temp) + + '&iW=' + thermometerImg.width + + '&iH=' + thermometerImg.height; + set_ajax_obs("ajaxthermometer", param + , ''    + thermometerText
+         + ''); + set_ajax_obs("ajaxcellthermometer", param + , ''    + thermometerText
+         + ''); + + +// Dewpoint ... (°C) +//clientraw[72] = -2.4 + ;;;set_ajax_obs('ajaxProgress',rand+'dewp','in Dewpoint'); + dew = parseFloat(clientraw[ 72]).convertTemp(); + dewmin = parseFloat(clientraw[139]).convertTemp(); + dewmax = parseFloat(clientraw[138]).convertTemp(); + + set_ajax_obs("ajaxdew" , dew .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("gizmodew" , dew .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxdewmin", dewmin.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxdewmax", dewmax.toFixed(dp.Temp) + uom.Temp); + + +// WetBulb ... (°C) + ;;;set_ajax_obs('ajaxProgress',rand+'wetb','in Wetbulb'); + wetbulb = parseFloat(clientraw[159]).convertTemp(); + set_ajax_obs("ajaxwetbulb",wetbulb.toFixed(dp.Temp) + uom.Temp); + +// Humidex ... (°C) + humidex = parseFloat(clientraw[45]).convertTemp(); + humidexmin = parseFloat(clientraw[76]).convertTemp(); + humidexmax = parseFloat(clientraw[75]).convertTemp(); + + set_ajax_obs("ajaxhumidex" , humidex .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxhumidexmin", humidexmin.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxhumidexmax", humidexmax.toFixed(dp.Temp) + uom.Temp); + + +// Heat Index ... (°C) + heatidx = parseFloat(clientraw[112]).convertTemp(); + heatidxmin = parseFloat(clientraw[111]).convertTemp(); + heatidxmax = parseFloat(clientraw[110]).convertTemp(); + + set_ajax_obs("ajaxheatidx" , heatidx .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxheatidx2" , heatidx .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxheatidxmin", heatidxmin.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxheatidxmax", heatidxmax.toFixed(dp.Temp) + uom.Temp); + + +// WindChill ... (°C) + windchill = parseFloat(clientraw[44]).convertTemp(); + windchillmin = parseFloat(clientraw[78]).convertTemp(); + windchillmax = parseFloat(clientraw[77]).convertTemp(); + + set_ajax_obs("ajaxwindchill" , windchill .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxwindchill2" , windchill .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxwindchillmin", windchillmin.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxwindchillmax", windchillmax.toFixed(dp.Temp) + uom.Temp); + + +// FeelsLike ... (°C) + ;;;set_ajax_obs('ajaxProgress',rand+'feel','in Feelslike'); + temp = clientraw[4]; // note.. temp in C +// switch (true) { +// case (temp<=16.0): feelslike = clientraw[44]; break; // use WindChill +// case (temp>=27.0): feelslike = clientraw[45]; break; // use Humidex +// default : feelslike = temp; // use temperature +// } + if (temp <= 16.0 ) { + feelslike = clientraw[44]; //use WindChill + feelslike1 = clientraw[44]; //use WindChill + } else if (temp >=27.0) { + feelslike = clientraw[112]; //use Heat Index + feelslike1 = clientraw[112]; //use Heat Index + } else { + feelslike = temp; // use temperature + feelslike1 = temp; // use temperature + } + feelslike = Math.round(parseFloat(feelslike).convertTemp()); + feelslike1 = Math.round(parseFloat(feelslike1).convertTemp()); + set_ajax_obs("ajaxfeelslike" , feelslike + uom.Temp); + set_ajax_obs("ajaxfeelslike1",feelslike1 + uom.Temp); + + //Indoor + indoortemp = (parseFloat(clientraw[12]).convertTemp()).toFixed(1); + set_ajax_obs("ajaxindoortemp",indoortemp + uom.Temp); + + indoorhumid = clientraw[13]; + set_ajax_obs("ajaxindoorhumid",indoorhumid); + + // mike challis added heatColorWord feature + heatColorWord = ajax_getHeatColorWord(clientraw[4],clientraw[44],clientraw[45]); + set_ajax_obs("ajaxheatcolorword", heatColorWord); + + temp = parseFloat(clientraw[ 4]).convertTemp(); + tempColorBg = ajax_getHeatColorTemp(clientraw[4],clientraw[44],clientraw[45], temp); + set_ajax_obs("ajaxtempcolor", temp.toFixed(dp.Temp), tempColorBg); + + +// Apparent temperature ... (°C) + apparenttemp = parseFloat(clientraw[130]).convertTemp(); + apparenttempmin = parseFloat(clientraw[136]).convertTemp(); + apparenttempmax = parseFloat(clientraw[137]).convertTemp(); + + set_ajax_obs("ajaxapparenttemp" , apparenttemp .toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxapparenttempmin", apparenttempmin.toFixed(dp.Temp) + uom.Temp); + set_ajax_obs("ajaxapparenttempmax", apparenttempmax.toFixed(dp.Temp) + uom.Temp); + + +// Humidity ... % +//clientraw[5] = 100; + ;;;set_ajax_obs('ajaxProgress',rand+'humi','in Humidity'); + humidity = clientraw[5]; + set_ajax_obs("ajaxhumidity" , humidity); + set_ajax_obs("gizmohumidity", humidity); + // sorry.. no min/max data for humidity available in clientraw.txt + + +// Pressure ... (hPa) + ;;;set_ajax_obs('ajaxProgress',rand+'baro','in Baro'); + pressure = parseFloat(clientraw[ 6]).convertBaro(); + pressuremin = parseFloat(clientraw[132]).convertBaro();; + pressuremax = parseFloat(clientraw[131]).convertBaro();; + pressuretrend = parseFloat(clientraw[ 50]).convertBaro(); + barotrendtext = ajax_getBaroTrend(clientraw[50]); + + set_ajax_obs("ajaxbaro" , pressure.toFixed(dp.Baro) +' '+ uom.Baro); + set_ajax_obs("ajaxbaroNoU" , pressure.toFixed(dp.Baro)); + set_ajax_obs("gizmobaro" , pressure.toFixed(dp.Baro) +' '+ uom.Baro); + + pressuretrend = pressuretrend.toFixed(dp.Baro+1); + if (pressuretrend > 0.0) {pressuretrend = '+' + pressuretrend; } // add '+' to rate + set_ajax_obs("ajaxbarotrend" , pressuretrend + uom.Baro); + set_ajax_obs("gizmobarotrend", pressuretrend + uom.Baro); + baroarrow = ajax_getTrendArrow( pressure + , pressure-pressuretrend + , '' + , langBaroRising +uom.Baro+langBaroPerHour + , langBaroFalling+uom.Baro+langBaroPerHour + , 2 + ); + set_ajax_obs("ajaxbaroarrow" , pressuretrend, baroarrow); + set_ajax_obs("ajaxbarotrendtext" , barotrendtext); + set_ajax_obs("gizmobarotrendtext", barotrendtext); + set_ajax_obs("ajaxbaromin" , pressuremin.toFixed(dp.Baro) +' '+ uom.Baro); + set_ajax_obs("ajaxbaromax" , pressuremax.toFixed(dp.Baro) +' '+ uom.Baro); + + +// Wind ... (kts) +//clientraw[ 2] = 10.2; +//clientraw[140] = 20.2; + ;;;set_ajax_obs('ajaxProgress',rand+'wspd','in WindSpeed'); + wind = parseFloat(clientraw[ 2]).convertWind(); // Wind gust + gust = parseFloat(clientraw[140]).convertWind(); // Max wind gust in last minute + windmaxavg = parseFloat(clientraw[113]).convertWind(); // Max avg speed + maxgust = parseFloat(clientraw[ 71]).convertWind(); // Max wind gust + maxgusttime = clientraw[135].replace("_", " "); // Max wind gust time + beaufortnum = ajax_getBeaufortNumber(clientraw[2]); + + // Wind Run + //clientraw[173] = 25.5 + windrun = parseFloat(clientraw[173]).convertDist(); // Wind Run Today + ;;;set_ajax_obs('ajaxwindrun', windrun.toFixed(dp.Dist) +' '+ uom.Dist); + + // Wind gust + if (maxgust > 0.0 ) + set_ajax_obs("ajaxmaxgust" , maxgust.toFixed(dp.Wind) +' '+ uom.langWind); + else set_ajax_obs("ajaxmaxgust" , 'Calm'); + + // Max wind gust + set_ajax_obs("ajaxwindmaxgust" , maxgust.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_obs("ajaxwindmaxgusttime", maxgusttime); + + // Max wind gust No UofM + set_ajax_obs("ajaxwindmaxgust2" , maxgust.toFixed(dp.Wind)); + +// Windspeed ... beaufort + set_ajax_obs("ajaxbeaufortnum" , beaufortnum); + set_ajax_obs("ajaxbeaufort" , langBeaufort[beaufortnum]); + + // Max avg speed + set_ajax_obs("ajaxwindmaxavg" , windmaxavg.toFixed(dp.Wind) +' '+ uom.langWind); + + // Current wind speed + if (wind > 0.0) { + set_ajax_obs("ajaxwind" , wind.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_obs("ajaxwind2" , wind.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_obs("ajaxwindNoU" , wind.toFixed(dp.Wind)); + set_ajax_obs("gizmowind" , wind.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_uom("ajaxwinduom" , true); + } else { + set_ajax_obs("ajaxwind" , langWindCalm); + set_ajax_obs("ajaxwind2" , langWindCalm); + set_ajax_obs("ajaxwindNoU" , langWindCalm); + set_ajax_obs("gizmowind" , langWindCalm); + set_ajax_uom("ajaxwinduom" , false); + } + + // Current gust speed + if (gust > 0.0) { + set_ajax_obs("ajaxgust" , gust.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_obs("ajaxgust2" , gust.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_obs("ajaxgustNoU" , gust.toFixed(dp.Wind)); + set_ajax_obs("gizmogust" , gust.toFixed(dp.Wind) +' '+ uom.langWind); + set_ajax_uom("ajaxgustuom" , true); + } else { + set_ajax_obs("ajaxgust" , langGustNone); + set_ajax_obs("ajaxgust2" , langGustNone); + set_ajax_obs("ajaxgustNoU" , langGustNone); + set_ajax_obs("gizmogust" , langGustNone); + set_ajax_uom("ajaxgustuom" , false); + } + + +// Wind direction & wind rose grapic ... + ;;;set_ajax_obs('ajaxProgress',rand+'wdir','in WindDir'); + windDeg = parseFloat(clientraw[3]); + windDir = ajax_getWindDir(clientraw[3]); + valLang = ajax_getWindDirLang(clientraw[3]); /* to enable translations */ + + ;;;set_ajax_obs('ajaxProgress',rand+'rose','in WindRose'); + if (gust > 0.0 || wind > 0.0 || wrImg.calm==="") { + windicon = ''   + langWindFrom + valLang
+            + ''; + set_ajax_obs("ajaxwindicon" , valLang, windicon); + set_ajax_obs("gizmowindicon" , valLang, windicon); + set_ajax_obs("ajaxwinddir" , valLang); + set_ajax_obs("ajaxwinddir2" , valLang); + set_ajax_obs("gizmowinddir" , valLang); + set_ajax_obs("ajaxwinddeg" , windDeg + uom.Deg); + set_ajax_obs("gizmowinddeg" , windDeg + uom.Deg); + + src = wrImg.src.replace(/(#LANG#|\{LANG\})/i, wrImg.lang); + src = src.replace (/(#DIR#|\{DIR\})/i , wrImg.xlate? valLang : windDir); + set_ajax_obs(wrImg.useTag, src + , ''    + langWindFrom + valLang
+            + ''); + } else { // Wind calm + set_ajax_obs("ajaxwindicon" , ""); + set_ajax_obs("gizmowindicon" , ""); + set_ajax_obs("ajaxwinddir" , ""); + set_ajax_obs("gizmowinddir" , ""); + set_ajax_obs("ajaxwinddeg" , ""); + set_ajax_obs("gizmowinddeg" , ""); + + src = wrImg.src.replace(/(#LANG#|\{LANG\})/i, wrImg.lang); + src = src.replace (/(#DIR#|\{DIR\})/i , wrImg.calm); + set_ajax_obs(wrImg.useTag , src + , ''    + langBeaufort[0]
+            + ''); + } + + +// Solar Radiation + ;;;set_ajax_obs('ajaxProgress',rand+'sol','in Solar'); + solar = clientraw[127] * 1.0; + solarpct = clientraw[34]; + if (clientrawextra!==null) {maxsolar = clientrawextra[684];} + else {maxsolar = 1500;} + set_ajax_obs("ajaxsolar" ,solar.toFixed(0)); + set_ajax_obs("ajaxsolarpct",solarpct); + + SII = Math.min(10,Math.round(solar*10/maxsolar)); + src = siImg.src.replace(/(#INDEX#|\{INDEX\})/i, SII); + set_ajax_obs(siImg.useTag, SII + ,''    + SII
+         + ''); + + SII2 = Math.min(10,Math.floor(solarpct*0.1)); + src = siImg2.src.replace(/(#INDEX#|\{INDEX\})/i, SII2); + set_ajax_obs(siImg2.useTag, SII2 + ,''    + SII2
+         + ''); + + +// UV Index + ;;;set_ajax_obs('ajaxProgress',rand+'uv','in UV'); + uv = parseFloat(clientraw[79]); + set_ajax_obs("ajaxuv" ,uv.toFixed(dp.UV)); + set_ajax_obs("ajaxuvNoD",uv.toFixed(0)); + set_ajax_obs("gizmouv" ,uv.toFixed(dp.UV)) ; + + uvword = ajax_getUVrange(uv); + set_ajax_obs("ajaxuvword" ,uv, uvword); + set_ajax_obs("gizmouvword",uv, uvword); + + uvburnrate = ajax_getUVburnRate(uv); + set_ajax_obs("ajaxuvburnrate",uvburnrate); + + UVI = Math.min(11,Math.round(uv)); + src = uvImg.src.replace(/(#INDEX#|\{INDEX\})/i, UVI); + set_ajax_obs(uvImg.useTag, UVI + ,''    + UVI
+         + ''); + +// Rain ... (mm) + ;;;set_ajax_obs('ajaxProgress',rand+'rain','in Rain'); + rain = parseFloat( clientraw[ 7]).convertRain(); + rainYes = parseFloat( clientraw[19]).convertRain(); + rainMonth = parseFloat( clientraw[ 8]).convertRain(); + rainYear = parseFloat( clientraw[ 9]).convertRain(); + rainratehr = parseFloat((clientraw[10])*60).convertRain(); // make per hour rate. + rainratemax = parseFloat((clientraw[11])*60).convertRain(); // make per hour rate + + set_ajax_obs("ajaxrainratehr" ,rainratehr .toFixed(dp.Rain+1) +' '+ uom.Rain); + set_ajax_obs("ajaxrainratemax",rainratemax.toFixed(dp.Rain+1) +' '+ uom.Rain); + + set_ajax_obs("ajaxrain" ,rain .toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrain2" ,rain .toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainYes" ,rainYes.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainydy" ,rainYes.toFixed(dp.Rain) +' '+ uom.Rain); // old yesterdays rain tag for compatibility + + set_ajax_obs("ajaxrainmo" ,rainMonth.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainyr" ,rainYear .toFixed(dp.Rain) +' '+ uom.Rain); + + set_ajax_obs("ajaxrainNoU" ,rain .toFixed(dp.Rain)); + set_ajax_obs("gizmorain" ,rain .toFixed(dp.Rain) +' '+ uom.Rain); + + if (clientrawextra!==null) { + ;;;set_ajax_obs('ajaxProgress',rand+'rainex','in Rain Extra'); + // Rain in last week + rainMon = parseFloat((clientrawextra[484])/10).convertRain(); + rainTue = parseFloat((clientrawextra[485])/10).convertRain(); + rainWed = parseFloat((clientrawextra[486])/10).convertRain(); + rainThu = parseFloat((clientrawextra[487])/10).convertRain(); + rainFri = parseFloat((clientrawextra[488])/10).convertRain(); + rainSat = parseFloat((clientrawextra[489])/10).convertRain(); + rainSun = parseFloat((clientrawextra[490])/10).convertRain(); + set_ajax_obs("ajaxrainSun" ,rainSun.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainMon" ,rainMon.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainTue" ,rainTue.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainWed" ,rainWed.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainThu" ,rainThu.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainFri" ,rainFri.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxrainSat" ,rainSat.toFixed(dp.Rain) +' '+ uom.Rain); + + // Record alltime daily rain + rcdRain = parseFloat(clientrawextra[349]).convertRain(); + rcdRainDt = new Date ( clientrawextra[354], clientrawextra[353]-1, clientrawextra[352] // YMD + , clientrawextra[350], clientrawextra[351] , 0); //HMS + set_ajax_obs("ajaxRcdRain" , rcdRain.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxRcdRainTime", rcdRainDt.date(uom.timeHM)); + set_ajax_obs("ajaxRcdRainDate", rcdRainDt.date(uom.dateFmt)); + + // Record alltime daily rain in 1 hour + rcdRainHr = parseFloat(clientrawextra[355]).convertRain(); + rcdRainHrDt = new Date ( clientrawextra[360], clientrawextra[359]-1, clientrawextra[358] // YMD + , clientrawextra[356], clientrawextra[357] , 0); //HMS + set_ajax_obs("ajaxRcdRainHr" , rcdRainHr.toFixed(dp.Rain) +' '+ uom.Rain); + set_ajax_obs("ajaxRcdRainHrTime", rcdRainHrDt.date(uom.timeHM)); + set_ajax_obs("ajaxRcdRainHrDate", rcdRainHrDt.date(uom.dateFmt)); + + // Days with/without rain + daysRain = parseInt( clientrawextra[483]); // nr of days with rain (MTD) + daysNoRain = parseInt( clientrawextra[482]); // nr of days since last rain + set_ajax_obs("ajaxDaysRain" , daysRain ); + set_ajax_obs("ajaxDaysNoRain", daysNoRain ); + } + + +// Snow ... (cm) + ;;;set_ajax_obs('ajaxProgress',rand+'snow','in Snow'); + if (clientrawextra!==null) { + snowToday = parseFloat(clientrawextra[479]).convertSnow(); + snowMonth = parseFloat(clientrawextra[480]).convertSnow(); + snowSeason = parseFloat(clientrawextra[481]).convertSnow(); + snowDepth = parseFloat(clientrawextra[697]).convertSnow(); + set_ajax_obs("ajaxsnowToday" ,snowToday .toFixed(dp.Snow) +' '+ uom.Snow); + set_ajax_obs("ajaxsnowToday2" ,snowToday .toFixed(dp.Snow) +' '+ uom.Snow); + set_ajax_obs("ajaxsnowMonth" ,snowMonth .toFixed(dp.Snow) +' '+ uom.Snow); + set_ajax_obs("ajaxsnowSeason",snowSeason.toFixed(dp.Snow) +' '+ uom.Snow); + set_ajax_obs("ajaxsnowDepth" ,snowDepth .toFixed(dp.Snow) +' '+ uom.Snow); + } + + +// Lightning ... + ;;;set_ajax_obs('ajaxProgress',rand+'ligh','in Lightning'); + + lighteningcountlastminute = clientraw[114]; + set_ajax_obs("ajaxlightning",lighteningcountlastminute); + + lastlightningstriketime = clientraw[115]; + set_ajax_obs("ajaxlightningtime",lastlightningstriketime); + + lastlightningstrikedate = clientraw[116]; + set_ajax_obs("ajaxlightningdate",lastlightningstrikedate); + + lighteningdistance = parseFloat(clientraw[118]).convertDist(); + set_ajax_obs("ajaxlightningdist",lighteningdistance .toFixed(dp.Dist) +' '+ uom.Dist); + + lighteningbearing = clientraw[119]; + set_ajax_obs("ajaxlightningbearing",lighteningbearing + uom.Deg); + + +// Cloud Height ... (meters) + ;;;set_ajax_obs('ajaxProgress',rand+'cloud','in Clouds'); + temp = clientraw[ 4]; + dewp = clientraw[72]; + pres = parseFloat(clientraw[6]).convertBaro(); + rain = parseFloat(clientraw[7]).convertRain(); + wind = parseFloat(clientraw[1]).convertWind(); // gust = clientraw[2] + wdir = ajax_getWindDirLang(clientraw[3]); + cloudheight = Math.max(0,(temp-dewp)/0.00802)*1.0 + cloudImg.stationAlt; // in meters + altitude = Math.round(cloudheight.convertAlti()); + above = (cloudImg.stationAlt>0)? ' ASL' : ' AGL'; + cloudText = altitude.toString() + uom.Alti + above; + param = '?uom=' + useUOM + '&buster=' + altitude + pres + beaufortnum + rain; + set_ajax_obs("ajaxcloudheightimg", param + ,''    + cloudText
+         + ''); + set_ajax_obs("ajaxcloudheight",cloudText); + + +// Fire Risk ... (FWI) + ;;;set_ajax_obs('ajaxProgress',rand+'fire','in Fire Risk'); + if (clientrawextra!==null) { + FWI = parseFloat(clientrawextra[635]).toFixed(1); + set_ajax_obs("ajaxfireindex",FWI); + idx = ajax_getFireIndex(FWI ,fireImg); + src = fireImg.src.replace(/(#IMGNR#|\{IMGNR\})/i ,idx); + set_ajax_obs(fireImg.useTag, idx + ,''    + FWI
+            + ''); + } + + liveFWI = 2*Math.exp(-0.45+0.987*Math.log(10, 2.71828183)-0.0345*humidity+0.0338*temp+0.0234*wind); + set_ajax_obs("ajaxLiveFWI","Live FWI: "+liveFWI.toFixed(1)); + liveFWI10 = 2*Math.exp(-0.45+0.987*Math.log(10, 2.71828183)-0.0345*humidity+0.0338*temp+0.0234*windmaxavg); + set_ajax_obs("ajaxLiveFWI10","Live FWI: "+liveFWI10.toFixed(1)); + + +// Fire Risk ... (CBI) + ;;;set_ajax_obs('ajaxProgress',rand+'fire','in CBI'); + if (clientrawextra!==null) { + CBI = parseFloat(clientrawextra[765]); + set_ajax_obs("ajaxcbiindex",CBI); + idx = ajax_getCBIIndex(CBI ,fireImg2); + src = fireImg2.src.replace(/(#IMGNR#|\{IMGNR\})/i ,idx); + set_ajax_obs(fireImg2.useTag, idx + ,''    + CBI
+            + ''); + } + + +// Leaf wetness ... + ;;;set_ajax_obs('ajaxProgress',rand+'leaf','in Leaf wetness'); + VPleaf = clientraw[156] * 1.0; + set_ajax_obs("ajaxVPleaf" ,VPleaf); + + +// Sun/Moon rise/set (needed by all functions below) ... + if (clientrawextra!==null) { + ;;;set_ajax_obs('ajaxProgress',rand+'getMS','stuck in sun/moon info'); + YY = clientraw[141]; + MM = clientraw[36]; + DD = clientraw[35]; + SR = clientrawextra[556]; // sunrise + SS = clientrawextra[557]; // sunset + MR = clientrawextra[558]; // moonrise + MS = clientrawextra[559]; // moonset + // Sun rise/set + sunriseWD = MM+'/'+DD+'/'+YY+' '+SR.replace(/AM/i," AM").replace(/PM/i," PM"); + sunsetWD = MM+'/'+DD+'/'+YY+' '+SS.replace(/AM/i," AM").replace(/PM/i," PM"); + sunrise = new Date(sunriseWD); + sunset = new Date(sunsetWD); + sunriseWC = sunrise.getTime() - (webcamImg.delayDayNight*60*1000); + sunsetWC = sunset.getTime() + (webcamImg.delayDayNight*60*1000); + // Moon rise/set + moonriseWD = MM+'/'+DD+'/'+YY+' '+MR.replace(/AM/i," AM").replace(/PM/i," PM"); + moonsetWD = MM+'/'+DD+'/'+YY+' '+MS.replace(/AM/i," AM").replace(/PM/i," PM"); + moonrise = new Date(moonriseWD); + moonset = new Date(moonsetWD); + // Time now + } + WDnow = WDdt.getTime(); + +// Moon & Sun ... rise & set, pic, phase, illumination + ;;;set_ajax_obs('ajaxProgress',rand+'moon','in Moon'); + mooninfo = getMoonInfo(); + moonNS = parseFloat(clientraw[160])>0 ? "NH" : "SH"; // latitude + set_ajax_obs("ajaxmoonphase",mooninfo.phase); + set_ajax_obs("ajaxmoonpct" ,mooninfo.ill+'%'); + moonText = mooninfo.phase + ', Moon at ' + mooninfo.age + ' in cycle (' + mooninfo.ill + '%)'; + src = moonImg.src.replace(/(#BG#|\{BG\})/i , moonImg.bg); + src = src.replace (/(#NS#|\{NS\})/i , moonNS); + src = src.replace (/(#AGE#|\{AGE\})/i, mooninfo.pic.toString().str_pad(2)); + set_ajax_obs(moonImg.useTag, mooninfo.age+mooninfo.ill+mooninfo.pic + ,''    + moonText
+         + ''); + + // 100x00 black background img for Astronomy page + src = moonImg.src.replace(/(#BG#|\{BG\})/i , 'b'); + src = src.replace (/(#NS#|\{NS\})/i , moonNS); + src = src.replace (/(#AGE#|\{AGE\})/i, mooninfo.pic.toString().str_pad(2)); + set_ajax_obs("ajaxmoonimg100", mooninfo.age+mooninfo.ill+mooninfo.pic + ,''    + moonText
+         + ''); + + if (clientrawextra!==null) { + set_ajax_obs("ajaxsunrise" ,sunrise .date(uom.timeHM)); + set_ajax_obs("ajaxsunset" ,sunset .date(uom.timeHM)); + set_ajax_obs("ajaxmoonrise",moonrise.date(uom.timeHM)); + set_ajax_obs("ajaxmoonset" ,moonset .date(uom.timeHM)); + } + + +// Current conditions description and icon ... + ;;;set_ajax_obs('ajaxProgress',rand+'cond','in Conditions'); + // check if we need the icon instead of the webcam image at night + if (!webcamImg.useCamAtNight && clientrawextra!==null) { + if (WDnow < sunriseWC || WDnow > sunsetWC) + webcamImg.swapIconWithWebcam = false; + } + currentcond = clientraw[49]; + currentcond = currentcond.replace(/_/g,' '); + // currentcond = currentcond.replace(/Dry/g,''); + currentcond = currentcond.replace(/\\/g,', '); + currentcond = currentcond.replace(/\//g,', '); + currentcond = ajax_fixupCondition(currentcond); + currIconNr = parseInt(clientraw[48]); + set_ajax_obs("ajaxcurrentcond" ,currentcond); + set_ajax_obs("gizmocurrentcond",currentcond); + + VPforcast = clientrawextra[531]; + VPforcast = VPforcast.replace(/\\/g,', '); + VPforcast = ajax_fixupCondition(VPforcast.replace("temp.","temperature")); + set_ajax_obs("ajaxVPforcast",VPforcast); + + if (!webcamImg.swapIconWithWebcam) { + switch (wxIcon.useName) { // dashboard icons + case 0: set_ajax_obs(wxIcon.useTag ,clientraw[48] ,ajax_getIconName0(currIconNr,wxIcon)); break; // Anole's icon names + case 1: set_ajax_obs(wxIcon.useTag ,clientraw[48] ,ajax_getIconName1(currIconNr,wxIcon)); break; // NWS icon names + case 2: set_ajax_obs(wxIcon.useTag ,1 ,wxIcon.yoHTML); break; // YoWindow icon + case 9: //Dynamic icon creation similar to cloud height (not yet implemented) + param = '?uom=' + useUOM + + '&con=' + currentcond + + '&iW=' + wxIcon.width + + '&iH=' + wxIcon.height; + set_ajax_obs(wxIcon.useTag, param + ,''    + currentcond
+                     + ''); + break; + default: set_ajax_obs(wxIcon.useTag ,'
INVALID ICON FUNCTION #'+wxIcon.useName+'"
'); + set_ajax_obs(wxIcon.useTag ,'
INVALID ICON FUNCTION #'+wxIcon.useName+'"
'); + } + } + + +// Current webcam snap ... + ;;;set_ajax_obs('ajaxProgress',rand+'webcam','in Webcam'); + if (webcamImg.swapIconWithWebcam) + ajaxTag = wxIcon.useTag; + else ajaxTag = webcamImg.useTag; + + if (webcamImg.webcamUpdate!==0) { // if 0 then no ajax updates requested + now = new Date(); + minutes = (now.getHours()*60) + now.getMinutes(); + interval = Math.floor(minutes / webcamImg.webcamUpdate); + param = '?buster=' + interval; + if (clientrawextra!==null && (WDnowsunsetWC)) + src = webcamImg.srcNgt; + else src = webcamImg.src; + set_ajax_obs(ajaxTag, interval + ,''    + currentcond
+            + ''); + } +// ----------------------------------------------------------------- end of tags + + if (lastajaxtimeformat !== WDdt.date("d-m-Y H:i:s")) { + counterSecs = 0; // reset timer + lastajaxtimeformat = WDdt.date("d-m-Y H:i:s"); // remember this time + } + + } // END if(clientraw[0] = '12345' and '!!' at end) + notifyR=0; + } // END if (x.readyState == 4 && x.status == 200) + + set_ajax_obs('ajaxupdatecount' ,ajaxUpdates); /* for test pages */ + set_ajax_obs('ajaxmaxupdatecount',update.maxupdates); /* for test pages */ + set_ajax_obs('ajaxState' , x.readyState); /* for test pages */ + set_ajax_obs('ajaxStatus', x.statusText); /* for test pages */ + if (x.readyState===4 && x.status===404) { // not found + if (notifyR===1) { + htp = 'http://'+window.location.host; + crf = clientrawFile.substr(0,1)==='.'? htp+clientrawFile.substr(1,clientrawFile.length) : clientrawFile+' (2)'; + alert("AJAX DASHBOARD ERROR:\nYour \""+crf+"\" file could not be found."); + } + notifyR++; + } + ;;;set_ajax_obs('ajaxProgress',rand+'done','-- DONE --'); + } // END try + + catch(e){} // Mike Challis added fix to fix random error: NS_ERROR_NOT_AVAILABLE + + }; // END x.onreadystatechange = function() + + x.open("GET", url, true); + x.send(null); + + // now ensure that the indicator flashes on every AJAX fetch + ajax_flash_green("ajaxindicator"); + ajax_flash_green("ajaxindicator2"); + ajax_flash_green("gizmoindicator"); + + // reset the flash colors, and restart the update unless maxupdate limit is reached + setTimeout("ajax_flash_reset('')",flash.time); // change text back to default color + + if (update.maxupdates === 0 || ajaxUpdates < update.maxupdates-1) { + timerAjaxLoader = setTimeout("ajaxLoader(clientrawFile + '?' + new Date().getTime())", update.reloadtime); // get new data + } else { + counterSecs = 0; // reset timer + stopTime = new Date().getTime(); + PauseMsg = ''; + if (update.showRefresh) + PauseMsg = ''+langRefresh+'   '; + PauseMsg+= ''+langPauseMsg+''; + set_ajax_obs("ajaxindicator",stopTime,PauseMsg); + set_ajax_obs("ajaxindicator2",stopTime,PauseMsg); + } + } else {// if (x) + set_ajax_obs('ajaxProgress',rand+'http',"AJAX DASHBOARD ERROR:\nNo HTTP Request"); + } +}; // end ajaxLoader function + + + +// invoke when first loaded on page +window.onload=function() { + if (gotSettings) loadSettings(); // we've got a seperate settings file + initialize(); + ajax_page_saveTags(); + ajaxLoader_clientextra(clientrawextraFile + '?' + new Date().getTime()); + window.setInterval("ajax_countup()", 1000); // run the counter for seconds since update + window.setInterval("ajax_countup2()", 1000); // run the counter for seconds since update + ajaxLoader(clientrawFile + '?' + new Date().getTime()); +}; + + + + diff --git a/website-scripts/weather-display-templates/my-website-saratoga/ajaxgizmo.js b/website-scripts/weather-display-templates/my-website-saratoga/ajaxgizmo.js new file mode 100644 index 0000000..1e5e2d0 --- /dev/null +++ b/website-scripts/weather-display-templates/my-website-saratoga/ajaxgizmo.js @@ -0,0 +1,109 @@ +//
+// where N=0..8 +// +// Version 1.00 - initial release +// Version 1.01 - changed to look for class="ajaxcontentN" to prevent interference with buoy-data.php +// Version 1.02 - fixed rotation for Internet Explorer 8 +// +// +// --------- begom settomgs --------------------------------------------------------------- +var ajaxrotatedelay=4000; // Rotate display every 4 secs (= 4000 ms) +var showUV = false ; // set to false if you don't have a Davis VP UV sensor +// --------- emd settomgs ----------------------------------------------------------------- +// +// you shouldn't need to change things below this line +// +var ie4=document.all; +var browser = navigator.appName; +var ie8 = false; +if (ie4 && /MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x; + var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number + if (ieversion>=8) { + ie4=false; + ie8=true; + } +} +var ajaxcurindex = 0; +var ajaxtotalcontent = 0; +var ajaxrunrotation = 1; +var browser = navigator.appName; + +function get_content_tags ( tag ) { +// search all the span tags and return the list with class=tag +// + if (ie4 && browser != "Opera" && ! ie8) { + var elem = document.getElementsByTagName('span'); + var lookfor = 'className'; + } else { + var elem = document.getElementsByTagName('span'); + var lookfor = 'class'; + } + var arr = new Array(); + var i = 0; + var iarr = 0; + + for(i = 0; i < elem.length; i++) { + var att = elem[i].getAttribute(lookfor); + if(att == tag) { + arr[iarr] = elem[i]; + iarr++; + } + } + + return arr; +} + + +function ajax_get_total() { + ajaxtotalcontent = 8; // content0 .. content7 + if (showUV) { ajaxtotalcontent++ ; } // UV display is in last content area +} + +function ajax_contract_all() { + for (var y=0;y diff --git a/website-scripts/weather-display-templates/my-website-saratoga/forecasticonmetar.gif b/website-scripts/weather-display-templates/my-website-saratoga/forecasticonmetar.gif index a23137117155cf8efae16b4d0c875e49343bc1ed..8b8361d7ef1bd7617514300977550e171ca45ad3 100644 GIT binary patch literal 32258 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 literal 7779 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 literal 0 HcmV?d00001 diff --git a/website-scripts/weather-display-templates/my-website-saratoga/forecasticonnew.jpg b/website-scripts/weather-display-templates/my-website-saratoga/forecasticonnew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83f81597440e56ebcf4cf139d9c751e11d15701b GIT binary patch literal 32453 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

m&#y12u9>V;GMFoB|~h(;_voP$t5MBnK0S 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 - - - - - - - - - USA Website with PHP & AJAX - Home - - - - - - - - - - - - - -

- - - - -
- -
- - -
- - - -
-
Freeze Watch active for MDZ013
-
- -
-
-
- - - - - - - - -
- - - WU South West Satellite -
Radar/Satellite images courtesy of - Rainviewer and - Weather Underground.
- -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Updates paused - reload page to start @ -  10/31/2023 -3:12:00 PM - -
Summary / TemperatureWindRainOutlook
- - - - - - - - - - - - -
- Current condition icon - partly cloudy -
- - - 50.1°F -
- -

-  Pretty Cool  -

- Feels like: 47&deg;F -

- 24-hr difference
- -27.2 °F
- - - - - - - - - - - - - - - - -
 TodayRecord
High: - 62.0
- -
81.0 1982
Low: - 40.0
- -
21.0 - 1968
-
-
- - - - - - - - - - - - - - - - - -
- NNE
- 5.8 mph mph
- Gust:
- 5.8 mph mph -
- 2 bft - Light Breeze -
- Highest Wind Gust Recorded: 49.0 - 10/28/2023 -
- Today: - 12.7 - -
- Today's Windrun: 89.80 -
- Gust Month: 49.5 mph - 10/28 -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Rain Today: - 0.04 in. -
Rain Rate (/hr): - 0.00 -
Rain Yesterday: - 0.15 in. -
October Average: - --- -
Storm Rain: - 0.00 in.
This Month: - 2.32 in. -
Season Total: - 55.05 in. -
- 0 days since last rain.
-
- - - - -
- TODAY


Today Mostly cloudy with a slight chance of rain this morning, then partly sunny this afternoon. much cooler with highs in the mid 50s. northeast winds 5 to 10 mph. chance of rain 20 percent.
-
Humidity & BarometerAlmanacMoon
- - - - - - - - - - - - - - - - -
Humidity: - 54% -  
Dew Point: - 34.1°F -
Barometer: - 29.979 in. inHg - -
Baro Trend: - Steady -
-
- - - - - - - - - - - - - - - - - - -
Sunrise:7:34 am
Sunset:6:08 pm
Moonrise: - 7:20 pm
Moonset: - 10:45 am
-
- - - - - - - - - - -
Waning Gibbous Moon
Waning Crescent, Moon at 27 days in cycle -
90%
- Illuminated
-
- - -
- Snowfall -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Today: - 0 - - -
Yesterday: - 0.0 -
October Snow: - 0 -
Season Total:2 - T -
Snow Depth: - 0 -
0 snow days in October
- 0 snow days this season. -
- First Snow of Season:
0/0/0
-
- - - - - - -
 NWS Weather Forecast  - Outlook: Overnight & Thursday
- - - - - - - - - - -
TODAY

 ---


NWS forecast: -Today Mostly cloudy with a slight chance of rain this morning, then partly sunny this afternoon. much cooler with highs in the mid 50s. northeast winds 5 to 10 mph. chance of rain 20 percent.
-
 
TONIGHT




NWS forecast:Tonight Mostly cloudy. a slight chance of rain in the evening. lows in the upper 30s. north winds 5 to 10 mph. chance of rain 20 percent.
-
- -
- - -
-
- -
- -
- - - - -
- - - - + + + + + + + + + + USA Website with PHP & AJAX - Home + + + + + + + + + + + + + +
+ + + + +
+ +
+ + +
+ + + +
+
Freeze Warning active for MDZ013
+
+ +
+
+
+ + + + + + + + +
+ + + WU South West Satellite +
Radar/Satellite images courtesy of + Rainviewer and + Weather Underground.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Updates paused - reload page to start @ +  11/1/2023 +08:37:00 AM + +
Summary / TemperatureWindRainOutlook
+ + + + + + + + + + + + +
+ Current condition icon + mostly cloudy +
+ + + 38.3°F +
+ +

+  Very Cold  +

+ Feels like: 11&deg;F +

+ 24-hr difference
+ -4.3 °F
+ + + + + + + + + + + + + + + + +
 TodayRecord
High: + 62.0
+ +
84.0 1982
Low: + 40.0
+ +
25.0 - 1975
+
+
+ + + + + + + + + + + + + + + + + +
+ NNW
+ 14.9 mph mph
+ Gust:
+ 27.6 mph mph +
+ 6 bft + Strong Breeze +
+ Highest Wind Gust Recorded: 49.0 + 10/28/2023 +
+ Today: + 27.6 + +
+ Today's Windrun: 38.58 +
+ Gust Month: 27.6 mph + 11/1 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Rain Today: + 0.00 in. +
Rain Rate (/hr): + 0.00 +
Rain Yesterday: + 0.04 in. +
November Average: + --- +
Storm Rain: + 0.00 in.
This Month: + 0.00 in. +
Season Total: + 55.05 in. +
+ 0 days since last rain.
+
+ + + + +
+ TODAY


Today Partly sunny this morning, then clearing. scattered sprinkles this morning. highs in the lower 50s. northwest winds 15 to 20 mph with gusts up to 30 mph.
+
Humidity & BarometerAlmanacMoon
+ + + + + + + + + + + + + + + + +
Humidity: + 71% +  
Dew Point: + 29.7°F +
Barometer: + 30.039 in. inHg + +
Baro Trend: + Steady +
+
+ + + + + + + + + + + + + + + + + + +
Sunrise:7:35 am
Sunset:6:07 pm
Moonrise: + 8:04 pm
Moonset: + 11:50 am
+
+ + + + + + + + + + +
Waning Gibbous Moon
Waning Crescent, Moon at 27 days in cycle +
84%
+ Illuminated
+
+ + +
+ Snowfall +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Today: + 0.01 + + +
Yesterday: + 0.0 +
November Snow: + 0.01 +
Season Total:2 + 0.02 +
Snow Depth: + 0 +
0 snow days in November
+ 0 snow days this season. +
+ First Snow of Season:
0/0/0
+
+ + + + + + +
 NWS Weather Forecast  - Outlook: Overnight & Thursday
+ + + + + + + + + + +
TODAY

 ---


NWS forecast: +Today Partly sunny this morning, then clearing. scattered sprinkles this morning. highs in the lower 50s. northwest winds 15 to 20 mph with gusts up to 30 mph.
+
 
TONIGHT




NWS forecast:Tonight Mostly clear. widespread frost after midnight. lows in the lower 30s in the downtown areas...in the upper 20s in the suburbs. northwest winds 10 to 15 mph with gusts up to 25 mph, diminishing to around 5 mph after midnight.
+
+ +
+ + +
+
+ +
+ +
+ + + + +
+ + + +