﻿/*___ZIV 包开始___*/
var ziv ={
	version:'1.0.10.A',
	encoding:'utf-8',
	author:'ziv',
	update:'09-10-12'
};
/*命名空间*/
ziv.namespace=function(ns){
	if(!ns||!ns.length)
	{
		return null;
	}
	var _pr=ns.split('.');
	var _nx=ziv;
	for(var i=0;i!=_pr.length;i++)
	{
		_nx[_pr[i]]=_nx[_pr[i]]||{};
		_nx=_nx[_pr[i]];
	}
}

function $(el)
{
	if(!el)
	{
		return null;
	}
	else if(typeof el=='string')
	{
		return document.getElementById(el);
	}
	else if(typeof el=='object')
	{
		return el;
	}
}
/**
*@intro   传说中Moo中的$A函数，功能强大
*@fun     将id，对象，id数组，对象数组加工成对应的对象数组
*@param 	{String||Object||Array} els id，对象，id数组，对象数组
*@return 	{Array} 对象数组
*/
function $A(els){
	var _els=[];
	if(els instanceof Array)
	{
		for(var i=0;i!=els.length;i++)
		{
			_els[_els.length]=$(els[i]);
		}
	}
	else if(typeof els=='object'&&typeof els['length']!='undefined'&&els['length']>0)
	{
		for(var i=0;i!=els.length;i++)
		{
			_els[_els.length]=$(els[i]);
		}
	}else
	{
		_els[0]=$(els);
	}
	return _els;
}
/*初始化命名空间*/
ziv.namespace('Dom');
ziv.namespace('Event');
ziv.namespace('Effect');/*效果库待开发 - -#*/

ziv.Dom={
	_batch:function(el,func)
	{
		var _el=$A(el);
		for(var i=0;i!=_el.length;i++)
		{
			if(_el[i])
			{
				func(_el[i]);
			}
		}
	},
	getMouseXY:function(e)
	{
		var _x=_y=0;
		_x=document.documentElement.scrollLeft;
		_y=document.documentElement.scrollTop;
		if(e.clientX||e.clientY)
		{
			_x+=e.clientX;
			_y+=e.clientY;
		}
		else if(e.pageX||e.pageY)
		{
			_x+=e.pageX;
			_y+=e.pageY;
		}
		return [_x,_y];
	},
	getXY:function(el)
	{
		var _x=_y=0;
		while(el)
		{
			_x+=el.offsetLeft;
			_y+=el.offsetTop;
			el=el.parentElement;
		}
		return [_x,_y];
	},
	getWH:function(el)
	{
		return [el.offsetWidth,el.offsetHeight];
	},
	setOpacity:function(els,val)
	{
		var _run=function(el)
		{
			el.style.MozOpacity=''+val/100;
			el.style.filter='Alpha(Opacity='+val+')';
		}
		this._batch(els,_run);
	},
	hide:function(els)
	{
		var _run=function(el)
		{
			el.style.display='none';
		}
		this._batch(els,_run);
	},
	show:function(els)
	{
		var _run=function(el)
		{
			el.style.display='block';
		}
		this._batch(els,_run);
	},
	getClass:function(el)
	{
		if($(el))
		{
			return $(el).className;
		}
		else
		{
			return;
		}
	},
	setClass:function(els,val)
	{
		var _run=function(el)
		{
			el.className=val;
		}
		this._batch(els,_run);
		
	},
	addClass:function(els,val)
	{
		if(!val)
		{
			return;
		}
		var _run=function(el)
		{
			var _cln=el.className.split(' ');
			for(var i=0;i!=_cln.length;i++)
			{
				if(_cln[i]==val)
				{
					return;
				}
			}
			if(el.className.length>0)
			{
				el.className=el.className+' '+val;
			}
			else
			{
				el.className=val;
			}
		}
		this._batch(els,_run);
	},
	hasClass:function(el,val)
	{
		var _bl=false;
		if($(el))
		{
			if(!el.className){return;}
			var _cln=el.className.split(' ');
			for(var i=0;i!=_cln.length;i++)
			{
				if(_cln[i]==val)
				{
					_bl=true;
					break;
				}
			}
		}
		return _bl;
	},
	removeClass:function(els,val)
	{
		if(!val)
		{
			return;
		}
		var _run=function(el)
		{
			var _cln=el.className.split(' ');
			var _s='';
			for(var i=0;i!=_cln.length;i++)
			{
				if(_cln[i]!=val)
				{
					_s+=_cln[i]+' ';
				}
			}
			if(_s==' ')
			{
				_s='';
			}
			if(_s.length!=0)
			{
				_s=_s.substr(0,_s.length-1);
			}
			el.className=_s;
		}
		this._batch(els,_run);
	},
	replaceClass:function(els,vala,valb)
	{
		if(!vala||!valb)
		{
			return;
		}
		var _run=function(el)
		{
			var _cln=el.className.split(' ');
			for(var i=0;i!=_cln.length;i++)
			{
				if(_cln[i]==vala)
				{
					_cln[i]=valb;
				}
			}
			el.className=_cln.join(' ');
		}
		this._batch(els,_run);
	},
	setStyle:function(els,styleName,styleValue)
	{
		var _run=function(el)
		{
			el.style[styleName]=styleValue;
		}
		this._batch(els,_run);
	},
	getStyle:function(el,styleName)
	{
		return el.style[styleName];
	},
	getElementsByClassName:function(parentEl,className,tagName){
		if(!parentEl||!className){
			return null;
		}
		var els=cds=[];
		cds=$(parentEl).childNodes;
		className=className.toUpperCase();
		for(var i=0;i<cds.length;i++){
			var _type=cds[i].nodeType;
			if(_type!=3&&_type!=8&&cds[i].className.toUpperCase()==className){
				if(!tagName||cds[i].nodeName.toUpperCase()==tagName.toUpperCase()){
					els[els.length]=cds[i];
				}
			}
		}
		return els;
	}
}

ziv.Event={
	_cache:[],
	_batch:function(els,func)
	{
		try{
			els=$A(els);
			for(var i=0;i<els.length;i++){
				func(els[i]);
			}
		}
		catch(e)
		{
			//alert(e.description)
		}
	},
	/**
	*@fun    给指定元素增加监听，触发时执行一定的操作	
	*@param  {String||Array||Object} el 代操作对象的id，对象本身，id数组，对象数组；
	*@param  {String} eventName 事件名称，比如click,load,mouseover,mouseout等
	*@param  {Function} func(_ev,_scope) 事件触发的方法,其中e为出发的事件对象，_scope为响应该对象的元素对象如div,window等（要绑定的对象 - -#)
	*/
	addListener:function(els,eventName,func,range){
		var _run=function(el){
			var _scope=el;
			var _fn=function(e){
				var _ev=e||window.event;
				//传递相应事件的元素对象
				if(range){
					func.apply(range,[_ev,_scope])
				}
				else
				{
					func(_ev,_scope);
				}
			};
			if (!ziv.Event._cache[el])
			{
				ziv.Event._cache[el]=[];
			}
			/*防止重复绑定同样的事件*/
			if (ziv.Event._cache[el][func]) 
			{
				//return false;
			}
			ziv.Event._cache[el][func]=_fn;
			if(el.attachEvent){
				el.attachEvent('on'+eventName,_fn);
			}else if(el.addEventListener){
				el.addEventListener(eventName,_fn,false);
			}
			else
			{
				el['on'+eventName] = _fn;
			}
		};
		this._batch(els,_run);
	},
	removeListener:function(els,eventName,func)
	{
		var _run=function(el)
		{
			if(el.detachEvent)
			{
				el.detachEvent('on'+eventName,ziv.Event._cache[el][func]);
			}
			else if(el.removeEventListener)
			{
				el.removeEventListener(eventName,ziv.Event._cache[el][func],false);
			}
			else
			{
				el['on'+eventName] = null;
			}
			ziv.Event._cache[el][func]=null;
		}
		this._batch(els,_run);
	}
}

var Z=ziv.Dom;
var V=ziv.Event;
/*___ZIV 包结束___*/

/*___TabControl 开始___*/

/*自定义数据集合*/
function Collection()
{
    this.items=[];
}

Collection.prototype={
    add:function(col)
    {
        this.items.push(col);
    },
    clear:function()
    {
        this.items=[];
    },
    getCount:function()
    {
    	return this.items.length;
    },
    each:function(func)
    {
    	for(var i=0;i<this.getCount();i++){
    		func(this.items[i]);
    	}
    },
    indexOf:function(item)
    {
    	var r=-1;
		for(i=0;i<this.getCount();i++ ){
            if(item==this.items[i]){ r=i; break;}
        }
        return r;
    },
    find:function(func)
    {
    	var r=null;
    	for(var i=0;i<this.getCount();i++){
    		if(func(this.items[i])==true){ r=this.items[i];break;}
    	}
    	return r;
    },
    findAll:function(func)
    {
    	var r=new Collection();
    	this.each(
    		function(item){ 
    			if(func(item)==true){ r.add(item); }
    		}
    	);
    	return r;
    }
}


function TabPage(triggerId,sheetId)
{
    this.trigger=$(triggerId);
    this.sheet=$(sheetId);
}

/**
* Title     : TabControl类
* Author    : Ziv
* Version   : 1.1.0.A
* Desc      : 依赖于ziv包，不可单独调用
* PubDate   : 2009-10-12
*/
function TabControl()
{
    this.styleName=null;
    this.tabPages=new Collection();
    this.currentTabPage=null;
    this.triggerType='click';
    this.defaultPage=0;
    this.enableSlide=false;
    this.slideInterval=3000;
    
    this.onChanging=new Collection();
    /*添加默认事件处理句柄*/
    this.onChanging.add( this.defaultChangingHandler );
    
    this.onInit=new Collection();
    /*添加默认初始化句柄*/
    this.onInit.add(this.defaultInitHandler);
    this.onInit.add(this.autoSlideInitHandler);
    
    this.onAdding=new Collection();
    /*标签页添加事件处理*/
    this.onAdding.add( this.defaultAddingHandler );
    
    /*private*/
    this._autoSlideEv=null;
}

/**
* 四个主要方法：
* add(tagPage) - 添加数据集
* addRange(triggers,sheets); -与TabPage耦合
* select(i); - 选择标签页
* init(); - 初始化函数
*/
TabControl.prototype={
    add:function(tabPage)
    {        
        this.tabPages.add(tabPage);        
        var handler=function(func){ func(tabPage); };
        this.onAdding.each( handler );
    },
    addRange:function(triggers,sheets)
    {
        if(triggers.length==0||triggers.length!=sheets.length){alert("Bothwell:'这儿块儿和那儿块儿数目不一致！'");return; }
        for(var i=0;i<triggers.length;i++){
            var tabPage= new TabPage(triggers[i],sheets[i]);
            this.add(tabPage);
        }
    },
    defaultAddingHandler:function(tabPage)
    {
    	
    },
    init:function()
    {
        var _=this;
        var handler=function(func){	func(_);}
        
        if(this.tabPages.getCount()==0){return;}      
        if(this.currentTabPage==null){
            this.currentTabPage=this.tabPages.items[this.defaultPage];
        }        
        this.onInit.each(handler);
    },
    defaultInitHandler:function(obj)
    {
		var handler=function(item){ V.addListener(item.trigger,obj.triggerType,obj.selectHanlder,obj);Z.hide(item.sheet); };		
		obj.tabPages.each(handler);		
        obj.select(obj.defaultPage);
    },
    autoSlideInitHandler:function(o){ 	 
    	if(!o.enableSlide){return;}
    	var delayStartEv=null;
    	var delayStartHandler=function(){
    		delayStartEv=setTimeout(function(){o.autoSlideHandler(o);},300);
    	};
    	var clearHandler=function(){
    		clearTimeout(delayStartEv);
    		clearInterval(o._autoSlideEv);
    	};
    	var handler=function(item){
    		V.addListener(item.trigger,o.triggerType,clearHandler,o); 
    		V.addListener(item.sheet,'mouseover',clearHandler,o); 
    		V.addListener([item.trigger,item.sheet],'mouseout',delayStartHandler,o);
    	};
    	o.tabPages.each(handler);
    	o.autoSlideHandler(o);
    },
    autoSlideHandler:function(o){
    	var count=o.tabPages.getCount();
    	clearInterval(o._autoSlideEv);    	
    	o._autoSlideEv=setInterval(function(){
    		var i=o.indexOf(o.currentTabPage.trigger);
    		if(i==-1){return;}
    		i++;
    		if(i>=count){i=0;}
    		o.select(i);
    	},o.slideInterval);
    },
    selectHanlder:function(e,o)
    {
        var i= this.indexOf(o);        
        this.select(i);
    },
    select:function(i)
    {
        if(i<0||i>=this.tabPages.getCount()){return;}
        var _=this;
        var page=this.tabPages.items[i];
        
        var handler=function(func){ func(_.currentTabPage,page);};
    	this.onChanging.each(handler);
    	
        this.currentTabPage=page;
    },    
   	defaultChangingHandler:function(oldTabPage,newTabPage)
   	{
   		if(oldTabPage.sheet){
        	Z.hide(oldTabPage.sheet);
        }
        if(newTabPage.sheet){
        	Z.show(newTabPage.sheet);
        }
        Z.removeClass(oldTabPage.trigger,'current');        
        Z.addClass(newTabPage.trigger,'current');
   	},
    indexOf:function(trigger)
    {
        var r=-1;
        var handler=function(item){return item.trigger==trigger;};
        var item=this.tabPages.find( handler );
        if(item!=null){
        	r=this.tabPages.indexOf(item);
        }
        return r;
    }
}

