var timerTasksInterval = 1.0;
var lasttimeclientrunning = 0; // if the local webserver is running
var isclientrunningHysteresisInterval = 60000;
var timeoutClientAlive = 2000;
var timeoutTransaction = 20000;
var transactions = $H();
var timeStart = (new Date()).getTime();

function include_script(script_filename, scriptname) { // includes a remote script
    var html_doc = document.getElementsByTagName('body').item(0);
    if ($(scriptname)) { $(scriptname).remove() };
    html_doc.appendChild(new Element('script', { 'id': scriptname, 'language': 'javascript',
        'type': 'text/javascript', 'src': script_filename
    }));
}

function callbackisrunning() { lasttimeclientrunning = (new Date()).getTime() }

function callbackchannelfollowup(channel, status) {
    if (transactions.get(channel)) {
        transactions.set(channel, { timeCreated: transactions.get(channel).timeCreated, status: status });
    }
}

function createNewTransaction(channel, type) {
	if (lasttimeclientrunning == 0) {
		jQuery("#dialogdownload").dialog('open');
	} else if (transactions.keys().member(channel)) {
		alert('this channel is already being requested');
	} else {
		var i = Math.floor(Math.random() * 1000000);
		include_script('http://127.0.0.1:4001/' + channel + '/run' + type + '.html?unique=' + i, 'runscript');
		
		transactions.set(channel, { timeCreated: (new Date()).getTime(), status: 'Searching' });
	}
}
function checkTransactions() {
    transactions.each(function(trans) {
        if (/*trans.value.status == 'Connected' ||*/(new Date()).getTime() - trans.value.timeCreated > timeoutTransaction) {
            if (!(trans.value.status.length > 10 && trans.value.status.substring(0, 10) == 'Installing')) {
                transactions.unset(trans.key);
            }
        }
    });
}


function displayStatus() { // shows the channel request status in a div called StatusArea
    var isrunning = (new Date()).getTime() - lasttimeclientrunning < timeoutClientAlive + isclientrunningHysteresisInterval ||
                        (new Date()).getTime() - timeStart < 3000;
    
    if (transactions.size() == 0) { $('StatusArea').childElements().each(function(child) { child.remove() }) };
    transactions.each(function(trans) {
        if (!jQuery("#dialog").dialog('isOpen') && !(trans.value.status == 'Failed')) {
            jQuery("#dialog").dialog('open');
        }

        var msg = '';
        if (trans.value.status == 'Searching') {
            msg = 'Searching for channel ' + trans.key;
        } else if (trans.value.status == 'Connecting') {
            msg = 'Connecting to channel ' + trans.key
        } else if (trans.value.status == 'Connected') {
            msg = 'Connected to channel ' + trans.key + '!<br>Launching the media player'
        } else if (trans.value.status == 'Failed') {
            msg = 'Connection to channel ' + trans.key + ' failed'
		} else if (trans.value.status == 'NoPlayerInstalled') {
            msg = "You don't have any player. Please install SMPlayer."
        } else if (trans.value.status.length > 10 && trans.value.status.substring(0, 10) == 'Installing') {
            msg = 'Please wait while installing the media player'
        }

        $('dialogcontent').update('<p>' + msg + '</p>');
        var pos = 0;
        if (trans.value.status == 'Launched' || trans.value.status == 'Failed') {
            pos = 100
        } else if (trans.value.status.length > 10 && trans.value.status.substring(0, 10) == 'Installing') {
            var a = new Array();
            a = trans.value.status.split(',');
            pos = a[1];
        } else {
            pos = ((new Date()).getTime() - trans.value.timeCreated) / timeoutTransaction * 100
        }
        jQuery("#dialogprogressbar").progressbar('value', pos);

        if (!$('myStatus' + trans.key)) {
            var elt = new Element('div', { 'id': 'myStatus' + trans.key }).update(msg);
            $('StatusArea').appendChild(elt);
        } else {
            $('myStatus' + trans.key).update(msg);
        }

        // on s'occupe du ajax loader
        if (trans.value.status == 'Connected' && $('loader' + trans.key)) { $('loader' + trans.key).remove() }
        if ((trans.value.status == 'Connecting' || trans.value.status == 'Searching') && (!$('loader' + trans.key))) {
            $('myStatus' + trans.key).appendChild(new Element('img', { 'id': 'loader' + trans.key, 'src': 'images/ajax-loader-1.gif' }));
        }
    });
    if (isrunning) {
        $('nodetected').hide();
        transactions.each(function(trans) {
            var i = Math.floor(Math.random() * 1000000);
            include_script('http://127.0.0.1:4001/statusrequest?channel=' + trans.key + '&unique=' + i, 'statusrequest');
        });
    } else { // we don't check any further transaction
        $('nodetected').show();
    }
}

function programTimeSchedules() {
    jQuery.each(jQuery("div[id^='mytime']"), function() {
        //if (jQuery('#mytime')) {
        var i = this.id.indexOf('_');
        var channel = this.id.substring(i);
        var servertimeoffset = jQuery('#servertimeoffset' + channel).text();
        var timeoffset = ((-1) * (new Date()).getTimezoneOffset() - servertimeoffset) * 60 * 1000;
        var d = Date.parse(jQuery('#nextprogramtime' + channel).text());
        myDate = new Date();
        myDate.setTime(d + timeoffset);
        var minutes;
        if (myDate.getMinutes() < 10) {
            minutes = '0' + myDate.getMinutes().toString();
        } else {
            minutes = myDate.getMinutes().toString();
        };
        jQuery("#" + this.id).text(myDate.getHours() + ':' + minutes + ' : ' + jQuery('#programname' + channel).text());
        //}
    });
    jQuery.each(jQuery("div[id^='programtime']"), function() { // utilisé dans les channel details
        var servertimeoffset = jQuery('#servertimeoffset').text();
        var timeoffset = ((-1) * (new Date()).getTimezoneOffset() - servertimeoffset) * 60 * 1000;
        var d = Date.parse(this.title);
        myDate = new Date();
        myDate.setTime(d + timeoffset);
        var minutes;
        if (myDate.getMinutes() < 10) {
            minutes = '0' + myDate.getMinutes().toString();
        } else {
            minutes = myDate.getMinutes().toString();
        };
        jQuery("#" + this.id).text(myDate.getHours() + ':' + minutes);
    });
}

function doTasks() {
    var i = Math.floor(Math.random() * 1000000);
    if (lasttimeclientrunning == 0 || (new Date()).getTime() - lasttimeclientrunning > isclientrunningHysteresisInterval) {
        include_script('http://127.0.0.1:4001/isrunning?unique=' + i, 'isrunningscript');
    }
    displayStatus();
    checkTransactions();
    programTimeSchedules();
}

new PeriodicalExecuter(doTasks, timerTasksInterval);