/**
 * fixEvent函数不是单独执行的，它必须有一个事件对象参数，而且只有事件发生时它才被执行！
 * 最好的方法是把它整合到addEvent函数的execEventHandles里面
 * @param evt
 * @return
 */
function fixEvent(evt) {
	if (!evt.target) {
		evt.target = evt.srcElement;
		evt.preventDefault = fixEvent.preventDefault;
		evt.stopPropagation = fixEvent.stopPropagation;
		if (evt.type == "mouseover") {
			evt.relatedTarget = evt.fromElement;
		} else if (evt.type =="mouseout") {
			evt.relatedTarget = evt.toElement;
		}
		evt.charCode =  (evt.type=="keypress")?evt.keyCode:0;
		evt.eventPhase = 2;/*IE仅工作在冒泡阶段*/
		evt.timeStamp = (new Date()).getTime();/*仅将其设为当前时间*/
	}
	return evt;
};
fixEvent.preventDefault =function () {
	this.returnValue = false;/*这里的this指向了某个事件对象，而不是fixEvent*/
};
fixEvent.stopPropagation =function () {
	this.cancelBubble = true;
};

function addEvent(obj,evtype,fn,useCapture) {
	if (obj.addEventListener) {/*优先考虑W3C事件注册方案*/
		obj.addEventListener(evtype,fn,!!useCapture);
	} else {/*当不支持addEventListener时(IE),由于IE同时也不支持捕获,所以不如使用传统事件绑定*/
		if (!fn.__EventID) {fn.__EventID = addEvent.__EventHandlesCounter++;}
		/*为每个事件处理函数分配一个唯一的ID*/
		if (!obj.__EventHandles) {obj.__EventHandles={};}
		/*__EventHandles属性用来保存所有事件处理函数的引用*/

		/*按事件类型分类*/
		if (!obj.__EventHandles[evtype]) {/*第一次注册某事件时*/
			obj.__EventHandles[evtype]={};
			if (obj["on"+evtype]) {/*以前曾用传统方式注册过事件处理函数*/
				(obj.__EventHandles[evtype][0]=obj["on"+evtype]).__EventID=0;/*添加到预留的0位*/
				/*并且给原来的事件处理函数增加一个ID*/
			} else {
				obj.__EventHandles[evtype][fn.__EventID]=fn;
			}
			obj["on"+evtype]=addEvent.execEventHandles;
			/*当事件发生时，execEventHandles遍历表obj.__EventHandles[evtype]并执行其中的函数*/
		}
	}
};
addEvent.__EventHandlesCounter=1;/*计数器,0位预留它用*/
addEvent.execEventHandles = function (evt) {/*遍历所有的事件处理函数并执行*/
	if (!this.__EventHandles) {return true;}
	evt = fixEvent(evt || window.event);/*在这里对其进行标准化操作*/
	var fns = this.__EventHandles[evt.type];
	for (var i in fns) {
			fns[i].call(this,evt);/*并且将其作为事件处理函数的第一个参数*/
			/*这样在事件处理函数内部就可以使用统一的方法访问事件对象了*/
	}
};
function delEvent(obj,evtype,fn,useCapture) {
	if (obj.removeEventListener) {/*先使用W3C的方法移除事件处理函数*/
		obj.removeEventListener(evtype,fn,!!useCapture);
	} else {
		if (obj.__EventHandles) {
			var fns = obj.__EventHandles[evtype];
			if (fns) {delete fns[fn.__EventID];}
		}
	}
};
	
	function addLoadEvent(fn) {
	    var init = function() {
	        if (arguments.callee.done) return;
	        arguments.callee.done = true;
	        fn.apply(document,arguments);
	    };
	    /*注册DOMContentLoaded事件，如果支持的话*/
	    if (document.addEventListener) {
	        document.addEventListener("DOMContentLoaded", init, false);
	    }
	    /*但对于Safari，我们需要使用setInterval方法不断检测document.readyState*/
	    /*当为loaded或complete的时候表明DOM已经加载完毕*/
	    if (/WebKit/i.test(navigator.userAgent)) {
	        var _timer = setInterval(function() {
	            if (/loaded|complete/.test(document.readyState)) {
	                clearInterval(_timer);
	                init();
	            }
	        },10);
	    }
	    /*对于IE则使用条件注释，并使用script标签的defer属性*/
	 	/*IE中可以给script标签添加一个defer(延迟)属性，这样，标签中的脚本只有当DOM加载完毕后才执行*/
	 	/*@cc_on @*/
	 	/*@if (@_win32)
	 	document.write("<script id=\"__ie_onload\" defer=\"defer\" src=\"javascript:void(0)\"><\/script>");
	 	var script = document.getElementById("__ie_onload");
	 	script.onreadystatechange = function() {
		 	if (this.readyState == "complete") {
		 		init();
		 	}
	 	};
	 	/*@end @*/
	 	return true;
	 }
	function paramHandler() {
		var cc = $G('cc');
		var dd = $G('fr');
		arr = new Array();
		arr.push('cc=');
		arr.push(cc);
		arr.push(';fr=');
		arr.push(dd);
		$cookie(arr.join(''));
	}
