//###########################################
// jQuery Form Validation
// A Parry 2006
//
// This JS only validates, and passes the result to a function "showStatus" - which 
// can be overwritten on a field-by-field basis id necc.
//
// Fields are added to the validator object to either validate onBlur
// or to be stored and validated later (or a mix of both)
//
// example calls
//  <script type="text/javascript">
//    validator.init(function(){
//      $(document).ready(function() {
//        $('#username').validate("{'type':'blur','validation':'notnull'}");
//        $('#email').validate("{'type':'store', 'validation':'email'}");
//        $('#something').validate("{'type':'store', 'validation':'postcode'}");
//        $('#check').validate("{'type':'checkall','callback':'showStatus2'}");
//      });
//    });
//  </script>
//
//###########################################

if(mam == undefined) var mam = {};
if(mam.validator == undefined) mam.validator = {};
mam.validator = new function() {
  
  jQuery.extend(this, {
      getValidationRegex: function() {
        return validationRegex;
      },
      store: function(o,data) {
        validation[validation.length] = {o:o,data:data};
      },
      clear: function(o,data) {
        validation = [];
      },
      validateAll: function(data) {
        var o = [];
		// alert(validation.length);
		var allValid = true;
        $.each(validation, function(i) {
			var valid = mam.validator.validate(this.o,this.data);
			if(!valid) allValid = false;
            // o[this.o.attr("id")] = mam.validator.validate(this.o,this.data);
        });
		if(allValid) {
			data.success(o);
		} else {
			data.fail(o);
		}
        return allValid;
      },
      validate: function(o,data) {
		  	var v = validationRegex[data.validation];
			var value;
			var valid = false;
			// alert(o.attr("type"));
			switch(o.attr("type")) {
				case "radio":
					var name = o.attr("name");
					// alert($("input[@name="+name+"][@checked]").size());
					value = $("input[@name="+name+"][@checked]").val();
					break;
				default:
					value = o.val();
			}
			// alert(value);
			if (value == null) value = ""; // handle nulls
			valid = value.match(v);
			if(valid) {
				data.success(o);
			} else {
				data.fail(o);
			}
			return valid;
      }
  });

  var validation = [];
  var validationRegex = {
	  ddmmccyy: '(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/(19|20)\d\d',
	  email: '^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$',
	  dd: '^[0-2]?[0-9]$|^3[0-1]$',
	  mm: '^0?[1-9]$|^1[0-2]$',
	  yy: '^[0-9]{4}$',
	  postcode: '[a-zA-Z]\d\s?\d[a-zA-Z]{2}|[a-zA-Z]\d{2}\s?\d[a-zA-Z]{2}|[a-zA-Z]{2}\d\s?\d[a-zA-Z]{2}|[a-zA-Z]{2}\d{2}\s?\d[a-zA-Z]{2}|[a-zA-Z]\d[a-zA-Z]\s?\d[a-zA-Z]{2}|[a-zA-Z]{2}\d[a-zA-Z]\s?\d[a-zA-Z]{2}|[a-zA-Z]{3}\s?\d[a-zA-Z]{2}',
	  zipcode: '^(\d{5}-\d{4})|(\d{5})$',
	  notnull: '^.+'
  };
  var performValidation = function(o,v) {
    var status="fail";
    if (o.val().match(v)) status = "pass";
	var d = {
		id: o.attr("id"),
		status: status
	};
	return(d);
  };
};

jQuery.fn.validate = function(d) {
	var data = {
		event: "blur",
		validation: "notnull",
		store: false, // store for validation later (when a check all is executed)
		checkAll: false, // valiate all stored fields
		success: function(o) {},
		fail: function(o) {}
	}; // defaults 
	jQuery.extend(data, d);

	var self = this;

	if(data.store) {
		mam.validator.store($(this),data);
	};
	var eventFunction = function() {
			if(data.checkAll) {
				return mam.validator.validateAll(data);
			} else {
				return mam.validator.validate($(this),data);
			}
	};
	self.unbind(data.type.toLowerCase());
	self.bind(data.type.toLowerCase(), eventFunction);
};

