var EventHandler = function () {};
EventHandler.prototype.predefined = ['abort','blur','change','click','dblclick','error','focus','keydown','keypress','keyup','load','mousedown','mousemove','mouseout','mouseover','mouseup','mousewheel','reset','select','submit','unload'];
EventHandler.prototype.userDefinedEvents = [];

EventHandler.prototype.getEvent = function (e) {
    e = e || window.event;
    if (!e.preventDefault) {
        e.preventDefault = function () {
            this.returnValue = false;
        };
    }
    if (!e.stopPropagation) {
        e.stopPropagation = function () {
            this.cancelBubble = true;
        };
    }
    return e;
};

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 ) {
    var handle;
    if (!libArray.inArray(type, this.predefined)) {
        obj.userDefinedEvents = obj.userDefinedEvents || [];
        obj.userDefinedEvents["on"+type] = obj.userDefinedEvents["on"+type] || [];
        obj.userDefinedEvents["on"+type].push(fn);
        fn.registeredEventIndex = obj.userDefinedEvents["on"+type].length - 1;

        if (typeof obj['on'+type] != 'function') {
            obj['on'+type] = function (e) {
                var length = obj.userDefinedEvents['on'+type].length, i=0;
                for (i;i<length;i++) {
                    if (typeof obj.userDefinedEvents['on'+type][i] == 'function') {
                        obj.userDefinedEvents['on'+type][i](e);
                    }
                }
            };
        }
        return;
    }
    if (type == 'mousewheel') {
        handle = this.buildWheelHandler(obj, fn);
    } else {
        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 (!libArray.inArray(type,this.predefined)) {
        if (typeof obj.userDefinedEvents["on"+type][fn.registeredEventIndex] == 'function') {
            obj.userDefinedEvents["on"+type][fn.registeredEventIndex] = undefined;
        }
        return;
    }
    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;
    }
};

EventHandler.prototype.getKeyCode = function (e) {
    e = this.getEvent(e);
    var keyCode = e.which || e.keyCode;
    return keyCode;
};


window.eventHandler = new EventHandler();
