/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数补充Javascript库函数
------------------------------------------------------------------------------------------------------------
*/
// 取得字符串的实际字节长度
String.prototype.trueLength = function() {
  return this.replace(/[^\x00-\xff]/g, "**").length;
}

// 截去行首的空格等字符
String.prototype.ltrim = function() {
  return this.replace(/(^\s*)/g, "");
}

// 截去行尾的空格等字符
String.prototype.rtrim = function() {
  return this.replace(/(\s*$)/g, "");
}

// 截去行首与行尾的空格等字符
String.prototype.trim = function() {
  return this.replace(/(^\s*)|(\s*$)/g, "");
}

function formtrim(frm){
  for (var i=0; i<frm.elements.length; i++){
    var e = frm.elements[i];
    if(e.type == "text")
      e.value = e.value.trim();
    else if(e.type == "textarea")
      e.value = e.value.rtrim();
  }
}

// 判断字符串是否以另一字符串开始
String.prototype.startsWith = function(s) {
  var i = this.indexOf(s);
  return i == 0;
}

Number.prototype.toFixedHead = function(fractionDigits) {
  var s = this.toString();
  while (s.length < fractionDigits)
    s = "0" + s;
    
  return s;
}

/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数用于Cookie操作
------------------------------------------------------------------------------------------------------------
*/

function setCookie(name,value) {
   var today = new Date();
   var expires = new Date();
   expires.setTime(today.getTime() + 1000*60*60*24*365);
   document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString();
}

function getCookie(Name) {
   var search = Name + "=";
   if(document.cookie.length > 0) {
      offset = document.cookie.indexOf(search);
      if(offset != -1) {
         offset += search.length;
         end = document.cookie.indexOf(";", offset);
         if(end == -1) end = document.cookie.length;
         return unescape(document.cookie.substring(offset, end));
      }
      else return('');
   }
   else return('');
}

/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数用于界面操作
------------------------------------------------------------------------------------------------------------
*/
function showobj(obj)
{
  obj.style.visibility="visible";
  obj.style.position="relative";
}

function hideobj(obj)
{
  obj.style.visibility="hidden";
  obj.style.position="absolute";
}

function checkAll(name, checked) {
  var i;
  var arr = document.getElementsByName(name);
  for (i = 0; i < arr.length; i++) {
    arr[i].checked = checked;
  }
}

function selectAll() {
  checkAll("select", true);
}

// 此函数用于选定有指定值的单选按钮
function selectButton(name, value) {
  var arr = document.getElementsByName(name);
  for (i = 0; i < arr.length; i++) {
    arr[i].checked = arr[i].value == value;
  }
}

// 此函数用于选定有多个值的核选按钮
function selectButtons(name, commaValues) {
  var listArray = commaValues.split(",");
  var arr = document.getElementsByName(name);
  for (var i = 0; i < arr.length; i++)
    arr[i].checked = false;
  for (var i = 0; i < arr.length; i++)
    for (var j = 0; j < listArray.length; j++){
      if (arr[i].value == listArray[j])
        arr[i].checked = true;
    }
}

// 此函数用于统计已选定的核选按钮
function statSelectedButton(name) {
  var c = 0;
  var arr = document.getElementsByName(name);
  if (arr != null)
    for (i = 0; i < arr.length; i++) {
      if (arr[i].checked)
        c++;
    }
  return c;
}

// 此函数用于以数组的形式返回已选定的核选按钮的多个值
// 没有选中的按钮则返回空数组
function getButtonValues(name) {
  var res_arr = [];
  var arr = document.getElementsByName(name);
  if (arr != null)
    for (var i = 0; i < arr.length; i++) {
      if (arr[i].checked)
        res_arr[res_arr.length] = arr[i].value;
    }
  return res_arr;
}

// 此函数用于多值选择表单中选中给定的多个值
function setSelectValues(selobj, commaValues) {
  var listArray = commaValues.split(",");
  for (var i = 0; i < selobj.options.length; i++)
    for (var j = 0; j < listArray.length; j++)
      if (selobj.options[i].value == listArray[j])
        selobj.options[i].selected = true;
}

/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数用于日期计算
------------------------------------------------------------------------------------------------------------
*/

// 函数名：DateToStr
// 功能介绍：日期格式的日期转换成字符串（年-月-日格式）
// 参数说明：dDate - 日期格式的日期
function DateToStr(dDate) {
  return dDate.getFullYear() + "-" + (dDate.getMonth() + 1) + "-" + dDate.getDate();
}

function DateToFullStr(dDate) {
  return dDate.getFullYear().toFixedHead(4) + "-" + (dDate.getMonth() + 1).toFixedHead(2) + "-" + dDate.getDate().toFixedHead(2);
}

function DateTimeToStr(dDate) {
  return dDate.getFullYear() + "-" + (dDate.getMonth() + 1) + "-" + dDate.getDate() + " " + 
    dDate.getHours() + ":" + dDate.getMinutes() + ":" + dDate.getSeconds();
}

// 函数名：StrToDate
// 功能介绍：字符串（年-月-日）格式的日期转换成日期格式
// 参数说明：sDate - 字符串格式的日期
function StrToDate(sDate) {
  aDate = sDate.split("-");
  return new Date(aDate[1] + '/' + aDate[2] + '/' + aDate[0]); //转换为月-日-年格式  
}

// 函数名：StrToDateTime
// 功能介绍：字符串（年-月-日）格式的日期转换成日期格式
// 参数说明：sDate - 字符串格式的日期
function StrToDateTime(sDateTime) {
  aDate = sDate.split(" ");
  bDate = aDate[0];
  cDate = bDate.split("-");
  return new Date(cDate[1] + '/' + cDate[2] + '/' + cDate[0] + ' ' + aDate[1]); //转换为月-日-年格式  
}

// 函数名：Today
// 功能介绍：取得今天的日期，格式为字符串（年-月-日）
function Today() {
  return DateToStr(new Date());
}  

// 函数名：FirstDayOfMonth
// 功能介绍：取得日期所属月份第一天的日期，结果为日期型
function FirstDayOfMonth(dDate) {
  var y = dDate.getFullYear();
  var m = dDate.getMonth() + 1;
  return new Date(m + "/01/" + y);
}  
// 函数名：FirstDayOfLastMonth
// 功能介绍：取得日期上一个月份第一天的日期，结果为日期型
function FirstDayOfLastMonth(dDate) {
  var y = dDate.getFullYear();
  var m = dDate.getMonth();
  return new Date(m + "/01/" + y);
}  

// 函数名：DateDiff
// 功能介绍：计算天数差的函数
// 参数说明：sDate1 - 字符串格式的日期1，年-月-日格式
//           sDate2 - 字符串格式的日期2，年-月-日格式
function DateDiff(sDate1, sDate2){
  
  var oDate1, oDate2, iDays;
  oDate1 = StrToDate(sDate1);
  oDate2 = StrToDate(sDate2);
  
  iDays = parseInt((oDate1 - oDate2) / (1000 * 60 * 60 * 24)); //把相差的毫秒数转换为天数  
  
  return iDays;
  
} 

//函数名：ChkDate  
//功能介绍：检查是否为日期  
//参数说明：sDate - 要检查的字符串，年-月-日格式  
function ChkDate(sDate) {
  
  var oDate = StrToDate(sDate)
  
  return (oDate != "NaN");
  
}

// 函数名：DateAdd
// 功能介绍：日期加若干天（可以为负）
// 参数说明：sDate - 字符串格式的日期，年-月-日格式
//           iDays - 整数形式的日期数
function DateAdd(sDate, iDays) {
  
  var oDate = StrToDate(sDate)
  var ms = oDate.valueOf();
  oDate = new Date(ms + iDays * 1000 * 60 * 60 * 24);
  
  return DateToStr(oDate); 
  
}

// 函数名：ChkHour
// 功能介绍：检查含小时的日期格式是否正确
// 参数说明：sHour - 要检查的字符串，年-月-日 时格式  
function ChkHour(sHour) {
  var a = sHour.split(" ");
  return a.length = 2 && ChkDate(a[0]) && a[1] >= 0 && a[1] <= 23;
}

// 函数名：ChkDateTime
// 功能介绍：检查可能含时、分、秒的日期格式是否正确
// 参数说明：sDateTime - 要检查的字符串，年-月-日 时:分:秒格式  
function ChkDateTime(sDateTime) {
  var a = sDateTime.split(" ");
  if (a.length > 2)
    return false;
    
  var r = ChkDate(a[0]);
  if (!r)
    return false;
    
  if (a.length = 2) {
    var b = a[1].split(":");
    if (b.length > 3)
      return false;
      
    if (b.length >= 1) {
      for (var c = 0; c < b.length; c++)
        if (isNaN(Number(b[c])))
	  return false;

      var d = parseInt(b[0]);
      if (d < 0 || d > 23)
        return false;
    }
      
    if (b.length >= 2) {
      var d = parseInt(b[1]);
      if (d < 0 || d > 59)
        return false;
    }

    if (b.length >= 3) {
      var d = parseInt(b[2]);
      if (d < 0 || d > 59)
        return false;
    }
  }
  return true;
}

function HourToStr(dHour) {
  var y = dHour.getFullYear();
  var m = dHour.getMonth() + 1;
  var d = dHour.getDate();
  var h = dHour.getHours();
  
  return y.toFixedHead(4) + "-" + m.toFixedHead(2) + "-" + d.toFixedHead(2) + " " + h.toFixedHead(2);
}

function CheckAge(field, fieldname, errmsg, curdates, min_age, max_age) {
  var birdate = StrToDate(field.value);
  var curdate = StrToDate(curdates);

  if(birdate == "NaN" ){
    if (errmsg == "") field.focus();
    errmsg += fieldname + "：不是有效的日期格式；\n";
  }
  else{
    var age;
    field.value = DateToFullStr(birdate);
    if( curdate.getMonth() > birdate.getMonth() || curdate.getMonth() == birdate.getMonth() && curdate.getDate() >= birdate.getDate() ){
      age = curdate.getFullYear() - birdate.getFullYear();
    }
    else{
      age = curdate.getFullYear() - birdate.getFullYear() - 1;
    }
    if(age < min_age || age > max_age ){
      if (errmsg == "") field.focus();
      errmsg += fieldname + "：年龄必须在 " + min_age + " - " + max_age + " 之间；\n";
    }
  }
  return errmsg;
}
/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数用于网页上检查输入内容
------------------------------------------------------------------------------------------------------------
*/
// 检查单选按钮是否选取
function CheckRadio(obj, objname, errmsg) {
  for (i = 0; i < obj.length; i++) {
    if(obj[i].checked) return errmsg;
  }
  if (errmsg == "") obj[0].focus();
  errmsg += objname + "：请选择其中一项；\n";
  return errmsg;
}

//检查复选框选取个数
function CheckRadios(field, title, msg, min, max){
	var sel = 0;
	for (var i=0; i<field.length; i++) {
		if(field[i].checked) sel++;
	}
	if (sel < min) {
		if (msg == "") field[0].focus();
		msg += title + "：选择了" + sel + "项，至少选择" + min + "项；\n";
	}
	else
	if (sel > max) {
		if (msg == "") field[0].focus();
		msg += title + "：选择了" + sel + "项，最多选择" + max + "项；\n";
	}
	return msg;
}

// 检查是否为空
function CheckNull(obj, objname, errmsg) {
	if (obj.value.trim() == ""){
		if (errmsg == "")
		try{
			obj.focus();
		}
		catch(e){
		}
		errmsg += objname + "：未输入；\n";
	}
	return errmsg;
}

// 检查是否相等
function CheckEqual(obj, obj2, obj2name, errmsg) {
  if (obj.value != obj2.value) {
    if (errmsg == "") 
      obj2.focus();
    errmsg += obj2name + "：不相等；\n";
  }
  return errmsg;
}

// 检查日期是否合法
function CheckDay(obj, objname, errmsg) {
  var objv = obj.value.trim();
  if (objv != "") {
    if (!ChkDate(obj.value)) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：请按“年-月-日”的格式输入；\n";
    }
    else {
      obj.value = DateToFullStr(StrToDate(obj.value)); // 把不规整的日期规整，例如2005-9-31变成2005-10-1
    }
  }
  return errmsg;
}

// 检查日期是否合法
function CheckDayTime(obj, objname, errmsg) {
  var objv = obj.value.trim();
  if (objv != "") {
    if (!ChkDateTime(obj.value)) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：请按“年-月-日 时:分:秒”的格式输入；\n";
    }
    else {
      obj.value = DateTimeToStr(StrToDateTime(obj.value)); // 把不规整的日期规整，例如2005-9-31变成2005-10-1
    }
  }
  return errmsg;
}

// 检查整数或浮点类型是否有效，且是否在指定范围内
function CheckNumRange(obj, objname, errmsg, min_value, max_value) {
  var objv = obj.value.trim();
  if (objv != "") {
    var n = Number(objv);
    var s = String(n);
    if (s == "NaN") {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：不是有效的数字格式；\n";
    }
    else 
    if (n < min_value) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：最小值为" + min_value + "；\n";
    }
    else
    if (n > max_value) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：最大值为" + max_value + "；\n";
    }
  }
  return errmsg;
}


// 检查地区到小类
function CheckDetailRegion(obj, objname, errmsg) {
  var objv = obj.value.trim();
  if (objv != "") {
    if (objv == "010000" || (objv > "51" && objv < "61" && objv.endsWith("0000"))){
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：请输入到具体的城市；\n";
    }
    else if (objv == "010100" || objv == "010500"){
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：请输入到具体的区县；\n";
    }
  }
  return errmsg;
}


// 检查字符串是否符合正则表达式
function CheckExpression(obj, objname, errmsg, expression, err) {
  var objv = obj.value.trim();
  if (objv != "") {
    var flag = expression.test(objv);
    if(!flag) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：" + err + "；\n";
    }
  }
  return errmsg;
}

// 检查字符串是否符合正则表达式（禁止！）
function CheckAntiExpression(obj, objname, errmsg, expression, err) {
  var objv = obj.value.trim();
  if (objv != "") {
    var flag = expression.test(objv);
    if(flag) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：" + err + "；\n";
    }
  }
  return errmsg;
}

// 检查身份证件号码
function CheckId(obj, objname, errmsg) {
  var expression = /^[a-zA-Z0-9]{5,18}$/;
  return CheckExpression(obj, objname, errmsg, expression, "要求为5-18个数字或字母");
}

// 检查邮政编码
function CheckZip(obj, objname, errmsg) {
  var expression = /^[0-9]{6}$/;
  return CheckExpression(obj, objname, errmsg, expression, "要求为6个数字");
}

// 检查电子邮件
function CheckEmail(obj, objname, errmsg) {
  var expression = /^\w+([-+.]+\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
  return CheckExpression(obj, objname, errmsg, expression, "格式不正确");
}

// 检查网址，未成功
function CheckURL(obj, objname, errmsg) {
  var expression = /^(http:\/\/)*(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/;
  // 所有协议为 /^([a-zA-z]+:\/\/)*(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/
  return CheckExpression(obj, objname, errmsg, expression, "格式不正确");
}

// 检查字符串长度
function CheckSLen(obj, objname, errmsg, min_len, max_len) {
  var objv = obj.value;
  if (objv != "") {
    var l = objv.trueLength();
    if (l < min_len) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：目前输入了" + l + "个字符，最少应有" + min_len + "个字符；\n";
    }
    else
    if (l > max_len) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：目前输入了" + l + "个字符，最多不应超过" + max_len + "个字符；\n";
    }
  }
  return errmsg;
}

// 检查Unicode字符串长度
function CheckUSLen(obj, objname, errmsg, min_len, max_len) {
  var objv = obj.value;
  if (objv != "") {
    var l = objv.length;
    if (l < min_len) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：目前输入了" + l + "个字符，最少应有" + min_len + "个字符；\n";
    }
    else
    if (l > max_len) {
      if (errmsg == "") 
	obj.focus();
      errmsg += objname + "：目前输入了" + l + "个字符，最多不应超过" + max_len + "个字符；\n";
    }
  }
  return errmsg;
}

// 检查电话号码是否正确
function CheckTel(obj, objname, errmsg) {
  var expression =  /^[\d\-]{7,}$/;
  return CheckExpression(obj, objname, errmsg, expression, "格式不正确");
}

// 检查是否存在电话号码（禁止）
function CheckAntiTel(obj, objname, errmsg) {
  var expression = /([0-9\ \_\-－０１２３４５６７８９]){8,}/;
  return CheckAntiExpression(obj, objname, errmsg, expression, "内容中含有电话号码");
}

/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数用于界面上修整数据
------------------------------------------------------------------------------------------------------------
*/
// 将FORM中所有输入框的首尾空格去掉
function trimfrm(frm){
  for (var i=0; i<frm.elements.length; i++){
    var e = frm.elements[i];
    if(e.type=="text")
      e.value = e.value.trim();
    else if(e.type=="textarea")
      // 大文本只修整右边空格
      e.value = e.value.rtrim();
  }
}

/*
------------------------------------------------------------------------------------------------------------
　　以下一组函数用于通用的数据处理
------------------------------------------------------------------------------------------------------------
*/
// 将源数组中的元素用字典数组中的数据对来替换(翻译), 结果数组中不剔除重复元素
// 例: transValues([1,2,3], [[1, a], [2, b], [3, c]]) 返回[a, b, c]
function transValues(source_arr, dict_arr) {
  var res_arr = [];
  if (source_arr != null && dict_arr != null) {
    for (var i = 0; i < source_arr.length; i++)
      for (var j = 0; j < dict_arr.length; j++)
        if (source_arr[i] == dict_arr[j][0]) {
	  res_arr[res_arr.length] = dict_arr[j][1];
	  break;
	}
  }
  
  return res_arr;
}

//此函数用于初始表单Radio元素
function initRadio   (frm, name, value) {
  for (var i=0; i<frm.elements.length; i++){
    var e = frm.elements[i];
    if(e.type == "radio" && e.name == name && e.value == value) e.checked = true;
  }
}

//此函数用于初始表单CheckBox元素
function initCheckBox(frm, name, value) {
  var arr = value.split(",");
  for (var i=0; i<frm.elements.length; i++){
    var e = frm.elements[i];
    if(e.type == "checkbox" && e.name == name){
      e.checked = false;
      for(var j=0; j<arr.length; j++){
        if(e.value == arr[j]) e.checked = true;
        break;
      }
    }
  }
}

//检查是否英文字符串
function isEnglish(str){
  var pat = /[\u4E00-\u9FA5]/;
  return str == null ? false : !pat.test(str);
}
