cms.core.event =
{
    virtualHandlers : new Object(),

    fire : function(element, eventName)
    {
        if (document.createEventObject)
        {
            var event = document.createEventObject();
            return element.fireEvent("on" + eventName, event);
        }
        var event = document.createEvent("HTMLEvents");
        event.initEvent(eventName, true, true);
        return !element.dispatchEvent(event);
    },

    attach : function(element, eventName, callback, thisKeyword, attachToProperty, finalEvent)
    {
        if (finalEvent == undefined)
        {
            finalEvent = false;
        }

        var eventHandler = callback;
        if (thisKeyword != undefined && thisKeyword != null)
        {
            eventHandler = function(event)
            {
                if (event == undefined)
                {
                    event = window.event;
                }
                if (event != undefined && event.keyCode == undefined && event.which != undefined)
                {
                    event.keyCode = event.which;
                }
                return callback.call(thisKeyword, event);
            };
            this.virtualHandlers[callback] = eventHandler;
        }

        var finalEventHandler = null;

        if (attachToProperty)
        {
            element["on" + eventName] = eventHandler;
        }
        else if (element.addEventListener)
        {
            if (finalEvent)
            {
                finalEventHandler = function(event)
                {
                    eventHandler(event);
                    event.stopPropagation();
                    event.preventDefault();
                };
            }
            else
            {
                finalEventHandler = eventHandler
            }

            element.addEventListener(eventName, finalEventHandler, false);
        }
        else if (element.attachEvent)
        {
            if (finalEvent)
            {
                finalEventHandler = function(event)
                {
                    eventHandler(event);
                    return false;
                }
            }
            else
            {
                finalEventHandler = eventHandler
            }

            element.attachEvent("on" + eventName, finalEventHandler);
        }
    },

    detach : function(element, eventName, callback, detachFromProperty)
    {
        if (this.virtualHandlers[callback] != undefined)
        {
            callback = this.virtualHandlers[callback];
            delete this.virtualHandlers[callback];
        }

        if (detachFromProperty)
        {
            element["on" + eventName] = undefined;
        }
        else if (element.removeEventListener)
        {
            element.removeEventListener(eventName, callback, false);
        }
        else if (element.detachEvent)
        {
            element.detachEvent("on" + eventName, callback);
        }
    }
}

/* Deprecated */
cms.event = cms.core.event;