// ----------------------------------------------------------------------------
//    字段检查函数库  (前端)
//    by z.a (张宁)
//    Ver. 壹点壹肆
//      1.1  * chkCheckbox()对于单项出错
//      1.11 * chkCombobox()可以判断多个相同名字的下拉框，只要一个选中即可
//           + chkComboboxAll()类似上一个函数，成立条件为全部选中
//      1.12 + isNull()判断是否为空对象
//           * chkCheckbox()对于没项出错，调用上面函数判断
//      1.13 + chkCheckboxOther()带其它项目文本框的chkCheckbox()
//      1.14   ( 2003-12-2 )
//           + closeOrBack()关闭当前窗口或回退一页
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
//	基本数据类型的检验，
//	如果错误，显示提示信息、光标指向出错处、函数返回假。
// ----------------------------------------------------------------------------

/*
	*** 客户端调用示例 ***

1. 引用库文件
	<Script Language="JavaScript" Src="/_ccwlib/verify.js"></Script>
2. 编写验证程序
	<Script Language="JavaScript">
	<!--
	// 验证全部数据域
	function chkAll(aForm) {
		var lValid=true;
		if (lValid)	 lValid=chkStringNull('用户名',aForm.Username);
		if (lValid)	 lValid=chkStringNull('密码',aForm.Password);
		if (lValid)	 lValid=chkPasswordSame(aForm.Password,aForm.Password2);
		if (lValid)	 lValid=chkEmail('电邮',aForm.Email);
		if (lValid)	 lValid=chkStringLong('备注',aForm.Memo,100);
		...
		return lValid;
	}
	//-->
	</Script>
3. 编写界面HTML代码
	<Form Method="post" onSubmit="return chkAll(this)" Action="...">
	<Input Type="text" Name="Username" Maxlength="8" Size="8" Value="" Class="za">
	...
	</Form>
*/

// 检查字符串数据是否为空
//   入口：提示标题、检查对象、错误提示信息
//   缺省：　　　　　　　　　　[XX]不能为空
function chkStringNull(aTitle,aTextCtrl,aMsg) {
	if (isEmptyObject(aTextCtrl)) {
		alert((aMsg==null?'['+aTitle+'] 不能为空 ！':aMsg));
		aTextCtrl.focus();
		return false;
	} else
		return true;
}

// 检查字符串数据是否太短
//   入口：提示标题、检查对象、最小长度
function chkStringShort(aTitle,aTextCtrl,aMin) {
	if ( !isStringOverstep(aTextCtrl.value,aMin) ) {
		alert('['+aTitle+'] 不能短于 '+aMin+' 位！');
		aTextCtrl.focus();
		aTextCtrl.select();
		return false;
	} else
		return true;
}

// 检查字符串数据是否超长
//   入口：提示标题、检查对象、最大长度
function chkStringLong(aTitle,aTextCtrl,aMax) {
	if ( isStringOverstep2(aTextCtrl.value,aMax) ) {
		alert('['+aTitle+'] 不能长于 '+aMax+' 位！');
		aTextCtrl.focus();
		aTextCtrl.select();
		return false;
	} else
		return true;
}

// 检查字符串数据是否为空、是否超短超长
//   入口：提示标题、检查对象、最小长度、最大长度
function chkString(aTitle,aTextCtrl,aMin,aMax) {
	var lValid= false;
	if (chkStringNull(aTitle,aTextCtrl))
		if (chkStringShort(aTitle,aTextCtrl,aMin))
			if (chkStringLong(aTitle,aTextCtrl,aMax))
				lValid= true;
	return lValid;
}

// 检查输入是否为数字
//   入口：提示标题、检查对象
function chkInteger(aTitle,aTextCtrl) {
	if ( !isInteger(aTextCtrl.value) ) {
		alert('['+aTitle+'] 必须是数字 ！');
		aTextCtrl.focus();
		aTextCtrl.select();
		return false;
	} else
		return true;
}

// 检查输入的整形数的取值范围
//   入口：检查对象、最小长度、最大长度
function chkIntegerBound(aTitle,aTextCtrl,aMin,aMax) {
	if ( isNaN(aTextCtrl.value) || aTextCtrl.value<aMin || aTextCtrl.value>aMax ) {
		alert("["+aTitle+"]请输入介于"+aMin+"和"+aMax+"之间的数字");
		aTextCtrl.focus();
		aTextCtrl.select();
		return false;
	} else
		return true;
}

// 检查指定的同组检查框（含checkbox和radiobox）是否选中，都未选中返回假，否则返回真
//   入口：提示标题、检查对象
function chkCheckbox(aTitle,aTextCtrl) {
	var bValid= false;
	if (isNull(aTextCtrl))
		return false;
	var bSingleObject= !isInteger(aTextCtrl.length);
	if (bSingleObject) {
		bValid= aTextCtrl.checked;
	} else {
		for (i=0; i<aTextCtrl.length; i++)
			if (aTextCtrl[i].checked)
				bValid = true;
	}
	if (!bValid) {
		alert('请选择 ['+aTitle+'] ！');
		if (bSingleObject)
			aTextCtrl.focus();
		else
			aTextCtrl[0].focus();
		return false;
	} else
		return true;
}

// 检查指定的同组检查框（含checkbox和radiobox）是否选中，都未选中返回假，否则返回真
// 其它项（最后一项）如果选中，要增加对其它项目文本框的非空检查
//   入口：提示标题、检查对象、检查其它对象的后缀
function chkCheckboxOther(aTitle,aTextCtrl,aOtherCtrlExt) {
	var oLastCtrl= aTextCtrl[aTextCtrl.length-1];
	var oOtherCtrl= eval('document.'+oLastCtrl.form.name+'.'+oLastCtrl.name+(aOtherCtrlExt==null?'_other':aOtherCtrlExt));

	if (!chkCheckbox(aTitle,aTextCtrl))
		return false;
	if (oLastCtrl.checked) {
		return (chkStringNull('('+aTitle+')'+oLastCtrl.value,oOtherCtrl))
	}
	return true;
}

// 检查指定的同组下拉列表框是否选中（选中缺省值不算）
//   入口：提示标题、检查对象、缺省值
//   缺省：　　　　　　　　　　空字符串
function chkCombobox(aTitle,aTextCtrl,aDefault) {
	var strDefault= (aDefault==null?'':aDefault);
	var bValid= false;
	var bSingleObject= !isInteger(aTextCtrl[0].length);	// 因为单下拉框的length属性代表其项目数
	var oErrorObject;
	if (bSingleObject) {
		oErrorObject= aTextCtrl;
		bValid= !( aTextCtrl.value==strDefault );
	} else {
		oErrorObject= aTextCtrl[0];
		for (i=0; i<aTextCtrl.length; i++)
			if (!( aTextCtrl[i].value==strDefault )) {
				bValid = true;
				oErrorObject= aTextCtrl[i];
				break;
			}
	}
	if (!bValid) {
		alert('请选择 ['+aTitle+'] ！');
		oErrorObject.focus();
		return false;
	} else
		return true;
}

// 检查指定的多个下拉列表框是否都选中（选中缺省值不算）
//   入口：提示标题、检查对象、缺省值
//   缺省：　　　　　　　　　　空字符串
function chkComboboxAll(aTitle,aTextCtrl,aDefault) {
	var strDefault= (aDefault==null?'':aDefault);
	var bValid= true;
	var bSingleObject= !isInteger(aTextCtrl[0].length);	// 因为单下拉框的length属性代表其项目数
	var oErrorObject;
	if (bSingleObject) {
		oErrorObject= aTextCtrl;
		bValid= !( aTextCtrl.value==strDefault );
	} else {
		oErrorObject= aTextCtrl[0];
		for (i=0; i<aTextCtrl.length; i++)
			if ( aTextCtrl[i].value==strDefault ) {
				bValid = false;
				oErrorObject= aTextCtrl[i];
				break;
			}
	}
	if (!bValid) {
		alert('请选择 ['+aTitle+'] ！');
		oErrorObject.focus();
		return false;
	} else
		return true;
}

// 检查是否是日期型值
//   入口：提示标题、检查对象
function chkDate(aTitle,aTextCtrl) {
	var aValue= aTextCtrl.value;
	var lValid= false;
	var supported = 0;
	if (window.RegExp) {
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) supported = 1;
	}
	if (!supported) { lValid=(aValue.indexOf(".") > 0) || (aValue.indexOf("-") > 0); }
	else {
		// 1000.1.1 - 2999.19.39
		var r2 = new RegExp("^[12]\\d{3}[\\-./][01]?\\d[\\-./][0123]?\\d$");
		lValid=r2.test(aValue);
	}
	if ( !lValid ) {
		alert('['+aTitle+'] 必须是合法日期 ！');
		aTextCtrl.focus();
		aTextCtrl.select();
	}
	return lValid;
}

// 检查Email地址的合法性
//   入口：提示标题、检查对象
function chkEmail(aTitle,aTextCtrl) {
	var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
	if ( !r2.test(aTextCtrl.value) ) {
		alert('['+aTitle+'] 必须是正确的Email地址 ！');
		aTextCtrl.focus();
		aTextCtrl.select();
		return false;
	} else
		return true;
}

// ----------------------------------------------------------------------------
//    窗口操作函数
//

// 如果是弹出窗口则关闭当前窗口，否则回退到上一页
//   入口：无
function closeOrBack()
{
	if(opener)
		window.close();
	else
		history.back();
	//window.location.href=document.referrer;	// 刷新的方法
}

// ----------------------------------------------------------------------------
//    Password Functions
//

// 检查两次填写的密码是否相同，不同时光标落到Pass2上
//   入口：检查Pass对象1、检查Pass对象2
function chkPasswordSame(aPassCtrl1,aPassCtrl2) {
	if ( aPassCtrl1.value!=aPassCtrl2.value ) {
		alert('密码与确认密码必须相同 ！');
		aPassCtrl2.focus();
		aPassCtrl2.select();
		return false;
	} else
		return true;
}

// ----------------------------------------------------------------------------
//    Atomic Functions
//

// 返回字符串字节长度
//   入口：待检字符串
function byteLength(aString) {
	for (var i=0,iLen=0; aString.charAt(i); i++) {
		if (aString.charCodeAt(i)>256)
			iLen+=2;
		else
			iLen++;
	}
	return iLen;
}

// 检查字符串是否超长
//   入口：待检字符串、最大长度
function isStringOverstep(aText,aMax) {
	return byteLength(aText)>=aMax;
}

// 检查字符串是否超长
//   入口：待检字符串、最大长度
function isStringOverstep2(aText,aMax) {
	return byteLength(aText)>aMax;
}

// 检查是否为空串
//   入口：待检字符串
function isEmptyObject(aCtrl) {
	return aCtrl.value=='';
}

// 检查是否不是对象
//   入口：待检对象
function isNull(aCtrl) {
	return String(aCtrl)=="undefined";
}

// 检查是否为数值型数据
//   入口：待检数值串
function isInteger(aText) {
	var bValid;
	var supported = 0;
	if (window.RegExp) {
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) supported = 1;
	}
	if (!supported)
		bValid= (parseInt(aText)==aText);
	else {
		var r2 = new RegExp("^[0-9]*.?[0-9]+$");
		bValid= r2.test(aText);
	}
	return bValid;
}

