$.fn.validate = function() {
	
	var er = 0;
	var errorClass = 'form-validate-error';
    var defaultMsg = 'This field is required';
    var selectors  = !arguments[0] ? ".required input[type='text'], .required input[type=password], .required select" : arguments[0];
    $('.'+errorClass,this).remove();

    // Not empty validation
    $(selectors,this).each(function (i) {
    	var valid = true; 
		var v = this.value;
		switch($(this).attr('class')){
			case "validate-zip":
				valid = validate_zip(v);
				break;
			case "validate-checked":
				valid = validate_checked(this);
				break;			
			case "validate-email":
				valid = validate_email(v);
				break;
			default:
				valid = validate_empty(v);
				break;
		}
		if(!valid){
			var msg  = ($(this).attr('title') !== undefined) ? $(this).attr('title') : defaultMsg;
			var html = '<span class="'+errorClass+'">'+msg+'</span>';
			$('#'+this.id).after(html);
			er++; 
		} else {
			$('#'+this.id).removeClass(errorClass);
		}
	});
	if (er) {
		return false;
	}else{
		return true;
	}
	
	/* validation methods */
	function validate_zip(v) {
		return (validate_numeric(v) && v.length == 5) ? true : false; 
	}		
	function validate_numeric(v){
		return (isNaN(v) == false && validate_empty(v)) ? true : false; 
	}
	function validate_email(v) {
		var reg = new RegExp('^[^@()<>,;:\\\\/"[\\]]+@[^@()<>,;:\\\\/"[\\]]+\\.[a-zA-Z0-9]{2,6}$','');
		return (v.match(reg)) ? true : false;
	}	
	function validate_empty(v) {
		return (v !== '') ? true : false; 
	}
	function validate_checked(obj) {
		return ($(obj)[0].checked == true) ? true : false; 
	}
}

