String.prototype.trim = function(){
	return this.replace(/^\s+|\s+$/g, "");
};

Array.prototype.hasValue = function(sValue){
	for(var i=0;i<this.length;i++){
		if(this[i] == sValue) return true;
	}
	return false;
};
Array.prototype.delValue = function(sValue){
	var a = [];
	for(var i=0;i<this.length;i++){
		if(this[i] != sValue) a.push(this[i]);
	}
	return a;
};

var $E = function(sId, wnd){

	var cl = arguments.callee;
	if (sId instanceof cl) return sId;
	if (!(this instanceof cl)) return new cl(sId, wnd);

	this.El = null;
	wnd = wnd || self;
	if(typeof sId == "string")
		this.El = /^<(.*)>$/.test(sId)?wnd.document.createElement(RegExp.$1):wnd.document.getElementById(sId);//alert(this.El)
	else
		this.El = sId;

}
$E.prototype = {
	addClass : function(className){
		if(!this.hasClass(className)){
			this.El.className = this.El.className ? this.El.className + " " + className : className;
		}
	},

	delClass : function(className){
		var aCN = this.El.className.split(/\s+/ig);
		var a = aCN.delValue(className);
		this.El.className = a.join(" ");
	},

	hasClass : function(className){
		return new RegExp("(^|\\s+)"+className+"(\\s+|$)").test(this.El.className);
	},
	setStyle : function(oStyle){
		for(var stl in oStyle){
			this.El.style[stl] = oStyle[stl];
		}
	},

	getStyle : function(sName){
		var val = this.El.style[sName];
		if(!val){
			if(document.defaultView && document.defaultView.getComputedStyle){
				val = document.defaultView.getComputedStyle(this.El, null).getPropertyValue(sName);
			} else if(this.El.currentStyle){
				val = this.El.currentStyle[sName];
			} else{
				val = "";
			}
		}
	},

	show : function(){
		this.setStyle({display:""});
	},

	hide : function(){
		this.setStyle({display:"none"});
	},
	
	setVisible : function(bVisi){
		sVisi = bVisi ? "visible" : "hidden";
		this.setStyle({visibility:sVisi});
	},

	appendTo : function(oEl){
		oEl.appendChild(this.El);
		return this;
	},

	appendChild : function(oEl){
		this.El.appendChild(oEl.El);
		return this;
	},

	innerHTML : function(sHTML){
		this.El.innerHTML = sHTML;
	},

	getPosition : function(){
		var offTop = this.El.offsetTop;
		var offLeft = this.El.offsetLeft;
		while(this.El = this.El.offsetParent){
			if(this.El.style.position == "absolute" || this.El.style.postion == "relative"
			|| (this.El.style.overflow != "visible" && this.El.style.overflow != "")){
				break;
			}
			offTop += this.El.offsetTop;
			offLeft += this.El.offsetLeft;
		}
		return {top:offTop,left:offLeft};
	},

	//设置层的坐标，x和y可以为 "c" 表示相对于显示区居中。z是可选的。
	setPosition : function(x,y,z){
		if(!this.El){
			return false;
		}
		if(typeof x == "number" || typeof x == "string"){
			this.El.style.left = x == "c" ? Math.ceil(
				Math.max(
					0,
					(document.documentElement.clientWidth - this.El.offsetWidth)
				)/ 2 + document.documentElement.scrollLeft) + "px" : x + "px";
		}
		if(typeof y == "number" || typeof y == "string"){
			this.El.style.top = y == "c" ? Math.ceil(
			Math.max(
				0,
				(document.documentElement.clientHeight - this.El.offsetHeight)
			) / 2 + document.documentElement.scrollTop) + "px" : y + "px";
		}
		parseInt(z) > 0 ? this.El.style.zIndex = z : void(0);
	},
	
	getElementsByClassName : function(sClassName){
		var aNodes = this.El.getElementsByTagName("*");
		var El = null;
		var a = [];

		for(var i=0;i<aNodes.length;i++){
			El = $E(aNodes[i]);
			if(El.hasClass(sClassName)){
				a.push(El);
			}
		}//alert(a)
		return a;
	},

	value : function(){
		return this.El.value || this.El.textContent || this.El.text;
	},


	//获取本节点的所有子元素及其孩子的列表清单
	getChildNodes : function(fnFilter){
		var childs = this.El.childNodes;
		var a = [];
		var flt = false;
		if(typeof fnFilter == "function"){
			flt = true;
		}
		(function(childs){
			for(var i=0;i<childs.length;i++){
				if(flt){
					if(fnFilter(childs[i])){
						a.push(childs[i]);
					}
					if(childs[i].nodeType == 1) arguments.callee(childs[i].childNodes);
				} else{
					a.push(childs[i]);
					if(childs[i].nodeType == 1) arguments.callee(childs[i].childNodes);
				}
			}
		})(childs);
		return a;
	},
	
	//获取本节点的一级孩子
	children : function(){
		var a = [];
		for(var i=0;i<this.El.childNodes.length;i++){
			a.push(this.El.childNodes[i]);
		}
		return a;
	},

	hasElement : function(){
		var cld = this.El.childNodes;
		for(var i=0;i<cld.length;i++){
			if(cld[i].nodeType == 1) return true;
		}
		return false;
	},

	//用指定节点oEl包围本节点
	wrap : function(oEl){//改正2009-1-12 11:03
		var oNode = this.El.cloneNode(true);
		
		this.El.parentNode.replaceChild(oEl, this.El);
		this.El = oNode;
		oEl.appendChild(oNode);
		return oEl;
	},
	//删除本节点但保留其包含的内容
	unwrap : function(){
		var p = $E(this.El.parentNode);

		var children_p = p.children();
		var children_n = this.children();


		p.innerHTML = "";

		for(var i=0;i<children_p.length;i++){//alert("")
			if(children_p[i] == this.El){
				for(var j=0;j<children_n.length;j++){
					p.El.appendChild(children_n[j]);
				}
			} else{
				p.El.appendChild(children_p[i]);
			}
		}
		this.remove();
		return children_n;
	},

	//删除一个节点及其子节点
	remove : function(){
		this.El.parentNode.removeChild(this.El);
	},
	
	text : function(){
		var t = "";
		if(this.El.innerText){
			t = this.El.innerText;
		} else{
			t = this.El.textContent;
		}
		if(typeof t != "string") t = "";
		return t;
	},
	
	//返回本节点的标签字符串，包含属性，不包含子节点。
	toString : function(){
		var tmpNode = $E(this.El.cloneNode(false));
		if(this.El.outerHTML) return tmpNode.El.outerHTML;
		var tmpNodeParent = $E("<div>");
		tmpNodeParent.appendChild(tmpNode);
		var s = tmpNodeParent.El.innerHTML;
		tmpNodeParent = null;
		tmpNode = null;
		return s;
	}

}

/////////////////////////
var FX={};
FX.createAnimation=function()
{
	function animate(o)
	{
		if(o.timeStamp)
		{
			var time=new Date().getTime()-o.timeStamp;
		}
		else
		{
			var time=0;
			o.timeStamp=new Date().getTime();
		}
		if(time>o.duration)time=o.duration;
		o.tween(o.mode(time/o.duration));
		if(time==o.duration)stop(o);
	}
	function play(o)
	{
		if(o.instance)return;
		o.instance=setInterval(function(){animate(o);},o.interval);
		if(o.before)o.before();
	}
	function stop(o)
	{
		if(!o.instance)return;
		clearInterval(o.instance);
		o.instance=null;
		o.timeStamp=0;
		if(o.after)o.after();
	}
	var mode=
	{
		normal:function(x)
		{
			return x;
		},
		easeIn:function(x)
		{
			return x*(2-x);
		},
		easeOut:function(x)
		{
			return x*x;
		},
		backIn:function(x)
		{
			return 1.5*x*x-0.5*x;
		}
	};
	return function(config)
	{
		var o=
		{
			before:config.before,
			tween:config.tween,
			after:config.after,
			mode:config.mode in mode?mode[config.mode]:mode.normal,
			duration:config.duration||1000,
			interval:config.interval||10,
			timeStamp:0,
			instance:null
		};
		var animation=
		{
			play:function()
			{
				play(o);
			},
			stop:function()
			{
				stop(o);
			}
		};
		return animation;
	};
}();
/**
 * @name ElementManager
 * @author sundongguo
 * @version 20080828
 *
 * 管理与Element相关的内容。
 *
 * ElementManager.getDocumentWidth()	获取文档宽度（在IE浏览器下，当文档宽度小于窗口可见宽度时，返回窗口可见宽度。其他浏览器的文档宽度不会小于窗口可见宽度。）
 * ElementManager.getDocumentHeight()	获取文档高度
 * ElementManager.getWindowWidth()	获取窗口可见宽度
 * ElementManager.getWindowHeight()	获取窗口可见高度
 * ElementManager.getWindowSrollLeft()	获取窗口左边滚动像素数
 * ElementManager.getWindowSrollTop()	获取窗口顶部滚动像素数
 *
 * ElementManager.getComputedStyle($target,styleName)	获取目标元素的最终样式
 * ElementManager.setOpacity($target,opacity)		设置目标元素的透明度（0-100）
 *
 * ElementManager.hasClass($target,className)
 * ElementManager.addClass($target,className)
 * ElementManager.removeClass($target,className)
 * ElementManager.toggleClass($target,className)
 *
 * ElementManager.getPrevious()
 * ElementManager.getNext()
 * ElementManager.getFirst()
 * ElementManager.getLast()
 * ElementManager.getChildren()
 *
 * Plugins：
 * ElementManager.setFixed($target,position)	将指定元素固定在可视区域的指定位置（该元素需要绝对定位）
 * ElementManager.setMaskBehind($target)	创建一个在指定元素下的遮掩层
 */
//--------------------------------------------------[ElementManager]
var ElementManager=
{
	//IE5.5要用document.body.scrollWidth，同时其document.documentElement.clientWidth为0。
	//IE可能比getWindowsSize小。
	getDocumentWidth:function()
	{
		var width=document.documentElement.clientWidth?Math.max(document.body.scrollWidth,document.documentElement.scrollWidth):document.body.scrollWidth;
		if(window.ActiveXObject)width=Math.max(width,ElementManager.getWindowWidth());
		return width;
	},
	getDocumentHeight:function()
	{
		var height=document.documentElement.clientHeight?Math.max(document.body.scrollHeight,document.documentElement.scrollHeight):document.body.scrollHeight;
		if(window.ActiveXObject)height=Math.max(height,ElementManager.getWindowHeight());
		return height;
	},
	//Opera要用document.body.clientWidth。
	getWindowWidth:function()
	{
		return window.opera?document.body.clientWidth:document.documentElement.clientWidth||document.body.clientWidth;
	},
	getWindowHeight:function()
	{
		return window.opera?document.body.clientHeight:document.documentElement.clientHeight||document.body.clientHeight;
	},
	getWindowSrollLeft:function()
	{
		return document.documentElement.scrollLeft||document.body.scrollLeft;
	},
	getWindowSrollTop:function()
	{
		return document.documentElement.scrollTop||document.body.scrollTop;
	},
	getComputedStyle:function($target,styleName)
	{
		return document.defaultView?document.defaultView.getComputedStyle($target,null).getPropertyValue(styleName):$target.currentStyle[styleName.replace(/-[a-z]/g,function(){return arguments[0].charAt(1).toUpperCase();})];
	},
	setOpacity:function($target,opacity)
	{
		window.ActiveXObject?$target.style.filter="alpha(opacity="+opacity*100+")":$target.style.opacity=opacity;
	}
};
/**
 * @name ElementManager.setMaskBehind
 * @author sundongguo
 * @version 20080828
 * @need EventManager
 *       ElementManager
 *
 * 创建一个在指定元素下的遮掩层，该层之下的元素不可点击，不可用tab键遍历。
 * Opera浏览器特殊，遮盖后仍可以用tab键遍历。目前无解决方案。
 *
 * ElementManager.setMaskBehind($target)
 * $target为目标元素，该元素的position属性必须是absolute，并设置了z-index属性，遮掩层将在此元素下方创建。
 * 如果没有指定$target，将清除遮掩层。
 */
//--------------------------------------------------[setMaskBehind]
ElementManager.setMaskBehind=function()
{
	function setTabIndex($target,tabIndex)
	{
		var tagNames=["a","button","input","select","textarea"];
		for(var n=0;n<tagNames.length;n++)
		{
			var elements=$target.getElementsByTagName(tagNames[n]);
			for(var i=0;i<elements.length;i++)elements[i].tabIndex=tabIndex;
		}
	}
	function maxSize()
	{
		$mask.style.width=ElementManager.getDocumentWidth()+"px";
		$mask.style.height=ElementManager.getDocumentHeight()+"px";
	}
	function setSize()
	{
		$mask.style.width=ElementManager.getWindowWidth()+"px";
		$mask.style.height=ElementManager.getWindowHeight()+"px";
		//加延时是为了IE浏览器。
		setTimeout(maxSize,0);
	}
	function createMask()
	{
		$mask=document.createElement("div");
		$mask.style.display="none";
		$mask.style.position="absolute";
		$mask.style.left="0px";
		$mask.style.top="0px";
		$mask.style.background="#000000";
		//IE5不支持。
		//$mask.style.cursor="not-allowed";
		ElementManager.setOpacity($mask,0.5);
		document.body.appendChild($mask);
		EventManager.bind(window,"resize",setSize);
		setSize();
	}
	function destoryMask()
	{
		document.body.removeChild($mask);
		EventManager.unbind(window,"resize",setSize);
		$mask=null;
	}
	var $mask=null;
	return function($target)
	{
		if($target)
		{
			if(!$mask)createMask();
			var zIndex=parseInt(ElementManager.getComputedStyle($target,"z-index"),10);
			if(!zIndex)zIndex=$target.style.zIndex=100;
			$mask.style.zIndex=zIndex-1;
			$mask.style.display="block";
			//屏蔽当前层之外的tabIndex。
			setTabIndex(document.body,-1);
			setTabIndex($target,0);
		}
		else
		{
			if($mask)destoryMask();
			setTabIndex(document.body,0);
		}
	};
}();
/**
 * @name ElementManager.setFixed
 * @author sundongguo
 * @version 20080825
 * @need EventManager
 *       ElementManager
 *       FX
 *
 * 将指定元素固定在可视区域的指定位置。
 * 在改变窗口大小或滚动内容时，浮动该元素到指定位置。
 *
 * ElementManager.setFixed($target,position)
 * $target:	目标元素。
 * position:	{left:左边距,right:右边距,top:上边距,bottom:下边距}格式的对象，设置其位置。
 *		可以设置像素数或百分比，如left:50代表距左边线50像素，left:50%代表目标元素中心点距左边线占总长度的50%。
 *		如果同时设定left/right或top/bottom，将以后边的为准。
 *		如果省略left/right或top/bottom，则设置left或top为auto，参照文档流的当前坐标定位。
 */
//--------------------------------------------------[setFixed]
ElementManager.setFixed=function()
{
	function setXY(o)
	{
		if(o.xy.x)
		{
			var offsetWidth=o.$target.offsetWidth;
			var windowWidth=ElementManager.getWindowWidth();
			var x=null;
			if("left" in o.position)
			{
				x=o.position.left;
				x=/\d+%/.test(x)?parseInt(x,10)/100*windowWidth-offsetWidth/2:x;
			}
			else
			{
				x=o.position.right;
				x=/\d+%/.test(x)?(1-parseInt(x,10)/100)*windowWidth-offsetWidth/2:windowWidth-offsetWidth-x;
			}
			o.xy.x[1]=Math.floor(x);
		}
		if(o.xy.y)
		{
			var offsetHeight=o.$target.offsetHeight;
			var windowHeight=ElementManager.getWindowHeight();
			var y=null;
			if("top" in o.position)
			{
				y=o.position.top;
				y=/\d+%/.test(y)?parseInt(y,10)/100*windowHeight-offsetHeight/2:y;
			}
			else
			{
				y=o.position.bottom;
				y=/\d+%/.test(y)?(1-parseInt(y,10)/100)*windowHeight-offsetHeight/2:windowHeight-offsetHeight-y;
			}
			o.xy.y[1]=Math.floor(y);
		}
	}
	function onEvent(event)
	{
		if(event.type=="resize")for(var i=0;i<pool.length;i++)setXY(pool[i]);
		animation.stop();
		animation.play();
	}
	var pool=[];
	var animation=FX.createAnimation
	({
		before:function()
		{
			for(var i=0;i<pool.length;i++)
			{
				var o=pool[i];
				if(o.xy.x)o.xy.x[0]=parseInt(o.$target.style.left,10);
				if(o.xy.y)o.xy.y[0]=parseInt(o.$target.style.top,10);
			}
		},
		tween:function(n)
		{
			for(var i=0;i<pool.length;i++)
			{
				var o=pool[i];
				if(o.xy.x)o.$target.style.left=(o.xy.x[0]+(ElementManager.getWindowSrollLeft()+o.xy.x[1]-o.xy.x[0])*n)+"px";
				if(o.xy.y)o.$target.style.top=(o.xy.y[0]+(ElementManager.getWindowSrollTop()+o.xy.y[1]-o.xy.y[0])*n)+"px";
//				if(o.xy.x)o.$target.style.left=Math.max(Math.min(o.xy.x[0]+(ElementManager.getWindowSrollLeft()+o.xy.x[1]-o.xy.x[0])*n,ElementManager.getDocumentWidth()-o.$target.offsetWidth),0)+"px";
//				if(o.xy.y)o.$target.style.top=Math.max(Math.min(o.xy.y[0]+(ElementManager.getWindowSrollTop()+o.xy.y[1]-o.xy.y[0])*n,ElementManager.getDocumentHeight()-o.$target.offsetHeight),0)+"px";
			}
		},
		mode:"easeIn",
		duration:500
	});
	return function($target,position)
	{
		//设置浮动。
		if(position)
		{
			//首次运行，建立对象池并绑定事件。
			if(pool.length==0)
			{
				EventManager.bind(window,"resize",onEvent);
				EventManager.bind(window,"scroll",onEvent);
//				EventManager.bind(parent,"resize",onEvent);
//				EventManager.bind(parent,"scroll",onEvent);
			}
			//同一元素只能绑定一个坐标，后边的设置将覆盖先前的设置。
			else
			{
				for(var i=0;i<pool.length;i++)if(pool[i].$target===$target)pool.splice(i,1);
			}
			//建立新对象，只保存值，无方法。
			var o=
			{
				$target:$target,
				position:position,
				xy:{}
			};
			if("left" in position&&"right" in position)delete position.left;
			if("top" in position&&"bottom" in position)delete position.top;
			if("left" in position||"right" in position)o.xy.x=[];
			if("top" in position||"bottom" in position)o.xy.y=[];
			setXY(o);
			//设置初始位置。
			if(o.xy.x)$target.style.left=ElementManager.getWindowSrollLeft()+o.xy.x[1]+"px";
			if(o.xy.y)$target.style.top=ElementManager.getWindowSrollTop()+o.xy.y[1]+"px";
//			if(o.xy.x)o.$target.style.left=Math.max(Math.min(ElementManager.getWindowSrollLeft()+o.xy.x[1],ElementManager.getDocumentWidth()-o.$target.offsetWidth),0)+"px";
//			if(o.xy.y)o.$target.style.top=Math.max(Math.min(ElementManager.getWindowSrollTop()+o.xy.y[1],ElementManager.getDocumentHeight()-o.$target.offsetHeight),0)+"px";
			//向池压入。
			pool.push(o);
		}
		//取消浮动。
		else
		{
			if(pool.length==0)return;
			//从池弹出。
			for(var i=0;i<pool.length;i++)if(pool[i].$target===$target)pool.splice(i,1);
			//无浮动对象，清除对象池并解除事件绑定。
			if(pool.length==0)
			{
				EventManager.unbind(window,"resize",onEvent);
				EventManager.unbind(window,"scroll",onEvent);
//				EventManager.unbind(parent,"resize",onEvent);
//				EventManager.unbind(parent,"scroll",onEvent);
			}
		}
	};
}();
/**
 * @name EventManager
 * @author sundongguo
 * @version 20080826
 * @need ElementManager
 *
 * 管理与event相关的内容。
 *
 * EventManager.bind($element,eventName,onEvent)	绑定事件（增加“鼠标进入/离开”和“拖拽”事件）
 * EventManager.unbind($element,eventName,onEvent)	解除事件
 * EventManager.getTargetElement(event)	获取触发对象（不一定等于监听对象）
 * EventManager.getKey(event)		获取按键信息
 * EventManager.getMouseButton(event)	获取鼠标按键
 * EventManager.getMouseWheel(event)	获取鼠标滚轮
 * EventManager.getMousePosition(event)	获取鼠标坐标
 * EventManager.stopPropagation(event)	取消冒泡
 * EventManager.preventDefault(event)	取消响应
 * EventManager.onDOMReady()		启用文档可用事件（自动运行并启用）
 * EventManager.setOnDOMReady(function)	设置当文档可用时执行的函数
 *
 * bind/unbind方法的eventName以DOM规范为准，绑定的函数为function(event){...}，传入event为事件对象。
 *
 * 自定义事件-鼠标进入/离开，eventName为"DOMMouseEnter"和"DOMMouseLeave"。
 * 这个功能是依赖事件传播的，当一个元素内的子元素绑定于mouseover的函数内取消了事件冒泡的话，当鼠标移入该子元素时，其父元素将触发"DOMMouseLeave"事件。
 *
 * 自定义事件-拖拽，eventName为"DOMDrag"，绑定的函数为function(event,x,y){...}，参数依次为事件对象、偏移横坐标、偏移纵坐标。
 * 当拖拽开始时，如果绑定的函数有before属性的另一函数，将执行之。
 * 当拖拽结束时，如果绑定的函数有after属性的另一函数，将执行之。
 *
 * 同一元素可以绑定多个不同的函数。
 * onEvent函数的this引用目标元素。
 *
 * onDOMReady方法将自动运行，此事件激活后，将删除EventManager对onDOMReady及的setOnDOMReady引用。
 * 用户可以用setOnDOMReady方法添加文档可用后运行的函数，可以多次添加，在文档可用后他们将顺次运行（包括样式表），这时window.onload尚未触发。
 * 使用此方法可避免当一个页面中如果有很多图片时，使用window.onload会有较长的等待才会去执行代码。
 * 在这些添加的函数中可以对DOM进行操作，但要注意此时图片等媒体是尚未载入的，如果有图片的宽度、高度未定义，却又尝试获取该图片可能影响到的元素的宽度或高度时，将得不到预期的效果。
 * 该方法综合了prototype 1.6、jquery 1.2.6、ext 2.0等各种实现方法的优点。
 */
//--------------------------------------------------[EventManager]
var EventManager=function()
{
	function bind($element,eventName,onEvent)
	{
		//包裹函数。如果被DOM2的addEventListener调用则该函数的this为目标元素，如果被IE的attachEvent调用则该函数的this为window。此处统一设置为目标元素。
		function wrapper(event)
		{
			onEvent.call($element,event||window.event);
		}
		//防止重复绑定，DOM2的addEventListener本身可以防止重复绑定同一函数，但IE的attachEvent确允许多次绑定同一函数，此处阻止重复绑定。
		for(var i=0;i<pool.length;i++)
		{
			var statement=pool[i];
			if(statement.$element===$element&&statement.eventName===eventName&&statement.onEvent===onEvent)return;
		}
		//向池压入。
		pool.push({$element:$element,eventName:eventName,onEvent:onEvent,wrapper:wrapper});
		//鼠标滚轮事件是个特例，IE5不支持，IE6、IE7、Opera、Safari使用的事件名为"mousewheel"，Firefox使用的事件名为"DOMMouseScroll"。
		if(eventName=="DOMMouseScroll"&&/compatible|WebKit|Khtml|Opera/i.test(navigator.userAgent))eventName="mousewheel";
		//开始绑定，其中IE只支持attachEvent，Firefox、Safari只支持addEventListener，Opera两者都支持。
		if($element.addEventListener)$element.addEventListener(eventName,wrapper,false);
		else if($element.attachEvent)$element.attachEvent("on"+eventName,wrapper);
		else $element["on"+eventName]=wrapper;
	}
	function unbind($element,eventName,onEvent)
	{
		//包裹函数。
		var wrapper=null;
		//找到绑定的项目。
		for(var i=0;i<pool.length;i++)
		{
			var statement=pool[i];
			if(statement.$element===$element&&statement.eventName===eventName&&statement.onEvent===onEvent)
			{
				wrapper=statement.wrapper;
				//从池弹出。
				pool.splice(i,1);
				break;
			}
		}
		//找不到则返回。
		if(!wrapper)return;
		//鼠标滚轮特例。
		if(eventName=="DOMMouseScroll"&&/compatible|WebKit|Khtml|Opera/i.test(navigator.userAgent))eventName="mousewheel";
		//开始解除。
		if($element.removeEventListener)$element.removeEventListener(eventName,wrapper,false);
		else if($element.detachEvent)$element.detachEvent("on"+eventName,wrapper);
		else $element["on"+eventName]=null;
	}
	function unbindAll()
	{
		while(pool.length>0)
		{
			var statement=pool[0];
			unbind(statement.$element,statement.eventName,statement.onEvent);
		}
		if(window.onload)window.onload=null;
	}
	//自定义事件-鼠标进入/离开。
	function getElementObject($element)
	{
		for(var i=0;i<pEL.length;i++)if(pEL[i].$element===$element)return pEL[i];
	}
	function mouseEnter(event)
	{
		var oEL=getElementObject(this);
		if(oEL.leave)
		{
			clearTimeout(oEL.leave);
			oEL.leave=null;
		}
		if(oEL.enter)return;
		for(var i=0;i<oEL.enterFunctions.length;i++)oEL.enterFunctions[i].call(this,event);
		oEL.enter=true;
	}
	function mouseLeave(event)
	{
		var oEL=getElementObject(this);
		oEL.leave=setTimeout(function(){for(var i=0;i<oEL.leaveFunctions.length;i++)oEL.leaveFunctions[i].call(oEL.$element,event);oEL.enter=oEL.leave=null},0);
	}
	function bindDOMMouseEnterAndLeave($element,onEvent,type)
	{
		//同一元素可以绑定多个不同的函数，但不能重复绑定相同的函数。
		for(var i=0;i<pEL.length;i++)
		{
			if(pEL[i].$element===$element)
			{
				for(var j=0;j<pEL[i][type+"Functions"].length;j++)if(pEL[i][type+"Functions"][j]===onEvent)return;
				pEL[i][type+"Functions"].push(onEvent);
				return;
			}
		}
		var o={$element:$element,enterFunctions:[],leaveFunctions:[],enter:null,leave:null};
		o[type+"Functions"].push(onEvent);
		pEL.push(o);
		bind($element,"mouseover",mouseEnter);
		bind($element,"mouseout",mouseLeave);
	}
	function unbindDOMMouseEnterAndLeave($element,onEvent,type)
	{
		//如果解除后该元素可不再有其他绑定的函数，取消事件。
		for(var i=0;i<pEL.length;i++)
		{
			if(pEL[i].$element===$element)
			{
				for(var j=0;j<pEL[i][type+"Functions"].length;j++)
				{
					if(pEL[i][type+"Functions"][j]===onEvent)
					{
						pEL[i][type+"Functions"].splice(j,1);
						if(pEL[i].enterFunctions.length==0&&pEL[i].leaveFunctions.length==0)
						{
							pEL.splice(i,1);
							unbind($element,"mouseover",mouseEnter);
							unbind($element,"mouseout",mouseLeave);
						}
						return;
					}
				}
				return;
			}
		}
	}
	//自定义事件-拖拽。
	function drag(event)
	{
		for(var i=0;i<oD.functions.length;i++)oD.functions[i].call(oD.$element,event,event.clientX+ElementManager.getWindowSrollLeft()-oD.x,event.clientY+ElementManager.getWindowSrollTop()-oD.y);
	}
	function drop(event)
	{
		if(oD.$element.releaseCapture)oD.$element.releaseCapture();
		unbind(document,"mousemove",drag);
		unbind(document,"mouseup",drop);
		unbind(window,"blur",drop);
		document.body.focus();
		for(var i=0;i<oD.functions.length;i++)if(oD.functions[i].after)oD.functions[i].after.call(oD.$element,event);
		oD={};
	}
	function initDOMDrag(event)
	{
		if(!EventManager.getMouseButton(event).left)return;
		EventManager.stopPropagation(event);
		EventManager.preventDefault(event);
		for(var i=0;i<pD.length;i++)
		{
			if(pD[i].$element===this)
			{
				oD.$element=this;
				oD.functions=pD[i].functions;
				oD.x=event.clientX+ElementManager.getWindowSrollLeft();
				oD.y=event.clientY+ElementManager.getWindowSrollTop();
				break;
			}
		}
		for(var i=0;i<oD.functions.length;i++)if(oD.functions[i].before)oD.functions[i].before.call(this,event);
		if(this.setCapture)this.setCapture();
		bind(document,"mousemove",drag);
		bind(document,"mouseup",drop);
		bind(window,"blur",drop);
	}
	function bindDOMDrag($element,onEvent)
	{
		//同一元素可以绑定多个不同的函数，但不能重复绑定相同的函数。
		for(var i=0;i<pD.length;i++)
		{
			if(pD[i].$element===$element)
			{
				for(var j=0;j<pD[i].functions.length;j++)if(pD[i].functions[j]===onEvent)return;
				pD[i].functions.push(onEvent);
				return;
			}
		}
		pD.push({$element:$element,functions:[onEvent]});
		bind($element,"mousedown",initDOMDrag);
	}
	function unbindDOMDrag($element,onEvent)
	{
		//如果解除后该元素可不再有其他绑定的函数，取消事件。
		for(var i=0;i<pD.length;i++)
		{
			if(pD[i].$element===$element)
			{
				for(var j=0;j<pD[i].functions.length;j++)
				{
					if(pD[i].functions[j]===onEvent)
					{
						pD[i].functions.splice(j,1);
						if(pD[i].functions.length==0)
						{
							pD.splice(i,1);
							unbind($element,"mousedown",initDOMDrag);
						}
						return;
					}
				}
				return;
			}
		}
	}
	var pool=[];
	var pEL=[];
	var pD=[];
	var oD={};
	var functions=
	{
		bind:function($element,eventName,onEvent)
		{
			if(eventName=="DOMDrag")bindDOMDrag($element,onEvent);
			else if(eventName=="DOMMouseEnter")bindDOMMouseEnterAndLeave($element,onEvent,"enter");
			else if(eventName=="DOMMouseLeave")bindDOMMouseEnterAndLeave($element,onEvent,"leave");
			else bind($element,eventName,onEvent);
		},
		unbind:function($element,eventName,onEvent)
		{
			if(eventName=="DOMDrag")unbindDOMDrag($element,onEvent);
			else if(eventName=="DOMMouseEnter")unbindDOMMouseEnterAndLeave($element,onEvent,"enter");
			else if(eventName=="DOMMouseLeave")unbindDOMMouseEnterAndLeave($element,onEvent,"leave");
			else unbind($element,eventName,onEvent);
		},
		getTargetElement:function(event)
		{
			return event.target||event.srcElement;
		},
		getKey:function(event)
		{
			var key=
			{
				keyCode:event.keyCode,
				ctrlKey:event.ctrlKey,
				altKey:event.altKey,
				shiftKey:event.shiftKey,
				metaKey:event.metaKey
			};
			return key;
		},
		getMouseButton:function(event)
		{
			var eW=event.which;
			var eB=event.button;
			var mouseButton=
			{
				left:eW?eB==0:!!(eB&1),
				middle:eW?eB==1:!!(eB&4),
				right:eW?eB==2:!!(eB&2)
			};
			return mouseButton;
		},
		//IE5不支持滚轮，将返回-1。
		getMouseWheel:function(event)
		{
			return event.wheelDelta==0||event.detail==1?0:event.wheelDelta<0||event.detail>0?1:-1;
		},
		getMousePosition:function(event)
		{
			var mousePosition=
			{
				clientX:event.clientX,
				clientY:event.clientY,
				offsetX:"offsetX" in event?event.offsetX:event.layerX-1,
				offsetY:"offsetY" in event?event.offsetY:event.layerY-1,
				screenX:event.screenX,
				screenY:event.screenY
			};
			return mousePosition;
		},
		stopPropagation:function(event)
		{
			event.stopPropagation?event.stopPropagation():event.cancelBubble=true;
		},
		preventDefault:function(event)
		{
			event.preventDefault?event.preventDefault():event.returnValue=false;
		},
		onDOMReady:function()
		{
			var self=arguments.callee;
			self.pool=[];
			self.fire=function()
			{
				for(var i=0;i<self.pool.length;i++)self.pool[i]();
				delete EventManager.onDOMReady;
				delete EventManager.setOnDOMReady;
			};
			//IE。
			if(window.ActiveXObject)
			{
				document.write("<"+"script src=\"//:\" defer=\"true\" onreadystatechange=\"if(this.readyState=='complete'){this.onreadystatechange=null;this.parentNode.removeChild(this);EventManager.onDOMReady.fire();}\"></script"+">");
				return;
			}
			//Opera<9。
			if(window.opera&&parseInt(window.opera.version())<9)
			{
				function operaDOMReady()
				{
					for(var i=0;i<document.styleSheets.length;i++)
					if(document.styleSheets[i].disabled)
					{
						setTimeout(arguments.callee,0);
						return;
					}
					EventManager.onDOMReady.fire();
				}
				(function(){/loaded|complete/.test(document.readyState)?operaDOMReady():setTimeout(arguments.callee,0);})();
				return;
			}
			//Safari。
			if(/WebKit|Khtml/i.test(navigator.userAgent))
			{
				function safariDOMReady()
				{
					var nStyles=0;
					var aLinks=document.getElementsByTagName("link");
					var aStyles=document.getElementsByTagName("style");
					for(var i=0;i<aLinks.length;i++)if(aLinks[i].rel.toLowerCase()=="stylesheet")nStyles++;
					nStyles+=aStyles.length;
					(function(){document.styleSheets.length==nStyles?EventManager.onDOMReady.fire():setTimeout(arguments.callee,0);})();
				}
				(function(){/loaded|complete/.test(document.readyState)?safariDOMReady():setTimeout(arguments.callee,0);})();
				return;
			}
			//原生支持的浏览器。
			if(document.addEventListener)
			{
				document.addEventListener("DOMContentLoaded",EventManager.onDOMReady.fire,false);
			}
			//极少情况，绑定到window.onload。
			else
			{
				window.onload=EventManager.onDOMReady.fire;
			}
		},
		setOnDOMReady:function(onDOMReady)
		{
			EventManager.onDOMReady.pool.push(onDOMReady);
		}
	};
	bind(window,"unload",unbindAll);
	return functions;
}();
EventManager.onDOMReady();
EventManager.setOnDOMReady(function(){if(typeof onDOMReady=="function")onDOMReady();});
/**
 * @name crossDomain
 * @author sundongguo
 * @version 20080610
 *
 * 使用crossDomain()允许近似域名站点的数据交换。
 * 避免写成硬编码在本机调试时（无HTTP环境），出现错误信息。
 */
//--------------------------------------------------[crossDomain]
//if(document.domain)document.domain=document.domain.substring(document.domain.indexOf(".")+1);
/////////////////////////

function $(sId){
	return $E(sId).El;
}