//create by FengJinHui 
//2006-03-02
/*

           1.Trim(str)－－去除字符串两边的空格

           2.XMLEncode(str)－－对字符串进行XML编码

           3.ShowLabel(str,str)－－鼠标提示功能（显示字符，提示字符）

           4.IsEmpty(obj)－－验证输入框是否为空

           5.IsInt(objStr,sign,zero)－－验证是否为整数

           6.IsFloat(objStr,sign,zero)－－验证是否为浮点数

           7.IsEnLetter(objStr,size)－－验证是否为26个字母
                     
           8. checkStrLen(value) -- 获得某个字符串长度.(特别适用于检查textarea长度)
                     
           9. changeDay1(yearObj,monthObj,dayObj) -- 根据年、月的选择情况，修改日期内的天数
                     
           10. changeDay2(yearObj,monthObj,dayObj) -- 根据年、月的选择情况，修改日期内的天数
                     
           11. formatString(str,len,prefix) --  格式化字符串，字符串str前面补上prefix
                     
           12. getYearMonth(yearMonth,objYear,objMonth) -- 显示当前年份上下五年，显示当前月份
           
           13. backSpace(value,delim) -- 去除value中以delim为分隔符的最后的字符串
           
           14. convertString(values,delim,prefix,suffix) -- 返回以delim分隔的字符串
           
           15. getCode(str,sign) -- 返回格式化后的公式
           
           16. getObjLength(objName) -- 返回对象长度
           
           17. isNumber(value) -- 判断是否为数字

*/

 

/*

==================================================================

字符串操作

Trim(string):去除字符串两边的空格

==================================================================

*/

 

/*

==================================================================

LTrim(string):去除左边的空格

==================================================================

*/

function LTrim(str)

{

    var whitespace = new String(" \t\n\r");

    var s = new String(str);

    

    if (whitespace.indexOf(s.charAt(0)) != -1)

    {

        var j=0, i = s.length;

        while (j < i && whitespace.indexOf(s.charAt(j)) != -1)

        {

            j++;

        }

        s = s.substring(j, i);

    }

    return s;

}

 

/*

==================================================================

RTrim(string):去除右边的空格

==================================================================

*/

function RTrim(str)

{

    var whitespace = new String(" \t\n\r");

    var s = new String(str);

 

    if (whitespace.indexOf(s.charAt(s.length-1)) != -1)

    {

        var i = s.length - 1;

        while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)

        {

            i--;

        }

        s = s.substring(0, i+1);

    }

    return s;

}

 

/*

==================================================================

Trim(string):去除前后空格

==================================================================

*/

function Trim(str)

{

    return RTrim(LTrim(str));

}

 

 

 

/*

================================================================================

XMLEncode(string):对字符串进行XML编码

================================================================================

*/

function XMLEncode(str)

{

       str=Trim(str);

       str=str.replace("&","&amp;");

       str=str.replace("<","&lt;");

       str=str.replace(">","&gt;");

       str=str.replace("'","&apos;");

       str=str.replace("\"","&quot;");

       return str;

}

 

/*

================================================================================

验证类函数

================================================================================

*/

 

function IsEmpty(obj)

{

    obj=document.getElementsByName(obj).item(0);

    if(Trim(obj.value)=="")

    {

        alert("字段不能为空。");        

        if(obj.disabled==false && obj.readOnly==false)

        {

            obj.focus();

        }

    }

}

 

/*

IsInt(string,string,int or string):(测试字符串,+ or - or empty,empty or 0)

功能：判断是否为整数、正整数、负整数、正整数+0、负整数+0

*/

function IsInt(objStr,sign,zero)

{

    var reg;    

    var bolzero;    

    

    if(Trim(objStr)=="")

    {

        return false;

    }

    else

    {

        objStr=objStr.toString();

    }    

    

    if((sign==null)||(Trim(sign)==""))

    {

        sign="+-";

    }

    

    if((zero==null)||(Trim(zero)==""))

    {

        bolzero=false;

    }

    else

    {

        zero=zero.toString();

        if(zero=="0")

        {

            bolzero=true;

        }

        else

        {

            alert("检查是否包含0参数，只可为(空、0)");

        }

    }

    

    switch(sign)

    {

        case "+-":

            //整数

            reg=/(^-?|^\+?)\d+$/;            

            break;

        case "+": 

            if(!bolzero)           

            {

                //正整数

                reg=/^\+?[0-9]*[1-9][0-9]*$/;

            }

            else

            {

                //正整数+0

                //reg=/^\+?\d+$/;

                reg=/^\+?[0-9]*[0-9][0-9]*$/;

            }

            break;

        case "-":

            if(!bolzero)

            {

                //负整数

                reg=/^-[0-9]*[1-9][0-9]*$/;

            }

            else

            {

                //负整数+0

                //reg=/^-\d+$/;

                reg=/^-[0-9]*[0-9][0-9]*$/;

            }            

            break;

        default:

            alert("检查符号参数，只可为(空、+、-)");

            return false;

            break;

    }

    

    var r=objStr.match(reg);

    if(r==null)

    {

        return false;

    }

    else

    {        

        return true;     

    }

}

 

/*

IsFloat(string,string,int or string):(测试字符串,+ or - or empty,empty or 0)

功能：判断是否为浮点数、正浮点数、负浮点数、正浮点数+0、负浮点数+0

*/

function IsFloat(objStr,sign,zero)

{

    var reg;    

    var bolzero;    

    

    if(Trim(objStr)=="")

    {

        return false;

    }

    else

    {

        objStr=objStr.toString();

    }    

    

    if((sign==null)||(Trim(sign)==""))

    {

        sign="+-";

    }

    

    if((zero==null)||(Trim(zero)==""))

    {

        bolzero=false;

    }

    else

    {

        zero=zero.toString();

        if(zero=="0")

        {

            bolzero=true;

        }

        else

        {

            alert("检查是否包含0参数，只可为(空、0)");

        }

    }

    

    switch(sign)

    {

        case "+-":

            //浮点数

            reg=/^((-?|\+?)(\d+)|(-?|\+?))(\.\d+)?$/;

            break;

        case "+": 

            if(!bolzero)           

            {

                //正浮点数

                reg=/^\+?((\.[0-9]*[1-9][0-9]*)|([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

            }

            else

            {

                //正浮点数+0
                reg=/^((\+?)(\d+)|(\+?))(\.\d+)?$/;

            }

            break;

        case "-":

            if(!bolzero)

            {

                //负浮点数

                reg=/^-((\.[0-9]*[1-9][0-9]*)|([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

            }

            else

            {

                //负浮点数+0

                //reg=/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/;
                reg=/^((-?)(\d+)|(-?))(\.\d+)?$/;

            }            

            break;

        default:

            alert("检查符号参数，只可为(空、+、-)");

            return false;

            break;

    }

    

    var r=objStr.match(reg);

    if(r==null)

    {

        return false;

    }

    else

    {        

        return true;     

    }
    
    if(isNaN(objStr))
   
    {
   
        return false;
         
    }
    
    else
    
    {
    
        return true;
        
    }

}

function checkStrLen(value)
{
	var str,Num = 0;
	for (var i=0;i<value.length;i++)
	{
		str = value.substring(i,i+1);
		if (str<="~") //判断是否双字节
			Num+=1;
		else
			Num+=2;
	}
	return Num;
}

/**
 * 根据年、月的选择情况，修改日期内的天数
 * @param yearObj 年份obj,monthObj 月份obj,dayObj 日期obj 
 * @return 根据年、月的选择情况，修改日期内的天数
 */
function changeDay1(yearObj, monthObj, dayObj) {
  var day;
  var month;
  var year;
  var newIndex;
  var from;
  var newOption;
  var isLeapYear;
  year = parseInt(yearObj.options[yearObj.selectedIndex].text,10);
  month = parseInt(monthObj.options[monthObj.selectedIndex].text,10);
  if ((year%4) == 0 && (year%100) != 0 || (year%400) == 0) {
    isLeapYear = true;
  } else {
    isLeapYear = false;
  }
  if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
    day = 31;
  } else if (month == 4 || month == 6 || month == 9 || month == 11) {
    day = 30;
  } else {
    if (isLeapYear) {
      day = 29;
    } else {
      day = 28;
    }
  }
  if (dayObj.length < day) {
    for (from = dayObj.length + 1; from <= day; from++) {
      newOption = new Option(formatString(String(from),2,"0"),formatString(String(from),2,"0"),false,false);
      dayObj.options[from - 1] = newOption;
    }
  } else if (dayObj.length > day) {
    newIndex = dayObj.selectedIndex;
    for (from = dayObj.length; from > day; from--) {
      dayObj.options[from - 1] = null;
    }
    if (newIndex >= day) dayObj.selectedIndex = day - 1;
  }
}


/**
 * 根据月的选择情况，修改日期内的天数
 * @param monthObj 月份obj,dayObj 日期obj 
 * @return 根据月的选择情况，修改日期内的天数
 */
function changeDay2(monthObj, dayObj) {
  var day;
  var month;
  var newIndex;
  var from;
  var newOption;
month = parseInt(monthObj.options[monthObj.selectedIndex].text,10);
  if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
    day = 31;
  } else if (month == 4 || month == 6 || month == 9 || month == 11) {
    day = 30;
  } else {
    day = 28;
  }
  if (dayObj.length < day) {
    for (from = dayObj.length + 1; from <= day; from++) {
      newOption = new Option(formatString(String(from),2,"0"),formatString(String(from),2,"0"),false,false);
      dayObj.options[from - 1] = newOption;
}
  } else if (dayObj.length > day) {
    newIndex = dayObj.selectedIndex;
    for (from = dayObj.length; from > day; from--) {
      dayObj.options[from - 1] = null;
    }
    if (newIndex >= day) dayObj.selectedIndex = day - 1;
  }
}


/**
 * 格式化字符串，字符串str前面补上prefix
 * @param str 要格式化的字符串,len 格式化后的长度,prefix 前缀 
 * @return 格式化字符串，字符串str前面补上prefix
 */
function formatString(str,len,prefix) {
  var i;
  var strLen = str.length;
  for (i=0;i<len-strLen;i++) {
    str = prefix + str;
  }
  return str;
}



/**
 * 显示当前年份上下五年，显示当前月份
 * @param yearMonth 年月,objYear 年份obj,objMonth 月份obj 
 * @return 显示当前年份上下五年，显示当前月份
 */
function getYearMonth(yearMonth,objYear,objMonth) {
  var i;
  var newOption;
  var year = parseInt(yearMonth.substring(0,4));
  var month = parseInt(yearMonth.substring(4,6));
  for (i=year-5;i<=year+5;i++) {
    newOption = new Option(formatString(String(i),4, "0"),formatString(String(i),4, "0"),false,false);
    objYear.options[i - (year - 5)] = newOption;
  }
  for (i=1;i<=12;i++) {
    newOption = new Option(formatString(String(i),2, "0"),formatString(String(i),2, "0"),false,false);
    objMonth.options[i - 1] = newOption;
  }
  objYear.selectedIndex = 5;
  objMonth.selectedIndex = month;
}

/**
 * 去除value中以delim为分隔符的最后的字符串
 * @param value 值,delim 分隔符
 * @return 返回value中以delim为分隔符的最后的字符串
*/
function backSpace(value,delim)
{
    var i;
    var returnValue;
    try
    {
        i = value.lastIndexOf(delim);
        if (i < 0)
        {
            returnValue = "";
        }
        else
        {
            if (i == value.length - 1)
            {
                i = value.lastIndexOf(delim,i - 1);
            }
            returnValue = value.substring(0,i + 1);
        }
    }
    catch (exception)
    {
        returnValue = "";
    }
    finally
    {
        return returnValue;
    }
}

/**
 * 返回以delim分隔的字符串
 * @param strList 字符串数组,delim 分隔符,prefix 前缀,suffix 后缀
 * @return 以delim分隔的字符串
 */
    function convertString(values,delim,prefix,suffix) {
      var i;
      var str = "";
      for (i=0;i<values.length;i++) {
        str = str + prefix + values[i] + suffix + delim;
      }
      return str;
    }

/**
 * 返回格式化后的公式
 * @param str 字符串,sign 标识
* @return 格式化后的公式
*/
    function getCode(str,sign)
    {
        var from = 0;
        var to = -1;
        var codeList = "";
        while (true)
        {
            from = str.indexOf(sign,to + 1);
            if (from < 0) { break; }
            to = str.indexOf(sign,from + 1);
            if (to < 0) { break; }
            codeList = codeList + str.substring(from + 1,to) + ",";
        }
        if (codeList != "")
        {
            codeList = codeList.substring(0, codeList.length - 1);
        }
        return codeList;
    }
    
/**
 * 返回对象长度
 * @param objName 对象名
* @return 对象长度
*/
function getObjLength(objName) {
  var obj = eval(objName);
  if ((obj + "")=="undefined"){
    return 0;
  }
  if((obj.length + "")=="undefined"){
    return 1;
  }
  return obj.length;
}

/**
 * 判断值是否为数字。
 * @param value 数值 
 * @return true 数字,false 不是数字。
 */
function isNumber(value)
{
    var re = /[^\d.-]/gi;
    if (isNaN(value))
    {
        return false;
    }
    if (re.test(value))
    {
        return false;
    }
    return true;
}


//return the length of String ,count double_byte character as 2
function getLength(str){
	return str.replace(/[^\x00-\xff]/g,"aa").length;
}

//String length validate
function validateLength(str,minLength,maxLength){
	var length = getLength(str);
	if(length<minLength || length>maxLength)
		return false;
	else
		return true;
}

//number
function validateNumber(str){
	var reg = /^[1-9][0-9]*$/;
	if(reg.test(str))
		return true;
	else
		return false;
}

//float
function validateFloat(str){
	var reg = /^(([1-9]\d+)|0)(\.\d+)?$/;
	return reg.test(str);
}

//E-mail
function validateEmail(str){
	var myReg = /^[_a-zA-Z0-9+\.]+@([_a-zA-Z0-9]+\.)+[a-zA-Z0-9]{2,3}$/;
	if(myReg.test(str))
		return true;
	else
		return false;
}

//Date 
//the sample format: "2006-03-02"
function validateDate(str){
	if(str == ""){
		return true;
	}
	var reg = /^\d{2}(\d{2})(\d{2})(\d{2})$/;
	if(reg.test(str) == false)
		return false;
	
	var day = new Date(RegExp.$1,RegExp.$2-1,RegExp.$3);
	var year = day.getYear();
	var month = day.getMonth()+1;
	var date = day.getDate();

	if( (parseInt(RegExp.$1,10) != year) || (parseInt(RegExp.$2,10) != month) || (parseInt(RegExp.$3,10) != date) )
		return false;
		
	return true;
}

//TelNumber
function isTelNumber(strTel)
{ 
	var reg = /^[0-9][0-9]*$/;
	if(!reg.test(strTel))
	{
		return false;
	}
	if(strTel.length > 30){
		return false;
	}else{
	return true; 
	}
} 

//IdCard
function checkIdcard(idcard)
{
	idcard = Trim(idcard.toUpperCase());
var Errors=new Array(
"errors0",
"errors1",
"errors2",
"errors3",
"errors4"
);
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:
//18位身份号码检测
//出生日期的合法性检查
//闰年月日:((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]))
//平年月日:((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]))
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]; //检测ID的校验位
else return Errors[3];
}
else return Errors[2];
break;
default:
return Errors[1];
break;
}
}
//升级15位身份证号码到18位
function C15ToC18(c15)
{
   var cId;
   if (trimString(c15).length==15){
       cId=c15.substring(0,6)+"19"+c15.substring(6,15);
       var strJiaoYan  =[  "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
       var intQuan =[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
       var intTemp=0;
       for(i = 0; i < cId.length; i++)
       		intTemp +=  cId.substring(i, i + 1)  * intQuan[i];
       intTemp %= 11;
       cId+=strJiaoYan[parseInt(intTemp,10)];
       return cId;
   }
   else
   {
		 return c15;
	 }
}