// jQuery.Validate 1.3    3/10/2009
// Author: John Norton - jnorton@amplifystudios.com
// This version works best with jquery 1.3.2
(function($){
	$.fn.Validate = function(f, options){
		var $f = (f==null) ? '' : f;
		var settings = jQuery.extend({
				useSummary:		false,
				useStyles:		true,
				useTitles:		false,
				summaryStyle:	'validation-summary',
				messageStyle:	'validation-message',
				summaryId:		'vsummary-',
				messageId:		'vmessage-',
				validationTag:	'ul',
				itemCallback:	function(){return;},
				formCallback:	function(){return;},
				validateOnBlur: false
		},options||{});
		$(document).ready(function(){
			$f = $f!='' ? '[name='+$f+']' : '';
			$('form'+$f).bind('submit', function(){return $.fn.Validate.doValidation(this);});
			if(settings.validateOnBlur)
				$('form'+$f+' input[validate*=]:not(input:radio), form'+$f+' textarea[validate*=]').bind('blur', function(){return $.fn.Validate.validateItem(this.form,this);});
		});
		$.fn.Validate.doValidation = function(f){
			r = true;
			fr = f.name != '' ? '[name='+f.name+']' : '';
			if($('#'+settings.summaryId+f.name))
				$('#'+settings.summaryId+f.name).remove();
			$.each($('form'+fr+' input[validate*=]:not(input:radio), form'+fr+' textarea[validate*=]'), function(o){
				vo = $.fn.Validate.validateItem(f, this);
				if(!vo)
					r = false;
			});
			//For now radio buttons need to be done a different way so we ignore them above and do them here
			prdo = ' ';
			$.each($('form'+fr+' input[validate*=]:radio'), function(o){
				$(this).removeClass('validation-passed, validation-failed');
				$(this).addClass((this.checked ? 'validation-passed' : 'validation-failed'));
				if(this.checked)
					prdo += this.name+' ';
			});
			$.each($('form'+f+' input[validate*=]:radio'), function(o){
				$.fn.Validate.validateRdoItem(f, this);
			});
			//end radio script
			if(r)
				settings.formCallback();
			return r;
		}
		$.fn.Validate.validateRdoItem = function(f, o){
			if($('#'+settings.messageId+f.name+'-'+o.name))
				$('#'+settings.messageId+f.name+'-'+o.name).remove();
			if(prdo.match(' '+o.name+' ') == null)
				$.fn.Validate.doReport(f, $('input[name='+o.name+']:radio:last'), 'Please select a radio button.');
		}
		$.fn.Validate.validateItem = function(f, o){
			vo = true;
			$(o).removeClass('validation-passed, validation-failed');
			if($('#'+settings.messageId+f.name+'-'+o.name))
				$('#'+settings.messageId+f.name+'-'+o.name).remove();
			var validators = [['empty', function(o){return o.value=='';}, 'Please enter some text in this field.'],
							  ['checked', function(o){return !o.checked;}, 'It is required that you check this check box.'],
							  ['alpha', function(o){return !o.value.match(/^[a-zA-Z]+$/);}, 'Please use letter only. For example Sketchy.'],
							  ['decimal', function(o){return !o.value.match(/^[0-9]+$/);}, 'Please use decimal numbers only. For example 42.'],
							  ['number', function(o){return !o.value.match(/^[-]?([1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|\.[0-9]{1,2})$/);}, 'Please use numbers only. For example -1.5.'],
							  ['email', function(o){return !o.value.match(/^\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/);}, 'Please enter a valid email address. For example john@somedomain.com.'],
							  ['phone', function(o){return !o.value.match(/^[01]?[- .]?\(?(?!\d[1]{2})[2-9]\d{2}\)?[- .]?(?!\d[1]{2})\d{3}[- .]?\d{4}$/);}, 'Please enter a valid US/Canada phone number. For example (603) 555-5555.'],
							  ['postal', function(o){return !o.value.match(/^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$/);}, 'Please enter a valid US/Canada postal code. For example 03102.'],
							  ['date', function(o){return !o.value.match(/^([0-1][0-9])\/([0-3][0-9])\/(\d{4})$/);}, 'Please enter a valid date. For example 07/03/1987.']];
			for(var i=0;i<validators.length;i++)
			{
				if($.fn.Validate.hasValidator(o, validators[i][0])&&validators[i][1](o)){
					$.fn.Validate.doReport(f, o, validators[i][2]);
					vo = false;
				}
			}
			if($(o).attr('validate').match(/regex\[([^\s]*)\]/)){ //create your own validator!!! validate-[REGEX]
				x = this.value.match($(o).attr('validate').match(/regex\[([^\s]*)\]/)[1]);
				if(x==null){
					$.fn.Validate.doReport(f, o, 'Please match the information specified.');
					vo = false;
				}
			}
			if(settings.useStyles)
				$(o).addClass((vo ? 'validation-passed' : 'validation-failed'));
			if(vo)
				settings.itemCallback();
			return vo;
		}		
		$.fn.Validate.doReport = function(f, o, m){
			if(!settings.useSummary)
				$.fn.Validate.writeMessage(f, o, m);
			else
				$.fn.Validate.writeuseSummary(f, o, m);
		}
		$.fn.Validate.writeMessage = function(f, o, m){	
			$(o).after('<'+settings.validationTag+' class="'+settings.messageStyle+'" id="'+settings.messageId+f.name+'-'+$(o).attr('name')+'">'+(settings.validationTag=='ul' ? '<li>' : '')+(settings.useTitles==false ? m : o.title)+(settings.validationTag=='ul' ? '</li>' : '')+'</'+settings.validationTag+'>');
		}
		$.fn.Validate.writeuseSummary = function(f, o, m){
			if($('#'+settings.summaryId+f.name).attr('class')==null)
				$(f).prepend('<'+settings.validationTag+' class="'+settings.summaryStyle+'" id="'+settings.summaryId+f.name+'"></'+settings.validationTag+'>');
			$('#'+settings.summaryId+f.name).append('<'+(settings.validationTag=='ul' ? 'li' : settings.validationTag)+' id="'+settings.messageId+f.name+'-'+$(o).attr('name')+'">'+(settings.useTitles==false ? m : o.title)+'</'+(settings.validationTag=='ul' ? 'li' : settings.validationTag)+'>');
		}
		$.fn.Validate.hasValidator = function(o, s){
			s = ' '+s+' ';
			v = ' '+$(o).attr('validate')+' ';
			return (v.match(s) == null) ? false : v.match(s);
		}
	};
})(jQuery);