/*
 *  wx.js - Funktioner i Javaskript för vädersidorna
 *  Copyright (c) 2003--2012, Robert Larsson, Göteborg
 *  http://rl.se
 *
 */

"use strict";

function grafik24(icao)                             // 24-timmars vädergrafik som popup.
{                                                   // UTGÅR SNART, ERSATT AV g24 !
    if (! window.focus)
        return;

    var href   = '/vadret/grafik24c.php?stn=' + icao;
    var hojd   = screen.height - 50;
    var wparam = 'width=650,height='  + hojd + ',scrollbars=yes';

    var wh = window.open(href, 'g24h', wparam);
    wh.moveTo(1,1);                                 // FF?
}

function hist24(icao, ymd)                          // 24-timmars HISTORISK vädergrafik
{
    if (! window.focus)
        return;

    $("#h_icao").val(icao);
    $("#h_period").val(ymd);
    $("#dumform").submit();
}

function umsg(bg, themsg)                           // Tala om för användaren hur inmatningen går
{
    var bgclr;

    switch (bg)                                     // Ev. färgad bakgrund på text
    {
        case 2:  bgclr = '#ffdddd'; break;
        case 4:  bgclr = '#ffffdd'; break;
        case 5:  bgclr = '#ddffdd'; break;
        default: bgclr = '#e0e0e0';
    }

    $("#ledtext").css("backgroundColor", bgclr);
    $("#ledtext").html(themsg);
}

function goodday()                                  // Kolla om datumet lirar sjysst
{
    var     pelle, olle;                            // Bröderna Variabel...
    var     yy,mo,dd,hh,mi;
    var     right_now = new Date();
    var     leapyear = false;


    pelle = document.f.W.value;                     // Redan regex-kollat, antas vara snyggt

    yy = pelle.substring(0,4);
    mo = pelle.substring(5,7);
    dd = pelle.substring(8,10);
    hh = pelle.substring(11,13);
    mi = pelle.substring(14,16);

    if (mo<1 || mo>12 || dd<1 || hh>23 || mi>59)    // Flagranta fel
    {
        umsg(2, "Tid eller datum felaktigt!");
        return false;
    }

    switch (parseInt(mo))                           // Kolla datumlogiken
    {
        case  2:
            if ((yy % 4 == 0) && ((yy % 400 == 0) || (yy % 100 != 0)))
            {
                if (dd > 29)
                {
                    umsg(4, "Februari har bara 29 dagar ett skottår!");
                    return false;
                }
            }
            else                                    // Dvs inget skottår!
            {
                if (dd > 28)
                {
                    umsg(4, "Endast 28 dagar i februari detta år!");
                    return false;
                }
            }

            break;

        case  4:
        case  6:
        case  9:
        case 11:
            if (dd > 30)
            {
                umsg(4, "30 dagar har september&hellip;");
                return false;
            }
            break;

        default:
            if (dd > 31)
            {
                umsg(4, "Max 31 dagar denna månad");
                return false;
            }
    }

    var   oldest_data    = new Date(2001,8,24,23,20,0);
    var   requested_time = new Date(yy,mo-1,dd,hh,mi,0);

    if (requested_time < oldest_data)
    {
        umsg(4, 'Så gamla data har jag inte!');
        return false;
    }

    if (requested_time > right_now)
    {
        umsg(4, "Kan inte spå framtida väder&hellip;");
        return false;
    }

    return true;                                    // Who's your daddy..?
}

function mrx()                                      // Matchar regex?
{                                                   // Används av karta och historik
    var ih = $("#W").val() ;

    if (ih.length < 5)
        return false;

    var re1 = new RegExp('^20[01][0-9]-');      // Dålig början...

    if (! ih.match(re1))
    {
        umsg(2, "Fel format, backa!") ;
        $("#knappen").prop("disabled", true);
        return false;
    }


    //  Snyggt svarvade datum från år 2000 till 2019 anses matcha,
    //  så varför inte skapa ett sådant regex-uttryck?

    var re = /20[01][0-9]-[01][0-9]-[0123][0-9] [012][0-9]:[0-5][0-9]/;

    if (ih.match(re))                               // Rockar fett!
    {
        if (goodday())                              // Giltigt datum?
        {
            $("#knappen").removeProp("disabled");
            umsg(5, "Okej, nu kan du trycka !") ;
            return true;
        }
        else                                        // Vidrig tidsangivelse!
        {
            $("#knappen").prop("disabled", true);
            return false;
        }
    }
    else                                            // Fy fan, ett kasst regex...
    {
        $("#knappen").prop("disabled", true);
        umsg(0, "Ange ÅÅÅÅ-MM-DD hh:mm") ;
        return false;
    }
}

function pageload()                                 // Karta & historik
{
}

function trysubmit()                                // Surfarn tryckte på knappen
{
    if (!mrx())                                     // Strängen validerar inte
    {
        $("#W").focus();                            // Cursorn i fältet igen och...
        return false;                               // ...skicka tebax honom
    }

    $("#f").submit();
    return true;
}


function prognosBoot()
{
    $("#hjbut").click(function()
    {
        $("#infotext").fadeToggle();
    });

    $("#orten").change(function()
    {
        var valt = $("#orten").val();

        if("zokzok" == valt)
            window.location = "/hitta-plats?c=vp";
        else
            $("#datform").submit();
    })
}



//  Man måste ju kunna ändra sin plats, eller?
//

function setHome(la, lo, ko)                        // Uppdatera kakor+sidan
{
    var trail = "; expires=Tue, 31 Dec 2019 22:22:22 GMT; path=/" ;
    ko = escape(ko);
    document.cookie = "ulat=" + la + trail ;
    document.cookie = "ulon=" + lo + trail ;
    document.cookie = "ukomm=" + ko + trail ;
    window.location = '/prognos/' ;                 // Använd GET nu!
}




//  Varningsblinkers som aktiverar & flashar en menyknapp när
//  vädervarning klass 2 (orange) eller 3 (röd) är utfärdad.
//
var     visi=false;
var     ivl;
var     blitzobj;
var     left;
var     oldstyle;
var     warnstyle;

function togglebg()
{
    if (left--)
    {
        blitzobj.style.backgroundColor = visi ? oldstyle : warnstyle;
        visi = !visi;
    }
    else
    {
        clearInterval(ivl);
        blitzobj.style.backgroundColor = oldstyle;
    }
}


function blitz(theid, theLevel)
{
    if (theLevel < 2 || theLevel > 3)
    {
        left = 0;
        togglebg();
        return ;
    }

    blitzobj = document.getElementById(theid);
    oldstyle = blitzobj.style.backgroundColor ;
    warnstyle = 3 == theLevel ? "#ff0000" : "#ff8000" ;
    blitzobj.innerHTML = "Varning klass " + theLevel;
    blitzobj.style.display = "inline";

    left=7;
    ivl = setInterval("togglebg()", 555);
}


//  Inforuta längst upp till vänster som växlar mellan medeltemp
//  och medelvind för alla stationer.
//
var medeltemp, medelvind;
var winnie = 0;
var ivlMedel, tmoutfade;

function fadeMedel()
{
    $("#mtemp").css("color", "rgba(80, 80, 0, 0.05)");
}


function chgMedel()                                 // Anropa vid boot + periodiskt
{
    var z;

    if (0 == winnie++ % 2)
        z = "Medeltemperatur<br><b>" + medeltemp + "</b>" ;
    else
        z = "Medelvind<br><b>" + medelvind + "</b>" ;

    $("#mtemp").html(z);
    $("#mtemp").css("color", "rgb(88,68,0)");

    tmoutfade = setTimeout("fadeMedel()", 4400);
}


function initMedel(mt, mv)                          // Anropas en gång från PHP...
{
    medeltemp = mt;
    medelvind = mv;

    ivlMedel = setInterval("chgMedel()", 5000);     // Var 5:e sekund, sörru!
}




//  Abonnera på musklick i vädertabellen, ploppa upp 24-
//  timmars diagram om klicket härrör från stations-cell.
//
//

function getTarget(evt)                             //  Hack för att få fram avsändaren i jävla IE
{
    var e = evt ? evt : window.event;
    return e.target ? e.target : e.srcElement;
}


function tbClick2(evt)                               // Nån klickade i tabellhelvetet
{
    var tgt = getTarget(evt);

    if (! tgt)
    {
        alert("Ett absurt, närmast groteskt, fel har inträffat.\nMeddela gärna webmaster!");
        return;
    }

    var rx = /^ES[A-Z]{2}$/i ;

    if (! tgt.id.match(rx))
        return;

    $("#stn").val(tgt.id);
    $("#aform").submit();
}


function indexBoot()                                // Huvudvädersidan
{
    $("#thetab").mousedown(tbClick2);

    $("#hjbut").click(function()
    {
        $("#infotext").toggle();
        $(window).scrollTop();
        window.scroll(0, 800);                      // Rulla ner så hjälpen syns
    });

    $("#mtemp").click(function()
    {
        clearInterval(ivlMedel);                    // Behöver ju inte uppdatera längre
        $("#mtemp").fadeOut();
    });

    chgMedel();                                     // Befolka medelvärdesrutan
}



///////////////////////////// g24 följer  ///////////////////////////////////////////////

var lblstyle = {font: '11px Verdana, Arial, Tahoma, Helvetica, sans-serif', color: '#efefef'} ;
var ttlstyle = {font: '18px bold h1font, Verdana, Arial, Tahoma, sans-serif', fontWeight: 'bold', color: "#ffff00"} ;

var     icao="????";
var     period='' ;                                 // Om yyyy-mm-dd: vill se historik
var     v = Object();
var     sRH = Object();                             // serie Rel fukt
var     sT  = Object();                             // serie Temperatur
var     sV  = Object();                             // serie Vind
var     sBy = Object();                             // serie byvind
var     stryck  = Object();                         // serie Lufttryck
var     platsen = "";
var     stampnow = new Date().getTime()/1000;       // Default, hämta från servern senare
var     stampmax;
var     historik;


function cb(d, E, f)                                // Ta hand om söksvar i json
{
    v.data = [];
    v.marker = {enabled: false} ;
    v.name = icao;
    v.type = "spline";

    sBy.data = [];
    sBy.marker = {enabled: true} ;
    sBy.name = "byvind";
    sBy.type = "scatter";

    sRH.data = [];
    sRH.marker = {enabled: false} ;
    sRH.name = "sRHadam";

    sT.data = [];
    sT.marker = {enabled: false} ;
    sT.name = "sTBertil";

    sV.data = [];
    sV.marker = {enabled: false} ;
    sV.name = "sVCesar";

    stryck.data = [];
    stryck.marker = {enabled: false} ;
    stryck.name = "stryckDavid";

    // Post 0 är headern, läs den först
    //
    stampnow = d[0][0];                             // Aktuell tid sedan 1970
    $("#thename").html(d[0][1]);                    // HTML-kodad plats
    historik = d[0][2];                             // Dude, vi snackar gamla data

    if (historik)
    {
        $("#histalert").html("Visar historik för " + period);
        $("#histalert").fadeIn();
    }

    for(var n=1; n<d.length; n++)                   // Resten av posterna är data
    {
        var stamp = stampmax = d[n][0] ;
        var ms    = d[n][1] ;
        var byar  = d[n][2] ;
        var temp  = d[n][3] ;
        var rh    = d[n][4] ;
        var rikt  = d[n][5] ;
        var tryck = d[n][6] ;
        var sikt  = d[n][7] ;
        var moln  = d[n][8] ;

        v.data.push([stamp, ms, byar, temp, rh, rikt, tryck, sikt, moln]);

        sRH.data.push([1000*stamp, rh]);
        sT.data.push([1000*stamp, temp]);
        sV.data.push([1000*stamp, ms]);
        stryck.data.push([1000*stamp, tryck]);

        if (byar>0)
            sBy.data.push([1000*stamp, byar]);
    }

    mkrikt();
    mkrh();
    mktryck();
    mkms();
    mktemperatur();
}


function doAjax()
{
    $.ajax(
    {
        url: '/res/rlajax.php',
        dataType: 'json',
        data: { "what":"wx24" , "icao":icao, "period":period },
        success: cb
    });
}

function mkrikt()
{
    if (navigator.userAgent.match(/MSIE [3-8]/i))
    {
        $("#r3").css("height", "auto");
        $("#r3").html("Din webbläsare klarar inte SVG, grafiken för vindriktning kan inte visas.");
        return;
    }

    var brd = $('#r3').width();              // Kolla vår containers boyta
    var hjd = $('#r3').height();

    if (brd>hjd)                                // Gör skiten kvadratisk
        brd = hjd;
    else if (hjd>brd)
        hjd=brd;

    brd = hjd = 600;

    var cy=hjd/2, cx=cy;
    var r = new Highcharts.Renderer($('#r3')[0], brd, hjd);

    //  Koncentriska cirklar med 6h avstånd
    //
    r.circle(cx, cy, cx).attr({ fill: '#999999' }).add();
    r.circle(cx, cy, 0.75*cx).attr({ fill: 'none', 'stroke-width': 0.5, 'stroke': '#efefef' }).add();
    r.circle(cx, cy, 0.50*cx).attr({ fill: 'none', 'stroke-width': 0.5, 'stroke': '#efefef' }).add();
    r.circle(cx, cy, 0.25*cx).attr({ fill: 'none', 'stroke-width': 0.5, 'stroke': '#efefef' }).add();


    var eker = ['M', cx, cy*0.9, 'L', cx, 19] ;    // Från centrum till övre mitt
    var rotmall = 'rotate(xxx ' + cx + ' ' + cy +')' ;
    var ra = ['N','NNO','ONO','O','OSO','SSO','S','SSV','VSV','V','VNV','NNV'] ;

    for (var i=0; i<12; i++)          // Radialerna och etiketter
    {
        var rot  = rotmall.replace(/xxx/, i*30);
        var atts = {'transform': rot, 'stroke-width': 0.5, stroke: '#efefef', 'stroke-dasharray': '2 2'} ;
        r.path(eker) .attr(atts) .add();

        var tatt =
        {
            'transform': rot,
            'font': '16px Verdana, Arial, Tahoma, Helvetica, sans-serif',
            'fill' : '#efefef',
            'text-anchor': 'middle'
        } ;

        var lbl = r.text(ra[i], cx, 13) .attr(tatt) ;
        lbl.add() ;
    }


    // 1 dygn = 1440 min = cy pixlar ==> 1pixel = cy/1440 min
    //
    var ppm = cy/1440;                          // Pixlar per minut

    var snake = ['M', cx, cy, 'L'] ;            // Header

    var plotsize = cx/75;
    var lw = plotsize/1;

    for(var i=0; i<v.data.length; i++)
    {
        var ms  = v.data[i][1];
        var dir = v.data[i][5];

        if (ms < 0.5 || 359==dir)               // Ej plottvärt
            continue;

        var highminute = historik ? stampmax : stampnow;
        var agemins = (highminute - v.data[i][0])/60;
        var dirrad = dir * Math.PI / 180.0;

        var hyp = cx - agemins * ppm;

        var x_now = cx + (hyp * Math.sin(dirrad)) ;
        var y_now = cy - (hyp * Math.cos(dirrad)) ;

        var plot = '#0000ff';                   // Blå default, < 5m/s

        if (ms >= 15)
            plot = 'red';
        else if (ms >= 10)
            plot = '#ff8000';
        else if (ms >= 5)
            plot = '#00ff00';

        r.circle(x_now, y_now, plotsize).attr({opacity: 0.8, fill: plot }).add();
        snake.push(x_now);
        snake.push(y_now);
    }

    atts = {'stroke-width': lw, stroke: 'rgba(255,255,50,0.3)'} ;
    r.path(snake) .attr(atts) .add();
}

function mkrh()
{
    var ch1 = new Highcharts.Chart(
    {
        chart:  {backgroundColor: '#999999', renderTo: 'r2', type: 'spline', width: 600, height: 400},
        tooltip: {enabled: false},
        credits:{enabled: false},
        legend:{enabled: false},

        title:
        {
            align: 'right',
            text: 'Relativ luftfuktighet %' ,
            style: ttlstyle
        },

        plotOptions:
        {
            series: { lineWidth: 5, animation: {duration: 1500}, enableMouseTracking: false, color: '#ffff00'  }
        } ,

        xAxis:
        {
            type: "datetime",
            dateTimeLabelFormats: {hour: '%H'},
            gridLineColor: "#efefef",
            gridLineWidth: 0.5,
            lineWidth: 0.3,
            tickInterval: 3600*1000,
            labels: {step: 2, style: lblstyle }
        },

        yAxis:
        [
            {
                title: {text: null},
                allowDecimals: false,
                startOnTick: false,
                endOnTick: false,
                min: 0, max: 101,
                tickInterval: 10,
                opposite: true,
                labels: {style: lblstyle}
            }
        ],

        series: [ sRH ]
    });
}




function mktemperatur()
{
    var ch1 = new Highcharts.Chart(
    {
        chart:  {backgroundColor: '#999999', renderTo: 'r1', type: 'spline', width: 600, height: 400},
        tooltip: {enabled: false},
        credits:{enabled: false},
        legend:{enabled: false},

        title:
        {
            align: 'right',
            text: 'Temperatur °C',
            style: ttlstyle
        },

        plotOptions:
        {
            series: { lineWidth: 5, animation: {duration: 1500}, enableMouseTracking: false, color: '#ffff00' }
        } ,

        xAxis:
        {
            type: "datetime",
            dateTimeLabelFormats: {hour: '%H'},
            gridLineColor: "#efefef",
            gridLineWidth: .5,
            lineWidth: 0.3,
            tickInterval: 3600*1000,
            labels: {step: 2, style: lblstyle }
        },

        yAxis:
        [
            {
                title: {text: null},
                allowDecimals: false,
                endOnTick: false,
                startOnTick: false,
                opposite: true,
                tickInterval: 1,
                labels: {style: lblstyle}
            }
        ],

        series: [ sT ]
    });
}


function mkms()
{
    var ch1 = new Highcharts.Chart(
    {
        chart:
        {
            backgroundColor: '#999999', renderTo: 'r4', width: 600, height: 400,
            type: "spline", animation: false
        },
        tooltip: {enabled: false},
        credits:{enabled: false},
        legend:{enabled: false},

        title: {align: 'right', text: 'Medelvind m/s', style: ttlstyle},

        plotOptions:
        {
            series: {animation: {duration: 1500}} ,
            spline : {lineWidth: 5, color: '#ffff00' },
            scatter:
            {
                marker: {radius: 8, fillColor: '#ff8000', symbol: 'triangle'},
                enableMouseTracking: false
            }
        } ,

        xAxis:
        {
            type: "datetime",
            dateTimeLabelFormats: {hour: '%H'},
            gridLineColor: "#efefef",
            gridLineWidth: .5,
            lineWidth: 0.3,
            tickInterval: 3600*1000,
            labels: {step: 2, style: lblstyle }
        },

        yAxis:
        [
            {
                title: {text: null},
                allowDecimals: false,
                endOnTick: false,
                startOnTick: false,
                opposite: true,
                min: 0,
                tickInterval: 1,
                labels: {step: 1, style: lblstyle}
            }
        ],

        series: [ sV, sBy ]
    });
}

function mktryck()
{
    var ch1 = new Highcharts.Chart(
    {
        chart:  {backgroundColor: '#999999', renderTo: 'r5', type: 'spline', width: 600, height: 400},
        tooltip: {enabled: false},
        credits:{enabled: false},
        legend:{enabled: false},

        title: {align: 'right', text: 'Lufttryck hPa', style: ttlstyle},

        plotOptions:
        {
            series: { lineWidth: 5, animation: {duration: 1500}, enableMouseTracking: false, color: '#ffff00' }
        } ,

        xAxis:
        {
            type: "datetime",
            dateTimeLabelFormats: {hour: '%H'},
            gridLineColor: "#efefef",
            gridLineWidth: .5,
            lineWidth: 0.3,
            tickInterval: 3600*1000,
            labels: {step: 2,style: lblstyle }
        },

        yAxis:
        [
            {
                title: {text: null},
                allowDecimals: false,
                endOnTick: false,
                startOnTick: false,
                opposite: true,
                min: 950, max: 1060,
                tickInterval: 10,
                labels: {step: 1, style: lblstyle}
            }
        ],

        series: [ stryck ]
    });
}


function g24boot()
{
    $("#hjbut").click(function()
    {
        $("#inforuta").fadeToggle();
    });

    $("#thename").html(icao);

    doAjax();
}

