"use strict";window.tgr={};tgr.PinNavigation=new Class({Implements:[Events,Options],options:{topPad:72},initialize:function(nav,content,options){this.setOptions(options);this.nav=document.id(nav);if(!this.nav){return}this.nav.setStyle("position","absolute");this.window=document.id(window);this.content=document.id(content);if(!this.nav){this.content=this.window}this.navTopAbs=this.nav.getCoordinates().top;this.navTopRel=this.nav.getPosition(this.content).y;this.navTopDiff=this.navTopAbs-this.navTopRel;this.contentLeft=this.content.getCoordinates().left;this.navLeft=this.nav.getPosition(this.content).x;this.topPad=this.options.topPad;this.fixedTop=this.navTopAbs-this.topPad;this.fixedNav=false;this.window.addEvent("scroll",this.scroll.bind(this));this.window.addEvent("resize",this.resize.bind(this));this.scroll()},scroll:function(){var scrollTop=this.window.getScrollTop();if(scrollTop>this.fixedTop){if(Browser.Engine.trident&&Browser.Engine.version<=4){this.nav.setStyle("top",scrollTop-this.navTopDiff+this.topPad)}else{if(!this.fixedNav){this.nav.setStyles({left:this.contentLeft+this.navLeft,top:this.topPad,position:"fixed"});this.fixedNav=true}}}else{if(this.fixedNav){this.nav.setStyles({position:"absolute",top:this.navTopRel,left:this.navLeft});this.fixedNav=false}}},resize:function(){this.contentLeft=this.content.getCoordinates().left;if(this.fixedNav){this.nav.setStyle("left",this.contentLeft+this.navLeft)}}});tgr.AnimateScroll=new Class({Implements:[Events,Options],options:{duration:1000,transition:Fx.Transitions.Sine.easeInOut,links:"li a"},initialize:function(el,options){this.setOptions(options);this.parent=document.id(el);if(!this.parent){return}this.window=document.id(window);this.scrollFx=new Fx.Scroll(this.window,this.options);var links=($type(this.options.links)==="array")?this.options.links:this.parent.getElements(this.options.links),location=decodeURI(this.window.location.href.match(/^[^#]*/)[0]+"#");links.each(function(link){var linkloc=decodeURI(link.href),target=false;if(linkloc.indexOf(location)!==0){return}target=document.id(linkloc.substr(location.length));if(target){link.addEvent("click",function(event,link){event.preventDefault();this.scrollFx.toElement(target);link.blur()}.bindWithEvent(this,link))}},this)}});tgr.CurrentSection=new Class({Implements:[Events,Options],options:{defaultSection:"top",linkParent:"li",links:"a"},initialize:function(el,options){this.setOptions(options);this.parent=document.id(el);if(!this.parent){return}this.window=document.id(window);this.current=false;this.sections=[];var location=decodeURI(this.window.location.href.match(/^[^#]*/)[0]+"#"),links=($type(this.options.links)==="array")?this.options.links:this.parent.getElements(this.options.links);links.each(function(link){var linkloc=decodeURI(link.href),target,el;if(linkloc.indexOf(location)!==0){return}target=linkloc.substr(location.length);el=document.id(target);if(el){this.sections.push({link:link,target:target,top:el.getCoordinates().top,bottom:el.getCoordinates().bottom,parent:link.getParent(this.options.linkParent)})}},this);this.setdefault();this.setsection();this.window.addEvent("scroll",this.setsection.bind(this))},setcurrent:function(index){if(index!==this.current){this.sections.each(function(section,i){if(i===index){if(!section.parent.retrieve("current",false)){section.parent.store("current",true);section.parent.addClass("current");this.current=index}}else{if(section.parent.retrieve("current")){section.parent.store("current",false);section.parent.removeClass("current")}}},this)}},findnavitem:function(itemname){var index=false,i=this.sections.length-1;for(i;this.sections[i];i--){if(this.sections[i].target===itemname){index=i;break}}return index},setdefault:function(){this.setcurrent(this.findnavitem(this.options.defaultSection))},setsection:function(){var windowTop=this.window.getScrollTop(),windowHeight=this.window.getHeight(),sectionStart=windowTop+(windowHeight/2).round(),i=this.sections.length-1;for(i;this.sections[i];i--){if(sectionStart>=this.sections[i].top&&sectionStart<this.sections[i].bottom){this.setcurrent(i);break}}}});tgr.PortfolioSlide=new Class({Implements:[Events,Options],options:{classes:[],defaultSlide:0,delay:2000,descTag:"div",fadeDuration:500,height:false,orientation:"horizontal",preventDescAnchorFocus:false,thumbScrollOptions:{duration:100,transition:Fx.Transitions.Linear},titleTag:"h3",width:false},initialize:function(el,data,options){this.setOptions(options);this.parent=document.id(el);if(!this.parent){return}this.slideshow={slides:[],descs:[],thumbs:[]};this.current=false;this.delay=this.transition=0;var keys=["desc","nextThumb","prevThumb","slide","slides","slideshow","thumbnails","thumbsCont","thumb","visible"],values=keys.map(function(key,i){return this.options.classes[i]||key},this),slides,built=false;this.classes=values.associate(keys);this.classes.get=function(){var str="."+this.slideshow,i=0,l=arguments.length;for(i;i<l;i++){str+=("-"+this[arguments[i]])}return str}.bind(this.classes);if(!data){data={};slides=this.parent.getElements(this.classes.get("slide"));this.parent.getElements(this.classes.get("thumb")).each(function(thumb,index){var slideimg=slides[index].getElement("img"),thumbimg=thumb.getElement("img"),slidesrc=slideimg.getProperty("src"),thumbsrc=thumbimg.getProperty("src"),s=slides[index].getElement(this.classes.get("desc")),a=slideimg.getProperty("alt")||thumbimg.getProperty("alt")||false,desc,tt,dt,titletext,desctext=false;if(s){tt=s.getElement(this.options.titleTag);dt=s.getElement(this.options.descTag);titletext=(tt)?tt.get("text"):false;desctext=(dt)?dt.get("html"):false;if(titletext){desc={title:titletext,desc:desctext}}}else{if(a){desc={title:a,desc:false}}}data[slidesrc]={desc:desc,thumb:thumbsrc}},this)}built=this.build(data);if(!built){return}this.defaultSlide=(this.slideshow.thumbs[this.options.defaultSlide])?this.options.defaultSlide:0;this.initSlides();this.initThumbs();this.go(this.defaultSlide)},build:function(data){var slide,obj,desc,thumb;for(slide in data){if(data.hasOwnProperty(slide)){obj=data[slide];desc=obj.desc;thumb=obj.thumb;this.slideshow.slides.push(slide);this.slideshow.descs.push(desc);this.slideshow.thumbs.push(thumb)}}return this.slideshow.slides.length},initSlides:function(){var el=this.parent.getElement(this.classes.get("slides")),slides=(el)?el.empty():new Element("div",{"class":this.classes.get("slides").substr(1)}).inject(this.parent),size=slides.getSize();this.width=this.options.width||size.x;this.height=this.options.height||size.y;slides.setStyles({position:"relative",overflow:"hidden",display:"block",width:this.width,height:this.height});this.a=this.slide=new Element("div",{"class":this.classes.get("slide").substr(1),styles:{position:"static"}});this.b=this.a.clone();[this.a,this.b].each(function(slide){var img=new Element("img",{styles:{display:"none","z-index":1},events:{update:function(){var img=slide.retrieve("img");img.get("morph").cancel().start({opacity:[0,1]})},morph:{link:"ignore",duration:this.options.fadeDuration}}}),desc=new Element("div",{styles:{display:"none",position:"absolute",visibility:"hidden","z-index":1},"class":this.classes.get("desc").substr(1),events:{update:function(){var el=slide.retrieve("desc"),text=this.slideshow.descs[this.current],title,desc=false;if(text){if(!el.retrieve("active",false)){el.store("active",true)}if(text.title){title=(el.retrieve("titleEl",false))?el.retrieve("titleEl").empty().set("text",text.title):new Element(this.options.titleTag,{text:text.title}).inject(el);el.store("titleEl",title)}else{if(el.retrieve("titleEl",false)){el.retrieve("titleEl").destroy();el.eliminate("titleEl")}}if(text.desc){desc=(el.retrieve("descEl",false))?el.retrieve("descEl").empty().set("html",text.desc):new Element(this.options.descTag,{html:text.desc}).inject(el);if(this.options.preventDescAnchorFocus){desc.getElements("a").each(function(anchor){anchor.set("tabindex","-1")})}el.store("descEl",desc)}else{if(el.retrieve("descEl",false)){el.retrieve("descEl").empty();el.eliminate("descEl")}}el.setStyle("display","block");el.get("morph").cancel().start({opacity:[0,1]});el.fireEvent("descDone")}else{el.empty();if(el.retrieve("active")){el.store("active",false);el.setStyle("display","none")}}}.bind(this)},morph:{link:"ignore",duration:this.options.fadeDuration}});slide.store("img",img);slide.store("desc",desc);slide.grab(img).grab(desc).inject(el)},this);this.parent.store("slides",slides)},initThumbs:function(){var el=this.parent.getElement(this.classes.get("thumbnails")),thumbnails=(el)?el.empty():new Element("div",{"class":this.classes.get("thumbnails").substr(1)}).inject(this.parent),prevThumb=new Element("div",{"class":this.classes.get("prevThumb").substr(1)}).inject(thumbnails),prevLink=new Element("a",{href:"#",events:{click:function(event){event.preventDefault();this.prevThumb()}.bind(this)}}).inject(prevThumb),nextThumb=new Element("div",{"class":this.classes.get("nextThumb").substr(1)}).inject(thumbnails),nextLink=new Element("a",{href:"#",events:{click:function(event){event.preventDefault();this.nextThumb()}.bind(this)}}).inject(nextThumb),thumbsCont=new Element("div",{"class":this.classes.get("thumbsCont").substr(1),styles:{overflow:"hidden",position:"relative"}}).inject(thumbnails),thumbs=this.parent.retrieve("thumb",[]),thumbsDim,firstThumb=false;this.orient=(this.options.orientation==="vertical")?"height":"width";thumbsCont.setStyle(this.orient,"1000px");thumbnails.setStyles({overflow:"hidden",position:"relative"});this.parent.store("thumbs",thumbnails);this.parent.store("thumbsCont",thumbsCont);thumbsDim=$pick(thumbnails.getStyle(this.orient).toInt(),thumbnails.getCoordinates()[this.orient]);firstThumb=this.loadThumb(this.slideshow.thumbs[this.defaultSlide],this.defaultSlide);this.numSlides=Math.floor(thumbsDim/firstThumb.div.getCoordinates()[this.orient]);this.fillThumbs();thumbsCont.set("events",{update:function(){var setActive=function(thumb,i){if(thumb.a.retrieve("loaded")){if(thumb.i===this.current){if(!thumb.div.retrieve("active",false)){thumb.div.store("active",true);thumb.div.addClass("current")}}else{if(thumb.div.retrieve("active")){thumb.div.store("active",false);thumb.div.removeClass("current")}}}else{setActive.delay(50,this,[thumb,i])}}.bind(this),thumbs=this.parent.retrieve("thumb");thumbs.each(function(thumb,i){setActive(thumb,i)},this)}.bind(this)});thumbnails.set("events",{mousewheel:function(event){event.stop();if(event.wheel<0){this.nextThumb()}else{this.prevThumb()}}.bind(this)});this.thumbsReady=true},go:function(index){if(index===this.current||$time()<this.transition){return}this.delay=0;if(this.preload){this.preload=this.preload.destroy()}this.loadSlide(index)},fillThumbs:function(firstThumb){var thumbs=this.parent.retrieve("thumb"),lastThumb,nextThumb=false;while(thumbs.length<this.numSlides){lastThumb=(thumbs[thumbs.length-1])?thumbs[thumbs.length-1].i:$pick(firstThumb-1,0);nextThumb=(this.slideshow.thumbs[lastThumb+1])?this.slideshow.thumbs[lastThumb+1]:this.slideshow.thumbs[0];this.slideshow.thumbs.each(function(thumb,i){if(thumb===nextThumb){this.loadThumb(thumb,i)}},this)}},loadSlide:function(index){if(!this.preload){this.preload=new Asset.image(this.slideshow.slides[index],{onerror:function(){var thumbsCont=this.parent.retrieve("thumbsCont"),thumbs=this.parent.retrieve("thumb"),first=false;["slides","descs","thumbs"].each(function(key){this.slideshow[key].splice(index,1)},this);thumbs.each(function(thumb,n){if(thumb.i===index){thumb.div.destroy();thumbs.splice(n,1)}});first=$pick(thumbs[0].i,0);thumbsCont.empty();this.parent.store("thumb",[]);this.fillThumbs(first);this.preload=this.preload.destroy();if(this.slideshow.slides[index]){this.loadSlide(index)}}.bind(this),onload:function(){this.preload.store("loaded",true);this.current=index}.bind(this)})}if(this.preload.retrieve("loaded")&&$time()>this.delay&&$time()>this.transition){this.active=(this.a.retrieve("active",true))?this.a:this.b;this.active.retrieve("img").set({styles:{display:"block",visibility:"hidden",position:"absolute"},src:this.preload.get("src"),alt:this.slideshow.descs[index].title||""});this.transition=$time()+this.options.fadeDuration;this.parent.retrieve("thumbsCont").fireEvent("update");this.active.retrieve("img").setStyle("z-index",15).fireEvent("update");this.active.retrieve("desc").setStyle("z-index",20).fireEvent("update");this.setActive.delay(this.options.fadeDuration,this)}else{this.loadSlide.delay(100,this,index)}},setActive:function(){var inactive=(this.a.retrieve("active"))?this.b:this.a;inactive.retrieve("img").setStyle("visibility","hidden");inactive.retrieve("desc").setStyle("visibility","hidden");this.active.retrieve("img").setStyle("z-index",5);this.active.retrieve("desc").setStyle("z-index",10);this.active.store("active",false);inactive.store("active",true)},loadThumb:function(thumb,i,where){where=$pick(where,"bottom");var thumbsCont=this.parent.retrieve("thumbsCont"),thumbs=this.parent.retrieve("thumb",[]),div=new Element("div",{"class":this.classes.get("thumb").substr(1)}).inject(thumbsCont,where),a=new Element("a",{href:this.slideshow.slides[i],events:{click:function(event){event.preventDefault();this.go(i)}.bindWithEvent(this)}}).inject(div);this.thumbsPreload=new Asset.image(thumb,{alt:this.slideshow.descs[i].title,title:this.slideshow.descs[i].title,onerror:function(){var thumbsCont=this.parent.retrieve("thumbsCont"),thumbs=this.parent.retrieve("thumb");["slides","descs","thumbs"].each(function(key){this.slideshow[key].splice(i,1)},this);thumbs.each(function(thumb,index){if(thumb.i===i){thumb.div.destroy();thumbs.splice(index,1)}});this.fillThumbs();this.thumbsPreload=this.thumbsPreload.destroy();thumbsCont.fireEvent("transition")}.bind(this),onload:function(i){thumbs.each(function(thumb){if(thumb.i===i&&thumb.a){thumb.a.store("loaded",true)}});thumbsCont.fireEvent("transition")}.pass(i,this)}).inject(a);if(where==="bottom"){thumbs.push({div:div,a:a,i:i});return thumbs[thumbs.length-1]}else{thumbs.unshift({div:div,a:a,i:i});return thumbs[0]}},nextThumb:function(){if($time()<this.thumbTransition||!this.thumbsReady){return}this.thumbsReady=false;this.direction="next";var thumbsCont=this.parent.retrieve("thumbsCont"),thumbs=this.parent.retrieve("thumb"),firstDiv=thumbs[0].div,lastThumb=thumbs[thumbs.length-1].i,nextThumb=(this.slideshow.thumbs[lastThumb+1])?lastThumb+1:0,thumb=this.loadThumb(this.slideshow.thumbs[nextThumb],nextThumb),divMargin=-firstDiv.getCoordinates()[this.orient];thumbsCont.addEvent("transition",this.transitionThumb.pass([thumb,divMargin],this))},prevThumb:function(){if($time()<this.thumbTransition||!this.thumbsReady){return}this.thumbsReady=false;this.direction="prev";var thumbsCont=this.parent.retrieve("thumbsCont"),thumbs=this.parent.retrieve("thumb"),firstThumb=thumbs[0].i,prevThumb=(this.slideshow.thumbs[firstThumb-1])?firstThumb-1:this.slideshow.thumbs.length-1,thumb=this.loadThumb(this.slideshow.thumbs[prevThumb],prevThumb,"top"),marginDir=(this.orient==="vertical")?"top":"left";thumbsCont.setStyle(marginDir,-thumb.div.getCoordinates()[this.orient]);thumbsCont.addEvent("transition",this.transitionThumb.pass([thumb,0],this))},transitionThumb:function(thumb,moveTo){if(!this.thumbsPreload){this.thumbsReady=true;if(this.direction==="next"){this.nextThumb()}else{this.prevThumb()}return}var duration=this.options.thumbScrollOptions.duration,thumbsCont=this.parent.retrieve("thumbsCont"),fxObject=this.getScrollFx(),marginDir=(this.orient==="vertical")?"top":"left";this.thumbTransition=$time()+duration;fxObject.start(marginDir,moveTo);thumbsCont.fireEvent("update")},deleteThumb:function(index){var thumbsCont=this.parent.retrieve("thumbsCont"),thumbs=this.parent.retrieve("thumb");thumbs[index].div.destroy();thumbs.splice(index,1);thumbsCont.removeEvents("transition");this.thumbsReady=true},getScrollFx:function(){var fxOptions=this.options.thumbScrollOptions,thumbsCont=this.parent.retrieve("thumbsCont"),fxObject=thumbsCont.retrieve("fx",false);if(fxObject){return fxObject}else{fxObject=new Fx.Tween(thumbsCont,fxOptions).addEvent("complete",function(){var thumbs=this.parent.retrieve("thumb"),thumbsCont=this.parent.retrieve("thumbsCont"),moveDir=(this.orient==="vertical")?"top":"left",del=(this.direction==="next")?0:thumbs.length-1;this.deleteThumb(del);thumbsCont.setStyle(moveDir,0)}.bind(this));thumbsCont.store("fx",fxObject);return fxObject}}});tgr.DescriptionHide=new Class({Implements:[Events,Options],options:{duration:500,hiddenClass:null,hideDelay:1500,showClass:null,transition:Fx.Transitions.Sine.easeInOut,trigger:"click",insertedElement:null},initialize:function(slideshow,options){this.setOptions(options);this.slideshow=slideshow;if(!(this.slideshow instanceof tgr.PortfolioSlide)){return}this.showClass=(this.options.showClass)?this.options.showClass:slideshow.classes.get("desc")+"-show";this.hiddenClass=(this.options.hiddenClass)?this.options.hiddenClass:slideshow.classes.get("desc")+"-hidden";this.trigger=this.options.trigger;[this.slideshow.a,this.slideshow.b].each(function(slide){var desc=slide.retrieve("desc"),descFx=new Fx.Morph(desc,{duration:this.options.duration,transition:this.options.transition}),hideDelay=this.options.hideDelay;desc.addEvent("descDone",function(){descFx.cancel().set(this.showClass);this.hideDesc.delay(hideDelay,this,[desc,descFx])}.bind(this));if(this.options.visibleElement){desc.addEvent("descDone",this.visibleEl.inject.pass(desc,this.visibleEl))}switch(this.trigger){case"click":desc.addEvent("click",function(event){this.toggleDesc(event,desc,descFx)}.bindWithEvent(this));break;case"hover":slide.addEvents({mouseenter:function(){desc.store("mouseOver",true);this.showDesc(desc,descFx)}.bind(this),mouseleave:function(){desc.store("mouseOver",false);this.hideDesc.delay(hideDelay,this,[desc,descFx])}.bind(this)});break}},this)},toggleDesc:function(event,desc,descFx){var hidden=desc.retrieve("hidden");if(event.alt||event.control||event.shift||document.id(event.target).get("tag")==="a"||event.event.button!==0){return true}if(hidden===true){this.showDesc(desc,descFx)}else{this.hideDesc(desc,descFx)}return true},showDesc:function(desc,descFx){descFx.cancel().start(this.showClass);desc.store("hidden",false)},hideDesc:function(desc,descFx){var mouseOver=desc.retrieve("mouseOver",false);if(mouseOver===false){descFx.cancel().start(this.hiddenClass);desc.store("hidden",true)}}});tgr.InputValidator=new Class({Implements:Options,options:{errorMsg:"Validation failed.",test:function(field){return true}},initialize:function(validatorName,options){this.setOptions(options);this.validatorName=validatorName},test:function(field,props){if(document.id(field)){return this.options.test(document.id(field),props||this.getProps(field))}return false},getError:function(field,props){var err=this.options.errorMsg;if($type(err)==="function"){err=err(document.id(field),props||this.getProps(field))}return err},getProps:function(field){if(!document.id(field)){return{}}return field.get("validatorProps")}});Element.Properties.validatorProps={set:function(validator,props){return(this.retrieve("validatorProps",{})[validator]=props)},get:function(){return this.retrieve("validatorProps")}};tgr.FormValidate=new Class({Implements:[Events,Options],options:{fieldSelectors:"input, select, textarea",haltSubmitOnError:true,ignoreHidden:true,validateOnBlur:true,validateOnChange:true,validateOnKeyDown:true,validateOnSubmit:true,warningPrefix:"Warning: ",errorPrefix:"Error: "},initialize:function(form,options){this.setOptions(options);this.form=document.id(form);if(!form){return}this.form.store("validator",this);if(this.options.validateOnSubmit){this.form.addEvent("submit",function(event){this.onSubmit(event)}.bind(this))}if(this.options.validateOnBlur||this.options.validateOnChange||this.options.validateOnKeyDown){this.addFieldEvents(this.getFields())}},getFields:function(){return(this.fields=this.form.getElements(this.options.fieldSelectors))},addFieldEvents:function(fields){fields.each(function(field){if(this.options.validateOnBlur){field.addEvent("blur",this.validateMonitor.pass([50,field,false],this))}if(this.options.validateOnChange){field.addEvent("change",this.validateMonitor.pass([50,field,true],this))}if(this.options.validateOnKeyDown){field.addEvent("keydown",this.validateMonitor.pass([500,field,false],this))}},this)},validateMonitor:function(delay,field,force){$clear(this.timer);this.timer=this.validateField.delay(delay,this,[field,force])},onSubmit:function(event){if(!this.validate(event)&&event){event.preventDefault()}else{this.fields.each(function(field){if(field.retrieve("default")){field.value=""}});this.reset()}},reset:function(){this.getFields().each(this.resetField,this);return this},resetField:function(field){field=document.id(field);if(field){field.eliminate("passed")}return this},validate:function(event){var result=this.getFields().map(function(field){return this.validateField(field,true)},this).every(function(valid){return valid});if(!result&&this.options.haltSubmitOnError&&event){event.preventDefault()}return result},addValidator:function(field,validator,props){field.retrieve("validators",[]).include(validator);if(props){field.retrieve("validatorProps",{})[validator]=props}},validateField:function(field,force){var validators=field.retrieve("validators"),passed=field.retrieve("passed",true),validatorsFailed=[];field=document.id(field);if(field&&validators){validators.each(function(validator){if(!this.test(validator,field)){validatorsFailed.include(validator)}}.bind(this));passed=(validatorsFailed.length===0);if(passed){field.store("passed",true);this.fireEvent("fieldPass",field)}else{field.store("passed",false);this.fireEvent("fieldFail",[field,validatorsFailed])}}return passed},test:function(validator,field){var validatorFunc=this.getValidator(validator),isValid=true;if(field.retrieve("ignoreValidation")){return true}isValid=(validatorFunc)?validatorFunc.test(field):true;if(validatorFunc&&this.isVisible(field)){this.fireEvent("fieldValidate",[isValid,field,validator])}return isValid},isVisible:function(field){if(!this.options.ignoreHidden){return true}while(field!==document.body&&field!==this.form){if(field.getStyle("display")==="none"){return false}field=field.getParent()}return true},ignoreField:function(field){if(field){field.store("ignoreValidation",true)}return field},enforceField:function(field){if(field){field.store("ignoreValidation",false)}return field}});tgr.FormValidate.adders={validators:{},newValidator:function(validatorName,options){this.validators[validatorName]=new tgr.InputValidator(validatorName,options);if(!this.initialize){this.implement({validators:this.validators})}},newValidators:function(validators){$A(validators).each(function(validator){this.newValidator(validator[0],validator[1])},this)},getValidator:function(validator){return this.validators[validator]}};$extend(tgr.FormValidate,tgr.FormValidate.adders);tgr.FormValidate.implement(tgr.FormValidate.adders);tgr.FormValidate.newValidators([["IsEmpty",{errorMsg:false,test:function(element){if(element.type==="select-one"||element.type==="select"){return !((element.selectedIndex>=0&&element.options[element.selectedIndex].value!=="")||(element.options[element.selectedIndex].value!==element.retrieve("default")))}else{return((element.get("value")===null)||(element.get("value").length===0)||(element.retrieve("default")))}}}],["required",{errorMsg:function(){return"This is a required field."},test:function(element){return !(tgr.FormValidate.getValidator("IsEmpty").test(element))}}],["minLength",{errorMsg:function(element,props){if($type(props.minLength)){return"The minimum length of this field is {minLength}. Please enter {remaining} more character(s)".substitute({minLength:props.minLength,remaining:(props.minLength-element.get("value").length)})}else{return""}},test:function(element,props){if($type(props.minLength)){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(element.get("value").length>=$pick(props.minLength,0))}else{return true}}}],["maxLength",{errorMsg:function(element,props){if($type(props.maxLength)){return"The maximum length of this field is {maxLength}. Please remove {remaining} character(s)".substitute({maxLength:props.maxLength,remaining:(element.get("value").length-props.maxLength)})}else{return""}},test:function(element,props){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(element.get("value").length<=$pick(props.maxLength,10000))}}],["integer",{errorMsg:"Please enter an integer in this field. Numbers with decimals (e.g. 1.25) are not permitted.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^(-?[1-9]\d*|0)$/).test(element.get("value"))}}],["numeric",{errorMsg:"Please enter only numeric values in this field (i.e. &ldquo;1&rdquo; or &ldquo;1.1&rdquo; or &ldquo;-1&rdquo; or &ldquo;-1.1&rdquo;).",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^-?(?:0$0(?=\d*\.)|[1-9]|0)\d*(\.\d+)?$/).test(element.get("value"))}}],["digits",{errorMsg:"Please use numbers and punctuation only in this field (for example, a phone number with dashes or dots is permitted).",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^[\d() .:\-\+#]+$/.test(element.get("value")))}}],["alpha",{errorMsg:"Please use letters only (a-z) with in this field. No spaces or other characters are allowed.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^[a-zA-ZÃ€Ã?Ã‚Ã„Ã†Ã Ã¡Ã¢Ã¤Ã¦ÃˆÃ‰ÃŠÃ‹Ã¨Ã©ÃªÃ«ÃŒÃ?ÃŽÃ?Ã¬ÃÃ®Ã¯Ã‘Ã±Ã’Ã“Ã”Ã–Ã•Ã²Ã³Ã´Ã¶ÃµÃ™ÃšÃ›ÃœÃ¹ÃºÃ»Ã¼]+$/).test(element.get("value"))}}],["alphanum",{errorMsg:"Please use only letters (a-z) or numbers (0-9) in this field. No spaces or other characters are allowed.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||!(/\WÃ€Ã?Ã‚Ã„Ã†Ã Ã¡Ã¢Ã¤Ã¦ÃˆÃ‰ÃŠÃ‹Ã¨Ã©ÃªÃ«ÃŒÃ?ÃŽÃ?Ã¬ÃÃ®Ã¯Ã‘Ã±Ã’Ã“Ã”Ã–Ã•Ã²Ã³Ã´Ã¶ÃµÃ™ÃšÃ›ÃœÃ¹ÃºÃ»Ã¼/).test(element.get("value"))}}],["name",{errorMsg:"Please use only letters (a-z), spaces, and punctuation in this field. No numbers are allowed.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^[A-Z\s\.\,\'\-Ã€Ã?Ã‚Ã„Ã†Ã Ã¡Ã¢Ã¤Ã¦ÃˆÃ‰ÃŠÃ‹Ã¨Ã©ÃªÃ«ÃŒÃ?ÃŽÃ?Ã¬ÃÃ®Ã¯Ã‘Ã±Ã’Ã“Ã”Ã–Ã•Ã²Ã³Ã´Ã¶ÃµÃ™ÃšÃ›ÃœÃ¹ÃºÃ»Ã¼]+$/i).test(element.get("value"))}}],["date",{errorMsg:function(element,props){if(Date.parse){var format=props.dateFormat||"%x";return"Please enter a valid date such as {date}".substitute({date:new Date().format(format)})}else{return"Please enter a valid date such as MM/DD/YYYY (i.e. &ldquo;12/31/1999&rdquo;)"}},test:function(element,props){if(tgr.FormValidate.getValidator("IsEmpty").test(element)){return true}var d,format,formatted,regex;if(Date.parse){format=props.dateFormat||"%x";d=Date.parse(element.get("value"));formatted=d.format(format);if(formatted!=="invalid date"){element.set("value",formatted)}return !isNaN(d)}else{regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;if(!regex.test(element.get("value"))){return false}d=new Date(element.get("value").replace(regex,"$1/$2/$3"));return(parseInt(RegExp.$1,10)===(1+d.getMonth()))&&(parseInt(RegExp.$2,10)===d.getDate())&&(parseInt(RegExp.$3,10)===d.getFullYear())}}}],["email",{errorMsg:"Please enter a valid email address. For example &ldquo;fred@example.com&rdquo;.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^[A-Z0-9._%+\-]+@[A-Z0-9.\-]+\.[A-Z]{2,4}$/i).test(element.get("value"))}}],["url",{errorMsg:"Please enter a valid URL such as http://www.google.com.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_\-]*)(\.[A-Z0-9][A-Z0-9_\-]*)+)(:(\d+))?\/?/i).test(element.get("value"))}}],["currency-dollar",{errorMsg:"Please enter a valid $ amount. For example $100.00.",test:function(element){return tgr.FormValidate.getValidator("IsEmpty").test(element)||(/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get("value"))}}],["one-required",{errorMsg:"Please enter something for at least one of these inputs.",test:function(element,props){var p=document.id(props["validate-one-required"])||element.parentNode;return p.getElements("input").some(function(el){if(["checkbox","radio"].contains(el.get("type"))){return el.get("checked")}return el.get("value")})}}]]);Element.Properties.validator={set:function(options){var validator=this.retrieve("validator");if(validator){validator.setOptions(options)}return this.store("validator:options")},get:function(options){if(options||!this.retrieve("validator")){if(options||!this.retrieve("validator:options")){this.set("validator",options)}this.store("validator",new FormValidator(this,this.retrieve("validator:options")))}return this.retrieve("validator")}};Element.implement({validate:function(options){this.set("validator",options);return this.get("validator",options).validate()}});tgr.FormHandler=new Class({Implements:[Events,Options],options:{formOptions:{},formValidate:function(result,form,event){return},showDefaultValue:true},initialize:function(form,fields,options){this.setOptions(options);this.form=document.id(form);if(!this.form){return}this.firstRun=true;this.fieldElements=[];this.validator=new tgr.FormValidate(this.form,this.options.formOptions);var field;for(field in fields){if(fields.hasOwnProperty(field)){this.buildField(field,fields[field])}}this.firstRun=false},buildField:function(field,options){var fieldOptions=this.getFieldOptions(field,options);this.form.getElements(field).each(function(element){this.fieldElements.push(element);if(this.options.showDefaultValue){element.store("defaultValue",fieldOptions.defaultValue);this.defaultValue(element,fieldOptions.defaultValue);element.addEvents({blur:this.defaultValue.pass([element,fieldOptions.defaultValue],this),focus:this.defaultValue.pass([element,fieldOptions.defaultValue],this)})}if(fieldOptions.validator){this.addValidator(element,fieldOptions.validator)}if(fieldOptions.validators.length!==0){fieldOptions.validators.each(function(validator){this.addValidator(element,validator)},this)}this.validator.addEvents({fieldPass:fieldOptions.fieldPass,fieldFail:fieldOptions.fieldFail,fieldValidate:fieldOptions.fieldValidate,formValidate:this.options.formValidate})}.bind(this))},getFieldOptions:function(field,options){var fieldOptions={defaultValue:"",fieldPass:function(field){return},fieldFail:function(field,validatorsFailed){return},fieldValidate:function(isValid,field,validator){return},validator:false,validators:[]},item=false;for(item in options){if(options.hasOwnProperty(item)){switch(item){case"defaultValue":fieldOptions.defaultValue=options[item];break;case"fieldPass":fieldOptions.fieldPass=options[item];break;case"fieldFail":fieldOptions.fieldFail=options[item];break;case"fieldValidate":fieldOptions.fieldValidate=options[item];break;case"validator":fieldOptions.validator=options[item];break;case"validators":fieldOptions.validators=options[item];break}}}return fieldOptions},defaultValue:function(element,defaultValue){if((!element.retrieve("default",false)&&element.value==="")||(this.firstRun&&element.value===defaultValue)){element.store("default",true).addClass("default").value=defaultValue}else{if(element.retrieve("default")){element.store("default",false).removeClass("default").value=""}}},addValidator:function(element,validator){if($type(validator)==="array"){this.validator.addValidator(element,validator[0],validator[1])}else{this.validator.addValidator(element,validator)}}});