/**
 * 表单类
 * 功能
 * 1、表单序列化
 * 2、表单验证
 */
var JTK = window.JTK || {};
JTK.require('JTK.Dom');
JTK.require('JTK.Array');
JTK.require('JTK.Object');
JTK.require('JTK.Validate');
JTK.Form = {
	ErrMsgBoxCanDisappear : true,
	/*
	 * 参数f为表单的id,
	 * 返回表单发送的数据，常用于ajax提交
	 */ 
	formQuery: function(f) {
		var formData = "",
		elem = "",
		f = JTK.Dom.get(f);
		var elements = f.elements;
		var length = elements.length;
		for (var s = 0; s < length; s++) {
			elem = elements[s];
			if (elem.tagName == 'INPUT') {
				if (elem.type == 'radio' || elem.type == 'checkbox') {
					if (!elem.checked) {
						continue;
					}
				}
			}
			if (formData != "") {
				formData += "&";
			}
			formData += encodeURIComponent(elem.name || elem.id) + "=" + encodeURIComponent(elem.value);
		}
		return formData;
	},
	validate : function() {
		var args = JTK.Object.iterable(arguments),
		form = null;
		//form如果不为空元素,应置于第一个参数中.
		if (!JTK.isArray(args[0])) {
			form = JTK.Dom.get(args[0]);
			args.remove(0);
		}
		var b = JTK.isArray(b) ? {}: args.pop();
		var d;
		var queryStr = true,
		onSubmitCallBack = b.onSubmitCallBack,
		ignoreNull = b.ignoreNull,
		cb = b.callback,
		errMsgBox = b.errMsgBox;
		var result = queryStr ? '': {};
		//初始化 清扫错误提示框
		var checkErrMsgBox = function(ErrMsgBox){
			if(ErrMsgBox){
				if(JTK.isString(ErrMsgBox) && ErrMsgBox!=''){
					var errMsgBox = document.getElementById(ErrMsgBox);
				}else{
					var errMsgBox = ErrMsgBox;
				}
				errMsgBox1 = document.getElementById(errMsgBox.id);
				if(JTK.Form.ErrMsgBoxCanDisappear){
					errMsgBox1.style.display = 'none';
				}
			}else{
				var errMsgBox = undefined;
			}
			return errMsgBox;
		};
		JTK.Object.each(args, function(i, v) {
			d = JTK.isFunction(v[2])?v[3]:v[2];
			//清扫过期的提示信息
			var errMsgBox = checkErrMsgBox(d.errMsgBox);
		});
		//处理自定义校验
		JTK.Object.each(args, function(i, v) {
			var d = JTK.isFunction(v[2])?v[3]:v[2];
			var f = JTK.isFunction(v[2])?v[2]:v[3];
			var obj = v[0].tagName ? v[0] : form ? form[v[0]] : JTK.Dom.get(v[0]);	//处理对象
			var errMsgBox = checkErrMsgBox(d.errMsgBox);
			//绑定自定义处理事件
			//todo 如果为空是否因该在绑定自定义处理事件中做处理
			if(d.validateEvent){
				var sEventType = d.validateEvent;	//事件类型
				var fnHandler = function(){		//处理方法
					var value = obj.value, msg = v[1];
					//自定义错误处理
					if (d.ignoreNull == false && (value == '' || value == null)) {
						if (!d.callback){
							if(!d.errMsgBox){
								JTK.alert(msg, obj, form);
							}else{
								//在自定义位置打印出错信息
								if(d.errMsgBox){
									errMsgBox.innerHTML = msg;
									errMsgBox1 = document.getElementById(errMsgBox.id);
									if(JTK.Form.ErrMsgBoxCanDisappear){
										errMsgBox1.style.display = 'block';
									}
								}
							}
						}
						//如果存在回调,注意传递的三个参数
						//msg:消息,obj:该结点,form:对应的表单,如果存在的话
						else d.callback(msg, obj, form);
						//出错后是否聚集
						if (d.focus == true) 
						window.setTimeout(function(){obj.focus();obj.select(); }, 0);
						result = false;
						return false;
					} else if(value) {
						if (JTK.isFunction(f)) {
							var ret = f(value, obj, form);
							var pass = (ret !== false);
							if (JTK.isString(ret)) {
								msg = ret;
								pass = false;
							}
							if (!pass) {
								if (!d.callback){
									if(!d.errMsgBox){
										JTK.alert(msg, obj, form);
									}else{
										//在自定义位置打印出错信息
										errMsgBox.innerHTML = msg;
										errMsgBox1 = document.getElementById(errMsgBox.id);
										if(JTK.Form.ErrMsgBoxCanDisappear){
											errMsgBox1.style.display = 'block';
										}
									}
								} else{
									d.callback(msg, obj, form);
								}
								if (d.focus == true) 
								window.setTimeout(function(){obj.focus();obj.select(); }, 0);
								result = false;
								return false;
							}else{
								if(d.errMsgBox){
									errMsgBox1 = document.getElementById(errMsgBox.id);
									if(JTK.Form.ErrMsgBoxCanDisappear){
										errMsgBox1.style.display = 'none';
									}
								}
							}
						}else{
							checkErrMsgBox(d.errMsgBox);
						}
					}
				};
				if (obj.addEventListener){
					//firefox
					obj.addEventListener(sEventType, fnHandler, false);
				}
				else if (obj.attachEvent){
					obj.attachEvent("on" + sEventType, fnHandler);
				}else{
					obj["on" + sEventType] = fnHandler;
				}
			}
		});
		//onsubmit
		form.onsubmit = function(){
			if(result == false){
				var result = queryStr ? '': {};
			}
			
			JTK.Object.each(args, function(i, v) {
				d = JTK.isFunction(v[2])?v[3]:v[2];
				//清扫过期的提示信息
				var errMsgBox = checkErrMsgBox(d.errMsgBox);
			});

			JTK.Object.each(args, function(i, v) {
				var f = JTK.isFunction(v[2])?v[2]:v[3];
				//如果在fomr中不存在该name元素,就当id来获得
				var obj = v[0].tagName ? v[0] : form ? form[v[0]] : JTK.Dom.get(v[0]);
				//console.debug('checking field:',v, 'current value:'+obj.value);
				var value = obj.value, msg = v[1], d = JTK.isFunction(v[2])?v[3]:v[2];
				//错误信息提示框
				var errMsgBox = checkErrMsgBox(d.errMsgBox);
				//选项
				if(!d || typeof d != 'object'){
					d = b;
				}
				/**
				 * 当input什么都没添的时候
				 */
				if (!d.ignoreNull && (value == '' || value == null)) {
					if (!d.callback){
						if(d.errMsgBox){
							errMsgBox1 = JTK.Dom.get(errMsgBox.id);
							if(JTK.Form.ErrMsgBoxCanDisappear){
								errMsgBox1.style.display = 'none';
							}
						}
						if(!d.errMsgBox){
							JTK.alert(msg, obj, form);
						}else{
							//在自定义位置打印出错信息
							if(d.errMsgBox){
								errMsgBox.innerHTML = msg;
								errMsgBox1 = document.getElementById(errMsgBox.id);
								if(JTK.Form.ErrMsgBoxCanDisappear){
									errMsgBox1.style.display = 'block';
								}
							}
						}
					}
					//如果存在回调,注意传递的三个参数
					//msg:消息,obj:该结点,form:对应的表单,如果存在的话
					else d.callback(msg, obj, form);
					//出错后是否聚集
					if (d.focus == true) 
					window.setTimeout(function(){obj.focus();obj.select(); }, 0);
					result = false;
					return false;
				}
				//自定义验证方法
				//返回true通过校验，false不通过校验，返回字符串不通过校验
				if (JTK.isFunction(f)) {
					var ret = f(value, obj, form);
					var pass = (ret !== false);
					if (JTK.isString(ret)) {
						msg = ret;
						pass = false;
					}
					if (!pass) {
						if (!d.callback){
							if(!d.errMsgBox){
								JTK.alert(msg, obj, form);
							}else{
								//在自定义位置打印出错信息
								errMsgBox.innerHTML = msg;
								errMsgBox1 = JTK.Dom.get(errMsgBox.id);
								if(JTK.Form.ErrMsgBoxCanDisappear){
									errMsgBox1.style.display = 'block';
								}
							}
						} else {
							d.callback(msg, obj, form);
						}
						if (d.focus == true) 
						window.setTimeout(function(){obj.focus();obj.select(); }, 0);
						result = false;
						return false;
					} else {
						if(d.errMsgBox){
							errMsgBox1 = document.getElementById(errMsgBox.id);
							if(JTK.Form.ErrMsgBoxCanDisappear){
								errMsgBox1.style.display = 'none';
							}
						}
					}
				}
				//如果不设置queryString并通过验证,不存在form,就返回一个对象,该对象包含形如{elementName|elementId:value}的数据.
				if (queryStr && !form) {
					result += (result == '') ? ((typeof obj.name == 'undefined' || obj.name=='') ? obj.id : obj.name) + '=' + value: '&' + v[0] + '=' + value;
				} else if (!form) {
					result[v[0]] = value;
				}
			});
			//如果设置的queryString:true并通过验证,就返回form的提交字符串.
			if (result !== false && form && queryStr){
				result = JTK.Form.formQuery(form);
				onSubmitCallBack(result);
				if(!form.action){
					return false;
				}
			}
			return result;
		}
	}
};
