(function($) {

$.validate = {

	_obj: 'form',
	_submitBtn: 'submit_btn',	
	_errors: 0,
	
	
		
/* ------------------------- Public Methods ------------------------------------------------------------------ */
	
	_init: function(elm,submitBtn,callback){
		
	
	$.validate._obj = elm;
		
	$.validate._submitBtn = submitBtn;
		
		
		$(submitBtn).click(function(){
	/*	$.validate._validate(function(result){
	if(callback) callback(result);
	}
	);
	*/
		$.validate._validate();
	
	
	
		return false;
										})
		
	},
	
	
/* --------------------------- Private Methods ---------------------------------------------------------------- */

	_validate: function(callback){
	
		
		var allInputs = $(":input",$.validate._obj);
		
		
		$(".error-box").remove();
		$.validate._errors = 0;
		
		$(allInputs,$.validate._obj).each(function(){
			$.validate._resetField(this);
			$.validate._validateField(this);
			});
		
		
		if($.validate._errors == 0){
			
			// - form ok, do callback
			
			if(callback) {
			callback(true);
			
			} else {
			//console.log($.validate._obj.attr("action"));
				//console.log("SUBMIT"+$.validate._obj);
			($.validate._obj).submit();	
			}
			
			
		} else {
		
			// - show form errors
			var fields="";
		$(allInputs,$.validate._obj).each(function(){
			
			
			if($(this).hasClass("error")){
				
			fields+='<li>'+ $(this).attr("title") + '</li>';
			}
			 })
		
			$($.validate._obj).before('<div class="error-box"><h3>Please correct the following fields and submit:</h3><ul>'+fields+'</ul></div>');
			
		}
		
	},
	
/* ------------------------------------------------------------------------------------------- */	

	_highlightField: function(elm){
	
		$(elm,$.validate._obj).addClass("error");
		
		
	},
	
/* ------------------------------------------------------------------------------------------- */	

	_resetField: function(elm){
		
		$(elm,$.validate._obj).removeClass("error");
		
		
	},
	
/* ------------------------------------------------------------------------------------------- */	

	_validateField: function(elm){
		
		var obj = $.validate._obj;
		
		if($(elm,obj).hasClass("required") || $(elm,obj).val().length > 0 ){
		
			if($(elm,obj).hasClass("email")){
					$.validate._email(elm);
				
				}
				
			if($(elm,obj).hasClass("alpha")){
					$.validate._alpha(elm);
				}
				
			if($(elm,obj).hasClass("numeric")){
					$.validate._numeric(elm);
				}
				
			if($(elm,obj).hasClass("alphaNumeric")){
					$.validate._alphaNumeric(elm);
				}
			
			if($(elm,obj).hasClass("notEmpty")){
			
					$.validate._notEmpty(elm);
				}
				
			if($(elm,obj).hasClass("passwordMatch")){
					$.validate._passwordMatch(elm);
					}
					
			if($(elm,obj).hasClass("password")){
					$.validate._password(elm);
				}
				
			if($(elm,obj).hasClass("username")){
					$.validate._username(elm);
				}
				
			if($(elm,obj).hasClass("matching")){
					$.validate._matching(elm);
				}
				
			if($(elm,obj).hasClass("telephone")){
					$.validate._telephone(elm);
				}
				
			if($(elm,obj).hasClass("postcode")){
					$.validate._postcode(elm);
				}
				
			if($(elm,obj).hasClass("checked")){
					$.validate._checked(elm);
				}
				
			if($(elm,obj).hasClass("ccStart")){
					$.validate._ccStart(elm);
				}
				
			if($(elm,obj).hasClass("email")){
					$.validate._email(elm);
				}
			if($(elm,obj).hasClass("emailMatch")){
					$.validate._emailMatch(elm);
				}
			
			if($(elm,obj).hasClass("ccExpiry")){
					$.validate._ccExpiry(elm);
				}
				
			if($(elm,obj).hasClass("ccNumber")){
					$.validate._ccNumber(elm);
				}
				
			if($(elm,obj).hasClass("ccSecurity")){
					$.validate._ccSecurity(elm);
				}
				
			if($(elm,obj).hasClass("ccIssue")){
					$.validate._ccIssue(elm);
				}
				
			if($(elm,obj).hasClass("selected")){
					$.validate._selected(elm);
				}
				
			if($(elm,obj).hasClass("checked")){
					$.validate._checked(elm);
				}
		}
	},

/* ------------------------------------------------------------------------------------------- */	

	_email: function(elm){
	
			var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			 if ($(elm,$.validate._obj).val().match(filter)) {
			// do success
			
			 } else {
				 	
					$.validate._errors +=1;
				 	$.validate._highlightField(elm);
			 }
			},
			
/* ------------------------------------------------------------------------------------------- */	

	_alpha:	function alpha(elm){
			var filter =  /^[a-zA-z\s]+$/;
			if($(elm,$.validate._obj).val().match(filter)){
			//do success
			} else {
			$.validate._errors +=1;
				$.validate._highlightField(elm);
			}
		},
		
/* ------------------------------------------------------------------------------------------- */		
		
	_numeric: function(elm){
		
			var filter =  /^[-]?\d+(\.\d+)?$/;
			if($(elm,$.validate._obj).val().match(filter)  && $(elm,$.validate._obj).val()!="" ){
			//do successconsole.log("ok");
			} else {
				
			$.validate._errors +=1;
				$.validate._highlightField(elm);
			}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
		
	_alphaNumeric: function(elm){
	
			var filter =  /^[a-zA-Z0-9 ]+$/;
			if($(elm,$.validate._obj).val().match(filter)){
			//do success
			} else {
				
			$.validate._errors +=1;
			$.validate._highlightField(elm);
			}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
		_notEmpty: function(elm){
			
			if($(elm,$.validate._obj).val().length > 2){
		} else {
			$.validate._errors +=1;
			$.validate._highlightField(elm);
		}
	
				
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
		_password: function(elm){
			//var filter = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\>)+]/;
			
			var filter = /^[a-zA-Z0-9.@_-]{3,15}$/;
			if($(elm,$.validate._obj).val().match(filter)){
				//do success
			} else{
				$.validate._errors +=1;
					$.validate._highlightField(elm);
			}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
	_username: function(elm){
	
		var filter = /^[a-zA-Z0-9.-_]{3,100}$/;
		//var filter = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])\w{6,}$/; 
			//var filter = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\>)+]/;
			if($(elm,$.validate._obj).val().match(filter)){
				//do success
			} else{
				$.validate._errors +=1;
					$.validate._highlightField(elm);
			}
		},
		
/* ------------------------------------------------------------------------------------------- */	
			
	_matching: function(elm){
			var matchField = $(elm).attr("id").append("_2");
			if($(elm,$.validate._obj).val()==$(matchField,$.validate._obj).val()){
				//do success
				}else{
				$.validate._errors+=1;
					$.validate._highlightField(elm);
				}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
	_telephone: function(elm){
			var tel = $(elm,$.validate._obj).val().replace(" ","");
			var filter = /^([0-9]{11})$/;
			if($(elm,$.validate._obj).val().match(filter)){
				//do success
			} else{
					$.validate._errors +=1;
						$.validate._highlightField(elm);
			}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
	_postcode: function(elm){
		var pc = $(elm,$.validate._obj).val().replace(" ","");
		var filter  = /^([A-Za-z]{1,2})([0-9]{2,3})([A-Za-z]{2})$/;
		if($(elm,$.validate._obj).val().match(filter)){
				//do success
			} else{
				$.validate._errors +=1;
					$.validate._highlightField(elm);
			}
		},
		

		
/* ------------------------------------------------------------------------------------------- */	
		
	_passwordMatch: function(elm){
			var id = $(elm,$.validate._obj).attr("id");
			var matchField = "#"+id+"_confirm";
			//var matchField = $(elm).attr("id").append("_confirm");
			
			if($(elm,$.validate._obj).val()!=$(matchField,$.validate._obj).val()){
			
			$.validate._errors +=1;
				$.validate._highlightField(elm);
				}
				},
				
/* ------------------------------------------------------------------------------------------- */	
		
	_emailMatch: function(elm){
			var matchElm = $(elm,$.validate._obj).attr("name").replace("_confirm","");
			var emailField = $('input[name='+matchElm+']');
			if($(elm,$.validate._obj).val()!=$(emailField,$.validate._obj).val()){
				$.validate._errors +=1;
				$.validate._highlightField(elm);
				}
				},
				
/* ------------------------------------------------------------------------------------------- */	
		
	_checked: function(elm){
			var group = $(elm,$.validate._obj).attr("name");
			if($('input[@name='+group+']:checked').size() > 0){
			//do success
			} else {
				 	$.validate._errors +=1;
						$.validate._highlightField(elm);
			}
			},
			
/* ------------------------------------------------------------------------------------------- */	
			
			
	_ccIssue: function(elm){
			
		var val = $(elm,$.validate._obj).val();
		var filter = /^[0-9]{1,3}$/;
		if(val.match(filter) && val >= 1){
			//success
		} else {
				$.validate._errors +=1;
					$.validate._highlightField(elm);
		}
		},
		
/* ------------------------------------------------------------------------------------------- */	
			
	_ccSecurity: function(elm){
			
			var val = $(elm,$.validate._obj).val();
			var filter = /^[0-9]{3,3}$/;
			if(val.match(filter) && val >= 1){
				//success
			} else {
			$.validate._errors +=1;
				$.validate._highlightField(elm);
		}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
	_ccNumber: function(elm){
	
			var cardNo = $(elm,$.validate._obj).val().replace(" ","");
			var filter = /^[0-9]{13,19}$/;
			if(cardNo.match(filter)){
				//success
			} else {
			$.validate._errors +=1;
				$.validate._highlightField(elm);
		}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
	_ccStart: function(elm){
			

		
	//- get todays date
		var today = new Date();
		var thisMonth = today.getMonth()+1;
		var thisYear = today.getFullYear();
		
		var month_obj = elm;
		
		var year_obj_name = $(month_obj).attr("name").replace('month','year');
		var year_obj = $('select[name='+year_obj_name+']',$.validate._obj);
		
		
		if($(month_obj).val()>0 || $(year_obj).val()>0){
			var startMonth = $(month_obj).val();
			var startYear = $(year_obj).val();
		
			if(startYear > thisYear || startMonth<1 || startYear < 1 || startYear == thisYear && startMonth > thisMonth){
			$.validate._errors +=1;
				$.validate._highlightField(month_obj);
				$.validate._highlightField(year_obj);
			}
		}
		},
		
/* ------------------------------------------------------------------------------------------- */	
		
	_ccExpiry: function(elm){
	
		var today = new Date();
		var thisMonth = today.getMonth()+1;
		var thisYear = today.getFullYear();
		var month_obj = elm;
	
		var year_obj_name = $(month_obj).attr("name").replace('month','year');
		var year_obj = $('select[name='+year_obj_name+']',$.validate._obj);
			var expiryMonth = $(month_obj).val();
			var expiryYear = $(year_obj).val();
		
			if(expiryYear == thisYear && expiryMonth < thisMonth){
			$.validate._errors +=1;
				$.validate._highlightField(month_obj);
				$.validate._highlightField(year_obj);
			}
	},
	
/* ------------------------------------------------------------------------------------------- */		
	
		
	_selected: function(elm){
			if($(elm,$.validate._obj).val > 0){
				//do success
			} else {
				$.validate._errors +=1;
					$.validate._highlightField(elm);
			}
		}
		
/* ------------------------------------------------------------------------------------------- */	
	
						
}


jValidate = function(elm,submitBtn,callback){
	$.validate._init(elm,submitBtn,callback);
};

})(jQuery);