// JavaScript Document
var Forms = new Object();

Forms.FormCheck = Class.create();

Forms.FormCheck.prototype = {
	
	/* 类内部表单对象 */
	form : null,
	/* 生成表单的默认css样式 */
	spanclass : 'checkspan',
	
	/** 
	 * 构造
	 *
	 * @access  public
	 * 
	 * @param   string      $msg        提示语句,lang数组索引
	 * @param   string      $gourl      提示跳转的地址
	 * @param   int         $back       是否自动返回上个页面/默认不跳转
	 * 
	 * @return  null
	 */
	initialize : function(form) {
    	this.form = form;
  	},
	
	bindevent : function() {
		
	},
	
	/**
	 * 表单检查
	 *
	 * @access  public
	 * 
	 * @return  bool
	 */
	docheck : function() {
		
		var err_ele = null;
		var ele = this.form.elements;
		var haserror = false;
		//遍历所有表单元素
		for(var i = 0;i < ele.length ; i++) {
			var eletype = ele[i].getAttribute('type');
			//过滤元素类型
			if(eletype != 'submit' && eletype != 'hidden' && eletype != 'button') {
				//是否需要验证标签
				var required = ele[i].getAttribute('required');
				if(required != 'undefined' && (required=='true' || required=='yes') ) {
					if(!this.__validate(ele[i])) {	
						if(err_ele == null)
							err_ele = ele[i];
						haserror = true;	
					}
				}
			}
		}
		//判断是否有没有通过验证的项目
		if(haserror) {
			//再检查该元素是否被设定隐藏
			if(err_ele.style.display != 'none') {
				try{
					err_ele.focus();
				}
				catch (e){}
			}
			return false;
		} else {
			return true;
		}
	},
	
	/**
	 * 表单元素数据验证
	 *
	 * @access  protected
	 * 
	 * @param   object ele 表单元素对象
	 *
	 * @return  bool
	 */
	__validate : function(ele) {
		//得到设定的检测函数
		var fun = ele.getAttribute('fun');
		//自定义提示语句
		var custommsg = ele.getAttribute('msg');
		//为空则不检测
		var allowempty = ele.getAttribute('allowempty');

		if(fun != null) 
		{
			//首先判断设定允许为空的情况
			if(allowempty == 'true') 
			{
				//如果该元素没有值输入，则不检测
				if(!this.__regvalidate(this.__getvalue(ele),'.+')) 
				{
					return true;
				}
			}
			
			var checkarr = this.__execute(fun,ele);
			if(checkarr[2] == 'regxp') 
			{	
				//正则表达式处理
				if(!this.__regvalidate(this.__getvalue(ele),checkarr[0])) 
				{
					//如果有自定义提示语句则使用自定义提示语句
					custommsg ? this.__createspan(ele,custommsg) : this.__createspan(ele,checkarr[1]);
					return false;
				} 
				else 
				{
					this.__removespan(ele);
				}
			} 
			else if(checkarr[2] == 'custom') //函数自行逻辑处理
			{ 
				//如果验证通过
				if(checkarr[0]) 
				{
					this.__removespan(ele);
				} 
				else 
				{
					//如果有自定义提示语句则使用自定义提示语句
					custommsg ? this.__createspan(ele,custommsg) : this.__createspan(ele,checkarr[1]);
					return false;
				}
			}
		}
		return true;
	},
	
	__execute : function(funname,element) {
		//转换大小写
		funname = funname.toLowerCase();
		//匹配函数是否带有参数
		if( funname.match(/^[\w\$]+\((.+)\);?$/) ) {
			return eval('this.__' + funname.replace(/^([\w\$]+)\((.+)\);?$/,"$1($2,element)"));
		} else {
			return eval(funname.match(/^[\w]+\(\)$/) ? 'this.__' + funname : 'this.__' + funname + '()');
		}
	},
	
	
	__regvalidate : function(value,regxp) {
		var reg = new RegExp(regxp ,"i");
		return reg.test(value);
	},
	
	
	__getvalue : function(ele) {
		var type = ele.getAttribute('type');
		switch(type) 
		{
			case 'text':
			case 'hidden':
			case 'password':
			case 'file':
			case 'select-one':
			case 'textarea':
				try 
				{
					//认定为编辑器
					if(ele.style.display == 'none') 
					{
						var localIFrame = document.frames(ele.name).document.frames("eWebEditor");
						return localIFrame.document.body.innerHTML;
					} 
					else 
					{
						return ele.value;
					}
				 } 
				 catch(e) 
				 {
					 ele.value;
				 }
			case 'checkbox':
			case 'radio': 
				return this.__choosevalue(ele);
			case "select-multiple": 
				return this.__selectvalue(ele);
		}
	},
	
	__choosevalue : function(ele) {
		var value = 0;
		//取得第一个元素的name,搜索这个元素组
		var tmpele = document.getElementsByName(ele.getAttribute('name'));
		for(var i=0;i < tmpele.length;i++) 
		{
			tmpele[i].checked && value++;
		}
		return value;
	},
	
	__selectvalue : function(ele) {
		var value = 0;
		for(var i=0;i<ele.options.length;i++) {
			//单选下拉框提示选项设置为value=""
			if(ele.options[i].selected && ele.options[i].value != '') {
				value++;
			}
		}
		return value;
	},
	
	__createspan : function(ele,msg) {
		var span = document.createElement("span");
		span.className = this.spanclass;
		//设定名称属性,防止与其他span标签重复
		span.setAttribute('name','formcheck');
		span.innerHTML = msg;
		//如果有父节点
		if(ele.parentNode) 
		{
			//去除多余的span标签
			this.__removespan(ele);
			//加入新span标签
			ele.parentNode.appendChild(span);
		}
	},
	
	__removespan : function(ele) {
		//得到父节点下所有子节点
		var parent = ele.parentNode;
		var child  = parent.childNodes;
		for(var i=0;i < child.length; i++) 
		{
			//容错,子节点可能不含有tagName属性
			try {
				//得到name的属性,兼容IE和火狐
				var tagname    = child[i].tagName.toLowerCase();
				var name       = child[i].getAttribute('name');
				if(name != 'undefined' && tagname == 'span') 
				{
					if(name == 'formcheck' ) 
					{
						parent.removeChild(child[i]);
					}
				}
			}
			catch(e) 
			{ 
				continue;
			}
		}
	},
	
	/* --- 内部自定义验证函数开始  --- */
	
	/* 正则类 */
	__username : function() {
		var rt = new Array();
		rt[0] = '^([a-zA-Z0-9]|[._]){4,19}$';
		rt[1] = "用户名必须为4-19个字母和数字组成";
		rt[2] = 'regxp';
		return rt;
	},
	
	
	__password : function() {
		var rt = new Array();
		rt[0] = '^([a-zA-Z0-9]|[._]){6,19}$';
		rt[1] = "密码必须为6-19个字母和数字组成";
		rt[2] = 'regxp';
		return rt;
	},
	
	__notblank : function() {
		var rt = new Array();
		rt[0] = "^\\S+$";
		rt[1] = '该项内容不能为空,且不能含有空格!';
		rt[2] = 'regxp';
		return rt;
	},
	
	__required : function() {
		var rt = new Array();
		rt[0] = '.+';
		rt[1] = '该项内容不能为空!';
		rt[2] = 'regxp';
		return rt;
	},
	
	__chinese : function() {
		var rt = new Array();
		rt[0] = '^[\u0391-\uFFE5]+$';
		rt[1] = '该项内容必须为中文!';
		rt[2] = 'regxp';
		return rt;
	},
	
	__isemail : function() {
		var rt = new Array();
		rt[0] = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
		rt[1] = "该项填写的EMAIL格式不正确！";
		rt[2] = 'regxp';
		return rt;
	},
	
	/* 自定义功能类 */
	
	
	__select : function(min,max,ele) {
		var rt = new Array();
		rt[0] = true;
		rt[1] = '';
		rt[2] = 'custom';
	
		if(min == null && max == null) {
			return rt;
		}
	
		if(max == null) {
			max = min;
		}
	
		var value = 0;
		//取得第一个元素的name,搜索这个元素组
		var tmpele = document.getElementsByName(ele.getAttribute('name'));
	
		for(var i = 0;i < tmpele.length; i++) {
			if(tmpele[i].checked) {
				value++;
			}
		}
	
		//至多
		if(min == '#') {
			if(value > max) {
				rt[0] = false;
				rt[1] = '至多只能选择' + max + '项';
				return rt;
			}
		}
	
		//至少
		if(max == '#') {
			if(value < min) {
				rt[0] = false;
				rt[1] = '至少选择' + min + '项';
				return rt;
			}
		}
	
		//至多和至多
		if( (!isNaN(min) && !isNaN(max) ) && (value < min || value > max)) {
			rt[0] = false;
			if(min == max) {
				rt[1] = '必须选择' + min + '项';
			} else {
				rt[1] = '至少选择' + min + '项 至多选择' + max + '项';
			}
			return rt;
		}
		
		return rt;
	}
};
