(function($){
		  
		  	function callbackFunc(){
		
		}
	
$.fn.extend({
			
		
		
		
		validify : function(options){
		
		var defaults = {
			callback: null,
			submitBtn: "submitbtn",
			errorClass: "error",
			errorMsg: "Please complete the required fields",
			statusElm: "p",
			statusClass: "error",
			highlightError: true
			
			};
			
		var options = $.extend(defaults,options);
	
	
		return this.each(function(){
				
			var obj = $(this);
			var errors = 0;
			
			//options.callback = function(){
			//	options.callback(result);
			//}
			
		//add status message to form
			obj.prepend('<' + options.statusElm + ' class="' + options.statusClass + '" id="status" style="display:none">' + options.errorMsg + '</' + options.statusElm + '>');
		
		
		
		//add click action to form submit button
		var submit_btn = $("#"+options.submitBtn,obj);
	
		$("#"+options.submitBtn,obj).bind("click",function(){
						validate();	
						return false;
		 });
		
		function validate(){
			reset_form();
			var allInputs = $(":input",obj);
		$(allInputs,obj).each(function(){
									 
		 validate_field(this);
			});
		
		
		form_status();
		if(errors==0){
			if(options.callback!=null){
				//console.log(options.callback);
		options.callback();
			} else {
				
			obj.submit();
		}
		}
		}
		
		
		
		function form_status(){
			if(errors>0){
				$("#status",obj).show();
			} else {
				$("#status",obj).hide();
			}
			}
		
		function reset_form(){
			errors = 0;
			$(".hl",obj).removeClass(options.errorClass);
			
			//add error messages to each field
		$(':input',obj).each(function(){	
				errorElm = "#"+$(this).attr("id")+"_error";
				
				$(errorElm).hide();				  
									  });
		}
		
		function validate_field(elm){
				//console.log(elm);
				// if field is required or is filled then validate
				if($(elm,obj).hasClass("required") || $(elm).val().length > 0 ){
					
				
					
				if($(elm).val()==""){
					
					not_empty(elm);
				
				}
				if($(elm,obj).hasClass("email")){
					email(elm);
				}
				if($(elm,obj).hasClass("alpha")){
					alpha(elm);
				}
				if($(elm,obj).hasClass("numeric")){
					numeric(elm);
				}
				if($(elm,obj).hasClass("alpha_numeric")){
					alpha_numeric(elm);
				}
				if($(elm,obj).hasClass("not_empty")){
					not_empty(elm);
				
				}
				if($(elm,obj).hasClass("password_match")){
						password_match(elm);
					}
					if($(elm,obj).hasClass("password")){
					password(elm);
				
				}
				if($(elm,obj).hasClass("username")){
					username(elm);
				}
				if($(elm,obj).hasClass("matching")){
					matching(elm);
				}
				if($(elm,obj).hasClass("telephone")){
					telephone(elm);
				}
				if($(elm,obj).hasClass("postcode")){
					postcode(elm);
				}
				if($(elm,obj).hasClass("checked")){
					checked(elm);
					
				}
				if($(elm,obj).hasClass("cc_start")){
					cc_start(elm);
				}
				if($(elm,obj).hasClass("email")){
					email(elm);
					
				}
				if($(elm,obj).hasClass("cc_expiry")){
					cc_expiry(elm);
				
				}
				if($(elm,obj).hasClass("cc_number")){
					cc_number(elm);
				}
				if($(elm,obj).hasClass("cc_security")){
					cc_security(elm);
				}
				if($(elm,obj).hasClass("cc_issue")){
					cc_issue(elm);
				}
				if($(elm,obj).hasClass("selected")){
					checked(elm);
				}
				}
		}
		
		
		function do_error(elm){
			if(options.highlightError==true){
		$(elm).parents("@[class='hl']").addClass(options.errorClass);
			} else {
				
				errorElm = "#"+$(elm).attr("id")+"_error";
				$(errorElm).show();
			}
			
			}
		
		function do_success(elm){
			
		}
					
					
		function email(elm){
	
			var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			 if ($(elm).val().match(filter)) {
			// do success
			
			 } else {
				 errors+=1;
				 do_error(elm);
				 
			 }
			}
			
			
		function alpha(elm){
			var filter =  /^[a-zA-z\s]+$/;
			if($(elm,obj).val().match(filter)){
			//do success
			} else {
			 errors+=1;
				 do_error(elm);
			}
		}
		
		function numeric(elm){
			var filter =  /^[-]?\d+(\.\d+)?$/;
			if($(elm,obj).val().match(filter) && $(elm,obj).val() > 0 ){
			//do success
			} else {
			 errors+=1;
				 do_error(elm);
			}
		}
		
		
		
		function alpha_numeric(elm){
	
			var filter =  /^[a-zA-Z0-9 ]+$/;
			if($(elm,obj).val().match(filter)){
			//do success
			} else {
				
			 errors+=1;
				 do_error(elm);
			}
		}
		
		function not_empty(elm){
			if($(elm,obj).val().length > 2){
				//do success
		} else {
			 errors+=1;
			do_error(elm);
		}
		}
		
		function password(elm){
			var filter = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\>)+]/;
			if($(elm,obj).val().match(filter)){
				//do success
			} else{
				 errors+=1;
				 do_error(elm);
			}
		}
		
		function username(elm){
			var filter = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\>)+]/;
			if($(elm,obj).val().match(filter)){
				//do success
			} else{
				 errors+=1;
				 do_error(elm);
			}
		}
			
		function matching(elm){
			var matchField = $(elm).attr("id").append("_2");
			if($(elm,obj).val()==$(matchField,obj).val()){
				//do success
				}else{
				 errors+=1;
				 do_error(elm);
				}
		}
		
		function telephone(elm){
			var tel = $(elm).val().replace(" ","");
			var filter = /^([0-9]{11})$/;
			if($(elm,obj).val().match(filter)){
				//do success
			} else{
				 errors+=1;
				 do_error(elm);
			}
		}
		
		function postcode(elm){
		var pc = $(elm,obj).val().replace(" ","");
		var filter  = /^([A-Za-z]{1,2})([0-9]{2,3})([A-Za-z]{2})$/;
		if($(elm,obj).val().match(filter)){
				//do success
			} else{
				 errors+=1;
				 do_error(elm);
			}
		}
		
		function password(elm){
			var filter =  /^[a-zA-Z0-9]+$/;
			if($(elm,obj).val().match(filter)){
			//do success
			} else {
			errors+=1;
				 do_error(elm);
			}
			
		}
		
		function password_match(elm){
			var id = $(elm).attr("id");
			var matchField = "#"+id+"_confirm";
			//var matchField = $(elm).attr("id").append("_confirm");
			
			if($(elm,obj).val()!=$(matchField,obj).val()){
				//console.log("error");
				 errors+=1;
			 do_error(elm);
				}
				}
		
		function checked(elm){
			var group = $(elm,obj).attr("name");
			if($('input[@name='+group+']:checked').size() > 0){
			//do success
			} else {
				 errors+=1;
				 do_error(elm);;
			}
			}
			
			
		function cc_issue(elm){
			
		var val = $(elm,obj).val();
		var filter = /^[0-9]{1,3}$/;
		if(val.match(filter) && val >= 1){
			//success
		} else {
			errors+=1;
			do_error(elm);
		}
		}
			
		function cc_security(elm){
			
			var val = $(elm,obj).val();
			var filter = /^[0-9]{3,3}$/;
			if(val.match(filter) && val >= 1){
				//success
			} else {
			errors+=1;
			do_error(elm);
		}
		}
		
		function cc_number(elm){
	
			var cardNo = $(elm,obj).val().replace(" ","");
			var filter = /^[0-9]{13,19}$/;
			if(cardNo.match(filter)){
				//success
			} else {
			errors+=1;
			do_error(elm);
		}
		}
		
		function cc_start(elm){
			
		
	//- get todays date
		var today = new Date();
		var thisMonth = today.getMonth()+1;
		var thisYear = today.getFullYear();
		
		
		var month = $("#"+elm.id+"_month");
		var year = $("#"+elm.id+"_year");
		
		
		if(month.val()>0 || year.val()>0){
			var startMonth = month.val();
			var startYear = year.val();
			
			if(startYear > thisYear || startYear == thisYear && startMonth > thisMonth){
				errors+=1;
			
			do_error(elm);
			}
		}
		}
		
	function cc_expiry(elm){
	
		var today = new Date();
		var thisMonth = today.getMonth()+1;
		var thisYear = today.getFullYear();
		var month = $("#"+elm.id+"_month");
		var year = $("#"+elm.id+"_year");
			var expiryMonth = month.val();
			var expiryYear = year.val();
		
			if(expiryYear == thisYear && expiryMonth < thisMonth){
			
				errors+=1;
				do_error(elm);
			}
	}
	
	
	
		
		function selected(elm){
			if($(elm).selectedIndex > 0){
				//do success
			} else {
				 errors+=1;
				 do_error(elm);
			}
		}
		
		});
		}
});

})(jQuery);