var Jel=Base.extend({},{version:1});Jel.Lang={KEY:"en.us",DATE_FORMAT:"m/d/Y",DATE_12_FORMAT:"m/d/Y g:i A"};Jel.Lang.String={PLURAL_SPECIAL:{datum:"data",sheep:"sheep",deer:"deer",foot:"feet",tooth:"teeth",person:"people",crisis:"crises",child:"children",woman:"women",man:"man",stimulus:"simuli",fungus:"fungii",half:"halves",knife:"knives",life:"lives",lead:"leaves",calf:"calves",kilo:"kilos",piano:"pianos",radio:"radios",index:"indices",fish:"fish","passer-by":"passers-by",formula:"formulae"},PLURAL_SUFFIX_REPLACE:{y:"ies",o:"oes",s:"ses",sh:"shes",ss:"sses",z:"zes",x:"xes",ch:"ches","in-law":"s-in-law"}};Jel.Lang.Date={DAYS:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],DAYS_SHORT:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],MONTHS:["January","February","March","April","May","June","July","August","September","October","November","December"],MONTHS_SHORT:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],MONTHS_LCASE:["january","february","march","april","may","june","july","august","september","october","november","december"],MONTHS_SHORT_LCASE:["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]};Jel.Lang.FormValidator={TERM_INCLUSIVE:"inclusive",ERRORS_TITLE:"Please correct the following errors:",TYPE_TEMPLATE:{INT:"whole number (no letters, symbols, commas, or decimal places)",INT_POSITIVE:"positive whole number (no letters, symbols, commas, or decimal places)",INT_NEGATIVE:"negative whole number (no letters, symbols, commas, or decimal places)",FLOAT:"number, including decimal places (no letters, symbols or commas)",FLOAT_POSITIVE:"positive number, including decimal places (no letters, symbols or commas)",FLOAT_NEGATIVE:"negative number, including decimal places (no letters, symbols or commas)",NUMERIC:"number (no letters, symbols, or commas)",NUMERIC_POSITIVE:"positive number (no letters, symbols, or commas)",NUMERIC_NEGATIVE:"negative number (no letters, symbols, or commas)",DATE:"date",TIME:"time"},VALUE_TEMPLATE:{RANGE:"between [lower] and [upper][inclusive]",EQ:"equal to [compare]",NEQ:"different to [compare]",GT:"greater than [compare]",LT:"less than [compare]",GE:"greater than or equal to [compare]",LE:"less than or equal to [compare]"},VALUE_TEMPLATE_DATE:{RANGE:"between [lower] and [upper][inclusive]",EQ:"equal to [compare]",NEQ:"different to [compare]",GT:"after [compare]",LT:"before [compare]",GE:"after or on [compare]",LE:"before or on [compare]"},VALUE_TEMPLATE_TIME:{RANGE:"between [lower] and [upper][inclusive]",EQ:"equal to [compare]",NEQ:"different to [compare]",GT:"after [compare]",LT:"before [compare]",GE:"after or at [compare]",LE:"before on at [compare]"}};Jel.Lang.FormValidator.ERRORS={REQUIRED:"[field_label]must be provided",REQUIRED_SELECT:"[field_label]must be selected",REQUIRED_CHECKBOX:"[field_label]must be indicated",REQUIRED_RADIO:"[field_label]must be selected",LENGTH_GT:"[field_label]must contain more than [compare] characters",LENGTH_GE:"[field_label]must contain at least [compare] characters",LENGTH_LT:"[field_label]must contain less than [compare] characters",LENGTH_LE:"[field_label]must contain no more than [compare] characters",LENGTH_EQ:"[field_label]must contain exactly [compare] characters",LENGTH_EQ:"[field_label]must not contain exactly [compare] characters",LENGTH_RANGE:"[field_label]must contain between [lower] and [upper] characters [inclusive]",INT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT,INT_POSITIVE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT_POSITIVE,INT_NEGATIVE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT_NEGATIVE,FLOAT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT,FLOAT_POSITIVE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT_POSITIVE,FLOAT_NEGATIVE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT_NEGATIVE,NUMERIC:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC,NUMERIC_POSITIVE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC_POSITIVE,NUMERIC_NEGATIVE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC_NEGATIVE,DATE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE,RANGE:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.RANGE+" (case sensitive)",EQ:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.EQ+" (case sensitive)",NEQ:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.NEQ+" (case sensitive)",GT:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GT+" (case sensitive)",LT:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LT+" (case sensitive)",GE:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GE+" (case sensitive)",LE:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LE+" (case sensitive)",RANGE_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.RANGE,EQ_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.EQ,NEQ_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.NEQ,GT_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GT,LT_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LT,GE_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GE,LE_CI:"[field_label]must be "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LE,INT_RANGE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.RANGE,INT_EQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.EQ,INT_NEQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.NEQ,INT_GT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GT,INT_LT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LT,INT_GE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GE,INT_LE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.INT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LE,FLOAT_RANGE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.RANGE,FLOAT_EQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.EQ,FLOAT_NEQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.NEQ,FLOAT_GT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GT,FLOAT_LT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LT,FLOAT_GE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GE,FLOAT_LE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.FLOAT+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LE,NUMERIC_RANGE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.RANGE,NUMERIC_EQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.EQ,NUMERIC_NEQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.NEQ,NUMERIC_GT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GT,NUMERIC_LT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LT,NUMERIC_GE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.GE,NUMERIC_LE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.NUMERIC+", and "+Jel.Lang.FormValidator.VALUE_TEMPLATE.LE,DATE_RANGE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.RANGE+" in the format [format]",DATE_EQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.EQ+" in the format [format]",DATE_NEQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.NEQ+" in the format [format]",DATE_GT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.GT+" in the format [format]",DATE_LT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.LT+" in the format [format]",DATE_GE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.GE+" in the format [format]",DATE_LE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_DATE.LE+" in the format [format]",DATE_FUTURE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" in the future,  in the format [format]",DATE_PAST:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.DATE+" in the past,  in the format [format]",TIME_RANGE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.RANGE+" in the format [format]",TIME_EQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.EQ+" in the format [format]",TIME_NEQ:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.NEQ+" in the format [format]",TIME_GT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.GT+" in the format [format]",TIME_LT:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.LT+" in the format [format]",TIME_GE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.GE+" in the format [format]",TIME_LE:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" "+Jel.Lang.FormValidator.VALUE_TEMPLATE_TIME.LE+" in the format [format]",TIME_LATER:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" later than the current time,  in the format [format]",TIME_EARLIER:"[field_label]must be a "+Jel.Lang.FormValidator.TYPE_TEMPLATE.TIME+" earlier than the current time,  in the format [format]"};Jel.CoreExtender=Base.extend({constructor:function(a){String.prototype.repeat=function(b){return Jel.String.repeat(this,b)};String.prototype.right=function(b){return Jel.String.right(this,b)};String.prototype.left=function(b){return Jel.String.left(this,b)};String.prototype.trim=function(){return Jel.String.trim(this)};String.prototype.ltrim=function(){return Jel.String.ltrim(this)};String.prototype.rtrim=function(){return Jel.String.rtrim(this)};String.prototype.toFloat=function(){return Jel.String.toFloat(this)};String.prototype.toInt=function(){return Jel.String.toInt(this)};String.prototype.extractInt=function(){return Jel.String.extractInt(this)};String.prototype.eq=function(c,b){return Jel.String.eq(this,c,b)};String.prototype.startsWith=function(c,b){return Jel.String.startsWith(this,c,b)};String.prototype.endsWith=function(c,b){return Jel.String.endsWith(this,c,b)};String.prototype.decamelize=function(b){return Jel.String.decamelize(this,b)};String.prototype.camelize=function(b){return Jel.String.camelize(this,b)};String.prototype.titleCase=function(){return Jel.String.titleCase(this)};String.prototype.normalize=function(){return Jel.String.normalize(this)};String.prototype.constant=function(){return Jel.String.constant(this)};String.prototype.parseDate=function(b){return Jel.Date.parse(this,b)};String.prototype.convertDate=function(c,b){return Jel.Date.convert(this,c,b)};Number.prototype.leadingZero=function(b){return Jel.Number.leadingZero(this,b)};Number.prototype.ordinalSuffix=function(){return Jel.Number.ordinalSuffix(this)};Number.prototype.format=function(b){return Jel.Number.format(this,b)};if(!a){Date.parseDate=function(c,b){return Jel.Date.parse(c,b)}}else{Date.parse=function(c,b){return Jel.Date.parse(c,b)}}Date.convert=function(d,c,b){return Jel.Date.convert(d,c,b)};Date.prototype.format=function(b){return Jel.Date.parse(this,b)};Date.prototype.daysInMonth=function(){return Jel.Date.daysInMonth(this.getDate())};Date.prototype.isLeapYear=function(){return Jel.Date.isLeapYear(Jel.Date.fullYear(this))};Date.prototype.meridiem=function(){return Jel.Date.meridiem(this.getHours())};Date.prototype.ordinalSuffix=function(){return Jel.Date.ordinalSuffix(this.getDate())};Date.prototype.fullYear=function(){return Jel.Date.fullYear(this)};Date.prototype.dayOfYear=function(){return Jel.Date.dayOfYear(this)};Date.prototype.internetBeat=function(){return Jel.Date.internetBeat(this)};if(Jel.String.plural){String.prototype.plural=function(b){return Jel.String.plural(this,b)}}if(Jel.String.an){String.prototype.an=function(){return Jel.String.an(this)}}}});Jel.String={repeat:function(d,c){var a="";for(var b=0;b<c;b++){a+=d}return a},wrapToLines:function(h,a){var c=[];var b="";var g=h.split(" ");var e;var f;for(var d=0;d<g.length;d++){f=g[d];e=b+(b.length==""?"":" ")+f;if(e.length>a){c[c.length]=e;b=""}else{b=e}}if(b!=""){c[c.length]=e}return c},right:function(b,a){return b.substring(b.length-a,b.length)},left:function(b,a){return b.substring(0,a)},ltrim:function(a){return a.replace(/^\s+/,"")},rtrim:function(a){return a.replace(/\s+$/,"")},trim:function(a){return Jel.String.ltrim(Jel.String.rtrim(a))},toFloat:function(a){if(isNaN(a)){return 0}else{if(Jel.String.trim(a)==""){return 0}else{return parseFloat(a)}}},toInt:function(a){if(isNaN(a)){return 0}else{if(Jel.String.trim(a)==""){return 0}else{return parseInt(a)}}},extractInt:function(f){var c="";var e=f.match(/[0-9]+/ig);if(e){for(var d=0;d<e.length;d++){var b="";for(var a=0;a<e[d].length;a++){if(!(b.length==0&&e[d][a]=="0")){b+=e[d][a]}}c+=b}}return c==""?0:parseInt(c)},equals:function(c,b,a){if(!a){return c==b}else{return c.toLowerCase()==b.toLowerCase()}},startsWith:function(c,b,a){return Jel.String.equals(Jel.String.left(c,b.length),b,a)},endsWith:function(c,b,a){return Jel.String.equals(Jel.String.right(c,b.length),b,a)},decamelize:function(d,a){var b=d.replace(/([A-Z0-9])/g,(a?a:"-")+"$1").toLowerCase();var c=new RegExp("([0-9])"+(a?a:"-")+"([0-9])","g");while(b.match(c)){b=b.replace(c,"$1$2")}return b},camelize:function(f,b){if(!b){b="-"}var e=f.split(b),a=e.length;if(a==1){return e[0]}var d=f.charAt(0)==b?e[0].charAt(0).toUpperCase()+e[0].substring(1):e[0];for(var c=1;c<a;c++){d+=e[c].charAt(0).toUpperCase()+e[c].substring(1)}return d},titleCase:function(d){var c=d.split(" ");var a=[];for(var b=0;b<c.length;b++){a[a.length]=c[b].substr(0,1).toUpperCase()+c[b].substr(1,c[b].length-1)}return a.join(" ")},normalize:function(b){var a=b;a=a.replace(/\_/g,"-");a=Jel.String.camelize(a);a=Jel.String.decamelize(a);return a},constant:function(a){return Jel.String.normalize(a).toUpperCase().replace(/\-/g,"_")}};Jel.Date={};Jel.Date.DATE_NOW="now";Jel.Date.PARSE_REG_EXP_COMMON={LEADING_1_12:"10|11|12|(?:0[1-9])",NO_LEADING_1_12:"10|11|12|(?:[1-9])",BOTH_0_59:"[0-5][0-9]"};Jel.Date.FORMAT={T_12:"g:i A",T_24:"G:i",T_MILITARY:"Gi",UK:"d/m/Y",US:"m/d/Y",UK_12:"d/m/Y g:i A",US_12:"m/d/Y g:i A",UK_24:"d/m/Y G:i",US_24:"m/d/Y G:i",UK_12_SHORT:"d/m/Y g A",US_12_SHORT:"m/d/Y g A",UK_24_SHORT:"d/m/Y G",US_24_SHORT:"m/d/Y G",UK_12_LONG:"d/m/Y g:i:s A",US_12_LONG:"m/d/Y g:i:s A",UK_24_LONG:"d/m/Y G:i:s",US_24_LONG:"m/d/Y G:i:s",UTC:"Y-m-d G:i:s",UTC_T:"Y-m-dTG:i:s",UTC_Y:"Y",UTC_YM:"Y-m",UTC_YMD:"Y-m-d",UTC_YMDHM:"Y-m-d g:i",UTC_YMDHMS:"Y-m-d g:i:s",SHORT_MONTH:"d M Y",SHORT_MONTH_12:"d M Y g:i A",SHORT_MONTH_24:"d M Y G:i",SHORT_MONTH_PHRASE:"jS M Y",SHORT_MONTH_PHRASE_12:"jS M Y g:i A",SHORT_MONTH_PHRASE_24:"jS M Y G:i"};Jel.Date.HUMAN_FORMAT={T_12:"h:mm AM/PM",T_24:"h:mm (24 hour)",T_MILITARY:"hmm (military time)",UK:"dd/mm/yyyy",US:"mm/dd/yyyy",UK_12:"dd/mm/yyyy h:mm AM/PM",US_12:"mm/dd/yyyy h:mm AM/PM",UK_24:"dd/mm/yyyy hh:mm (24 hour)",US_24:"mm/dd/yyyy hh:mm (24 hour)",UK_12_SHORT:"dd/mm/yyyy h AM/PM",US_12_SHORT:"mm/dd/yyyy h AM/PM",UK_24_SHORT:"dd/mm/yyyy h (24 hour)",US_24_SHORT:"mm/dd/yyyy h (24 hour)",UK_12_LONG:"dd/mm/yyyy h:mm:ss AM/PM",US_12_LONG:"mm/dd/yyyy h:mm:ss AM/PM",UK_24_LONG:"dd/mm/yyyy h:mm:ss (24 hour)",US_24_LONG:"mm/dd/yyyy h:mm:ss (24 hour)",UTC:"yyyy-mm-dd hh:mm:ss (24 hour)",UTC:"yyyy-mm-dd hh:mm:ss (24 hour)",UTC_T:"yyyy-mm-ssThh:mm:ss (24 hour)",UTC_Y:"yyyy",UTC_YM:"yyyy-mm",UTC_YMD:"yyyy-mm-dd",UTC_YMDHM:"yyyy-mm-dd hh:mm (24 hour)",UTC_YMDHMS:"yyyy-mm-dd hh:mm:ss (24 hour)",SHORT_MONTH:"dd mmm yyyy",SHORT_MONTH_12:"dd mmm yyyy hh:mm AM/PM",SHORT_MONTH_24:"dd mmm yyyy hh:mm (24 hour)",SHORT_MONTH_PHRASE:"d(th) mmm yyyy",SHORT_MONTH_PHRASE_12:"d(th) mmm yyyy hh:mm AM/PM",SHORT_MONTH_PHRASE_24:"d(th) mmm yyyy hh:mm (24 hour)"};Jel.Date.PARSE_REG_EXP={d:"30|31|(?:[0-2][0-9])",D:Jel.Lang.Date.DAYS_SHORT.join("|"),j:"30|31|(?:[12]?[0-9])",l:Jel.Lang.Date.DAYS.join("|"),N:"[1-7]",S:"st|nd|rd|th",W:"50|51|52|(?:[1234]?[0-9])",F:Jel.Lang.Date.MONTHS.join("|"),m:Jel.Date.PARSE_REG_EXP_COMMON.LEADING_1_12,M:Jel.Lang.Date.MONTHS_SHORT.join("|"),n:Jel.Date.PARSE_REG_EXP_COMMON.NO_LEADING_1_12,t:"28|29|30|31",Y:"[0-9]{4}",y:"[0-9]{2}",a:"am|pm",A:"AM|PM",B:"[0-9]{1,3}",g:Jel.Date.PARSE_REG_EXP_COMMON.NO_LEADING_1_12,G:"20|21|22|23|(?:[1]?[1-9])",h:Jel.Date.PARSE_REG_EXP_COMMON.LEADING_1_12,H:"20|21|22|23|(?:[01]?[1-9])",i:Jel.Date.PARSE_REG_EXP_COMMON.BOTH_0_59,s:Jel.Date.PARSE_REG_EXP_COMMON.BOTH_0_59};Jel.Date.PARSE_REG_EXP.c=Jel.Date.PARSE_REG_EXP.Y+"-"+Jel.Date.PARSE_REG_EXP.m+"-"+Jel.Date.PARSE_REG_EXP.d+"T"+Jel.Date.PARSE_REG_EXP.H+":"+Jel.Date.PARSE_REG_EXP.i+":"+Jel.Date.PARSE_REG_EXP.s;Jel.Date.parse=function(k,p){var n=new Object();var b=new Date();var m=b.getDate();var r=b.getMonth();var g=Jel.Date.fullYear(b);var e=0;var h=0;var s=0;var c="AM";var q="";for(var o=0;o<p.length;o++){var l=p.charAt(o);var d="";switch(l){case"d":case"j":d="day";break;case"m":case"F":case"M":case"n":d="month";break;case"y":case"Y":d="year";break;case"g":case"G":case"h":case"H":d="hour";break;case"i":d="minute";break;case"s":d="second";break;case"a":case"A":d="meridiem";break}if(d){n[d]={index:o+1,format:l}}var j=Jel.Date.PARSE_REG_EXP[l];if(j){q=q+"("+j+")"}else{q=q+"("+l+")"}}var a=k.match(new RegExp(q,"i"));if(a){if(n.day&&n.month&&n.year){m=Jel.String.extractInt(a[n.day.index]);if(n.month.format=="F"){r=Jel.Lang.Date.MONTHS_LCASE.indexOf(a[n.month.index].toLowerCase())}else{if(n.month.format=="M"){r=Jel.Lang.Date.MONTHS_SHORT_LCASE.indexOf(a[n.month.index].toLowerCase())}else{r=Jel.String.extractInt(a[n.month.index])-1}}if(n.year.format=="Y"){g=Jel.String.extractInt(a[n.year.index])}else{var f=Jel.String.extractInt(a[n.year.index]);if(f>=69){g=Jel.String.extractInt("19"+Jel.Number.leadingZero(f))}else{g=Jel.String.extractInt("20"+Jel.Number.leadingZero(f))}}if(!Jel.Date.validDayMonthYear(m,r,g)){return false}}if(n.meridiem){c=a[n.meridiem.index].toUpperCase()}if(n.hour){e=Jel.String.extractInt(a[n.hour.index]);if(n.hour.format=="g"||n.hour.format=="h"){if(c=="AM"){if(e==12){e=0}}else{if(e!=12){e=e+12}}}}if(n.minute){h=Jel.String.extractInt(a[n.minute.index])}if(n.second){s=Jel.String.extractInt(a[n.second.index])}return new Date(g,r,m,e,h,s)}return false};Jel.Date.format=function(b,e){var a="";for(var c=0;c<e.length;c++){var d=e.charAt(c);switch(d){case"d":a+=Jel.Number.leadingZero(b.getDate());break;case"D":a+=Jel.Lang.Date.DAYS_SHORT[b.getDay()];break;case"j":a+=b.getDate();break;case"l":a+=Jel.Lang.Date.DAYS[b.getDay()];break;case"N":var b=b.getDate();a+=(b==0?7:b);break;case"S":a+=Jel.Date.ordinalSuffix(b.getDate());break;case"w":a+=b.getDate();break;case"z":a+=Jel.Date.dayOfYear(b);break;case"F":a+=Jel.Lang.Date.MONTHS[b.getMonth()];break;case"m":a+=Jel.Number.leadingZero(b.getMonth()+1);break;case"M":a+=Jel.Lang.Date.MONTHS_SHORT[b.getMonth()];break;case"n":a+=b.getMonth()+1;break;case"t":a+=Jel.Date.daysInMonth(b.getMonth(),Jel.Date.fullYear(b));break;case"L":a+=Jel.Date.isLeapYear(Jel.Date.fullYear(b))?1:0;break;case"Y":a+=Jel.Date.fullYear(b);break;case"y":a+=Jel.Date.fullYear(b).toString().substr(2,2);break;case"a":a+=Jel.Date.meridiem(b.getHours());break;case"A":a+=Jel.Date.meridiem(b.getHours()).toUpperCase();break;case"B":a+=Jel.Date.internetBeat(b);break;case"g":a+=Jel.Date.twelveHour(b.getHours());break;case"G":a+=b.getHours();break;case"h":a+=Jel.Number.leadingZero(Jel.Date.twelveHour(b.getHours()));break;case"H":a+=Jel.Number.leadingZero(b.getHours());break;case"i":a+=Jel.Number.leadingZero(b.getMinutes());break;case"s":a+=Jel.Number.leadingZero(b.getSeconds());break;case"c":a+=Jel.Date.format(b,"Y-m-dTH:i:s");break;case"r":a+=b.toString();break;default:a+=d}}return a};Jel.Date.convert=function(d,b,a){var c=Jel.Date.parse(d,b);if(c){return Jel.Date.format(c,a)}return false};Jel.Date.now=function(a){if(a){return Jel.Date.format(new Date(),a)}else{return new Date()}};Jel.Date.daysInMonth=function(b,a){switch(b){case 8:case 3:case 5:case 10:return 30;break;case 1:return(Jel.Date.isLeapYear(a)?29:28);break;default:return 31}};Jel.Date.isLeapYear=function(a){return a%4==0};Jel.Date.validDayMonthYear=function(a,c,b){if(isNaN(a)||isNaN(c)||isNaN(b)){throw ("day, month, and year must all be integer values")}return a>0&&a<=Jel.Date.daysInMonth(c,b)};Jel.Date.meridiem=function(a){return a<12?"am":"pm"};Jel.Date.twelveHour=function(a){if(a==0){return 12}else{if(a>12){return a-12}else{return a}}};Jel.Date.ordinalSuffix=function(a){return Jel.Number.ordinalSuffix(a)};Jel.Date.fullYear=function(b){var a=b.getYear();var c=a%100;c+=(c<38)?2000:1900;return c};Jel.Date.dayOfYear=function(b){var e=b.getMonth();var a=b.getDate();var d=0;for(var c=0;c<e;c++){d+=Jel.Date.daysInMonth(c)}return d+a};Jel.Date.internetBeat=function(a){var d=(a.getTimezoneOffset()+60)*60;var b=(a.getHours()*3600)+(a.getMinutes()*60)+a.getSeconds()+d;var c=Math.floor(b/86.4);if(c>1000){c-=1000}if(c<0){c+=1000}return c};Jel.Number={leadingZero:function(b,a){return Jel.String.repeat("0",(a||2)-b.toString().length)+b.toString()},ordinalSuffix:function(a){var b=Math.round(a).toString();var c=Math.round(a)%10;if(Jel.String.right(b,2)){if(Jel.String.right(b,2).length==2&&Jel.String.left(Jel.String.right(b,2),1)=="1"){return"th"}}switch(c){case 1:return"st";break;case 2:return"nd";break;case 3:return"rd";break;default:return"th"}},format:function(d,r){var a;var f="";var k="";var e;var m=Math.abs(d);var s=Math.floor(m);var p=r;var n=false;var c=p.match(/\((.*?)\)/,"ig");if(c&&c.length>0){n=true;p=c[1]}var j=p;var l=p.split(".");if(l.length>1){m=m.toFixed(l[1].length);j=l[0]}else{s=Math.round(m)}a=m.toString();if(l.length>1){f="."+a.split(".")[1]}e=Math.abs(s).toString();var h=0;j.toArray().each(function(i){if(i=="#"||i=="0"){h++}});c=j.match(/[^#0,]*?([#0,]+)[^#0,]*?/);if(c.length>1){j=j.replace(c[1],String.stringOfChar("#",e.length-h)+c[1])}var b=j.toArray();var t=e.length-1;for(var q=b.length-1;q>=0;q--){var o=b[q];var g=Math.pow(10,e.length-1-t);if(o=="#"){if(s>=g){k=e.substr(t,1)+k}t=t-1}else{if(o=="0"){if(s>=g){k=e.substr(t,1)+k}else{k="0"+k}t=t-1}else{if(o==","){if(s>=g){k=o+k}}else{k=o+k}}}}if(d<0){if(n){return"("+k+f+")"}else{return"-"+k+f}}return(k+f)}};Element.swapClassName=function(a,c,b){if(Element.hasClassName(a,c)){Element.removeClassName(a,c);Element.addClassName(a,b)}else{if(Element.hasClassName(a,b)){Element.removeClassName(a,b);Element.addClassName(a,c)}}};Element.findParent=function(b,a){var d;var c;var f;var e;d=a.match(/\.([\w\-]+)/i);if(d){c=d[1]}d=a.match(/\#([\w\-]+)/i);if(d){f=d[1]}d=a.match(/^([\w\-]+)/i);if(d){e=d[1]}else{e=a}return Element._doFindParent(b,e,c,f)};Element._doFindParent=function(b,a,d,e){var c=new RegExp("^"+a+"$","i");if(b.tagName){if(b.tagName.match(c)){if(d&&e){if(Element.hasClassName(b,d)&&b.id==e){return b}}else{if(d){if(Element.hasClassName(b,d)){return b}}else{if(e){if(b.id==e){return b}}else{return b}}}}}else{if(b.nodeType==3){}else{return false}}if(b.parentNode){return Element._doFindParent(b.parentNode,a,d,e)}else{return false}};Element.hasParent=function(a,b){return this._findParent(a,b)};Element._findParent=function(a,b){if(a==b){return true}else{if(a.parentNode){return Element._findParent(a.parentNode,b)}else{return false}}};Form.Element.setValue=function(b,c){var a=b;var b=$(b);if(!b){b=document.getElementsByName(a)[0]}if(!b){return false}var e=b.tagName.toLowerCase();var d=Form.Element.SetSerializers[e](b,c)};Form.Element.SetSerializers={input:function(a,b){switch(a.type.toLowerCase()){case"submit":case"hidden":case"password":case"text":return Form.Element.SetSerializers.textarea(a,b);case"checkbox":case"radio":return Form.Element.SetSerializers.inputSelector(a,b)}return false},inputSelector:function(b,c){fields=document.getElementsByName(b.name);for(var a=0;a<fields.length;a++){fields[a].checked=c.split(",").indexOf(fields[a].value)>=0}},textarea:function(a,b){a.value=b},select:function(b,c){for(var a=0;a<b.options.length;a++){b.options[a].selected=c.split(",").indexOf(b.options[a].value)>=0}}};Form.Element.isSelect=function(a){return a.tagName.match(/select/i)!=null};Form.Element.isTextArea=function(a){return a.tagName.match(/textarea/i)!=null};Form.Element.isInputText=function(a){if(a.getAttribute("type")){return a.tagName.match(/input/i)!=null&&a.getAttribute("type").match(/text/i)!=null}return a.tagName.match(/input/i)!=null};Form.Element.isInputHidden=function(a){if(a.getAttribute("type")){return a.tagName.match(/input/i)!=null&&a.getAttribute("type").match(/hidden/i)!=null}};Form.Element.isInputRadio=function(a){if(a.getAttribute("type")){return a.tagName.match(/input/i)!=null&&a.getAttribute("type").match(/radio/i)!=null}return false};Form.Element.isInputCheckbox=function(a){if(a.getAttribute("type")){return a.tagName.match(/input/i)!=null&&a.getAttribute("type").match(/checkbox/i)!=null}return false};Jel.ElementCache=Base.extend({constructor:function(a){this.selectors=a;this.update()},cacheSelector:function(a){this[a.key]=$$(a.value)},update:function(){$H(this.selectors).each(this.cacheSelector.bind(this))}});Jel.ObjectPath=Base.extend({constructor:function(b,a){this.path=b;this.baseObj=a?a:window},set:function(b){var c=this.baseObj;for(var a=0;a<this.path.length-1;a++){if(c.length){c=c[parseInt(this.path[a])]}else{c=c[this.path[a]]}}if(c.length){c[parseInt(this.path[a])]=b}else{c[this.path[a]]=b}},get:function(){var b=this.baseObj;for(var a=0;a<this.path.length-1;a++){b=b[this.path[a]]}return b[this.path[a]]}});Jel.ObjectPath.prototype.setValue=Jel.ObjectPath.prototype.set;Jel.ObjectPath.prototype.getValue=Jel.ObjectPath.prototype.get;Jel.Validator=Base.extend({},{checkValid:function(c,b){var a={value:b};return c?a:false},convertValue:function(b,c){if(c&&c.type){switch(c.type){case"int":return parseInt(b);break;case"float":case"numeric":return parseFloat(b);break;case"date":if(c.format){return Jel.Date.parse(b,c.format)}}}var a=(b&&b.toString?b.toString():b);if(c.caseInsensitive&&a.toLowerCase){a=a.toLowerCase()}return a},required:function(a){return Jel.Validator.lengthGt(a,{compare:0})},lengthGe:function(a,b){return a.length>=b.compare},lengthGt:function(a,b){return a.length>b.compare},lengthLe:function(a,b){return a.length<=b.compare},lengthLt:function(a,b){return a.length<b.compare},lengthEq:function(a,b){return a.length==b.compare},lengthNeq:function(a,b){return a.length!=b.compare},lengthRange:function(a,b){if(b.inclusive||b.inclusive==null){return Jel.Validator.lengthGe(a,{compare:b.lower})&&Jel.Validator.lengthLe(a,{compare:b.upper})}else{return Jel.Validator.lengthGt(a,{compare:b.lower})&&Jel.Validator.lengthLt(a,{compare:b.upper})}},intType:function(a){return Jel.Validator.checkValid(a.match(/^[\-\+]?[0-9]*$/),parseInt(a))},intPositive:function(a){return Jel.Validator.checkValid(a.match(/^\+?[0-9]*$/),parseInt(a))},intNegative:function(a){return Jel.Validator.checkValid(a.match(/^\-[0-9]*$/),parseInt(a))},floatType:function(a){return Jel.Validator.checkValid(a.match(/^[\+\-]?[0-9]*\.[0-9]+$/),parseFloat(a))},floatPositive:function(a){return Jel.Validator.checkValid(a.match(/^[\+]?[0-9]*\.[0-9]+$/),parseFloat(a))},floatNegative:function(a){return Jel.Validator.checkValid(a.match(/^\-[0-9]*\.[0-9]+$/),parseFloat(a))},numericType:function(a){return Jel.Validator.intType(a)||Jel.Validator.floatType(a)},numericPositive:function(a){return Jel.Validator.intPositive(a)||Jel.Validator.floatPositive(a)},numericNegative:function(a){return Jel.Validator.intNegative(a)||Jel.Validator.floatNegative(a)},dateType:function(b,c){var a=Jel.Date.parse(b,c.format);return Jel.Validator.checkValid(a,a)},email:function(a){return Jel.Validator.checkValid(a.match(/^([\w-]+)(.[\w-]+)*@([\w-]+)(.[\w]{2,20}){1,4}$/),a)},range:function(c,d){var b=Jel.Validator.convertValue(c,d);var a=Jel.Validator.convertValue(d.upper,d);var f=Jel.Validator.convertValue(d.lower,d);var g=d.inclusive||d.inclusive==null?Jel.Validator.checkValid(b>=f,b):Jel.Validator.checkValid(b>f,b);var e=d.inclusive||d.inclusive==null?Jel.Validator.checkValid(b<=a,b):Jel.Validator.checkValid(b<a,b);return(g&&e)?g:false},rangeCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.range(a,b)},eq:function(c,d){if(!d){throw ("info object must be provided for comparison validators")}if(!(Jel.Validator.checkType(c,d)&&Jel.Validator.checkType(c,d.compare))){return false}var a=Jel.Validator.convertValue(c,d);var b=Jel.Validator.convertValue(d.compare,d);return Jel.Validator.checkValid(a==b,a)},eqCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.eq(a,b)},neq:function(c,d){if(!d){throw ("info object must be provided for comparison validators")}if(!(Jel.Validator.checkType(c,d)&&Jel.Validator.checkType(c,d.compare))){return false}var a=Jel.Validator.convertValue(c,d);var b=Jel.Validator.convertValue(d.compare,d);return Jel.Validator.checkValid(a!=b,a)},neqCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.neq(a,b)},gt:function(c,d){if(!d){throw ("info object must be provided for comparison validators")}if(!(Jel.Validator.checkType(c,d)&&Jel.Validator.checkType(c,d.compare))){return false}var a=Jel.Validator.convertValue(c,d);var b=Jel.Validator.convertValue(d.compare,d);return d.inclusive?Jel.Validator.checkValid(a>=b,a):Jel.Validator.checkValid(a>b,a)},gtCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.gt(a,b)},lt:function(c,d){if(!d){throw ("info object must be provided for comparison validators")}if(!(Jel.Validator.checkType(c,d)&&Jel.Validator.checkType(c,d.compare))){return false}var a=Jel.Validator.convertValue(c,d);var b=Jel.Validator.convertValue(d.compare,d);return d.inclusive?Jel.Validator.checkValid(a<=b,a):Jel.Validator.checkValid(a<b,a)},ltCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.lt(a,b)},ge:function(a,b){b.inclusive=true;return Jel.Validator.gt(a,b)},geCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.ge(a,b)},le:function(a,b){b.inclusive=true;return Jel.Validator.lt(a,b)},leCi:function(a,b){b.caseInsensitive=true;return Jel.Validator.le(a,b)},intEq:function(a,b){b.type="int";return Jel.Validator.eq(a,b)},intNeq:function(a,b){b.type="int";return Jel.Validator.neq(a,b)},intLt:function(a,b){b.type="int";return Jel.Validator.lt(a,b)},intGt:function(a,b){b.type="int";return Jel.Validator.gt(a,b)},intLe:function(a,b){b.type="int";b.inclusive="true";return Jel.Validator.lt(a,b)},intGe:function(a,b){b.type="int";b.inclusive="true";return Jel.Validator.gt(a,b)},intRange:function(a,b){b.type="int";return Jel.Validator.range(a,b)},floatEq:function(a,b){b.type="float";return Jel.Validator.eq(a,b)},floatNeq:function(a,b){b.type="float";return Jel.Validator.neq(a,b)},floatLt:function(a,b){b.type="float";return Jel.Validator.lt(a,b)},floatGt:function(a,b){b.type="float";return Jel.Validator.gt(a,b)},floatLe:function(a,b){b.type="float";b.inclusive="true";return Jel.Validator.lt(a,b)},floatGe:function(a,b){b.type="float";b.inclusive="true";return Jel.Validator.gt(a,b)},floatRange:function(a,b){b.type="float";return Jel.Validator.range(a,b)},numericEq:function(a,b){b.type="numeric";return Jel.Validator.eq(a,b)},numericNeq:function(a,b){b.type="numeric";return Jel.Validator.neq(a,b)},numericLt:function(a,b){b.type="numeric";return Jel.Validator.lt(a,b)},numericGt:function(a,b){b.type="numeric";return Jel.Validator.gt(a,b)},numericLe:function(a,b){b.type="numeric";b.inclusive="true";return Jel.Validator.lt(a,b)},numericGe:function(a,b){b.type="numeric";b.inclusive="true";return Jel.Validator.gt(a,b)},numericRange:function(a,b){b.type="numeric";return Jel.Validator.range(a,b)},dateEq:function(a,b){b.type="date";return Jel.Validator.eq(a,b)},dateNeq:function(a,b){b.type="date";return Jel.Validator.neq(a,b)},dateLt:function(a,b){b.type="date";return Jel.Validator.lt(a,b)},dateGt:function(a,b){b.type="date";return Jel.Validator.gt(a,b)},dateLe:function(a,b){b.type="date";b.inclusive="true";return Jel.Validator.lt(a,b)},dateGe:function(a,b){b.type="date";b.inclusive="true";return Jel.Validator.gt(a,b)},dateRange:function(a,b){b.type="date";return Jel.Validator.range(a,b)},dateFuture:function(a,b){b.type="date";return Jel.Validator.dateGt(a,{compare:Jel.Date.format(Jel.Date.now(),b.format),format:b.format})},datePast:function(a,b){b.type="date";return Jel.Validator.dateLt(a,{compare:Jel.Date.format(Jel.Date.now(),b.format),format:b.format})},checkType:function(a,b){if(b&&b.type){switch(b.type){case"int":return Jel.Validator.intType(a,b);break;case"float":return Jel.Validator.floatType(a,b);case"numeric":return Jel.Validator.numericType(a,b);case"date":return Jel.Validator.dateType(a,b)}}return{value:(a&&a.toString?a.toString():a)}}});Jel.Validator.timeEq=Jel.Validator.dateEq;Jel.Validator.timeNeq=Jel.Validator.dateNeq;Jel.Validator.timeLt=Jel.Validator.dateLt;Jel.Validator.timeGt=Jel.Validator.dateGt;Jel.Validator.timeLe=Jel.Validator.dateLe;Jel.Validator.timeGe=Jel.Validator.dateGe;Jel.Validator.timeRange=Jel.Validator.dateRange;Jel.Validator.timeLater=Jel.Validator.dateFuture;Jel.Validator.timeEarlier=Jel.Validator.datePast;Jel.FormValidator=Base.extend({constructor:function(c,a){this.form=c;this.options=Object.extend({culpritFieldClassName:"culprit",culpritLabelClassName:"culprit",selectEmptyValue:"",suffixCompareField:"-field",suffixInline:"-inline",validateInline:true},a||{});this.validators=Object.extend(Jel.Validator,this.options.validators||{});this.errorTemplates=Object.extend(Jel.Lang.FormValidator.ERRORS,this.options.errorTemplates||{});this.callbacks=Object.extend({formatFieldLabel:this.formatFieldLabel,formatDateFormat:this.formatDateFormat},this.options.callbacks||{});this.observers={_formOnSubmit:this._formOnSubmit.bindAsEventListener(this),_fieldOnBlur:this._fieldOnBlur.bindAsEventListener(this)};var b=$H(this.validators).inject([],function(e,d){e.push(Jel.String.decamelize(this._replaceReserved(d.key)));return e}.bind(this));b.sort(function(e,d){return e<d?1:-1});this.validatorPattern="("+b.join("|")+")(?:-([a-zA-Z0-9:-]*))?";b=$H(Jel.Date.FORMAT).inject([],function(e,d){e.push(d.key.replace(new RegExp("_","gi"),"-").toLowerCase());return e}.bind(this));b.sort(function(e,d){return e<d?1:-1});this.dateFormatPattern="("+b.join("|")+")";Event.observe(this.form,"submit",this.observers._formOnSubmit,false);this._init()},_replaceReserved:function(a){switch(a){case"dateType":case"numericType":case"intType":case"floatType":return a.replace("Type","");default:return a}},_getReserved:function(a){switch(a){case"date":case"numeric":case"int":case"float":return a+"Type";default:return a}},registerErrorMessage:function(a,c,b,e){var d=Jel.String.normalize(c);if(!this.errorMessages[a]){this.errorMessages[a]={}}if(!this.errorInlineMessages[a]){this.errorInlineMessages[a]={}}this.errorMessages[a][d]=b;this.errorInlineMessages[a][d]=e?e:b},disableFields:function(){this._setDisabledFields(arguments,true)},enableFields:function(){this._setDisabledFields(arguments,false)},disableFieldByName:function(a){this._setDisabledFieldByName(a,true)},enableFieldByName:function(a){this._setDisabledFieldByName(a,false)},addFields:function(){this.elements.update();$A(arguments).each(this._setupField.bind(this))},removeFields:function(){this.elements.update();$A(arguments).each(this._dropField.bind(this))},displayCulprit:function(b,a){Element.addClassName(b,this.options.culpritFieldClassName);Element.addClassName(this.labels[b.id],this.options.culpritLabelClassName)},releaseCulprit:function(a){Element.removeClassName(a,this.options.culpritFieldClassName);Element.removeClassName(this.labels[a.id],this.options.culpritLabelClassName)},displayInline:function(b,a){Element.show(b);Element.update(b,a)},releaseInline:function(a){Element.hide(a);a.innerHTML=""},classedCulprit:function(a){return Element.hasClassName(a,this.options.culpritFieldClassName)},addCulprit:function(c,a,b){if(!this._isCulprit(c)){this.results.errors.push(a);this.results.errorsById[c.id]=a;this.results.inlines.push(b);this.results.inlinesById[c.id]=b;this.results.culprits.push(c);if(Form.Element.isInputRadio(c)||Form.Element.isInputCheckbox(c)){this.nameErrors[c.name]=true}}},submit:function(){this.releaseCulprits();if(!this.validate()){this.displayCulprits();this.showResults(this.results);return false}else{this.hideResults(this.results);var a=true;if(this.callbacks.onSubmit){a=this.callbacks.onSubmit(this)}if(a){this.form.submit()}}},validate:function(){if(this._valid){return this._valid}this._prepareResults();this._valid=true;$H(this.fields).each(function(a){this.checkField(a.value)}.bind(this));if(this.callbacks.onValidate){this._valid=this.callbacks.onValidate(this)&&this._valid}this.justValidated=true;return this._valid},displayCulprits:function(){this._valid=null;this.results.culprits.each(function(b){this.displayCulprit(b,false);var a=this.getInline(b);if(a){this.displayInline(a,this.results.inlinesById[b.id])}}.bind(this));if(this.results.culprits.length>0){if(this.results.culprits[0].focus){this.results.culprits[0].focus()}if(this.results.culprits[0].select){this.results.culprits[0].select()}this.justValidated=false}},releaseCulprits:function(){$A(this.form.elements).each(function(b){this.releaseCulprit(b);var a=this.getInline(b);if(a){this.releaseInline(a)}}.bind(this))},showResults:function(a){if(this.options.resultsContainer){this.showResultsList(a,this.options.resultsContainer)}if((!this.options.resultsContainer&&!this.callbacks.onShowResults)||this.options.resultsAlert){this.showResultsAlert(a)}if(this.callbacks.onShowResults){this.callbacks.onShowResults(a,this)}},hideResults:function(a){if(this.options.resultsContainer){this.hideResultsList(a,this.options.resultsContainer)}if(this.options.suffixInline){this.results.culprits.each(function(c){var b=this.getInline(c);if(b){this.releaseInline(b)}}.bind(this))}},showResultsAlert:function(b){var c=[];$A(b.errors).each(function(d){c.push(Jel.String.wrapToLines(d,Jel.FormValidator.ALERT_WRAP_LENGTH).join("\n    "))});var a=Jel.Lang.FormValidator.ERRORS_TITLE+"\n\n - "+c.join("\n\n - ");alert(a)},showResultsList:function(b,a){a.style.display="block";Element.update(a,"<p>"+Jel.Lang.FormValidator.ERRORS_TITLE+"</p><ul><li>"+b.errors.join("</li><li>")+"</li></ul>")},hideResultsList:function(b,a){a.style.display="none";a.innerHTML=""},formatFieldLabel:function(b,a){return Jel.String.trim(b.replace(/[:\*]/gi,""))},formatDateFormat:function(a){return a},validateField:function(a){this._prepareResults();return this.checkField(a)},checkField:function(f,b){var d=true;if(!this.disabled[f.id]||b){if(!Element.hasClassName(f,"required")&&this.isFieldEmpty(f)){return true}else{if(Element.hasClassName(f,"required")&&this.isFieldEmpty(f)){var c="required";if(Form.Element.isInputCheckbox(f)){c="required_checkbox"}else{if(Form.Element.isInputRadio(f)){c="required_radio"}else{if(Form.Element.isSelect(f)){c="required_select"}}}this._prepareErrorMessage(f.id,this.fieldLabels[f.id],"required",c,{});var a=this.errorMessages[f.id]["required"];var e=this.errorInlineMessages[f.id]["required"];if(!b){this.addCulprit(f,a,e);this._setValid(false)}return false}}f.className.split(" ").each(function(i){var k=Jel.String.normalize(i);if(d){if(k!="required"){var j=k.match(new RegExp(this.validatorPattern,"i"));if(j){var h=j[1];var m=this._parseValidationClass(k,h);if(m){if(this.validators[this._getReserved(h.camelize())]){d=this.validators[this._getReserved(h.camelize())](f.value,m);if(!b){if((m.compareField!=null&&$(m.compareField)!=null&&!this.checkField($(m.compareField),true))||(m.lowerField!=null&&$(m.lowerField)!=null&&!this.checkField($(m.lowerField),true))||(m.upperField!=null&&$(m.upperField)!=null&&!this.checkField($(m.upperField),true))){this._addValue(f,d);return}}this._prepareErrorMessage(f.id,this.fieldLabels[f.id],k,h.camelize(),m);var g=this.errorMessages[f.id][k];var l=this.errorInlineMessages[f.id][k]}if(!d&&!b){this.addCulprit(f,g,l)}if(!b){this._setValid(d)}}}}}this._addValue(f,d)}.bind(this))}return d},isFieldEmpty:function(b){if(Form.Element.isInputRadio(b)||Form.Element.isInputCheckbox(b)){var a=!$A(this.nameFields[b.name]).any(function(c){return c.checked});return a}else{if(Form.Element.isSelect(b)){return Jel.String.trim(b.value)==this.options.selectEmptyValue}else{return Jel.String.trim(b.value)==""}}},getInline:function(b){if(this.options.suffixInline){var a=$(b.id+this.options.suffixInline)||$(b.name+this.options.suffixInline);return a}},_fieldOnBlur:function(b){if(!this.justValidated){var d=Event.element(b);var c=this.getInline(d);if(!this.isFieldEmpty(d)){var a=this.validateField(d);if(!a){this.inlineFields[d.id]=true;this.displayCulprit(d,true);if(c){this.displayInline(c,this.results.inlinesById[d.id])}}else{this.inlineFields[d.id]=false;this.releaseCulprit(d,true);if(c){this.releaseInline(c)}}}else{if(this.inlineFields[d.id]){this.inlineFields[d.id]=false;this.releaseCulprit(d,true);if(c){this.releaseInline(c)}}}}else{this.justValidated=false}},_formOnSubmit:function(a){this.releaseCulprits();if(!this.validate()){this.displayCulprits();this.showResults(this.results);Event.stop(a)}else{this.hideResults(this.results);var b=true;if(this.callbacks.onSubmit){b=this.callbacks.onSubmit(this)}if(!b){Event.stop(a)}}this._valid=null},_prepareResults:function(){this.fieldErrors={};this.fieldInlineErrors={};this.results={culprits:[],errors:[],errorsById:{},inlines:[],inlinesById:{}};this.nameErrors={}},_addValue:function(b,a){if(a&&a.value){this.values[b.id]=a.value}},_setValid:function(a){if(this._valid&&!a){this._valid=false}},_isCulprit:function(a){return this.results.culprits.indexOf(a)!=-1||this.nameErrors[a.name]},_prepareErrorMessage:function(f,a,g,d,c){if(this.errorMessages&&this.errorMessages[f]&&this.errorMessages[f][g]){return this.errorMessages[f][g]}var b;var h;var e;var i;b=this.errorTemplates[Jel.String.decamelize(d,"_").toUpperCase()];if(c.formatKey){b=b.replace("[format]",this.formatDateFormat(Jel.Date.HUMAN_FORMAT[this._getFormatKey(c.formatKey)]))}if(c.compare!=null||c.compareField!=null){b=b.replace("[compare]",c.compareField?this.callbacks.formatFieldLabel(this.fieldLabels[c.compareField],c.compareField):this._getCompareDisplay(c.compare,c.format))}if(c.lower!=null){b=b.replace("[lower]",c.lowerField?this.callbacks.formatFieldLabel(this.fieldLabels[c.lowerField],c.lowerField):this._getCompareDisplay(c.lower,c.format))}if(c.upper!=null){b=b.replace("[upper]",c.upperField?this.callbacks.formatFieldLabel(this.fieldLabels[c.upperField],c.upperField):this._getCompareDisplay(c.upper,c.format))}b=b.replace("[inclusive]",c.inclusive?" "+Jel.Lang.FormValidator.TERM_INCLUSIVE:"");h=b;e=b.replace("[field_label]",this.callbacks.formatFieldLabel(a,this.fields[f])+" ");i=h.replace("[field_label]","");this.registerErrorMessage(f,g,e,i)},_getFormatKey:function(a){return Jel.String.decamelize(a.camelize(),"_").toUpperCase()},_getDateFormat:function(a){return Jel.Date.FORMAT[Jel.String.decamelize(a.camelize(),"_").toUpperCase()]},_getCompareDisplay:function(a,b){if(b&&this._getDateFormat(b)){return this._getDateCompare(a,b)}if(!Jel.Validator.numericType(a)){return'"'+a+'"'}return a},_getDateCompare:function(b,c){var a=Jel.Date.convert(b,"YmdTGis",c);if(a){return a}else{var a=Jel.Date.convert(b,"Ymd",c);if(a){return a}}return b},_parseValidationClass:function(b,a){var c;var d={};switch(a){case"range":case"range-ci":case"int-range":case"float-range":case"numeric-range":case"length-range":c=b.match(a+"(?:-([-A-Za-z0-9T]*?)(::|:)([-A-Za-z0-9T]*?))$");if(c){this._setValidatorBounds(c[1],c[3],c[2],d)}else{return false}break;case"date":case"date-eq":case"date-gt":case"date-lt":case"date-le":case"date-ge":case"date-future":case"date-past":case"time":case"time-eq":case"time-gt":case"time-lt":case"time-le":case"time-ge":case"time-later":case"time-earlier":c=b.match(a+"(?:-([-A-Za-z0-9T]*?))?-"+this.dateFormatPattern+"$");if(c){if(c[2]){d.format=this._getDateFormat(c[2]);d.formatKey=c[2]}else{throw"time format needs to be provided in field "+field.id}this._setValidatorCompare(c[1],d)}else{return false}break;case"date-range":case"time-range":c=b.match(a+"(?:-([-A-Za-z0-9T]*?)(::|:)([-A-Za-z0-9T]*?))-"+this.dateFormatPattern+"$");if(c){if(c[4]){d.format=this._getDateFormat(c[4]);d.formatKey=c[4]}else{throw"time format needs to be provided in field "+field.id}this._setValidatorBounds(c[1],c[3],c[2],d)}else{return false}break;default:c=b.match(a+"(?:-([-A-Za-z0-9T]*?))$");if(c){this._setValidatorCompare(c[1],d)}else{return false}break}return d},_setDisabledFieldByName:function(a,b){if(this.nameFields[a]&&this.nameFields[a].length){this.nameFields[a].each(function(c){this._setDisabledFields([c.id],b)}.bind(this))}},_setDisabledFields:function(a,b){$A(a).each(function(c){if($(c)){this.disabled[c]=b}else{this._setDisabledFieldByName(c,b)}}.bind(this))},_setValidatorCompare:function(b,c){if(b){c.compare=this._getCompareValue(b,c.format);var a=b.replace(this.options.suffixCompareField,"");if(this.fields[a]&&a!=b){c.compareField=a}if(c.compareField){c.compare=this.fields[a].value}}},_setValidatorBounds:function(a,b,f,e){if(a&&b&&f){e.lower=this._getCompareValue(a,e.format);e.upper=this._getCompareValue(b,e.format);var c=a.replace(this.options.suffixCompareField,"");var d=b.replace(this.options.suffixCompareField,"");if(this.fields[c]&&c!=a){e.lowerField=c}if(this.fields[d]&&d!=b){e.upperField=d}if(e.lowerField){e.lower=this.fields[c].value}if(e.upperField){e.upper=this.fields[d].value}e.inclusive=(f=="::")}},_getCompareValue:function(b,c){if(c){return this._getDateCompare(b,c)}else{var a=b.match(/[0-9]+?p[0-9]+/);if(a){return b.replace("p",".")}}return b},_setupField:function(a){a=$(a);if(!a){throw ("setup field: field does not exist")}if(a.id){this.fields[a.id]=a}this.fieldLabels[a.id]=this._idToPhrase(a.id);if(Form.Element.isInputRadio(a)||Form.Element.isInputCheckbox(a)){if(a.name){if($("for-"+a.name)){this.labels[a.id]=$("for-"+a.name);this.fieldLabels[a.id]=Jel.String.trim($("for-"+a.name).innerHTML)}if(this.nameFields[a.name]){this.nameFields[a.name].push(a)}else{this.nameFields[a.name]=[a]}}}if(this.options.validateInline){Event.observe(a,"blur",this.observers._fieldOnBlur)}},_dropField:function(a){a=$(a);delete this.fields[a.id];delete this.fieldLabels[a.id];delete this.labels[a.id];delete this.nameFields[a.name];delete this.errorMessages[a.id]},_idToPhrase:function(a){return Jel.String.titleCase(Jel.String.normalize(a).replace("-"," "))},_associateLabel:function(b){var a;var c;if(b.attributes["for"]){a=b.attributes["for"].value}else{a=b.getAttribute("for")}if(a){c=$(a)}if(c){if(!this.labels[a]){this.labels[a]=b}if(!this.nameFields[c.name]){this.fieldLabels[a]=Jel.String.trim(b.innerHTML)}}},_init:function(){this._valid=null;this.elements=new Jel.ElementCache({labels:"form#"+this.form.id+" label"});this.validationErrors={};this.inlineFields={};this.values={};this.inlines={};this.fields={};this.labels={};this.nameFields={};this.nameErrors={};this.disabled={};this.fieldLabels={};this.errorMessages={};this.errorInlineMessages={};$A(this.form.elements).each(function(a){this._setupField(a)}.bind(this));this.elements.labels.each(this._associateLabel.bind(this))}},{ALERT_WRAP_LENGTH:28});Jel.String.plural=function(c,b){if(b==1){return c}else{if(Jel.Lang.String.PLURAL_SPECIAL[c.toLowerCase()]){return Jel.Lang.String.PLURAL_SPECIAL[c.toLowerCase()]}else{var a;$H(Jel.String.PLURAL_SUFFIX_REPLACE).each(function(d){if(Jel.String.right(c.toLowerCase(),d.key.length)==d.key){a=Jel.String.left(c,c.length-d.key.length)+d.value}});if(a){return a}return c+"s"}}};Jel.String.an=function(a){if(Jel.String.left(a,3)=="uni"){return"an"}switch(Jel.String.left(a,2)){case"ut":return"a"}switch(Jel.String.left(a,1)){case"a":case"e":case"i":case"o":case"u":return"an";break;default:return"a"}};