cms.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)
    {
        var eventHandler = callback;
        if (thisKeyword != undefined)
        {
            eventHandler = function(event)
            {
                if (event == undefined)
                {
                    event = window.event;
                }
                return callback.call(thisKeyword, event);
            };
            this.virtualHandlers[callback] = eventHandler;
        }

        if (attachToProperty)
        {
            element["on" + eventName] = eventHandler;
        }
        else if (element.addEventListener)
        {
            element.addEventListener(eventName, eventHandler, false);
        }
        else if (element.attachEvent)
        {
            element.attachEvent("on" + eventName, eventHandler);
        }
    },

    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);
        }
    }
};
