// Copyright 2008, Han-Kwang Nienhuys
// http://www.lagom.nl/lcd-test/

// uses lcdscript_xx.js (for en, zh, etc. language)

// general

function get_tm() // clock time in milliseconds
{
    var d = new Date();
    return d.getTime();
}

function hexgreycolor(c)
{
    var h = c.toString(16);
    if (c < 16)
	h = '0' + h;
    return '#' + h + h + h;
}


/// GIF animation

var rt_gif_active = 0;

function rt_gif_stop()
{
    var d = document;
    rt_gif_active = 0;
    d.getElementById('rt_gif_img').src = 'img/response_time_2_static.gif';
    d.getElementById('rt_gif_button').innerHTML = rt_msg['start test'];
}

function rt_gif_click()
{
    var d = document;
    if (rt_gif_active) {
	rt_gif_stop();
    } else {
	rt_gif_active = 1;
	// rt_stop_xxx();
	d.getElementById('rt_gif_img').src = 'img/response_time_2.gif'
	d.getElementById('rt_gif_button').innerHTML = rt_msg['stop test'];
    }
}

/// rolling xxx
var rtx_running = 0;
var rtx_t0 = 0;
var rtx_elfd; // document element for fdrop
var rtx_elimg; // image element
var rtx_framedrops = 0;
var rtx_fcount = 0, rtx_prevfcount = 0;
var rtx_lastfdupdate = 0;
var rtx_num = 60;
var rtx_step = 10;
var rtx_fgchex = '#fff', rtx_bghex = '#000';
var rtx_timer;


function rtx_stop()
{
    if (rtx_running) {
	rtx_running = 0;
	if (rtx_running == 1)
	    clearTimeout(rtx_timer);
	else
	    clearInterval(rtx_timer);
    }
}

var rt_debug = '';

function rtx_update()
{
    var max_time = 120*1000; // do not hog CPU; stop animation after this time (milliseconds) 
    if (!rtx_running)
	return;

    if (rtx_running == 1) { // first call
	rtx_running = 2;
	clearTimeout(rtx_timer);
	rtx_timer = setInterval(rtx_update, 12);
    }

    // current time
    t = get_tm(); // in msec
    rtx_fcount = Math.floor((t - rtx_t0)*0.06); // frame number, @ 60 Hz
    frameno = rtx_fcount % rtx_num;
    if (t >= rtx_t0 + max_time) {
	rtx_stop();
	return;
    }

    if (rtx_fcount != rtx_prevfcount) {
	// check dropped frames
	if (rtx_fcount >  rtx_prevfcount + 1)
	    rtx_framedrops += rtx_fcount - rtx_prevfcount - 1;

	// update display
	var left = '-' + (frameno*rtx_step) + 'px';
	rtx_elimg.style.left = left;

	// display drop counter every second
	if (rtx_fcount >= rtx_lastfdupdate + 60) {
	    var percent = Math.floor(0.5 + 100.0 * rtx_framedrops / (rtx_fcount - rtx_lastfdupdate));
	    if (percent >= 5) 
		rtx_elfd.innerHTML = '<strong>' + percent + '% (!!)</strong>';
	    else
		rtx_elfd.innerHTML = '' + percent + '%';
	    rtx_lastfdupdate = rtx_fcount;
	    rtx_framedrops = 0;
	}
	rtx_prevfcount = rtx_fcount;
    }
}


function rtx_start(bgcol, fgcol)
{
    if (rtx_running) {
	rtx_stop();
	setTimeout('rtx_start('+bgcol+','+fgcol+')', 100); // give browser time to do garbage collection
	return;
    }
    
    
    // make hex RGB strings
    rtx_bghex = hexgreycolor(bgcol);
    rtx_fghex = hexgreycolor(fgcol);
    
    // update colors
    document.getElementById('rtx_block').style.background = rtx_fghex;
    document.getElementById('rtx_cont').style.background = rtx_bghex;
    document.getElementById('rtx_cont2').style.background = rtx_bghex;
    document.getElementById('rtx_imgcont').style.background = rtx_bghex;
    document.getElementById('rtx_imgcont2').style.background = rtx_bghex;
    document.getElementById('rt_colvals').innerHTML = '' + bgcol + ' / ' + fgcol;

    // image element
    rtx_elimg = document.getElementById('rtx_img');
    rtx_elimg.style.left = '0px';
    var imgurl = 'img/rtx-' + bgcol + '-' + fgcol + '.png';
    rtx_elimg.src = imgurl;
    document.getElementById('rtx_img2').src = imgurl;
    

    rtx_elfd = document.getElementById('rt_framedrop_val');
    rtx_elfd.innerHTML = '-';
    
    // start
    rtx_running = 1;
    rtx_prevfcount = -1;
    rtx_framedrops = 0;
    rtx_lastfdupdate = 0; // frame counter for last fdrop update
    rtx_t0 = get_tm() + 100;
    rtx_timer = setTimeout(rtx_update, 100); // give 100 msec to refresh screen
}


/////////////// input lag test //////////////////

var rt_ilag_running = 0;
var rt_ilag_t0 = 0;
var rt_ilag_tprev = 0;
var rt_ilag_elm;
var rt_ilag_dropcount = 0;
var rt_ilag_lastfdupd = 0;
var rt_ilag_prev_fnum = 0;
var rt_ilag_timer;

function rt_ilag_stop()
{
    if (rt_ilag_running) {
	rt_ilag_running = 0;
	clearTimeout(rt_ilag_timer);
    }
    
    document.getElementById('ilag_button').innerHTML = rt_msg['start test'];
    document.getElementById('rt_ilag').innerHTML = rt_msg['ready'];
}

function rt_ilag_start()
{
    if (rt_ilag_running) {
	rt_ilag_running = 0;
	rt_ilag_timer = setTimeout(rt_ilag_start, 100); // prevent race conditions
	return;
    }
    
    document.getElementById('ilag_button').innerHTML = rt_msg['stop test'];
    rt_ilag_elm = document.getElementById('rt_ilag');
    rt_ilag_elmfd = document.getElementById('rt_framedrop_val');
    rt_ilag_dropcount = 0;
    rt_ilag_running = 1;
    rt_ilag_t0 = get_tm()+100;
    rt_ilag_lastfdupd = 0;
    rt_ilag_prev_fnum = -1;
    rt_ilag_timer = setTimeout(rt_ilag_update, 100);
}

function rti_col(bg, fg)
{
    var hbg = hexgreycolor(bg);
    var hfg = hexgreycolor(fg);
    var el = document.getElementById('rt_ilag');
    el.style.color = hfg;
    el.style.background = hbg;

}

function rt_ilag_click()
{
    if (rt_ilag_running)
	rt_ilag_stop();
    else
	rt_ilag_start();
}

function rt_ilag_update()
{
    if (!rt_ilag_running)
	return;
    
    var t = get_tm();

    // don't hog the CPU
    if (t > rt_ilag_t0 + 120000) {
	rt_ilag_stop();
	return;
    }
    var fnum = Math.floor((t - rt_ilag_t0)*0.060);

    // update stopwatch
    var elt = (t - rt_ilag_t0)*0.001;
    var fnum_1 = fnum % 60;
    if (fnum_1 < 10)
	fnum_1 = '0' + fnum_1;
    rt_ilag_elm.innerHTML = '' + elt.toFixed(3) + ' s &nbsp;[' + fnum_1 + ']';

    // check dropped frames (assuming 60 Hz)
    if (fnum - rt_ilag_prev_fnum > 1)
	rt_ilag_dropcount += (fnum - rt_ilag_prev_fnum - 1);
    rt_ilag_prev_fnum = fnum;

    if (fnum >= rt_ilag_lastfdupd + 60) {
	var percent = Math.floor(0.5+100.0 * rt_ilag_dropcount / (fnum - rt_ilag_lastfdupd));
	if (percent >= 5)
	    rt_ilag_elmfd.innerHTML = '<strong>' + percent + '%</strong>';
	else
	    rt_ilag_elmfd.innerHTML = '' + percent + '%';
	rt_ilag_lastfdupd = fnum;
	rt_ilag_dropcount = 0;
    }

    rt_ilag_timer = setTimeout(rt_ilag_update, 13);
    
}

