/*
 * Inline Form Validation Engine, jQuery plugin
 * 
 * Copyright(c) 2009, Cedric Dugas http://www.position-relative.net
 * 
 * Form validation engine witch allow custom regex rules to be added. Licenced
 * under the MIT Licence
 */

$(document).ready(function() {

	// SUCCESS AJAX CALL, replace "success: false," by: success : function() {
	// callSuccessFunction() },
	$("[class^=validate]").validationEngine({
		success :  false,
		failure : function() {}
	})


});

jQuery.fn.validationEngine = function(settings) {
	if($.validationEngineLanguage){					// IS THERE A LANGUAGE
													// LOCALISATION ?
		allRules = $.validationEngineLanguage.allRules
	}else{
		allRules = {	"required":{ 
							"regex":"none",
							"alertText":"* 请输入",
							"alertTextCheckboxMultiple":"* 您还没有选择",
							"alertTextCheckboxe":"* 您还没有同意本公司服务条款总章程",
							"selectAlert":"* 请选择"
						},
						"length":{
							"regex":"none",
							"alertText":"",
							"alertText2":" 至 ",
							"alertText3": " 字符"
						},
						"minCheckbox":{
							"regex":"none",
							"alertText":"* ",
							"alertText1":" 和 ",
							"alertText2": " 不相等"
						},	
						"confirm":{
							"regex":"none",
							"alertText":"* ",
							"alertText1":" 和 ",
							"alertText2": " 不相等"						},		
						"telephone":{
							"regex":"/^[0-9\-\(\)\ ]+$/",
							"alertText":"* Invalid phone number"
						},	
						"email":{
							"regex":"/^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,4}$/",
							"alertText":"* 无效的Email地址"
						},	
						"date":{
                             "regex":"/^[0-9]{4}\-\[0-9]{1,2}\-\[0-9]{1,2}$/",
                             "alertText":"* 时间格式错误, 例：2009-01-01"
						},
						"onlyNumber":{
							"regex":"/^[0-9\ ]+$/",
							"alertText":"* 只能输入数字"
						},	
						"noSpecialCaracters":{
							"regex":"/^[0-9a-zA-Z]+$/",
							"alertText":"* No special caracters allowed"
						},	
						"onlyLetter":{
							"regex":"/^[0-9a-zA-Z_]+$/",
							"alertText":" (可以包含入字母、数字、下划线)"
						},
						"cnWords":{
							"regex":"/^[\u4E00-\u9FA5\uF900-\uFA2D]+$/",
							"alertText":" (请确认是中文字符)"
						},
						"postcode":{
							"regex":"/^[0-9]{6}$/",
							"alertText":"* 请输入正确的邮政编码"
						},
						"phoneNum":{
							"regex":"/^([0-9]{3,4}-[0-9]{7,8}|[0-9]{11})$/",
							"alertText":"* 请输入正确的"
						},
						"ajaxSubmit":{
							"regex":"none",
							"alertText":""
						}

						
					}	
	}

 	settings = jQuery.extend({
		allrules:allRules,
		success : false,
		failure : function() {}
	}, settings);	


	$("form").bind("submit", function(caller){   // ON FORM SUBMIT, CONTROL
													// AJAX FUNCTION IF
													// SPECIFIED ON DOCUMENT
													// READY
		if(submitValidation(this) == false){
			if (settings.success){
				settings.success && settings.success(); 
				return false;
			}
		}else{
			settings.failure && settings.failure(); 
			return false;
		}
	})
	$(this).not("[type=checkbox]").bind("blur", function(caller){loadValidation(this)})
	$(this+"[type=checkbox]").bind("click", function(caller){loadValidation(this)})
	
	var buildPrompt = function(caller,promptText) {			// ERROR PROMPT
															// CREATION AND
															// DISPLAY WHEN AN
															// ERROR OCCUR
		var divFormError = document.createElement('div')
		var formErrorContent = document.createElement('div')
		var arrow = document.createElement('div')
		
		
		$(divFormError).addClass("formError")
		$(divFormError).addClass($(caller).attr("name"))
		$(formErrorContent).addClass("formErrorContent")
		$(arrow).addClass("formErrorArrow")

		$("body").append(divFormError)
		$(divFormError).append(arrow)
		$(divFormError).append(formErrorContent)
		$(arrow).html('<div class="line10"></div><div class="line9"></div><div class="line8"></div><div class="line7"></div><div class="line6"></div><div class="line5"></div><div class="line4"></div><div class="line3"></div><div class="line2"></div><div class="line1"></div>')
		$(formErrorContent).html(promptText)
	
		callerTopPosition = $(caller).offset().top;
		callerleftPosition = $(caller).offset().left;
		callerWidth =  $(caller).width()
		callerHeight =  $(caller).height()
		inputHeight = $(divFormError).height()

		callerleftPosition = callerleftPosition + callerWidth -30
		callerTopPosition = callerTopPosition  -inputHeight -10
		//callerleftPosition = callerleftPosition  + callerWidth
		//callerTopPosition = callerTopPosition 
	
		$(divFormError).css({
			top:callerTopPosition,
			left:callerleftPosition,
			opacity:0
		})
		$(divFormError).fadeTo("fast",0.8);
	};
	var updatePromptText = function(caller,promptText) {	// UPDATE TEXT ERROR
															// IF AN ERROR IS
															// ALREADY DISPLAYED
		updateThisPrompt =  $(caller).attr("name")
		$("."+updateThisPrompt).find(".formErrorContent").html(promptText)
		
		callerTopPosition = $(caller).offset().top;
		inputHeight = $("."+updateThisPrompt).height()
		
		callerTopPosition = callerTopPosition  -inputHeight -10
		$("."+updateThisPrompt).animate({
			top:callerTopPosition
		});
	}
	var loadValidation = function(caller) {		// GET VALIDATIONS TO BE
												// EXECUTED
		
		rulesParsing = $(caller).attr('class');
		rulesRegExp = /\[(.*)\]/;
		getRules = rulesRegExp.exec(rulesParsing);
		str = getRules[1]
		pattern = /\W+/;
		result= str.split(pattern);	
		
		var validateCalll = validateCall(caller,result)
		return validateCalll
		
	};
	var validateCall = function(caller,rules) {	// EXECUTE VALIDATION REQUIRED
												// BY THE USER FOR THIS FILED
		var promptText =""	
		var prompt = $(caller).attr("name");
		var caller = caller;
		var isError = false;
		callerType = $(caller).attr("type");
		
		for (i=0; i<rules.length;i++){
			switch (rules[i]){
			case "optional": 
				if(!$(caller).val()){
					closePrompt(caller)
					return isError
				}
			break;
			case "required": 
				_required(caller,rules);
			break;
			case "custom": 
				 _customRegex(caller,rules,i);
			break;
			case "length": 
				 _length(caller,rules,i);
			break;
			case "minCheckbox": 
				 _minCheckbox(caller,rules,i);
			break;
			case "confirm": 
				 _confirm(caller,rules,i);
			break;
			case "personCard": 
				 _personCard(caller);
			break;
			case "rightFormat": 
				 _rightFormat(caller,rules,i);
			break;
			case "ajaxSubmit": 
				 _ajaxSubmit(caller);
			break;
			default :;
			};
		};
		if (isError == true){			
			if($("input[name="+prompt+"]").size()> 1 && callerType == "radio") {
				caller = $("input[name="+prompt+"]:first")
			}
			($("."+prompt).size() ==0) ? buildPrompt(caller,promptText)	: updatePromptText(caller,promptText)
		}else{
			closePrompt(caller)
		}		
		
		/* VALIDATION FUNCTIONS */
		// 自定义 身份证
		function _personCard(caller){
			var msg = checkIdcard($(caller).attr('value'));
			if(msg!=true){
				isError = true;
				promptText+=msg;
			}
		}

		//用户名判断
		function _ajaxSubmit(caller){
			var userName=$(caller).attr('value');	
			if(!userName.match(/^[0-9a-zA-Z_]+$/)){
				promptText +="请输入正确的用户名，可以包含入字母、数字、下划线";
				isError = true;	
				return false;
			}
			var sendurl="http://www.yceasyfood.cn/userself/checkuser.asp";
			$.ajax({
				 type: "GET",
				 url: sendurl+"?username="+userName,
				 async: false, 
				 cache: false, 
				 success: function(msg){ 
					if(msg!="Y"){
						promptText+='用户名 '+userName+'已被注册，请更换用户名！';			
						isError = true;	
					}
				 } 	
			}) 
		}

		function _required(caller,rules){ 
			callerType = $(caller).attr("type")
			
			if (callerType == "text" || callerType == "password" || callerType == "textarea"){				
				if(!$(caller).val()){
					isError = true
					promptText += settings.allrules[rules[i]].alertText+$(caller).attr('label')
				}	
			}
			if (callerType == "radio" || callerType == "checkbox" ){
				callerName = $(caller).attr("name")
		
				if($("input[name="+callerName+"]:checked").size() == 0) {
					isError = true
					if($("input[name="+callerName+"]").size() ==1) {
						promptText += settings.allrules[rules[i]].alertTextCheckboxe 
					}else{
						 promptText += settings.allrules[rules[i]].alertTextCheckboxMultiple
					}	
				}
			}	
			if (callerType == "select-one") { // added by paul@kinetek.net for
												// select boxes, Thank you
					callerName = $(caller).attr("name");
				
				if(!$("select[name="+callerName+"]").val()) {
					isError = true;
					promptText += settings.allrules[rules[i]].selectAlert+$(caller).attr("label");
				}
			}
			if (callerType == "select-multiple") { // added by paul@kinetek.net
													// for select boxes, Thank
													// you
					callerName = $(caller).attr("id");
				
				if(!$("#"+callerName).val()) {
					isError = true;
					promptText += settings.allrules[rules[i]].alertText;
				}
			}
		}
		function _customRegex(caller,rules,position){		 // VALIDATE
																// REGEX RULES
			customRule = rules[position+1]
			pattern = eval(settings.allrules[customRule].regex)
			
			if(!pattern.test($(caller).attr('value'))){
				isError = true
				promptText += settings.allrules[customRule].alertText
			}
		}
		function _rightFormat(caller,rules,position){		 // VALIDATE
																// REGEX RULES
			customRule = rules[position+1]
			pattern = eval(settings.allrules[customRule].regex)
			
			if(!pattern.test($(caller).attr('value'))){
				isError = true
				promptText += settings.allrules[customRule].alertText+$(caller).attr('label')
			}
		}



		function _confirm(caller,rules,position){		 // VALIDATE FIELD
															// MATCH
			confirmField = rules[position+1]
			
			if($(caller).attr('value') != $("#"+confirmField).attr('value')){
				isError = true
				promptText += settings.allrules["confirm"].alertText
							+ $(caller).attr('label') 
							+ settings.allrules["confirm"].alertText1
							+ $("#"+confirmField).attr('label')
							+ settings.allrules["confirm"].alertText2
							
			}
		}
		function _length(caller,rules,position){    // VALIDATE LENGTH
		
			startLength = eval(rules[position+1])
			endLength = eval(rules[position+2])
			feildLength = $(caller).attr('value').length

			if(feildLength<startLength || feildLength>endLength){
				isError = true
				promptText += settings.allrules["length"].alertText+startLength+settings.allrules["length"].alertText2+endLength+settings.allrules["length"].alertText3
			}
		}
		function _minCheckbox(caller,rules,position){    // VALIDATE CHECKBOX
															// NUMBER
		
			nbCheck = eval(rules[position+1])
			groupname = $(caller).attr("name")
			groupSize = $("input[name="+groupname+"]:checked").size()
			
			if(groupSize > nbCheck){	
				isError = true
				promptText += settings.allrules["minCheckbox"].alertText
			}
		}

		return(isError) ? isError : false;
	};
	var closePrompt = function(caller) {	// CLOSE PROMPT WHEN ERROR CORRECTED
		closingPrompt = $(caller).attr("name")

		$("."+closingPrompt).fadeTo("fast",0,function(){
			$("."+closingPrompt).remove()
		});
	};
	var submitValidation = function(caller) {	// FORM SUBMIT VALIDATION
												// LOOPING INLINE VALIDATION
		var stopForm = false
		$(caller).find(".formError").remove()
		var toValidateSize = $(caller).find("[class^=validate]").size()
		
		$(caller).find("[class^=validate]").each(function(){
			var validationPass = loadValidation(this)
			return(validationPass) ? stopForm = true : "";	
		});
		if(stopForm){							// GET IF THERE IS AN ERROR OR
												// NOT FROM THIS VALIDATION
												// FUNCTIONS
			destination = $(".formError:first").offset().top;
			$("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination}, 1100)
			return true;
		}else{
			return false
		}
	};
};