﻿/* 
 *
 * 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
 * 
 */
if (!window.jQuery) {
	throw("jQuery must be referenced before using formValidation");
} else {
	
	(function() { 
		jQuery.fn.wesForm = function(settings, err_msgs) {

		var jForm = 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,	// show errors immediately, or on submit?
			err_class				: "invalid",
			err_list				: false,
			alias					: 'name',
			required				: 'required',
			mask					: 'mask',
			equal					: 'equalTo',
			defval					: 'Please select...',
			err_message				: "Please check that all fields are entered correctly (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'
		}, err_msgs);

		return jForm.submit( function () {
			settings['enable'] = true;
			err_list = '';
			var valid = true;
			$(this).find('*').filter("input, select, textarea").each(function() {
				if (!isValid($(this))) valid = false;
			});

			if (valid) {	// form validation ok 

				jForm.hide(3000);
				$('formWrapper').addClass('loading');

				var inputs = jForm.serialize();

				jQuery.ajax({
					data: inputs,
					url: this.getAttribute('action'),
					timeout: 2000,
					error: function() {
						console.log("Failed to submit");
					},
					success: function(response) {
						$('#formWrapper').html("<div id='message'></div>");
						$('#message').html(response)
						.hide()
						.show(1500); 

//						.fadeIn(1500, function() {
//							$('#message').append("<img id='checkmark' src='images/check.png' />");
//						});
					}
				});

				return false;

			} else if (settings['display_alert']) {	// error validation and display alert on
				alert(settings['err_message'] + err_list);	// display message
			}

			return false; // so we stay on the same page

		}).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)) {
				obj.removeClass(settings['err_class']);
				return true;
			} else {
				obj.addClass(settings['err_class']);
				return false;
			}
		}

		//field is required
		function required(obj) {
			if (!(obj.hasClass(settings['required'])))	//if not required return true (ie. field is valid regardless)
				return true;
	
			if(obj.is("input[@type=checkbox]") || obj.is('input[@type=radio]')) {		//if checkbox and checked	
				if (obj.attr('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))))
					return true;

			if (settings['err_list'])	
				err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['required'] + '\n';

			return false;
		}

		//compare field to regexp key in the extend array
		function mask(obj) { 
			if (!(obj.hasClass('email')||obj.hasClass('domain')||obj.hasClass('phone')||obj.hasClass('zip')||obj.hasClass('numeric') ))	// email, domain, phone, zip, numeric
				return true;
				
//			CLEAN UP				// get mask pattern from settings
			if (obj.hasClass('email')) tmask = settings['email'];
			if (obj.hasClass('domain')) tmask = settings['domain'];
			if (obj.hasClass('phone')) tmask = settings['phone'];
			if (obj.hasClass('zip')) tmask = settings['zip'];
			if (obj.hasClass('numeric')) tmask = settings['numeric'];
			
			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;				
		}

		//compare field to another field to determine if the two are the same
		function equal(obj) { 
			tname = obj.hasClass(settings['equal']);		//get comparison field
//			...then parse "equal[value]" for value
			
			return true; // just return true for now
			
			
			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 true; // false;
		}

		//compare field with default (defval) to make sure that the val was indeed 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); 
}
