jQuery.iFormValidate = {
	build : function(options)
	{

		var defaults = {
			phpFile:"processform.php",
			ajax: true,
			effects: "gone", //gone, stay, swap
			jscode:""
		};
		var options = $.extend(defaults, options); 
		return $(this).each(
			function() {

			$inputs = $(this).find(":input").filter(":not(:submit)");

			$(this).submit(function(){
				var isValid = jQuery.iFormValidate.validateForm($inputs);
				if(!isValid){
					return false;
				};

			
				
				if(options.ajax){
				
					var serializedForm = $(this).serialize();
					//alert (serializedForm);
					
					var form = $(this).parent('div');
					var formmessagebox = $(this).parent('div').prev();
					var formloadinglayer = $(this).parent('div').prev().prev();					
					
					//show the loading layer to block the double submit
					$(formloadinglayer).show();					
					
					$.post(options.phpFile,serializedForm, function(data){
						//hide the loading layer once the page has been submited
						$(formloadinglayer).hide();		
						
						var htmldata = data;						
						//var htmldata = eval(data);
						//display the outcome message
						$(formmessagebox).html(htmldata);
						//$(formmessagebox).fadeIn("slow");
						$(formmessagebox).slideDown("slow");
								
								
						switch(options.effects)
						{
							case "stay":
								
								break;
	 						case "gone":
								//hide the form  and display the outcome message
								$(form).hide();
								break;
	 						case "swap":
								//hide the form  and display the outcome message
								//$(form).hide();

								//delay for redisplay the form
								$(formmessagebox).fadeTo(1000, 1);
								//$(formmessagebox).fadeOut();
								$(formmessagebox).slideUp("slow");

								
			
								//$(form).fadeTo(1000, 1);
								//$(form).show('slow');
								
								

								break;
	 						}
						// run some customized code after form submited
						eval(options.jscode);	
					
					});
					return false;
				}else{
					return true;
				}
				
			});
			
			$inputs.bind("blur", jQuery.iFormValidate.validate);
			$inputs.filter("select").bind("change", jQuery.iFormValidate.validate);
		});
	},
	
	validateForm : function($inputs)
	{
		var isValid = true; //benifit of the doubt?
		$inputs.filter(".is_required").each(jQuery.iFormValidate.validate);
		if($inputs.filter(".is_required").hasClass("invalid")){isValid=false;}
		return isValid;
	},
	
		
	validate : function(){

		var $val = $(this).val();
		//alert (this.name);
		var isValid = true;
		//Regex for DATE
		if($(this).hasClass('vdate')){
			var Regex = /^([\d]|1[0,1,2]|0[1-9])(\-|\/|\.)([0-9]|[0,1,2][0-9]|3[0,1])(\-|\/|\.)\d{4}$/;
			isValid = Regex.test($val);
		//Regex for Email
		}else if($(this).hasClass('vemail')){
			var Regex =/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			if(!Regex.test($val)){isValid = false;}; 	
		
		//Regex for Phone
		}else if($(this).hasClass('vphone')){
			var Regex =/^([0-9a-zA-Z]+([_+.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/;
			//var Regex = /^\(?[2-9]\d{2}[ \-\)] ?\d{3}[\- ]?\d{4}$/;
			if(!Regex.test($val)){isValid = false;}
		}else if(!$(this).hasClass('is_required')){
			isValid = true;
		//Check for empty
		}else if($val.length == 0){
			isValid = false;
		}else if($val=='Required Field' || $val=='必須填寫'){
			isValid = false;

		}
		if(isValid){
			$(this).removeClass("invalid");
			$(this).addClass("valid");
			//$(this).parent().prev().hide();
			$(this).parent().next().css("visibility", "hidden");
		}else{
			$(this).addClass("invalid");
			$(this).removeClass("valid");
			//$(this).parent().prev().show();
			$(this).parent().next().css("visibility", "visible");
		}
		return isValid;
	}	
}
jQuery.fn.FormValidate = jQuery.iFormValidate.build;