/*

  Generic functions for registering listeners to JavaScript events.

  Now at version 1.1 - it's possible to assign listeners to newly
  created element objects

*/


/*

   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];
                tagListeners.assignListenersToElement(htmlElementObject);
            };
        };
    }
}

window.addOnLoadListener(tagListeners.assignListenersToTags);

tagListeners.assignListenersToElementsBelow = function(startElement) {
  if(! startElement) {
    return false;
  };
  if(! startElement.childNodes) {
    return false;
  }
  for(var i = 0; i < startElement.childNodes.length ; i++) {
    var childElement = startElement.childNodes[i];
    if(! childElement.tagName) {
      continue;
    };
    tagListeners.assignListenersToElement(childElement);
    if(childElement.childNodes) {
      tagListeners.assignListenersToElementsBelow(childElement);
    }

  };

};

// BE CAREFUL!!! ALREADY ASSIGNED LISTENERS GET OVERWRITTEN!!!
tagListeners.assignListenersToElement = function(elementObject) {
  if(! elementObject) {
    return false;
  };
  if(! elementObject.tagName) {
    return false;
  };
  var tagNameWanted = elementObject.tagName.toLowerCase();
  // console.log(tagListeners.listeners[tagNameWanted]);
  // console.log(tagListeners);
  // console.log('tags toewijzen aan element ', elementObject, ' met tag ',tagNameWanted);
  for(var eventName in tagListeners.listeners[tagNameWanted]) {
    // console.log('We doen event ', eventName);
    elementObject[eventName] = function(eventObject) {
        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  );
        };
    };
  };
}


