

jQuery.fn.vrpSetupInputFilters = function() {

	/*  Bind Events For Integers  */
	jQuery(".integerInput").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterInteger(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'integerInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	jQuery(".integerInputNegative").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterIntegerNegative(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'integerInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	/*  Bind Events for Floats  */
	jQuery(".floatInput").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterFloat(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'floatInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	jQuery(".floatInputNegative").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterFloatNegative(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'floatInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	jQuery(".emailInput").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterEmail(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'emailInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	jQuery(".alphaInput").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterAlpha(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'alphaInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	jQuery(".alphaNumericInput").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterAlphaNumeric(e); },
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'alphaInput'); },
		focus: function(e) { return jQuery.fn.vrpHandleFocus(e.target); }
	});
	jQuery(".mustMatch").bind({ 
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'alphaInput'); }
	});
	jQuery(".tabFilterOnly").bind({
		keypress: function(e) { return jQuery.fn.vrpFilterNothing(e); }
	});
	jQuery(".dropDownColor").bind({
		blur: function(e) { return jQuery.fn.vrpHandleBlur(e.target,'dropDownColor'); },
		change: function(e) { return jQuery.fn.vrpHandleFocus(e.target,'dropDownColor'); }				
	});
};



//91 = ctrl-R in chrome

/*  Filter defintions  */
jQuery.fn.vrpFilterInteger = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var numcheck = /\D/;
	return !numcheck.test(keyVal);
};
jQuery.fn.vrpFilterIntegerNegative = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,45,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var numcheck = /\D/;
	return !numcheck.test(keyVal);
};
jQuery.fn.vrpFilterFloat = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,46,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var numcheck = /\D/;
	return !numcheck.test(keyVal);
};
jQuery.fn.vrpFilterFloatNegative = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,45,46,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var numcheck = /\D/;
	return !numcheck.test(keyVal);
};
jQuery.fn.vrpFilterAlpha = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var alphacheck = /[a-zA-Z]/;
	var symbolcheck = /[\ ]/;
	if (symbolcheck.test(keyVal)) return true;
	return alphacheck.test(keyVal);
};
jQuery.fn.vrpFilterAlphaNumeric = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var alphacheck = /\W/;
	var symbolcheck = /[\ \.\_\-]/;
	if (symbolcheck.test(keyVal)) return true;
	return !alphacheck.test(keyVal);
};
jQuery.fn.vrpFilterEmail = function(e) {
	var validCodes = [9,8,13,37,38,39,40,46,99,118];
	var key = e.which;  // Man I love jQuery
	var keyVal = String.fromCharCode(key);
	if (jQuery.inArray(key,validCodes) > -1 || e.keyCode == 9) return true;
	var numcheck = /\D/;
	var alphacheck = /[a-zA-Z]/;
	var symbolcheck = /[!#$%&'\*+\-\/=?\^_\.`~{|}!@]/;
	if (symbolcheck.test(keyVal)) return true;
	if (alphacheck.test(keyVal)) return true;
	else return !numcheck.test(keyVal);
};
jQuery.fn.vrpFilterNothing = function(e) {
	return true;
};

/*  Forward Delete = 46
	Delete = 8
	Up = 38
	Right = 39
	Down = 40
	Left = 37
 */





/* Underlying Functions  */

jQuery.fn.vrpHandleBlur = function(i,t) {	
	/*  If field is blank, give default value  */
	if (jQuery(i).val() == '') {
		jQuery(i).val(jQuery(i).attr('defaultvalue'));
		jQuery(i).removeClass('user_text scrape_text');
		jQuery(i).addClass('label_text');
	} else if (jQuery(i).attr('defaultvalue') != jQuery(i).val() ) { 
		jQuery(i).addClass('user_text');
	} else {
		jQuery(i).removeClass('user_text scrape_text');
		jQuery(i).addClass('label_text');
	}
	
	
	var error = '';
	
	/*  Check Bounds  */
	var hb = jQuery(i).attr('hasBounds');
	if (hb == 'true') {	
		var v = parseFloat(jQuery(i).val());
		var n = parseFloat(jQuery(i).attr('min'));
		var x = parseFloat(jQuery(i).attr('max'));
		if (n > v  || v > x) {
			error = 'Value outside of valid range. (' + n + '-' + x + ")";
			var fb = jQuery(i).attr("feedback");
			jQuery("#" + fb).html(error);
		}
	}  //  Has Bounds
	
	/*  Check RegExp  */
	if (jQuery(i).hasClass('emailInput')) {
		error = '';
		var val = jQuery(i).val();
		var emailcheck = /^[\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$/;
		if (!emailcheck.test(val)) error = 'Please enter a valid email address';
		var fb = jQuery(i).attr("feedback");
		jQuery("#" + fb).html(error);
		if (error == '') {  //  Check validity using ajax call if needed.
		var st = jQuery(i).attr("ajaxCall");
		if (jQuery(i).attr("ajaxCall") != '') {
				st += "('" + jQuery(i).attr("id") + "')";
				setTimeout(st,10);
			}
		}
	}
	if (jQuery(i).hasClass('alphaInput')) {
		var alphacheck = /\W{*}/;
		if (alphacheck.test(jQuery(i).val())) error = jQuery(i).attr('errorMessage');
		else error = '';
		if (error == '' && jQuery(i).hasClass('nonNull') && jQuery(i).val() == '') error = jQuery(i).attr('errorMessage');
		var fb = jQuery(i).attr("feedback");
		jQuery("#" + fb).html(error);
	}
	if (jQuery(i).hasClass('mustMatch')) {  //  Only mustMatch right now is password
		var v1 = jQuery(i).val();
		var e2 = jQuery(i).attr("matches");
		var v2 = jQuery("#" + e2).val();
		if (v1 != v2) error = jQuery(i).attr("matchErrorMessage");
		if (v2 == '') error = jQuery(e2).attr("nullMessage");
		if (v1 == '') error = jQuery(i).attr("nullMessage");
		var ee = jQuery(i).attr("feedback");
		jQuery("#" + ee).html(error);
	}
	
	//  If there's an error, add hasInputError to the input/feedback element's class
	if (error != '') {
		jQuery(i).addClass('hasInputError');
		var ed = "#" + jQuery(i).attr('feedback');
		jQuery(ed).addClass('hasInputError');
		if (jQuery(i).hasClass('mustMatch')) { 
			ed = "#" + jQuery(i).attr('matches');
			jQuery(ed).addClass('hasInputError');
		}
	}
	else {
		jQuery(i).removeClass('hasInputError');
		var ed = "#" + jQuery(i).attr('feedback');
		jQuery(ed).removeClass('hasInputError');
		if (jQuery(i).hasClass('mustMatch')) { 
			ed = "#" + jQuery(i).attr('matches');
			jQuery(ed).removeClass('hasInputError');
		}
	}
};


jQuery.fn.vrpHandleFocus = function(i) {
	/*  If field value is same as 'defaultvalue' then blank field,
		otherwise, select whole field. */
	if (jQuery(i).attr('defaultvalue') == jQuery(i).val() ) { 
		jQuery(i).val('');
	} else {
		jQuery(i).select();
	}
};



/*  IsInvalid Function
 *	----------------------------
 *  Input: array of field element IDs
 *  
 *	Required element attr's of each field element:
 *		pattern: RegExp to match
 *		invalid: Message to alert the user if non-matching
 *
 *	Returns:
 *		FALSE - If no problems exist
 *		String - Error messages separated by "\n"
 *******************************************/
jQuery.fn.vrpIsInvalid = function(fields) {

	var res = false;
	var rStr = '';
	jQuery.each(fields, function(k,v) {
	
		//  Does the element exist
		if (jQuery("#" + v).length !== 0) { 
			if (jQuery("#" + v).attr('type') == 'checkbox') {
				if (!jQuery("#" + v).is(':checked')) {
					var errr = jQuery("#" + v).attr('invalid');
					if (typeof(errr) === 'undefined' || errr === '') errr = 'Some other problem, too. (Err -1: Bad Programmer)';
					rStr += "\n" + errr;
				} 
			}
			else {
				//  Does it have a pattern
				var pattern = '';
				pattern = jQuery("#" + v).attr('pattern');
				if (typeof(pattern) !== 'undefined' && pattern !== '') {
					//  Does it have an error message
					var errr = jQuery("#" + v).attr('invalid');
					if (typeof(errr) === 'undefined' || errr === '') errr = 'Some other problem, too. (Err -1: Bad Programmer)';
					
					//  We have a couple of special patterns to use
					switch (pattern) {
						case 'filled':		//  
							if (jQuery("#" + v).attr('defaultvalue').length !== 0) {
								if (jQuery("#" + v).attr('defaultvalue') === jQuery("#" + v).val() ){
									rStr += "\n" + errr;
									jQuery("#" + v).addClass('validation_error');							
								}
								else {
									jQuery("#" + v).removeClass('validation_error');
								}
							}
							else {
								jQuery("#" + v).removeClass('validation_error');
							}
							break;
							
						default:
							var rExp = new RegExp(pattern);
							if (!rExp.test(jQuery("#" + v).val())) {
								rStr += "\n" + errr;
								jQuery("#" + v).addClass('validation_error');
							}
							else {
								if (jQuery("#" + v).attr('defaultvalue').length !== 0) {
									if (jQuery("#" + v).attr('defaultvalue') === jQuery("#" + v).val()) {
										rStr += "\n" + errr;
										jQuery("#" + v).addClass('validation_error');								
									}
									else {
										jQuery("#" + v).removeClass('validation_error');
									}
								}
								else {
									jQuery("#" + v).removeClass('validation_error');
								}
							}
							break;
					}
				}
			}
		}  //  end of extant check		
	});
	
	if (rStr !== '') res = rStr;
	return res;
};






/*  To handle deprecated filters  */
function setupFilters() {
	jQuery.fn.vrpSetupInputFilters();
}
