// jQuery.Validate 1.4    12/3/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',
				watermarkStyle:	'validation-watermark',
				summaryId:		'vsummary-',
				messageId:		'vmessage-',
				validationTag:	'ul',
				itemCallback:	function(){return;},
				formCallback:	function(){return;},
				validateOnBlur: false, //!DEPRICATED! Replaced with onBlur.
				onBlur: false,
				watermark: false
		},options||{});
		$(function() {
			$f = $f!='' ? '[name="'+$.fn.Validate.escN($f)+'"]' : '';
			$('form'+$f).bind('submit', function(){return $.fn.Validate.doValidation(this);});
			if(settings.watermark) {
				$.each($('form input[watermark], form textarea[watermark]'), function() {
					$(this).val($(this).attr('watermark')).addClass(settings.watermarkStyle).bind('focus', function() {
							if($(this).val() == $(this).attr('watermark')) $(this).val('').removeClass(settings.watermarkStyle);
						}).bind('blur', function() {
							if($(this).val() == '') $(this).val($(this).attr('watermark')).addClass(settings.watermarkStyle);
						});
				});
			}
			if(settings.onBlur || settings.validateOnBlur) {
				$('form'+$f+' input[validate], 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="'+$.fn.Validate.escN(f.name)+'"]' : '';
			if($('#'+$.fn.Validate.escN(settings.summaryId+f.name)))
				$('#'+$.fn.Validate.escN(settings.summaryId+f.name)).remove();
			$.each($('form input[validate], form textarea[validate]'), function(o){
				vo = $.fn.Validate.validateItem(f, this);
				if(!vo)
					r = false;
			});
			if(r)
				settings.formCallback();
			return r;
		}
		$.fn.Validate.validateItem = function(f, o){
			vo = true;
			$(o).removeClass('validation-passed, validation-failed');
			if($(o).val() == $(o).attr('watermark') && settings.watermark) $(o).val('').removeClass(settings.watermarkStyle);
			if($('#'+settings.messageId+$.fn.Validate.escN($(f).attr('name'))+'-'+$.fn.Validate.escN(o.name))) $('#'+settings.messageId+$.fn.Validate.escN($(f).attr('name'))+'-'+$.fn.Validate.escN(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.']];
			l = validators.length;
			for(i=0;i<l;i++)
			{
				if($.fn.Validate.hasValidator(o, validators[i][0])&&validators[i][1](o)){
					$.fn.Validate.doReport(f, o, validators[i][2]);
					if($(o).val() == '' && settings.watermark) $(o).val($(o).attr('watermark')).addClass(settings.watermarkStyle);
					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.');
					if($(o).val() == '' && settings.watermark) $(o).val($(o).attr('watermark')).addClass(settings.watermarkStyle);
					vo = false;
				}
			}
			if(settings.useStyles)
				$(o).addClass((vo ? 'validation-passed' : 'validation-failed'));
			if(vo)
				settings.itemCallback();
			if(settings.watermark) {
				if($(o).val() == '') $(this).val($(o).attr('watermark')).addClass(settings.watermarkStyle);
			}
			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).attr('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+$.fn.Validate.escN(f.name)).attr('class')==null)
				$(f).prepend('<'+settings.validationTag+' class="'+settings.summaryStyle+'" id="'+settings.summaryId+$(f).attr('name')+'"></'+settings.validationTag+'>');
			$('#'+settings.summaryId+$.fn.Validate.escN(f.name)).append('<'+(settings.validationTag=='ul' ? 'li' : settings.validationTag)+' id="'+settings.messageId+$(f).attr('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);
		}
		$.fn.Validate.escN = function(n){
			a = new Array('#', ';', '&', ',', '.', '+', '*', '~', '\'', ':', '"', '!', '^', '$', '[', ']', '(', ')', '=', '>', '|', '/');
			l = a.length;
			for(i=0;i<l;i++){
				n = n.replace(a[i], '\\'+a[i]);
			}
			return n;
		}
	};
})(jQuery);