/* 去除多余空格函数
* trim:去除两边空格 lTrim:去除左空格 rTrim: 去除右空格
* 用法：
*  var str = "  hello ";
*  str = str.trim();
*/
String.prototype.trim = function()
{
	return this.replace(/(^[\s]*)|([\s]*$)/g, "");
}
String.prototype.lTrim = function()
{
	return this.replace(/(^[\s]*)/g, "");
}
String.prototype.rTrim = function()
{
	return this.replace(/([\s]*$)/g, "");
}
/*** 检查是否由数字组成 ***/
String.prototype.isDigit = function() {
	var s = this.trim();
	return (s.replace(/d/g, "").length == 0);
}

/*** 检查是否由数字字母和下划线组成 ***/
String.prototype.isAlpha = function() {
	return (this.replace(/w/g, "").length == 0);
}

/*** 检查是否为数 ***/
String.prototype.isNumber = function() {
	var s = this.trim();
	return (s.search(/^[+-]?[0-9.]*$/) >= 0);
}

/*** 检查是否包含汉字 ***/
String.prototype.isInChinese = function() {
	return (this.length != this.replace(/[^x00-xff]/g,"**").length);
}

/* 计算字符串的长度，一个汉字两个字符*/
String.prototype.realLength = function()
{
  return this.replace(/[^\x00-\xff]/g,"**").length;
}

/********************************** Integer *************************************/
/**
*校验字符串是否为整型
*返回值：
*如果为空，定义校验通过，      返回true
*如果字串全部为数字，校验通过，返回true
*如果校验不通过，              返回false     参考提示信息：输入域必须为数字！
*/
function checkIsInteger(str)
{
    //如果为空，则通过校验
    if(str == "")
        return true;
    if(/^(\-?)(\d+)$/.test(str))
        return true;
    else
        return false;
}
//~~~


/********************************** Empty **************************************/
/**
*校验字符串是否为空
*返回值：
*如果不为空，定义校验通过，返回true
*如果为空，校验不通过，返回false参考提示信息：输入域不能为空！
*/
function checkIsNotEmpty(str)
{
 if(str.trim() == "")
  return false;
 else
  return true;
}
//~~~
/********************************** date ******************************************/
/**
*校验字符串是否为日期型
*返回值：
*如果为空，定义校验通过，  返回true
*如果字串为日期型，校验通过， 返回true
*如果日期不合法， 返回false 参考提示信息：输入域的时间不合法！（yyyy-MM-dd）
*/
/****
function checkIsValidDate(str)
{
//如果为空，则通过校验
	if(str == "") return true;
	var pattern = /^((\d{4})|(\d{2}))-(\d{1,2})-(\d{1,2})$/g;
	if(!pattern.test(str)) return false;
	var arrDate = str.split("-");
	if(parseInt(arrDate[0],10) < 100){arrDate[0] = 2000 + parseInt(arrDate[0],10) + ""};
	var date =  new Date(arrDate[0],(parseInt(arrDate[1],10) -1)+"",arrDate[2]);
	if(date.getYear() == arrDate[0] && date.getMonth() == (parseInt(arrDate[1],10) -1)+"" && date.getDate() == arrDate[2]){
		return true;
	}else{
		return false;
	}
}
//~~~
 ***/
/********************************** email *****************************************/
/**
*校验字符串是否为email型
*返回值：
*如果为空，定义校验通过，  返回true
*如果字串为email型，校验通过，返回true
*如果email不合法，返回false 参考提示信息：Email的格式不正確！
*/
function checkEmail(str)
{
	//如果为空，则通过校验
	if(str == "") return true;
	if (str.charAt(0) == "." || str.charAt(0) == "@" || str.indexOf('@', 0) == -1 || str.indexOf('.', 0) == -1 || str.lastIndexOf("@") == str.length-1 || str.lastIndexOf(".") == str.length-1)
		return false;
	else
		return true;
}
//~~~
/*--------------------------------- email ----------------------------------------*/
/********************************** chinese ***************************************/
/**
*校验字符串是否为中文
*返回值：
*如果为空，定义校验通过，  返回true
*如果字串为中文，校验通过，返回true
*如果字串为非中文， 返回false 参考提示信息：必须为中文！
*/
function checkIsChinese(str)
{
 //如果值为空，通过校验
 if (str == "")
  return true;
 var pattern = /^([\u4E00-\u9FA5]|[\uFE30-\uFFA0])*$/gi;
 if (pattern.test(str))
  return true;
 else
  return false;
}
//~~~
/**

/*--------------------------------- chinese --------------------------------------*/
/********************************** mask ***************************************/
/**
*校验字符串是否符合自定义正则表达式
*str 要校验的字串  pat 自定义的正则表达式
*返回值：
*如果为空，定义校验通过，  返回true
*如果字串符合，校验通过，  返回true
*如果字串不符合， 返回false 参考提示信息：必须满足***模式
*/
function checkMask(str,pat)
{
 //如果值为空，通过校验
 if (str == "")
  return true;
 var pattern = new RegExp(pat,"gi")
 if (pattern.test(str))
  return true;
 else
  return false;
}
//~~~
/*--------------------------------- mask --------------------------------------*/


/*** 简单的日期检查，成功返回日期对象
String.prototype.isDate = function() {
	var p;
	var re1 = /(d{4})[年./-](d{1,2})[月./-](d{1,2})[日]?$/;
	var re2 = /(d{1,2})[月./-](d{1,2})[日./-](d{2})[年]?$/;
	var re3 = /(d{1,2})[月./-](d{1,2})[日./-](d{4})[年]?$/;
	if(re1.test(this)) {
		p = re1.exec(this);
		return new Date(p[1],p[2],p[3]);
		//return true;
	}
	if(re2.test(this)) {
		p = re2.exec(this);
		return new Date(p[3],p[1],p[2]);
		//return true;
	}
	if(re3.test(this)) {
		p = re3.exec(this);
		return new Date(p[3],p[1],p[2]);
		//return true;
	}
	return false;
}

 ***/

function isDate(str){
	if(!str.match(/^\d{4}\-\d\d?\-\d\d?$/)){return false;}
	window.tmp=false;
	window.execScript('tmp=IsDate("' + str + '")', "vbs");
	return tmp;
}


// 空字符串
function CheckEmpty( str )
{
	return ( str == "" );
}

function Check( reg, str )
{
	if( reg.test( str ) )
	{
		return true;
	}
	return false;
}
// 邮编
function CheckZip( str )
{
	var reg = /^\d{6}$/;
	return Check( reg, str );
}

// 手机号/小灵通号
function CheckMobile( str )
{
	var regMobile = /^\d{11,12}$/;
	return Check( regMobile, str );
}

// 15位身份证号
function CheckNum15( str )
{
	var reg = /^\d{15}$/;
	return Check( reg, str );
}

// 18位身份证号
function CheckNum18( str )
{
	var reg = /^\d{17}(?:\d|x)$/;
	return Check( reg, str );
}

// 字母或数字
function CheckCharOrNum( str )
{
	var reg = /^\w+$/;
	return Check( reg, str );
}

// 检查固定电话
function CheckTel( str )
{
	var Letters = "0123456789()+-";
	for (var i=0; i< str.length; i++){
		var CheckChar = str.charAt(i);
		if (Letters.indexOf(CheckChar) == -1){
			return false;
		}
	}
	return true;
}


function checkIdcard(idcard){
	var Errors=new Array("验证通过!","身份证号码位数不对!","身份证号码出生日期超出范围或含有非法字符!","身份证号码校验错误!","身份证地区非法!");
	var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
	var idcard,Y,JYM;
	var S,M;
	var idcard_array = new Array();
	idcard_array = idcard.split("");
	if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
	switch(idcard.length){
	case 15:
		if ((parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
			ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
		}else{
			ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
		}
		if(ereg.test(idcard)){
			return Errors[0];
		}else{
			return Errors[2];
		}
		break;
	case 18:
		if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
			ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
		}else{
			ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
		}
		if(ereg.test(idcard)){
			S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 + parseInt(idcard_array[9]) * 3 ;
			Y = S % 11;
			M = "F";
			JYM = "10X98765432";
			M = JYM.substr(Y,1);
			if(M == idcard_array[17]){
				return Errors[0];
			}else{
				return Errors[3];
			}
		}else{
			return Errors[2];
		}
		break;
	default:
		return Errors[1];
		break;
	}
} 
