/*global eventHandler:true, window:true */
eventHandler = {
    allRegisteredEvents: [],
    registerEventListener: function registerEventListener(el, event, func) {
        eventHandler.allRegisteredEvents.push({el: el, event: event, func: func});
        if (typeof window.addEventListener === 'function') {
            el.addEventListener(event, func, false);
        } else {
            eventHandler.doWrapperFunc(el, event, func, true);
        }
    },
    unregisterEventListener: function unregisterEventListener(el, event, func) {

        if (typeof window.removeEventListener === 'function') {
            el.removeEventListener(event, func, false);
        } else {
            eventHandler.doWrapperFunc(el, event, func, false);
        }
    },
    doWrapperFunc: function doWrapperFunc(el, event, func, attach) {
        if (typeof el.evHandler === 'undefined') {
            el.evHandler = {};
        }
        if (el.evHandler.hasOwnProperty(event) === false) {
            el.evHandler[event] = [];
        }
        var evArr = el.evHandler[event],
            i,
            wrapperFunc;
        for (i = 0; i < evArr.length; i++) {
            if (evArr[i].func === func) {
                if (attach === false) {
                    el.detachEvent('on' + event, evArr[i].wrapperFunc);
                    evArr.splice(i, 1);
                }
                return;
            }
        }
        if (attach === false) {
            return;
        }

        wrapperFunc = function () {
            return func.apply(el, [window.event]);
        };
        
        evArr.push({
            func: func,
            wrapperFunc: wrapperFunc
        });
        
        el.attachEvent('on' + event, wrapperFunc);
    },
    stopPropagation: function (event) {
        if (typeof event === 'undefined' || typeof event.stopPropagation === 'undefined') {

            window.event.cancelBubble = true;
            return false;
        }

        event.stopPropagation();
        return false;
    },
    preventDefault: function preventDefault(event) {
        if (typeof event === 'undefined' || typeof event.preventDefault === 'undefined') {
            window.event.returnValue = false;
            return false;
        }

        event.preventDefault();
        return false;
    },
    unregisterAll: function unregisterAll(event) {
        var i, cEvent;
        for (i = 0; i < eventHandler.allRegisteredEvents.length; i++) {
            cEvent = eventHandler.allRegisteredEvents[i];
            
            eventHandler.unregisterEventListener(cEvent.el, cEvent.event, cEvent.func);
            delete cEvent.func;
        }
    }
};

eventHandler.registerEventListener(window, 'unload', eventHandler.unregisterAll);

// callback manager, use:
// onLayerUpdate.registerCallback(func1);
// then:
// onLayerUpdate.callback({var1: 'test'});

Function.prototype.andThen = function (g) {

    var f = this;

    return function (args) {
        f(args);
        g(args);
    };

};

function CBManager() {
    
    this.callback = function () { }; // overwrites with registerCallback

    this.registerCallback = function (callbackFunction) {
        this.callback = (this.callback).andThen(callbackFunction);
    };

}
