﻿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.2',
			email					:	/^([\w.])+\@(([\w\-])+\.)[a-zA-Z0-9]{2,}/,
			domain				:	/^(http:\/\/)([\w]+\.){1,}[A-Z]{2,4}\b/gi,
			phone					:	/^\+[0-9]{1,3}\.[1-9]{1,2}\.[0-9]{6,}$/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',
			notequal			: 'notequal',
			morethan			: 'morethan',
			selectvalue		: 'selectvalue',
			defval				: 'defval',
			callback			:	'',
			trigger       : '',
			err_message		: "Please fill all required fields! (Marked with red background colour)\n",
			display_alert	: true	//onsubmit if invalid form display an error message
		}, settings);
		
		err_msgs = jQuery.extend({ 
			required	: 'is required',
			mask			: 'Invalid',
			equal			: 'is not equal to',
			equal			: 'is required'
		}, err_msgs);
		
		return iForm.submit( function () {
		    if (((settings['trigger']) && typeof settings['trigger'] == 'string' && eval('typeof (' + settings['trigger']+')') == 'function'))
		    { 
					eval(settings['trigger'] + '()');
				}
				settings['enable'] = true;
				err_list = '';
				var frm = true;
				$(this).find('*').filter("input, 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'] && !frm)	// error validation and display alert on
						alert(settings['err_message'] + err_list);	// display message
				return frm;
			}).find('*').filter("input, select, textarea").each(function() {
			$(this).click(function() {
				isValid($(this));
			}).change(function() {
				isValid($(this));
			}).keyup(function() {
				isValid($(this));
			}).focus(function() {
				isValid($(this));
			}).blur(function() {
				isValid($(this));
			});
		});
			
		function isValid(obj) { // check if field is valid
			if (!settings['enable'])
				return true;
			if (required(obj) && mask(obj) && equal(obj) && notequal(obj) && morethan(obj) && selectvalue(obj)) {
			  var ec = obj.attr('err_selector');
			  if(ec == undefined)
			  {
				  obj.removeClass(settings['err_class']);
				}
				else
				{
				  if(ec == 'parent')
			    {
  				  $(obj).parent().removeClass(settings['err_class'])
		      }
				}
				return true;
			} else {
			  var ec = obj.attr('err_selector');
			  if(ec == undefined)
			  {
				  obj.addClass(settings['err_class']);
				}
				else
				{
				  if(ec == 'parent')
			    {
  				  $(obj).parent().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("input") || obj.is("select") || obj.is("textarea")) && (!obj.is("button")))
          { // if not empty
				    if (obj.val() != '' && (!(defval(obj))))	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(settings['alias']) + '"\n';
			return false;
		}
		function notequal(obj) { 
			tname = obj.attr(settings['notequal']);		//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['notequal'] + '\n';
			return false;
		}
		function morethan(obj) { 
			tname = obj.attr(settings['morethan']);		//get comparison field
			tval = obj.val();
			if (tname == undefined)
				return true;
			tval = parseInt(tval);
			tname=parseInt(tname);
			if (isNaN(tname))
				return true;
			if (!isNaN(tval) && tval > tname)
				return true;
			
			if (settings['err_list'])	
				err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['morethan'] + '\n';
			return false;
		}
		function selectvalue(obj) { 
			tname = obj.attr(settings['selectvalue']);		//get comparison field
			tval = obj.val();
			if (tname == undefined || tname!='true')
				return true;
			tval = parseInt(tval);
			if (!isNaN(tval) && tval >=0 )
				return true;
			
			if (settings['err_list'])	
				err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['morethan'] + '\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); 
}