/**
 * @author:aliued-wd junbiao.zhujb
 */
/**
 * 给数组扩展add方法.
 * @method add 
 * @param {Object} obj 需要add的对象.
 */
Array.prototype.add = function(obj){var add_flag = true;for(var i=0;i<this.length;i++){if(this[i]==obj){add_flag = false;break;}}if(add_flag==true){this[this.length] = obj;}}

Namespace.register("Ali.util.move");
Namespace.register("Ali.util.typesetdiv");
Namespace.register("Ali.widget.movebox");
Namespace.register("Ali.widget.cookie");

(function(){
	Ali.widget.cookie = {
		/**
		 * 新增或者修改cookie.
		 * @param {Object} name cookie名.
		 * @param {Object} value cookie值.
		 * @param {Object} time 有效时间单位为毫秒.
		 */
		newAndModif:function(name,value,time){
			if(time!=null&&this.time!=''){
				document.cookie = name+"="+value+"; expires="+this.createTime(time)+";";
			}else{
				document.cookie = name+"="+value+"; expires=Fri, 31 Dec 2100 23:59:59 GMT;";
			}
		},
		/**
		 * 创建cookie的有效时间.
		 * @param {Object} time
		 */
		createTime:function(time){
			var nowTime = new Date();
			time = parseInt(time) + parseInt(nowTime.getTime());
			var needTime = new Date(time);
			return needTime.toGMTString();
		},
		getValue:function(name){
			if(document.cookie){
				var cookieStrArr = document.cookie.split("; ");
				for(var i=0;i<cookieStrArr.length;i++){
					if(cookieStrArr[i].split("=")[0]==name){
						return cookieStrArr[i].split("=")[1];
					}
				}
			}else{
				return null;
			}
		}
	}
})();
/**
 * 重构DIV位置的静态类.
 * @class typesetdiv
 */
(function(){
	var temptop = 0;
	var templeft = 0;
	var marginTop = 7;
	var totallHeight = 0;
	var offsetHeight = 0;
	var offsetLeft = 0;
	var ua = navigator.userAgent.toLowerCase(),isIE = (ua.indexOf('msie') > -1);
	Ali.util.typesetdiv = {
		/**
		 * 重新构建对象el，下标签名为targetName的，className为className的所有对象的绝对定位.
		 * @param {Object} el
		 * @param {String} className
		 * @param {Int} gap 间隔距离.
		 * @param {String} targetName
		 */
		build:function(el,className,gap,targetName){
			totallHeight = 0;
			if(isIE){offsetHeight = 2;}else{offsetLeft=1;}
			marginTop = gap;
			var tdl = el.getElementsByTagName(targetName);
			for(var i=0;i<tdl.length;i++){
				if(Ali.util.move.comprise(tdl[i].className,className)){
					tdl[i].style.position = "absolute";
					if(i==0){
						temptop = YAHOO.util.Dom.getRegion(tdl[i].parentNode).top;
						templeft = YAHOO.util.Dom.getRegion(tdl[i].parentNode).left;
						tdl[i].style.top = temptop-offsetHeight+5 +"px"
						totallHeight = totallHeight + (YAHOO.util.Dom.getRegion(tdl[i]).bottom-YAHOO.util.Dom.getRegion(tdl[i]).top);
						
					}else{
						totallHeight = totallHeight + (YAHOO.util.Dom.getRegion(tdl[i]).bottom-YAHOO.util.Dom.getRegion(tdl[i]).top);
						tdl[i].style.top = temptop-offsetHeight +"px"
					}
					tdl[i].style.left = templeft+offsetLeft + "px";
					temptop = temptop + (YAHOO.util.Dom.getRegion(tdl[i]).bottom - YAHOO.util.Dom.getRegion(tdl[i]).top) + marginTop;
				}
			}
			el.style.height = totallHeight + "px";
		},
		rebuild:function(movebox,cookieValue){
			if(isIE){}else{offsetLeft=1;}
			totallHeight = 0;
			offsetHeight = 23;
			var mb_arr = cookieValue.split("&");
			for(var i=0;i<mb_arr.length;i++){
				$(mb_arr[i]).style.position = "absolute";
				if(i==0){
					temptop = YAHOO.util.Dom.getRegion(movebox).top;
					templeft = YAHOO.util.Dom.getRegion(movebox).left;
					$(mb_arr[i]).style.top = temptop+5 +"px"
					totallHeight = totallHeight + (YAHOO.util.Dom.getRegion($(mb_arr[i])).bottom-YAHOO.util.Dom.getRegion($(mb_arr[i])).top);
				}else{
					totallHeight = totallHeight + (YAHOO.util.Dom.getRegion($(mb_arr[i])).bottom-YAHOO.util.Dom.getRegion($(mb_arr[i])).top);
					$(mb_arr[i]).style.top = temptop +"px"
				}
				$(mb_arr[i]).style.left = templeft+offsetLeft + "px";
				temptop = temptop + (YAHOO.util.Dom.getRegion($(mb_arr[i])).bottom - YAHOO.util.Dom.getRegion($(mb_arr[i])).top) + marginTop;
			}
			movebox.style.height = totallHeight + offsetHeight + "px";
			Ali.util.move.init("right_1_content",mb_arr);
		}
	};
})();
/**
 * 移动类.
 * @class move
 */
(function(){
	/**
	 * 当前触发的movebox对象.
	 * @property movebox
	 * @private
	 * @type object
	 */
	var movebox = null;
	/**
	 * 当前页面包含的movebox对象组.
	 * @property moveboxs
	 * @private
	 * @type Array
	 */
	var moveboxs = new Array();
	Ali.util.move = {
		init:function(id,mb_arr){
			var movebox = new Ali.widget.movebox(id);
			for(var i=0;i<mb_arr.length;i++){
				movebox.list.add($(mb_arr[i]));
			}
			moveboxs.add(movebox);
		},
		/**
		 * 向moveboxs中增加movebox.
		 * @method add 
		 * @param {Object} mb movebox
		 */
		add:function(mb){
			moveboxs.add(mb);
		},
		/**
		 * 向上移动当前对象在整个对象中的位置，并交换互相的位置.
		 * @method moveUp 
		 * @param {Object} m_b movebox的DOM对象.
		 * @param {Object} now 当前准备移动的DOM对象,包含在m_b里面.
		 */
		moveUp:function(m_b,now){
			movebox = this.getMoveBox(m_b);
			if(this.getUp(now)!=null){
				var startPoints = YAHOO.util.Dom.getXY(now);
				var endPoints = YAHOO.util.Dom.getXY(this.getUp(now));
				var startRegion = YAHOO.util.Dom.getRegion(now);
				var endRegion = YAHOO.util.Dom.getRegion(this.getUp(now));
				
				this.moving(now,endPoints);
				this.moving(this.getUp(now),this.getRealPoints(startRegion,endRegion,startPoints,endPoints));
				this.change(now,this.getUp(now));
			}
			Ali.widget.cookie.newAndModif("moveboxStr",this.toString());
		},
		/**
		 * 向下移动当前对象在整个对象中的位置，并交换互相的位置.
		 * @method moveDown 
		 * @param {Object} m_b movebox的DOM对象.
		 * @param {Object} now 当前准备移动的DOM对象,包含在m_b里面.
		 */
		moveDown:function(m_b,now){
			movebox = this.getMoveBox(m_b);
			if(this.getDown(now)!=null){
				var startPoints = YAHOO.util.Dom.getXY(now);
				var endPoints = YAHOO.util.Dom.getXY(this.getDown(now));
				var startRegion = YAHOO.util.Dom.getRegion(now);
				var endRegion = YAHOO.util.Dom.getRegion(this.getDown(now));

				this.moving(this.getDown(now),startPoints);
				this.moving(now,this.getRealPoints(endRegion,startRegion,endPoints,startPoints));
				this.change(now,this.getDown(now));
			}
			Ali.widget.cookie.newAndModif("moveboxStr",this.toString());
		},
		/**
		 * 获取向下移动层应该移到的坐标点位置.
		 * @method getRealPoints
		 * @param {Object} uR 移动前上面部分的区域对象.
		 * @param {Object} dR 移动前下面部分的区域对象.
		 * @param {Object} uP 移动前上面部分的对象位置.
		 * @param {Object} dP 移动前下面部分的对象位置.
		 */
		getRealPoints:function(uR,dR,uP,dP){
			var uH = uR.bottom-uR.top;
			var dH = dR.bottom-dR.top;
			var uW = uR.right-uR.left;
			var dW = dR.right-dR.left;
			var midH = dP[1]-uP[1]-uH;

			return [uP[0]+(uW-dW),uP[1]+(uH-dH)];
		},
		/**
		 * 移动后改变movebox数组内部的元素顺序,其实就是替换2个移动的DOM对象在movebox数组中的位置.
		 * @method change 
		 * @param {Object} start 主动移动的DOM对象.
		 * @param {Object} end 被动移动的DOM对象.
		 */
		change:function(start,end){
			var s_index = this.getIndex(start);
			var e_index = this.getIndex(end);
			var s_className = start.className;
			var e_className = end.className;
			var s_c_className = start.getElementsByTagName("li")[0].className;
			var e_c_className = end.getElementsByTagName("li")[0].className;
			start.className = e_className;
			end.className = s_className;
			start.getElementsByTagName("li")[0].className = e_c_className;
			end.getElementsByTagName("li")[0].className = s_c_className;
			
			if(s_index!=-1&&e_index!=-1){
				movebox.list[s_index] = end;
				movebox.list[e_index] = start;
				movebox.version++;
			}
			if(this.getMoveBoxIndex()!=-1){
				moveboxs[this.getMoveBoxIndex()] = movebox;
			}
		},
		/**
		 * 获取当前的movebox在moveboxs的位置.
		 * @method getMoveBoxIndex 
		 * @return {int} 
		 */
		getMoveBoxIndex:function(){
			for(var i=0;i<moveboxs.length;i++){
				if(moveboxs[i].id==movebox.id){
					return i;
				}
			}
			return -1;
		},
		/**
		 * @method getMoveBox 
		 * @param {Object} moveObj
		 */
		getIndex:function(moveObj){
			for(var i=0;i<movebox.list.length;i++){
				if(movebox.list[i]==moveObj){
					return i;
				}
			}
			return -1;
		},
		/**
		 * 根据当前movebox的DOM对象获得movebox对象，如果不存在则新初始化一个，存在的话就返回存在的.
		 * @method getMoveBox 
		 * @param {Object} m_b movebox的DOM对象.
		 */
		getMoveBox:function(m_b){
			if(this.isHave(m_b)){
				return this.isHave(m_b);
			}else{
				var movebox = new Ali.widget.movebox(m_b.id);
				var temp_list = m_b.getElementsByTagName("div");
				for(var i=0;i<temp_list.length;i++){
					if(this.comprise(temp_list[i].className,"movechildren")){
						movebox.list.add(temp_list[i]);
					}
				}
				moveboxs.add(movebox);
				return movebox;
			}
		},
		/**
		 * 判断包含方法.
		 * @method comprise 
		 * @param {Object} talStr
		 * @param {Object} compStr
		 */
		comprise:function(talStr,compStr){
			if(talStr.indexOf(compStr)!=-1){
				return true;
			}else{
				return false;
			}
		},
		/**
		 * 重新构建当前movebox对象.
		 * @method rebuild 
		 * @param {Object} m_b 当前movebox对象.
		 * @param {Object} newNode 新的节点对象.
		 * @param {Object} now 当前节点对象.
		 */
		rebuild:function(m_b,newNode,now){
			if(this.isHave(m_b)){
				movebox = this.isHave(m_b);
				movebox = movebox.list.insert(newNode,this.getIndex(now));
			}
		},
		/**
		 * 根据ID判断当前movebox的DOM对象是否已经存在.
		 * @method isHave 
		 * @param {Object} id 当前movebox的DOM对象的ID.
		 */
		isHave:function(m_b){
			for(var i=0;i<moveboxs.length;i++){
				if(moveboxs[i].name==m_b.id){
					return moveboxs[i];
				}
			}
			return null;
		},
		/**
		 * 向上获取当前对象的临近的对象.
		 * @method getUp 
		 * @param {Object} now 当前对象.
		 */
		getUp:function(now){
			for(var i=0;i<movebox.list.length;i++){
				if(movebox.list[i]==now){
					if(i>0){
						return movebox.list[i-1];
					}else{
						return null;
					}
				}
			}
		},
		/**
		 * 向下获取当前对象的临近的对象.
		 * @method getDown 
		 * @param {Object} now 当前对象.
		 */
		getDown:function(now){
			for(var i=0;i<movebox.list.length;i++){
				if(movebox.list[i]==now){
					if(i<movebox.list.length-1){
						return movebox.list[i+1];
					}else{
						return null;
					}
				}
			}
		},
		/**
		 * 移动el到points指定的位置.
		 * @method moving 
		 * @param {Object} el 要移动的对象.
		 * @param {Object} points 指定的位置坐标.
		 */
		moving:function(el,points){
			var anim = new YAHOO.util.Motion(el,{points: {to:points}},1,YAHOO.util.Easing.easeBothStrong);
			anim.animate(anim);
		},
		toString:function(){
			var tempStr = "";
			for(var i=0;i<movebox.list.length;i++){
				tempStr = tempStr + movebox.list[i].id + "&";
			}
			tempStr = tempStr.substring(0,tempStr.length-1);
			return tempStr;
		}
	};
})();
/**
 * 移动的组合类.
 * @class movebox
 * @param {Object} name 整个movebox的ID名称.
 */
Ali.widget.movebox = function(name){
	this.name = name;
	this.list = new Array();
	this.size = 0;
	this.version = 0;
	this.obj = null;
}