/*
 * jQuery Form Validation plug-in version 1.1.3
 * Last Update : June 09, 2008
 * New features:
 * 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:
 * 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 
 * 
 */
(function() { 
	jQuery.fn.formValidation = function(form, settings, err_msgs) {

	    var iForm = $(form);
	    var err_list = '';

	    settings = jQuery.extend({
		    version			: '1.1.2',
		    email			: /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})/,
		    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',
		    defval			: 'defval',
		    err_message		: "Please fill all required fields! (Marked with red background colour)\n",
		    display_alert	: true,	//onsubmit if invalid form display an error message,
		    group           : 'group'
	    }, settings);
    	
	    err_msgs = jQuery.extend({ 
		    required	: 'is required',
		    mask			: 'Invalid',
		    equal			: 'is not equal to'
	    }, err_msgs);
    	
	    return this.each(function(){if(this._formValidation)return;s++;this._formValidation=s;
    	
	    H[s] = {c:$.extend(settings, settings),e:$.extend(err_msgs, err_msgs),s:s};
    });};

    $.fn.validateForm=function(){this.each(function(){return $.formValidation.validate(this._formValidation)});};

    $.formValidation = {
	    hash:{},	
	    validate:function (a) {
			    var _h = H[a];
			    _h.c['enable'] = true;
			    err_list = '';
			    var frm = true;
			    /*iForm.find('*').filter("input, select, textarea").each(function() {
				    ret = isValid($(this));
				    if (!ret)
					    frm = ret;
			    });*/
			    $('body').find('*').filter("input, select, textarea").each(function() {
			        if ($(this).attr('group') == _h.c['group'])
			        {
			            var e = _h.s;
				        $(this).click(function() {
					        isValid($(this), e);
				        }).change(function() {
					        isValid($(this), e);
				        }).keyup(function() {
					        isValid($(this), e);
				        }).focus(function() {
					        isValid($(this), e);
				        }).blur(function() {
					        isValid($(this), e);
				        });

				        ret = isValid($(this), e);
				        if (!ret)
					        frm = ret;
			        }
			    });
			    if (!frm && _h.c['display_alert'])
				    alert(_h.c['err_message'] + err_list);
    				
			    return frm;
	    }
    };
    
		
	function isValid(obj, a) { // check if field is valid
		var _h = H[a];
		if (!_h.c['enable'])
			return true;
			
		if (required(obj, s) && mask(obj, s) && equal(obj, s)) {
			obj.removeClass(_h.c['err_class']);
			return true;
		} else {
			obj.addClass(_h.c['err_class']);
			return false;
		}
	}
	//field is required
	function required(obj, a) {
		var _h = H[a];
		if (!(obj.attr(_h.c['required']) == "true"))	//if not required return true
			return true;

		if(obj.is("input[@type=checkbox]")) {		//if checkbox and checked
			var jobj = document.getElementById(obj.attr('id'));	
			if (jobj.checked)
				return true;
		} else if((obj.is("input") || obj.is("select") || obj.is("textarea")) && (!obj.is("button"))) // if not empty
			if (obj.val() != '' && (!(defval(obj, a))))
				return true;
		


		if (_h.c['err_list'])	
			err_list += '- "' + obj.attr(_h.c['alias']) + '" ' + _h.e['required'] + '\n';
			
		return false;
	}
	//compare field to mask provided in the extend array
	function mask(obj, a) { 
		var _h = H[a];
		tname = obj.attr('mask');	//read mask name from input field
		if (tname == undefined || obj.val() == '')
			return true;

		tmask = _h.c[obj.attr(_h.c['mask'])];	// get mask pattern from settings
		
		ret = tmask.test(obj.val());			//test reg exp
		ret1 = tmask.exec(obj.val());		
		if (ret)
			return true;

		if (_h.c['err_list'])
			err_list += '- ' + _h.e['mask'] + ' "' + obj.attr(_h.c['alias']) + '"\n';
		
		return false;				
	}
	//copare field to another field read from the equal attribute
	function equal(obj, a) { 
		var _h = H[a];
		tname = obj.attr(_h.c['equal']);		//get comparison field
		tval = $('#'+tname).val();
		
		if (tname == undefined)
			return true;
		
		if (tval == obj.val())
			return true;
		
		if (_h.c['err_list'])	
			err_list += '- "' + obj.attr(_h.c['alias']) + '" ' + _h.e['equal'] + ' ' + $('#'+tname).attr('alias') + '\n';
		return false;
	}
	//compare field with defval attr, make sure that val was altered
	function defval(obj, a) { 
		var _h = H[a];
		tdefval = obj.attr(_h.c['defval']);		//get comparison field
		tval = obj.val();
		
		if (tdefval == undefined)
			return false;
		
		if (tval != tdefval)
			return false;

		return true;
	}
	
	var s=0,H=$.formValidation.hash;

})(jQuery);