// JavaScript Document
try{document.execCommand("BackgroundImageCache", false, true);}catch(e){} //IE缓存图像
var zQuery=function(ele,tagName,className){ //核心对象
	if ( window == this ) return new zQuery(ele,tagName,className);
	if(!arr){var arr=new Array;}
	if(ele){
		if(ele.constructor!=zQuery){
			var elem=typeof(ele)=="object"?ele:document.getElementById(ele);
			if(!tagName){
				arr.push(elem);
			}else{
				var tags=elem.all&&!window.opera?tagName=="*"?elem.all:elem.all.tags(tagName):elem.getElementsByTagName(tagName);
				if(!className){
					for(var i=0, l=tags.length; i<l; i++){
						arr.push(tags[i]);
					}
				}else{
					var reClassName=RegExp("(^|\\s+)"+className+"($|\\s+)");
					for(var i=0, l=tags.length; i<l; i++){
						if(reClassName.test(tags[i].className)){
							arr.push(tags[i]);
						}
					}
				}
			}
		}else{
			for(var i=0, l=ele.length; i<l; i++){
				arr=arr.concat(Array.prototype.slice.call(zQuery(ele[i],tagName,className)));
			}
		}
	}
	return this.setArray(arr); //返回zQuery对象原型
}

zQuery.prototype.setArray = function( arr ) {
	this.length = 0;
	Array.prototype.push.apply( this, arr );
	return this;
}

zQuery.fn=zQuery.prototype;

var $=zQuery;

/*zQuery.fn.concat = function(z){
	//if(z.constructor==zQuery){
    	for(var i=0,tl=this.length, zl=z.length; i<zl; i++){
       		this[tl+i]=z[i];
    	}
	//}
	return this;
}*/

zQuery.fn.each = function(method){
    for(var i=0,l=this.length; i<l; i++){ //对每个对象执行method函数
        method.call(this[i],i);
    }
}

zQuery.fn.css = function(cssText){ //返回前一个元素节点集合
	this.each(function(){
		$.DOM.css(this,cssText);
	});
}

zQuery.fn.next = function(span){ //返回前一个元素节点集合
	var z=new $;
	this.each(function(){
		z[arguments[0]]=$.DOM.next(this,span);
	});
	return z;
}

zQuery.fn.prev = function(span){ //返回后一个元素节点集合
	var z=new $;
	this.each(function(){
		z[arguments[0]]=$.DOM.prev(this,span);
	});
	return z;
}

zQuery.fn.addClass = function(className){ //
	this.each(function(){
		$.DOM.addClass(className);
	});
	return this;
}

zQuery.fn.removeClass = function(className){ //
	this.each(function(){
		$.DOM.removeClass(this,className);
	});
	return this;
}

zQuery.fn.addEvent = function(sEventType,fnHandler){ //添加事件函数到每个对象
	var args=[].slice.call(arguments);
	this.each(function(){
		$.Event.addEvent.apply(null,[this].concat(args));
	});
	return this;
}

zQuery.Event={
	addEvent: function(oTarget, sEventType, fnHandler){ //为元素添加事件函数
		var args=[].slice.call(arguments,3); //获取事件函数参数
		var arrFnHandler=oTarget["__on"+sEventType+"__"];
		var fnReHandler=function(e){fnHandler.apply(oTarget,[e].concat(args))}
		if(arrFnHandler){
			arrFnHandler.push(fnReHandler);
		}else{
			arrFnHandler=oTarget["__on"+sEventType+"__"]=[fnReHandler];
		}
		var al=arrFnHandler.length;
		arrFnHandler[al-1].args=[fnHandler].concat(args);
		var fn=arrFnHandler[al-1];
		if(oTarget.addEventListener){
			oTarget.addEventListener(sEventType, fn, false);
		}else if(oTarget.attachEvent){
			oTarget.attachEvent("on"+sEventType, fn);
		}else{
			oTarget["on"+sEventType]=oTarget[fn];
		}
	},
	removeEvent: function(oTarget, sEventType, fnHandler){ //删除元素事件函数，引用类型参数
		var args=[].slice.call(arguments,2);
		var arrFnHandler=oTarget["__on"+sEventType+"__"];
		if(arrFnHandler){
			for(var i=0, l=arrFnHandler.length; i<l; i++){
				var fn=arrFnHandler[i];
				if(fn.args.equalto(args)){
					if(oTarget.removeEventListener){
						oTarget.removeEventListener(sEventType, fn, false);
						arrFnHandler.splice(i,1);
						break;
					}else if(oTarget.detachEvent){
						oTarget.detachEvent("on"+sEventType, fn);
						arrFnHandler.splice(i,1);
						break;
					}else{
						oTarget["on"+sEventType]=null;
						break;
					}
				}
			}
			oTarget["__on"+sEventType+"__"]=arrFnHandler.concat(); //重设同值的新数组
			arrFnHandler=null; //GC 垃圾回收，释放内存
		}
	},
	removeEvents: function(oTarget, sEventType){ //删除元素相同事件类型的所有事件函数
		for(sProp in oTarget){
			if(sProp=="__on"+sEventType+"__"){
				var arrFnHandler=oTarget[sProp];
				for(var l=arrFnHandler.length, i=l-1; i>-1; i--){
					var fn=arrFnHandler[i];
					if(oTarget.removeEventListener){
						oTarget.removeEventListener(sEventType, fn, false);
						arrFnHandler.pop();
					}else if(oTarget.detachEvent){
						oTarget.detachEvent("on"+sEventType, fn);
						arrFnHandler.pop();
					}else{
						oTarget["on"+sEventType]=null;
						break;
					}
				}
				oTarget[sProp]=arrFnHandler.concat(); //重设同值的新数组
				arrFnHandler=null; //GC 垃圾回收，释放内存
			}
		}
	},
	removeAllEvents: function(oTarget){ //删除元素所有事件类型的所有事件函数
		var arrEvent=[];
		var reEventType=/^__on([a-z]+)__$/i;
		for(sProp in oTarget){
			if(reEventType.test(sProp)){
				arrEvent.push(RegExp.$1);
			}
		}
		for(var i=0, l=arrEvent.length; i<l; i++){
			var sEventType=arrEvent[i];
			EventUtil.removeEventHandlers(oTarget, sEventType);
		}
	}
}

Array.prototype.equalto=function(arr){ // 扩展数组原型，判断同值数组
	var tl=this.length, al=arr.length;
	if(tl!=al){
		return false;
	}else{
		for(var i=0;i<tl;i++){
			if(this[i]!==arr[i]){
				return false;
			}
		}
		return true;
	}
}

if(!Array.indexOf){
	Array.prototype.indexOf=function(obj){ // 扩展数组原型，查找匹配的项
		for(var i=0, l=this.length; i<l; i++){
			if(this[i]===obj){
				return i;
			}
		}
		return -1;
	}
}

zQuery.DOM={ //扩展DOM方法
	prev: function(ele,span){ //返回前一个元素节点
		return this.contextual(ele,"previousSibling",span)
	},
	next: function(ele,span){ //返回后一个元素节点
		return this.contextual(ele,"nextSibling",span)
	},
	contextual: function(ele,ubiety,span){ //查找前后元素节点方法，并可选择是否需要按“深度优先”原则越级查找
		if(!ele)return;
		elem=ele[ubiety];
		return span ? elem==undefined ? this.contextual(ele.parentNode,ubiety,span) : elem.nodeType != 1 ? this.contextual(elem,ubiety,span) : elem : elem==undefined ? elem : elem.nodeType != 1 ? this.contextual(elem,ubiety) : elem;
	},
	first: function(ele){ //返回第一个子元素节点
		elem=ele.firstChild;
		return elem && elem.nodeTyoe !=1 ? this.next(elem) : elem;
	},
	last: function(ele){ //返回最后一个子元素节点
		elem=ele.lastChild;
		return elem && elem.nodeTyoe !=1 ? this.prev(elem) : elem;
	},
	pageX: function(ele){ //返回元素相对页面的X轴向偏移值
		return ele.offsetParent ? ele.offsetLeft + this.pageX(ele.offsetParent) : ele.offsetLeft;
	},
	pageY: function(ele){ //返回元素相对页面的Y轴向偏移值
		return ele.offsetParent ? ele.offsetTop + this.pageY(ele.offsetParent) : ele.offsetTop;
	},
	finalStyle: function(ele,attr){ //返回元素最终样式
		return (ele.currentStyle || document.defaultView.getComputedStyle(ele,false))[attr];
	},
	css: function(ele,cssText){ //返回或写入元素内联样式
		var sCssText=ele.style.cssText;
		if(!cssText){ //返回内联样式
			return sCssText||ele.getAttribute("style");
		}else if(typeof(cssText)=="string"){ //若为字符串，则写入并覆盖原内联样式
			sCssText ? ele.style.cssText=cssText : ele.setAttribute("style",cssText);
		}else if(typeof(cssText)=="object"){ //若为对象（键值对形式），写入内联样式
			for(prop in cssText){
				ele.style[prop]=cssText[prop];
			}
		}
	},
	addClass: function(ele,className){ //为元素添加一个样式类
		ele.className=ele.className.length ? " " : "" + className;
	},
	removeClass: function(ele,className){ //为元素删除一个样式类
		RegExp("((^|\\s+)"+className+"($|\\s+))").test(ele.className);
		var $2=RegExp.$2, $3=RegExp.$3;
		ele.className=ele.className.replace(RegExp.$1,/\s/.test($2)&&/\s/.test($3) ? " " : "");
	},
	verifyClass: function(ele,className){ //校验元素是否包含一个样式类
		return RegExp("(?:^|\\s+)"+className+"(?:$|\\s+)").test(ele.className);
	}
}

zQuery.system={
	Language: (function(){return navigator.systemLanguage})()
}

zQuery.BOM={
	app: (function(){
		return navigator.appVersion;
	})(),
	IE: function(){ //判断是否为IE浏览器
		return this.app.indexOf("MSIE")>-1;
	},
	IEcur: function(){ //判断是否为IE浏览器，若是则返回IE版本号
		if(this.IE())return this.app.substr(this.app.indexOf("MSIE")+5,3);
	}
}

zQuery.transform={
	$: function(arr){ //将数组或集合转换为zQuery对象
		/*var z=new $;
		if(typeof(arr)=="object"){
			if(arr.length!=undefined){
				Array.prototype.push.apply(z,arr.constructor==Array?arr:Array.prototype.slice.call(arr));
			}else{
				z[0]=arr;
			}
		}
		return z;*/
		var z=new $;
		if(arr.length!=undefined){
    		for(var i=0,l=arr.length; i<l; i++){
        		z[i]=arr[i];
   			}
		}else{
			z[0]=arr;
		}
		return z;
	}
}
