﻿;
if (typeof window.myLayersShow == "undefined") { //只能说这是拙劣的模仿
	var myLayersShow = {
		allGroups : [],
		initAll : function() {
			var allThings = document.getElementsByTagName("*");
			for (var i=0;i< allThings.length;i++) {
				if (allThings[i].id && valid(allThings[i].id) ) {
					add(allThings[i].id);
					continue;
				}
				if (allThings[i].id ) {
					addGroups(validGroups(allThings[i].id));
					continue;
				}
			}
			function addGroups(obj) {
				if (!obj) return;
				var addButtons=[];
				var addLayers=[];
				for (var i=0;i< Math.max(obj.buttons.childNodes.length,obj.layers.childNodes.length);i++) {
					if (obj.buttons.childNodes[i] && obj.buttons.childNodes[i].nodeType == 1) addButtons.push(obj.buttons.childNodes[i]);
					if (obj.layers.childNodes[i] && obj.layers.childNodes[i].nodeType ==1) addLayers.push(obj.layers.childNodes[i]);
				}
				if (addButtons.length != addLayers.length) return;
				addLayers.sort(randomsort);
				with (myLayersShow) {
					allGroups[obj.gName] = new LayersGroup(obj.gName);
					allGroups[obj.gName].addBL(addButtons,addLayers);
					paramCheck(obj.buttons,obj.gName);
				}
			}
			function validGroups(gid) {
				if (!(/^[a-zA-Z]\w*layersgroup$/).test(gid)) return;
				if (gid.indexOf("layersgroup") != gid.lastIndexOf("layersgroup")) return;
				var buttons = gid.substr(0,gid.indexOf("layersgroup"))+"buttonsgroup";
				if (!document.getElementById(buttons)) return;
				return {
					buttons : document.getElementById(buttons),
					layers : document.getElementById(gid),
					gName : gid.substr(0,gid.indexOf("layersgroup"))
				};
			}
			function valid(id) {
				var reg = /^[A-Za-z]\w*layers\w+$/;
				if (!reg.test(id)) return false;
				if (id.indexOf("layers") != id.lastIndexOf("layers")) return false;
				if ((/^\w+layersgroup$/).test(id)) return false;
				if (!document.getElementById(id.substring(0,id.indexOf("layers")))) return false;
				return true;
			}
			function add(theLayer) {
				var theButton = theLayer.substring(0,theLayer.indexOf("layers"));
				var gName = theLayer.substr(theLayer.indexOf("layers")+6);
				with (myLayersShow) {
					if (!allGroups[gName])	allGroups[gName] = new LayersGroup(gName);
					allGroups[gName].addBL(theButton,theLayer);
					if (!allGroups[gName].event) paramCheck(document.getElementById(theButton),gName);
				}
			}
			function paramCheck(theButton,gName) {
					var g = myLayersShow.allGroups[gName];
					if (theButton.getAttribute("param")) check(theButton.getAttribute("param"));
					if (theButton.className && !g.event) check(theButton.className);
					if (theButton.title && !g.event) check(theButton.title);
					function check(str) {
						str = str.split(" ");
						var param;
						var reg = /^[A-Za-z][A-Za-z0-9]*_[A-Za-z0-9]+$/;
						outerFor : for (var i=0;i< str.length;i++) {
							if (reg.test(str[i])) {
								var tmp = str[i].split("_");
								switch (tmp[0]) {
									case "event":
										g.event = tmp[1];
										continue outerFor;
									case "eventClass":
										g.eventClass = tmp[1];
										continue outerFor;
									case "needPlayer":
										g.needPlayer = eval(tmp[1]);
									case "opacityTrans":
										g.opacityTrans = true;
										continue outerFor;
									case "shapeTrans":
										g.shapeTrans = true;
										continue outerFor;
								}
							}
						}
					}
			}
		},//End initAll
		addEvent : function() {
			for(var i=0;i< arguments.length;i++) {
				switch (typeof arguments[i]) {
					case "object":
						var obj = arguments[i];
						break;
					case "string":
						var evt = arguments[i];
						break;
					case "function":
						var fn = arguments[i];
						break;
				}
			}
			//if (!obj) return;应该严格一点 ,而且有利于查错^0^
			if (obj.addEventListener) obj.addEventListener(evt,fn,false);
			if (obj.attachEvent) obj.attachEvent("on"+evt,fn);
		},//End addEvent
		stopEvent : function(e) {
			if (e.target) e.stopPropagation();
			else window.event.cancelBubble = true;
		},//End stopEvent
		delay : function(fn,arg,timeout) {
			var t =setTimeout(function() {
				fn(arg);
			},timeout);
			return {
				t:t,
				f:fn,
				a:arg
			};
		},//End delay
		newXHR : function() {
			var newXHR;
			try { newXHR = new XMLHttpRequest(); }
			catch(e) {
				try { newXHR = new ActiveXObject("Msxml2.XMLHTTP"); }
				catch (e) {
					try { newXHR = new ActiveXObject("Msxml3.XMLHTTP"); }
					catch (e) {
						try { newXHR = new ActiveXObject("Microsoft.XMLHTTP"); }
						catch (e) {
							var statusContent = '很抱歉,您的浏览器不支持本网站的一些高级功能(XMLHttpRequest),这些功能可能对您很有帮助,您可以点击<a href="http://www.google.cn/search?ie=utf-8&oe=UTF-8&hl=zh-CN&q='+encodeURI("最新版火狐浏览器")+'">这里</a>下载支持该功能的现代浏览器!';
						}
					}
				}
			}
			return newXHR;
		},//End newXHR
		LayersGroup : function(gName) {
			this.buttons =[];
			this.layers=[];
			var g = myLayersShow;
			if (!gName) {
				gName = g.allGroups.length;
				g.allGroups.push(this);
			}
			this.toString = function() { return gName };
		},//End LayersGroup
		setBL : function(theButton,theLayer,group) {
			var g = myLayersShow;
			if (group.constructor != g.LayersGroup) return;
			if (document.getElementById(theButton)) theButton = document.getElementById(theButton);
			if (document.getElementById(theLayer)) theLayer = document.getElementById(theLayer);
			if (typeof theButton == "object" && typeof theLayer == "object") {
				if (theButton.group) return;
				//theLayer.isLayer = true;
				theButton.group = group;
				theButton.layer = theLayer;
				theButton.roll = function() {
					if (this.layer.style.display == "block") return;
					var others = this.group.buttons;
					for (var i=0;i< others.length;i++) {
						others[i].layer.style.display = "none";
					}
					this.show();
					if (this.group.eventClass) {
						if (this.group.event == "mouseout" && !this.over) return;
						g.rollClass(this,this.group.buttons,this.group.eventClass);
					}
				}
				theButton.popup = function() {
					var tmp = this.layer.style;
					if  (tmp.display == "none" ) tmp.display = "block";
					else tmp.display ="none";
				}
				theButton.show = function() {
					this.layer.style.overflow = "hidden";
					this.layer.style.display = "block";
					if (this.group.shapeTrans) {
						var finish = {
							x :parseInt(this.layer.clientWidth),
							y :parseInt(this.layer.clientHeight)
						};
						this.layer.style.width=finish.x+"px";
						this.layer.style.height=1+"px";
						g.shapeTrans([this.layer,{x:13,y:4},finish,0]);
					}
					if (this.group.opacityTrans) {
						g.setOpacity.call(this.layer,10);
						g.opacityTrans([this.layer,10,100,0]);
					}
				}
				return theButton;
			}
		},//End setBL
		rollClass : function(evtObj,group,evtClass) {
			for (var i =0;i< group.length;i++) {
				var c = group[i].className.split(" ");
				group[i].className="";
				for (var j=0;j< c.length;j++) {
					if (c[j] != evtClass) group[i].className += " "+c[j];
				}
			}
			if (evtObj) evtObj.className += " "+evtClass;
		},//End rollClass
		opacityTrans : function(arg) {
			var obj= arg[0];
			if (typeof obj != "object" || !obj) return;
			var start= parseInt(arg[1]);
			var finish= parseInt(arg[2]);
			var time=parseInt(arg[3]);
			if (!time) time =arg[3]  =Math.round(Math.abs(start-finish)/10);
			var add = function(num) {
				var a = (finish-start)/time;
				return (a< 0)?Math.floor(a+num):Math.ceil(a+num);
			};
			var g = myLayersShow;
			var newOpacity = (document.all)?function() {
				var str = (obj.style.filter)?(obj.style.filter):start;
				str = (str!=start)?parseInt(str.substring(str.indexOf("opacity=")+8)):start;
				return str;
			}:function() {
				var num = (obj.style.opacity)?Math.round(100*obj.style.opacity):start;//用Math.round方法是因为在火狐和谷歌,以及Opera下面对opacity的取值不精确,比如当你设为0.28时,JS取出来的值却为0.2800000000000004,用parseInt方法会导致始终无法将透明度过渡到0.29.虽然不精确,但也可以能过四舍五入取精确的值,因为JS取出来的值是个最接近准确值的数(在JS浮点运算能力内,这个数精确到小数点后亿亿位),出错的数(乘100后),范围在7*Math.pow(2,0) , 7*Math.pow(2,1) , 7*Math.pow(2,2) , 7*Math.pow(2,3)..........................附近!
				return num;
			};
			newOpacity = newOpacity();
			newOpacity = add(newOpacity);
			if (g.isIn(newOpacity,start,finish)) {
				g.setOpacity.call(obj,newOpacity);
				g.delay(arguments.callee,arg,100);
			}
		},//End opacityTrans
		setOpacity : (document.all)?function(num) { this.style.filter = "alpha(opacity="+num+")"}:function(num) { this.style.opacity = num/100 },//End setOpacity
		shapeTrans : function(arg) {
			var obj = arg[0];
			if (typeof obj != "object" || !obj) return;
			var start = arg[1];
			var finish= arg[2];
			var time = arg[3];
			if (!time) time =arg[3]= Math.ceil(Math.max(Math.abs(start.x-finish.x),Math.abs(start.y-finish.y))/50);
			var g = myLayersShow;
			if (obj.style.overflow != "hidden") obj.style.overflow = "hidden";
			var add = function(num) {
				return function(w) {
					return (num >0)?Math.ceil(num+w):Math.floor(num+w);
				}
			};
			var addW = add((finish.x-start.x)/time);
			var addH = add((finish.y-start.y)/time);
			var w = (obj.style.width)?parseInt(obj.style.width):start.x;
			var h = (obj.style.height)?parseInt(obj.style.height):start.y;
			if (w == start.x) obj.style.width = start.x+"px";
			if (h == start.y) obj.style.height = start.y+"px";
			var nowWidth = (g.isIn(addW(w),start.x,finish.x))?function() {
				obj.style.width = addW(w)+"px";
				return true;
			}:function() { obj.style.width = parseInt(finish.x)+"px"; };
			var nowHeight = (g.isIn(addH(h),start.y,finish.y))?function() {
				obj.style.height = addH(h)+"px";
				return true;
			}:function() { obj.style.height = parseInt(finish.y)+"px"; };
			nowWidth = nowWidth();
			nowHeight = nowHeight();
			if (nowWidth || nowHeight) g.delay(arguments.callee,arg,100);
		},//End shapeTrans
		isIn : function(num,a1,b1) {
				var a = Math.max(a1,b1);
				var b = Math.min(a1,b1);
				if (b <= num && num <= a) return true;
				return false;
		}//End isIn
	}//End var myLayersShow
	
	
	//绑定
	with (myLayersShow) {
		//Event绑定
		//Prototype绑定
		LayersGroup.prototype.addBL=function(theButton,theLayer) {
			if (theButton.constructor == Array && theLayer.constructor == Array && theButton.length == theLayer.length) {
				for (var i=0;i< theButton.length;i++) {
					var obj = myLayersShow.setBL(theButton[i],theLayer[i],this);
					if (!obj) continue;
					this.buttons.push(obj);
				}
			} else {
				var obj = myLayersShow.setBL(theButton,theLayer,this);
				if (!obj) return;
				this.buttons.push(obj);
			}
		}
		LayersGroup.prototype.format = function() {
			if (!this.event) this.event = "click";
			for (var i=0;i< this.buttons.length;i++) {
				var b = this.buttons[i];
				if (this.event != "mouseout") {
					addEvent(b,this.event,doIt);
				} else {
					addEvent(b,"mouseover",doIt);
					addEvent(b,this.event,function(e) {
						var obj = e.target || window.event.srcElement;
						if (!obj.group) {
							stopEvent(e);
							return;
						}
						obj.timeout = delay(function() {
							obj.layer.style.display="none";
							if (obj.group.eventClass) {
								var c = obj.className.split(" ");
								obj.className = "";
								for (var i=0;i< c.length;i++) {
									if (c[i] != obj.group.eventClass)
									obj.className += c[i];							
								}
							}
						},null,1500);
						obj.timeout = obj.timeout.t;
					});
				}
				//addEvent(b,"focus",doIt);假如考虑站点的可访问性,当用户不使用Mouse或没法使用Mouse时,应该将A标签作为Button,它可以接受焦点,让用户可以用键盘上TAB键选择项目,但如果你并没那么做,这里这句自然白费了,我在这里只是提醒一下而已(我在这也没提供对onblur的处理)
			}
			function doIt(e) {
				var obj = e.target || window.event.srcElement;
				while (!obj.group && obj != document.body) {
					obj = obj.parentNode;
				}
				if (obj.group.event == "mouseout") {
					obj.over = true;//这个属性只在roll函数中被用到,可能有些多余
					if (obj.timeout ) clearTimeout(obj.timeout);
				}
				if (obj.group.needPlayer) {
					var playParam = obj.group.needPlayer;
					addEvent(function(arg) {
						obj.group.needPlayer = playParam;
					},obj,"mouseout");
					obj.group.needPlayer= false;
				}
				obj.roll();
			}
			var __self=this;
			if (this.needPlayer) setTimeout(function () {
				__self.play();
			},1000);
		} //End format
		
		LayersGroup.prototype.play = function() {
			var time = (typeof this.needPlayer == "number")?this.needPlayer:3000;
			var buttons = this.buttons;
			var i;
			var len=buttons.length;
			if (this.needPlayer) {
				for (i=0;i< len;i++) {
					delay(function(who) {
						if (who.group.event == "mouseout") who.over = true;
						if (!who.group.needPlayer) return;
						who.roll();
					},buttons[i],i*time);
				}
			}
			delay(function(arg) {
				arg[1].call(arg[0]);
			},[this,arguments.callee],i*time);
		}
		myLayersShow.initAll();
		(function() {
				var groups = myLayersShow.allGroups;
				for (var i in groups) {
					if (!groups[i].buttons[0]) {
						delete(groups[i]);
						continue;
					}
					groups[i].format();
					groups[i].buttons[0].roll();
					if (groups[i].event == "mouseout" ) groups[i].buttons[0].layer.style.display="none";
				}
		})();
	}
}//End if (typeof window.myLayersShow == "undefined") {
function randomsort(a, b) {
	return Math.random()>.5 ? -1 : 1;
}