﻿	/*___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;
	}
}
Array.prototype.each = function(fn,bind){
	for(var i = 0;i < this.length;i++){
		fn.call(bind,this[i],i,this);
	}
}
/**
*@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;
Object.extend = function(destination,original){
		for(var property in original){
			if(destination.hasOwnProperty(property)) 
			destination[property] = original[property];
		}
	
}
/*___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.2.0.B
* 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;
    }
}
/**
* Title     : SimpleMenu类
* Author    : Ziv
* Version   : 1.1.0.A
* Desc      : 依赖于ziv包，不可单独调用
* PubDate   : 2009-11-26
*/

function SimpleMenu()
{
	var _ = this;
	this.options = {
		elem : "menu",					//目标UL id名 默认为 "menu"
		data : "",					    //数据源(数组 -> 对象 -> 数组)结构
		"className" : "Primo",          //新增UL类名 默认为"Primo"
		mode : 1,                       //模式 1=竖向 2=横向 默认为竖向
		index : undefined               //所谓的BaseId 
	}
	this.Launch = new Collection;  
	this.Exit = new Collection;    
	this._className = this.options.className;
	this.config = function(options){
		Object.extend(this.options,options || {});
		this.data = _$T($(this.options.elem).getElementsByTagName("LI"),this.options.data);
	}
	this.init = function(){
		var that = this;
		var bind = function(fns){
				var _ = this;
				var handler = function(fun){fun.call(_);}
				fns.each(handler);
				}
		this.Launch.items.length ? void(0) : (this.options.mode == 1 ? this.Launch.add(function(){this.getElementsByTagName("UL")[0].style.display = "block";}) : this.options.index ? this.Launch.add(function(){_.data[0][_.options.index-1].getElementsByTagName("UL")[0].style.display = "none";this.getElementsByTagName("UL")[0].style.display = "block";}) : this.Launch.add(function(){this.getElementsByTagName("UL")[0].style.display = "block";}));
		this.Exit.items.length ? void(0) : (this.options.mode == 1 ? this.Exit.add(function(){this.getElementsByTagName("UL")[0].style.display = "none";}) : this.options.index ? this.Exit.add(function(){this.getElementsByTagName("UL")[0].style.display = "none";_.data[0][_.options.index-1].getElementsByTagName("UL")[0].style.display = "block";}) : this.Exit.add(function(){this.getElementsByTagName("UL")[0].style.display = "none";}));
		for(var i = 0;i < this.data[0].length;i++){
			var ul = document.createElement("UL");
			ul.setAttribute("class",this._className);
			ul.className = this._className;
			ul.style.position = "absolute";
			for(var j = 0;j < this.data[1][i]._title.length;j++){
				var li = document.createElement("LI");
				var a = document.createElement("A");
				var text = document.createTextNode(this.data[1][i]._title[j]);
				a.href = this.data[1][i]._href[j];
				a.appendChild(text);
				this.options.mode == 1 ? a.style.cssText = "width:100%;*zoom:1;_display:inline;white-space:nowrap;" : a.style.cssText = "*zoom:1;_display:inline;white-space:nowrap;"
				li.appendChild(a);
				ul.appendChild(li);	
				li.style.cssFloat = "none"; 
				li.style.styleFloat = "none";
			}
			this.data[0][i].style.position = "relative";
			this.data[0][i].appendChild(ul);
			ul.style.margin = ul.style.padding = ul.style.borderWidth = '0px';
			ul.style.width = ul.parentNode.offsetWidth + 'px';
			this.options.mode == 2 ? _$H(ul) : null;
			ul.style.display = 'none';
			V.addListener([this.data[0][i]],"mouseover",function(e){bind.call(this,that.Launch)},this.data[0][i]);
			V.addListener(this.data[0][i],"mouseout",function(e){bind.call(this,that.Exit)},this.data[0][i]);	
		}
		(this.options.mode == 2 && this.options.index) ? this.data[0][this.options.index-1].getElementsByTagName("UL")[0].style.display = "block" : void(0);
	}
	var _$T = function(collection,data){
			var tempArr = [[],[]];
			for(i = 0;i < collection.length;i++){
				if(collection[i] && data[i])
				{
					tempArr[0].push(collection[i]);
					tempArr[1].push(data[i]);
				}
			}
			return tempArr;	
	}
	var _$H = function(ul){
		var a_list = ul.getElementsByTagName("A");
		var li_list = ul.getElementsByTagName("LI");
		var ul_width = 0;
		Array.prototype.each.call(li_list,function(li){	li.style.cssFloat = "left"; li.style.styleFloat = "left";li.style.margin = li.style.padding = li.style.borderWidth = '0px';});
		Array.prototype.each.call(a_list,function(a){ul_width+=a.clientWidth;a.style.margin = a.style.borderWidth = '0px';});
		var left = ul.parentNode.offsetLeft,right = ul.parentNode.offsetParent.offsetWidth - left - ul.parentNode.offsetWidth;
		var diff = (ul_width - ul.parentNode.offsetWidth)/2
		ul.style.width = ul_width  + 'px';		
		if(diff > left){
			ul.style.left = -left + 'px';
		}else if(diff > right){
			ul.style.right = -right + 'px';
		}else{
			ul.style.left = -diff + 'px';
		}
	}
}
