$(document).ready(function(){
 var options = {
  	email_error_message: '<br>not a valid email address',
  	text_error_message: '<br>must be text only',
  	number_error_message: '<br>not a valid number',
  	date_error_message: '<br>not a valid date',
  	required_error_message: '<br>is a required field',
	select_error_message: '<br>not a valid selection',
  	date_format: "dd/mm/yyyy"
  };
	$("form.validate").submit(function(){
		$(this).find(".error").remove();
        var valid=true;
		var presubmit = $(this).find("input[type='submit']").attr("value");
		$(this).find("input[type='submit']").attr("value","Please Wait..");
		$(this).find("input[type='submit']").attr("disabled","true");
		
        $(this).find(".validate").each(function(){
          el = $(this);
          if(el.hasClass("valid-email")) {
            if(!valid_email(el.val())) {
              add_error(el, options.email_error_message);
              valid=false;
            }
          }
          if(el.hasClass("valid-date")) {
            if(!valid_date(el.val(), options.date_format)) {
              add_error(el, options.date_error_message);
              valid=false;
            }
          }
          if(el.hasClass("valid-required")) {
            if(!valid_required(el.val())) {
              add_error(el, options.required_error_message);
              valid=false;
            }
          }
          if(el.hasClass("valid-number")) {
            if(!valid_number(el.val())) {
              add_error(el, options.number_error_message);
              valid=false;
            }
          }
		  if(el.hasClass("valid-select")) {
		  	if (!valid_select(el.val())) {
				add_error(el,options.select_error_message);
				valid=false;
		  	}
		  }
        });
		if (!valid)
		{
			$(this).find("input[type='submit']").attr("value",presubmit);
			$(this).find("input[type='submit']").removeAttr('disabled'); 
		}
        return valid;
      });
      
    function add_error(el, message) {
    el.after("<span class='error'>"+message+"</span>");
  }
  
  function valid_email(email) {
    var email_pattern  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    if(email.match(email_pattern)) return true;
    return false;
  };
  
  function valid_number(number) {
    var number_pattern = /^([0-9\s])+$/;
    if(number.match(number_pattern)) return true;
    return false;
  };
  
  function valid_required(val) {
    if(val.length>0) return true;
    return false;
  }
  
  function valid_select(val){
  	if (val!=0)
		return true;
	else
		return false;
  }
  function valid_date(date_passed, date_format) {
    if(date_format == "mm/dd/yyyy") var date_pattern  = /(0[1-9]|1[012])+\/(0[1-9]|[12][0-9]|3[01])+\/(19|20)\d\d/;
    if(date_format == "dd/mm/yyyy") var date_pattern  = /(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/(19|20)\d\d/;
    if(date_passed.match(date_pattern)) return true;
    return false;
  };
});

