if(!window.Antartec) window.Antartec = {};

Antartec.Events = {};

if ( document.addEventListener ) 
{
    Antartec.Events.add = function( element, eventType, handler ) 
    {
        element.addEventListener( eventType, handler, false );
    }
    Antartec.Events.remove = function( element, eventType, handler ) 
    {
        element.removeEventListener( eventType, handler, false );
    }
}
else if ( document.attachEvent ) 
{
    Antartec.Events.add = function( element, eventType, handler ) 
    {

        if ( Antartec.Events._find( element, eventType, handler ) != -1 ) 
        {
            return;
        }

        var wrapperHandler = function( e ) 
        {
            e = e || windows.event;

            var event = {
                _event: e,
                type: e.type,
                target: e.srcElement,
                currentTarget: element,
                relatedTarget: (
                e.fromElement ? 
                    e.fromElement :
                e.toElement ) ,
                eventPhase: ( e.srcElement == element) ? 2 : 3,

                clientX: e.clientX,
                clientY: e.clientY,
                screenX: e.screenX,
                screenY: e.screenY,

                altKey: e.altKey,
                ctrlKey: e.ctrlKey,
                shiftKey: e.shiftKey,
                charCode: e.keyCode,

                stopPropogation: function() 
                {
                    this._event.cancelBubble = true;
                },
                preventDefault: function() 
                {
                    this._event.returnValue = false;
                }
            };

            element._currentHandler = handler;
            element._currentHandler( event );
            element._currentHandler = null;
        };

        element.attachEvent( 'on' + eventType, wrapperHandler );

        var h = { 
            element: element,
            eventType: eventType,
            handler: handler,
            wrapperHandler: wrapperHandler
        };

        var d = element.document || element;
        var w = d.parentWindow;

        var id = Antartec.Events._uid();
        if ( !w._allHandlers ) 
        {
            w._allHandlers = {};
        }
        w._allHandlers[ id ] = h;

        if ( !element._handlers ) 
        {
            element._handlers = [];
        }
        element._handlers.push( id );

        if ( !w._onunloadHandlerRegistered ) 
        {
            w._onUnloadHandlerRegistered = true;
            w.attachEvent( "onunload", 
            Antartec.Events._removeAllHandlers );
        }

    };

    Antartec.Events.remove = function( element, eventType, handler ) 
    {

        var i = Antartec.Events._find( element, eventType, handler );
        if ( i == -1 ) 
        {
            return;
        }

        var d = element.document || element;
        var w = d.parentWindow;

        var handlerId = element._handlers[ i ];
        var h = w._allHandlers[ handlerId ];
        element.detachEvent( 'on' + eventType, h.wrapperHandler );
        element._handlers.splice( i, 1 );
        delete w._allHandlers[ handlerId ];
    };

    Antartec.Events._find = function( element, eventType, handler ) 
    {
        var handlers = element._handlers;
        if ( !handlers ) 
        {
            return -1;
        }

        var d = element.document || element;
        var w = d.parentWindow;

        for ( var i = handlers.length - 1; i >= 0; i-- ) 
        {
            var handlerId = handlers[ i ];
            var h = w._allHandlers[ handlerId ];
            if ( h.eventType == eventType && 
                h.handler == handler ) 
            {
                return i;
            }
        }
        return -1;
    };

    Antartec.Events._removeAllHandlers = function() 
    {
        var w = this;
        for ( id in w._allHandlers ) 
        {
            var h = w._allHandlers[ id ];
            h.element.detachEvent( 'on' + h.eventType, 
            h.wrapperHandler );
            delete w._allHandlers[ id ];
        }
    };

    Antartec.Events._counter = 0;
    Antartec.Events._uid = function() 
    {
        return "h" + this._counter++; 
    }
}