Hi garry I hope you can help me. the forecast from yrno no longer works. 
attached the yrno.php Thanks. Kalli

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to weewx-user+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/803a6c26-ed59-476c-8d6d-6ffc13f4a3c9n%40googlegroups.com.
<?php

if (isset($argv[1]))  {
    $city = $argv[1];
$url = "https://www.yr.no/Germany/North Rhine-Westphalia/Düsseldorf 
District/Krefeld "/forecast.xml";
   
    $xml = simplexml_load_string(file_get_contents($url));
    $json = json_encode($xml, TRUE);

    echo $json;
}

if (isset($_GET['url'])) {
    $url = $_GET['url'];

    $xml = simplexml_load_string(file_get_contents($url));
    $json = json_encode($xml, TRUE);

    echo $json;
}
// This file is part of iWDL
//
// iWDL 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 3 of the License, or
// (at your option) any later version.
//
// iWDL 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 iWDL.  If not, see <http://www.gnu.org/licenses/>.

//
// Main javascript file
// By Sietse Visser (sie...@sietse.nl)
// Version 1.3
//

//
// The clientraw fieldlist and the unit type
//
var cr_fields = new Array;
cr_fields[  0] = new Array("Header"                     ,  "");
cr_fields[  1] = new Array("Avg Speed"                  ,  "kn");
cr_fields[  2] = new Array("Gusts"                      ,  "kn");
cr_fields[  3] = new Array("WindDir"                    ,  "deg");
cr_fields[  4] = new Array("Out Temp"                   ,  "c");
cr_fields[  5] = new Array("Out Hum"                    ,  "%");
cr_fields[  6] = new Array("Baro"                       ,  "hpa");
cr_fields[  7] = new Array("RainDay"                    ,  "mm");
cr_fields[  8] = new Array("RainMon"                    ,  "mm");
cr_fields[  9] = new Array("RainYear"                   ,  "mm");
cr_fields[ 10] = new Array("RainRate"                   ,  "mm");
cr_fields[ 11] = new Array("MaxRainRate"                ,  "mm");
cr_fields[ 12] = new Array("In Temp"                    ,  "c");
cr_fields[ 13] = new Array("In Hum"                     ,  "%");
cr_fields[ 14] = new Array("Soil Temp"                  ,  "c");
cr_fields[ 15] = new Array("Forecast Icon"              ,  "Icon 1");
cr_fields[ 16] = new Array("WMR968 Extra Temp"          ,  "c");
cr_fields[ 17] = new Array("WMR968 Extra Hum"           ,  "%");
cr_fields[ 18] = new Array("WMR968 Extra Sensor"        ,  "Number");
cr_fields[ 19] = new Array("Yesterday Rain"             ,  "mm");
cr_fields[ 20] = new Array("Extra Temp Sensor 1"        ,  "c");
cr_fields[ 21] = new Array("Extra Temp Sensor 2"        ,  "c");
cr_fields[ 22] = new Array("Extra Temp Sensor 3"        ,  "c");
cr_fields[ 23] = new Array("Extra Temp Sensor 4"        ,  "c");
cr_fields[ 24] = new Array("Extra Temp Sensor 5"        ,  "c");
cr_fields[ 25] = new Array("Extra Temp Sensor 6"        ,  "c");
cr_fields[ 26] = new Array("Extra Hum Sensor 1"         ,  "%");
cr_fields[ 27] = new Array("Extra Hum Sensor 2"         ,  "%");
cr_fields[ 28] = new Array("Extra Hum Sensor 3"         ,  "%");
cr_fields[ 29] = new Array("Hour"                       ,  "Time");
cr_fields[ 30] = new Array("Minute"                     ,  "Time");
cr_fields[ 31] = new Array("Seconds"                    ,  "Time");
cr_fields[ 32] = new Array("Station Name"               ,  "");
cr_fields[ 33] = new Array("Dallas Lightning Count"     ,  "Number");
cr_fields[ 34] = new Array("Solar Reading"              ,  "Number");
cr_fields[ 35] = new Array("Day"                        ,  "Time");
cr_fields[ 36] = new Array("Month"                      ,  "Time");
cr_fields[ 37] = new Array("WMR968 Battery 1"           ,  "%");
cr_fields[ 38] = new Array("WMR968 Battery 2"           ,  "%");
cr_fields[ 39] = new Array("WMR968 Battery 3"           ,  "%");
cr_fields[ 40] = new Array("WMR968 Battery 4"           ,  "%");
cr_fields[ 41] = new Array("WMR968 Battery 5"           ,  "%");
cr_fields[ 42] = new Array("WMR968 Battery 6"           ,  "%");
cr_fields[ 43] = new Array("WMR968 Battery 7"           ,  "%");
cr_fields[ 44] = new Array("WindChill"                  ,  "c");
cr_fields[ 45] = new Array("Humidex"                    ,  "c");
cr_fields[ 46] = new Array("Max Day Temp"               ,  "c");
cr_fields[ 47] = new Array("Min Day Temp"               ,  "c");
cr_fields[ 48] = new Array("Icon Type"                  ,  "Icon 2");
cr_fields[ 49] = new Array("Weather Desc"               ,  "");
cr_fields[ 50] = new Array("Baro Trend"                 ,  "hpa");
cr_fields[ 51] = new Array("Windspeed Hour  1"          ,  "kn");
cr_fields[ 52] = new Array("Windspeed Hour  2"          ,  "kn");
cr_fields[ 53] = new Array("Windspeed Hour  3"          ,  "kn");
cr_fields[ 54] = new Array("Windspeed Hour  4"          ,  "kn");
cr_fields[ 55] = new Array("Windspeed Hour  5"          ,  "kn");
cr_fields[ 56] = new Array("Windspeed Hour  6"          ,  "kn");
cr_fields[ 57] = new Array("Windspeed Hour  7"          ,  "kn");
cr_fields[ 58] = new Array("Windspeed Hour  8"          ,  "kn");
cr_fields[ 59] = new Array("Windspeed Hour  9"          ,  "kn");
cr_fields[ 60] = new Array("Windspeed Hour 10"          ,  "kn");
cr_fields[ 61] = new Array("Windspeed Hour 11"          ,  "kn");
cr_fields[ 62] = new Array("Windspeed Hour 12"          ,  "kn");
cr_fields[ 63] = new Array("Windspeed Hour 13"          ,  "kn");
cr_fields[ 64] = new Array("Windspeed Hour 14"          ,  "kn");
cr_fields[ 65] = new Array("Windspeed Hour 15"          ,  "kn");
cr_fields[ 66] = new Array("Windspeed Hour 16"          ,  "kn");
cr_fields[ 67] = new Array("Windspeed Hour 17"          ,  "kn");
cr_fields[ 68] = new Array("Windspeed Hour 18"          ,  "kn");
cr_fields[ 69] = new Array("Windspeed Hour 19"          ,  "kn");
cr_fields[ 70] = new Array("Windspeed Hour 20"          ,  "kn");
cr_fields[ 71] = new Array("Max Wind Gust"              ,  "kn");
cr_fields[ 72] = new Array("DewPoint Temp"              ,  "c");
cr_fields[ 73] = new Array("Cloud Height"               ,  "ft");
cr_fields[ 74] = new Array("Date"                       ,  "");
cr_fields[ 75] = new Array("Max Humidex"                ,  "c");
cr_fields[ 76] = new Array("Min Humidex"                ,  "c");
cr_fields[ 77] = new Array("Max Windchill"              ,  "c");
cr_fields[ 78] = new Array("Min Windchill"              ,  "c");
cr_fields[ 79] = new Array("UV"                         ,  " ");
cr_fields[ 80] = new Array("Hr Windspeed  1"            ,  "kn");
cr_fields[ 81] = new Array("Hr Windspeed  2"            ,  "kn");
cr_fields[ 82] = new Array("Hr Windspeed  3"            ,  "kn");
cr_fields[ 83] = new Array("Hr Windspeed  4"            ,  "kn");
cr_fields[ 84] = new Array("Hr Windspeed  5"            ,  "kn");
cr_fields[ 85] = new Array("Hr Windspeed  6"            ,  "kn");
cr_fields[ 86] = new Array("Hr Windspeed  7"            ,  "kn");
cr_fields[ 87] = new Array("Hr Windspeed  8"            ,  "kn");
cr_fields[ 88] = new Array("Hr Windspeed  9"            ,  "kn");
cr_fields[ 89] = new Array("Hr Windspeed 10"            ,  "kn");
cr_fields[ 90] = new Array("Hr Temp  1"                 ,  "c");
cr_fields[ 91] = new Array("Hr Temp  2"                 ,  "c");
cr_fields[ 92] = new Array("Hr Temp  3"                 ,  "c");
cr_fields[ 93] = new Array("Hr Temp  4"                 ,  "c");
cr_fields[ 94] = new Array("Hr Temp  5"                 ,  "c");
cr_fields[ 95] = new Array("Hr Temp  6"                 ,  "c");
cr_fields[ 96] = new Array("Hr Temp  7"                 ,  "c");
cr_fields[ 97] = new Array("Hr Temp  8"                 ,  "c");
cr_fields[ 98] = new Array("Hr Temp  9"                 ,  "c");
cr_fields[ 99] = new Array("Hr Temp 10"                 ,  "c");
cr_fields[100] = new Array("Hr Rain  1"                 ,  "mm");
cr_fields[101] = new Array("Hr Rain  2"                 ,  "mm");
cr_fields[102] = new Array("Hr Rain  3"                 ,  "mm");
cr_fields[103] = new Array("Hr Rain  4"                 ,  "mm");
cr_fields[104] = new Array("Hr Rain  5"                 ,  "mm");
cr_fields[105] = new Array("Hr Rain  6"                 ,  "mm");
cr_fields[106] = new Array("Hr Rain  7"                 ,  "mm");
cr_fields[107] = new Array("Hr Rain  8"                 ,  "mm");
cr_fields[108] = new Array("Hr Rain  9"                 ,  "mm");
cr_fields[109] = new Array("Hr Rain 10"                 ,  "mm");
cr_fields[110] = new Array("Max Heat Index"             ,  "c");
cr_fields[111] = new Array("Min Heat Index"             ,  "c");
cr_fields[112] = new Array("Heat Index"                 ,  "c");
cr_fields[113] = new Array("Max Avg Speed"              ,  "kn");
cr_fields[114] = new Array("Lightning Last Min"         ,  "Number");
cr_fields[115] = new Array("Lightning Last Time Hour"   ,  "Time");
cr_fields[116] = new Array("Lightning Last Time Min"    ,  "Time");
cr_fields[117] = new Array("Wind Avg Dir"               ,  "deg");
cr_fields[118] = new Array("Nexstorm Dist"              ,  "");
cr_fields[119] = new Array("NextStorm Bearing"          ,  "deg");
cr_fields[120] = new Array("Extra Temp Sensor 7"        ,  "c");
cr_fields[121] = new Array("Extra Temp Sensor 8"        ,  "c");
cr_fields[122] = new Array("Extra Hum Sensor 4"         ,  "%");
cr_fields[123] = new Array("Extra Hum Sensor 5"         ,  "%");
cr_fields[124] = new Array("Extra Hum Sensor 6"         ,  "%");
cr_fields[125] = new Array("Extra Hum Sensor 7"         ,  "%");
cr_fields[126] = new Array("Extra Hum Sensor 8"         ,  "%");
cr_fields[127] = new Array("SolarWM"                    ,  "W/m&sup2;");
cr_fields[128] = new Array("Max Indoor Temp"            ,  "c");
cr_fields[129] = new Array("Min Indoor Temp"            ,  "c");
cr_fields[130] = new Array("Apparent Temp"              ,  "c");
cr_fields[131] = new Array("Max Baro"                   ,  "hpa");
cr_fields[132] = new Array("Min Baro"                   ,  "hpa");
cr_fields[133] = new Array("Max Gust"                   ,  "kn");
cr_fields[134] = new Array("Max Gust Last Hour Time"    ,  "Time");
cr_fields[135] = new Array("Max Gust Today Time"        ,  "Time");
cr_fields[136] = new Array("Max Apparent Temp"          ,  "c");
cr_fields[137] = new Array("Min Apparent Temp"          ,  "c");
cr_fields[138] = new Array("Max Dewpt"                  ,  "c");
cr_fields[139] = new Array("Min Dewpt"                  ,  "c");
cr_fields[140] = new Array("Max Gust In Lst Min"        ,  "kn");
cr_fields[141] = new Array("Current Year"               ,  "Time");
cr_fields[142] = new Array("THSWS"                      ,  "");
cr_fields[143] = new Array("Temp Trend (Logic)"         ,  "bool");
cr_fields[144] = new Array("Humidity Trend (Logic)"     ,  "bool");
cr_fields[145] = new Array("Humidex Trend (Logic)"      ,  "bool");
cr_fields[146] = new Array("Hr Wind Dir  1"             ,  "deg");
cr_fields[147] = new Array("Hr Wind Dir  2"             ,  "deg");
cr_fields[148] = new Array("Hr Wind Dir  3"             ,  "deg");
cr_fields[149] = new Array("Hr Wind Dir  4"             ,  "deg");
cr_fields[150] = new Array("Hr Wind Dir  5"             ,  "deg");
cr_fields[151] = new Array("Hr Wind Dir  6"             ,  "deg");
cr_fields[152] = new Array("Hr Wind Dir  7"             ,  "deg");
cr_fields[153] = new Array("Hr Wind Dir  8"             ,  "deg");
cr_fields[154] = new Array("Hr Wind Dir  9"             ,  "deg");
cr_fields[155] = new Array("Hr Wind Dir 10"             ,  "deg");
cr_fields[156] = new Array("Leaf Wetness"               ,  "c");
cr_fields[157] = new Array("Soil moisture"              ,  "c");
cr_fields[158] = new Array("10 Min Avg Wind Speed"      ,  "kn");
cr_fields[159] = new Array("Wet bulb temperature"       ,  "c");
cr_fields[160] = new Array("Latitude (- = S Hemispher)" ,  "");
cr_fields[161] = new Array("Longitude (- EAST of GMT)"  ,  "");
cr_fields[162] = new Array("9am reset rain total"       ,  "mm");
cr_fields[163] = new Array("Daily Hi Humidity"          ,  "%");
cr_fields[164] = new Array("Daily Low Humidity"         ,  "%");
cr_fields[165] = new Array("Midnight reset rain total"  ,  "mm");
cr_fields[167] = new Array("Record End (WD Ver)"        ,  "");

// Weather icon numbers
var wth_icons = new Array;
wth_icons[ 0] = "Sunny";
wth_icons[ 1] = "Clear Night";
wth_icons[ 2] = "Cloudy";
wth_icons[ 3] = "Cloudy";
wth_icons[ 4] = "Cloudy Night";
wth_icons[ 5] = "Dry Clear";
wth_icons[ 6] = "Fog";
wth_icons[ 7] = "Hazy";
wth_icons[ 8] = "Heavy Rain";
wth_icons[ 9] = "Mainly Fine";
wth_icons[10] = "Misty";
wth_icons[11] = "Night Fog";
wth_icons[12] = "Night Heavy Rain";
wth_icons[13] = "Night Overcast";
wth_icons[14] = "Night Rain";
wth_icons[15] = "Night Showers";
wth_icons[16] = "Night Snow";
wth_icons[17] = "Night Thunder";
wth_icons[18] = "Overcast";
wth_icons[19] = "Partly Cloudy";
wth_icons[20] = "Rain";
wth_icons[21] = "Hard Rain";
wth_icons[22] = "Showers";
wth_icons[23] = "Sleet";
wth_icons[24] = "Sleet Showers";
wth_icons[25] = "Snowing";
wth_icons[26] = "Snow Melt";
wth_icons[27] = "Snow Showers";
wth_icons[28] = "Sunny";
wth_icons[29] = "Thunder Showers";
wth_icons[30] = "Thunder Showers";
wth_icons[31] = "Thunderstorms";
wth_icons[32] = "Tornado Warning";
wth_icons[33] = "Windy";
wth_icons[34] = "Stopped Raining";
wth_icons[35] = "Windy Rain";

// where does hourly graph data start, en how many are there
var ghsettings = new Array;
ghsettings["wind_speed"] = [[   1, 60 ]];
ghsettings["wind_gust"]  = [[  61, 60 ]];
ghsettings["wind_dir"]   = [[ 121, 60 ]];
ghsettings["temp_out"]   = [[ 181, 60 ]];
ghsettings["humid_out"]  = [[ 241, 60 ]];
ghsettings["baro"]       = [[ 301, 60 ]];
ghsettings["rain"]       = [[ 361, 60 ]];
ghsettings["solar_wm"]   = [[ 421, 60 ]];

// where does daily graph data start, en how many are there
var gdsettings = new Array;
gdsettings["wind_speed"] = [[   1, 20 ], [ 562, 4]];
gdsettings["temp_out"]   = [[  21, 20 ], [ 566, 4]];
gdsettings["rain"]       = [[  41, 20 ], [ 570, 4]];
gdsettings["baro"]       = [[ 439, 20 ], [ 574, 4]];
gdsettings["timestamps"] = [[ 459, 20 ], [ 578, 4]];
gdsettings["solar_wm"]   = [[ 491, 20 ], [ 582, 4]];
gdsettings["solar_uv"]   = [[ 511, 20 ], [ 586, 4]];
gdsettings["wind_dir"]   = [[ 536, 20 ], [ 590, 4]];
gdsettings["humid_out"]  = [[ 611, 20 ], [ 631, 4]];
gdsettings["temp_in"]    = [[ 636, 20 ], [ 656, 4]];

//where does weekly graph data start, en how many are there
var gwsettings = new Array;
gwsettings["temp_out"]   = [[ 233, 28 ]];
gwsettings["baro"]       = [[ 261, 28 ]];
gwsettings["humid_out"]  = [[ 289, 28 ]];
gwsettings["wind_dir"]   = [[ 317, 28 ]];
gwsettings["wind_speed"] = [[ 345, 28 ]];
gwsettings["solar_wm"]   = [[ 373, 28 ]];
gwsettings["solar_uv"]   = [[ 401, 28 ]];

//where does monthly graph data start, en how many are there
var gmsettings = new Array;
gmsettings["temp_high"]  = [[   1, 31 ]];
gmsettings["temp_low"]   = [[  32, 31 ]];
gmsettings["rain"]       = [[  63, 31 ]];
gmsettings["baro"]       = [[  94, 31 ]];
gmsettings["wind_speed"] = [[ 125, 31 ]];
gmsettings["wind_dir"]   = [[ 156, 31 ]];
gmsettings["humid_out"]  = [[ 199, 31 ]];
gmsettings["rain_year"]  = [[ 187, 12 ]];

// Graph names mapped to a clientraw field
var grtocr = new Array;
grtocr["wind_speed"] =   1;
grtocr["wind_gust"]  =   2;
grtocr["wind_dir"]   =   3;
grtocr["temp_out"]   =   4;
grtocr["humid_out"]  =   5;
grtocr["baro"]       =   6;
grtocr["rain"]       =   7;
grtocr["solar_wm"]   = 127;
grtocr["solar_uv"]   =  79;
grtocr["temp_in"]    =  12;
grtocr["temp_high"]  =  46;
grtocr["temp_low"]   =  47;
grtocr["rain_year"]  =   7;

// What are the unit names
var unitnames = new Array;
unitnames["c"]    = "&deg;C";
unitnames["f"]    = "&deg;F";
unitnames["kn"]   = "Kn";
unitnames["mph"]  = "mph";
unitnames["kmh"]  = "km/h";
unitnames["ms"]   = "m/s";
unitnames["deg"]  = "&deg;";
unitnames["abbr"] = " ";
unitnames["mm"]   = "mm";
unitnames["in"]   = "in";
unitnames["hpa"]  = "hPa";
unitnames["mb"]   = "mb";
unitnames["hg"]   = "Hg";
unitnames["ft"]   = "Ft";
unitnames["m"]    = "m";

// For which field in clientraw do we have which graphs?
var crtogr = new Array;
crtogr[  1] = [
                [ "wind_speed" ],
                [ "wind_speed" ],
                [ "wind_speed" ],
                [ "wind_speed" ]
              ];
crtogr[  2] = [
               [ "wind_gust" ],
               [  ],
               [  ],
               [  ]
             ];
crtogr[  3] = [
               [ "wind_dir" ],
               [ "wind_dir" ],
               [ "wind_dir" ],
               [ "wind_dir" ]
             ];
crtogr[  4] = [
               [ "temp_out" ],
               [ "temp_out" ],
               [ "temp_out" ],
               [ "temp_high", "temp_low" ]
             ];
crtogr[  5] = [
               [ "humid_out" ],
               [ "humid_out" ],
               [ "humid_out" ],
               [ "humid_out" ]
             ];
crtogr[  6] = [
               [ "baro" ],
               [ "baro" ],
               [ "baro" ],
               [ "baro" ]
             ];
crtogr[  7] = [
               [ "rain" ],
               [ "rain" ],
               [  ],
               [ "rain" ]
             ];
crtogr[ 12] = [
               [  ],
               [ "temp_in" ],
               [  ],
               [  ]
             ];
crtogr[ 79] = [
               [  ],
               [ "solar_uv" ],
               [ "solar_uv" ],
               [  ]
             ];
crtogr[127] = [
               [ "solar_wm" ],
               [ "solar_wm" ],
               [ "solar_wm" ],
               [  ]
             ];

var records = new Array;
// order is clientraw field, month, ytd, alltime
records["temp_high"]     = [   4,  61, 187, 313 ];
records["temp_low"]      = [   4,  67, 193, 319 ];
records["wind_avg"]      = [   1, 109, 235, 361 ];
records["wind_gust"]     = [   2,  73, 199, 325 ];
records["rain_rate"]     = [  10,  79, 205, 331 ];
records["daily_rain"]    = [   7,  97, 223, 349 ];
records["hour_rain"]     = [   7, 103, 229, 355 ];
records["baro_low"]      = [   6,  85, 211, 337 ];
records["baro_high"]     = [   6,  91, 217, 343 ];
records["soil_high"]     = [  14, 121, 247, 373 ];
records["soil_low"]      = [  14, 127, 253, 379 ];
records["grass_high"]    = [   4, 181, 307, 433 ];
records["windchill"]     = [  44, 133, 259, 385 ];
records["heatindex"]     = [ 112, 175, 301, 427 ];
records["warmest_day"]   = [   4, 151, 277, 403 ];
records["coldest_night"] = [   4, 157, 283, 409 ];
records["coldest_day"]   = [   4, 163, 289, 415 ];
records["warmest_night"] = [   4, 169, 295, 421 ];
records["solar"]         = [ 127, 660, 672, 684 ];
records["uv"]            = [  79, 666, 678, 690 ];

var record_disp = new Array;
record_disp["temp"]  = [ "temp_high", "temp_low", "warmest_day", "coldest_day", 
"warmest_night", "coldest_night" ];
record_disp["wind"]  = [ "wind_avg", "wind_gust" ];
record_disp["rain"]  = [ "rain_rate", "hour_rain", "daily_rain" ];
record_disp["baro"]  = [ "baro_high", "baro_low" ];
record_disp["soil"]  = [ "soil_high", "soil_low" ];
record_disp["grass"] = [ "grass_high" ];
record_disp["solar"] = [ "solar" ];
record_disp["uv"]    = [ "uv" ];

var config = 'iwdl_settings.js'
var settings = new Array;
var texts = new Array;
var cr_fieldnames = new Array();
var cr, crh, cre, crd;
var jQT;
var orientation = '0';
var station = 'Weather station';
var lang_loaded = '';

function sprintf () {
    // Return a formatted string  
    // 
    // version: 1008.1718
    // discuss at: http://phpjs.org/functions/sprintf
    // +   original by: Ash Searle (http://hexmen.com/blog/)
    // + namespaced by: Michael White (http://getsprink.com)
    // +    tweaked by: Jack
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Paulo Freitas
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: sprintf("%01.2f", 123.1);
    // *     returns 1: 123.10
    // *     example 2: sprintf("[%10s]", 'monkey');
    // *     returns 2: '[    monkey]'
    // *     example 3: sprintf("[%'#10s]", 'monkey');
    // *     returns 3: '[####monkey]'
    var regex = /%%|%(\d+\$)?([-+\'#0 
]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
    var a = arguments, i = 0, format = a[i++];
 
    // pad()
    var pad = function (str, len, chr, leftJustify) {
        if (!chr) {chr = ' ';}
        var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 
0).join(chr);
        return leftJustify ? str + padding : padding + str;
    };
 
    // justify()
    var justify = function (value, prefix, leftJustify, minWidth, zeroPad, 
customPadChar) {
        var diff = minWidth - value.length;
        if (diff > 0) {
            if (leftJustify || !zeroPad) {
                value = pad(value, minWidth, customPadChar, leftJustify);
            } else {
                value = value.slice(0, prefix.length) + pad('', diff, '0', 
true) + value.slice(prefix.length);
            }
        }
        return value;
    };
 
    // formatBaseX()
    var formatBaseX = function (value, base, prefix, leftJustify, minWidth, 
precision, zeroPad) {
        // Note: casts negative numbers to positive ones
        var number = value >>> 0;
        prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || 
'';
        value = prefix + pad(number.toString(base), precision || 0, '0', false);
        return justify(value, prefix, leftJustify, minWidth, zeroPad);
    };
 
    // formatString()
    var formatString = function (value, leftJustify, minWidth, precision, 
zeroPad, customPadChar) {
        if (precision != null) {
            value = value.slice(0, precision);
        }
        return justify(value, '', leftJustify, minWidth, zeroPad, 
customPadChar);
    };
 
    // doFormat()
    var doFormat = function (substring, valueIndex, flags, minWidth, _, 
precision, type) {
        var number;
        var prefix;
        var method;
        var textTransform;
        var value;
 
        if (substring == '%%') {return '%';}
 
        // parse flags
        var leftJustify = false, positivePrefix = '', zeroPad = false, 
prefixBaseX = false, customPadChar = ' ';
        var flagsl = flags.length;
        for (var j = 0; flags && j < flagsl; j++) {
            switch (flags.charAt(j)) {
                case ' ': positivePrefix = ' '; break;
                case '+': positivePrefix = '+'; break;
                case '-': leftJustify = true; break;
                case "'": customPadChar = flags.charAt(j+1); break;
                case '0': zeroPad = true; break;
                case '#': prefixBaseX = true; break;
            }
        }
 
        // parameters may be null, undefined, empty-string or real valued
        // we want to ignore null, undefined and empty-string values
        if (!minWidth) {
            minWidth = 0;
        } else if (minWidth == '*') {
            minWidth = +a[i++];
        } else if (minWidth.charAt(0) == '*') {
            minWidth = +a[minWidth.slice(1, -1)];
        } else {
            minWidth = +minWidth;
        }
 
        // Note: undocumented perl feature:
        if (minWidth < 0) {
            minWidth = -minWidth;
            leftJustify = true;
        }
 
        if (!isFinite(minWidth)) {
            throw new Error('sprintf: (minimum-)width must be finite');
        }
 
        if (!precision) {
            precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : 
undefined;
        } else if (precision == '*') {
            precision = +a[i++];
        } else if (precision.charAt(0) == '*') {
            precision = +a[precision.slice(1, -1)];
        } else {
            precision = +precision;
        }
 
        // grab value using valueIndex if required?
        value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
 
        switch (type) {
            case 's': return formatString(String(value), leftJustify, minWidth, 
precision, zeroPad, customPadChar);
            case 'c': return formatString(String.fromCharCode(+value), 
leftJustify, minWidth, precision, zeroPad);
            case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, 
minWidth, precision, zeroPad);
            case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, 
minWidth, precision, zeroPad);
            case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, 
minWidth, precision, zeroPad);
            case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, 
minWidth, precision, zeroPad).toUpperCase();
            case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, 
minWidth, precision, zeroPad);
            case 'i':
            case 'd':
                number = parseInt(+value, 10);
                prefix = number < 0 ? '-' : positivePrefix;
                value = prefix + pad(String(Math.abs(number)), precision, '0', 
false);
                return justify(value, prefix, leftJustify, minWidth, zeroPad);
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G':
                number = +value;
                prefix = number < 0 ? '-' : positivePrefix;
                method = ['toExponential', 'toFixed', 
'toPrecision']['efg'.indexOf(type.toLowerCase())];
                textTransform = ['toString', 
'toUpperCase']['eEfFgG'.indexOf(type) % 2];
                value = prefix + Math.abs(number)[method](precision);
                return justify(value, prefix, leftJustify, minWidth, 
zeroPad)[textTransform]();
            default: return substring;
        }
    };
 
    return format.replace(regex, doFormat);
}

function crAsyncDone(data, status) {
    var now = new Date();
    now = now.getTime();
    cr = data.split(" ");
    getClientRaw.crlast = now;
    updateiWdl();
}

function AsyncClientRaw() {
    var now = new Date();
    now = now.getTime();
    if (typeof getClientRaw.crlast == 'undefined') getClientRaw.crlast = 0;
    // Don't fetch it more often than once every 5 secs
    if (getClientRaw.crlast + 5000 < now) {
        $.ajax({
          url: settings["clientraw_dir"] + "clientraw.txt",
          async: true,
          success: crAsyncDone
         });
    }
}

function makeSyncRequest(url) {
    var data = $.ajax({
      url: url,
      async: false
     }).responseText;

    return data;
}

function getForecast() {
//    if ($("#fc").html() != "") return;
    var now = new Date();
    now = now.getTime();

    if (typeof getForecast.last_update == 'undefined') getForecast.last_update 
= 0;
    if (getForecast.last_update + 3600000 > now) return;
    getForecast.last_update = now;

    if (settings["forecast"] == "yr.no") {
        // url='https://www.yr.no/sted/' + encodeURI(settings["yr.no"]) + 
'/forecast.xml';
        // url += "?callback=?&t=" + now;

        // $.getJSON(url, function(fc) {
            var fc = JSON.parse(makeSyncRequest("yrno.php?url=" + 
'https://www.yr.no/sted/' + encodeURI(settings["yr.no"]) + '/forecast.xml'));
            var i = 0;
            var date = '';
            var str;
            while (i < 30 && fc.forecast.tabular.time[i]) {
                var t = fc.forecast.tabular.time[i];
                var dt = t['@attributes'].from.replace(/T.*/, "");
                var stime = t['@attributes'].from.replace(/.*T/, "");
                var etime = t['@attributes'].to.replace(/.*T/, "");
                var p = t['@attributes'].period;
                var sym = t.symbol['@attributes'].number;
                if (sym.length == 1) sym = '0' + sym;
                var c_temp = check_convert(t.temperature['@attributes'].value, 
'c');
                var c_wind = 
check_convert(roundNumber(t.windSpeed['@attributes'].mps / 0.514444, 1), 'kn');
                var c_wdir = check_convert(t.windDirection['@attributes'].deg, 
'deg');
                var c_baro = check_convert(t.pressure['@attributes'].value, 
'hpa');

                if (i == 0)
                    str = "<table class='w100'><tr><td></td><td></td><td 
class='iwdl center bold'>" + c_temp.units + "</td><td class='iwdl center 
bold'>" + 
                      c_wdir.units + "</td><td class='iwdl center bopld'>" + 
c_wind.units + "</td><td class='iwdl center bold'>" + c_baro.units + 
"</td><td>";

                stime = stime.replace(/:.*$/, "");
                etime = etime.replace(/:.*$/, "");
                // Use am/pm if requested
                if (settings["time"] == "12") {
                    hour = stime.replace(/^0/, '');
                    if (hour > 12) {
                        hour -= 12;
                        stime = sprintf("%02dp", hour);
                    } else {
                        if (hour == 12)
                            stime += "p";
                        else
                            stime += "a";
                    }
                    hour = etime.replace(/^0/, '');
                    if (hour > 12) {
                        hour -= 12;
                        etime = sprintf("%02dp", hour);
                    } else {
                        if (hour == 12)
                            etime += "p";
                        else
                            etime += "a";
                    }
                }

                if (date != dt) {
                        var ndate = dt.replace(/-0/, "-");
                        var sp_date = ndate.split(/-/);
                    var elms = ndate.split(/[- :]/);
                    var jsdt = new Date();
                    jsdt.setFullYear(parseInt(elms[0]));
                    jsdt.setMonth(parseInt(elms[1].replace(/^0/, "")-1));
                    jsdt.setDate(parseInt(elms[2].replace(/^0/, "")));
                    var day = '?';
                    switch (jsdt.getDay()) {
                    case 0: day = texts['Sunday']; break;
                    case 1: day = texts['Monday']; break;
                    case 2: day = texts['Tuesday']; break;
                    case 3: day = texts['Wednesday']; break;
                    case 4: day = texts['Thursday']; break;
                    case 5: day = texts['Friday']; break;
                    case 6: day = texts['Saturday']; break;
                    }

                    // Other date format requested?
                    var disp_date = '';
                    var date_elms = dt.split("-");
                    switch (settings["date"]) {
                    case "y/m/d":
                        disp_date = date_elms[0] + "/" + date_elms[1] + "/" + 
date_elms[2];
                        break;
                    case "d-m-y":
                        disp_date = date_elms[2] + "-" + date_elms[1] + "-" + 
date_elms[0];
                        break;
                    case "d/m/y":
                        disp_date = date_elms[2] + "/" + date_elms[1] + "/" + 
date_elms[0];
                        break;
                    case "m-d-y":
                        disp_date = date_elms[1] + "-" + date_elms[2] + "-" + 
date_elms[0];
                        break;
                    case "m/d/y":
                        disp_date = date_elms[1] + "/" + date_elms[2] + "/" + 
date_elms[0];
                        break;
                    default:
                        disp_date = dt;
                        break;
                    }

                    var daydate = disp_date + ' ' + day;
                    switch (settings["date_day"]) {
                    case "day":
                        daydate = day;
                        break;
                    case "date":
                        daydate = disp_date;
                        break;
                    case "day-date":
                        daydate = day + ' ' + disp_date;
                        break;
                    case "date-day":
                        daydate = disp_date + ' ' + day;
                        break;
                    }

                    str += "<tr><td colspan='6' class='iwdl_bg left bold'>" + 
daydate + "</tr>";
                    date = dt;
                }
                str += "<tr><td class='iwdl'>" + stime + "-" + etime;
                if (p == "0") { if (sym == "01" || sym == "02" || sym == "03" 
|| sym == "05" || sym == "06" || sym == "07" || sym == "08") sym += "n"; }
                if (p == "1") { if (sym == "01" || sym == "02" || sym == "03" 
|| sym == "05" || sym == "06" || sym == "07" || sym == "08") sym += "d"; }
                if (p == "2") { if (sym == "01" || sym == "02" || sym == "03" 
|| sym == "05" || sym == "06" || sym == "07" || sym == "08") sym += "d"; }
                if (p == "3") { if (sym == "01" || sym == "02" || sym == "03" 
|| sym == "05" || sym == "06" || sym == "07" || sym == "08") sym += "n"; }
                str += "</td>";
                str += "<td><img src='https://fil.nrk.no/yr/grafikk/sym/b38/"; + 
sym + ".png' width='28'></td>";
                str += "<td align='center' class='iwdl black bold'>" + 
c_temp.val + "</td>";
                str += "<td align='center' class='iwdl black bold'>" + 
c_wdir.val + "</td>";
                str += "<td align='center' class='iwdl black bold'>" + 
c_wind.val + "</td>";
                str += "<td align='center' class='iwdl black bold'>" + 
c_baro.val + "</td>";
                str += "</tr>";
                i++;
            }
            str += "</table>";
            $("#fc").html(str);
            var link = "<center><a target='_blank' href='" + fc.credit.link.url 
+ "'>Forecast by yr.no</a>";
            link += " <span class='iwdl'>" + settings["yr.no"] + "</span><br>";
            link += " <span class='iwdl'>" + fc.meta.lastupdate.replace(/T/, " 
") + "</span>";
            link += "</center>";
            $("#fcref").html(link);

            // set background color
            $(".iwdl_bg").css("background", settings["bgcolor"]); 
            if (theme == 'jqt') {
                $(".iwdl").css('color',  '#c0c0c0');
                $(".black").css('color', 'white');
                $(".iwdl_bg .black").css("color", "black");
            }
        // });
    } else {
        $("#fc").html("<iframe frameborder='no' scrolling='auto' width='275px' 
height='200px' src='" + settings["forecast_url"] + "'></iframe>");
        $("#fcref").html("<center>" + settings["forecast_from"] + "</center>");
    }

};

function loadjsfile(filename){
    var code = makeSyncRequest(filename);
    eval(code);
}

function getfile(filename){
    var code = makeSyncRequest(filename);
    return code;
}

function getClientRaw(files) {
    var now = new Date();
    now = now.getTime();
    for (var i = 0; i < files.length; i++) {
        switch (files[i]) {
        case "cr":
            if (typeof getClientRaw.crlast == 'undefined') getClientRaw.crlast 
= 0;
            // Don't fetch it more often than once every 5 secs
            if (getClientRaw.crlast + 5000 < now) {
                cr = makeSyncRequest(settings["clientraw_dir"] + 
"clientraw.txt").split(" ");
                if (cr[0] != '12345') alert("Cannot read clientraw.txt; make 
sure the path in iwdl_settings.js is correct");
                getClientRaw.crlast = now;
            }
            break;
        case "ecr":
            if (typeof getClientRaw.ecrlast == 'undefined') 
getClientRaw.ecrlast = 0;
            // Don't fetch it more often than once every minute
            if (getClientRaw.ecrlast + 60000 < now) {
                cre = makeSyncRequest(settings["clientraw_dir"] + 
"clientrawextra.txt").split(" ");
                getClientRaw.ecrlast = now;
            }
            break;
        case "hcr":
            if (typeof getClientRaw.hcrlast == 'undefined') 
getClientRaw.hcrlast = 0;
            // Don't fetch it more often than once every minute
            if (getClientRaw.hcrlast + 60000 < now) {
                crh = makeSyncRequest(settings["clientraw_dir"] + 
"clientrawhour.txt").split(" ");
                getClientRaw.hcrlast = now;
            }
            break;
        case "dcr":
            if (typeof getClientRaw.dcrlast == 'undefined') 
getClientRaw.dcrlast = 0;
            // Don't fetch it more often than once every 5 minutes
            if (getClientRaw.dcrlast + 300000 < now) {
                crd = makeSyncRequest(settings["clientraw_dir"] + 
"clientrawdaily.txt").split(" ");
                getClientRaw.dcrlast = now;
            }
            break;
        }
    }
}

function roundNumber(num, dec) {
    var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
    return result;
}

function check_convert(val, units) {
    var ret = new Array();
    ret["val"] = val + '';
    ret["units"] = units;
    if (unitnames[units]) ret["units"] = unitnames[units];

    switch (units) {
    case "c":
        if (settings["temp"] == "f") {
            ret["val"] = roundNumber((1.8 * val) + 32.0, 1);
            if (unitnames["f"]) ret["units"] = unitnames["f"];
        }
        break;
    case "kn":
        if (settings["wind"] == "mph") {
            ret["val"] = roundNumber(1.1507794 * val, 1) + '';
            if (unitnames["mph"]) ret["units"] = unitnames["mph"];
        }
        if (settings["wind"] == "kmh") {
            ret["val"] = roundNumber(1.852 * val, 1) + '';
            if (unitnames["kmh"]) ret["units"] = unitnames["kmh"];
        }
        if (settings["wind"] == "ms") {
            ret["val"] = roundNumber(0.514444 * val, 1) + '';
            if (unitnames["ms"]) ret["units"] = unitnames["ms"];
        }
        break;
    case 'deg':
        if (settings["wdir"] == "abbr") {
            var windlabel = new Array("N", "NNE", "NE", "ENE", "E", "ESE", 
"SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW");
            ret["val"] = windlabel[Math.floor(((parseInt(val) + 11) / 22.5) % 
16 )];
            if (texts["wdir_" + ret["val"]]) ret["val"] = texts["wdir_" + 
ret["val"]];
            if (unitnames["abbr"]) ret["units"] = unitnames["abbr"];
        }
        break;
    case "mm":
        if (settings["rain"] == "in") {
            ret["val"] = roundNumber(0.0393700787 * val, 3) + '';
            if (unitnames["in"]) ret["units"] = unitnames["in"];
        }
        break;
    case "hpa":
        if (settings["baro"] == "hg") {
            ret["val"] = roundNumber(val / 33.86388158, 2) + '';
            if (unitnames["hg"]) ret["units"] = unitnames["hg"];
        }
        if (settings["baro"] == "mb") {
            ret["val"] = val + '';
            if (unitnames["mb"]) ret["units"] = unitnames["mb"];
        }
        break;
    case "ft":
        ret["val"] = (Math.round(val * 1.0).toFixed(0)) + '';
        if (settings["height"] == "m") {
            ret["val"] = (Math.round(val / 3.2808399).toFixed(0)) + '';
            if (unitnames["m"]) ret["units"] = unitnames["m"];
        }
        break;
    }
    return ret;
}

function updateiWdl() {
    getClientRaw(["cr"]);

    var mystation, time;

    if (settings["station_type"] && settings["station_type"] == 'meteohub') {
        // station - time is spit by _, not -
        var station_time = cr[32].replace(/_/g, " ").split(" ");
        delete station_time[station_time.length - 1];
        mystation = station_time.join("-").replace(/-$/, "");
    } else {
        var station_time = cr[32].replace(/_/g, " ").split("-");
        if (station_time.length > 2) {
            delete station_time[station_time.length - 1];
            mystation = station_time.join("-").replace(/-$/, "");
        } else {
            mystation = station_time[0];
        }
    }

    time = cr[29] + ":" + cr[30] + ":" + cr[31];
    // If requested, translate to am/pm
    if (settings["time"] == "12") {
        var tm = time.split(":");
        tm[0] = tm[0].replace(/^0/, '');
        if (tm[0] > 12) {
            tm[0] -= 12;
            time = tm.join(":");
            time += " pm";
        } else {
            time = tm.join(":");
            if (tm[0] == 12)
                time += " pm";
            else
                time += " am";
        }
    }

    var disp_date = '';
    switch (settings["date"]) {
    case "y/m/d":
        disp_date = cr[36] + "/" + cr[35];
        break;
    case "d-m-y":
        disp_date = cr[35] + "-" + cr[36];
        break;
    case "d/m/y":
        disp_date = cr[35] + "/" + cr[36];
        break;
    case "m-d-y":
        disp_date = cr[36] + "-" + cr[35];
        break;
    case "m/d/y":
        disp_date = cr[36] + "/" + cr[35];
        break;
    default:
        disp_date = cr[36] + "-" + cr[35];
        break;
    }
    time = disp_date + ' ' + time;

    if (settings["station_name"])
        station = settings["station_name"];
    else
        if (mystation)
            station = mystation;

    if ($("#hm_station").html() != station) 
$("[iwdltxt=hm_station]").html(station);

    var icon = cr[48];
    var descr = '';
    if (0 && wth_icons[icon] && texts[wth_icons[icon]]) {
        descr = texts[wth_icons[icon]];
    } else {
        descr = cr[49].replace(/_/g, " ");
        // Extra Tag Cleanup
        descr = descr.replace(/ø/g,'ø');
        descr = descr.replace(/Ã¥/g,'å');
        descr = descr.replace(/æ/g,'æ');
    
        // Translate
        var descrs = descr.split("/");
        if (descrs[0]) {
            if (texts[descrs[0]])
                descr = texts[descrs[0]];
            else
                descr = descrs[0];
        }
        if (descrs[1]) {
            if (texts[descrs[1]])
                time += " / " + texts[descrs[1]];
            else
                time += " / " + descrs[1];
        }
    }
    
    if ($("#il_time").html() != time) $("#il_time").html(time);
    if ($("#il_descr").html() != descr) $("#il_descr").html(descr);

    if ($("#hm_time").html() != time) $("#hm_time").html(time);
    if ($("#hm_descr").html() != descr) $("#hm_descr").html(descr);

    var fields = settings["live_screen"];
    for ( var i=0, len=fields.length; i<len; ++i ){

        if ((fields[i] == 44 || fields[i] == 45) && settings["humchill"] == 
'toggle') {
                        var t = parseInt(cr[4]);
                if (fields[i] == 44 && t >= 17) {
                        // toggle to humidex
                        settings["live_screen"][i] = 45;
                        $("[crtxt=44]").attr("crtxt", "45");
                        $("#cr_44").attr("id", "cr_45");
                        $("[crtxt=45]").html(cr_fieldnames[45]);
                }
                if (fields[i] == 45 && t < 17) {
                        // toggle to windchill
                        settings["live_screen"][i] = 44;
                        $("[crtxt=45]").attr("crtxt", "44");
                        $("#cr_45").attr("id", "cr_44");
                        $("[crtxt=44]").html(cr_fieldnames[44]);
                }
        }

        if ((fields[i] == 44 || fields[i] == 112) && settings["heatchill"] == 
'toggle') {
                        var t = parseInt(cr[4]);
                if (fields[i] == 44 && t >= 17) {
                        // toggle to heatindex
                        settings["live_screen"][i] = 112;
                        $("[crtxt=44]").attr("crtxt", "112");
                        $("#cr_44").attr("id", "cr_112");
                        $("[crtxt=112]").html(cr_fieldnames[112]);
                }
                if (fields[i] == 112 && t < 17) {
                        // toggle to windchill
                        settings["live_screen"][i] = 44;
                        $("[crtxt=112]").attr("crtxt", "44");
                        $("#cr_112").attr("id", "cr_44");
                        $("[crtxt=44]").html(cr_fieldnames[44]);
                }
        }

        var conv = check_convert(cr[fields[i]], cr_fields[fields[i]][1]);
        var newval = conv["val"];
        var val = $("#cr_" + fields[i]).html();
        if (newval != val) {
            $("#cr_" + fields[i]).html(newval);
        }
    }

    var fields = settings["min_max"];
    for ( var i=0, len=fields.length; i<len; ++i ){
        var conv = check_convert(cr[fields[i]], cr_fields[fields[i]][1]);
        var newval = conv["val"];
        var val = $("#mmcr_" + fields[i]).html();
        if (newval != val) {
            $("#mmcr_" + fields[i]).html(newval);
        }
    }

    var fields = settings["home"];
    for ( var i=0, len=fields.length; i<len; ++i ){
        var conv = check_convert(cr[fields[i]], cr_fields[fields[i]][1]);
        var newval = conv["val"];
        var val = $("#hmcr_" + fields[i]).html();
        if (newval != val) {
            $("#hmcr_" + fields[i]).html(newval);
        }
    }
}

function dispHome() {
        // The live field
    var str = '';
    str += "<table width='100%'>";
    str += "<tr>";
    str += "<td align='center' width='100%' class='head black'>";
    str += "<span class='iwdl black' id='hm_time'></span>";
    str += "</td></tr>";
    str += "<tr>";
    str += "<td align='center' width='100%' id='hm_descr' class='head 
black'></td>"; 
    str += "</tr>";
    str += "</table>";

    str += "<br><table width='100%'><tr><td align='center' width='100%' 
class='head'>";

    var str2 = "";
    var fields = settings["home"];
    for ( var i=0, len=fields.length; i<len; ++i ){
        var conv = check_convert(0, cr_fields[fields[i]][1]);
        var units = conv["units"];
        if (str2) {
            if (i % 3 == 0)
                str2 += "<br>";
            else
                str2 += "<span class='iwdl black'> / </span>";
        }
        str2 += "<span class='iwdl black' id='hmcr_" + fields[i] + 
"'></span><span txtunits='" + cr_fields[fields[i]][1] + "' class='iwdl black'>" 
+ units + "</span>";
    }
    str2 += "</td></tr></table>";
    str += str2;
    $("#home_display").html(str);

    // Now the toolbar
    var w = 'w33';
    if (settings["radar"]) {
        addDiv("radar", "<iframe id='radarframe' frameborder='no' 
scrolling='auto' width='275px' height='200px' src=''></iframe>");
        w = 'w25';
    }
    if (settings["webcam"]) {
        addDiv("webcam", "<iframe id='webcamframe' frameborder='no' 
scrolling='auto' width='275px' height='200px' src=''></iframe>");
        $('#webcam').css("overflow-x", "visible");
        w = 'w25';
    }
    if (settings["radar"] && settings["webcam"]) w = 'w20';

    str = "<table class='w100'>";
    str += "<tr>";
    str += "<td class='center " + w + "' id='tap_mapbutton'>";
        str += "<img border='0' 
src='data:image/png;base64,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%3D'>";
        str += "</td>";
        if (settings["radar"]) {
            str += "<td class='center " + w + "' id='tap_radarbutton'>";
                str += "<img border='0' 
src='data:image/png;base64,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%3D%3D'>";
                str += "</td>";
        }
        if (settings["webcam"]) {
            str += "<td class='center " + w + "' id='tap_webcambutton'>";
                str += "<img border='0' 
src='data:image/png;base64,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%3D%3D'>";
                str += "</td>";
        }
        str += "<td class='center " + w + "' id='tap_settings'>";
        str += "<img 
src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oBGBQ3MHpNWB0AAAiISURBVEjHZZdNbxvV98c/dx48Y8eJ7TgOIQlJIIlDkmJIoEJqFwUJ8SQWLACJDRIbeBt9H7wBVl0hUCtFQUCooEW0jUEoxaVpEtM0jhKPn+b5/hbhXqX/v1cjz8y9c875fj/nXFGr1aQQgjRNEUJgGAZCCKIowjAMLMvS13Eck8lkEEIQxzFpmmIYBlJKTNMkiiJs28YwDKIoAsAwDNI0xbIsANI0BcCybZvBYIBhGPplAMuySJKEKIpI01Rv1Gq1AJBSMjY2RiaTIQxDkiQhTVP9rHrGtm3SNCUIAgCSJMG2bawgCJBS6i9TX5UkCUII/SDA888/T7VapVQqUSwW+eqrrzg5OUFKSTabJZPJcHh4yNDQEJlMRq8lpQTAcRy9rlkul6+qNIRhiGEY+iuTJCGbzdJut/n000+5cuUKlUqFsbExhoaG9IZDQ0Ocnp7S7Xb58ssvMU2Thw8fYpomSZLooJIkIY5jhBCIlZUVCSCE4HzaAaIowvd9xsfH+eyzzxgbG8M0TaSUxHGMaZqkaYppmgRBwNHREZVKRUd+7do1Hj9+jOu6CCGQUpIkCaZpImq1mozjWKe70+lQLBY5Pj6mUCjw8ccfU61WCYIA27Z1LR3H0WJS95QoHcchjmMMw+Drr7+m2WwyGAwAzjYVAkspNkkSwjDkpZde4sMPP+S3335jbW0NwzAIwxDbttnb22N3d5f9/X2ePHkCQC6XY3Z2lhdeeIGpqSktNiEEQRBweHhIt9vVqk6SBADx4osvSiWi8fFxPv/8c6SU2ioAzWaTjY0N/vrrL0zTZHp6mlKphGVZeJ7H7u4uQRDwzDPP8Oabb1Kr1ZBSIqXk3r17fPvtt5imqaP1fR9RrVallBLHcfjiiy+wLEvXO45jfvnlF65fv06pVOKDDz5gdnb2zA6Whe/7uK5LHMc8evSIH3/8kXq9zsWLF3n77bfJ5/NIKdnc3OTnn38ml8sxGAxwXRezWCxedRyH9fV1JicndapM0+TGjRtsbm7y1ltv8dFHH5HL5XAcB9/3tTrDMCSOY8bHx1laWmJhYYHr16/TbDaZn5/HNE0WFhY4ODjg+PgYx3HO7FQoFK4KIXj48CEzMzMMDw9jmibff/89W1tbvPfee6yvr2tPnrfI+WtVR9d1WV1d5YcffqDVarG8vEwYhlSrVS5evEgQBOzt7WG4rksYhpTLZSYnJ4njmH/++Ydbt25x6dIlXn31VeI4Jo5jbNvG8zxti36/TxAExHGM67r4vo9pmoyNjfHJJ5+ws7PDrVu3NJhM0+TChQuYpokRRRFCCJaWlvB9n8FgQL1eJ5fL8frrr9Pr9TSbe70elmXp9KZpqrXQ6/U0Jn3fZ2pqitXVVW7fvo2iYxiGjIyMUKlUMHzfJwxDnnvuOe3Ter1OrVbTkD9vfAUbxWdlDymlVqzi+2uvvUav16PRaGiLWZbFzMwM1tTUFBMTExQKBQaDATs7O1iWxdzcnI5KbaaI5Xked+/eJYoi5ubmWFxc1DxWbFfR5fN5Go0Gi4uLRFHE3t4erVYLq1qtsry8rCN68uQJtm0zPDyssamolCQJnudx7do1HdWDBw9I05T5+Xktvn6/j+u6mg2tVgtV0r29Pf78808MxdsgCAiCQL8UhiH9fl+3yna7jZSSnZ0doijSaU7TlO3tbZ0ZpYler0cQBJTLZTzPI45jut0uruuSyWSwzjdr1cBd19XNXy04MjKiVaz6rrJTkiQEQaAHh/OlOb9uJpMhTVN838cYDAZakWqxbrdLGIakaUq/3yeKIjzPIwxDFhcXCYKAMAwJwxDP85ieniaTyRBFEUEQ4Ps+QRCQJAnHx8d6ilEZATBzudzVTqfD6OgoUkoGgwH3799nZWVFjzRKMEIIzWrVfd544w1WV1fPovgvQ1JKPcHcu3cP13VZWFhgMBjovmymaXr16OhIM9i2bf744w8KhQKFQgEhBMAZ2P9LXy6XY3p6muXlZbLZ7FP3VGnCMKTb7XLz5k3W1tYYHR0lTVNKpRInJycYikAHBwekaYrrujz77LPcuXNHK3kwGGBZlk7f+bFIQUR5WzkBoF6vY1kWk5OT+uOiKOLx48cYALZt8+DBA22pWq3G6ekp29vbhGGI67qaPopiqn8r4fi+/9QUeXh4SL1e5+WXXz5D5H99vdVqcXR0hHV0dIQQgsPDQ1ZXV6lUKpRKJebn57lx4wZSSpaWljSd1MJRFOlahmGor4UQNJtNvvnmG4rFIhcuXKDf72MYBoZhUK/X+ffff8/sZJomKysrT9X00qVL9Pt9Njc38TyPV155RQ8G6h0Az/PIZrOaWo1Gg59++gnbtnnnnXfo9XpkMhk2NjbY39/XAZjAVYA4jqlWq8RxTBiGRFHE1NQUUkpu375Ns9nEdV0Mw2B4eJh2u62H/yRJaDabbG1tsb29zejoKO+//z6O4wDw+++/c/fuXW1Dy7IQgFRRzMzM8O677+qxRdWv1Wpx8+ZNTk5OsCyLkZERJiYmdJc6ODggCAKy2SwrKyusr6+jBshHjx6xsbGBZVnEcYzjOARBgBBCSAV4IQSzs7NcuXKF+/fvMzc3p5mbpindbpe///6bk5MTOp0OQggcx6FcLjM7O8vExIQ+CqmO9t1333F8fKxPJ+qUoSNWoAAoFoucnp6Sz+e5fPkylUrlqanj/HlKASOKIi0uNRjEccyvv/5Ko9HQa6ufME1Tqj8Vbc4faUzTZGJigrW1NUZGRlB6UN493w47nQ7lcpkwDOl0Oty5c4eDg4OnNsxkMsRxjKVeVAsKIVCnR7Vgs9lkbm6ObDarm0AURTQaDTzPo9vt0m63iaKIy5cvs7+/z+7u7v9rNOchI4QQUkn8//5UREII8vk84+Pj5PN5fUzZ2tqi3W4/Fbm6Pr/heQsqFvwPAm+cLMQA5iIAAAAASUVORK5CYII%3D'>";
        str += "</td>";
        str += "<td class='center " + w + "' id='tap_about'>";
        str += "<img 
src='data:image/png;base64,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%3D%3D'>";
        str += "</td>";
        str += "</tr>";
        str += "</table>";
        $("#toolbar").append(str);
}

function dispIwdl() {
    var str = '';

    str += "<ul class='rounded'>";

    str += "<li class='iwdl iwdl_bg'>";
    str += "<table width='100%'>";
    str += "<tr>";
    str += "<td align='center' width='100%' class='head black'>";
    str += "<span class='iwdl black' id='il_time'></span>";
    str += "</tr>";
    str += "<tr>";
    str += "<td align='center' width='100%' id='il_descr' class='head 
black'></td>"; 
    str += "</tr>";
    str += "</table>";
    str += "</li>";

    var fields = settings["live_screen"];
    for ( var i=0, len=fields.length; i<len; ++i ){
        var conv = check_convert(0, cr_fields[fields[i]][1]);
        var units = conv["units"];

        if (crtogr[fields[i]]) {
            str += "<li class='arrow iwdl'>";
            str += "<a href='#graphs_" + fields[i] + "'>";
        } else {
            str += "<li class='iwdl'>";
        }
        str += "<table width='100%'><tr>" + 
                       "<td class='iwdl bold left  w50'><span crtxt='" + 
fields[i] + "'>" + cr_fieldnames[fields[i]] + "</span></td>" +
                       "<td class='iwdl bold right w25 black'><span id='cr_" + 
fields[i] + "'></span></td>" +
                       "<td class='iwdl bold left  w25' txtunits='" + 
cr_fields[fields[i]][1] + "'>" + units + "</td>" +
                    "</tr></table>";
        if (crtogr[fields[i]]) str += "</a>";
        str += "</li>";
    }
    str += "</ul>";

    return str;
}

function dispToday() {
    var str;
    str = "<ul class='rounded'>";

    var station_time = cr[32].split("-");

    str += "<li class='iwdl iwdl_bg'>";
    str += "<table width='100%'>";
    str += "  <tr>";
    str += "    <td class='iwdl center head w100 black' iwdltxt='rec_today'>" + 
texts['rec_today'] + "</td>"; 
    str += "  </tr>";
    str += "</table>";
    str += "</li>";

    var fields = settings["min_max"];
    for ( var i=0, len=fields.length; i<len; ++i ){
        if (cr[fields[i]] != "-") {
            var conv = check_convert(cr[fields[i]], cr_fields[fields[i]][1]);
            var units = conv["units"];
            var val = conv["val"];
            str += "<li class='iwdl'>";
            str += "<table width='100%'>";
            str += "  <tr>";
            str += "    <td align='left'  class='iwdl bold left  w50'><span 
crtxt='" + fields[i] + "'>" + cr_fieldnames[fields[i]] + "</span></td>"; 
            str += "    <td align='right' class='iwdl bold right w25 
black'><span id='mmcr_" + fields[i] + "'>" + val + "</span>";
            str += "    <td align='left'  class='iwdl bold left  w25' 
txtunits='" + cr_fields[fields[i]][1] + "'> " + units + "</td>";
            str += "  </tr>";
            str += "</table>";
            str += "</li>";
        }
    }
    str += "</ul>";
    return str;
}

function dispRec(which) {
    var str;
    str = "<ul class='rounded'>";
    str += "<li class='iwdl iwdl_bg'>";
    str += "<table width='100%'>";
    str += "  <tr>";
    str += "    <td class='iwdl center head w100 black' iwdltxt='rec_" + which 
+ "'>" + texts["rec_" + which] + "</td>"; 
    str += "  </tr>";
    str += "</table>";
    str += "</li>";
    str += "</ul>";

    var items = settings["records"];
    for ( var i=0, len=items.length; i<len; ++i ) {
        var fields = record_disp[items[i]];
        var str2 = '';
        str2 += "<ul class='rounded'>";
        str2 += "<li class='iwdl'>";
        str2 += "<table width='100%'><tr><td class='iwdl iwdl_bg black center' 
colspan='3'><b>" + texts[items[i]] + "</b></td></tr></table>";
        str2 += "</li>";
        
        var found_field = 0;
        for ( var j=0, len2=fields.length; j<len2; ++j ) {
            var str3 = '';
            str3 += "<li class='iwdl'><table width='100%'>";
                if (fields[j] == '') {
                        str3 += "<tr><td class='iwdl w50'>&nbsp;</td><td 
class='iwdl w25'>&nbsp;</td><td class='iwdl w25'>&nbsp;</td></tr>";
                } else {
                        var cr_field = records[fields[j]][0];
                        var r_start;
                        switch (which) {
                          case 'month':   r_start = records[fields[j]][1]; 
break;
                          case 'year':    r_start = records[fields[j]][2]; 
break;
                          case 'alltime': r_start = records[fields[j]][3]; 
break;
                        }
                        if (cre[r_start] != '-') {
                            found_field = 1;
                    str3 += "<tr><td class='iwdl black' colspan='3'>";
                    switch(fields[j]) {
                      case "temp_high":     str3 += texts["max"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "temp_low":      str3 += texts["min"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "warmest_day":   str3 += texts["warmest_day"]; break;
                      case "coldest_day":   str3 += texts["coldest_day"]; break;
                      case "warmest_night": str3 += texts["warmest_night"]; 
break;
                      case "coldest_night": str3 += texts["coldest_night"]; 
break;
                      case "wind_avg":      str3 += texts["max"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "wind_avg_dir":  break;
                      case "wind_gust":     str3 += texts["max"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "wind_gust_dir": break;
                      case "rain_rate":     str3 += texts["rain_rate"]; break;
                      case "hour_rain":     str3 += texts["rain_hour"]; break;
                      case "daily_rain":    str3 += texts["rain_day"]; break;
                      case "baro_high":     str3 += texts["max"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "baro_low":      str3 += texts["min"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "soil_high":     str3 += texts["max"]; break;
                      case "soil_low":      str3 += texts["min"]; break;
                      case "grass_high":    str3 += texts["max"]; break;
                      case "solar":         str3 += texts["max"] + " " + 
cr_fieldnames[cr_field]; break;
                      case "uv":            str3 += texts["max"] + " " + 
cr_fieldnames[cr_field]; break;
                    }
                    str3 += "</td></tr>";
 
                    // Other date format requested?
                    var disp_date = '';
                    switch (settings["date"]) {
                    case "y/m/d":
                        disp_date = cre[r_start+5] + "/" + cre[r_start+4] + "/" 
+ cre[r_start+3];
                        break;
                    case "d-m-y":
                        disp_date = cre[r_start+3] + "-" + cre[r_start+4] + "-" 
+ cre[r_start+5];
                        break;
                    case "d/m/y":
                        disp_date = cre[r_start+3] + "/" + cre[r_start+4] + "/" 
+ cre[r_start+5];
                        break;
                    case "m-d-y":
                        disp_date = cre[r_start+4] + "-" + cre[r_start+3] + "-" 
+ cre[r_start+5];
                        break;
                    case "m/d/y":
                        disp_date = cre[r_start+4] + "/" + cre[r_start+3] + "/" 
+ cre[r_start+5];
                        break;
                    default:
                        disp_date = cre[r_start+5] + "/" + cre[r_start+4] + "/" 
+ cre[r_start+3];
                        break;
                    }
                    str3 += "<tr><td class='iwdl w60 bold'>" + disp_date + " ";

                    // If requested, translate to am/pm
                    time = cre[r_start+1] + ":" + cre[r_start+2];
                    if (settings["time"] == "12") {
                        var tm = time.split(":");
                        tm[0] = tm[0].replace(/^0/, '');
                        if (tm[0] > 12) {
                            tm[0] -= 12;
                            time = tm.join(":");
                            time += " pm";
                        } else {
                            time = tm.join(":");
                            if (tm[0] == 12)
                                time += " pm";
                            else
                                time += " am";
                        }
                    }

                    str3 += time + "</td>";
                    var conv = check_convert(cre[r_start], 
cr_fields[cr_field][1]);
                    str3 += "<td class='iwdl w20 right black bold'>" + 
conv['val'] + "</td>";
                    str3 += "<td class='iwdl w20 bold'>" + conv['units'] + 
"</td></tr>";
                    str2 += str3;
                        }
                }
            str2 += "</table></li>";
        }
        if (found_field) str += str2;
        str += "</ul>";
    }

    return str;
}

function dispSettings() {
    var str = '';
    var selected;

    str += "<form><ul class='edit rounded'>"
    str += "<li class='iwdl iwdl_bg'><span iwdltxt='settings'>" + 
texts["settings"] + "</span></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_temp' onChange='javascript: settingsChange(\"temp\", 
\"settings_temp\")'>";
    if (settings["temp"] == "c") selected = 'selected'; else selected = '';
    str += "<option value='c'" + selected + ">"    + texts["set_temp"] + ": 
&deg;C</option>";
    if (settings["temp"] == "f") selected = 'selected'; else selected = '';
    str += "<option value='f'" + selected + ">"    + texts["set_temp"] + ": 
&deg;F</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_wind' onChange='javascript: settingsChange(\"wind\", 
\"settings_wind\")'>";
    if (settings["wind"] == "kn") selected = 'selected'; else selected = '';
    str += "<option value='kn'" + selected + ">"   + texts["set_wind"] + ": 
kn</option>";
    if (settings["wind"] == "kmh") selected = 'selected'; else selected = '';
    str += "<option value='kmh'" + selected + ">"  + texts["set_wind"] + ": 
km/h</option>";
    if (settings["wind"] == "mph") selected = 'selected'; else selected = '';
    str += "<option value='mph'" + selected + ">"  + texts["set_wind"] + ": 
mp/h</option>";
    if (settings["wind"] == "ms") selected = 'selected'; else selected = '';
    str += "<option value='ms'" + selected + ">"   + texts["set_wind"] + ": 
m/s</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_wdir' onChange='javascript: settingsChange(\"wdir\", 
\"settings_wdir\")'>";
    if (settings["wdir"] == "deg") selected = 'selected'; else selected = '';
    str += "<option value='deg'" + selected + ">"  + texts["set_wdir"] + ": 
&deg;</option>";
    if (settings["wdir"] == "abbr") selected = 'selected'; else selected = '';
    str += "<option value='abbr'" + selected + ">" + texts["set_wdir"] + ": 
abbr</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_rain' onChange='javascript: settingsChange(\"rain\", 
\"settings_rain\")'>";
    if (settings["rain"] == "mm") selected = 'selected'; else selected = '';
    str += "<option value='mm'" + selected + ">"  + texts["set_rain"] + ": 
mm</option>";
    if (settings["rain"] == "in") selected = 'selected'; else selected = '';
    str += "<option value='in'" + selected + ">"  + texts["set_rain"] + ": 
inch</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_baro' onChange='javascript: settingsChange(\"baro\", 
\"settings_baro\")'>";
    if (settings["baro"] == "hpa") selected = 'selected'; else selected = '';
    str += "<option value='hpa'" + selected + ">" + texts["set_baro"] + ": 
hpa</option>";
    if (settings["baro"] == "mb") selected = 'selected'; else selected = '';
    str += "<option value='mb'" + selected + ">" + texts["set_baro"] + ": 
mb</option>";
    if (settings["baro"] == "hg") selected = 'selected'; else selected = '';
    str += "<option value='hg'" + selected + ">"  + texts["set_baro"] + ": 
hg</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_height' onChange='javascript: settingsChange(\"height\", 
\"settings_height\")'>";
    if (settings["height"] == "ft") selected = 'selected'; else selected = '';
    str += "<option value='ft'" + selected + ">"  + texts["set_height"] + ": 
ft</option>";
    if (settings["height"] == "m") selected = 'selected'; else selected = '';
    str += "<option value='m'" + selected + ">"   + texts["set_height"] + ": 
m</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_date' onChange='javascript: settingsChange(\"date\", 
\"settings_date\")'>";
    if (settings["date"] == "y-m-d") selected = 'selected'; else selected = '';
    str += "<option value='y-m-d'" + selected + ">"  + texts["set_date"] + ": 
yyyy-mm-dd</option>";
    if (settings["date"] == "y/m/d") selected = 'selected'; else selected = '';
    str += "<option value='y/m/d'" + selected + ">"  + texts["set_date"] + ": 
yyyy/mm/dd</option>";
    if (settings["date"] == "d-m-y") selected = 'selected'; else selected = '';
    str += "<option value='d-m-y'" + selected + ">"  + texts["set_date"] + ": 
dd-mm-yyyy</option>";
    if (settings["date"] == "d/m/y") selected = 'selected'; else selected = '';
    str += "<option value='d/m/y'" + selected + ">"  + texts["set_date"] + ": 
dd/mm/yyyy</option>";
    if (settings["date"] == "m-d-y") selected = 'selected'; else selected = '';
    str += "<option value='m-d-y'" + selected + ">"  + texts["set_date"] + ": 
mm-dd-yyyy</option>";
    if (settings["date"] == "m/d/y") selected = 'selected'; else selected = '';
    str += "<option value='m/d/y'" + selected + ">"  + texts["set_date"] + ": 
mm/dd/yyyy</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_time' onChange='javascript: settingsChange(\"time\", 
\"settings_time\")'>";
    if (settings["time"] == "24") selected = 'selected'; else selected = '';
    str += "<option value='24'" + selected + ">"  + texts["set_time"] + ": 
24</option>";
    if (settings["time"] == "12") selected = 'selected'; else selected = '';
    str += "<option value='12'" + selected + ">"   + texts["set_time"] + ": 12 
+ am/pm</option>";
    str += "</select></li>";

    str += "<li class='arrow iwdl_arrow'><select class='iwdl' 
id='settings_lang' onChange='javascript: settingsChange(\"lang\", 
\"settings_lang\")'>";
    for (var i = 0, l = settings["all_langs"].length; i < l; i++) {
        lang = settings["all_langs"][i];
        if (settings["lang"] == lang) selected = 'selected'; else selected = '';
        str += "<option value='" + lang + "'" + selected + ">"  + 
texts["set_lang"] + ": " + lang + "</option>";
    }
    str += "</select></li>";

    str += "</ul></form>";
    return str;
}

function dispGraph(grtype, graph) {
    var gr, cr, type;
    var ticks = null;
    switch (grtype.substr(0,1)) {
    case "h":
        type = 'h';
        grlist = ghsettings[graph];
        getClientRaw(["hcr"]);
        cr = crh;
        break;
    case "d":
        type = 'd';
        grlist = gdsettings[graph];
        getClientRaw(["ecr"]);
        cr = cre;
        break;
    case "w":
        type = 'w';
        grlist = gwsettings[graph];
        getClientRaw(["dcr"]);
        cr = crd;
        break;
    case "m":
        type = 'm';
        grlist = gmsettings[graph];
        getClientRaw(["dcr"]);
        cr = crd;
        break;
    }

    var width = "285px";
    if (document.width >= 480) width = "445px";
    $("#graphsinfo" + "_" + grtype + "_graph_" + graph).css({'width': width});

    // Make the graph
    var units = cr_fields[grtocr[graph]][1];

    // make single array
    var s = 0;
    var vals = new Array;
    for (k = 0; k < grlist.length; k++) {
        var gr = grlist[k];
        var start = gr[0];
        var length = gr[1];
        for (var l = start; l < start+length; l++) {
            // don't convert if units is abbr for degrees
            if (units == 'deg')
                vals[s] = cr[l];
            else {
                var conv = check_convert(cr[l], units);
                vals[s] = conv["val"];
            }
            s++;
        }
    }
    var d1 = [];
    for (var j = 0, len = vals.length; j < len; j++) {
        if (type == 'w')
            d1.push([(j - len + 1)/4, vals[j]]);
        else
            d1.push([j - len + 1, vals[j]]);
    }

    var options = {
                xaxis: {
                   ticks: ticks,
                   color: "white"
                },
                grid: {
                    color: "#a0a0a0"
                }
            }

    if (graph == 'wind_dir') {
            options.yaxis = {
                                min:   0,
                                max: 360,
                                ticks: [ [  0, check_convert(  0, "deg").val],
                                         [ 90, check_convert( 90, "deg").val],
                                         [180, check_convert(180, "deg").val],
                                         [270, check_convert(270, "deg").val],
                                         [360, check_convert(  0, "deg").val]
                                       ]
                        }
    } else {
            if (graph == 'solar_uv' || graph == 'solar_wm' || graph == 'rain' 
|| graph == 'wind_speed' || graph == 'wind_gust')
                options.yaxis = { min: 0 };
    }

    $.plot($("#graphsinfo" + "_" + grtype + "_graph_" + graph), [ d1 ], 
options);
}

function getGraphDescr(graph, type) {
    var descr = "<span crtxt='" + grtocr[graph] + "'>" + 
cr_fieldnames[grtocr[graph]] + "</span>" +
                " <span txtunits='" + cr_fields[grtocr[graph]][1] + "'>" + 
check_convert(0, cr_fields[grtocr[graph]][1])["units"] + "</span>";
    switch (type) {
    case "h": descr += " (<span iwdltxt='last_60m'>" + texts["last_60m"] + 
"</span>)"; break;
    case "d": descr += " (<span iwdltxt='last_24h'>" + texts["last_24h"] + 
"</span>)"; break;
    case "w": descr += " (<span iwdltxt='last_7d'>"  + texts["last_7d"] + 
"</span>)"; break;
    case "m":
        if (graph == "rain_year")
            descr += " (<span iwdltxt='last_12m'>" + texts["last_12m"] + 
"</span>)";
        else
            descr += " (<span iwdltxt='last_31d'>" + texts["last_31d"] + 
"</span>)";
        break;
    }
    return descr;
}

function graphTimeTpl(graphs, type) {
    var str = "<ul class='rounded'>";
    for (var i = 0, len=graphs.length; i < len; ++i) {
        str += "<li class='iwdl'><table class='w100 iwdl_marpad0'><tr><td 
class='iwdl_bg iwdl_marpad0 head black'>" + getGraphDescr(graphs[i], type) + 
"</td></tr></table>";
        str += "<div id='graphsinfo" + "_" + type + "_graph_" + graphs[i] + "' 
style='width:280px;height:100px;'></div>";
        str += "</li>";
    }
    str += "</ul>";
    return str;
}

function graphTypeTpl(type) {
    var graphs = crtogr[type];
    var str = "<ul class='rounded'>";
    for (var i = 0, ilen=graphs.length; i < ilen; ++i) {
        for (var j = 0, jlen=graphs[i].length; j < jlen; ++j) {
            if (graphs[i][j]) {
                var t;
                if (i == 0) t = "h";
                if (i == 1) t = "d";
                if (i == 2) t = "w";
                if (i == 3) t = "m";
                str += "<li class='iwdl'><table class='w100 
iwdl_marpad0'><tr><td class='iwdl_bg iwdl_marpad0 head black'>" + 
getGraphDescr(graphs[i][j], t) + "</td></tr></table>";
                str += "<div id='graphsinfo" + "_" + t + i + j + "_graph_" + 
graphs[i][j] + "' style='width:280px;height:100px;'></div>";
                str += "</li>";
            }
        }
    }
    str += "</ul>";
    return str;
}

function dispTimeGraphs(type) {
    var graphs = new Array();
    switch (type) {
    case "h": graphs = settings["hour_graphs"];  break;
    case "d": graphs = settings["day_graphs"];   break;
    case "w": graphs = settings["week_graphs"];  break;
    case "m": graphs = settings["month_graphs"]; break;
    }
    for (var i = 0, len=graphs.length; i < len; ++i) {
        dispGraph(type, graphs[i]);
    }
}

function dispTypeGraphs(type) {
    var graphs = crtogr[type];
    if (graphs[0][0]) dispGraph("h00", graphs[0][0]);
    if (graphs[1][0]) dispGraph("d10", graphs[1][0]);
    if (graphs[2][0]) dispGraph("w20", graphs[2][0]);
    if (graphs[3][0]) dispGraph("m30", graphs[3][0]);
    if (graphs[3][1]) dispGraph("m31", graphs[3][1]);
}

function setTexts(what) {
    if (what == 'iwdl' || what == 'all') {
        $("[iwdltxt]").each(function() {
            $(this).html(texts[$(this).attr("iwdltxt")]);
        });
        $("#r_today").remove();
        $("#r_month").remove();
        $("#r_year").remove();
        $("#r_alltime").remove();
        addDiv("r_today",      dispToday());
        addDiv("r_month",      dispRec('month'));
        addDiv("r_year",       dispRec('year'));
        addDiv("r_alltime",    dispRec('alltime'));
    }

    if (what == 'cr' || what == 'all') {
        var done = new Array;
        for (var i = 0, len = settings["home"].length; i < len; ++i) {
            done[settings["home"][i]] = 1;
            $("[crtxt=" + settings["home"][i] + 
"]").html(cr_fieldnames[settings["home"][i]]);
        }
        for (var i = 0, len = settings["live_screen"].length; i < len; ++i) {
            if (!done[settings["live_screen"][i]]) {
                $("[crtxt=" + settings["live_screen"][i] + 
"]").html(cr_fieldnames[settings["live_screen"][i]]);
                done[settings["live_screen"][i]] = 1;
            }
        }
        for (var i = 0, len = settings["min_max"].length; i < len; ++i) {
            if (!done[settings["min_max"][i]]) {
                $("[crtxt=" + settings["min_max"][i] + 
"]").html(cr_fieldnames[settings["min_max"][i]]);
                done[settings["min_max"][i]] = 1;
            }
        }
    }
}

function setUnits() {
    var conv;
    var lst = new Array('c', 'kn', 'deg', 'hpa', 'mm', 'ft');
    for (i = 0; i < lst.length; i++) {
        conv = check_convert(0, lst[i]);
        $("[txtunits=" + lst[i] + "]").html(conv["units"]);
    }
}

function addDiv(name, content) {
    var dv = '';
    dv += "<div id='" + name + "'>";
    dv += "<div class='toolbar'>";
    dv += "<h1 class='h1_station_name'>" + station + "</span></h1>";
    dv += "<a href='#' class='back' iwdltxt='back'>" + texts['back'] + "</a>";
    dv += "</div>";
    dv += content;
    dv += "</div>";
    $("#jqt").append(dv);
}

function localiser() {
    if ($("#map_text").html()) return;

    var lng = 0;
    var lat = 0;
    
    if (document.width >= 480) {
        var width = 520; var height = 285;
        if (document.height > 285) height = 435;
        $('#map_canvas').css("width",width+"px");
        $('#map_canvas').css("height",height+"px");
        $('#map-overflow').css("width",(width-40)+"px");
        $('#map-overflow').css("height",(height-10)+"px");
    } else {
        var width = 360; var height = 435;
        $('#map_canvas').css("width",width+"px");
        $('#map_canvas').css("height",height+"px");
        $('#map-overflow').css("width",(width-40)+"px");
        $('#map-overflow').css("height",(height-10)+"px");
    }
    $('#width_of_doc').html(document.width);
    // Meteohub uses - for east of GMT, Weather Display uses - for west of GMT
    if (settings['longitude']) {
        if (settings["station_type"] && settings["station_type"] == 'meteohub')
                lng = settings['longitude'];
        else
                lng = -settings['longitude'];
        lat = settings['latitude'];
    } else {
        if (settings["station_type"] && settings["station_type"] == 'meteohub')
                lng = parseFloat(cr[161]);
        else
                lng = -(parseFloat(cr[161]));
        lat = parseFloat(cr[160]);
    }

    if (lng || lat || settings["location"]) {
        var myLatlng = new google.maps.LatLng(lat, lng);
        var myOptions = {
          zoom: 5,
          center: myLatlng,
          disableDefaultUI: true,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById('map_canvas'), 
myOptions);
        var marker = new google.maps.Marker({
          position: myLatlng,
          map: map,
          title: station
        });

        if (!settings["location"]) {
            var geocoder = new google.maps.Geocoder();
            var latlng = new google.maps.LatLng(lat, lng);
            if (geocoder) {
                geocoder.geocode({'latLng': latlng}, function(results, status) {
                  if (status == google.maps.GeocoderStatus.OK) {
                    if (results[1]) {
                      $("#map_text").html("<center>" + 
texts["station_location"] + ":<br>" +results[1].formatted_address + 
"</center>");
                    }
                  } else {
                      $("#map_text").html("<center>" + 
texts["station_location"] + ":<br>" + " ( not found ) " + "</center>");
                  }
                });
            }
        } else {
            $("#map_text").html("<center>" + settings["location"] + 
"</center>");
        }
    } else {
        $("#map_canvas").html(texts["unknown_location"]);
    }
}

function settingsChange(which, newval) {
    var nw = $("#" + newval).val();
    settings[which] = nw;
    if (window.openDatabase) {
        jQT.dbDeleteRow("settings", "setting", "'" + which + "'");
        jQT.dbInsertRows({"addRow": [ { "table": "settings", "property": [ { 
"name": "setting", value: which }, { "name": "value", "value": nw } ] } ] });
    }
    if (which == "lang") {
        // Load language file
        loadjsfile("iwdl_lang_" + settings["lang"] + ".js");
        lang_loaded = settings["lang"];
        setTexts('all');
        $("#settings_content").html(dispSettings());

        // Set bg color
        $(".iwdl_bg").css("background", settings["bgcolor"]);
    }
    $("#fc").html("");
    setUnits();
    updateiWdl();
}


function finishStartup() {
    // Load language file
    if (settings["lang"] != lang_loaded) loadjsfile("iwdl_lang_" + 
settings["lang"] + ".js");
    lang_loaded = settings["lang"];
    addDiv("settings", "<div id='settings_content'>" + dispSettings() + 
"</div>");

    getClientRaw(["cr", "ecr"]);
    dispHome();

    addDiv("live_weather", dispIwdl());
    addDiv("r_today",      dispToday());
    addDiv("r_month",      dispRec('month'));
    addDiv("r_year",       dispRec('year'));
    addDiv("r_alltime",    dispRec('alltime'));

    setUnits();
    updateiWdl();

    if (document.height >= 460) {
        if (theme == 'apple')
            $("#filler").css({'height': 58 });
        else
            $("#filler").css({'height': 47 });
    } else {
        if (theme == 'apple')
            $("#filler").css({'height': 15 });
        else
            $("#filler").css({'height': 4 });
    }
    
    $(document).everyTime(settings["refresh"] + "s", "iwdlTimer", function(i) { 
updateiWdl(); }, settings["num_refresh"]);

    var lst = ["hour", "day", "week", "month"];
    for (var i = 0; i < lst.length; i++) {
        var tm = lst[i];
        addDiv(tm, graphTimeTpl(settings[tm + "_graphs"], tm.substr(0, 1)));
        $("#" + tm).bind('pageAnimationEnd', function(event, info){
            if (info.direction == 'in') 
dispTimeGraphs($(this).attr("id").substr(0, 1));
            if (info.direction == 'in') $(document).stopTime("iwdlTimer");
        });
    };

    for (var i = 0; i < settings["live_screen"].length; i++) {
        var gr = settings["live_screen"][i];
        if (crtogr[gr]) {
            addDiv("graphs_" + gr, graphTypeTpl(gr));
            $("#graphs_" + gr).bind('pageAnimationEnd', function(event, info){
                if (info.direction == 'in') 
dispTypeGraphs($(this).attr("id").replace(/graphs_/, ""));
                if (info.direction == 'in') $(document).stopTime("iwdlTimer");
            });
        }
    }

    $('#live_dials').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            dispDials();
        }
    });

    $('#live_weather').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            AsyncClientRaw();
            $(document).stopTime("iwdlTimer");
            $(document).everyTime(settings["refresh"] + "s", "iwdlTimer", 
function(i) { AsyncClientRaw(); }, settings["num_refresh"]);
        }
    });

    $('#home').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            AsyncClientRaw();
            $(document).stopTime("iwdlTimer");
            $(document).everyTime(settings["refresh"] + "s", "iwdlTimer", 
function(i) { AsyncClientRaw(); }, settings["num_refresh"]);
        }
    });

    $('#forecast').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            $(document).stopTime("iwdlTimer");
            getForecast();
        }
    });

    $('#radar').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            $(document).stopTime("iwdlTimer");
            $("#radarframe").attr("src", settings["radar"]);
        }
    });

    $('#webcam').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            $(document).stopTime("iwdlTimer");
            $("#webcamframe").attr("src", settings["webcam"]);
        }
    });

    $("#tap_mapbutton").bind('click', function(event) {
        $(document).stopTime("iwdlTimer");
        jQT.goTo("#map", "slideup");
    });
    
    $("#tap_radarbutton").bind('click', function(event) {
        $(document).stopTime("iwdlTimer");
        jQT.goTo("#radar", "slideup");
    });
    
    $("#tap_webcambutton").bind('click', function(event) {
        $(document).stopTime("iwdlTimer");
        jQT.goTo("#webcam", "slideup");
    });
    
    $("#tap_settings").bind('click', function(event) {
        $(document).stopTime("iwdlTimer");
        jQT.goTo("#settings", "slideup");
    });
    
    $("#tap_about").bind('click', function(event) {
        $(document).stopTime("iwdlTimer");
        jQT.goTo("#about", "pop");
    });
    
    setTexts('iwdl');
    if (station.length >= 15) {
        $(".h1_station_name").css("font-size", 15);
        $(".h1_station_name").css("white-space", "normal");
    }

    $(function(){
        $('body').bind('turn', function(event, info){
             // Change graph dimensions
             var curr = $(".current").attr("id");
             switch (curr) {
             case "hour"      : ;
             case "day"       : ;
             case "week"      : ;
             case "month"     : dispTimeGraphs(curr.substr(0, 1));   break;
             case "graphs_1"  : ;
             case "graphs_2"  : ;
             case "graphs_3"  : ;
             case "graphs_4"  : ;
             case "graphs_5"  : ;
             case "graphs_6"  : ;
             case "graphs_7"  : ;
             case "graphs_12" : ;
             case "graphs_79" : ;
             case "graphs_127": dispTypeGraphs(curr.replace(/graphs_/, "")); 
break;
             case "map"       :
                 if (info.orientation == "landscape") {
                     var width = 520; var height = 285;
                     $('#map_canvas').css("width",width+"px");
                     $('#map_canvas').css("height",height+"px");
                     $('#map-overflow').css("width",(width-40)+"px");
                     $('#map-overflow').css("height",(height-10)+"px");
                 } else {
                     var width = 360; var height = 435;
                     $('#map_canvas').css("width",width+"px");
                     $('#map_canvas').css("height",height+"px");
                     $('#map-overflow').css("width",(width-40)+"px");
                     $('#map-overflow').css("height",(height-10)+"px");
                 }
                 break;
              }
        });
        
    });
    if (document.width > 480) {
        $('#screen_width').css('width', '480px');
        $('#screen_width').css('margin-left', 'auto');
        $('#screen_width').css('margin-right', 'auto');

        var width = 520; var height = 285;
        $('#map_canvas').css("width",width+"px");
        $('#map_canvas').css("height",height+"px");
        $('#map-overflow').css("width",(width-40)+"px");
        $('#map-overflow').css("height",(height-10)+"px");
    }

    $('#map').bind('pageAnimationEnd', function(event, info){
        if (info.direction == 'in') {
            localiser();
        }
    });

    if (theme == 'jqt') {
        $(".iwdl").css('color',  '#c0c0c0');
        $(".black").css('color', 'white');
        $(".iwdl_bg .black").css("color", "black");
    }

    // Set bg color
    $(".iwdl_bg").css("background", settings["bgcolor"]);

    $('#startup').css('display', 'none');
    $('#jqt').css('display', 'block');
}

function startIwdl() {
    loadjsfile("iwdl_settings.js");

    jQT = new $.jQTouch({
        addGlossToIcon: false,
        startupScreen: 'iwdl_startup.png',
        statusBar: 'black',
    });

    $(document).ready(function(e){
        if (!settings["lang"]) {
            alert("No iwdl_settings.js, please rename iwdl_settings.js.sample 
to iwdl_settings.js and make necessary changes");
        }
        if (settings["clientraw_dir"].charAt(settings["clientraw_dir"].length - 
1) != '/')
            settings["clientraw_dir"] += "/";

        updateiWdl();
        if (window.openDatabase) {
            // Open database
            jQT.dbOpen("iwdl", "1.0", "Settings", 5000);
            jQT.dbCreateTables({ "createTables" : [ { "table": "settings", 
"property": [ {"name": "setting", "type": "text"},
                                                                                
         {"name": "value", "type": "text" } ] } ] } );
            jQT.dbSelectAll("settings", function(result) {
                for (var i = 0; i < result.rows.length; i++) {
                    var row = result.rows.item(i);
                    settings[row['setting']] = row['value'];
                }
                finishStartup();
            });
        } else {
            finishStartup();
        }
    });
}

startIwdl();

Reply via email to