// generic addEvent and removeEvent functions
// These allow multiple handlers to be attached to the same event on the same object
// For example, having multiple onload handlers on the window object

// This code owes much to Dean Edwards: see http://dean.edwards.name/weblog/2005/10/add-event/

function addHandler(element, eventType, handler) {
    // first, get the element ready to deal with events
    element.eventHandlers = element.eventHandlers ? element.eventHandlers : {};
    if (!element.eventHandlers[eventType]) {
        element.eventHandlers[eventType] = {};
        if (element["on" + eventType]) {
            element.eventHandlers[eventType][0] = element["on" + eventType];
        }
        element["on" + eventType] = dispatchEvent;
    }
    if (!handler.__auros__id) {
        handler.__auros__id =  eventType + addHandler.__auros__id++;
    }
    element.eventHandlers[eventType][handler.__auros__id] = handler;
}
addHandler.__auros__id = 1;

function removeHandler(element, eventType, handler) {
    if (element.eventHandlers && element.eventHandlers[eventType]) {
        delete element.eventHandlers[eventType][handler.__auros__id];
    }
}

function dispatchEvent(e) {
    var returnValue = true;
    var event = e ? e : window.event;
    var eventHandlers = this.eventHandlers[event.type];
    for (var handler in eventHandlers) {
        this.__auros__handler = eventHandlers[handler];
        if (this.__auros__handler(event) === false) {
            returnValue = false;
        }
    }
    return returnValue;
}
