/* ## ^LICENSE AND CREDITS ####################################################### **

--- jQuery Form Validation Plugin
--- Copyright (c) 2007 Adrienne L. Travis

--- Dependencies
	Depends on the jQuery library (obviously!) 
		- Tested with version 1.1.3 and 1.2.2.
	Depends on library.stringparsing.js.
		
--- Licensing
	Dual licensed under the MIT and GPL licenses:
	http://www.opensource.org/licenses/mit-license.php
	http://www.gnu.org/licenses/gpl.html

--- Release History
	2008/06/04 - Version 0.98
		Added setting to allow for buttons to scroll or not scroll (separate for reset and submit, default true)
	2008/04/15 - Version 0.97
		Added setting to allow for #errors div to be in HTML instead of dynamically added (default false)
		Added setting to allow for submit button to be disabled (default false)
		Added scrolling to #errors div when there is an error
		Improved handling of onchange/onblur validation
	2008/02/05 - Version 0.95
		Added setting to trim leading/trailing space before validation (default true)
		Added textarea required capability
	2007/10/05 - Version 0.9
		First public release

** ############################################################################### */
 
/* ## ^MINIFIED CODE ############################################################# */

jQuery.fn.validateForm=function(settings){settings=jQuery.extend({changeval:true,errorposition:"inside",reqtext:"This field cannot be left blank!",reqselect:"This field cannot be left blank!",reqtextarea:"This field cannot be left blank!",timeformat:24,defaultTitle:true,trimspaces:true,errorblockpresent:false,disablesubmit:false,submitscroll:true,resetscroll:true},settings);return this.each(function()
{var validated=new Object;if(settings.errorposition=="outside"){if(settings.errorblockpresent==false){jQuery(this).prepend('<div id="errors"></div>');}
jQuery("#errors").hide();}
if(settings.changeval===true){jQuery("input[type=text]").add("input[type=password]").change(function(){var myid=jQuery(this).attr("id");$.valUtils.removeError(myid,settings.errorposition);validated[myid]=$.valUtils.fieldVal(myid,'format',settings.timeformat,settings.reqtext,settings.trimspaces);if(validated[myid]['errors']>0){$.valUtils.addError(myid,validated[myid]['text'],settings.errorposition,settings.defaultTitle);}
else{jQuery(this).attr("value",validated[myid]['text']);}
if(settings.disablesubmit==true&&jQuery("#errors").not(":hidden")){jQuery(":submit").attr("disabled","disabled");}
else{jQuery(":submit").removeAttr("disabled");}});jQuery(".required").blur(function(){var myid=jQuery(this).attr("id");$.valUtils.removeError(myid,settings.errorposition);if($(this).is("select")){validated[myid]=$.valUtils.fieldNonTextVal(myid,settings.reqselect);}
else if($(this).is("textarea.required")){validated[myid]=$.valUtils.fieldNonTextVal(myid,settings.reqtextarea);}
else{validated[myid]=$.valUtils.fieldVal(myid,'format',settings.timeformat,settings.reqtext,settings.trimspaces);}
if(validated[myid]['errors']>0){$.valUtils.addError(myid,validated[myid]['text'],settings.errorposition,settings.defaultTitle);}
else{jQuery(this).attr("value",validated[myid]['text']);}
if(settings.disablesubmit==true&&jQuery("#errors").not(":hidden")){jQuery(":submit").attr("disabled","disabled");}
else{jQuery(":submit").removeAttr("disabled");}});}
jQuery(":reset").click(function(){jQuery.valUtils.removeError('ALL',settings.errorposition);jQuery("#errors").hide();var toff=jQuery(this).parents("form").offset().top;toff=toff-20;if(settings.resetscroll==true){jQuery('html,body').animate({scrollTop:toff},700);}});jQuery(this).submit(function(){jQuery.valUtils.removeError('ALL',settings.errorposition);jQuery("input[type=text]").add("input[type=password]").add("select.required").add("textarea.required").each(function(){var myid=jQuery(this).attr("id");if($(this).is("input")){validated[myid]=$.valUtils.fieldVal(myid,'parse',settings.timeformat,settings.reqtext,settings.trimspaces);}
else if($(this).is("select")){validated[myid]=$.valUtils.fieldNonTextVal(myid,settings.reqselect);}
else if($(this).is("textarea")){validated[myid]=$.valUtils.fieldNonTextVal(myid,settings.reqtextarea);}
if(validated[myid]['errors']>0){$.valUtils.addError(myid,validated[myid]['text'],settings.errorposition,settings.defaultTitle);}
else{jQuery(this).attr("value",validated[myid]['text']);}});var valerrors=0;for(var i in validated){valerrors=valerrors+=validated[i].errors;}
if(valerrors>0){if(settings.errorposition=="outside"){var toff=jQuery("#errors").offset().top;}else
{var toff=jQuery(this).offset().top;}
if(settings.submitscroll==true){jQuery('html,body').animate({scrollTop:toff},700);}
return false;}});});}
jQuery.valUtils={fieldVal:function(myid,parsetype,timeformat,reqtxt,trimspaces){var myval=jQuery("#"+myid).attr("value");if(trimspaces==true){myval=jQuery.trim(myval);}
var valobj=new Object;valobj.errors=0;valobj.text="";var pat="";for(var i in thePatterns)
{if(jQuery("#"+myid).is(".val-"+i)){pat=i;}}
if(jQuery("#"+myid).is(".required")&&!myval){valobj.errors=1;valobj.text=reqtxt;if(pat!=""){var tmp="("+thePatterns[pat].errortxt+".)";tmp=tmp.replace("Invalid","Must be a valid");valobj.text+=tmp;}}
var myin=new Object;if(myval&&myval!=""){if(pat){if(parsetype=="format"){myin=myval.thisFormat(pat);}
else if(parsetype=="parse"){myin=myval.thisParse(pat);}
if(pat=="time"&&timeformat==12){myin.parsed=thePatterns.time.settwelvehour(myval);}}
else{myin.parsed=myval;myin.isvalid=true;}
valobj.text=myin.parsed;}
if(valobj.text!=""&&!myin.isvalid){valobj.errors=1;}
return valobj;},fieldNonTextVal:function(myid,reqtxt){var myval=jQuery("#"+myid).val();var valobj=new Object;valobj.errors=0;valobj.text=myval;if(jQuery("#"+myid).is(".required")){if(!myval||myval==-1){valobj.text=reqtxt;valobj.errors=1;}}
return valobj;},addError:function(myid,errortxt,position,deftitle){var mylabel="";if(deftitle==true){if(jQuery("#"+myid).attr("title")){mylabel=jQuery("#"+myid).attr("title");}
else if(jQuery("#"+myid).is("input")||jQuery("#"+myid).is("textarea")){mylabel=jQuery("#"+myid).parent("label").text();}
else if(jQuery("#"+myid).is("select")){jQuery("#"+myid).parent("label").clone().attr("id","tempclone").appendTo("body").hide();jQuery("#tempclone select option").remove();mylabel=jQuery("#tempclone").text();jQuery("#tempclone").remove();}}
else{if(jQuery("#"+myid).is("input")){mylabel=jQuery("#"+myid).parent("label").text();}
else if(jQuery("#"+myid).is("select")){jQuery("#"+myid).parent("label").clone().attr("id","tempclone").appendTo("body").hide();jQuery("#tempclone select option").remove();mylabel=jQuery("#tempclone").text();jQuery("#tempclone").remove();}
if(!mylabel||mylabel==""){mylabel=jQuery("#"+myid).attr("title");}}
jQuery("#"+myid).parent("label").addClass("inputerror");if(position=="inside"){jQuery("#"+myid).before('<span class="errorlabel">'+errortxt+"</span>");return true;}
else if(position=="outside"){jQuery("#errors").append('<label class="errorlabel" for="'+myid+'"><span class="erroritem">'+mylabel+'</span> <strong class="errortext">'+errortxt+"</strong></label>");jQuery("#errors").show();return true;}
else{return false;}},removeError:function(myid,position){if(myid=="ALL"){jQuery(".errorlabel").remove();jQuery("label.inputerror").removeClass("inputerror");if(position=="outside"&&jQuery("#errors").text()==""){jQuery("#errors").hide();}}
else{jQuery("#"+myid).parent("label").removeClass("inputerror");if(position=="inside"){jQuery("#"+myid).parent("label").children(".errorlabel").remove();return true;}
else if(position=="outside"){jQuery("label.errorlabel[@for="+myid+"]").remove();if(jQuery("#errors").text()==""){jQuery("#errors").hide();}
return true;}
else{return false;}}}};




