/**
* ===============================
* input.js
* @author zengyusheng
* @lastupdate 2007-7-19
* @version 1.1
* ===============================
*/	

/**
* 只能输入integer
* @param the : this
* @param v : 当obj有效时，the.value == v(目标值) 则 obj.disabled=true;
* @param obj 
*/
function input_integer(the, v, obj) {
	the.value = the.value.replace(/[^\d]/g, "");
	if (obj) {
		if (the.value == v) {
			obj.disabled = true;
		} else {
			obj.disabled = "";
		}
	}
}
/**
* 只能输入变量定义名
* @param the : this
* @param v : 当obj有效时，the.value == v(目标值) 则 obj.disabled=true;
* @param obj 
*/
function input_varName(the, v, obj) {
	the.value = the.value.replace(/[^\w]/g, "");
	if (obj) {
		if (the.value == v) {
			obj.disabled = true;
		} else {
			obj.disabled = "";
		}
	}
}
/**
* 只能输入中文
* @param the : this
* @param v : 当obj有效时，the.value == v(目标值) 则 obj.disabled=true;
* @param obj 
*/
function input_chinese(the, v, obj) {
	the.value = the.value.replace(/[^\u4E00-\u9FA5]/g, "");
	if (obj) {
		if (the.value == v) {
			obj.disabled = true;
		} else {
			obj.disabled = "";
		}
	}
}
/**
* 只能输入ascii
* @param the : this
* @param v : 当obj有效时，the.value == v(目标值) 则 obj.disabled=true;
* @param obj 
*/
function input_ascii(the, v, obj) {
	the.value = the.value.replace(/[\W]/g, "");
	if (obj) {
		if (the.value == v) {
			obj.disabled = true;
		} else {
			obj.disabled = "";
		}
	}
}

/**
* 验证信息提示
* @param flag 类型：1提示
* @param the 验证对象
* @param errmsg 错误信息
*/
function vvSpan(flag, the, errmsg){
	var id = the.id+'_ERRMSG_PANEL';
	var span = null;
	span = document.getElementById(id) 
	if (span == null){
		span = document.createElement("SPAN");
		span.id = id;
		span.style.color = "red";
		the.parentNode.appendChild(span);
	}
	if (flag == 1){
		span.innerHTML = errmsg;//.replace(/\d+:/,"* ");
	}
	else {
		span.innerHTML = "";
	}
}

/**
* 验证form表单
* @param the 表单对象
* @return boolean 
*/
function vFormCommit(the){
	return vvv(the,1);
}

/**
* 验证输入，调用vv(the)
* @param the 字段对象
* @return boolean  
*/
function vInput(the){
	return vv(the);
}

/**
* 验证form表单
* @param the 表单对象
* @param mode 类型
* @return boolean  true:正确, false:错误
*/
function vvv(the, mode){
	var frm = the;
	var flag = true;
	var eleCount = frm.elements.length;
	for (var i=0; i<eleCount; i++){
		var ele = frm.elements[i];
		if (ele.getAttribute("required") == null)
			continue;
		//alert(vv(ele) + " " + ele.name);	
		if (!vv(ele)) 
			flag = false;
	}
	return flag;
}

/**
* 验证form 字段
* @param the 字段对象
* @return boolean  true:正确, false:错误
*/
function vv(the){
	the.id = the.id || the.name;
	var msg = the.getAttribute("msg");
	var required = the.getAttribute("required");
	var depends = the.getAttribute("depend");
	var isGroups = depends == null ? false: depends.indexOf("group") == 0;
	var depends = depends == null ? null : depends.split(",");
	var values = new Array();
	if (isGroups){
		values = the.value.split("\r\n");
	} else {
		values[0] = the.value;
	}
	
	for (var n=0; depends!=null && n<depends.length; n++) {
		var depend = depends[n];
		var expflag = false;
		for (var m=0; values!=null && m<values.length; m++) {
			var value = values[m];
			var errmsg = msg;
			var mask;
			switch(depend){
				case "integer" : 
					errmsg = errmsg || "不是数字!";
					mask = /^[-\+]?\d+$/; 
					expflag = mask.test(value);
					break;
				case "varName" : 
					errmsg = errmsg || "不是合法变量名!";
					mask = /^\w+$/; 
					expflag = mask.test(value);
					break;
				case "chinese" : 
					errmsg = errmsg || "不是中文!";
					mask = /^[\u0391-\uFFE5]+$/; 
					expflag = mask.test(value);
					break;
				case "email" : 
					errmsg = errmsg || "不是EMail!";
					mask = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; 
					expflag = mask.test(value);
					break;
				case "telephone" : 
					errmsg = errmsg || "不是电话号码!";
					mask = /^(\d{3,4}|\d{3,4}-)?\d{7,8}(-\d+)?$/; 
					expflag = mask.test(value);
					break;
				case "mobilephone" : 
					errmsg = errmsg || "不是手机号码!";
					mask = /^(1[3|5]\d{9})$/; 
					expflag = mask.test(value);
					break;
				case "ip" : 
					errmsg = errmsg || "不是IP!";
					mask = /^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/; 
					expflag = mask.test(value);
					break;
				case "date":
					errmsg = errmsg || "[年-月-日]";
					mask = /^(19\d{2}|20\d{2})-([0]?[1-9]|1[0-2])-([0]?[1-9]|[1-2]\d|[3][0-1])$/;
					expflag = mask.test(value);
					break;
				case "time":
					errmsg = errmsg || "[时:分:秒]";
					mask = /^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$/;
					expflag = mask.test(value);
					break;	
				case "datetime":
					errmsg = errmsg || "[年-月-日 时:分:秒]";
					mask = /^(19\d{2}|20\d{2})-([0]?[1-9]|1[0-2])-([0]?[1-9]|[1-2]\d|[3][0-1])( )([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$/;
					expflag = mask.test(value);
					break;	
				case "spassword" :
					errmsg = errmsg || "密码不够安全,必须是字母+数字,长度6~16位";
				//	mask = /^[a-zA-Z0-9_]{6,16}$/;
					mask = /^(?!\D+$)(?!\d+$)[a-zA-Z0-9_]{6,16}$/;
					expflag = mask.test(value);
					break;
				case "grouplimit":
					var max = the.getAttribute("max") || values.length;
					var min = the.getAttribute("min") || 0;
					errmsg = errmsg || "不能超出范围" + min + "~" + max;
					expflag = (max >= values.length && values.length >= min);
					break;
				case "limit":
					var max = the.getAttribute("max") || value.length;
					var min = the.getAttribute("min") || 0;
					errmsg = errmsg || "不能超出范围" + min + "~" + max;
					expflag = (max >= value.length && value.length >= min);
					break;
				case "repeat":
					var s = the.getAttribute("repeat");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "不一致";
					expflag = sv == value;
					break;
				case "startsWith":
					var s = the.getAttribute("startsWith");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "前辍以" + sv;
					expflag = value.indexOf(sv) == 0;
					break;
				case "endsWith":
					var s = the.getAttribute("endsWith");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "后辍以" + sv;
					var i = value.lastIndexOf(sv);
					var l = value.length;
					expflag = value.substring(i,l) == sv;
					break;
				case "contains":
					var s = the.getAttribute("contains");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "包含" + sv;
					expflag = value.indexOf(sv) >= 0;
					break;
				case "noRepeat":
					var s = the.getAttribute("noRepeat");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "不能一致";
					expflag = sv != value;
					break;
				case "noStartsWith":
					var s = the.getAttribute("noStartsWith");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "不能前辍以" + sv;
					expflag = value.indexOf(sv) == -1;
					break;
				case "noEndsWith":
					var s = the.getAttribute("noEndsWith");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "不能后辍以" + sv;
					var i = value.lastIndexOf(sv);
					var l = value.length;
					expflag = value.substring(i,l) != sv;
					break;
				case "noContains":
					var s = the.getAttribute("noContains");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "不能包含" + sv;
					expflag = value.indexOf(sv) == -1;
					break;
				case "suffix":
					var s = the.getAttribute("suffix");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "文件后辍名" + sv;
					var i = value.lastIndexOf(".");
					var l = value.length;
					var suf = value.substring(i+1,l);
					var svv = sv.split(",");
					for (var i=0; svv!=null && i<svv.length; i++){
						if (suf == svv[i]){
							expflag = true;
							break;
						}	
					}
					break;	
				case "checked":
					if ("CHECKBOX" != the.type.toUpperCase() && "RADIO" != the.type.toUpperCase()){
						alert("类型不正确;'CHECKBOX'或'RADIO'");
						return;
					}
					var groups = document.getElementsByName(the.name);
					var max = the.getAttribute("max") || groups.length;
					var min = the.getAttribute("min") || 1;
					errmsg = errmsg || "不能超出选择范围" + min + "~" + max;
					var hasChecked = 0;
					for(var i=0; i<groups.length; i++)
						if(groups[i].checked) 
							hasChecked++;
					expflag = (max >= hasChecked && hasChecked >= min);
					break;
				case "selected":
					if ("SELECT" != the.tagName.toUpperCase()){
						alert("类型不正确;'SELECT'");
						return;
					}
					var max = the.getAttribute("max") || the.options.length;
					var min = the.getAttribute("min") || 1;
					errmsg = errmsg || "不能超出选择范围" + min + "~" + max;
					var hasSelected = 0;
					for (var i=0; i<the.options.length; i++)
						if (the.options[i].selected && the.options[i].value != "") 
							hasSelected++;
					expflag = (max >= hasSelected && hasSelected >= min);
					break;
				case "GREATER":
					var s = the.getAttribute("than");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "大于" + sv;
					expflag = expflag || parseDatetime(value) > parseDatetime(sv);
					expflag = expflag || parseInt(value) > parseInt(sv);
					break;
				case "LESS":	
					var s = the.getAttribute("than");
					var so = document.getElementById(s) || document.getElementsByName(s)[0];
					var sv = so != null ? so.value : s;
					errmsg = errmsg || "小于" + sv;
					expflag = expflag || parseDatetime(value) < parseDatetime(sv);
					expflag = expflag || parseInt(value) < parseInt(sv);
					break;
				default :
					errmsg = errmsg || "内容不能为空!";
					mask = /^[\w|\W]+$/;
					expflag = mask.test(value);
					break;	
			}
			if (!expflag) 
				break;
		}
		var flag = false;
		if (expflag){
			flag = true;
		} else {
			if ((required == "false" || required == "1") && value == ""){
				flag = true;
			}
		}
		if (flag){
			vvSpan(0,the);
		} else {
			vvSpan(1,the,errmsg);
			break;
		}
	}	
	return flag;
}

/**
* 处理[日期 时间] 
* @param s [日期 时间]格式字符串
* @return 返回Date对象
*/
function parseDatetime(s){
	var mask_d = /^(19\d{2}|20\d{2})-([0]?[1-9]|1[0-2])-([0]?[1-9]|[1-2]\d|[3][0-1])$/;
	var mask_t = /^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$/;
	var	mask_dt= /^(19\d{2}|20\d{2})-([0]?[1-9]|1[0-2])-([0]?[1-9]|[1-2]\d|[3][0-1])( )([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$/;

	var date;
	var time;		
	if (mask_d.test(s)){
		date = s.split("-");
	} else 
	if (mask_t.test(s)){
		time = s.split(":");
	} else
	if (mask_dt.test(s)){
		var datetime = s.split(" ");
		date = datetime[0].split("-");
		time = datetime[1].split(":");
	} else
		return;
	
	var year = date!=null ? parseInt(date[0]) : 0;
	var month = date!=null ? parseInt(date[1]) : 1;
	var day = date!=null ? parseInt(date[2]) : 0;
	var hour = time != null ? parseInt(time[0]) : 0;
	var minute = time != null ? parseInt(time[1]) : 0;
	var second = time != null ? parseInt(time[2]) : 0;
	
	var obj = new Date();
	obj.setYear(year);
	obj.setMonth(month-1);
	obj.setDate(day);
	obj.setHours(hour);
	obj.setMinutes(minute);
	obj.setSeconds(second);
	return obj;
}




