/*

  Generic functions for registering listeners to JavaScript events.



*/


/*

   window.onload


*/   
window.onloadListeners = new Array();
window.addOnLoadListener = function(listener) {
    window.onloadListeners[window.onloadListeners.length] = listener;
}

window.onload=function() {
    for(var i = 0; i < window.onloadListeners.length ; i++) {
        var func = window.onloadListeners[i];
        func.call();
    };
};

window.onunload=function() {
    window.onloadListeners = [];
    tagListeners = [];
}

/* 

assign listeners to tags

*/
var tagListeners = new Object;
tagListeners.listeners = new Array();

tagListeners.addListenerForTag = function(tag, event, listener) {
    if(! tagListeners.listeners[tag]) {
        tagListeners.listeners[tag] = new Array();
    };

    if(! tagListeners.listeners[tag][event]) {
        tagListeners.listeners[tag][event] = new Array();
    };
    
    tagListeners.listeners[tag][event][tagListeners.listeners[tag][event].length] = listener;


};

/* 
  add a function to window.onload that assigns all listeners to all events assigned to tags
*/

/*

  CAUTION: Only works with events onevent (onclick, onmouseover, etc). for now.
*/
tagListeners.assignListenersToTags = function() {
    for(var tagName in tagListeners.listeners) {
        var tag = tagListeners.listeners[tagName];
        var elementsWithCurrentTag = document.getElementsByTagName(tagName);
        for(var eventName in tag) {
            for(var tagNo = 0 ; tagNo < elementsWithCurrentTag.length ; tagNo++) {
                var htmlElementObject = elementsWithCurrentTag[tagNo];
                htmlElementObject[eventName] = function(eventObject) {
                    var tagNameWanted = this.tagName.toLowerCase();
                    if(window.event) {
                       eventObject = window.event;
                       }
                    var eventNameWanted = eventObject.type;
                    if(! eventNameWanted.match(/^on/)) {
                        eventNameWanted = 'on' + eventNameWanted;
                    };
                    var eventListeners = tagListeners.listeners[tagNameWanted][eventNameWanted];
                    for(var i = 0; i < eventListeners.length; i++) {
                        var eventListener = eventListeners[i];
                        eventListener.call( this,eventObject  );

                    };
                };
            };
        };
    }
}

window.addOnLoadListener(tagListeners.assignListenersToTags);


