
modCore.require('EInterfaces');
modCore.require('KShortcuts');
modCore.require('modCookies');
modCore.require('modCore');
modCore.require('modDOM');

jQuery.noConflict();
// extend jQuery
jQuery.fn.reverse = [].reverse;

/* prototype DATE object */
Date.prototype.displayTime = function (seconds) {

	var seconds = new Number(parseInt(seconds));
	var days    = parseInt(seconds / 86400);
	var hours   = parseInt((seconds % 86400) / 3600);
	var minutes = parseInt((seconds % 3600) / 60);
	var seconds = parseInt(seconds % 60);
	switch (days) {
    	case 0  : days = ""; break;
    	case 1  : days = "1 Tag "; break;
    	default : days += " Tage "; break; }

	hours   = (hours < 10) ? "0" + new String(hours) : new String(hours);
	minutes = (minutes < 10) ? "0" + new String(minutes) : new String(minutes);
	seconds = (seconds < 10) ? "0" + new String(seconds) : new String(seconds);

	return days+hours+":"+minutes+":"+seconds;
	};


Date.prototype.getMicrotime = function () {

	return (this.getTime() / 1000);
	};

Array.prototype.unset = function (index) {
	this.splice(index, 1);
	};
Array.prototype.unique = function() {
	var o = {};
	for(var xx=this.length-1; xx>=0; xx--) {
		if (!o[this[xx]]) {
			o[this[xx]] = true;
			continue; }
		this.unset(xx);
		}
	};
Array.prototype.hasValue = function (value) {
	for(var xx=0;xx<this.length; xx++) {
		if (this[xx] == value) { return true; }
		}
	return false;
	};

String.prototype.ucFirst = function () {
	return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
	};

var DataTable = {
    parseColumnIndex : function(headRow) {
		var columns = [];
		jQuery("td,th", headRow).each(function(xx) {
		    columns[xx] = -1;
		    if (this.id.substr(0, 4) != 'col:') { return true; }
		    columns[xx] =  this.id.replace(/^col\:/, "");
		    });
		return columns;
    	},
    parseColumnNames : function(headRow) {
		var columns = {};
		jQuery("td,th", headRow).each(function(xx) {
		    if (this.id.substr(0, 4) != 'col:') { return true; }
		    columns[this.id.replace(/^col\:/, "")] = xx;
		    });
		return columns;
    	}
	};


function $TableRow(length, text, tagName) {
    var row = document.createElement("tr");
    var length = length || 0;
    var tagName = tagName || 'td';
    var text = text || "\u00a0";
    for (var xx=0; xx<length; xx++) {
        var cell =document.createElement(tagName);
        cell.appendChild(document.createTextNode(text));
        row.appendChild(cell);
        }
    return row;
    }

/* base Entity class */
$Entity = function(object) {

	if (window == this) { return new $Entity(object); }
	this.prototype = $Entity.prototype;
	this.extend = function(object) {
  		for (var property in object) {
			if (typeof object[property] == undefined) { continue; }
    		this[property] = object[property];
    		}
		if (this.init && typeof this.init == "function") {
			this.init.apply(this); }

  		return this;
		};

	if (object) {
		return this.extend(object); }

	return this;
	};


/* Helper class for the display */
$Display = new $Entity().extend({
	imagePath : '../themes/classic/grafik/',
	init : function () {
		if (!window.$EInterfaces) {
			return modCore.execOnLoad("EInterfaces", this.init, this); }
		$EInterfaces.register('toggleSection::*', this.toggleSection);
    	},
	displayTime : function (seconds) {

    	var seconds = parseInt(seconds);
    	var days    = parseInt(seconds / 86400);
    	var hours   = parseInt((seconds % 86400) / 3600);
    	var minutes = parseInt((seconds % 3600) / 60);
    	var seconds = parseInt(seconds % 60);
    	switch (days) {
        	case 0  : days = ""; break;
        	case 1  : days = "1 Tag "; break;
        	default : days += " Tage "; break; }

    	hours   = (hours < 10) ? "0" + new String(hours) : new String(hours);
    	minutes = (minutes < 10) ? "0" + new String(minutes) : new String(minutes);
    	seconds = (seconds < 10) ? "0" + new String(seconds) : new String(seconds);

    	return days+hours+":"+minutes+":"+seconds;
    	},
	getImagePath : function() {
		return $Display.imagePath;
		},
    numberFormat : function(numberValue) {
		var decimals = parseFloat(numberValue) - parseInt(numberValue);
        numberValue = new String(parseInt(numberValue)).replace(/ /,"");
        var strLength = numberValue.length;
        var formattedNumber = "";
        counter = 0;
        for (xx=strLength-1;xx>=0; xx--) {
            if (counter == 3) {
                counter = 0;
                formattedNumber = "." + formattedNumber; }
            formattedNumber = numberValue.substr(xx,1)+formattedNumber;
            counter++;
            }
		if (decimals != 0) { formattedNumber += "," + new String(decimals).replace(/^0\./, ""); }
        return formattedNumber;
        },
	refresh : function(scope) {
		$Communicator.sendCommand('Refresh', {
        	"Scope" : scope,
        	"PlanetID" : $("Player:CurrentPlanetID").className
        	} );
		},
	reload : function(ID,ID,target,event) {
		if (!jQuery('#Content').attr('class')) { return false; }
		if (event && event.preventDefault) { event.preventDefault(); }
		$Display.refresh(jQuery('#Content').attr('class'));
		},
	setText : function(element, text) {
		if (element && jQuery(element).text() != text) {
			jQuery(element).text(text); }
		},
	toggleSection : function(ElementID,ID,element) {
		var config = (jQuery(element).parents("tbody").find("tr:gt(0)").toggle().is(':visible')) ? 'visible' : 'hidden';
		var preferenced = jQuery(element).parents("tbody.preferenced");
		if (preferenced.size() == 1) {
    		var prefSection = new Array(preferenced.attr("class").match(/Preferences\[(.+)\]/)[1] || []).join('');
			Preferences.set(prefSection, preferenced.attr("id"), config);
		    }
		}
	});


var CheckboxManager = new $Entity().extend({
	_callback: [],
	init: function() {
		window.document.addEventListener('mousedown', this.handleEvent, true);
		},
	check: function(element)  {
		var count = CheckboxManager._callback.length;
		var check = true;
		for (var xx=0; xx<count; xx++) {
			var options = CheckboxManager._callback[xx]['options'] || null;
			if (options && options['selector'] && !jQuery(element).is(options['selector'])) { continue; }
			if (options && options['parents'] && !jQuery(element).parents(options['parents']).size()) { continue; }
			if (false === CheckboxManager._callback[xx]['callback'](element, true)) { check = false; } }
		if (!check) { return false; }
		jQuery(element).attr("checked", true).removeClass("checkbox").addClass("checkbox_checked");
		var checkboxControl = jQuery(element).find("input.checkbox_control");
		if (!checkboxControl.size() || !checkboxControl.attr("name") || 'radio' != checkboxControl.attr("type")) { return true; }
		checkboxControl.attr("_checked", "_checked");
		checkboxControl.attr("checked", "checked");
		jQuery(document.getElementsByName(checkboxControl.attr("name"))).each(function(xx) {
			var jQ = jQuery(this);
			if (jQ.attr("_checked") == "_checked") { jQ.removeAttr("_checked"); return true ;}
			if (jQ.parents(".checkbox_checked").size() == 0) { return true; }
			CheckboxManager.uncheck(jQ.parents(".checkbox_checked").get(0));
			});
		},
	handleEvent: function(event) {
		var event = modCore.getEvent(event);
		var evtTarget = event.target;
		if (!jQuery(event.target).is("[@class^='checkbox']")) { return true; }
		event.preventDefault();
		if (!jQuery(event.target).attr("checked")) {
			CheckboxManager.check(event.target); }
		else {
			CheckboxManager.uncheck(event.target); }
		},
	setCallback: function(callback, options)  {
		var count = CheckboxManager._callback.length;
		 CheckboxManager._callback[count] = { 'callback' : callback, 'options' : options };
		},
	uncheck: function(element)  {
		var count = CheckboxManager._callback.length;
		var check = true;
		for (var xx=0; xx<count; xx++) {
			var options = CheckboxManager._callback[xx]['options'] || null;
			if (options && options['selector'] && !jQuery(element).is(options['selector'])) { continue; }
			if (options && options['parents'] && !jQuery(element).parents(options['parents']).size()) { continue; }
			if (false === CheckboxManager._callback[xx]['callback'](element, false)) { check = false; } }
		if (!check) { return false; }
		jQuery(element).attr("checked", false).removeClass("checkbox_checked").addClass("checkbox");
		}
    });


$Communicator = {
	targetURL : "../communicator/communicator.php",

    buildQueryParam: function(args, prefix, query) {
        if (typeof $Communicator.buildQueryParam.level == "undefined") {
            $Communicator.buildQueryParam.path = [];
            $Communicator.buildQueryParam.level = -1; }
        $Communicator.buildQueryParam.level++;

        var level = $Communicator.buildQueryParam.level;

	    var query = query || "";
                for(var xx in args) {
		    if (args.prototype && args.prototype[xx]) {
                        continue; }	
		    var key = String(xx).replace(/=/g, "%26").replace(/&/g, "%3D");
                    $Communicator.buildQueryParam.path[level] = key;
			if (typeof args[xx] == 'function') {
				continue; }
			if (typeof args[xx] == 'object' || args[xx] instanceof Array) {
		        query = $Communicator.buildQueryParam(args[xx], '', query);
			continue; }

			if ('' != query) { query += "&"; }
                    key = '';
                    for (var i=0; i<=level;i++) {
                        var path = $Communicator.buildQueryParam.path[i];
                        if (i > 0) {
                            path = "[" + path + "]"; }
                        key = key + path;
                        }
			query += key+"="+encodeURIComponent(String(args[xx]).replace(/=/g, "%3D").replace(/&/g, "%26"));
			}
                $Communicator.buildQueryParam.level--;
		return query;
		},
    sendCommand : function(Command, args, sourceElement, async) {

		var async = (typeof async == "undefined") ? true : !!async;
		var query = $Communicator.buildQueryParam(args, '', "Command="+encodeURIComponent(Command));
        var Request = new modHttpRequest(this.targetURL);
        Request.open("POST", this.targetURL, async);
        Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        Request.onreadystatechange = function(Response) {
            if (Request.readyState == 4 && window.$Communicator && typeof window.$Communicator.parseResponse == "function") {
                $Communicator.parseResponse(Response.responseXML, sourceElement);
                }
            };
        Request.send(query);
        },
    parseResponse : function(Response, sourceElement) {

        var nodes = $A(Response.documentElement.childNodes);
		if (typeof sourceElement == "function") {
			sourceElement(Response); }
		for(var xx=0,count=nodes.length;xx<count;xx++) {
			element = nodes[xx];
            if (element.nodeType != 1) { continue; }
            var elementName = element.tagName;
            if (window[elementName] && typeof window[elementName] == "object" && typeof window[elementName]["handleResponse"] == "function") {
                window[elementName].handleResponse(element, sourceElement);
                }
            };
        }
    };


var Performance = new $Entity().extend({
    handleResponse : function(XMLDocument) {
		var p = $O(XMLDocument);
		jQuery("#execTime").text(" "+p.execTime);
		jQuery("#memUsage").text(" "+p.memUsage);
		jQuery("#dbQ").text(" "+p.dbQ);
		jQuery("#dbS").text(" "+p.dbS);
		jQuery("#dcG").text(" "+p.dcG);
		jQuery("#cUsage").text(" "+p.cUsage);
		jQuery("#rf").text(" "+p.rf); }
    });


var Error = new $Entity().extend({
    handleResponse : function(XMLDocument) {
		alert(jQuery("message", XMLDocument).text()); }
    });

var Message = new $Entity().extend({
    handleResponse : function(XMLDocument) {
		alert(jQuery("text", XMLDocument).text()); }
    });
