
var modCore = { };

// Shortcurt for document.getElementsById()
function $(element) {
	if (element && element.nodeType == 1) return element;
	return (element) ? document.getElementById(element) || null : document.body;
    } /* end function $() */

function $A(iterable) {
    if (!iterable) return [];
    if (iterable.toArray) {
        return iterable.toArray(); }
	if (typeof iterable.length != "undefined") {
        var results = [];
        for (var xx=0, nums=iterable.length; xx< nums; xx++) {
            results.push(iterable[xx]); }
        return results;
        }
	var results = [];
	return results;
    }


function $E(name, content, attributes, styles) {

    if ((matches = name.match(/\.([^\.#]+)/))) {
        attributes = attributes || {};
        attributes['class'] = matches[1];
        name = name.replace(matches[0], ''); }
    if ((matches = name.match(/\#([^\.#]+)/))) {
        attributes = attributes || {};
        attributes['id'] = matches[1];
        name = name.replace(matches[0], ''); }
    var element = document.createElement(name);
    for (prop in attributes) {
        element.setAttribute(prop, attributes[prop]);
		if (prop == 'class') { // fix proplems of IE for the class attribute
			element.className = attributes[prop]; }
        }
    for (prop in styles) {
        element.style[prop] = styles[prop]; }
    if (!content) { return element; }
    if (typeof content == 'string') {
        element.appendChild(document.createTextNode(content)); }
    if (content && content.nodeType && content.nodeType == 1) {
        element.appendChild(content); }

    return element;
    }

function $O(element) {

    var O = { };
    if (!element && element.tagName) { return 0; }

    var childs = element.childNodes.length;
    for (var xx=0; xx < element.childNodes.length; xx++) {
        var node = element.childNodes[xx];
        if (node.nodeType != 1) { continue; }
		if (node.childNodes.length == 0) {
			O[node.tagName] = "";
			continue; }
		if (node.childNodes.length == 1 && (node.firstChild.nodeType == 3 || node.firstChild.nodeType == 4)) {
			O[node.tagName] = node.firstChild.data;
			continue; }

		O[node.tagName] = $O(node);
        }

    return O;
    }

var modCore = new function() {

	var modCoreObj = this;

    // private properties
    var jsPath = "";

    // search for including script-Element for this script
    var scriptElements = document.getElementsByTagName("SCRIPT");
    for (var xx=0, src, matches, countScriptElements=scriptElements.length; xx<countScriptElements; xx++) {
        if (!(src = scriptElements[xx].getAttribute("src"))) { continue; }
        if (!(matches = src.match(/^(.*\/)[^\/]+\/(modCore\.js)$/i))) { continue; }
        jsPath = matches[1]; break; }

	var loadManager = [];

	function scriptEvents () {
		this.onload = null;
		};

	// loads an external javascript file
    modCoreObj._onScriptLoad = function (obj) {
		if (obj.readyState && "complete" != obj.readyState && "loaded" != obj.readyState) { return false; }

		if (loadManager[obj.getAttribute("name")] && typeof loadManager[obj.getAttribute("name")].onload == "function") {
			var context = loadManager[obj.getAttribute("name")].context || obj;
//			if (loadManager[obj.getAttribute("name")].context)
			loadManager[obj.getAttribute("name")].onload.call(context, arguments);
			// remove event handler
			loadManager[obj.getAttribute("name")].onload = null;
			}
    	};

	// loads an external javascript file
    modCoreObj.execOnLoad = function (scriptName, func, context) {
		if (!loadManager[scriptName]) {
			loadManager[scriptName] = new scriptEvents(); }
		loadManager[scriptName].context = context;
		loadManager[scriptName].onload = func;
    	};


	// loads an external javascript file
    modCoreObj.loadScript = function (filename, className) {

		var URL = jsPath+filename;
		var className = className || filename;
		// if document.body does not exists, simply use document.write
		loadManager[className] = new scriptEvents();
        if ((typeof document.body == "undefined" || document.body === null) && false !== !!window.document.write && document.contentType && document.contentType.substr(0,11) != 'application') {
           	document.write('<script type="text/javascript" name="'+className+'" src="'+URL+'" onload="modCore._onScriptLoad(this);" onreadystatechange="modCore._onScriptLoad(this);"><'+'/script>');
			return loadManager[className];
            }

        // Opera before 9.x does not execute scripts append to DOM, so use an iframe-workaround
        if (window.opera) { // So manipulate reuse last SCRIPT-Element
            // Fix for Opera < 8
            var match = navigator.userAgent.match(/Opera\D+([\d.]+)/i);
            var version = parseFloat(match[1]);
            if (version < 9) {

				var scriptID = new Date().getTime();
                var IFrameName = "OperaScriptContainer" + scriptID;
                var ScriptName = "OperaScriptLoadDetector" + scriptID;
                document.body.innerHTML += '<iframe src="'+URL+'" name="'+IFrameName+'" id="'+IFrameName+'" style="position: absolute; top:-2000px;">empty</iframe>';

				var functionBody = 'var fDoc = document.frames["'+IFrameName+'"].document; if (!fDoc || !fDoc.body) { window.setTimeout('+ScriptName+', 100); return false; } if (!fDoc.body.firstChild || fDoc.body.firstChild.nodeType == "3" || fDoc.body.firstChild.tagName != "PRE") { return false; } var ScriptText = fDoc.body.firstChild.firstChild.nodeValue; document.getElementById("'+IFrameName+'").parentNode.removeChild(document.getElementById("'+IFrameName+'")); window.eval(ScriptText); ';
                window[ScriptName] = new Function(null, functionBody);

                window.setTimeout(window[ScriptName] , 20);
                return true;
                }

			// Opera 9.x
			}

        var newScript = document.createElement("script");
        newScript.type = "text/javascript";
        newScript.setAttribute("name", className);
		newScript.onreadystatechange = newScript.onload = function() {
			modCore._onScriptLoad(this);
			this.onload = null;
			newScript.onreadystatechange = null;
			}
        newScript.src = URL;
        document.getElementsByTagName("head")[0].appendChild(newScript);
		return loadManager[className];
		}; /** END function loadScript() **/

    modCoreObj.require = function(className) {
		return this.loadScript('classes/'+className+'.js', className);
    	};

    modCoreObj.getEvent = function(event) {

		var event = event;
        if ( typeof event == "undefined" ) {
            event = window.event; }
		if ( !event.target && event.srcElement ) {
            event.currentTarget = window.event.srcElement;
            event.target = window.event.srcElement; }
		if ( event.target.nodeType == 3 ) {
			event.target = event.target.parentNode; }
		if ( !event.relatedTarget && event.fromElement ) {
			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; }

        return event;
        };

    return modCoreObj;
    };

if (!window.addEventListener) {
	/**
	  simulating the DOM-Function addEventListener for the window-object
	  */

	function addEventHandler(eventname, listener, capturePhase) {

	    /** MSIE have attachEvent, if present use it **/
	    if (this.attachEvent) {
	        return this.attachEvent("on"+eventname, listener, capturePhase); }

	    var functionName = listener.toString().split('{')[0];
	    functionName = functionName.substr( 9, functionName.length-8);
	
	    if (!this["funcList"+eventname.toUpperCase()]) {
	        this["funcList"+eventname.toUpperCase()] = new Array(); }
	
	    index = this["funcList"+eventname.toUpperCase()].length;
	    this["funcList"+eventname.toUpperCase()][index] = listener;
	
	    functionBody = "for (xx=0; xx<this.funcList"+eventname.toUpperCase()+".length;xx++)";
	    functionBody += "  this.funcList"+eventname.toUpperCase()+"[xx]();";
	    functionBody += "  }";
	
	    this[eventname.toUpperCase()] = new Function("", functionBody);
	    this["on"+eventname.toLowerCase()] = eval(this[eventname.toUpperCase()]);
	    } /** addEventHandler **/

	window.addEventListener = addEventHandler;
	window.document.addEventListener = addEventHandler;
	}
