var Event =
{
    attach : function(element, eventName, callback, thisKeyword, forceProperty)
    {
       var eventHandler = callback;
       if (thisKeyword != undefined)
       {
           eventHandler = function(event)
           {
               if (event == undefined)
               {
                  event = window.event;
               }
               callback.call(thisKeyword, event);
           };
       }
       if (forceProperty)
       {
           element["on" + eventName] = eventHandler;
       }
       else if (element.addEventListener)
       {
           element.addEventListener(eventName, eventHandler, false);
       }
       else if (element.attachEvent)
       {
           element.attachEvent("on" + eventName, eventHandler);
       }
    }
}

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