(function(){
var	w=window,d=w.document;

w.setEventHandler=(function(){
	if (w.addEventListener) {
		return function(obj,evt,handler){obj.addEventListener(evt,handler,false)};
	}
	else if (w.attachEvent) {
		return function(obj,evt,handler){obj.attachEvent('on'+evt,handler)};
	}
	else {
		return function(obj,evt,handler){var org=obj['on'+evt];obj['on'+evt]=function(){if(typeof org=='function')org();handler()}};
	}
})();	//	end of setEventHandler()

w.rmvEventHandler=(function(){
	if (w.addEventListener) {
		return function(obj,evt,handler){obj.removeEventListener(evt,handler,false)};
	}
	else if (w.attachEvent) {
		return function(obj,evt,handler){obj.detachEvent('on'+evt,handler)};
	}
	else {
		return function(obj,evt,handler){obj['on'+evt]=null};
	}
})();	//	end of setEventHandler()

w.setMouseHandler=function(obj,evt,handler) {
	var	mouseHandler=function(curEvent,e) {
		if (!e) e=w.event;
		if (!e) return;
		var	prop=obj._MouseProp_;
		var	curStatus=prop.status;
		if (curStatus==curEvent) return;
		if (curStatus=='out') {	//	outer to inner
			var	fncArrayOver=prop.fncArrayOver;
			for (var ci=0,len=fncArrayOver.length; ci<len; ci++) {
				fncArrayOver[ci].apply(obj,[e]);
			}
		}
		else {					//	inner to outer
			var	chkNode=e.toElement||e.relatedTarget;
			while (chkNode) {
				if (chkNode==obj) return;
				chkNode=chkNode.parentNode;
			}
			var	fncArrayOut=prop.fncArrayOut;
			for (var ci=0,len=fncArrayOut.length; ci<len; ci++) {
				fncArrayOut[ci].apply(obj,[e]);
			}
		}
		prop.status=curEvent;
	};
	var	prop=obj._MouseProp_;
	if (!prop) {
		prop=obj._MouseProp_={status:'out',fncArrayOver:[],fncArrayOut:[]};
		w.setEventHandler(obj,'mouseover',function(e){mouseHandler('over',e)});
		w.setEventHandler(obj,'mouseout',function(e){mouseHandler('out',e)});
	}
	if (evt=='mouseover') {
		prop.fncArrayOver[prop.fncArrayOver.length]=handler;
	}
	else if (evt=='mouseout') {
		prop.fncArrayOut[prop.fncArrayOut.length]=handler;
	}
	else {
		w.setEventHandler(obj,evt,handler);
	}
};
w.rmvMouseHandler=function(obj,evt,handler) {
	var	prop=obj._MouseProp_;
	if (!prop) {
		w.rmvEventHandler(obj,evt,handler);
		return;
	}
	if (evt=='mouseover') {
		var	fncArrayOver=prop.fncArrayOver;
		for (var ci=0,len=fncArrayOver.length; ci<len; ci++) {
			if (fncArrayOver[ci]==handler) {
				fncArrayOver.splice(ci,1);
				break;
			}
		}
	}
	else if (evt=='mouseout') {
		var	fncArrayOut=prop.fncArrayOut;
		for (var ci=0,len=fncArrayOut.length; ci<len; ci++) {
			if (fncArrayOut[ci]==handler) {
				fncArrayOut.splice(ci,1);
				break;
			}
		}
	}
	else {
		w.rmvEventHandler(obj,evt,handler);
	}
};
})();
