(function($) {
  
  $.fn.validate = function(args) {

  	/* Load the default options. */
  	var options = $.extend({}, $.fn.validate.defaults, args);
    var jQ = jQuery;
    return this.each(function() {
      /***** Plugin Goes Here *********/
      jQ(this).submit(function(){
        jQ(this).find(".error").remove();
        $('#popupErrorText').empty();
        var valid=true;
        
        jQ(this).find(".validate").each(function(){
          el = jQ(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-1")) {
            if(!valid_select_gte1(el[0].selectedIndex)) {
              add_error(el, options.select1_error_message);
              valid=false;
            }
          }
          if(el.hasClass("valid-checked")) {
            if(!valid_checked(el[0].checked)) {
              add_error(el, options.checked_error_message);
              valid=false;
            }
          }
          if(el.hasClass("valid-confirm")) {
            if(!valid_confirm(el)) {
              add_error(el, options.confirm_error_message);
              valid=false;
            }
          }
          if(el.hasClass("valid-required-if-1")) {
              if(!valid_required_if(el.val(), options.valid_if_1)) {
                add_error(el, options.required_error_message);
                valid=false;
              }
          }
          if(el.hasClass("valid-required-if-2")) {
              if(!valid_required_if(el.val(), options.valid_if_2)) {
                add_error(el, options.required_error_message);
                valid=false;
              }
          }
          if(el.hasClass("valid-select-1-if-1")) {
              if(!valid_select_gte1_if(el[0].selectedIndex, options.valid_if_1)) {
                add_error(el, options.select1_error_message);
                valid=false;
              }
          }
          if(el.hasClass("valid-select-1-if-2")) {
              if(!valid_select_gte1_if(el[0].selectedIndex, options.valid_if_2)) {
                add_error(el, options.select1_error_message);
                valid=false;
              }
          }
        });
        if (!valid) {
        	centerPopupError();
        	loadPopupError();
        }
        	
        return valid;
      });
       
    });
  
  };
  
  function trim12(str) {
		var	str = str.replace(/^\s\s*/, ''),
			ws = /\s/,
			i = str.length;
		while (ws.test(str.charAt(--i)));
		return str.slice(0, i + 1);
  }
  
  function add_error(el, message) {
	  if (el[0].title && el[0].title != "")
		  $('#popupErrorText').append("<div class='error'>"+el[0].title+" "+message+"</div>");
	  else
		  $('#popupErrorText').append("<div class='error'>"+message+"</div>");
	  $('#popErrorTitle').html("An error has occured");
  }
  
  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) {
	var s = trim12(val);  
    if(s.length>0) return true;
    return false;
  }
  
  function valid_select_gte1(val) {
    if(val>=1) return true;
    return false;
  }
	  
  function valid_checked(val) {
	  return val? 1 : 0;
  }
		  
  function valid_confirm(el) {
	  var cid = "#" + el.attr("id") + "Confirm";
	  var e2 = el.parent().find(cid);
      if (e2 && (e2.val() == el.val()))
    	  return true;
	  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;
  };
  
  function valid_required_if(val, f) {
	if (!f || !f()) return true;
	  
	var s = trim12(val);  
	if(s.length>0) return true;
	return false;
  }
		  
  function valid_select_gte1_if(val, f) {
	if (!f || !f()) return true;
		  
    if(val>=1) return true;
    return false;
  }
		  
  $.fn.validate.defaults = {
  	email_error_message: 'is not a valid email address',
  	text_error_message: 'must be text only',
  	number_error_message: 'is not a valid number',
  	date_error_message: 'is not a valid date',
  	required_error_message: 'is a required field',
  	select1_error_message: 'must be a valid selection',
  	confirm_error_message: 'fields do not match',
  	checked_error_message: 'field must be selected',
  	date_format: "dd/mm/yyyy"
  };
  
})(jQuery);


