﻿<!--
/**************************************************************************************************
 File : Main.Js
 Write By : Kevin Xu Wang
 Designed For Kissogram Application Projects
 This Java Script is Designed For Kissogram's Common Page Part.
 @@ This File Must Be Used With File "Ajax.Js" And "HtmlControls.Js".
 Kissogram System
 Copyright (C) 2006-2008 . All rights reserved.
***************************************************************************************************/

//定义基类
Kissogram.Construction = {
	//初始化管理类
	Admin : {},

	//系统初始化
	Start : function () {
		//记录是否已经初始化
		if (this.Initialized)
			return;
		this.Initialized = true;
		//初始化为空值
		Kissogram.Const.Folder_Path = "";
		with (Kissogram.Const) {
			if (!Folder_isAbsolutePath)
				Folder_Absolute = "";
			if (this.Dvbbs.Page_Admin)
				Folder_Absolute = "../";
			Folder_Path = Folder_Absolute + Folder_Main;
			//分析动网版本
			Dvbbs_Version = Dvbbs_Version.toLowerCase();
			Dvbbs_Version = Dvbbs_Version.replace(/\s+/g,"").replace(/sp/g,".").replace(/rc/g,".");
			//分割版本
			Dvbbs_Version = Dvbbs_Version.split(".");
			for (var i=0;i<Dvbbs_Version.length;i++)
				Dvbbs_Version[i] = Kissogram.Construction.Common.Convert.Int(Dvbbs_Version[i]);
			//脉冲时间除错
			Pulse_CheckTime = Kissogram.Construction.Common.Convert.Int(Pulse_CheckTime);
		}
		this.UserBrowser.Check();
		//活动页初始化
		//this.Active.Initialize();
		//对注册的程序初始化
		this.Program.Execute();
		//*************************************************************************************
		//检测风格ID
		if (!Kissogram.Cookies.Get(Kissogram.Cookies.Prefix + "Dvbbs_SkinID")) {
			var XmlDoc = Kissogram.Ajax.Xml.Operator.Document.Common.Get(Kissogram.Const.Folder_Path +'Xml/Server.asp?action=GetConst',false,null);
			//除错后直接向服务器报错,并使用默认值
			if (Kissogram.Ajax.Error.Error)
				Kissogram.Ajax.Error.Dispose();
			else
				this.Dvbbs.SkinID = this.Common.Convert.Int(XmlDoc.documentElement.selectSingleNode("Dvbbs/@SkinID").text);
			//不管是否正确,都直接写入Cookies
			Kissogram.Cookies.Set(Kissogram.Cookies.Prefix + "Dvbbs_SkinID",this.Dvbbs.SkinID,1);
		}
	},

	//脉冲流
	Pulse : {
		//程序集合,0维记录系统查询,1维记录用户查询
		Collection : [new Array(),new Array()],
		readyState : true,
		//将获得的结果放入此变量
		OutCome : "",
		//记录最后同步时间
		LastCheckTime : new Date(),

		//程序对象添加
		Add : function ($Name,$InitializeFunction,$UserAccess){
			$UserAccess = $UserAccess ? 1 : 0;
			this.Collection[$UserAccess][this.Collection[$UserAccess].length] = [$Name,$InitializeFunction];
		},

		//检测
		Check : function () {
			if (!Kissogram.Construction.Active.Active() || !this.readyState || Kissogram.Ajax.Error.Error)
				return;
			var LastCheckTime = new Date(Kissogram.Cookies.Get(Kissogram.Cookies.Prefix + "Pulse_LastCheckTime"));
			if (!LastCheckTime || isNaN(LastCheckTime))
				//设置一个过期的日期
				LastCheckTime = new Date(1912,0,1);
			if (LastCheckTime.addSeconds(Kissogram.Const.Pulse_CheckTime)>=(new Date())) {
			//可以更新
				if (this.LastCheckTime == LastCheckTime)
					return;
				else {
					this.LastCheckTime = LastCheckTime;
					var CommandString = Kissogram.Cookies.Get(Kissogram.Cookies.Prefix + "Pulse_CommandString");
					this.readyState = false;
					try {
						eval(CommandString);
						Execute();
						this.readyState = true;
					}
					catch (e) {
						Kissogram.Cookies.Delete(Kissogram.Cookies.Prefix + "Pulse_CommandString");
						return;
					}
				}
			}
			else {
				
			}
		},

		//执行程序
		Execute : function () {
			if (Kissogram.Dvbbs.User.Current) {
				for (var i=0;i<this.Collection[1].length;i++)
					this.Collection[1][i][1].call(this.Collection[1][i][1]);
			}
			for (var i=0;i<this.Collection[0].length;i++)
				this.Collection[0][i][1].call(this.Collection[0][i][1]);
		}
	},

	//当前页面脚本的激活状态
	Active : {
		readyState : false,
		PageID : "",
		//记录最后访问日期
		LastVisitTime : new Date(),

		//初始化
		Initialize : function () {
			var PageID = this.PageID = Kissogram.Construction.Common.RndCode(16,true);
			Kissogram.HtmlControls.Html.Compatibility.addEvent(document.body,"onmousemove",function () {
				if (!Kissogram.Construction.Active.readyState) {
					Kissogram.Cookies.Set(Kissogram.Cookies.Prefix + "Active_PageID",PageID,1);
					Kissogram.Construction.Active.readyState = true;
				}
				else
					Kissogram.Construction.Active.LastVisitTime = new Date();
				});
		},

		//返回当前页是否为活动的
		Ready : function () {
			return ((Kissogram.Cookies.Get(Kissogram.Cookies.Prefix + "Active_PageID") == this.PageID) && this.readyState);
		}
	},

	//获取用户浏览器类型
	UserBrowser : {
		//Version为主版本
		Version : parseInt(navigator.appVersion),
		TrueVersion : parseFloat(navigator.appVersion),
		isFirefox : false,
		isOpera : false,
		isIE : false,
		isNetscape : false,
		isWebTv : false,
		isMac : false,

		//开始检测
		Check : function () {
			//获取用户浏览器类型
			var UserAgent = navigator.userAgent.toLowerCase();
			this.isWebTv = (UserAgent.indexOf("webtv")!=-1);
			this.isFirefox = (UserAgent.indexOf("gecko")!=-1);
			this.isOpera = (UserAgent.indexOf("opera")!=-1);
			this.isMac = (UserAgent.indexOf("mac")!=-1);
			this.isIE = ((!this.isOpera) && (UserAgent.indexOf("msie")!=-1));
			this.isNetscape = ((UserAgent.indexOf("mozilla")!=-1) && (UserAgent.indexOf("spoofer")==-1) && (UserAgent.indexOf("compatible")==-1) && (!this.isOpera) && (!this.isWebTv));
			//对IE5判断具体版本
			if (this.isIE && (this.Version == 4)) {
				if (UserAgent.indexOf("msie 5.0")!=-1)
					this.Version = 5;
				else if (UserAgent.indexOf("msie 6.0")!=-1)
					this.Version = 6;
			}
		}
	},

	//定义动网参数类
	Dvbbs : {
		//UserID初始状态为-1,表示未加载
		UserID : -1,
		SkinID : 0,
		//当前是否管理页
		Page_Admin : false,

		//用户类
		User : {
			Current : null,

			//用户原型
			Adam : function () {
				this.ID = 0;
				this.Name = "无名大虾";
			},

			//获得用户
			getUser : function ($User) {
			},

			//更新用户
			setUser : function ($User) {
			}
		},

		//用户组
		UserGroup : {
			Index : new Array(),
			//初始化
			Initialize : function () {
				if (!this.Groups)
					return;
				Kissogram.Construction.Program.Common.createIndex(this.Index,this.Groups,"Group","UserGroupID");
			},
			//获得组别名称
			getGroupName : function ($GroupID) {
				var UserGroup = Kissogram.Construction.Program.Common.getRecordByIndex(this.Index["UserGroupID"],this.Groups.Group,$GroupID);
				//可能是数据受损或该组已删除
				if (!UserGroup)
					return '不明';
				var GroupName;
				switch (UserGroup.ParentGID) {
					case 0:
						GroupName = '系统默认权限编辑';
						break;
					case 1:
						GroupName = '系统用户组';
						break;
					case 2:
						GroupName = '特殊用户组';
						break;
					case 3:
						GroupName = '注册用户组(等级)';
						break;
					case 4:
						GroupName = '多属性用户组';
						break;
					case 5:
						GroupName = 'VIP用户组';
						break;
					default:
						GroupName = '不明';
				}
				GroupName += '>>'+ UserGroup.UserTitle;
				return GroupName;
			}
		}
	},

	//程序注册类
	Program : {
		//程序集合
		Collection : new Array(),
		//程序对象添加($Name,$InitializeFunction,$PRI,$InitializeFunctionParent)
		Add : function (){
			this.Collection.push(Array.prototype.slice.apply(arguments));
		},
		//初始化程序
		Execute : function () {
			//对优先级($PRI)进行排序
			this.Collection.sort(function ($A,$B) {
				return $A[2]-$B[2];
				});
			for (var i=0;i<this.Collection.length;i++) {
				//执行初始化函数
				if (typeof this.Collection[i][1] == "function")
					//如不指明父关系,则确定为函数本身
					this.Collection[i][1].call(this.Collection[i][3] || this.Collection[i][1]);
			}
		},

		//通用加载数据类
		Common : {
			//初始化
			Start : function ($ProgramName,$CacheFile,$Error,$DataName) {
				eval("var DataCollection="+ $DataName +";");
				//检查数据文件是否加载
				if (!DataCollection) {
					with ($Error) {
						File(Kissogram.Const.Folder_Path +'Cache/Js/'+ $CacheFile,$ProgramName +'数据链接错误.\n\n找不到关于['+ $DataName +']的定义');
						Code += '无法加载'+ $ProgramName +'数据缓存['+ $DataName +'].';
						Solution[Solution.length] = '请检查是否在本页链接了'+ $ProgramName +'数据缓存文件[Cache/Js/'+ $CacheFile +'].';
						Solution[Solution.length] = $ProgramName +'初始化程序是否在链接[Cache/Js/'+ $CacheFile +']之后.';
						Show();
						Send();
					}
					return false;
				}
				return true;
			},
			//创建索引,为了让JS按地址传送,将$DataCollection(对象)和$ItemName(属性名)分开传
			createIndex : function ($Index,$DataCollection,$ItemName,$IndexItem) {
				//修复记录少于两条时可能产生的错误
				eval("var ObjCopy = $DataCollection."+ $ItemName +";");
				if (!ObjCopy) {
					ObjCopy = new Array();
					eval("$DataCollection."+ $ItemName +" = ObjCopy;");
				}
				else if (!(ObjCopy instanceof Array)) {
					ObjCopy = [ObjCopy];
					eval("$DataCollection."+ $ItemName +" = ObjCopy;");
				}
				$Index[$IndexItem] = new Array();
				for (var i=0,IndexValue=0;i<ObjCopy.length;i++) {
					eval("IndexValue = String(ObjCopy[i]."+ $IndexItem +");");
					if (typeof(IndexValue)!='undefined' && IndexValue != null)
						$Index[$IndexItem][IndexValue] = i;
				}
			},
			//从索引获得记录
			getRecordByIndex : function ($Index,$DataCollection,$IndexValue) {
				if (typeof $IndexValue == 'undefined')
					return null;
				else if ($IndexValue == null)
					return null;
				$IndexValue = String($IndexValue);
				if (!$IndexValue)
					return null;
				else if ($Index instanceof Array)
					return $DataCollection[$Index[$IndexValue]];
				else
					return null;
			}
		}
	},

	//定义常用函数类
	Common : {
		//格式转换类
		Convert : {
			//将字符强制转化为数字(Int/10进制)
			Int : function ($Num) {
				if (!$Num)
					return 0;
				$Num = parseInt(String($Num),10);
				if (isNaN($Num))
					return 0;
				else
					return $Num;
			},

			//将字符强制转化为数字(Float/10进制)
			Float : function ($Num) {
				if (!$Num)
					return 0;
				$Num = parseFloat(String($Num),10);
				if (isNaN($Num))
					return 0;
				else
					return $Num;
			},

			//将字符强制转化为数字
			Numeric : function ($Num) {
				if (!$Num)
					return 0;
				$Num = Number(String($Num));
				if (isNaN($Num))
					return 0;
				else
					return $Num;
			},

			//将字符串转为HTML编码
			HtmlEncode : function ($String) {
				if (!Kissogram.Construction.Common.CheckString($String))
					return '';
				$String = $String.replace(/&/g,'&amp');
				$String = $String.replace(/\"/g,'&quot;');
				$String = $String.replace(/</g,'&lt;');
				$String = $String.replace(/>/g,'&gt;');
				return $String;
			},

			//将字符串转为XML编码
			XmlEncode : function ($String) {
				if (!Kissogram.Construction.Common.CheckString($String))
					return '';
				$String = $String.replace(/&/g,'&amp');
				$String = $String.replace(/\'/g,'&apos;');
				$String = $String.replace(/\"/g,'&quot;');
				$String = $String.replace(/</g,'&lt;');
				$String = $String.replace(/>/g,'&gt;');
				return $String;
			}
		},

		//检测是否为空字符串
		CheckString : function ($String) {
			if (!$String)
				return false;
			else if (typeof($String)!='string')
				return false;
			else
				return true;
		},

		//检查文件名是否合法.文字名中不能包含字符\/:*?"<>|
		CheckFileName : function ($FileName) {
			var errChar = ["\\","/",":","*","?","\"","<",">","|"];
			if (!this.CheckString($FileName))
				return false;
			for (var i=0;i<errChar.length;i++) {
				if ($FileName.indexOf(errChar[i])>0)
					return false;
			}
			return true;
		},

		//随机产生数字英文串(长度,区分大小写)
		RndCode : function ($Length,$Case) {
			var StringArray = [0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
			var StringResult = "";
			for (var i=0;i<$Length;i++){
				if ($Case && (Math.round(Math.random()*1) == 1))
					StringResult += (StringArray[Math.round(Math.random()*35)]+"").toUpperCase();
				else
					StringResult += StringArray[Math.round(Math.random()*35)];
			}
			return StringResult;
		},

		//动态添加Js文件的方法(Source和Content中只有一个能为空,Source为地址,Content为内容)
		LoadJsFile : function (FileUrl,Content,parentObj) {
			if (!FileUrl && !Content)
				return;
			var NewScript = document.createElement("script");
			with (NewScript) {
				language = "javascript";
				type = "text/javascript";
				defer = true;
				if (FileUrl)
					src = FileUrl;
				else
					text = Content;
			}
			if (!parentObj)
				parentObj = document.getElementsByTagName("head").item(0);
			parentObj.appendChild(NewScript);
		}
	}
}

//Cookies操作类
Kissogram.Cookies = {
	//Cookies前缀
	Prefix : "KissogramCookies_",

	//获得COOKIES
	Get : function (name) {
		var dc = document.cookie;
		var prefix = name +"=";
		var begin = dc.indexOf("; " +prefix);
		if (begin == -1) {
			begin = dc.indexOf(prefix);
			if (begin != 0)
				return '';
		}
		else begin += 2;
		var end = dc.indexOf(";", begin);
		if (end == -1)
			end = dc.length;
		return unescape(dc.substring(begin + prefix.length,end));
	},

	//删除COOKIES
	Delete : function (name,path,domain) {
		if (!this.Get(name))
			return;
		document.cookie = name + "=" +
			((path) ? "; path=" + path : "") +
			((domain) ? "; domain=" + domain : "") +
			"; expires=Thu, 01-Jan-70 00:00:01 GMT";
	},

	//设置COOKIES,expires 可以用时间,也可以用数字表示天数
	Set : function (name,value,expires,path,domain,secure) {
		//判断是否为正整数的正则
		var re = /^[1-9]+[0-9]*]*$/;
		if (expires) {
			//为数字
			if (re.test(expires)) {
				var _expires = new Date();
				_expires.setTime(_expires.getTime() + expires*24*60*60*1000);
				expires = _expires;
			}
			else if (!expires.isDate())
				expires = null;
		}
		var curCookie = name + "=" + escape(value) +
			((expires) ? "; expires=" + expires.toGMTString() : "") +
			((path) ? "; path=" + path : "") +
			((domain) ? "; domain=" + domain : "") +
			((secure) ? "; secure" : "");
		document.cookie = curCookie;
	}
}

//错误基类(参数:错误ID,错误名称),使用此类时请使用Clone复制为对象
Kissogram.Error = function ($ID,$Name,$Type,$Detail,$ServerPage) {
	//使此类可以创建为对象(new Kissogram.Error([$ID,$Name,$Type,$Detail,$ServerPage]).Clone)
	this.Clone = {
		ID : $ID || 0,
		Name : $Name || null,
		//错误类型[系统内部处理错误-0/用户操作错误-1]
		Type : $Type || 0,
		Error : false,
		Code : null,
		//详细错误报告
		Detail : typeof($Detail)=='boolean' ? $Detail : true,
		DetailCode : null,
		ServerPage : $ServerPage,
		//便于使用,Solution定义为一个数组
		Solution : new Array(),

		//定义基本方法
		//上报错误至服务器
		Send : function () {
			if (!this.Error)
				return;
			var ErrServerPage = this.ServerPage || (Kissogram.Const.Folder_Path +'Xml/Server.asp?action=JsOnErr');
			if (ErrServerPage.indexOf('?')>-1) {
				if (ErrServerPage.charAt(ErrServerPage.length-1)!='?')
					ErrServerPage += '&';
			}
			else
				ErrServerPage += '?';
			var Msg = "",Args = new Array();
			ErrServerPage += 'tempCode='+ Kissogram.Construction.Common.RndCode(8,true);
			Args[0] = 'PageUrl='+ escape(Kissogram.HtmlControls.Page.Current.Url);
			if (this.Code)
				Args[1] = "ErrorCode="+ escape(Kissogram.Construction.Common.Convert.HtmlEncode(this.Code));
			if (this.DetailCode)
				Args[1] += escape(Kissogram.Construction.Common.Convert.HtmlEncode('\n'+ this.DetailCode));
			var QueryString = Args.join("&");
			Kissogram.Ajax.Xml.Operator.HttpRequest.Common.Get(Kissogram.HtmlControls.Page.trueUrl(ErrServerPage),0,1,QueryString,true,new Function("Xml","return true;"));
		},

		//错误初始化
		clear : function () {
			this.Error = false;
			this.Code = null;
			this.DetailCode = null;
			this.Solution = new Array();
		},

		//添加解决方案
		addSolution : function ($Solution) {
			this.Solution[this.Solution.length] = $Solution;
		},

		//弹出警告框
		Show : function () {
			if (!this.Error)
				return;
			//默认无解决方案
			var SolutionMsg = "暂无.";
			if (this.Solution.length>0) {
				for (var i=0;i<this.Solution.length;i++) {
					this.Solution[i] = (i+1) +")"+ this.Solution[i];
				}
				SolutionMsg = this.Solution.join("<br/>");
			}
			Kissogram.UserMsg.Alert.Load(this.Name +"出错!",
				"<p>错误:<br/>"+
				((this.Code) ? (this.Code.replace(/\n/g,"<br/>")) : ("原因不明!"))
				+ "</p>" +
				((this.Detail && this.DetailCode) ? ("<p>详细描述:<br/>"+ this.DetailCode.replace(/\n/g,"<br/>") +"</p>") : ("您没有权限查看,或没有详细资料!")) +
				"<p>解决方案:<br/>"+ SolutionMsg +"</p>",0,0);
		},

		//文件加载错误
		File : function (FilePath,Cause) {
			this.Error = true;
			this.Code = '程序需要的源文件错误,请管理员检查!';
			if (this.Detail)
				this.DetailCode = '错误文件:'+ 
					'\n@相对路径:'+
					'[<b><a href=\"javascript:window.clipboardData.setData(\'Text\',\''+ Kissogram.HtmlControls.Page.UrlClear(FilePath) +'\');void (0);\">复制到剪贴板</a></b>]'+
					'\n'+ FilePath +
					'\n@绝对路径:'+
					'[<b><a href=\"javascript:window.clipboardData.setData(\'Text\',\''+ Kissogram.HtmlControls.Page.trueUrl(FilePath) +'\');void (0);\">复制到剪贴板</a></b>]'+
					'\n'+ Kissogram.HtmlControls.Page.trueUrl(FilePath) +
					'\n\n错误原因:\n'+ Cause;
			this.Solution[0] = '请检查源文件是否存在.';
		},

		//错误常规操作
		Dispose : function () {
			this.Send();
			this.clear();
		}
	}
}

//**************************************************************************************************
//对Js函数对象的扩展

//判断是否日期
String.prototype.isDate = function() {
	var r = this.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 
	if (r == null)
		return false; 
	var d = new Date(r[1], r[3]-1, r[4]); 
	return (d.getFullYear()==r[1] && (d.getMonth()+1)==r[3] && d.getDate()==r[4]);
}

//对日期类的部分扩展
Date.prototype.addSeconds = function (second) {
    var m = this.getTime() + (second * 1000);
    return new Date(m);
};

Date.prototype.addDays = function (day) {
    return this.addSeconds(day * 24 * 60 * 60);
};
//-->
