EventHandler = function () {
}
EventHandler.prototype.predefined = ['abort','blur','change','click','dblclick','error','focus','keydown','keypress','keyup','load','mousedown','mousemove','mouseout','mouseover','mouseup','reset','select','submit','unload'];
EventHandler.prototype.addLoadEvent = function (func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }
    }
}

EventHandler.prototype.addEvent = function ( obj, type, fn ) {
    if (!this.predefined.inArray(type)) {
        obj["on"+type+fn] = fn;
        var oldevent = obj['on'+type];
        if (typeof obj['on'+type] != 'function') {
            obj['on'+type] = obj["on"+type+fn];
        } else {
            obj['on'+type] = function() {
                if (oldevent) {
                    oldevent();
                }
                if (typeof obj["on"+type+fn] == 'function')
                    obj["on"+type+fn]();
            }
        }
    }
    if (type == 'mousewheel') {
        var handle = this.buildWheelHandler(obj, fn);
    } else {
        var handle = fn;
    }
    if (obj.addEventListener) {
        if (type == 'mousewheel') type = 'DOMMouseScroll';
        obj.addEventListener( type, handle, false );
    } else if (obj.attachEvent) {
        obj["e"+type+handle] = handle;
        obj[type+handle] = function() { obj["e"+type+handle]( window.event ); }
        obj.attachEvent( "on"+type, obj[type+handle] );
    }
}

EventHandler.prototype.buildWheelHandler = function (obj, fn) {
    var handle = function (e, func) {
        var delta = 0;
        e = e || window.event;
        if (e.wheelDelta) { /* IE/Opera. */
                delta = e.wheelDelta/120;
                /** In Opera 9, delta differs in sign as compared to IE.
                 */
                if (window.opera)
                        delta = -delta;
        } else if (e.detail) { /** Mozilla case. */
                /** In Mozilla, sign of delta is different than in IE.
                 * Also, delta is multiple of 3.
                 */
                delta = -e.detail/3;
        }
        if (e.preventDefault)
            e.preventDefault();
        else
            window.event.returnValue = false;
        func.call(obj, delta);
    };
    var wrapper =  function (e) {
        e = e || window.event;
        handle.call(obj, e, fn);
    };
    return wrapper;
}

EventHandler.prototype.removeEvent = function ( obj, type, fn ) {
    if (!this.predefined.inArray(type)) {
        if (typeof obj["on"+type+fn] == 'function') {
            obj["on"+type+fn] = undefined;
            obj["on"+type] = undefined;
        }
    }
    if (obj.removeEventListener) {
        if (type == 'mousewheel') type = 'DOMMouseScroll';
        obj.removeEventListener( type, fn, false );
    } else if (obj.detachEvent) {
        obj.detachEvent( "on"+type, obj[type+fn] );
        obj[type+fn] = null;
        obj["e"+type+fn] = null;
    }
}


window.eventHandler = new EventHandler;