function Kernel(){

    function load(obj){
        obj();
    }

    function tick(){
        uptime = uptime + 1;
    }

    var cache = {};
    var uptime = 0;
    var clock = window.setInterval(tick, 1000);

    if(window.System === undefined){
        window.System = {
            clearError : function(){
                var domError = document.getElementById("error");
                for(var x = 0; x < domError.childNodes.length; x++){
                    domError.removeChild(domError.childNodes[x]);
                }
            },

            addCache : function(id,xmlResponse){
                cache[id] = xmlResponse;
            },

            clearCache : function(){
                cache = {};
            },

            getCached : function(id){
                if(cache[id] !== undefined && cache[id] !== "" && cache[id] !== null){
                    return cache[id];
                }
                return null;
            },

            clearForm : function(formElement){
                var element;
                for(var x = 0; x < formElement.elements.length; x++){
                    element = formElement.elements[x];
                    if(element.type !== "submit" && element.type !== "reset" && element.type !== "button"){
                        element.value = "";
                    }
                }
            },

            getFormData : function(formElement){
                var params = "";
                var element;
                for(var x = 0; x < formElement.elements.length; x++){
                    element = formElement.elements[x];
                    if(x > 0){
                        params += "&";
                    }
                    if (element.type != "button" && element.type != "reset" && element.type != "submit"){
                        params += formElement.elements[x].name + "=" + formElement.elements[x].value;
                    }
                }
                return params;
            },

            getUptime : function(){
                return uptime;
            },

            cloneNode : function(deep,object){
                var args = Array.prototype.slice.call(arguments);
                var clonedNode = object.cloneNode(true);
                var node;
                for(var x = 2; x < args.length; x++){
                    node = args[x];
                    if(typeof node === "object"){
                        for(var i in node){
                            if(object[a] !== "" && object[a] !== undefined){
                                clonedNode[i] = node[i];
                            }
                        }
                    }
                }
                for(var a in object){
                    if(object[a] !== "" && object[a] !== undefined){
                        clonedNode[a] = object[a];
                    }
                }
                return clonedNode;
            },

            replaceNode : function(replacementNode,originalNode){
                var parent = originalNode.parentNode;
                parent.replaceChild(replacementNode, originalNode);
                return replacementNode;
            },

            requestWithFormData : function(location,formElement,returnId){
                var sections = location.split(".");
                if (sections.length <= 1){
                    throw "Lassie";
                }
                var url = "/"+sections[0]+"/"+sections[1];
                returnId = (returnId !== undefined) ? returnId : location;
                var request = System.ajaxRequest(url,this.getFormData(formElement),returnId);
                request.send();
            },

            processForm : function(formElement,returnId,replace){
                this.processFormToUrl(formElement,formElement.id,returnId,replace);
            },

            processFormToUrl : function(formElement,id,returnId,replace){
                try{
                    var sections = id.split(".");
                    var params = "";
                    var element;
                    var disabled = [];
                    for(var x = 0; x < formElement.elements.length; x++){
                        element = formElement.elements[x];
                        if(x > 0){
                            params += "&";
                        }
                        if (element.type != "button" && element.type != "reset" && element.type != "submit"){
                            params += formElement.elements[x].name + "=" + formElement.elements[x].value;
                        }else{
                            disabled.push(element);
                            element.disabled = "disabled";
                        }
                        if(element.type == "password"){
                            element.value = "";
                        }
                    }
                    var request;
                    if (sections.length > 1){
                        returnId = (returnId === null || returnId === undefined) ? id : returnId;
                        request = System.ajaxRequest("/"+sections[0]+"/"+sections[1],params,returnId);
                        if(replace !== undefined && replace !== null){
                            request.setReturnLocation(returnId, replace);
                        }
                        request.addCallback(4,function(){
                            var node;
                            for(var x = disabled.length; x > 0; x--){
                                node = disabled.pop();
                                node.removeAttribute("disabled");
                            }
                        });
                        request.send();
                    }else{
                        //returnId = (returnId === null || returnId === undefined) ? id : returnId;
                        request = System.ajaxRequest(id,params,returnId);
                        if(replace !== undefined && replace !== null){
                            request.setReturnLocation(returnId, replace);
                        }
                        request.addCallback(4,function(){
                            var node;
                            for(var x = disabled.length; x > 0; x--){
                                node = disabled.pop();
                                node.removeAttribute("disabled");
                            }
                        });
                        request.send();
                    }
                }catch(e){
                    alert(e.toString());
                }
            },

            getEncapsulatingForm : function(obj){
                if(obj.nodeName === "FORM"){
                    return obj;
                }else{
                    return System.getEncapsulatingForm(obj.parentNode);
                }
            },

            isArray : function(obj){
                return obj.constructor == Array;
            }

        };
    }

    /**
     * Loading All System Classes
     *
     */


    try{
        load(Publisher);
        System.publish(window);
        System.publish(document);
        System.publish(document.body);

        load(Ajax);
        load(Browser);
        load(Console);
        load(Display);
        load(Frame);
        load(HtmlParser);
        load(Notifications);
        load(XmlParser);
        load(WindowManager);

        System.ajaxRequest(window.location).send();
    }catch(e){
        alert(e.toString());
    }
    return;

}


/**
 *  Strips all excess spaces from both ends of a string.
 *
 */
String.prototype.trim = function() {
    return this.replace(/^\s[\s+]|\s\s[\s+]|\s[\s+]$/g,"");
};

/**
 *  Strips all excess spaces from the start of a string.
 *
 */
String.prototype.ltrim = function() {
    return this.replace(/^\s+/,"");
};

/**
 *  Strips all excess spaces from the end of a string.
 *  
 */
String.prototype.rtrim = function() {
    return this.replace(/\s+$/,"");
};

/**
 *  Searchs an array for the provided value returning the index of the value.
 *  If no element is found containing the value then the index of -1 is returned.
 *
 *  @param varable any value to be compared
 */
Array.prototype.indexOf = function(value) {
    for(var i = 0; i < this.length; i++){
        if(value === this[i]){
            return i;
        }
    }
    return -1;
};

/**
 *  Emptys the array by walking through each node and removing it. 
 *
 *  @return True upon success and false upon failure
 */
Array.prototype.empty = function(){
    for(var i = this.length; i > 0; i--){
        this.pop();
    }
    if(this.length === 0){
        return true;
    }else{
        return false;
    }
};

/**
 * Removed the first instance of the element provided from current array.
 *
 * @param mix The instance to be removed
 * @return the orginal instance
 */
Array.prototype.removeInstanceOf = function(instance){
	var index = this.indexOf(instance);
	if(index > -1){
            var array = this.splice(index,1);
            var node = array[0];
            return node;
	}
	return null;
};

/**
 * Removes all instances of the element provided from the current array.
 *
 * @param mix The instance to be removed
 * @return the orginal instance
 */
Array.prototype.removeAllInstancesOf = function(instance){
	for(var i = 0; i < this.length; i++){
		if(instance === this[i]){
			this.splice(i, 1);
		}
	}
	return instance;
};


/*
                if(object.id !== undefined && object.id !== ""){
                    var origId = object.id;
                    var id = origId;
                    var count = 0;
                    while(document.getElementById(id) !== null){
                        id = origId + "_" + count;
                        count++;
                    }
                    clonedNode.id = id;
                }
 */
