var APPLICATION_CONTEXT = {
    soundFile:"",
    foundForPlaysound: function(arg0, arg1) {
        // call legacy code
        playsound(arg0, arg1);
    },

    jxPling : function () {
        var value = "on";
        var playSound = getCookie("sound2");
        var soundOn = getCookie("sound");
        if (value == soundOn) {
            if (value == playSound) {
                var element = document.createElement("embed");
                element.setAttribute("src", this.soundFile);
                element.setAttribute("hidden", "true");
                element.setAttribute("autostart", "true");
                element.setAttribute("autoplay", "true");
                var pc = document.getElementById("playsoundarea");
                if (pc) {
                    pc.replaceChild(element, pc.firstChild);
                }
                setCookie("sound2", "off");
            }
        }
    },

    getSelectedLegues: function () {
        var tobeparsed = "";

        for (i = 0; document.forms.selection.length > i; i++) {
            if (document.forms.selection.elements[i].name == "selleague" && document.forms.selection.elements[i].checked && tobeparsed != "") {
                tobeparsed = tobeparsed + '_' + document.forms.selection.elements[i].value;
            }
            if (document.forms.selection.elements[i].name == "selleague" && document.forms.selection.elements[i].checked && tobeparsed == "") {
                tobeparsed = document.forms.selection.elements[i].value;
            }
        }
        return tobeparsed;
    },

    getSelectedGames: function () {
        var tobeparsed2 = "";

        for (i = 0; document.forms.selection.length > i; i++) {
            if (document.forms.selection.elements[i].name == "selgame" && document.forms.selection.elements[i].checked && tobeparsed2 != "") {
                tobeparsed2 = tobeparsed2 + '_' + document.forms.selection.elements[i].value.replace('event_', '');
            }
            if (document.forms.selection.elements[i].name == "selgame" && document.forms.selection.elements[i].checked && tobeparsed2 == "") {
                tobeparsed2 = document.forms.selection.elements[i].value.replace('event_', '');
            }
        }
        return tobeparsed2;
    }
};

function TableRenderer(args) {
    this.rootId = args.rootId;
    this.tz = args.tz;
    this.tzdir = args.tzdir || "EST";
    this.translationMap = args.translationMap || new Hash();
    this.compStyles = new Hash();
    this.docHandlers = [new RestoreStylesHandler(this)];
    this.elemHandlers = [
        new TimedElementsHandler('settime', this),
        new TranslationElementsHandler('translate', this),
        //new CalcTimeElementsHandler('[name="calctime"]', this),
        new PlingHandler('playsound', this)];

}
;

TableRenderer.prototype.tableElementUpdated = function(/*Element*/ elem) {
    this.elemHandlers.each(function (h) {
        h.handle(elem);
    });
    this.docHandlers.each(function (h) {
        h.handle();
    });

};

TableRenderer.prototype.renderRoot = function(txt) {
    return "<form name='selection'>" +
           "<table class='tableresult'><tr><td class='tl'></td><td class='tline'></td><td class='tr'></td></tr><tr><td class='ll'></td><td class='menu'>" +
           "<table><tr><td>" +
           txt +
           "</td></tr></table>" +
           "</td><td class='rl'></td></tr><tr><td class='bl'></td><td class='bline'></td><td class='br'></td></tr></table>" +
           "</form>";
};
TableRenderer.prototype.renderScrollRoot = function(txt) {
    return "<table class='tableresult'><tr><td>" + txt+ "</td></tr></table>";
};
/*Number*/
TableRenderer.prototype.getTzShift = function() {
    return this.tz;
};

/*String*/
TableRenderer.prototype.getTzCode = function() {
    return this.tzdir;
};

/*Map*/
TableRenderer.prototype.getTranslationMap = function() {
    return this.translationMap;
};

/*Map*/
TableRenderer.prototype.getTempStyles = function() {
    return this.compStyles;
};

var BasicHanler = function (/*TableRenderer*/ tableRenderer) {
    this.tableRenderer = tableRenderer;
};

BasicHanler.prototype.handle = function () {

};

var RestoreStylesHandler = function (/*TableRenderer*/ tableRenderer) {
    this.tableRenderer = tableRenderer;
};

RestoreStylesHandler.prototype.handle = function () {
    this.tableRenderer.restoreStyles();
};

//
// Hander base class
//

// arg fromat '[name="___"]'
var NamedElementHandler = function(/*String*/ elementName, /*TableRenderer*/ tableRenderer) {
    this.elementName = elementName;
    this.tableRenderer = tableRenderer;
};

NamedElementHandler.prototype.handle = function (/**/ elementId) {
	//below gets all elements in full page all the time
	//var ars = document.getElementsByName(this.elementName);
	//below crashes explorer every time even with no active games
	//var ars = $(elementId).select('[name="'+this.elementName+'"]');
	//var getelements by tag name
	 var ars =new Array();
   var inc = 0;
   var nbh = document.getElementsByName(this.elementName);
   for (var j = 0; j < nbh.length; j++) {
   	var testy = $(nbh[j]).descendantOf(elementId);
   	if(testy){
       ars[inc++] = nbh[j];
      }
    }
	

    this.onHandle(ars);
};

NamedElementHandler.prototype.filloutChildSpans = function (/*Element*/ parent, /*String*/ value) {
    var nbh = parent.childNodes;
    for (var j = 0; j < nbh.length; j++) {
        if (nbh[j].tagName == 'SPAN') {
            nbh[j].innerHTML = value;
        }
    }
};

NamedElementHandler.prototype.onHandle = function (/*Array*/ elements) {
    // abstract
};


var TimedElementsHandler = function(/*String*/ elementName, /*TableRenderer*/ tableRenderer) {
    this.elementName = elementName;
    this.tableRenderer = tableRenderer;
};

TimedElementsHandler.prototype = new NamedElementHandler();

TimedElementsHandler.prototype.convertTime = function (/*Number*/ time) {
    var tz = parseInt(this.tableRenderer.getTzShift(), 10);
    var x = parseInt(time, 10);
    var stringTime = new String(x);
    var first = new String(x).substring(0, 0);
    var second = new String(x).substring(1, 0);
    if (tz != 1) {
        if (first == "0") {
            x = parseInt(second);
        }
        x = x + tz - 1;
        if (x > 24) {
            x = x - 24;
        }
        if (x < 0) {
            x = x + 24;
        }

        stringTime = new String(x);
    }
    if (stringTime.length == 1) {
        stringTime = "0" + stringTime;
    }
    return stringTime;
};

TimedElementsHandler.prototype.onHandle = function (/*Array*/ elements) {
    for (var i = 0; i < elements.length; i++) {
        var value = this.convertTime(elements[i].getAttribute('value'));
        this.filloutChildSpans(elements[i].parentNode, value);
    }
};

var TranslationElementsHandler = function(/*String*/ elementName, /*TableRenderer*/ tableRenderer) {
    this.elementName = elementName;
    this.tableRenderer = tableRenderer;
};

TranslationElementsHandler.prototype = new NamedElementHandler();

TranslationElementsHandler.prototype.getTranslation = function (/*String*/ text) {
    var translText = this.tableRenderer.getTranslationMap().get(text);
    return translText || text;
};

TranslationElementsHandler.prototype.onHandle = function (/*Array*/ elements) {
    for (var i = 0; i < elements.length; i++) {
        var value = this.getTranslation(elements[i].getAttribute('value'));
        this.filloutChildSpans(elements[i].parentNode, value);
    }
};

var CalcTimeElementsHandler = function(/*String*/ elementName, /*TableRenderer*/ tableRenderer) {
    this.elementName = elementName;
    this.tableRenderer = tableRenderer;
    this._elements = [];
};

CalcTimeElementsHandler.prototype = new NamedElementHandler();

CalcTimeElementsHandler.prototype.onHandle = function (/*Array*/ elements) {
    for (var i = 0; i < elements.length; i++) {
        var vs = elements[i].getAttribute('value').split(',');
        var value = this.calculateTime(vs[0], vs[1], vs[2], parseInt(this.tableRenderer.getTzShift(), 10));
        this.filloutChildSpans(elements[i].parentNode, value);
    }
};

CalcTimeElementsHandler.prototype.rebuild = function(){
    this._elements = $(this.tableRenderer.rootId).select(this.elementName);
}


CalcTimeElementsHandler.prototype.hanldeAll = function(){
    this.onHandle(this._elements);
}

TableRenderer.prototype.persistStyle = function (/*String*/ elementId, /*String*/ styleMap) {
    var elementStyleMap = this.compStyles.get(elementId);

    if (!elementStyleMap) {
        elementStyleMap = new Hash();
    }
    this.compStyles.set(elementId, elementStyleMap.merge(styleMap));
};

TableRenderer.prototype.restoreStyles = function () {

    this.compStyles.each(function(pair) {
        var e = document.getElementById(pair.key);
        if (e) {
            pair.value.each(function(p) {
                e.style[p.key] = p.value;
            });
        }
    });

};

TableRenderer.prototype.expandcontent = function (cid) {
    var ds = (document.getElementById(cid).style.display != "block") ? "block" : "none";
    document.getElementById(cid).style.display = ds;
    var pair = new Hash();
    pair.set("display", ds);
    this.persistStyle(cid, pair);
};


var PlingHandler = function(/*String*/ elementName, /*TableRenderer*/ tableRenderer) {
    this.elementName = elementName;
    this.tableRenderer = tableRenderer;

};

PlingHandler.prototype = new NamedElementHandler();

PlingHandler.prototype.onHandle = function (/*Array*/ elements) {
    for (var i = 0; i < elements.length; i++) {
        var vs = elements[i].getAttribute('value').split(',');
        APPLICATION_CONTEXT.foundForPlaysound(vs[0], vs[1]);
    }
    APPLICATION_CONTEXT.jxPling();
};


// Move to glogal context as utility f-n
CalcTimeElementsHandler.prototype.calculateTime = function (logic, hours, minutes, tz) {
    var result = "";
    var delay = 0;
    var testy = minutes;
    var period = 0;

    if (logic == "100" || logic == "150" || logic == "200") {
        delay = 15;
        period = 45;
    } else {
        result = result + "&nbsp;"

    }
    if (period > 0) {
        var D = new Date;
        var DT = 2 * D.getTimezoneOffset() - (new Date(2004, 0)).getTimezoneOffset() - (new Date(2004, 6)).getTimezoneOffset();
        var dst = 0;
        if (DT >= 0) {
            dst = 2;
        } else {
            dst = 2;
        }
        if (this.tableRenderer.getTzCode() == 'EST') {
            if (tz > 1) {
                dst = (dst - tz) + 1;
            } else {
                dst = -2;
            }
        }
        var day_array = dayParam.split("/");
        var starttime = new Date(day_array[0], parseInt(day_array[1], 10) - 1, parseInt(day_array[2], 10));
        var timenow = new Date();

        starttime.setHours(hours); //8:00
        starttime.setMinutes(minutes);


        var curHour = timenow.getHours(); // + timenow.getTimezoneOffset() / 60
        if (this.tableRenderer.getTzCode() == 'EST') {
            //this should work for ovacion as well as they have tz = 1.
            curHour = timenow.getHours() - (tz - 1);

        } else {
            //for CET customers with tz dif from gmt this works:
            curHour = timenow.getHours() - (tz - 1);
        }

        timenow.setHours(curHour)
        //Get 1 minute in milliseconds
        var one_minute = 1000 * 60;
        var diff = Math.ceil((timenow.getTime() - starttime.getTime()) / (one_minute));

        if (diff > 0) {
            if (diff >= (period + 4) && diff < (period + delay)) { //ie 49
                result += " HT&nbsp;&nbsp;";
            } else    if (diff >= period && diff < (period + delay)) { //ie 45
                result += " " + period + "'+";
            }
            if (diff == (period + delay)) {
                result += " " + (period + 1) + "'&nbsp;&nbsp;";
            }
            if (diff > (period + delay)) {
                if ((diff - delay) > 90 && (logic == "100" || logic == "150" || logic == "200")) {
                    result += " 90'+";
                } else {
                    result += " " + (diff - delay) + "'&nbsp;&nbsp;";
                }
            }
            if (diff < (period)) {
                result += " " + (diff) + "'&nbsp;&nbsp;";
            }
        } else {
            result += " 1'&nbsp;&nbsp;";
        }
    }

    return result;
};