﻿/*
 * jQuery Form Validation plug-in version 1.1.6
 * Last Update : June 1, 2008
 * New features:
 *
 * Now works with jQuery 1.3+
 *
 * onError event
 * Add call back support - callback function is called when validation is error, return true form will be submited otherwise not.
 * Error list in the alert msg
 * Alias to field name
 * Select diff html attributes for validation rules instead off using custom html attributes
 *
 * Bug Fixed:
 * now support radio buttons
 * defval to work with LabelIn plugin
 * now support textarea
 *
 * Copyright (c) 2007 E-wave web design
 *   http://www.ewave.com.au/
 *
 * Licensed under the GPL license:
 *   http://www.gnu.org/licenses/gpl.html
 *
 * @requires jQuery v 1.2.1 or later
 * @name	formValidation
 * @usage		$('#form1').formValidation({
 *		newmask : /[0-9]{1}-[0-9]{1}/,	// 1-1
 *		err_class : "invalidInput"
 * });
 * 
 * HTML
 * <form id="form1">
 * <input id="input1" type="text" required="true" mask="email"></input>
 * <input id="input2" type="text" required="true" mask="email" equal="input2"></input>
 * <input type="submit" value="Submit>
 * </form>
 *
 * Description
 * Validate form fields accordiing to 4 keys
 * required - check that text field is not empty. checkbox checked, and select val is not empty
 * equal - checks that field value equal to another field with this id
 * mask - compre value to mask using reg exp
 * defval - ignore default value
 *
 * Prevent Submit and Display alert when not validate and change class of field to invalid class
 * 
 * @param String version
 * 	Plugin Version	
 * 
 * @param String err_class
 * 	invalid input class name	
 * 
 * @param String displayAlert
 * 	display alert when submit form is invalid	
 *  default true
 * 
 * @param String err_message
 * 	alert message	
 * 
 * @param reg-exp email
 * 	email pattern
 * 
 * @param reg-exp domain
 * 	domain pattern
 * 
 * @param reg-exp phone
 * 	phone pattern
 * 
 * @param reg-exp zip
 * 	zip pattern
 * 
 * @param reg-exp numeric
 * 	numeric pattern
 * 
 * @param reg-exp image
 * 	image file name pattern
 * 
 * @param reg-exp pdf
 * 	pdf file name pattern
 * 
 * @param alias, required, mask, equal, defval 
 * 	validation rules map to input attributes 
 * 
 */
if (!window.jQuery) {
	throw("jQuery must be referenced before using formValidation");
} else {
	
	(function() { 
		jQuery.fn.formValidation = function(settings, err_msgs) {
	
		var iForm = this;
		var err_list = '';
	
		settings = jQuery.extend({
			version				: '1.1.6',
			email					:	/^([\w.])+\@(([\w])+\.)[a-zA-Z0-9]{2,}/,
			domain				:	/^(http:\/\/)([\w]+\.){1,}[A-Z]{2,4}\b/gi,
			phone					:	/^\([2-9]\d{2}\)-\d{3}-\d{4}$/gi,
			zip						:	/^[0-9]{4,}$/gi,
			numeric				:	/^[0-9]+$/gi,
			image					:	/[\w]+\.(gif|jpg|bmp|png|jpeg)$/gi,
			ewvt					:	/[\w]+\.(htm|html|php|txt)$/gi,
			media					:	/[\w]+\.(avi|mov|mpeg|wmv)$/gi,
			pdf						:	/[\w]+\.(pdf)$/gi,
			enable				: false,
			err_class			: "invalidInput",
			err_list			: false,
			alias					:	'name',
			required			: 'required',
			mask					: 'mask',
			equal					: 'equal',
			defval				: 'defval',
			callback			:	'',
			err_message		: "Please fill all required fields! \n",
			display_alert	: true	//onsubmit if invalid form display an error message
		}, settings);
		
		err_msgs = jQuery.extend({ 
			required	: '',
			mask			: 'Invalid',
			equal			: 'is not equal to'
		}, err_msgs);
		
		return iForm.submit( function () {
				settings['enable'] = true;
				err_list = '';
				var frm = true;
				$(this).find("input:not([type='submit'],[type='reset'],:button), select, textarea").each(function() {
					ret = isValid($(this));
					if (!ret)
						frm = ret;
				});
				
				if (frm && (typeof settings['callback'] == 'string' && eval('typeof ' + settings['callback']) == 'function')) // form validation ok and callback function defined
					frm = eval(settings['callback'] + '()'); //call external validation function
				else if (settings['display_alert'])	// error validation and display alert on
						alert(settings['err_message'] + err_list);	// display message
						
				return frm;
			}).find("input:not([type='submit'],[type='reset'],:button), select, textarea").each(function() {
			$(this).bind('click change keyup focus blur',function() {
				isValid($(this));
			});
		});
			
		function isValid(obj) { // check if field is valid
			if (!settings['enable'])
				return true;
				
			if (required(obj) && mask(obj) && equal(obj)) {
				obj.removeClass(settings['err_class']);
				return true;
			} else {
				obj.addClass(settings['err_class']);
				return false;
			}
		}
		//field is required
		function required(obj) {						
			if (!(obj.attr(settings['required']) == "true"))	//if not required return true
				return true;
	
			if(obj.is(':checkbox:checked') || obj.is(':radio:checked'))
				return true;	
	
			if (obj.val() != '' && !defval(obj) && !obj.is(':radio') && !obj.is(':checkbox'))
				return true;	
	
			if (settings['err_list'])	
				err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['required'] + '\n';
				
			return false;
		}
		//compare field to mask provided in the extend array
		function mask(obj) { 
			tname = obj.attr('mask');	//read mask name from input field
			if (tname == undefined || obj.val() == '')
				return true;
	
			tmask = settings[obj.attr(settings['mask'])];	// get mask pattern from settings
			
			ret = tmask.test(obj.val());			//test reg exp
			ret1 = tmask.exec(obj.val());		
			if (ret)
				return true;
	
			if (settings['err_list'])
				err_list += '- ' + err_msgs['mask'] + ' "' + obj.attr(settings['alias']) + '"\n';
			
			return false;				
		}
		//copare field to another field read from the equal attribute
		function equal(obj) { 
			tname = obj.attr(settings['equal']);		//get comparison field
			tval = $('#'+tname).val();
			
			if (tname == undefined)
				return true;
			
			if (tval == obj.val())
				return true;
			
			if (settings['err_list'])	
				err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['equal'] + ' ' + $('#'+tname).attr('alias') + '\n';
			return false;
		}
		//compare field with defval attr, make sure that val was altered
		function defval(obj) { 
			tdefval = obj.attr(settings['defval']);		//get comparison field
			tval = obj.val();
			
			if (tdefval == undefined)
				return false;
			
			if (tval != tdefval)
				return false;
	
			return true;
		}
	}
	})(jQuery); 
}


/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function(a){var c=(a.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);a.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};a.fn.extend({caret:function(e,f){if(this.length==0){return}if(typeof e=="number"){f=(typeof f=="number")?f:e;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,f)}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",f);g.moveStart("character",e);g.select()}}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;f=this[0].selectionEnd}else{if(document.selection&&document.selection.createRange){var d=document.selection.createRange();e=0-d.duplicate().moveStart("character",-100000);f=e+d.text.length}}return{begin:e,end:f}}},unmask:function(){return this.trigger("unmask")},mask:function(j,d){if(!j&&this.length>0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y<h;y++){if(g[y]){m[y]=d.placeholder;var z=v(y);if(z<h&&g[y].test(m[z])){m[y]=m[z]}else{break}}}s();r.caret(Math.max(i,x))}function u(y){for(var A=y,z=d.placeholder;A<h;A++){if(g[A]){var B=v(A);var x=m[A];m[A]=z;if(B<h&&g[B].test(x)){z=x}else{break}}}}function l(y){var x=a(this).caret();var z=y.keyCode;n=(z<16||(z>16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(x<h){var A=String.fromCharCode(C);if(g[x].test(A)){u(x);m[x]=A;s();var y=v(x);a(this).caret(y);if(d.completed&&y==h){d.completed.call(r)}}}}}return false}function w(x,y){for(var z=x;z<y&&z<h;z++){if(g[z]){m[z]=d.placeholder}}}function s(){return r.val(m.join("")).val()}function p(y){var z=r.val();var C=-1;for(var B=0,x=0;B<h;B++){if(g[B]){m[B]=d.placeholder;while(x++<z.length){var A=z.charAt(x-1);if(g[B].test(A)){m[B]=A;C=B;break}}if(x>z.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}if(!y&&C+1<e){r.val("");w(0,h)}else{if(y||C+1>=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}p()})}})})(jQuery);
