<!--
/**************************************************************************************************
 File : HtmlControls.Js
 Write By : Kevin Xu Wang
 Designed For Kissogram Application Projects
 This Java Script is Designed For Kissogram's Html Control Part.
 Kissogram System
 Copyright (C) 2006-2008 . All rights reserved.
***************************************************************************************************/

//定义HTML操作类
Kissogram.HtmlControls = {

	//页面操作类
	Page : {

		//当前页面信息
		Current : {
			//地址
			Url : null,

			//初始化,获得当前页面信息
			Start : function () {
				//记录是否已经初始化
				if (this.Initialized)
					return;
				this.Initialized = true;
				//本页真实地址
				var PageUrl = (""+document.location);
				PageUrl = Kissogram.HtmlControls.Page.UrlClear(PageUrl);
				var TempUrl = PageUrl.split("?"),QueryString = '';
				PageUrl = TempUrl.shift().toLowerCase();
				if (TempUrl.length)
					QueryString = TempUrl.join("?");
				else {
					TempUrl = PageUrl.split("/");
					//如没有QueryString字符,且URL最后以为不为文件,那么默认添加"/"
					if (TempUrl[TempUrl.length-1].indexOf(".") == -1 && TempUrl[TempUrl.length-1])
						PageUrl += "/";
				}
				this.Url = PageUrl + (QueryString ? ("?"+ QueryString) : '');
			},

			//返回Body对象的一系列属性,兼容DOCTYPE声明
			documentBody : {
				clientWidth : function () {
					if (window.innerWidth)
						return window.innerWidth;
					else if (document.documentElement && document.documentElement.clientWidth)
						return document.documentElement.clientWidth;
					else if (document.body)
						return document.body.clientWidth;
					else
						return 0;
				},
				clientHeight : function () {
					if (window.innerHeight)
						return window.innerHeight;
					else if (document.documentElement && document.documentElement.clientHeight)
						return document.documentElement.clientHeight; 
					else if (document.body)
						return document.body.clientHeight;
					else
						return 0;
				},
				scrollLeft : function () {
					if (window.pageXOffset)
						return window.pageXOffset;
					else if (document.documentElement && document.documentElement.scrollLeft)
						return document.documentElement.scrollLeft;
					else if (document.body)
						return document.body.scrollLeft;
					else
						return 0;
				},
				scrollTop : function () {
					if (window.pageYOffset)
						return window.pageYOffset;
					else if (document.documentElement && document.documentElement.scrollTop)
						return document.documentElement.scrollTop;
					else if (document.body)
						return document.body.scrollTop;
					else
						return 0;
				},
				scrollHeight : function () {
					if (document.body)
						return document.body.scrollHeight;
					else
						return 0;
				},
				scrollWidth : function () {
					if (document.body)
						return document.body.scrollWidth;
					else
						return 0;
				},
				offsetHeight : function () {
					if (document.body)
						return document.body.offsetHeight;
					else
						return 0;
				},
				offsetWidth : function () {
					if (document.body)
						return document.body.offsetWidth;
					else
						return 0;
				},
				//页面实际高度
				pageHeight : function () {
					if (Kissogram.Construction.UserBrowser.isIE || Kissogram.Construction.UserBrowser.isOpera)
						return Math.max(this.scrollHeight(),this.clientHeight());
					else
						return this.scrollHeight();
				},
				pageWidth : function () {
					if (Kissogram.Construction.UserBrowser.isIE || Kissogram.Construction.UserBrowser.isOpera)
						return Math.max(this.scrollWidth(),this.clientWidth());
					else
						return this.scrollWidth();
				}
			},

			//对Event事件兼容
			Event : {
				//当前按键
				currentKey : null,

				//返回按键的英文大写
				getKey : function ($E) {
					var keyCode;
					if ($E == null)
						keyCode = event.keyCode;
					else
						keyCode = $E.which;
					this.currentKey = String.fromCharCode(keyCode).toUpperCase();
				},

				X : function () {
					//兼容FireFox
					return event.x || event.pageX;
				},
				Y : function () {
					//兼容FireFox
					return event.y || event.pageY;
				}
			}
		},

		//刷新当前页
		Refresh : function () {
			if (Kissogram.Construction.UserBrowser.isNetscape)
				window.location.reload(true);
			else
				history.go(0);
		},

		//获得文件Http绝对路径
		trueUrl : function ($Path) {
			$Path = this.UrlClear($Path);
			var Url = $Path.split("?");
			var MainUrl = Url.shift().toLowerCase();
			//本身完整的路径直接返回
			if (MainUrl.indexOf('http://')>-1 || MainUrl.indexOf('https://')>-1 || MainUrl.indexOf('ftp://')>-1)
				return $Path;
			var QueryString = '';
			if (Url.length)
				QueryString = Url.join("?");
			//除去"http://"等协议名
			Url = this.Current.Url.substring(this.Current.Url.indexOf("//")+2,this.Current.Url.length).split("/");
			//除去最后一维(Current.Url中最后一维不是空维就是文件名)
			Url.pop();
			//拼接数组
			Url = Url.concat(MainUrl.split("/"));
			//绝对路径从倒数第2维开始分析
			var i=Url.length-2;
			//分析绝对路径
			while (i>1) {
				//当出现空维则将该空维及前面所有的维都删除
				if (Url[i]=='') {
					Url.splice(1,i);
					i=Url.length-2;
				}
				else
					i--;
			}
			//分析父路径
			while (i<Url.length-1) {
				//当出现维的值为'..',则将该空维删除
				if (Url[i]=='..' && Url[i-1]!='..' && i>1) {
					Url.splice(i-1,2);
					i--;
				}
				else
					i++;
			}
			$Path = this.Current.Url.substring(0,this.Current.Url.indexOf("//")+2) + Url.join("/");
			return $Path + (QueryString ? ("?"+ QueryString) : '');
		},

		//初步处理URL字符串
		UrlClear : function ($UrlString) {
			//替换地址中所有空格为%20
			$UrlString = String($UrlString).replace(/\s+/g,"%20");
			//转义地址中所有引号
			$UrlString = $UrlString.replace(/\'/g,"%27").replace(/\"/g,"%22");
			var Url = $UrlString.split("?");
			//在用户试图暴库的情况下仍力求工作正常
			$UrlString = Url.shift().replace(/%5C/g,"/").replace(/\\/g,"/");
			var QueryString = '';
			if (Url.length) {
				QueryString = Url.join("?");
				//转义斜杠
				QueryString = QueryString.replace(/\\/g,"%5C");
			}
			return $UrlString + (QueryString ? ("?"+ QueryString) : '');
		},

		//页码显示类
		Pagination : {
			//图像缓存
			imageCache : new Array(),
			
			//数据对象原型
			DataClass : function () {
				//页面数据
				var PageClass = this.Page = {
					ShowTotal : 0,
					Split : 10,
					Symbol : "page",
					Action : "",
					lastPage : 0,
					currentPage : 0,
					Total : 0,
					//上次点击是否是真正转页(数据发生了改变)
					truelyGo : false
				};

				//记录数据
				this.Record = {
					Total : 0
				};

				//风格
				this.Style = {
					Table1 : "tableborder5",
					Table2 : "tabletitle1",
					Page1 : "page",
					Page2 : "page2"
				};
				
				//表格
				this.Table = {
					Obj : null,
					Initialized : false
				};

				//操作函数类
				this.Operator = {
					//自定义跳页的回调函数
					callBack : function ($Page) {
						location.href = '?'+ PageClass.Symbol +'='+ $Page + PageClass.Action;
					},

					//改变当前页信息
					changeSetting : function ($Page) {
						PageClass.currentPage = $Page;
					}
				};
			},

			//初始化参数(每页显示,分隔数<此项需要设置为奇数>,记录总数,页数的变量名.eg: page,页面附加参数.eg: action=index)
			Initialize : function ($DataClass,$PageShowTotal,$PageSplit,$Total,$PageSymbol,$Action,$TableStyle,$TableStyle2,$PageStyle,$PageStyle2) {
				//页参数不能为空,否则则默认为"page"
				$DataClass.Page.Symbol = $PageSymbol || "page";
				$DataClass.Page.currentPage = Kissogram.HtmlControls.Page.QueryString($DataClass.Page.Symbol);
				//基本数据处理
				with (Kissogram.Construction.Common.Convert) {
					$DataClass.Page.currentPage = Int($DataClass.Page.currentPage);
					$DataClass.Page.ShowTotal = Int($PageShowTotal);
					$DataClass.Page.Split = Int($PageSplit);
					$DataClass.Record.Total = Int($Total);
				}
				$DataClass.Record.Total = Math.max($DataClass.Record.Total,0);
				if ($DataClass.Page.ShowTotal<1 || $DataClass.Page.Split<1) {
					//把记录总数改为0,表示该页面类不可用
					$DataClass.Record.Total = 0;
					return;
				}
				$DataClass.Style.Table1 = $TableStyle || "tableborder5";
				$DataClass.Style.Table2 = $TableStyle2 || "tabletitle1";
				$DataClass.Style.Page1 = $PageStyle || "page";
				$DataClass.Style.Page2 = $PageStyle2 || "page2";
				//如果Action不为空,则添加 &
				$DataClass.Page.Action = $Action ? "&" +$Action : '';
				this.createPageTable($DataClass);
			},

			//可以得到一个默认的框架
			createPageTable : function ($DataClass) {
				$DataClass.Table.Obj = document.createElement("table");
				with ($DataClass.Table.Obj) {
					cellPadding = "1";
					cellSpacing = "4";
					style.margin = "0px";
					style.width = "auto";
					className = $DataClass.Style.Table1;
				}
			},

			//这个用来显示页脚
			Show : function ($DataClass,$ShowPage) {
				if ($DataClass.Record.Total<1)
					return;
				//配合动态显示,计算总页数
				$DataClass.Page.Total = Math.ceil($DataClass.Record.Total/$DataClass.Page.ShowTotal);
				$DataClass.Page.currentPage = Math.max(Math.min($DataClass.Page.Total,$DataClass.Page.currentPage),1);
				var currentTotal = Number($DataClass.Page.ShowTotal),changeSetting = $DataClass.Operator.changeSetting;
				var currentPage = $ShowPage || Number($DataClass.Page.currentPage),callBack = $DataClass.Operator.callBack;
				currentPage = Math.max(Math.min($DataClass.Page.Total,currentPage),1);
				var Parameter = currentPage - (currentPage % $DataClass.Page.Split);
				//计算当前页显示的记录数
				if ((currentPage == $DataClass.Page.Total) && ($DataClass.Record.Total % $DataClass.Page.ShowTotal))
					currentTotal = $DataClass.Record.Total % $DataClass.Page.ShowTotal;
				//对页码初始化
				if ($DataClass.Table.Initialized)
					$DataClass.Table.Obj.deleteRow(0);
				else
					$DataClass.Table.Initialized = true;
				var NewRow = $DataClass.Table.Obj.insertRow($DataClass.Table.Obj.rows.length);
				with (NewRow) {
					align = "center";
					nowrap = true;
				}
				if (currentPage!=1 && currentPage > $DataClass.Page.Split)
					getPageLable.call(this,NewRow,"第一页","First.gif",1);
				if (Parameter >= $DataClass.Page.Split)
					getPageLable.call(this,NewRow,"上十页","Previous.gif",Math.max(currentPage-10,1));
				for (var i=Parameter+1;i<=Math.min($DataClass.Page.Total,Parameter+$DataClass.Page.Split);i++)
					getPageFont.call(this,NewRow,i);
				if (($DataClass.Page.Total - Parameter) > 10)
					getPageLable.call(this,NewRow,"下十页","Next.gif",Math.min(currentPage+10,$DataClass.Page.Total));
				if (($DataClass.Page.Total - Parameter) > $DataClass.Page.Split)
					getPageLable.call(this,NewRow,"尾页","Last.gif",$DataClass.Page.Total);
				var NewCol = NewRow.insertCell(NewRow.cells.length);
				NewCol.className = "page";
				if ($DataClass.Page.Total>1) {
					//开始显示跳页部分
					var TextInput = document.createElement("input");
					with (TextInput) {
						type = "text";
						onclick = function () {
							this.select();
							};
						value = currentPage;
						size = 2;
						className = "pageinput";
						style.border = "0px";
					}
					NewCol.appendChild(TextInput);
					var NewButton = document.createElement("button");
					with (NewButton) {
						className = "button";
						title = "在文本框内填写页码后,点击此按钮可浏览该页左右的页码.";
						innerHTML = "&nbsp;<B>GO</B>&nbsp;";
						style.border = "0px";
					}
					if (!Kissogram.Construction.Dvbbs.Page_Admin) {
						Kissogram.HtmlControls.Html.Compatibility.addEvent(NewButton,"onmouseover",function (){
							NewButton.className = 'button_on';
							});
						Kissogram.HtmlControls.Html.Compatibility.addEvent(NewButton,"onmouseout",function (){
							NewButton.className = 'button';
							});
					}
					Kissogram.HtmlControls.Html.Compatibility.Set.onClick(NewButton,function () {
						var truePage = Math.min(Math.max(Kissogram.Construction.Common.Convert.Int(TextInput.value),1),$DataClass.Page.Total);
						if (truePage == $DataClass.Page.currentPage)
							return;
						if (truePage>Parameter && truePage<=Math.min($DataClass.Page.Total,Parameter+$DataClass.Page.Split))
							gotoPage(truePage);
						else
							Kissogram.HtmlControls.Page.Pagination.Show($DataClass,truePage);
						});
					var NewCol = NewRow.insertCell(NewRow.cells.length);
					NewCol.className = $DataClass.Style.Page1;
					NewCol.appendChild(NewButton);
				}
				//对最近访问页初始化
				if (!$DataClass.Page.lastPage)
					$DataClass.Page.lastPage = Number($DataClass.Page.currentPage);
				else if ($DataClass.Page.lastPage != currentPage) {
					//返回按钮
					NewButton = document.createElement("button");
					with (NewButton) {
						className = "button";
						title = "可以返回最后浏览的页面.";
						innerHTML = "&nbsp;<B>Back</B>&nbsp;";
						style.border = "0px";
					}
					if (!Kissogram.Construction.Dvbbs.Page_Admin) {
						Kissogram.HtmlControls.Html.Compatibility.addEvent(NewButton,"onmouseover",function (){
							NewButton.className = 'button_on';
							});
						Kissogram.HtmlControls.Html.Compatibility.addEvent(NewButton,"onmouseout",function (){
							NewButton.className = 'button';
							});
					}
					Kissogram.HtmlControls.Html.Compatibility.Set.onClick(NewButton,function() {
						if ($DataClass.Page.truelyGo)
							gotoPage($DataClass.Page.lastPage);
						else
							Kissogram.HtmlControls.Page.Pagination.Show($DataClass,$DataClass.Page.lastPage);
						});
					NewCol = NewRow.insertCell(NewRow.cells.length);
					NewCol.className = $DataClass.Style.Page1;
					NewCol.appendChild(NewButton);
				}
				NewCol = NewRow.insertCell(NewRow.cells.length);
				NewCol.className = $DataClass.Style.Page1;
				NewCol.nowrap = true;
				NewCol.title = "记录";
				NewCol.innerHTML = "&nbsp;总数:"+ $DataClass.Record.Total +"&nbsp;|&nbsp;" +
					(($DataClass.Page.currentPage == currentPage) ? "当前" : "坐标")+
					"页:"+ currentTotal +"/"+ $DataClass.Page.ShowTotal +"&nbsp;";
				NewCol = NewRow.insertCell(NewRow.cells.length);
				NewCol.className = $DataClass.Style.Table2;
				NewCol.nowrap = true;
				NewCol.title = "分页";
				NewCol.innerHTML = "&nbsp;"+currentPage+"/"+$DataClass.Page.Total+"&nbsp;页";

				//返回某页的文字
				function getPageFont($Row,$Page) {
					var NewCol = $Row.insertCell($Row.cells.length);
					NewCol.align = "center";
					NewCol.nowrap = true;
					var NewFont = document.createElement("span");
					if ($DataClass.Page.currentPage == $Page) {
						NewCol.className = $DataClass.Style.Page2;
						NewFont.innerHTML = "<b>"+ $Page +"</b>";
						NewCol.title = "当前页:"+ $Page;
					}
					else {
						NewCol.className = $DataClass.Style.Page1;
						NewCol.style.cursor = "pointer";
						if (currentPage == $Page) {
							NewFont.innerHTML = "<u>"+ $Page +"</u>";
							NewCol.title = "坐标页:"+ $Page;
						}
						else {
							NewFont.innerHTML = $Page;
							NewCol.title = $Page;
						}
						Kissogram.HtmlControls.Html.Compatibility.Set.onClick(NewCol,function() {gotoPage($Page);});
						Kissogram.HtmlControls.Html.Compatibility.addEvent(NewCol,"onmouseover",function (){
							NewCol.className = $DataClass.Style.Page2;
							});
						Kissogram.HtmlControls.Html.Compatibility.addEvent(NewCol,"onmouseout",function (){
							NewCol.className = $DataClass.Style.Page1;
							});
					}
					NewFont.innerHTML = "&nbsp;"+ NewFont.innerHTML +"&nbsp;";
					NewCol.appendChild(NewFont);
				}
				//返回前后的页标签
				function getPageLable($Row,$Type,$Image,$Page) {
					var NewCol = $Row.insertCell($Row.cells.length);
					NewCol.className = $DataClass.Style.Page1;
					NewCol.align = "center";
					NewCol.nowrap = true;
					Kissogram.HtmlControls.Html.Compatibility.Set.onClick(NewCol,function () {
						if ($Page == $DataClass.Page.currentPage)
							return;
						if ($Page>Parameter && $Page<=Math.min($DataClass.Page.Total,Parameter+$DataClass.Page.Split))
							gotoPage($Page);
						else
							Kissogram.HtmlControls.Page.Pagination.Show($DataClass,$Page);
						});
					NewCol.title = $Type;
					NewCol.style.cursor = "pointer";
					Kissogram.HtmlControls.Html.Compatibility.addEvent(NewCol,"onmouseover",function (){
						NewCol.className = $DataClass.Style.Page2;
						});
					Kissogram.HtmlControls.Html.Compatibility.addEvent(NewCol,"onmouseout",function (){
						NewCol.className = $DataClass.Style.Page1;
						});
					var Nbsp = document.createElement("a");
					Nbsp.innerHTML = "&nbsp;";
					if (!this.imageCache[$Image]) {
						this.imageCache[$Image] = new Image();
						this.imageCache[$Image].src = Kissogram.Const.Folder_Absolute +"images/pagelist/"+ $Image;
					}
					NewCol.appendChild(Nbsp);
					NewCol.appendChild(this.imageCache[$Image]);
					NewCol.appendChild(Nbsp);
				}
				//前进到某页的通用函数
				function gotoPage($Page) {
					$DataClass.Page.truelyGo = true;
					$DataClass.Page.lastPage = Number($DataClass.Page.currentPage);
					changeSetting($Page);
					callBack($Page);						
				}
			}
		},

		//QueryString方法
		QueryString : function (item) { 
			var sValue = location.search.match(new RegExp("[\?\&]"+ item +"=([^\&]*)(\&?)","i"));
			return (sValue ? sValue[1] : sValue);
		}
	},

	//一些Html效果
	Html : {
		Layer : {
			//实现层的拖移
			Drag : function ($Obj){
				var Draging=false;
				var Left=0,Top=0,_Top=0,_Left=0,_X=0,_Y=0;
				var OnContextMenu = new Function("return false");
				var OnSelectStart = new Function("return false");
				var MouseDown = function () {
					Draging=true;
					if ($Obj.setCapture)
						$Obj.setCapture();
					else if (window.captureEvents)
						window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
					Left=Kissogram.HtmlControls.Page.Current.Event.X()-Kissogram.Construction.Common.Convert.Int($Obj.style.pixelLeft);
					Top=Kissogram.HtmlControls.Page.Current.Event.Y()-Kissogram.Construction.Common.Convert.Int($Obj.style.pixelTop);
					with (Kissogram.HtmlControls.Html.Compatibility) {
						addEvent($Obj,"oncontextmenu",OnContextMenu);
						addEvent($Obj,"onselectstart",OnSelectStart);
					}
					_Left=$Obj.offsetLeft;
					_X=Kissogram.HtmlControls.Page.Current.Event.X();
					_Top=$Obj.offsetTop;
					_Y=Kissogram.HtmlControls.Page.Current.Event.Y();
				}
				var MouseMove = function () {
					if (!Draging)
						return;
					var Event = Kissogram.HtmlControls.Page.Current.Event;
					var Convert = Kissogram.Construction.Common.Convert;
					var X = _Left + Event.X() + $Obj.clientWidth  - _X;
					var Y = _Top  + Event.Y() + $Obj.clientHeight - _Y;
					if (X<Kissogram.HtmlControls.Page.Current.documentBody.scrollWidth())
						$Obj.style.left = Math.max(Event.X()-Left,-1*Convert.Int($Obj.style.marginLeft));
					if (Y<Kissogram.HtmlControls.Page.Current.documentBody.scrollHeight())
						$Obj.style.top = Math.max(Event.Y()-Top,-1*Convert.Int($Obj.style.marginTop));
				}
				var MouseUp = function () {
					if (!Draging)
						return;
					if ($Obj.releaseCapture)
						$Obj.releaseCapture();
					else if (window.captureEvents)
						window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
					Draging=false;
					with (Kissogram.HtmlControls.Html.Compatibility) {
						removeEvent($Obj,"oncontextmenu",OnContextMenu);
						removeEvent($Obj,"onselectstart",OnSelectStart);
					}
				}
				//添加程序到属性
				with (Kissogram.HtmlControls.Html.Compatibility) {
					addEvent($Obj,"onmousedown",MouseDown);
					addEvent($Obj,"onmousemove",MouseMove);
					addEvent($Obj,"onmouseup",MouseUp);
				}
				$Obj.style.cursor="move";
			}
		},

		//CSS特效类
		CSS : {
		},

		//元素类
		Element : {
			//创建关闭图标
			createCloseImage : function ($callBackFunction,$Title) {
				var NewDiv = document.createElement("div");
				if (!$callBackFunction)
					return NewDiv;
				var NewImg = document.createElement("img");
				with (NewImg) {
					setAttribute("align","right");
					src = "Null.gif";
					width = "65px";
					height = "0px";
				}
				NewDiv.appendChild(NewImg);
				var NewSpan = document.createElement("span");
				with (NewSpan) {
					setAttribute("align","right");
					title = $Title || "关闭!";
					style.fontSize = "14px";
					style.fontFamily = "Wingdings";
					style.cursor = "pointer";
					innerHTML = "x";
				}
				Kissogram.HtmlControls.Html.Compatibility.Set.onClick(NewSpan,$callBackFunction);
				NewDiv.appendChild(NewSpan);
				return NewDiv;
			}
		},

		//根据浏览器判断兼容性
		Compatibility : {

			Set : {
				//文本修改
				innerText : function ($Obj,$Content) {
					if (Kissogram.Construction.UserBrowser.isFirefox)
						$Obj.textContent = $Content;
					else
						$Obj.innerText = $Content;
				},

				//单击事件
				onClick : function ($Obj,$Event) {
					if (Kissogram.Construction.UserBrowser.isFirefox)
						Kissogram.HtmlControls.Html.Compatibility.addEvent($Obj,"click",$Event);
					else
						Kissogram.HtmlControls.Html.Compatibility.addEvent($Obj,"onclick",$Event);
				}
			},

			Get : {
				innerText : function ($Obj) {
					if (Kissogram.Construction.UserBrowser.isFirefox)
						return $Obj.textContent;
					else
						return $Obj.innerText;
				}
			},

			//添加事件
			addEvent : function ($Obj,$EventName,$Event) {
				if (!$Obj || !$EventName || !$Event)
					return;
				if (window.addEventListener)
					$Obj.addEventListener($EventName,$Event,false);
				else
					$Obj.attachEvent($EventName,$Event);
			},

			//移除事件
			removeEvent : function ($Obj,$EventName,$Event) {
				if (!$Obj || !$EventName || !$Event)
					return;
				if (window.removeEventListener)
					$Obj.removeEventListener($EventName,$Event,false);
				else
					$Obj.detachEvent($EventName,$Event);
			}
		}
	}
}

//注册到主程序
Kissogram.Construction.Program.Add("HtmlControls",Kissogram.HtmlControls.Page.Current.Start,1,Kissogram.HtmlControls.Page.Current);

//-->
