/**
 * @author Oleg Korovin (http://olegrorovin.spb.ru/)
 */


var Events = {

	obj		: null,

 /***************************************/
	init	: function(event){
		this.obj = event || window.event;
		return this.obj;
	},

 /***************************************/
	exec	: function(elThis,fFunc,elNode){
		var oEvThis = this;

		return function(e){
			var oThis = this;
			oEvThis.init(e);
			return	fFunc.apply(elThis,[e,(elNode || oThis)]);
		};
	},

 /***************************************/
	onload	: function(fFunc){
		this.add(window,'load',fFunc);
	},

 /***************************************/
	add		: function(elNode, sEvent, fFunc){
		if(elNode && sEvent){
			if (elNode.attachEvent)			elNode.attachEvent('on' + sEvent, fFunc);
			else
			if (elNode.addEventListener)	elNode.addEventListener(sEvent, fFunc, true);
		}
	},

 /***************************************/
	remove	: function(elNode, sEvent, fFunc){
		if(elNode && sEvent){
			if (elNode.detachEvent)			elNode.detachEvent('on' + sEvent, fFunc);
			else
			if (elNode.removeEventListener)	elNode.removeEventListener(sEvent, fFunc, true);
		}
	},

 /***************************************/
	stop		: function(event){
		var evt = event || window.event;
		if(evt.preventDefault) evt.preventDefault();
		if(evt.stopPropagation) evt.stopPropagation();
		evt.cancelBubble = true;
		evt.returnValue = false;
		return false;
	},

 /***************************************/
	stopBubble	: function(event){
		var evt = event || window.event;
		if(evt.preventDefault){
			evt.stopPropagation();
		}
		else{
			evt.cancelBubble = true;
		}
	},

 /***************************************/
	target	: function(event){
		var evt = event || window.event;
		return (evt.target || evt.srcElement);
	},

 /***************************************/
	key	: function(event){
		var evt = event || window.event;
		return evt.which || (evt.type == 'keypress' && evt.charCode ? evt.charCode : evt.keyCode);
	},

 /***************************************/
	within	: function(event,elNode){
		var evt = event || window.event;
		var elTarg = evt.target || evt.srcElement;

		while(elTarg){
			if(elTarg == elNode){
				return true;
			}
			elTarg = elTarg.parentNode;
		}
		return false;
	},

 /***************************************/
	type	: function(event){
		var evt = event || window.event;
		return evt.type;
	},

 /***************************************/
	after	: function(event,fFunc){
		this.stop(event);
		setTimeout(function(){fFunc()},10);
		return false;
	},

// TODO скопировать везде
 /***************************************/
	inside : function(elNode,sEvent,fIn,fOut){
		var
			oThis = this,
			oNode = jQuery(elNode),
			bIn = 0,
			sEnterName = sEvent+'_enter',
			sLeaveName = sEvent+'_leave';

		oNode.bind(sEnterName,fIn);
		oNode.bind(sLeaveName,fOut);

		jQuery(document).bind(sEvent, check);

		oNode.bind(sEvent,function(e){
			if(bIn) return;
			bIn = 1;

			oNode.triggerHandler(sEnterName);
		});

		function check(e){
			if( !jQuery(e.target).parents().andSelf().filter(oNode).size() ){
				bIn = 0;
				jQuery(document).unbind(sEvent, check);
				oNode.triggerHandler(sLeaveName);
				return false;
			}
		}
	}
};



/**/


