/******************************************************************************
	Description:	
	提供两组函数：
		1、检查函数，判断数据是否有效，主要用于验证用户填写的表单数据
		2、验证并提示函数，当数据无效时直接弹出对话框并激活控件
			（该组函数以Prompt打头）

	目前可以做的检查包括：
	是否为空字符串		PromptEmptyString, IsEmptyString
	是否包含非法字符	PromptBadLetter, HasBadLetter
	两个值是否相等（主要用在密码）	PromptDifferent, IsDifferent
	是否是整数			PromptInvalidNumber, IsValidNumber
	是否是小数			PromptInvalidFloatNumber, IsValidFloatNumber
	是否有效的身份证号	PromptInvalidIdentifyNumber, IsValidIdentifyNumber
	select是否选中有效值	PromptForcedSelect, IsValidSelect
	radio/checkbox是否选中	PromptForcedCheckBox, IsCheckBoxSelected
	判断文件类型是否合法	PromptInvalidFileType, IsValidFileType
	是否为有效的url		PromptInvalidUrl， IsValidUrl
******************************************************************************/


// 预定义好的文件过滤字符串
var g_FilterAspFile = ".asp.aspx";								//Asp文件
var g_FilterImageFile = ".gif.bmp.jpg.jpeg.png.ico.emf.wmf";	//图片文件
var g_FilterFlashFile = ".swf";									//Flash文件
var g_FilterMediaFile = ".asf.asx.wmv.wma.avi.mpg.mpeg.rm.ra.ram.rmvb";	//媒体文件
var g_sRealOneFileType = ".rm.ra.ram.rmvb"


//******************************************************************************
// 执行判断，并弹出对话框提示用户的函数
//******************************************************************************

// 判断输入是否非空，如为空直接弹出对话框提示用户
function PromptEmptyString(oInput, sLabel)
{
	if ( IsEmptyString(oInput.value) )
	{
		alert("对不起，" + sLabel + "不能为空，请您正确填写！");
		oInput.focus();
		oInput.select();
		return false;
	}
	return true;
}

// 判断包含非法的字符，如包含非法的字符直接弹出对话框提示用户
function PromptBadLetter(oInput, sLabel, sBadLetters)
{
	if ( HasBadLetter(oInput.value, sBadLetters) )
	{
		alert("对不起，" + sLabel + "中不能包含有以下字符：\n " + sBadLetters + " \n请您正确填写！");
		oInput.focus();
		oInput.select();
		return false;
	}
	return true;
}

// 判断两个值是否相等，如不等直接弹出对话框提示用户
function PromptDifferent(oInput1, oInput2, sLabel1, sLabel2)
{
	if ( IsDifferent(oInput1.value, oInput2.value) )
	{
		alert("对不起，您填写的" + sLabel1 + "与" + sLabel2 + "不一致，请您重新填写！");
		oInput2.value = "";
		oInput1.focus();
		oInput1.select();
		return false;
	}
	return true;
}

// 判断输入的数字是否有效，如无效直接弹出对话框提示用户
function PromptInvalidNumber(oInput, sLabel, bAllowZero)
{
	// 默认不允许输入零
	if (bAllowZero == null) bAllowZero = false;

	if ( !IsValidNumber(oInput.value, bAllowZero) )
	{
		var sNumberType = bAllowZero ? "整数" : "正整数";
		alert("对不起，" + sLabel + "必须为" + sNumberType + "，请您正确填写！");
		oInput.focus();
		oInput.select();
		return false;
	}
	return true;
}

// 判断输入的数字是否是小数，如无效直接弹出对话框提示用户
function PromptInvalidFloatNumber(oInput, sLabel, bAllowZero)
{
	// 默认不允许输入零
	if (bAllowZero == null) bAllowZero = false;

	if ( !IsValidFloatNumber(oInput.value, bAllowZero) )
	{
		var sNumberType = bAllowZero ? "数字" : "正数";
		alert("对不起，" + sLabel + "必须为" + sNumberType + "，请您正确填写！");
		oInput.focus();
		oInput.select();
		return false;
	}
	return true;
}

// 判断输入的身份证号是否有效，如无效直接弹出对话框提示用户
function PromptInvalidIdentifyNumber(oInput, sLabel)
{
	if ( !IsValidIdentifyNumber(oInput.value) )
	{
		alert("对不起，" + sLabel + "格式不正确，请您正确填写！");
		oInput.focus();
		oInput.select();
		return false;
	}
	return true;
}

// 判断输入的e-mail是否有效，如无效直接弹出对话框提示用户
function PromptInvalidMail(oInput, sLabel)
{
	if ( !IsValidMail(oInput.value) )
	{
		alert("对不起，" + sLabel + "格式不正确，请您正确填写！");
		oInput.focus();
		oInput.select();
		return false;
	}
	return true;
}

// 判断必选的Select是否被选中有效值，如无效值直接弹出对话框提示用户
function PromptForcedSelect(oSelect, sLabel)
{
	if ( !IsValidSelect(oSelect) )
	{
		alert("对不起，请您选择" + sLabel + "！");
		oSelect.focus();
		return false;
	}
	return true;
}

// 判断必选的CheckBox or Radio是否被选中，如无直接弹出对话框提示用户
function PromptForcedCheckBox(oInput, sLabel)
{
	if ( !IsCheckBoxSelected(oInput) )
	{
		alert("对不起，请您选择" + sLabel + "！");
		return false;
	}
	return true;
}

function PromptInvalidFileType(oInput, sLabel, sFileType, sAllowFilter, sDenyFilter)
{
	if (sDenyFilter == null) sDenyFilter = "";

	if ( !IsValidFileType(oInput.value, sAllowFilter, sDenyFilter) )
	{
		var sPrompt = "对不起，系统限制" + sLabel;
		if (sAllowFilter.length > 0)
			sPrompt += "只允许上传" + sFileType;
		else if (sDenyFilter.length > 0)
			sPrompt += "不允许上传" + sFileType;
		else
			sPrompt += "不允许上传任何";

		sPrompt += "文件！"

		alert(sPrompt);
		return false;
	}
	return true;
}

// 判断必选的Url是否有效，如无直接弹出对话框提示用户
function PromptInvalidUrl(oInput, sLabel)
{
	if (!IsValidUrl(oInput.value))
	{
		alert("对不起，请您正确填写" + sLabel + "！");
		oInput.focus();
		oInput.select();
		return false;
	}

	return true;
}

//******************************************************************************
// 核心判断函数，一般用户不用调用
//******************************************************************************

// 判断填写的内容是否为空
function IsEmptyString(sValue)
{
	return (Trim(sValue).length == 0);
}

// 判断是否包含非法的字符
function HasBadLetter(sValue, sBadLetters)
{
	for (var i=0; i < sValue.length; ++i)
	{
		if (sBadLetters.indexOf(sValue.substr(i,1)) >= 0)
			return true;
	}
	return false;
}

function IsDifferent(sValue1, sValue2)
{
	return (sValue1 != sValue2);
}

// 判断填写的数字是否有效
function IsValidNumber(sNumber, bAllowZero)
{
	sNumber = sNumber.replace(/(^[ \t]+)|([ \t]+$)/g , "" );

	// 判断整数
	if ( sNumber.search(/^[\d]+$/g) < 0 ) return false;

	// 判断非零
	if ( (!bAllowZero) && ( parseInt(sNumber) == 0 ) ) return false;

	return true;
}

// 判断填写的数字是否是数字（包括小数）
function IsValidFloatNumber(sNumber, bAllowZero)
{
	sNumber = sNumber.replace(/(^[ \t]+)|([ \t]+$)/g , "" );
	
	// 判断数字
	if ( sNumber.search(/^[\d]+[\.]?[\d]*$/g) < 0 ) return false;

	// 判断非零
	if ( (!bAllowZero) && ( parseInt(sNumber) == 0 ) ) return false;

	return true;
}

// 判断填写的身份证号是否有效
function IsValidIdentifyNumber(sIDNumber)
{
	sIDNumber = sIDNumber.replace(/(^[ \t]+)|([ \t]+$)/g , "");
	if ( sIDNumber.length == 15 || sIDNumber.length == 18 )
	{
		if ( sIDNumber.search(/^[\d]+[\dx]$/gi) < 0)
			return false;
	}
	else
		return false;

	return true;
}

// 判断填写的email地址是否有效
function IsValidMail(sMail)
{
	var pattern = /^([a-zA-Z\.0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
	return pattern.test(sMail);
}

// 判断Select是否选中有效值
function IsValidSelect(oSelect)
{
	return (oSelect.value >= 0);
}


// 判断Radio OR CheckBox 是否选中
// 之所以取名为IsCheckBoxSelected，是参考了Asp.net中的控件对象模型（Radio由CheckBox继承）
function IsCheckBoxSelected(oCheckBox)
{
	if (oCheckBox.length)
	{
		for ( var i=0; i < oCheckBox.length; ++i)
			if (oCheckBox[i].checked) return true;
	}
	else
		return (oCheckBox.checked);

	return false;
}


// 判断上传的是否是合法的文件类型
function IsValidFileType(sFileName, sAllowFilter, sDenyFilter)
{
	var sExt = GetFileExt(sFileName);
	if ( sExt.length )
	{
		var reg = new RegExp("\\." + sExt + "\\b", "i");

		if ( sAllowFilter.length )	return ( reg.test(sAllowFilter) );
		if ( sDenyFilter.length )	return ( !reg.test(sDenyFilter) );
	}

	return true;

}

// 判断Url是否是合法
function IsValidUrl(sUrl)
{
	if (sUrl.length == 0) return false;
	if (sUrl == "http://") return false;

	return true;
}

//******************************************************************************
// 辅助函数
//******************************************************************************

function Trim(sValue)
{
	return sValue.replace(/(^\s*)|(\s*$)/g, "");
}

function HTMLTrim(sValue)
{
	sValue = Trim( sValue );
	sValue = sValue.replace(/(^(&nbsp;)*)|((&nbsp;)*$)/g, "");

	// 在HTML编辑器中，如果输入一个空格，再删除那个空格，<p>&nbsp;</p>就会出现，
	// 在此并没有直接删除掉所以的<p>&nbsp;</p>，因为如果用户希望在首或尾添加空行时，也会有这种输入，
	// 在此只是简单地认为如果所有内容只是一个<p>&nbsp;</p>，则认为内容为空
	if ( sValue.toLowerCase() == "<p>&nbsp;</p>" ) sValue = "";

	return sValue;
}

// 得到文件的文件名，eg: GetFileExt("c:\a.txt") = "txt"
function GetFileExt( sFileName )
{
	var sExt = "";
	var pos = Trim(sFileName).lastIndexOf(".");
	if ( pos >= 0 ) {
		sExt = sFileName.substr( pos + 1, sFileName.length - pos - 1 );
		sExt = sExt.toLowerCase();
	}
	return sExt;
}

