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 ('');
+ } 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 ('');
+ } 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 = '';
+ } else if (diff > 0) { // today is greater
+ msg = textUP.replace(/\%s/,absDiffStr);
+ image = '';
+ } else { // today is lesser
+ msg = textDN.replace(/\%s/,absDiffStr);
+ image = '';
+ }
+ 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
+ , '');
+ set_ajax_obs("ajaxcellthermometer", param
+ , '');
+
+
+// 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 = '';
+ 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
+ , '');
+ } 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
+ , '');
+ }
+
+
+// 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
+ ,'');
+
+ SII2 = Math.min(10,Math.floor(solarpct*0.1));
+ src = siImg2.src.replace(/(#INDEX#|\{INDEX\})/i, SII2);
+ set_ajax_obs(siImg2.useTag, 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
+ ,'');
+
+// 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
+ ,'');
+ 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
+ ,'');
+ }
+
+ 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
+ ,'');
+ }
+
+
+// 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
+ ,'');
+
+ // 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
+ ,'');
+
+ 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
+ ,'');
+ 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
+ ,'');
+ }
+// ----------------------------------------------------------------- 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
zcmW-lbyO3M*T$!8Y^?o?QUX&9N}Yj%G$<{CpduXxN)4n#M(1D%Dhk4ARAPd3jgV%H
z9yLaX#Av1V`u?7C@A=$&&U5ZL_s@IPHPxhVTZIBb0UiK=B;cR^zYhCH{QnaFKj8m$
zcs%8w#wgkCEcQN&M9ReD@$7#dHh}#<{Numsp8)rZ0lFms{ZgQQDaf!4U|0z-u7Nx(
zg&LM39+z=FDn}ZXL5(UQ#?@SAHHfDbaN}yEX(hs}=7e#@3A4%*W;NU<6{pN9xy`Hj
z%qux9>kwA8+*UOLmX&-~)qKxt&sbIoT2~7`uRZs?=Dcm4*sD6MQysv(9%4=b*farb
zn*sLiP@8(#>t9fZR)BLC^i3DSlL~O79rNku@TbGvX)vE&h(G(iXY+O6Hfgs;S?^{!zg88$W@Z0YAbtoGK!*hkaD|M(BN!)x2L217
zpAH{75j8Fl*vlJ67mOGbh@c~*m?sF6r{bph-p>hqSU8h7C-iAS65k~f)O#*+P=qin
z5z-?W*)JADmyDy|2<(y#>Qsp6z8Olp9@!@w-Fu5Tc;g-YcH*dP+`yd=blJpVOw#G
zXm{fWR6o#FKaXf9^yz#W)J_`K3vDxu>M$a78pL&*zM~o>^gjGFXz+z@oIo@A-2XI%
zu1gv<4*kvd5$~*ipWH#8ykWN=4Bw)0zcMC1XCUy~U{F3iJby5tna07HCi+~{$U?{HT*vrA4`ZIjSfDZ&`==I1W|zhne$V_~URYgTX02>)
zukP-$4)<9QHb4w=MuSXJ4&aeaHtI2SQVBbC(>9l`7m(f(i&2fdX_S`P
z7B6bxo=2W+jO3NNsbZ+vHxqhN%4N)`J}tXDRVfI1Pt$5v?>&z~F3EXXjc^)$0a~IV
z5*BmjvNykcd&&2qLeZ;Z(E%drG5q3pOnJR0n+P{vHuo<8N(;>1-&_0elRnk_;f%Cx
zGK>5nJ0za>vAurAoDKrzz5AGq^W2zhzjRHYwDZxMwvH4#V+zw9_UW4R>u8qVr;T}N
zh_(yKIs1L?jhmR!8r(6}CRqN}4A+&DKW%#wLmu3EC07nYUoWKy#;bBd;K`R+tAxqx
z;b&f(m$2{j9rtugA?>YL)iOwTw*E?
zTy$H+c>%=B3_o|8Zv7n0X0TXiNvGiSyQ%VG1PhQu$Dwu+`A^>#N
ztcgNIoC@?(GUmAl2fyvPfYim@ivecFROl3qh2gg7Om(?TWkbFYOW
z9u~Y0@WDh=j&t$h@j?7Gz)dLM`2{hnFN&Yf&w#A5F^##BB&7zoof5V)0IL#0wq@h#@N69C
z)n1KhC^F}rk_u#?A?bDIg;q-rq_M445L}GNocV%!WA9j9Qm}-r#;jHTuDF;adA-yn
zkQBmSuX8e5!j?%?iN_>R0#BRBDF?!_CL;GG!iy*>(87$r)UAKCp*&BDE
z4|Kjv4T;4A8c$}wS8hIS+zH^wd{!3aHvIg7P{p9NkNnPDvd3!uNfNf0AXQ&|7|b>L
zTECeeXSW_HHLg*tR%T&)Ociq0UMP_3fv>(Azuisx8?Fiu$Ak4&Cv&fj&X<Yua9smZ#>hd!HNC$ME#`g
zG4A@-(B0A=_$e3GhlNb*Yd*tG?rPV*)HKb?4)Jx%r57jKa|bBgqp*X}TQ_3QdL9>R
z2#9@t>m=`>DEM}E55k>dBRHHJ%3DWMzL+q1s$VqhPJa*KMfq{K4*8P8%3ocDf;TCf
zna?$czv{-nGt9)kf37pX*v*5Tt0jU7Wm6lm+!16oNQUP%oc^Y`WOm(P*rHFRb64>n7$D{
z{q(R=i`>Q!9ml2yxZVQhrB&qc?48{TS@c&Jy|VA(%>b^U=f}}V30zn2y}I;AT7mj+h+6M%9v%HVB>w8(9xp?t|f{MmmRU7;yo(((6E&QKSz=YssVKjA7<`;NLL-=uLV0m*D4osQj}DX0U6%~pn-)GQ-&EW=
zKg_T+2Yl%tx0JGv;
z^YmYjvIaEv*O5V9>h}q6$TosYMlE+%Cs82!-e75pGvP1|rE$EGJHqlt5(*K#a&EZ&
zQS;C2kNL~@6)T5754!w}7hJI}+wOP)2obZ?UwUCGA~3eVdAl?X@#YElRvR4zKPra(v=ueU=$3^d(>0FQm%J
zbUhF@`qO9|F7#Gq9MY|SP;l86Ec+oc){iw!U1RH3C~h3nf6d)^nhXiytE8-1b4=3Z
zaphDG>SoHm>AZ}GGRhPHj4-H%g+oA+_Gxg})C|GWU+M}vj9AYc)7d>-m~^=_!Mast
z&Jv=^la2<7{Sjzu5%Q$^*KU>+*G$U9`h1wx-4)!jT)2DNo2SVhYQjCuzv!+muVrrY
zUBdEssoKG$(_yS1JwtGc-Yk`{9(78h0d9rfPY=R)T(0t4b${ZsFvR#vjXl~*+m)k?
z>+bdU)ojU&?lt8Tz3#QD@V4RAZZ)MjD)AgGu~yX;7|O^3SyeuBR7h==9_Z3m(iTn8
zZ)`2adq7)w%RTk&wi#+~XyS0cFXt`$PtD4VrH~~I}#7E(gW$!oPN!5s9t)Tk%MOr;fGuBC{aJ8=v!{ywt6CG;x
z=gATdIi`eY$H0sJ9WEI6#~6?Y|36$0G&US>Ypi1l1B=hk<3G@z&rlXX!9cdW3s8{w^evHyjV42kQbto-jdH
z07$qVw1I+HC!(rKU+&zt*~6js=iv>Ouu=@XoeZbq5HuWu%7k}V!mDzjA0ZHPOOOFM
zB88Wrt`V6@=TN{A5JrTd)?ft;P#FWvkp@w1LE#wqG#a&W!DLS<{K+NTT_$pc>_21)
zOKgpdB0;i9&|(a1UldkEijE{hIv1jKnFP8ganOh`=;_f
zGY-yWi88H#=U`#2SmY`mwL?ZSac}|-beBm|!Ga8NAVVfl^K}}}UYdw_`UU><1(~dK
zdn7~gtS8=C#v^Hl;@PueKtnR*8xGD=M^2*=Ww^|{ERMT0NH+^XBSV|<$W2QW7X}_o
z%V)Z`ExLPxkUc2kHo*4-1+(}GArTp*H|s!6AHu=iZJIw
zw2+~}N+4Ce6l)x;0}KC-=4v73tScdlF`Ut8t{f8V7(Z$WfRr=-76VO>{PwlsPF~ZU
zyd2{^RVCohN@yh+-UC47wL=1knX{U}C@eff3qtvdWc@|t5J5jHA<;^(iecme6H!Tn
zSSx|*jPqi>^JcjU6)}Zt(DbcuUs>MYTD}#o-zi-8{&trL{NfEQ!{;|D!Is(!j_v@T
zpt&lsuwWu64vpXf1kuo3y8Mt3^uMw286u!+5B`$^u_gld+6z_5g|Od+5**O%o5w#Uq;jBAU=#
zPie)$7*1;@q?;D*a0i~l{JyDGeCYjC#-#L)PthfTQY-CZ>!ebLj#8XJnR7?68!11R
z49&$u&nE%ZU}c(0kT?p&2n&2lfim#Oc{JiD6JkUuHi`nd;h{ZPBomEjC71smDRZf+
zu+=V2*{^V^Dz)pVc->KvlmwLT_z{QZioxVRwJdVB13uM*2-p=_E5Ro4NG2Yhs|U%}
z0urM@ni$SJG-3jc=*Gfp_AAxUWf`Lt*#b4au(EDgO-~Z=z6qGW0}@UC@o2Q#h5bEG
zzyzquDyzW6JC0OkzXr-{gVcyWf3o1MKJX|32;qB0UsBzkb}{pN-Qj38Kn|#euQ4Km
zMyh@U=z$vqC~R5EQ_DIvEG2{lW00$I(Oe-!VAtqRx=C#a5ysYpSJJB7ltAQ;Qn(~V
zY_#s6szDrHd#tnKT5j($a(EkzmHrus96lDG7Klukof%lLVadOtRUalky_E`I%|sy@O`@
zcc2j(%$Y~AJZQe_+o(wb`ua8+F(FO(>T*3uARctDx<%C<
z^L-(?L}(rn8e<75$!l+r>ufUZyxrM;qO)Bc2Tbd1am2OzR(F<3cD5&XM%shlkzuW5
zSgc;Vwq;kRX;*2h`Ss=5^DiR@3e^-)>Jy>MERiP!055
z?$*L|4am{@?7Ii@fb?ou6A>25FULo{eAMd+%*sF~gP%s-%5F9Yf?={W`N)ce?7%qYP16mFPnZDpq93+g?
zrM_WUL$YJiRy@Ea_6c7;=$3_LuXfTl1{6)-!^
zCitk6V8#UIXq=NVAtE$&kufpg0QSLy-!M5vsGL{dPGK0Fh*jon4bVYv>U!<;dFr$R
zb>hyIsflsUKlf*_$eBNaQ_3+D*jnHeV$w-zij&HzhMc;#nq?EKdlnj;;RwEVSHrw777z$V^#X
zW~{Crt+LEl*RQN?ny&>S!8<8y3o&bdsH=xZi|mxOgMu~S+L|Y0?LdL$1ORi@u{hW)
znD9FK>N@zr`mt0NzKj~fw~Pz)aC^?
zYD1!MgMV#!G;o9=mIty6e}yi=WuR*X{Z|*!5=bh6?|&>D~>A-E}2`V}<|3Ol-%Y{=W17``-WW
z=eobi6Mx?of)i4~B&VH>LU0ypFMDD;OL*_w)x8|lUTo?fF?KIsaW8#hufS>V$AkUv
zv3u1{f6JWqbJq6iEe^^G_kLX6b7k&lPaII$2Q=ZsUd6+Hi^D;Mvrpe*dGn*rS=XqqVi8B}Mj1_t6UbVCw;U8^!MRKiWZ|eYW7-
z(nL~9AOx{$MMs})3`1N{$>eoTzZb@RLA+nuIin@~EGTfOU+6uwKJ~t+Ftz<^`yY8_WAT6!jz5`Rty^!e=$a1
zpRVzn)6z{gDtM-lc*BI+&iD0sx9c^#+UNw=7kzOzcF+15J1*qEKasJ@o(?N>Vwpg
zzNEqjrsjLjo6AmhY@34zhqJ2_Yfriv2L}hyc8;}MxGGc~$J*vJ1#}{BtsWc@rKb!z
zWv{0K7Bs~*0(q9FYf)G8XetK@5h{akMr5UY1?QFNVI
zSI0chn~6OecK*7uR;1xZt(L3ghKA@DIhWS+v3c(_FQ)dpXkADRe%F3AV(hw($lCX!
z)*A%VUL9eHo+9nroN?@StA?~)nUDWXbm&h+Uj{vO-xR+`pv(PPW(&lJ-xvR$|I
zHALRKKGc#Z*?OpRW5CrwS2n-@otES=H^Ybb+~WK745Zu!3?7|wGkjzd;x_oyfFPx-
zr<(O>=!sMQsmCTy9i)ctSX_QT^hkeP>ZwiA?Dnut(#j*_7hj|v4_SWwQflZ>RWoRU
zYdqy)>XLtX*VH-go`;$HC}Q_NkLgpV%(a;%9t`ir8jlI@{edC6KYRPO1%9(;_mTH{
zO|V7i2_b3b3jy773txmeoe_2IRw6U{#vI*-D9ezZiRCG!KYOQ-Xdx-!^ydX_qL8;$M!cH$e9lKlKG&T{{*O&i-0G
z#}gl1ZQm_9XUYk6)A&NEfHNCEFLXcKXuS*;c+)O2QT?V(w$SuV_ilFbR=a`vxJ%FN
zy6UYS1Gd~&hiciO`u#tS?tBd^h@d>by5goKp98Zg5!~-e)+m_qV=Vu)ViFdRXiq
z)?f9Xk+nDkLKHYov+&@%q%HnGO2@A21#U}NfKF;qzz_9;K!%p=<0mwf;oi6);WKBs
z_!8?+nxlh74bvb`%IneYdO>G{g}GiDshpW3hsw-Yq5S@+VvcZO%92)>!aeVvzo;Lf
zZJK`Kw$z0-vmDs
z8t2uN)hZ&yx@HOUQ_SI$ma)r!
zA7X7_GkhSeto4z>ZJ*>0obSM#A$eX`byCcQzwRsxMrLVDq)T*m3z-oSA*&
zyO@px(jciJI{QXML?`ayjima6xyyc^bQ}w=ePrsqlu2sS_LzF}g|QrbNqX{uTfyeX
z*sZ496R)%%aC4JZ@4k={G}a3}-j_Dh|MKScVn^@`?sVw5sLK9deFO2Isr&;A8u$4h
z60;4nL}zWKZfiaKP;@g*{L8ER%Fv#qw}zQ#FT8pn^O^SG&(9p?M+=w2KlkXK891pX
z|4l6Rb$=XGDno7i)kC|zh)hnYT>bY;hHkGP6};Q}s&`q`FhXk}EBn!R9kV5afylv<
zD^lMb2E@&Nw-1&TxqWwauruF>_E+vm73gG%Tg{3;DgVzsKk~Aq%_+Ml8dVC93kifg
z8xh#>FD>^Xf}8zI`J^Y^p|^_DFF4prm>BnGKQ8(H+`-Ol-e#608mk)EDOwq;+c>EixvM*P
zXsH?LtJ~=6ndloi=vtW@+Bn-7JKNa07?`>nnui$Kdm1~1*qVCSIruobggK*c8@pjl
zJi{H`{hhocoI_&J_P5cd-fqr*?k=Hd^lcB%03Y9Izp(ou0fAxu_rk(sUHq_);aJ}Q
zoc~=y@S~jY09<5LLU?TU{Ri2B_~gjAgm7G1Y+S&^HD9)`a&TA+st}ZQU
zEGQ+F6ttI>k_swXONlk56-{LoBw|(>F|WF!ps}K)rn0oDzNEULteIHQURBoKP}bh@
zq`i_@TUF6qTi?=H)zVtuR$bLmThmw5&{@;a-&oz*RNddy*wx%L&`j!XAq|q6+S;qT
z+G__onz}oi2m5M!2J8CzntS@1hdM~zo$W(ieZ&2vp8k%Zp}vupW^xN@tgD6G-#R+n
zHrw4X+S4`L(>LBbFgwsSKG;1w*gr8eFgr}1C%4Uvc2A7<%#IFBjt$PwcP-2gP0tQ3
zObjp24X;d+rzS=hCTEsr#}?;jpG}UhOwFv#PpmCYZ7s~MFV4T1U)x+--d>qpUzyrk
zncG-h+}>K+U0>c@U)kMSeYw80xAkmqV{Pxn`rht~{k`XJ_jcdyzdU-g_x|9`@zL84
z$48$&eY7!Vde2F+pX>(8KKt1>cOaxyX-Oc?v#3?`Fb8UoM8L
zcGjpxn3fcCtIF*5we1eXsT*We&xgCr=e3Bma4C8}Z)DZk`cS0ny-;p-Kb6GQ>AlfR
z-#oRlt>C{)dH~rBJW$K|_`JPZZSBxB`r=hLvr2^UeBNpC_q5oI&Vg+0l@>v#NZy60
z&j*tqVzbNo!anvSe0Bch-y8IHrc5&NldyAmcA~>zq#5ZAW}{KuqbJ}~r{^rp8aTv0
z(2YrGGrH=0&a=}KxI324!hWw?eg0hDB}m2Mopqt;MoUfrOBu3DvU~ltnWv^*hW}w7
zvxVkY@*0zsxzdK6>TbZA3$iKDF4x#R>+2KMMJMJ0rO6??mv^a!buzWCX)!w}EYhv-
zhHWJka45edjHeq4G5WkP{k#a`bbieGZVAJu-F@Bm!@+m!OwCZ?Rb$#I=4a|QjD5LA
z?2$@K!SAr+xz5&ZO4iQru|LZ0BuKNQ$x}<~(8I0zNHw`&+6#Pkv!w7yk)q?sC<0f*I)&nBjl(m)3b7V
zYL7*D25Ek~*g#5le`R^BmO#7V^<@iaq2W^YcC~L$k=k5UpObaN)GW(}&EzOkG(B~N
zB7dQE7Q}2SAFbzUCAZ%7PQaxD*Ojic8t_$Ah2!gY$58!qA!&89Y-U^QF{NY{3oG-Z
zb>t~#U}wmrMu;__k@mg0=F!5AW3XAb;$t3T(5gJ_wMBZkjGtzi@i-
zrlL)|`)Zm`y2_*C>8(ef__%7aG+4cSjm-GJeR}vSe=XhL?_7DwJ>4y7&FDr6v$^rb
z^3_{&)xny0YxR>EK|eeBoeK~23TMKyLI`yyM1BTjW2Pk`V7s8SoNFi-GmB#xn5GgxtfApo~TnkT=4;ScMXo=GUzH)nD4qR1qQrIb-+?DEPvb6Yl@!C%ynCj7E
z(ITA;hcwz>iw-B8*HmiT3tuKz-iiv7UIuz`4|bHgQ5^LIYkvf-^yWpQGvKv?FH
z>oxVt&y9^5asISY+Avf2^G~VAnK$%>9DTfw@yz;dL|pw
zKG`bqBXzDJiE|E{5N(a2_o-eMl#57s-VsUvJ-zCdfXB7RVv77BM9?-$SYaGZo935rw~|ki
zn^)zm=GuEB7&8OpyWs_NhbJe*^qi+pB~gpJjF!Q|5As5f0uuXo^i^v47r*D}@Z4_5
zj4Aw<9vqO&drmUAaZ&L&R!o*po-*6SJx3;n>>-h243}U%f(BX!IBlW~*AF7D%9Ob1
z)F;tXC}k#I_IKfkFakB7y88{S2l_k_;cS%rwDnUInT09mT%W^!&~wN`bPg>O>pxU5
zJiMs7{vVoXLOh!MF`>ivjbza6jVq2A0b)KSB|!QQ88Me&F5s!C9JE#w7h@5-OvADI
zmz6$QXhW7KE8*vYU@bA=-J_S7=U0c%7qpb+rQXZI&zaV&8X|L$_Afkd{tmT%xC_Jx
z3^!Ol1T{9$2#W~+EHjfSoIgM7;<#(IB9F7`e)i
z;ID+XTKE(e)!4RRVwwE`V|edtdP5Mi!6V&k^(Uc^L-TX4|GZ>e-g7IGy?SLU(ICDg
z{uDELXjsL`8(N|Gy+3u9v8vD1WJ;D!+0mT_Xig=baA{8?ctrRtxVp^yx%^A|ocGMrncgxCEjbgD+1M@
zVGF
zZWXmW$xV6F3}T?lvhFP~Hlq5Y@%Xkfl*@wegM2&K?TtHL+d{-c8jn#+ea4
z$xiQMxe&k8m+-Sk?&PJL2iJOldw-uis-gJt#PP9+a!>)&YiXM6!Y>nzzJ)Rz_6sW5
zcU9&k>F2FihieIx8E6VfxgE27KzEt89vJqe8hrLk*AGh2&0R^mWu-H~+OrWA(YSn$
z0Y13yWZ%I0Rhl@lP
zYK*N*BjF&RLjSWJvR#UadQD2Y4o3k|Lu6N(izm=)KA&-)D^5@@RLbZ{m2o;gKN(8N
zW~wiJ%iGK=dh??FaZYh3pIl35K4_ikW$Sli7gzY#gE+LO5PtTl;{{h1|8bmM5IbQ*
zBeJkol9ejooN?MUO#)z-qGeF`&^XOjFG|V6=i|$r%M?>boXG1%0^jkMpU6$M%S*LC
z&vYtMZnv;nTMJX0g-UaN=}|DZE^u4!BFux~q0j+e=2C?@#dFt}5ECB%SK@_;f)oQ}mN^%^bc_@Jr+
zzQ7+8K0AYqkRa20afx=G4A(>_iIR8a
z!p0QogWVV-CC2<5>F`5ELP{S)@wx`RkdVM#kD`^>1$?x1mybP$
zp%o74&xAM~#Z~w`2-JmaI;i%L1fb2BHNz_oyl)Co(PW
zeZhsg!>+Xb_Qp8<1ZAF7Kq2flm)L0gFTthjMnBLIqtAWv&hMWu`~3W-@JvkWI~LLg
zgLE!KD*7N!n7BzVI%*xr4En+3WX3o#H2+G)c8Yj6mzfTel(DUlP=m~wA>QpFYu>AX
zMQ5>-3&TFxCkbouG{`aQsxUm+SFtBVpKloH)xo>$L`ZITz}DB1!ukrzdSCXyEigzQ
z5i*qNIlKoMIE!Pihjb(8)_Wd|qUloqNfw
zmtX}|$VLL16_fFF8S>!>k_V)7p2_ZMfKcZ^rcjV(OhR_&V<}(AcxIu*zUzP3UF^DMWw~QM#f^-rgj)st@mc&5>q=y(kKrV1qiA-e+y|P6>
z&*>to@q^*qE)~-D7s2-03_Mj#lU7J=F^R&gVxp&>-&*vI{Ahzp=Lm0x7E;wW)r@vp
zh;w25yLzJYOhFzqvFi*xh|cbUL;6CVSQf`m-hFc52+?W`ZI7mNj`CC&zqd?cL@3ge
z&soP9S!!(aKUcdPU_E5xqv@=RE3M@x8Q~5U&dQ_7ofXh4c1RN(Qo9Upg+W@dkfA;B
z01?tlB>pgh3|yT-1cg+M2Oy#ikTy7^0|9Bvgye7MccSSW>l^6(=)!*z8HfREK
z*h{C(j@=CR##mbVql+2g_8{)RK1g$1VMCeI-Nb^NMvBxR3
zKeN6IU4OBaV%-St%Y?Kb{_$zpN`ZV6hqRtmLy94tWQY?or^_<6+cKxLSCKN0{l|Oy
zd?Dzh0^7_wQ#~bopMs(5E|Td0dIo2B=n?S4ndyTQXB3ci_G?iC3{r~*PtWByo`D&R
zA;r!uhcnq!_aN`YAkz|%I&ypK9=L&2)nW<8&$Tq}CHEmR4#gl{6cET9vCP?Z#9gxI
zs?w$s=rfVSqNs;-Jm;6RLdIufS%0R~t~$^a@+r8h2$X
zt#}skMxRJGCsu@XB`pNHHLlaf*io|5YUe>jC4S3$$gth%M?J}#Yk8g0@(%fAf4iPW
zAJU6}n1g%Ni@|Z*;JQq369QZTgSbi7`%6Mvmg|E2GlG)iSqtMfedRQSol_~Bbt<5r
zmwn3IBm@Klb^trZb;?aQm
z3Ao7;Tx!|TkO{7VfoqmWM7SX}upaCQxH+VO#lMvGC@$ZDPQ8X>$R>(k4w`Sodg>m(
z+QYnIi
z9ch7q>#^WG*guzzS0KQ(mSBj<7zLPafP6Qa-}D8m8b^+<_0_8B{<6eqEth2$pO72$
z%9;7;6lx&eCL$91{oA8?<~!s~)CEbV!hN*(SC3sPdXx<5B;`LCs`|m%(WyRNgQbmj
zrG0`J&m+xOpV5|_&A0AN^WSf_ZuGR>)ZWYMd`(o-aWnLChJq{W?DsV!8KLznOb>tz
z@><2|qRiS&=HDo6%r`6l7RR1sLTh7O2Sb`WLx`E+`dSj0cfMVC2P~xlCSqv^hvpSb
z!4+6qAN3CPIoglA)%}*9so&Y>$&t6uuQTuKNb1QNh%(E53ns5|w!|PO+Z_gqXC=AJ
zizAYz92ihJ(82@wOgMcaYe~LeoS7QrVz#A?4Bon$8~NY@t|!qJqG*drv{A0Kr7&>u
zGWZdAY;$|maRx1=h<-tZ6w!iao&O6Y@ds=?1@a7J?;;1vQG*qYhbG34>EI}B20`9C
zg7oDN2OTPK^b=@E`6bEhUVV9Aemfc5*$hVRj+7E |