xy = function() {
	 //DOM selection function
	 function $(id){
		  return document.getElementById(id);
	 }

	 function getByClass(className,tag,parent){
		  parent = $(parent) || document;
		  tag = tag || '*';
		  var allTags = parent.getElementsByTagName(tag);
		  var resultElement = new Array();
		  for(var i=0; i<allTags.length; i++){
				element = allTags[i];
				if(hasClass(element,className)){
					resultElement.push(element);
				}
		  }
		  return resultElement;
	 }

	 function reg(className){
		  return new RegExp('(\\s|^)'+className+'(\\s|$)');
	 };
	 function hasClass(element,className){
		  return element.className.match(reg(className));};
	 function addClass(element,className){
		  if (!hasClass(element,className)) element.className += " " + className;
	 };
	 function removeClass(element,className) {
		  if (hasClass(element,className)) {
				element.className=element.className.replace(reg(className),' ');
		  }
	 };
	 function addEvent(element,type,func){
		  if(element.addEventListener){
				element.addEventListener(type,func,false);
				return true;
		  }else if(element.attachEvent){
				element.attachEvent('on'+type,func);
				return true;
		  }
		  return false;
	 };
	 function removeEvent(element,type,func){
		  if(element.removeEventListener){
				element.removeEventListener(type,func,false);
				return true;
		  }else if(element.detachEvent){
				element.detachEvent('on'+type,func);
				return true;
		  }
		  return false;
	 }
	 function toggleDisplay(element,value){
		if(element.style.display != 'none'){
			element.style.display = 'none';
		}else{
			element.style.display = value || '';
		}
		return true;
	 }
	 
	 function browserSize(){
		var de = document.documentElement;
		return{
			 'width':(
						window.innerWidth
						|| (de && de.clientWidth)
						|| document.body.clientWidth),
			 'height':(
						window.innerHeight
						|| (de && de.clientHeight)
						|| document.body.clientHeight)
		}
	 }
	 function pointerPosition(){
		  W3CEvent = W3CEvent || window.event;
		  var x = W3CEvent.pageX || (W3CEvent.clientX +
					 (document.documentElement.scrollLeft || document.body.scrollLeft));
		  var y = W3CEvent.pageY || (W3CEvent.clientY +
					 (document.documentElement.scrollTop || document.body.scrollTop));
		  return {'x': x,'y': y};
	 }
	
	 
	 return {
		  $: $,
		  addClass: addClass,
		  removeClass: removeClass,
		  hasClass: hasClass,
		  addEvent: addEvent,
		  removeEvent: addEvent,
		  getByClass: getByClass,
		  toggleDisplay: toggleDisplay,
		  browserSize: browserSize,
		  pointerPosition: pointerPosition
	 }
}();

// Module 1 - Tab JS
function tabInit(tabType){
/* s-参数说明 
	 tabType={
			trigger:'触发事件',
			tabCurrentClass:'当前tab的className'
			[,delay:'事件触发的延时'
			,auto:'是否自动播放',
			timer:'自动播放周期']
	 }
	 其后的tab->content对应关系以数组形式添加，以其id为参数识别，如下：
	 [tab1.id,content1.id],[tab2.id,content2.id],......
	 
	 eg: tabInit(tabType,[t1,c1],[t2,c2],...);
E-参数说明 */ 

	 var sNum,aNum=0;
	 var func,c_func,t_func,changeTab,changeFunc,watchfunc;
	 for(var i=1;i<arguments.length;i++){
		  var arg=arguments;
		  if(arg[i].length>2 && arg[i][2]=='o'){
				xy.addClass(xy.$(arg[i][0]),tabType.tabCurrentClass);
				xy.$(arg[i][1]).style.display='block';
		  }else{
				xy.$(arg[i][1]).style.display='none';
		  }
		  var func=function(i){
					 return function(){
						  c_func = function(){
						  for(var j=1;j<arg.length;j++){
						  xy.removeClass(xy.$(arg[j][0]),tabType.tabCurrentClass);
						  xy.$(arg[j][1]).style.display='none';
						  }
						  xy.$(arg[i][1]).style.display = 'block';
						  xy.addClass(xy.$(arg[i][0]),tabType.tabCurrentClass);
						  }
						  t_func = setTimeout(c_func,tabType.delay)
						  }
					 };
		  xy.addEvent(xy.$(arg[i][0]),tabType.trigger,func(i));
		  if(tabType.trigger == 'mouseover' || tabType.auto){
				xy.addEvent(xy.$(arg[i][0]),'mouseout',function(){
						  clearTimeout(t_func);
						  });
		  }
		  if(tabType.auto){
				xy.addEvent(xy.$(arg[i][0]),tabType.trigger,function(){if(aNum>0){clearInterval(changeFunc)}});

/* S--避免第一次轮播之前用户鼠标触发切换事件引发的不规律播放bug
				xy.addEvent(xy.$(arg[i][1]),'mouseover',function(){clearInterval(changeFunc)});
				xy.addEvent(xy.$(arg[i][1]),'mouseout',function(){
						  sNum = watchfunc();
						  changeFunc = setInterval(changeTab,tabType.timer)
						  });
*/


				xy.addEvent(xy.$(arg[i][0]),'mouseout',function(){
						  sNum = watchfunc();
						  changeFunc = setInterval(changeTab,tabType.timer)
						  });

		  }
	 }
	 //tab切换
	 changeTab = function(){
		  if(sNum==arg.length) sNum=1;
		  func(sNum)();
		  sNum++;aNum++;
	 }
	 //判断是否开始自动播放
	 if(tabType.auto){
		  sNum = watchfunc();changeTab();
		  changeFunc = setInterval(changeTab,tabType.timer);

	 }
	 //监听当前激活的tab
	 function watchfunc(){
		  for(var i=1;i<arg.length;i++){
				if(xy.hasClass(xy.$(arg[i][0]),tabType.tabCurrentClass))
					 return i;
		  }
	 }
}
function scrollInit(id,in_id,type){
	/* S- 参数说明
		atype={
			direction:'up',
			lineHeight:60 // 一次滚动卷起的长度

			[,unit:3,	//unit 值必须能被lineHeight整除，以保证无缝，缺省则默认为1
			unit_timer:1,	// 单位为ms，缺省则为1，是1个单位移动的最快速度 
				 //用上两个参数 unit unit_timer 控制速度
			auto:true,
			timer:2000,	//auto时两次滚动的时间间隔
			nextId:'next',	//触发“下一滚”的元素id，事件为click
			prevId:'prev']	//“上一滚”
		}	

	id为执行滚动的元素id
	in_id 为滚动内容的id
	E- 参数说明 */
	var list_num = xy.$(in_id).getElementsByTagName('li').length;
	if(list_num < 6){
		xy.$(type.prevId).style.display = 'none';
		xy.$(type.nextId).style.display = 'none';
		return false;
	}
	var x=false,y=false,negtive=false,unit=type.unit || 1,count=0,flag=false;
	var sc_unit,sc_block,sc_func,sc_next,unit_timer=type.unit_timer || 1,stop_func,go_func,back_func,next_func,prev_func;
	if(!type.lineHeight){type.lineHeight= xy.$(id).scrollHeight;}
	if((type.direction == 'up') || (type.direction == 'down')){
		y=true;
	}else{
		x=true;
		xy.$(in_id).style.width = list_num * 2 * 175 + 'px';
	}
	if((type.direction == 'right') || (type.direction == 'down')){
		negtive=true;
		type.lineHeight -= type.lineHeight*2;
	}
	xy.$(in_id).innerHTML += xy.$(in_id).innerHTML;
	if(negtive){
		unit -= unit*2;
	}
	sc_unit = function(){
		if(negtive){
			 if(y){
				  if(xy.$(id).scrollTop == 0){
						xy.$(id).scrollTop = parseInt(xy.$(id).scrollHeight/2);
				  }
			 }else if(x){
				  if(xy.$(id).scrollLeft == 0){
						xy.$(id).scrollLeft = parseInt(xy.$(id).scrollWidth/2);
				  }
			 }
		}else{
			 if(y){
				  if(xy.$(id).scrollTop == parseInt(xy.$(id).scrollHeight/2)){
						xy.$(id).scrollTop = 0;
				  }
			 }else if(x){
				  if(xy.$(id).scrollLeft == parseInt(xy.$(id).scrollWidth/2)){
						xy.$(id).scrollLeft = 0;
				  }
			 }
		}
		if(y){
			 xy.$(id).scrollTop += unit;
		}else if(x){
			 xy.$(id).scrollLeft += unit;
		}
		count += Math.abs(unit); 
		if(count >= Math.abs(type.lineHeight)){
			clearInterval(sc_func);
			if((!negtive && unit<0) || (negtive && unit>0)) unit -= unit*2;
			flag = true;
			if(type.auto){
				if(type.timer){
					sc_next = setTimeout(sc_block,type.timer);
				}else{
					sc_block();
				}
			}
		}else{
		flag=false;
		}
	}
	sc_block = function(){
		count = 0;
		sc_func = setInterval(sc_unit,unit_timer);	
	}
	stop_func = function(){
		clearInterval(sc_func);
		if(flag && type.timer){
			clearTimeout(sc_next);
		}
	}
	go_func = function(){
		if(flag){
			sc_block();
		}else{
			sc_func = setInterval(sc_unit,unit_timer);	
		}
	}
	back_func = function(){
		if(xy.$(id).scrollLeft == 0){
			xy.$(type.prevId).setAttribute('title','已经是第一张');
			xy.addClass(xy.$(type.prevId),'enable');
			return false;
		}
		if((!negtive && unit>0) || (negtive && unit<0)){
			unit -= unit*2;
			count = type.lineHeight-count;
		}
		if(flag){
			sc_block();
		}else{
			sc_func = setInterval(sc_unit,unit_timer);	
		}
	}
	next_func = function(){
		stop_func();
		go_func();
	}
	prev_func = function(){
		stop_func();
		back_func();
	}
	if(type.auto){
		xy.addEvent(xy.$(id),'mouseover',stop_func);
		xy.addEvent(xy.$(id),'mouseout',go_func);
		sc_block();
	}
	if(type.nextId){
		xy.addEvent(xy.$(type.nextId),'click',next_func);
	}
	if(type.prevId){
		xy.addEvent(xy.$(type.prevId),'click',prev_func);
	}
}
var dom = [];
dom.isReady = false;
dom.ready = function(fn){
	dom.initReady();
	if(dom.isReady){
		fn()
	}else{
		dom.push(fn);
	}
}
dom.initReady = function(){
	if(arguments.callee.used) return;
	arguments.callee.used = true;
	if(document.readyState === "complete") return dom.fireReady();
	if(!+"\v1"){
		document.attachEvent("onreadystatechange", function(e){
			if(document.readyState == "complete"){
				document.detachEvent("onreadystatechange", arguments.callee);
				dom.fireReady();
			}
		});
		(function(){
			if(dom.isReady) return;
			var node = new Image;
			try{
				node.doScroll();
				node = null;
			}catch(e){
				setTimeout(arguments.callee, 64);
				return;
			}
			dom.fireReady();
		});
	}else{
		document.addEventListener("DOMContentLoaded", function(){
			document.removeEventListener("DOMContentLoaded", arguments.callee, false);
			dom.fireReady();
		}, false);
	}
};
dom.fireReady = function(){
	if(!dom.isReady){
		if(!document.body) return setTimeout( dom.fireReady, 16 );
		dom.isReady = true;
		if(dom.length){
			for(var i=0, fn;fn = dom[i];i++)
				fn()
		}
	}
}

