/**
 * @requires jquery.js
 * @author Aaron Birchler <aaron@aaronbirchler.com>
 */
(function($){
	
	$.fn.invalidFieldClass = 'invalid';
	$.fn.invalidFormClass = 'invalid';
	$.fn.requiredFieldClass = 'required';
	$.fn.intFieldClass = 'int';
	$.fn.floatFieldClass = 'float';
	$.fn.emailFieldClass = 'email';
	$.fn.phoneFieldClass = 'phone';
	$.fn.urlFieldClass = 'url';
	$.fn.zipFieldClass = 'zipcode';
	$.fn.invalidLabelClass = 'invalid';
	
	$.fn.ttt = function(){
		this.each(function(){
		});
		return $(this);
	};
	
	$.fn.makeInvalid = function(){
		$(this).each(function(){
			$(this).addClass($.fn.invalidFieldClass);
			$(this).data('valid', false);
			var lbl = $(this).fieldLabel();
			if(lbl) $(lbl).addClass($.fn.invalidLabelClass);
		});
		return $(this);
	}
	
	$.fn.makeValid = function(){
		$(this).each(function(){
			$(this).removeClass($.fn.invalidFieldClass);
			$(this).data('valid', true);
			var lbl = $(this).fieldLabel();
			if(lbl) $(lbl).removeClass($.fn.invalidLabelClass);
		});
		return $(this);
	}
	
	$.fn.validateField = function(){
		this.each(function(){
			
			var isInvalid = (!this.value && $(this).hasClass($.fn.requiredFieldClass));
			if($(this).hasClass($.fn.intFieldClass) && this.value && !this.value.match(/^-?[0-9]+$/)) isInvalid = true;
			if($(this).hasClass($.fn.floatFieldClass) && this.value && !this.value.match(/^-?[0-9]+(\.[0-9]*)?$/)) isInvalid = true;
			if($(this).hasClass($.fn.zipFieldClass) && this.value && !this.value.match(/^[0-9]{5}(-[0-9]{4})?$/)) isInvalid = true;
			if($(this).hasClass($.fn.emailFieldClass) && this.value && !this.value.match(/^[^@]+@.+\.[a-z]{2,}$/)) isInvalid = true;
			if($(this).hasClass($.fn.urlFieldClass) && this.value && !this.value.match(/^(https?:\/\/)?[a-zA-Z\-_\.]+\.[a-z]{2,}$/)) isInvalid = true;
			
			if(isInvalid){
				$(this).makeInvalid();
			}
			else{
				$(this).makeValid();
			}
		});
		return $(this);
	}
	
	$.fn.checkValidation = function(){
		this.each(function(){
			var isValid = true;
			var fields = $(this).find("input[type=text],input[type=password],input[type=checkbox],input[type=radio],textarea,select");
			var n = fields.length;
			for (var i=0; i<n; i++){
				if (!$(fields[i]).data('valid')){
					isValid = false;
				}
			}
			
			if(isValid){
				$(this).removeClass($.fn.invalidFormClass);
				$(this).find("input[type=submit],input[type=image]").removeAttr('disabled');
				$(this).data('valid', true);
			}
			else{
				$(this).addClass($.fn.invalidFormClass);
				$(this).find("input[type=submit],input[type=image]").attr('disabled', 'disabled');
				$(this).data('valid', false);
			}
		});
		return $(this);
	}
	
	$.fn.validateForm = function(){
		this.find("input[type=text],input[type=password],textarea").keyup(function(){
			$(this).validateField();
			$(this).parents("form").checkValidation();
		});
		this.find("input[type=text],input[type=password],input[type=checkbox],input[type=radio],textarea,select").change(function(){
			$(this).addClass('touched');
			var lbl = $(this).fieldLabel();
			if(lbl) $(lbl).addClass('touched');
			$(this).validateField();
			$(this).parents("form").checkValidation();
		});
		this.find("input[type=text],input[type=password],input[type=checkbox],input[type=radio],textarea,select").validateField();
		$(this).checkValidation();
		
		$(this).submit(function(){
			$(this).addClass('touched');
			$(this).checkValidation();
			var v = $(this).data('valid');
			if (!v){
				if(this.invalidFormCallback)this.invalidFormCallback();
			}
			return v;
		});
		return $(this);
	};
	
	$.fn.disableForm = function(){
		$(this).find("input[type=submit]").each(function(){
			$(this).attr('disabled', 'disabled');
		});
		return $(this);
	}
	
	$.fn.fieldLabel = function(){
		var eid = $(this[0]).attr('id');

		var lbl = $("label[for="+eid+"]")[0];
		
		if(!lbl){
			lbl = $(this[0]).parents("label")[0];
		}
		return lbl;
	}
	
})(jQuery);

$(document).ready(function()
{
    $("input[type=text], textarea").ttt();
    $("form.validate").each(function(){
    	this.invalidFormCallback = function(){
    		alert("Sorry!\nThis form contains invalid values.");
    	};
    });
    $("form.validate").validateForm().disableForm();
    $("input.confirm").click(function(){
    	if(this.confirmCallback) return this.confirmCallback();
    }).each(function(){
    	this.confirmCallback = function(){
    		return confirm('Are you sure you want to do that?')
    	};
    });    
});
