/**
	查找名为n的控件
*/
function MM_findObj(n, d) { //v1.00
  var p,i,x;
  var i=0;
  if(!d) d=document;
  x = null;
  for(i=0;i<d.all.length;i++)
  {
  	if(d.all[i] && d.all[i].name == n)	{
		x = d.all[i];
		break;
	}
  }
  return x;
}

/**
验证日期格式是否为yyyymmdd
*/
function isDate(msg,val,vType){
	var errors='';
	var yy,mm,dd;
	var leap = false;
	if (isNaN(val)) errors+='- '+msg+' 必须是数字！\n';
	else if(val.length != 8) errors+='- '+msg+'只能是8位数字(yyyymmdd)';
	else if(val.charAt(0) == ' ') errors+='- '+msg+' 数字前面不能有空格！\n';
	else {

		yy = val.substring(0,4);
		mm = val.substring(4,6);
		dd = val.substring(6,8);

		if(yy > 2099 || yy < 1900) errors+='- '+msg+' 年不合法[1900-2099]！\n';
		if(mm > 12 || mm < 0) errors+='- '+msg+' 月不合法[00-12]！\n';
		if(dd > 31 || dd < 0) errors+='- '+msg+' 日不合法[00-31]！\n';
		if(mm =='02' && dd > 29) errors+='- '+msg+' 2月最多只有29天！\n';
		else{
			if(yy % 4!=0) leap = false;
			else if(yy % 100 != 0) leap = true;
			else if(yy % 400 != 0) leap = false;
			else{
				leap = true;
			}
			if(leap && mm == 02 && dd > 29)	errors+='- '+msg+' '+yy+'是闰年，2月只有29天！\n';
			else if(!leap && mm == 02 && dd > 28)	errors+='- '+msg+' '+yy+'是平年，2月只有28天！\n';
			else if(mm >= 08){
				if(mm%2==1 && dd > 30){
					errors+='- '+msg+' '+mm+' 只有30天！\n';
				}
			}
			else if(mm < 08){
				if(mm%2==0 && dd > 30){
					errors+='- '+msg+' '+mm+' 只有30天！\n';
				}
			}
		}
	}
	return errors;
}

/**

对字符串长度进行验证

*/

function isVCharRange(nm,val,vType){

	var errors='';
	p=vType.indexOf(':');
	mins=vType.substring(13,p);
	maxs=vType.substring(p+1);
	if(isNaN(mins) || isNaN(maxs))  alert("限定数字位数范围错误");
	if (getByteLenExt(val)<mins || getByteLenExt(val)>maxs){
		if(mins == maxs)
			errors+='- '+nm+' 输入位数必须是 '+mins+ ' 位.\n';
		else
			errors+='- '+nm+' 输入位数必须在 '+mins+' 与 '+maxs+' 之间.\n';
	}
	return errors;
}
/**

对字符串长度及其中的特殊字符进行验证

*/
function isCharRange(nm,val,vType){
	var errors='';
	var specstr = "~!@%^&*();'\"><[]{}\\|:/=+—“”‘";
	p=vType.indexOf(':');
	mins=vType.substring(12,p);
	maxs=vType.substring(p+1);
	if(isNaN(mins) || isNaN(maxs))  alert("限定数字位数范围错误");
	if (getByteLenExt(val)<mins || getByteLenExt(val)>maxs){
		if(mins == maxs)
			errors+='- '+nm+' 输入位数必须是 '+mins+ ' 位.\n';
		else
			errors+='- '+nm+' 输入位数必须在 '+mins+' 与 '+maxs+' 之间.\n';
	}

	for(i=0;i<val.length;i++){
		if (specstr.indexOf(val.charAt(i)) !=-1){
			errors+='- '+nm+'不能以含有非法字符('+val.charAt(i)+')！';
			break;
		}
	}
	return errors;
}
/**

验证是否是一个不大于1的小数

*/

function isRatio(nm,val,vType){
	var errors='';
       var specstr = '-';
	if(val.charAt(0) == ' ') errors+='- '+nm+' 数字前面不能有空格！\n';
	else if(val.charAt(val.length-1) == ' ') errors+='- '+nm+' 数字后面不能有空格！\n';
	else if (isNaN(val)) errors+='- '+nm+' 必须是数字！\n';
	else{
		p=vType.indexOf(':');

		maxs=vType.substring(8,p); 			//maxs 取得最大数据位数
		mins=vType.substring(p+1);			//mins 取得小数位数
		p=val.indexOf('.');
		if(p<0)	{
			var nInt = val.substring(0);
			var nDec = 0;
		}
		else{
			var nInt = val.substring(0,p);
			var nDec = val.substring(p+1);
		}
		if(isNaN(mins) || isNaN(maxs) || (maxs-mins)<0)  errors += '- '+ '限定数字位数范围错误.\n';
		else if (nInt.length > (maxs-mins) || nDec.length > mins){
			if(nInt.length > (maxs-mins))
				errors+='- '+nm+' 格式错误，整数部分不能超过 '+ (maxs-mins) + ' 位.\n';
			else
				errors+='- '+nm+' 格式错误，小数位数不能超过 '+ mins +' 位.\n';
		}
        else if(val >= 10){
        	errors+='- '+nm+' 格式错误，数值不能大于10.\n';
    	}
	if (specstr.indexOf(val.charAt(i)) !=-1){
		errors+='- '+nm+'不能以含有非法字符('+val.charAt(i)+')！';
	}
	}
	return errors;
}

/**

验证是否是指定的Decimal格式

*/

function isDecimalPlus(nm,val,vType){

	var errors='';
	if(val.charAt(0) == ' ') errors+='- '+nm+' 数字前面不能有空格！\n';
	else if(val.charAt(val.length-1) == ' ') errors+='- '+nm+' 数字后面不能有空格！\n';
	else if (isNaN(val))errors+='- '+nm+' 必须是数字！\n';
	else{
		p=vType.indexOf(':');

		maxs=vType.substring(14,p); 			//maxs 取得最大数据位数
		mins=vType.substring(p+1);			//mins 取得小数位数
		p=val.indexOf('.');
		if(p<0)	{
			var nInt = val.substring(0);
			var nDec = 0;
		}
		else{
			var nInt = val.substring(0,p);
			var nDec = val.substring(p+1);
		}
		if(isNaN(mins) || isNaN(maxs) || (maxs-mins)<0)  errors += '- '+ '限定数字位数范围错误.\n';
		else if (nInt.length > (maxs-mins) || nDec.length > mins){
			if(nInt.length > (maxs-mins))
				errors+='- '+nm+' 格式错误，整数部分不能超过 '+ (maxs-mins) + ' 位.\n';
			else
				errors+='- '+nm+' 格式错误，小数位数不能超过 '+ mins +' 位.\n';
		}
	}
	return errors;
}
/**

验证是否是指定的Decimal格式，且为正

*/
function isMoney(nm,val,vType){

	var errors='';

	if(val.charAt(0) == ' ') errors+='- '+nm+' 数字前面不能有空格！\n';
	if(val.charAt(0) == '-') errors+='- '+nm+' 数字前面不能有负号！\n';
	else if(val.charAt(val.length-1) == ' ') errors+='- '+nm+' 数字后面不能有空格！\n';
	else if (isNaN(val)) errors+='- '+nm+' 必须是数字！\n';
	else{
		p=vType.indexOf(':');

		maxs=vType.substring(8,p); 			//maxs 取得最大数据位数
		mins=vType.substring(p+1);			//mins 取得小数位数
		p=val.indexOf('.');
		if(p<0)	{
			var nInt = val.substring(0);
			var nDec = 0;
		}
		else{
			var nInt = val.substring(0,p);
			var nDec = val.substring(p+1);
		}
		if(isNaN(mins) || isNaN(maxs) || (maxs-mins)<0)  errors += '- '+ '限定数字位数范围错误.\n';
		else if (nInt.length > (maxs-mins) || nDec.length > mins){
			if(nInt.length > (maxs-mins))
				errors+='- '+nm+' 格式错误，整数部分不能超过 '+ (maxs-mins) + ' 位.\n';
			else
				errors+='- '+nm+' 格式错误，小数位数不能超过 '+ mins +' 位.\n';
		}
		else if(val < 0)
		{
			errors+='- '+nm+'格式错误，数值不能小于零';
		}
	}
	return errors;
}

/**
	判断是否是一个合法的Email地址
	xx@XX.com
*/

function isEmail(nm,val,vType){

	var errors='';
	p = val.indexOf('@');
	k = val.indexOf('.');
	if (p<1 || p==(val.length-1)) errors+='- '+nm+' 请填写一个有效的E-mail地址！\n';
	else if(k < 3 || k==(val.length-1) || k-1<=p) errors+='- '+nm+' 请填写一个有效的E-mail地址！\n';
	return errors;
}
/**

对字符串长度进行验证

*/
function inRange(nm,val,vType){

	var errors='';

	p=vType.indexOf(':');
	mins=vType.substring(8,p);
	maxs=vType.substring(p+1);
	if(isNaN(mins) || isNaN(maxs))  alert("限定数字位数范围错误");
	if (getByteLenExt(val)<mins || getByteLenExt(val)>maxs){
		if(mins == maxs)
			errors+='- '+nm+' 输入位数必须是 '+mins+ ' 位.\n';
		else
			errors+='- '+nm+' 输入位数必须在 '+mins+' 与 '+maxs+' 之间.\n';
	}
	return errors;
}
/**

验证是否是一个正整数

*/
function isNumber(nm,val,vType){

	var errors='';
	if(val.charAt(0) == ' ') errors+='- '+nm+' 数字前面不能有空格！\n';
	else if(val.charAt(0) == '+') errors+='- '+nm+' 数字前面不能有"+"！\n';
	else if(val.charAt(0) == '-') errors+='- '+nm+' 数字前面不能有"-"！\n';
	else if(val.charAt(val.length-1) == ' ') errors+='- '+nm+' 数字后面不能有空格！\n';
	else if (isNaN(val)) errors+='- '+nm+' 必须是数字！\n';
	else if(val.indexOf('.') != -1) errors+='- '+nm+' 不能含有小数点！\n';
	else{
		p=vType.indexOf(':');
		mins=vType.substring(9,p);
		maxs=vType.substring(p+1);
		if(isNaN(mins) || isNaN(maxs))  alert("限定数字位数范围错误");
		if (val.length<mins || val.length>maxs) {
			if(mins == maxs)
				errors+='- '+nm+' 数字位数必须是 '+mins+ ' 位.\n';
			else
				errors+='- '+nm+' 数字位数必须在 '+mins+' 与 '+maxs+' 之间.\n';
		}
	}
	return errors;
}
/**
	去掉字符串中的逗号
*/
function toOrderFormat(val,ch){
	var str="";
	for(i=0;i<val.length;i++){
		if(val.charAt(i)!=ch){
			str = str + val.charAt(i);
		}
	}
	return str;
}

/**
	格式化字符串，对数字以每3位用逗号隔开
*/

function formatNumber(val){
	val = new String(val);
	p = val.indexOf('.');
	n = 0;
	if(p<0)	{
		nInt = val;
		nDec = '.00';
	}
	else{
		nInt = val.substring(0,p);
		nDec = val.substring(p);
	}
	var newInt = "";

	if(nInt.charAt(0) =='-'){
		n = (nInt.length -1)%3;
		if(n==0) n=4;
		else
			n ++;
	}
	else{
		n = nInt.length%3;
	}

	if(n!=0){
		newInt = nInt.substr(0,n)+',';
	}
	for(i=n;i<nInt.length;i=i+3){
		newInt = newInt+nInt.substring(i,i+3)+',';
	}
	newInt=newInt.substring(0,newInt.length-1);
	newInt = newInt+ nDec;
	return newInt;
}


/**
	格式化字符串，对数字以每3位用逗号隔开
*/

function formatDate(val){
	yy = val.substring(0,4);
	mm = val.substring(4,6);
	dd = val.substring(6,8);
	val = yy+'-'+mm+'-'+dd;
	return val;
}

/**
  获取字符串的字节长度,汉字简单的算为两个字符
*/
function getByteLen(str)
{
	var n=0;
	for(i=0;i<str.length;i++){
		if(str.charCodeAt(i)<0 || str.charCodeAt(i)>255){
			n += 2;
		}
		else{
			n++;
		}
	}
	return n;

}
/**
  获取字符串的字节长度
*/
function getByteLenExt(str)
{
	var n=0;
	var bChar = 0;
	for(i=0;i<str.length;i++){
		if(str.charCodeAt(i)<0 || str.charCodeAt(i)>255){
			if(bChar == 1){
				n += 2;
			}
			else{
				n +=3;
			}
			bChar = 1;
		}
		else{
			if(bChar == 1){
				n += 2;
			}
			else{
				n +=1;
			}
			bChar = 0;
		}
	}
	if(bChar == 1) n ++;
	return n;

}
/**
	校验文本框内的值是否合法
	格式：MM_validateForm(文本框名,'',类型,文本框名,'',类型,...)
        类型有：
        inNumber：验证是否是正整数
        inRange： 验证字符串长度是否在某个范围之内
        inCharRange： 验证字符串中是否有非法字符"~!@%^&*();'\"><[]{}\\|:/=+—“”‘"
        inVCharRange： 验证字符串长度是否在某个范围之内
        isDecimalPlus：验证浮点数的整数部分与小数部分是否满足要求
        isMoney： 验证浮点数是否大于等于零且整数部分与小数部分是否满足要求
        isEmail： 验证Email格式是否正确
        isRatio:  验证是不是一个不大于1的小数
*/
function MM_validateForm() { //v1.00
  var errors='';
  var args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) {
		var vType=args[i+2];
	   	var val=MM_findObj(args[i],0);
		if (val) {
		    //nm=val.name;
			var nm = args[i+1];
			var obj=val;
			if((val=val.value)!=""){
				if (vType.indexOf('inNumber') != -1){
			 		errors = isNumber(nm,val,vType);
				}

				else if(vType.indexOf('inRange')!=-1) {
					errors = inRange(nm,val,vType);
				}

				else if(vType.indexOf('isMoney')!=-1){
					val = toOrderFormat(val,',');
					errors = isMoney(nm,val,vType);
					if(errors == ''){
						obj.value = formatNumber(val);
					}
				}

				else if(vType.indexOf('isDecimalPlus')!=-1){
					val = toOrderFormat(val,',');
					errors = isDecimalPlus(nm,val,vType);
					if(errors == ''){
						obj.value = formatNumber(val);
					}
				}

			   	else if(vType.indexOf('isEmail')!=-1){
			   		errors = isEmail(nm,val,vType);
			   	}

		        else if(vType.indexOf('isRatio')!=-1){
			   		errors = isRatio(nm,val,vType);
			   	}

			   	else if(vType.indexOf('inCharRange')!=-1) {
					errors = isCharRange(nm,val,vType);
				}

				else if(vType.indexOf('inVCharRange')!=-1) {
					errors = isVCharRange(nm,val,vType);
				}

				else if(vType.indexOf('isDate')!=-1){
					val = toOrderFormat(val,'-');
					errors = isDate(nm,val,vType);
					if(errors == ''){
						obj.value = formatDate(val);
					}
				}
		        if(errors)  break;

			} // end if((val=val.value)!="")
			else if (vType.charAt(0) == 'R'){
				 errors += '- '+nm+'带红色 * 星号的项为必填项！\n';
				 break;
			}
		}  // if (val)
	}  //end for
	if (errors) alert('填写有误:\n\n'+errors);
	document.MM_returnValue = (errors == '');
}

/**
	计算多个文本框的值
	格式：MM_CountValue(操作符,文本框名,操作符,文本框名,...)
*/
function MM_CountValue()
{
	var args = MM_CountValue.arguments;
	var entitys = null;
	var opt = null;
	var sum = Number(0.00);

	for (var i=0; i<(args.length-1); i+=2) {
		opt = args[i];					//获取操作符
		var val=MM_findObj(args[i+1],0);
		if(val){
			val = val.value;			//获取文本框的值
			val = toOrderFormat(val,',');
			switch(opt){
				case '+':
					sum = sum + Number(val);
					sum = trimTheDec(sum,2);
					break;
				case '-':
					sum = sum - Number(val);
					sum = trimTheDec(sum,2);
					break;
			}
		} //end if(val)
	}
	sum = formatNumber(sum);
	return sum;
}

/**

四舍五入取n位小数
*/

function trimTheDec(sum,n){

	n = Number(n);
	switch(n){
		case 2:
			sum = Math.round(sum*100)/100;
			break;
		case 3:
			sum = Math.round(sum*1000)/1000;
			break;
		case 4:
			sum = Math.round(sum*10000)/10000;
			break;
		case 5:
			sum = Math.round(sum*100000)/100000;
			break;
	}
/*
	var s1 = new String(sum);
	var p = s1.indexOf('.');
	if(p>=0){
		var nInt = s1.substring(0,p);
		var nDec = s1.substring(p);
		if(nDec.length > 3){
			var k = nDec.substring(0,3);
          	k = Number(k);
			var n = nDec.substring(3,4);
			if(n >= 5) k += Number(0.01);
				sum = Number(nInt) + k;
		}
	}
*/
	return sum;
}
