// Image Preloader
function myImagePreloader(paths, callback, which)
{
    this.which = which;
    
	// store the callback
	this.callback = callback;

	// initialize internal state.
	this.nLoaded = 0;
	this.nProcessed = 0;
	this.aImages = []; // new Array();

	// record the number of images.
	this.nImages = paths.length;

	// for each image, call preload()
	for ( var i = 0; i < paths.length; i++ ) {
		this.preload(paths[i]);
    }
}

myImagePreloader.prototype.preload = function(path)
{
	// create new Image object and add to array
	var oImage = new Image();
	this.aImages.push(oImage);
	
	// set up event handlers for the Image object
	oImage.onload = myImagePreloader.prototype.onload;
	oImage.onerror = myImagePreloader.prototype.onerror;
	oImage.onabort = myImagePreloader.prototype.onabort;
	
	// assign pointer back to this.
	oImage.oImagePreloader = this;
	oImage.bLoaded = false;
	oImage.source = path;
	
	// assign the .src property of the Image object
	oImage.src = path;
};

myImagePreloader.prototype.onComplete = function()
{
	this.nProcessed++;
	if ( this.nProcessed == this.nImages ) {
		this.callback(this.aImages,this.which);
    }
};

myImagePreloader.prototype.onload = function()
{
	this.bLoaded = true;
	this.oImagePreloader.nLoaded++;
	this.oImagePreloader.onComplete();
};

myImagePreloader.prototype.onerror = function()
{
	this.bError = true;
	this.oImagePreloader.onComplete();
};

myImagePreloader.prototype.onabort = function()
{
	this.bAbort = true;
	this.oImagePreloader.onComplete();
};

// ----------------

function toggleanno(e) { return; /* alert(e.src); */ }

function thumb_over(which) { document.getElementById("thumb").src = "satellite/" + which + ".jpg"; }

function radar_over()	{ document.getElementById("thumb").src = "local-150.gif"; }

function wx_over(obj) { var u = "http://206.158.7.4/weather/" + obj.name + ".gif"; document.getElementById("thumb").src = u; }

function thumb_reset(obj) { }

function thumb_load(obj) { if (obj) { obj.href = "http://206.158.7.4/weather/" + obj.name + ".jpg"; } }

var dd = new Date();
var last_ms = dd.getTime();

function refresh_thumb(t) {
	var parent_id = t.id;
	var words = parent_id.split("_");
	parent_id = words[0];
	var parent_img = document.getElementById(parent_id);
	var imgsrc = parent_img.src;
	var srcwords = imgsrc.split("?");
	imgsrc = srcwords[0];
	var d = new Date();
	var ms = d.getTime();
	last_ms = ms;
	var newsrc = imgsrc + "?" + ms;
	parent_img.src = newsrc;
}


function gerlach_equalize(t) {
	var img = document.getElementById('gerlach');
	img.src = 'http://blackrockdesert.org/current/images/camera/gerlach-equalized.jpg' + '?' + last_ms;
}

function gerlach_unequalize(t) {
	var img = document.getElementById('gerlach');
	img.src = 'http://blackrockdesert.org/current/images/camera/gerlach.jpg' + '?' + last_ms;
}

// -----------------

var state_needinit = 0;
var state_loading = 1;
var state_animating = 2;
var state_paused = 3;

var targets = [];

var diffs = [];

function flip(which)
{
    if (targets[which].animstate != state_animating) { return; }
    
    var i = targets[which].i;
    var n = targets[which].n;

    if (i > n) {
        targets[which].i = 0;
        setTimeout(targets[which].flipp, 1000); // end-of-animation pause

    } else {
        document.getElementById(which+"_status").innerHTML = targets[which].images[i].ymdhm_dash;
        var src = targets[which].images[i].src;
        if (which == "playacam" || which == "cowcam" || which == "half") {
            if (targets[which].images[i].width == 320) { // so that missing minutes do not blank the display
                document.getElementById(which+"_img").src = src;
            }
        } else {
            document.getElementById(which+"_img").src = src;
        }
        targets[which].i += 1;
        setTimeout(targets[which].flipp, targets[which].interval);
    }
}

var t1 = [];
t1.dir = "/playacam/tmp";
t1.orig = "playacam-rotated.jpg";
t1.n = 20;
t1.i = 0;
t1.interval = 100;
t1.start_ms = 0;
t1.end_ms = 0;
t1.animstate = state_needinit;
t1.need_retarget = 0;
t1.flipp = function() { flip("playacam"); };
targets.playacam = t1;

var t2 = [];
t2.dir = "/cowcam/tmp";
t2.orig = "cowcam.jpg";
t2.n = 20;
t2.i = 0;
t2.interval = 100;
t2.start_ms = 0;
t2.end_ms = 0;
t2.animstate = state_needinit;
t2.need_retarget = 0;
t2.flipp = function() { flip("cowcam"); };
targets.cowcam = t2;

var t3 = [];
t3.dir = "/current/images/vis/tmp";
t3.orig = "latest.png";
t3.offset = 0;
t3.n = 4;
t3.i = 0;
t3.interval = 100;
t3.start_ms = 0;
t3.end_ms = 0;
t3.animstate = state_needinit;
t3.need_retarget = 0;
t3.flipp = function() { flip("vis"); };
targets.vis = t3;

var t4 = [];
t4.dir = "/current/images/radar/krgx";
t4.orig = "krgx-standard-140.gif";
t4.offset = 0;
t4.n = 4;
t4.i = 0;
t4.interval = 100;
t4.start_ms = 0;
t4.end_ms = 0;
t4.animstate = state_needinit;
t4.need_retarget = 0;
t4.flipp = function() { flip("krgx"); };
targets.krgx = t4;

var t5 = [];
t5.dir = "/current/images/radar/pacnw";
t5.orig = "pacnw-standard-140.gif";
t5.offset = 0;
t5.n = 4;
t5.i = 0;
t5.interval = 100;
t5.start_ms = 0;
t5.end_ms = 0;
t5.animstate = state_needinit;
t5.need_retarget = 0;
t5.flipp = function() { flip("pacnw"); };
targets.pacnw = t5;

var t6 = [];
t6.dir = "/playacam/half/archive";
t6.orig = "latest-half.jpg";
t6.offset = 0;
t6.n = 30;
t6.i = 0;
t6.interval = 100;
t6.start_ms = 0;
t6.end_ms = 0;
t6.animstate = state_needinit;
t6.need_retarget = 0;
t6.flipp = function() { flip("half"); };
targets.half = t6;

var aImg = [];
var ip = null;

function refresh(t) {
	var id = t.id;
	var words = id.split("_");
	var which = words[0];
	var target = targets[which];
	var img = document.getElementById(which+"_img");
	var d = new Date();
	var ms = d.getTime();
	var f = target.dir + "/" + target.orig + "?" + ms;
    img.src = f;
}

function debug(x) { var o = document.getElementById("debug"); if (o) { o.innerHTML = x; } }

function mk_md(d)
{
        var mon = d.getMonth() + 1; if (mon < 10) { mon = "0"+mon; }
        var day = d.getDate(); if (day < 10) { day = "0"+day; }
        return ""+mon+""+day;
}

function mk_hm(d)
{
        var h = d.getHours(); if (h < 10) { h = "0"+h; }
        var m = d.getMinutes(); if (m < 10) { m = "0"+m; }
        return ""+h+""+m;
}

function mk_ymdhm(t)
{
        var d = new Date();
        d.setTime(t);
        return "" + d.getFullYear() + "/" + mk_md(d) + "/" + mk_hm(d);
}

function getHM_ms(x)
{
        var o = document.getElementById(x);
        if (!o) { alert("missing element: " + x); return 0; }
        var t = o.innerHTML;
        var s = t.split(":");
        var d = new Date();
        d.setHours(s[0]);
        d.setMinutes(s[1]);
        d.setSeconds(0);
        return d.getTime();
}

function setFrame(which,x)
{
        var target = targets[which];

        target.animstate = state_paused;
        document.getElementById(which+"_a").innerHTML = "animate";
        
        var timestamps, year, md, hm, nstamps;
        

        if (which == "playacam" || which == "cowcam" || which == "half") {
            var t = target.end_ms;
            if (x == "start") { t = target.start_ms; }
            var ymdhm = mk_ymdhm(t);
            document.getElementById(which+"_img").src = target.dir + "/" + ymdhm + ".jpg";
            document.getElementById(which+"_status").innerHTML = ymdhm.replace(/\//g,"-");

        } else if (which == "krgx") {
                        
            if (!(target.timestamps_year)) {
                timestamps = document.getElementById("krgx_files").innerHTML.split(" ");
                target.timestamps_year = timestamps.shift();
                target.timestamps_md = timestamps.shift();
                target.timestamps = timestamps;
            }  

            year = target.timestamps_year;
            md = target.timestamps_md;
        
            timestamps = target.timestamps;
            nstamps = timestamps.length;

            if (x == "start") {
                target.offset -= 1;
            } else {
                target.offset += 1;
            }
 
            if (target.offset < 0) { target.offset = 0; }
            if (target.offset >= nstamps) { target.offset = nstamps - 1; }

            hm = timestamps[target.offset];

            document.getElementById(which+"_img").src = target.dir + "/" + year + "/" + md + "/" + hm + ".gif";
            document.getElementById(which+"_status").innerHTML = "" + year + "-" + md + "-" + hm;

        } else if (which == "vis") {
                        
            if (!(target.timestamps_year)) {
                timestamps = document.getElementById("vis_files").innerHTML.split(" ");
                target.timestamps_year = timestamps.shift();
                target.timestamps_md = timestamps.shift();
                target.timestamps = timestamps;
            }  

            year = target.timestamps_year;
            md = target.timestamps_md;
        
            timestamps = target.timestamps;
            nstamps = timestamps.length;

            if (x == "start") {
                target.offset -= 1;
            } else {
                target.offset += 1;
            }
 
            if (target.offset < 0) { target.offset = 0; }
            if (target.offset >= nstamps) { target.offset = nstamps - 1; }

            hm = timestamps[target.offset];

            document.getElementById(which+"_img").src = target.dir + "/" + year + "/" + md + "/" + hm + "G11I01.png";
            document.getElementById(which+"_status").innerHTML = "" + year + "-" + md + "-" + hm;

        } else {
            document.getElementById(which+"_img").src = target.dir + "/.gif";
            alert("setFrame: " + which + " not implemented yet");
        }

        target.need_retarget = 1;
}

var startt = "start";
var endt = "end";

var playacam = "playacam";
var cowcam = "cowcam";
var krgx = "krgx";
var vis = "vis";
var half = "half";

function setButtons(which)
{
    var b = "";
    
    if (which == "krgx" || which == "vis") {
        b += "<br/>";
    } else {
        b += "&nbsp;/";
    }

    b += "<a href=javascript: onclick=intervalPlus("+which+")>&nbsp;-</a>";
    b += "speed";
    b += "<a href=javascript: onclick=intervalMinus("+which+")>+&nbsp;</a>";

    b += "/";

    b += "<a href=javascript: onclick=framesMinus("+which+")>&nbsp;-</a>";
    b += "frames";
    b += "<a href=javascript: onclick=framesPlus("+which+")>+&nbsp;</a>";

    if (which == "krgx" || which == "vis") {
        b += "<br/>";
    } else {
        b += "/";
    }
    
    if (which != "krgx" && which != "vis") {

    b += "<a href=javascript: onclick=Minus("+which+",startt,60)>- </a>";
    b += "<a href=javascript: onclick=Minus("+which+",startt,10)>- </a>";
    b += "<a href=javascript: onclick=Minus("+which+",startt,1)>- </a>";
    b += "start";
    b += "<a href=javascript: onclick=Plus("+which+",startt,1)>+</a>";
    b += "<a href=javascript: onclick=Plus("+which+",startt,10)>+</a>";
    b += "<a href=javascript: onclick=Plus("+which+",startt,60)>+</a>";        

    b += "/";

    b += "<a href=javascript: onclick=Minus("+which+",endt,60)>- </a>";
    b += "<a href=javascript: onclick=Minus("+which+",endt,10)>- </a>";
    b += "<a href=javascript: onclick=Minus("+which+",endt,1)>- </a>";
    b += "end";
    b += "<a href=javascript: onclick=Plus("+which+",endt,1)>+</a>";
    b += "<a href=javascript: onclick=Plus("+which+",endt,10)>+</a>";
    b += "<a href=javascript: onclick=Plus("+which+",endt,60)>+</a>";
    
    }

    document.getElementById(which+"_buttons").innerHTML = b;
}

function intervalMinus(which) { var t = targets[which]; t.interval -= 10; if (t.interval < 0) { t.interval = 0; } setButtons(which); }
function intervalPlus(which) { var t = targets[which]; t.interval += 10; setButtons(which); }

function framesMinus(which) { var t = targets[which]; t.n -= 1; if (t.n < 1) { t.n = 1; }  setButtons(which); setFrame(which,"start"); }
function framesPlus(which) { var t = targets[which]; t.n += 1; setButtons(which); setFrame(which,"start"); }

function Minus(which,w,m) {
    var t = targets[which];
    var d = m * 60000; 
    if (w == "start") { t.start_ms -= d; } else { t.end_ms -= d; } 
    setButtons(which); 
    setFrame(which,w);
}

function Plus(which,w,m) { 
    var t = targets[which]; 
    var d = m * 60000; 
    if (w == "start") { t.start_ms += d; } else { t.end_ms += d; } 
    setButtons(which); 
    setFrame(which,w); 
}

function onPreload(aImages, which)
{
    var target = targets[which];

    target.images = [];
    
    var pat = target.dir + "/";
    var re = new RegExp(pat, 'gi');

    for (var i = 0; i < aImages.length; i++) {

        var s = aImages[i].source;    
        var ymdhm;
        
        if (which == "krgx") {
            ymdhm = s.replace(re,"").replace(/.gif/,"");
        
        } else if (which == "vis") {
            ymdhm = s.replace(re,"").replace(/G11I01.png/,"").replace(/090216/,"");

        } else if (which == "half") {
            ymdhm = aImages[i].source.replace(re,"").replace(/.jpg/,"");
                    
        } else {
            ymdhm = aImages[i].source.replace(re,"").replace(/.jpg/,"");
        }

        target.images[i] = aImages[i];
        target.images[i].ymdhm = ymdhm;
        target.images[i].ymdhm_dash = ymdhm.replace(/\//g, "-");
    }
    
    document.getElementById(which+"_img").alt = "";

    target.animstate = state_animating;
    document.getElementById(which+"_a").innerHTML = "pause";
    setButtons(which);
    setTimeout(target.flipp, 50);
}

function reTarget(which)
{
    var target = targets[which];
    
    var length_ms = target.end_ms - target.start_ms;
    var n = target.n;
    var step_ms = length_ms / n;
    var i;
    
    var timestamps, year, md, nstamps;
    
    aImg = []; // new Array();
    
    if (which == "playacam" || which == "cowcam" || which == "half") {
        for (i = 0; i <= n; i++) {
            aImg.push(target.dir + "/" + mk_ymdhm(target.start_ms + (i * step_ms)) + ".jpg");
        }
    } else if (which == "krgx") {
    
        if (!(target.timestamps_year)) {
            timestamps = document.getElementById("krgx_files").innerHTML.split(" ");
            target.timestamps_year = timestamps.shift();
            target.timestamps_md = timestamps.shift();
            target.timestamps = timestamps;
        }  

        year = target.timestamps_year;
        md = target.timestamps_md;

        timestamps = target.timestamps;
        nstamps = timestamps.length;

        // xxx check bounds
        for (i = 0; i <= n; i++) {
            aImg.push(target.dir + "/" + year + "/" + md + "/" + timestamps[nstamps-1-(n-i)] + ".gif");
        }
        
    } else if (which == "vis") {
    
        if (!(target.timestamps_year)) {
            timestamps = document.getElementById("vis_files").innerHTML.split(" ");
            target.timestamps_year = timestamps.shift();
            target.timestamps_md = timestamps.shift();
            target.timestamps = timestamps;
        }  

        year = target.timestamps_year;
        md = target.timestamps_md;

        timestamps = target.timestamps;
        nstamps = timestamps.length;

        // xxx check bounds
        for (i = 0; i <= n; i++) {
            aImg.push(target.dir + "/" + year + "/" + md + "/" + timestamps[nstamps-1-(n-i)] + "G11I01.png");
        }
        

    } else {
        alert("reTarget: " + which + " unimplemented");
        return;
    }

    ip = new myImagePreloader(aImg, onPreload, which);
}

function animate(t) {

    var id = t.id;

    var which = id;
    which = id.replace(/_a/, "");
    var target = targets[which];

    if (target.animstate == state_needinit) {
        target.animstate = state_loading;

        document.getElementById(id).innerHTML = "loading";

        var rise_ms = getHM_ms("sunrise");
        var set_ms = getHM_ms("sunset");
        var now = new Date();
        var now_ms = now.getTime();

        if (now_ms < rise_ms) { // display yesterdays loop
            target.start_ms = rise_ms - (86400 * 1000);
            target.end_ms = set_ms - (86400 * 1000);
        
        } else if (now_ms >= rise_ms && now_ms <= set_ms) { // display today so far, or currently: the last n minutes
            target.end_ms = now_ms;
            target.end_ms -= 60000; // minus 1 minute
            target.start_ms = target.end_ms - (target.n * 60000); // rise_ms;

        } else { // display today
            target.start_ms = rise_ms;
            target.end_ms = set_ms;
        }

        reTarget(which);
        return;
    }

    if (target.animstate == state_animating) {
        document.getElementById(id).innerHTML = "animate";
        target.animstate = state_paused;
        return;
    }
  
    if (target.animstate == state_paused) {
        document.getElementById(id).innerHTML = "pause";
        target.animstate = state_animating;
        setButtons(which);
        if (target.need_retarget) { target.need_retarget = 0; reTarget(which); } else { setTimeout(target.flipp, 50); }
        return;
    }
    
    if (target.animstate == state_loading) {
        document.getElementById(id).innerHTML = "pause";
        target.animstate = state_animating;
        setButtons(which);
        setTimeout(target.flipp, 50);
    }

}


