events = {
    about: 'EVENTS LIBRARY v1 by tc.prognoz.ru',
    add: function(obj, type, handler, capture)
    {
        stat.events.add++;
        obj = this.obj(obj);
        if (!obj._events) obj._events = {};
        if (!obj._events[type]) obj._events[type] = [];
        obj._events[type].push(handler);

        this.addEventListener(obj, type, handler, capture);
    },
    remove: function(obj, type, handler)
    {
        stat.events.remove++;
        obj = this.obj(obj);
        var handlers = (typeof obj._events != 'undefined' && typeof obj._events[type] != 'undefined') ? obj._events[type] : [];
        if (handler)
        {
            for (var i = 0; i < handlers.length; i++)
                if (handlers[i] && handler == handlers[i])
                {
                    this.removeEventListener(obj, type, handler);
                    delete obj._events[type][i];
                    break;
                }
        }
        else
            for (var i = 0; i < handlers.length; i++)
            {
                this.removeEventListener(obj, type, handlers[i]);
                delete obj._events[type][i];
            }
    },
    cancel: function(e)
    {
        stat.events.cancel++;
        e = e || window.event;
            
        if(e.preventDefault)
            e.preventDefault();
        if(e.stopPropagation) 
            e.stopPropagation(); 
        e.cancelBubble = true;
        e.returnValue = false;
        return false;
		alert('cancel');
    },
    getTarget: function(e)
    {
        stat.events.getTarget++;
        return e.srcElement || e.target;
    },
    obj: function(obj)
    {
        stat.events.obj++;
        if (typeof obj == 'string') return document.getElementById(obj);
        return obj;
    },
    addEventListener: function(obj, type, handler, capture)
    {
        stat.events.addEventListener++;
        if (obj.addEventListener) 
            obj.addEventListener(type, handler, capture||false);
        else if (obj.attachEvent) 
            obj.attachEvent('on' + type, handler);
    },
    removeEventListener: function(obj, type, handler)
    {
        stat.events.removeEventListener++;
        if (obj.removeEventListener) 
            obj.removeEventListener(type, handler, false);
        else if (obj.detachEvent) 
            obj.detachEvent('on' + type, handler);
    },
    parse: function(evt)
    {
	var e = evt || window.event;
	if (!e) {
	    return;
	}
	this.type = e.type;
	this.target = e.target || e.srcElement;
	this.relatedTarget = e.relatedTarget;
	/*@cc_on if(e.type=='mouseover')this.relatedTarget=e.fromElement;else if(e.type=='mouseout')this.relatedTarget=e.toElement;@*/
	if (xDef(e.pageX)) {
            this.pageX = e.pageX;
            this.pageY = e.pageY;
	} else if (xDef(e.clientX)) {
            this.pageX = e.clientX+xScrollLeft();
            this.pageY = e.clientY+xScrollTop();
	}
	if (xDef(e.offsetX)) {
            this.offsetX = e.offsetX;
            this.offsetY = e.offsetY;
	} else if (xDef(e.layerX)) {
            this.offsetX = e.layerX;
            this.offsetY = e.layerY;
	} else {
            this.offsetX = this.pageX-xPageX(this.target);
            this.offsetY = this.pageY-xPageY(this.target);
	}
	this.keyCode = e.keyCode || e.which || 0;
	this.shiftKey = e.shiftKey;
	this.ctrlKey = e.ctrlKey;
	this.altKey = e.altKey;
	if (typeof e.type == 'string') {
            if (e.type.indexOf('click') != -1) {
                this.button = 0;
            } else if (e.type.indexOf('mouse') != -1) {
                this.button = e.button;
                /*@cc_on if(e.button&1)this.button=0;else if(e.button&4)this.button=1;else if(e.button&2)this.button=2;@*/
            }
	}
    }
};

stat.events = {add:0, remove:0, cancel:0, getTarget:0, obj:0, addEventListener:0, removeEventListener:0}
