// Easy form validation by Simon Tauber - http://www.oxn.it/
// Latest update 31-08-2008
// Usage: $('#yourForm').validate();


(function($){ 

$.fn.validate = function(){ 	
 	// default vars for validation
 	var formID = this;
 	var showTxt = false;
 	var focusError = true;
 	var submitForm;
 	
 	// Error Messages
 	var errMsg = "This field is required";
 	var errMsgNbr = "Field must be a number";
 	var errMsgAlpha = "Only alphabetic characters";
  	var errMsgAlphanum = "Only alphanumeric characters";
  	var errMsgEmail = "Not a valid email adress";
   var errMsgUrl = "Not a valid url";
  	var errMsgRadio = "Check at least one element";
  	var errMsgSelect = "Select at least one element"; 	
 	
 	// global variables for functions
 	var errorFocused = false;
 	
 	 
 	$(formID).submit( function() {
  
 		// Delete all previous settings
 		$(".errMsg").remove();
 		submitForm = true;
 		
 		var checkedGroup = "";
 		var allGroups = "";
 		var allCheckboxes = "";
 		var selectedCheckboxGroup = "";
 		errorFocused = false;

 			
 		// Get out inputs of the form
 		$(":input",formID).each( function() {
			var type = $(this).attr("type");
			var validation = $(this).attr("class");
			var checked = $(this).attr("checked");
			var value = $(this).attr("value");
			var name = $(this).attr("name");

			if ((type == "radio") || (type == "checkbox")){
				if(validation == "validate-one-required") {
					// Count all grouped elements
					if (!allGroups.match(name+",")){
						allGroups = allGroups + name +",";
					}
					if(checked){
						if (!checkedGroup.match(name+",")){
							checkedGroup = checkedGroup + name + ",";		
						}
					}
				}
			}
			else if(type == "text") {		
				
				if (validation.match("required")) {
  						if(value == "") showError(this,errMsg);
						else {
							// everything's OK
							$(this).css("border-color", "green");
						}
				}
					
				else if (validation.match("validate-number")) {
						if((isNaN(value)) || (value == "")) showError(this,errMsgNbr);
						else {
							// everything's OK
							$(this).css("border-color", "green");
						} 
				}
				else if (validation.match("validate-alpha")) {					
						if(!value.match(/^[a-zA-Z]+$/)) showError(this,errMsgAlpha);
						else {
							// everything's OK
							$(this).css("border-color", "green");
						} 
				}
				
				else if (validation.match("validate-alphanum")) {
						if(value.match(/\W/)) showError(this,errMsgAlphanum);
						else {
							// everything's OK
							$(this).css("border-color", "green");
						} 
				}
					
				else if (validation.match("validate-email")) {	
						if(!value.match(/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/)) showError(this,errMsgEmail);
						else {
							// everything's OK
							$(this).css("border-color", "green");
						} 
				}
				else if (validation.match("validate-url")) {					
						if(!value.match(/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i)) showError(this,errMsgUrl);
						else {
							// everything's OK
							$(this).css("border-color", "green");
						} 
				}					
					
				else { 
						if(value != ""){
							$(this).css("border-color", "green");	
						}
						
					}			}
			else {
				// Last possibility is the select (dropDown) list
				if (validation == "validate-select"){				
					if(value == "default") showError(this,errMsgSelect);
					else {
 						$(this).css("border-color", "green");
 					}
				}
			} 
 		}); // end input catch
 		
 		
 		checkedGroup = checkedGroup.split(',');
 		
 		for (i=0;i < checkedGroup.length;i++ ){
 			var exp = new RegExp(checkedGroup[i],"g");
 			allGroups = allGroups.replace(exp,"");
 		}
 		missingRadioGroup = allGroups.split(',');
 		
 		for(i=0;i < missingRadioGroup.length;i++){
 			$(":input.validate-one-required",formID).each(function() {
  				if ($(this).attr("name") == missingRadioGroup[i]){
 					//$(this).parent().css("color","red");
 					$('#err-'+$(this).attr("name")).remove();
 					$(this).parent().after('<div id="err-'+$(this).attr("name")+'" class="errMsg">'+errMsgRadio+'</div>');
 					$(".errMsg").slideDown("fast");
  					
  					// Block submittion
 					submitForm = false;
 				}
 			});
 		}
 		
 		// only if all fields are ok, the form will be submitted
 		if (submitForm) return true; 
 		else return false; 

});

	
	/*************** Useful functions **************/
	
	function showError(e,message){
	
		// Block submittion
	 	submitForm = false;
	 	
		$(e).css("border-color", "red");	
		
		if (focusError && !errorFocused) {
			errorFocused = true;
			$(e).focus();
		}
		
		if (showTxt) { 
		   $(e).after('<div class="errMsg">'+message+'</div>');
		   $(".errMsg").slideDown("fast"); 
		}
	
	}

} // end validate function

})(jQuery); 

