/*
 * jQuery Cycle Plugin (core engine)
 * Examples and documentation at: http://jquery.malsup.com/cycle/
 * Copyright (c) 2007-2010 M. Alsup
 * Version: 2.88 (08-JUN-2010)
 * Dual licensed under the MIT and GPL licenses.
 * http://jquery.malsup.com/license.html
 * Requires: jQuery v1.2.6 or later
 */
(function($){var ver="2.88";if($.support==undefined){$.support={opacity:!($.browser.msie)};}function debug(s){if($.fn.cycle.debug){log(s);}}function log(){if(window.console&&window.console.log){window.console.log("[cycle] "+Array.prototype.join.call(arguments," "));}}$.fn.cycle=function(options,arg2){var o={s:this.selector,c:this.context};if(this.length===0&&options!="stop"){if(!$.isReady&&o.s){log("DOM not ready, queuing slideshow");$(function(){$(o.s,o.c).cycle(options,arg2);});return this;}log("terminating; zero elements found by selector"+($.isReady?"":" (DOM not ready)"));return this;}return this.each(function(){var opts=handleArguments(this,options,arg2);if(opts===false){return;}opts.updateActivePagerLink=opts.updateActivePagerLink||$.fn.cycle.updateActivePagerLink;if(this.cycleTimeout){clearTimeout(this.cycleTimeout);}this.cycleTimeout=this.cyclePause=0;var $cont=$(this);var $slides=opts.slideExpr?$(opts.slideExpr,this):$cont.children();var els=$slides.get();if(els.length<2){log("terminating; too few slides: "+els.length);return;}var opts2=buildOptions($cont,$slides,els,opts,o);if(opts2===false){return;}var startTime=opts2.continuous?10:getTimeout(els[opts2.currSlide],els[opts2.nextSlide],opts2,!opts2.rev);if(startTime){startTime+=(opts2.delay||0);if(startTime<10){startTime=10;}debug("first timeout: "+startTime);this.cycleTimeout=setTimeout(function(){go(els,opts2,0,(!opts2.rev&&!opts.backwards));},startTime);}});};function handleArguments(cont,options,arg2){if(cont.cycleStop==undefined){cont.cycleStop=0;}if(options===undefined||options===null){options={};}if(options.constructor==String){switch(options){case"destroy":case"stop":var opts=$(cont).data("cycle.opts");if(!opts){return false;}cont.cycleStop++;if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);}cont.cycleTimeout=0;$(cont).removeData("cycle.opts");if(options=="destroy"){destroy(opts);}return false;case"toggle":cont.cyclePause=(cont.cyclePause===1)?0:1;checkInstantResume(cont.cyclePause,arg2,cont);return false;case"pause":cont.cyclePause=1;return false;case"resume":cont.cyclePause=0;checkInstantResume(false,arg2,cont);return false;case"prev":case"next":var opts=$(cont).data("cycle.opts");if(!opts){log('options not found, "prev/next" ignored');return false;}$.fn.cycle[options](opts);return false;default:options={fx:options};}return options;}else{if(options.constructor==Number){var num=options;options=$(cont).data("cycle.opts");if(!options){log("options not found, can not advance slide");return false;}if(num<0||num>=options.elements.length){log("invalid slide index: "+num);return false;}options.nextSlide=num;if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0;}if(typeof arg2=="string"){options.oneTimeFx=arg2;}go(options.elements,options,1,num>=options.currSlide);return false;}}return options;function checkInstantResume(isPaused,arg2,cont){if(!isPaused&&arg2===true){var options=$(cont).data("cycle.opts");if(!options){log("options not found, can not resume");return false;}if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0;}go(options.elements,options,1,(!opts.rev&&!opts.backwards));}}}function removeFilter(el,opts){if(!$.support.opacity&&opts.cleartype&&el.style.filter){try{el.style.removeAttribute("filter");}catch(smother){}}}function destroy(opts){if(opts.next){$(opts.next).unbind(opts.prevNextEvent);}if(opts.prev){$(opts.prev).unbind(opts.prevNextEvent);}if(opts.pager||opts.pagerAnchorBuilder){$.each(opts.pagerAnchors||[],function(){this.unbind().remove();});}opts.pagerAnchors=null;if(opts.destroy){opts.destroy(opts);}}function buildOptions($cont,$slides,els,options,o){var opts=$.extend({},$.fn.cycle.defaults,options||{},$.metadata?$cont.metadata():$.meta?$cont.data():{});if(opts.autostop){opts.countdown=opts.autostopCount||els.length;}var cont=$cont[0];$cont.data("cycle.opts",opts);opts.$cont=$cont;opts.stopCount=cont.cycleStop;opts.elements=els;opts.before=opts.before?[opts.before]:[];opts.after=opts.after?[opts.after]:[];opts.after.unshift(function(){opts.busy=0;});if(!$.support.opacity&&opts.cleartype){opts.after.push(function(){removeFilter(this,opts);});}if(opts.continuous){opts.after.push(function(){go(els,opts,0,(!opts.rev&&!opts.backwards));});}saveOriginalOpts(opts);if(!$.support.opacity&&opts.cleartype&&!opts.cleartypeNoBg){clearTypeFix($slides);}if($cont.css("position")=="static"){$cont.css("position","relative");}if(opts.width){$cont.width(opts.width);}if(opts.height&&opts.height!="auto"){$cont.height(opts.height);}if(opts.startingSlide){opts.startingSlide=parseInt(opts.startingSlide);}else{if(opts.backwards){opts.startingSlide=els.length-1;}}if(opts.random){opts.randomMap=[];for(var i=0;i<els.length;i++){opts.randomMap.push(i);}opts.randomMap.sort(function(a,b){return Math.random()-0.5;});opts.randomIndex=1;opts.startingSlide=opts.randomMap[1];}else{if(opts.startingSlide>=els.length){opts.startingSlide=0;}}opts.currSlide=opts.startingSlide||0;var first=opts.startingSlide;$slides.css({position:"absolute",top:0,left:0}).hide().each(function(i){var z;if(opts.backwards){z=first?i<=first?els.length+(i-first):first-i:els.length-i;}else{z=first?i>=first?els.length-(i-first):first-i:els.length-i;}$(this).css("z-index",z);});$(els[first]).css("opacity",1).show();removeFilter(els[first],opts);if(opts.fit&&opts.width){$slides.width(opts.width);}if(opts.fit&&opts.height&&opts.height!="auto"){$slides.height(opts.height);}var reshape=opts.containerResize&&!$cont.innerHeight();if(reshape){var maxw=0,maxh=0;for(var j=0;j<els.length;j++){var $e=$(els[j]),e=$e[0],w=$e.outerWidth(),h=$e.outerHeight();if(!w){w=e.offsetWidth||e.width||$e.attr("width");}if(!h){h=e.offsetHeight||e.height||$e.attr("height");}maxw=w>maxw?w:maxw;maxh=h>maxh?h:maxh;}if(maxw>0&&maxh>0){$cont.css({width:maxw+"px",height:maxh+"px"});}}if(opts.pause){$cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;});}if(supportMultiTransitions(opts)===false){return false;}var requeue=false;options.requeueAttempts=options.requeueAttempts||0;$slides.each(function(){var $el=$(this);this.cycleH=(opts.fit&&opts.height)?opts.height:($el.height()||this.offsetHeight||this.height||$el.attr("height")||0);this.cycleW=(opts.fit&&opts.width)?opts.width:($el.width()||this.offsetWidth||this.width||$el.attr("width")||0);if($el.is("img")){var loadingIE=($.browser.msie&&this.cycleW==28&&this.cycleH==30&&!this.complete);var loadingFF=($.browser.mozilla&&this.cycleW==34&&this.cycleH==19&&!this.complete);var loadingOp=($.browser.opera&&((this.cycleW==42&&this.cycleH==19)||(this.cycleW==37&&this.cycleH==17))&&!this.complete);var loadingOther=(this.cycleH==0&&this.cycleW==0&&!this.complete);if(loadingIE||loadingFF||loadingOp||loadingOther){if(o.s&&opts.requeueOnImageNotLoaded&&++options.requeueAttempts<100){log(options.requeueAttempts," - img slide not loaded, requeuing slideshow: ",this.src,this.cycleW,this.cycleH);setTimeout(function(){$(o.s,o.c).cycle(options);},opts.requeueTimeout);requeue=true;return false;}else{log("could not determine size of image: "+this.src,this.cycleW,this.cycleH);}}}return true;});if(requeue){return false;}opts.cssBefore=opts.cssBefore||{};opts.animIn=opts.animIn||{};opts.animOut=opts.animOut||{};$slides.not(":eq("+first+")").css(opts.cssBefore);if(opts.cssFirst){$($slides[first]).css(opts.cssFirst);}if(opts.timeout){opts.timeout=parseInt(opts.timeout);if(opts.speed.constructor==String){opts.speed=$.fx.speeds[opts.speed]||parseInt(opts.speed);}if(!opts.sync){opts.speed=opts.speed/2;}var buffer=opts.fx=="shuffle"?500:250;while((opts.timeout-opts.speed)<buffer){opts.timeout+=opts.speed;}}if(opts.easing){opts.easeIn=opts.easeOut=opts.easing;}if(!opts.speedIn){opts.speedIn=opts.speed;}if(!opts.speedOut){opts.speedOut=opts.speed;}opts.slideCount=els.length;opts.currSlide=opts.lastSlide=first;if(opts.random){if(++opts.randomIndex==els.length){opts.randomIndex=0;}opts.nextSlide=opts.randomMap[opts.randomIndex];}else{if(opts.backwards){opts.nextSlide=opts.startingSlide==0?(els.length-1):opts.startingSlide-1;}else{opts.nextSlide=opts.startingSlide>=(els.length-1)?0:opts.startingSlide+1;}}if(!opts.multiFx){var init=$.fn.cycle.transitions[opts.fx];if($.isFunction(init)){init($cont,$slides,opts);}else{if(opts.fx!="custom"&&!opts.multiFx){log("unknown transition: "+opts.fx,"; slideshow terminating");return false;}}}var e0=$slides[first];if(opts.before.length){opts.before[0].apply(e0,[e0,e0,opts,true]);}if(opts.after.length>1){opts.after[1].apply(e0,[e0,e0,opts,true]);}if(opts.next){$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1);});}if(opts.prev){$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1);});}if(opts.pager||opts.pagerAnchorBuilder){buildPager(els,opts);}exposeAddSlide(opts,els);return opts;}function saveOriginalOpts(opts){opts.original={before:[],after:[]};opts.original.cssBefore=$.extend({},opts.cssBefore);opts.original.cssAfter=$.extend({},opts.cssAfter);opts.original.animIn=$.extend({},opts.animIn);opts.original.animOut=$.extend({},opts.animOut);$.each(opts.before,function(){opts.original.before.push(this);});$.each(opts.after,function(){opts.original.after.push(this);});}function supportMultiTransitions(opts){var i,tx,txs=$.fn.cycle.transitions;if(opts.fx.indexOf(",")>0){opts.multiFx=true;opts.fxs=opts.fx.replace(/\s*/g,"").split(",");for(i=0;i<opts.fxs.length;i++){var fx=opts.fxs[i];tx=txs[fx];if(!tx||!txs.hasOwnProperty(fx)||!$.isFunction(tx)){log("discarding unknown transition: ",fx);opts.fxs.splice(i,1);i--;}}if(!opts.fxs.length){log("No valid transitions named; slideshow terminating.");return false;}}else{if(opts.fx=="all"){opts.multiFx=true;opts.fxs=[];for(p in txs){tx=txs[p];if(txs.hasOwnProperty(p)&&$.isFunction(tx)){opts.fxs.push(p);}}}}if(opts.multiFx&&opts.randomizeEffects){var r1=Math.floor(Math.random()*20)+30;for(i=0;i<r1;i++){var r2=Math.floor(Math.random()*opts.fxs.length);opts.fxs.push(opts.fxs.splice(r2,1)[0]);}debug("randomized fx sequence: ",opts.fxs);}return true;}function exposeAddSlide(opts,els){opts.addSlide=function(newSlide,prepend){var $s=$(newSlide),s=$s[0];if(!opts.autostopCount){opts.countdown++;}els[prepend?"unshift":"push"](s);if(opts.els){opts.els[prepend?"unshift":"push"](s);}opts.slideCount=els.length;$s.css("position","absolute");$s[prepend?"prependTo":"appendTo"](opts.$cont);if(prepend){opts.currSlide++;opts.nextSlide++;}if(!$.support.opacity&&opts.cleartype&&!opts.cleartypeNoBg){clearTypeFix($s);}if(opts.fit&&opts.width){$s.width(opts.width);}if(opts.fit&&opts.height&&opts.height!="auto"){$slides.height(opts.height);}s.cycleH=(opts.fit&&opts.height)?opts.height:$s.height();s.cycleW=(opts.fit&&opts.width)?opts.width:$s.width();$s.css(opts.cssBefore);if(opts.pager||opts.pagerAnchorBuilder){$.fn.cycle.createPagerAnchor(els.length-1,s,$(opts.pager),els,opts);}if($.isFunction(opts.onAddSlide)){opts.onAddSlide($s);}else{$s.hide();}};}$.fn.cycle.resetState=function(opts,fx){fx=fx||opts.fx;opts.before=[];opts.after=[];opts.cssBefore=$.extend({},opts.original.cssBefore);opts.cssAfter=$.extend({},opts.original.cssAfter);opts.animIn=$.extend({},opts.original.animIn);opts.animOut=$.extend({},opts.original.animOut);opts.fxFn=null;$.each(opts.original.before,function(){opts.before.push(this);});$.each(opts.original.after,function(){opts.after.push(this);});var init=$.fn.cycle.transitions[fx];if($.isFunction(init)){init(opts.$cont,$(opts.elements),opts);}};function go(els,opts,manual,fwd){if(manual&&opts.busy&&opts.manualTrump){debug("manualTrump in go(), stopping active transition");$(els).stop(true,true);opts.busy=false;}if(opts.busy){debug("transition active, ignoring new tx request");return;}var p=opts.$cont[0],curr=els[opts.currSlide],next=els[opts.nextSlide];if(p.cycleStop!=opts.stopCount||p.cycleTimeout===0&&!manual){return;}if(!manual&&!p.cyclePause&&!opts.bounce&&((opts.autostop&&(--opts.countdown<=0))||(opts.nowrap&&!opts.random&&opts.nextSlide<opts.currSlide))){if(opts.end){opts.end(opts);}return;}var changed=false;if((manual||!p.cyclePause)&&(opts.nextSlide!=opts.currSlide)){changed=true;var fx=opts.fx;curr.cycleH=curr.cycleH||$(curr).height();curr.cycleW=curr.cycleW||$(curr).width();next.cycleH=next.cycleH||$(next).height();next.cycleW=next.cycleW||$(next).width();if(opts.multiFx){if(opts.lastFx==undefined||++opts.lastFx>=opts.fxs.length){opts.lastFx=0;}fx=opts.fxs[opts.lastFx];opts.currFx=fx;}if(opts.oneTimeFx){fx=opts.oneTimeFx;opts.oneTimeFx=null;}$.fn.cycle.resetState(opts,fx);if(opts.before.length){$.each(opts.before,function(i,o){if(p.cycleStop!=opts.stopCount){return;}o.apply(next,[curr,next,opts,fwd]);});}var after=function(){$.each(opts.after,function(i,o){if(p.cycleStop!=opts.stopCount){return;}o.apply(next,[curr,next,opts,fwd]);});};debug("tx firing; currSlide: "+opts.currSlide+"; nextSlide: "+opts.nextSlide);opts.busy=1;if(opts.fxFn){opts.fxFn(curr,next,opts,after,fwd,manual&&opts.fastOnEvent);}else{if($.isFunction($.fn.cycle[opts.fx])){$.fn.cycle[opts.fx](curr,next,opts,after,fwd,manual&&opts.fastOnEvent);}else{$.fn.cycle.custom(curr,next,opts,after,fwd,manual&&opts.fastOnEvent);}}}if(changed||opts.nextSlide==opts.currSlide){opts.lastSlide=opts.currSlide;if(opts.random){opts.currSlide=opts.nextSlide;if(++opts.randomIndex==els.length){opts.randomIndex=0;}opts.nextSlide=opts.randomMap[opts.randomIndex];if(opts.nextSlide==opts.currSlide){opts.nextSlide=(opts.currSlide==opts.slideCount-1)?0:opts.currSlide+1;}}else{if(opts.backwards){var roll=(opts.nextSlide-1)<0;if(roll&&opts.bounce){opts.backwards=!opts.backwards;opts.nextSlide=1;opts.currSlide=0;}else{opts.nextSlide=roll?(els.length-1):opts.nextSlide-1;opts.currSlide=roll?0:opts.nextSlide+1;}}else{var roll=(opts.nextSlide+1)==els.length;if(roll&&opts.bounce){opts.backwards=!opts.backwards;opts.nextSlide=els.length-2;opts.currSlide=els.length-1;}else{opts.nextSlide=roll?0:opts.nextSlide+1;opts.currSlide=roll?els.length-1:opts.nextSlide-1;}}}}if(changed&&opts.pager){opts.updateActivePagerLink(opts.pager,opts.currSlide,opts.activePagerClass);}var ms=0;if(opts.timeout&&!opts.continuous){ms=getTimeout(els[opts.currSlide],els[opts.nextSlide],opts,fwd);}else{if(opts.continuous&&p.cyclePause){ms=10;}}if(ms>0){p.cycleTimeout=setTimeout(function(){go(els,opts,0,(!opts.rev&&!opts.backwards));},ms);}}$.fn.cycle.updateActivePagerLink=function(pager,currSlide,clsName){$(pager).each(function(){$(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);});};function getTimeout(curr,next,opts,fwd){if(opts.timeoutFn){var t=opts.timeoutFn.call(curr,curr,next,opts,fwd);while((t-opts.speed)<250){t+=opts.speed;}debug("calculated timeout: "+t+"; speed: "+opts.speed);if(t!==false){return t;}}return opts.timeout;}$.fn.cycle.next=function(opts){advance(opts,opts.rev?-1:1);};$.fn.cycle.prev=function(opts){advance(opts,opts.rev?1:-1);};function advance(opts,val){var els=opts.elements;var p=opts.$cont[0],timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0;}if(opts.random&&val<0){opts.randomIndex--;if(--opts.randomIndex==-2){opts.randomIndex=els.length-2;}else{if(opts.randomIndex==-1){opts.randomIndex=els.length-1;}}opts.nextSlide=opts.randomMap[opts.randomIndex];}else{if(opts.random){opts.nextSlide=opts.randomMap[opts.randomIndex];}else{opts.nextSlide=opts.currSlide+val;if(opts.nextSlide<0){if(opts.nowrap){return false;}opts.nextSlide=els.length-1;}else{if(opts.nextSlide>=els.length){if(opts.nowrap){return false;}opts.nextSlide=0;}}}}var cb=opts.onPrevNextEvent||opts.prevNextClick;if($.isFunction(cb)){cb(val>0,opts.nextSlide,els[opts.nextSlide]);}go(els,opts,1,val>=0);return false;}function buildPager(els,opts){var $p=$(opts.pager);$.each(els,function(i,o){$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);});opts.updateActivePagerLink(opts.pager,opts.startingSlide,opts.activePagerClass);}$.fn.cycle.createPagerAnchor=function(i,el,$p,els,opts){var a;if($.isFunction(opts.pagerAnchorBuilder)){a=opts.pagerAnchorBuilder(i,el);debug("pagerAnchorBuilder("+i+", el) returned: "+a);}else{a='<a href="#">'+(i+1)+"</a>";}if(!a){return;}var $a=$(a);if($a.parents("body").length===0){var arr=[];if($p.length>1){$p.each(function(){var $clone=$a.clone(true);$(this).append($clone);arr.push($clone[0]);});$a=$(arr);}else{$a.appendTo($p);}}opts.pagerAnchors=opts.pagerAnchors||[];opts.pagerAnchors.push($a);$a.bind(opts.pagerEvent,function(e){e.preventDefault();opts.nextSlide=i;var p=opts.$cont[0],timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0;}var cb=opts.onPagerEvent||opts.pagerClick;if($.isFunction(cb)){cb(opts.nextSlide,els[opts.nextSlide]);}go(els,opts,1,opts.currSlide<i);});if(!/^click/.test(opts.pagerEvent)&&!opts.allowPagerClickBubble){$a.bind("click.cycle",function(){return false;});}if(opts.pauseOnPagerHover){$a.hover(function(){opts.$cont[0].cyclePause++;},function(){opts.$cont[0].cyclePause--;});}};$.fn.cycle.hopsFromLast=function(opts,fwd){var hops,l=opts.lastSlide,c=opts.currSlide;if(fwd){hops=c>l?c-l:opts.slideCount-l;}else{hops=c<l?l-c:l+opts.slideCount-c;}return hops;};function clearTypeFix($slides){debug("applying clearType background-color hack");function hex(s){s=parseInt(s).toString(16);return s.length<2?"0"+s:s;}function getBg(e){for(;e&&e.nodeName.toLowerCase()!="html";e=e.parentNode){var v=$.css(e,"background-color");if(v.indexOf("rgb")>=0){var rgb=v.match(/\d+/g);return"#"+hex(rgb[0])+hex(rgb[1])+hex(rgb[2]);}if(v&&v!="transparent"){return v;}}return"#ffffff";}$slides.each(function(){$(this).css("background-color",getBg(this));});}$.fn.cycle.commonReset=function(curr,next,opts,w,h,rev){$(opts.elements).not(curr).hide();opts.cssBefore.opacity=1;opts.cssBefore.display="block";if(w!==false&&next.cycleW>0){opts.cssBefore.width=next.cycleW;}if(h!==false&&next.cycleH>0){opts.cssBefore.height=next.cycleH;}opts.cssAfter=opts.cssAfter||{};opts.cssAfter.display="none";$(curr).css("zIndex",opts.slideCount+(rev===true?1:0));$(next).css("zIndex",opts.slideCount+(rev===true?0:1));};$.fn.cycle.custom=function(curr,next,opts,cb,fwd,speedOverride){var $l=$(curr),$n=$(next);var speedIn=opts.speedIn,speedOut=opts.speedOut,easeIn=opts.easeIn,easeOut=opts.easeOut;$n.css(opts.cssBefore);if(speedOverride){if(typeof speedOverride=="number"){speedIn=speedOut=speedOverride;}else{speedIn=speedOut=1;}easeIn=easeOut=null;}var fn=function(){$n.animate(opts.animIn,speedIn,easeIn,cb);};$l.animate(opts.animOut,speedOut,easeOut,function(){if(opts.cssAfter){$l.css(opts.cssAfter);}if(!opts.sync){fn();}});if(opts.sync){fn();}};$.fn.cycle.transitions={fade:function($cont,$slides,opts){$slides.not(":eq("+opts.currSlide+")").css("opacity",0);opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);opts.cssBefore.opacity=0;});opts.animIn={opacity:1};opts.animOut={opacity:0};opts.cssBefore={top:0,left:0};}};$.fn.cycle.ver=function(){return ver;};$.fn.cycle.defaults={fx:"fade",timeout:4000,timeoutFn:null,continuous:0,speed:1000,speedIn:null,speedOut:null,next:null,prev:null,onPrevNextEvent:null,prevNextEvent:"click.cycle",pager:null,onPagerEvent:null,pagerEvent:"click.cycle",allowPagerClickBubble:false,pagerAnchorBuilder:null,before:null,after:null,end:null,easing:null,easeIn:null,easeOut:null,shuffle:null,animIn:null,animOut:null,cssBefore:null,cssAfter:null,fxFn:null,height:"auto",startingSlide:0,sync:1,random:0,fit:0,containerResize:1,pause:0,pauseOnPagerHover:0,autostop:0,autostopCount:0,delay:0,slideExpr:null,cleartype:!$.support.opacity,cleartypeNoBg:false,nowrap:0,fastOnEvent:0,randomizeEffects:1,rev:0,manualTrump:true,requeueOnImageNotLoaded:true,requeueTimeout:250,activePagerClass:"activeSlide",updateActivePagerLink:null,backwards:false};})(jQuery);

/*!
 * jQuery Tools v1.2.5 - The missing UI library for the Web
 * overlay/overlay.js
 * toolbox/toolbox.expose.js
 * http://flowplayer.org/tools/
 */
(function(a){a.tools=a.tools||{version:"v1.2.5"},a.tools.overlay={addEffect:function(a,b,d){c[a]=[b,d]},conf:{close:null,closeOnClick:!0,closeOnEsc:!0,closeSpeed:"fast",effect:"default",fixed:!a.browser.msie||a.browser.version>6,left:"center",load:!1,mask:null,oneInstance:!0,speed:"normal",target:null,top:"10%"}};var b=[],c={};a.tools.overlay.addEffect("default",function(b,c){var d=this.getConf(),e=a(window);d.fixed||(b.top+=e.scrollTop(),b.left+=e.scrollLeft()),b.position=d.fixed?"fixed":"absolute",this.getOverlay().css(b).fadeIn(d.speed,c)},function(a){this.getOverlay().fadeOut(this.getConf().closeSpeed,a)});function d(d,e){var f=this,g=d.add(f),h=a(window),i,j,k,l=a.tools.expose&&(e.mask||e.expose),m=Math.random().toString().slice(10);l&&(typeof l=="string"&&(l={color:l}),l.closeOnClick=l.closeOnEsc=!1);var n=e.target||d.attr("rel");j=n?a(n):null||d;if(!j.length)throw"Could not find Overlay: "+n;d&&d.index(j)==-1&&d.click(function(a){f.load(a);return a.preventDefault()}),a.extend(f,{load:function(d){if(f.isOpened())return f;var i=c[e.effect];if(!i)throw"Overlay: cannot find effect : \""+e.effect+"\"";e.oneInstance&&a.each(b,function(){this.close(d)}),d=d||a.Event(),d.type="onBeforeLoad",g.trigger(d);if(d.isDefaultPrevented())return f;k=!0,l&&a(j).expose(l);var n=e.top,o=e.left,p=j.outerWidth({margin:!0}),q=j.outerHeight({margin:!0});typeof n=="string"&&(n=n=="center"?Math.max((h.height()-q)/2,0):parseInt(n,10)/100*h.height()),o=="center"&&(o=Math.max((h.width()-p)/2,0)),i[0].call(f,{top:n,left:o},function(){k&&(d.type="onLoad",g.trigger(d))}),l&&e.closeOnClick&&a.mask.getMask().one("click",f.close),e.closeOnClick&&a(document).bind("click."+m,function(b){a(b.target).parents(j).length||f.close(b)}),e.closeOnEsc&&a(document).bind("keydown."+m,function(a){a.keyCode==27&&f.close(a)});return f},close:function(b){if(!f.isOpened())return f;b=b||a.Event(),b.type="onBeforeClose",g.trigger(b);if(!b.isDefaultPrevented()){k=!1,c[e.effect][1].call(f,function(){b.type="onClose",g.trigger(b)}),a(document).unbind("click."+m).unbind("keydown."+m),l&&a.mask.close();return f}},getOverlay:function(){return j},getTrigger:function(){return d},getClosers:function(){return i},isOpened:function(){return k},getConf:function(){return e}}),a.each("onBeforeLoad,onStart,onLoad,onBeforeClose,onClose".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),i=j.find(e.close||".close"),!i.length&&!e.close&&(i=a("<a class=\"close\"></a>"),j.prepend(i)),i.click(function(a){f.close(a)}),e.load&&f.load()}a.fn.overlay=function(c){var e=this.data("overlay");if(e)return e;a.isFunction(c)&&(c={onBeforeLoad:c}),c=a.extend(!0,{},a.tools.overlay.conf,c),this.each(function(){e=new d(a(this),c),b.push(e),a(this).data("overlay",e)});return c.api?e:this}})(jQuery);
(function(a){a.tools=a.tools||{version:"v1.2.5"};var b;b=a.tools.expose={conf:{maskId:"exposeMask",loadSpeed:"slow",closeSpeed:"fast",closeOnClick:!0,closeOnEsc:!0,zIndex:9998,opacity:.8,startOpacity:0,color:"#fff",onLoad:null,onClose:null}};function c(){if(a.browser.msie){var b=a(document).height(),c=a(window).height();return[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b-c<20?c:b]}return[a(document).width(),a(document).height()]}function d(b){if(b)return b.call(a.mask)}var e,f,g,h,i;a.mask={load:function(j,k){if(g)return this;typeof j=="string"&&(j={color:j}),j=j||h,h=j=a.extend(a.extend({},b.conf),j),e=a("#"+j.maskId),e.length||(e=a("<div/>").attr("id",j.maskId),a("body").append(e));var l=c();e.css({position:"absolute",top:0,left:0,width:l[0],height:l[1],display:"none",opacity:j.startOpacity,zIndex:j.zIndex}),j.color&&e.css("backgroundColor",j.color);if(d(j.onBeforeLoad)===!1)return this;j.closeOnEsc&&a(document).bind("keydown.mask",function(b){b.keyCode==27&&a.mask.close(b)}),j.closeOnClick&&e.bind("click.mask",function(b){a.mask.close(b)}),a(window).bind("resize.mask",function(){a.mask.fit()}),k&&k.length&&(i=k.eq(0).css("zIndex"),a.each(k,function(){var b=a(this);/relative|absolute|fixed/i.test(b.css("position"))||b.css("position","relative")}),f=k.css({zIndex:Math.max(j.zIndex+1,i=="auto"?0:i)})),e.css({display:"block"}).fadeTo(j.loadSpeed,j.opacity,function(){a.mask.fit(),d(j.onLoad),g="full"}),g=!0;return this},close:function(){if(g){if(d(h.onBeforeClose)===!1)return this;e.fadeOut(h.closeSpeed,function(){d(h.onClose),f&&f.css({zIndex:i}),g=!1}),a(document).unbind("keydown.mask"),e.unbind("click.mask"),a(window).unbind("resize.mask")}return this},fit:function(){if(g){var a=c();e.css({width:a[0],height:a[1]})}},getMask:function(){return e},isLoaded:function(a){return a?g=="full":g},getConf:function(){return h},getExposed:function(){return f}},a.fn.mask=function(b){a.mask.load(b);return this},a.fn.expose=function(b){a.mask.load(b,this);return this}})(jQuery);


//Benjamin Keen Really Simple Validation
//http://www.benjaminkeen.com/software/rsv/jquery/
(function($) {
    var options = {};
    var returnHash = [];
    $.fn.RSV = function(params) {
        options = $.extend({},
        $.fn.RSV.defaults, params);
        return this.each(function() {
            $(this).bind('submit', {
                currForm: this,
                options: options
            },
            $(this).RSV.validate);
        });
    };
    $.fn.RSV.defaults = {
        rules: [],
        displayType: "alert-all",
        errorFieldClass: null,
        errorTextIntro: "Please fix the following error(s) and resubmit:",
        errorJSItemBullet: "* ",
        errorHTMLItemBullet: "&bull; ",
        errorTargetElementId: "rsvErrors",
        customErrorHandler: null,
        onCompleteHandler: null
    };
    $.fn.RSV.validate = function(event)
    {
        options = event.data.options;
        var form = event.data.currForm;
        var rules = options.rules;
        returnHash = [];
        for (var i = 0; i < rules.length; i++)
        {
            var row = rules[i].replace(/\\,/ig, "%%C%%");
            row = row.split(",");
            var satisfiesIfConditions = true;
            while (row[0].match("^if:"))
            {
                var cond = row[0];
                cond = cond.replace("if:", "");
                var comparison = "equal";
                var parts = [];
                if (cond.search("!=") != -1)
                {
                    parts = cond.split("!=");
                    comparison = "not_equal";
                }
                else
                parts = cond.split("=");
                var fieldToCheck = parts[0];
                var valueToCheck = parts[1];
                var fieldnameValue = "";
                if (form[fieldToCheck].type == undefined)
                {
                    for (var j = 0; j < form[fieldToCheck].length; j++)
                    {
                        if (form[fieldToCheck][j].checked)
                        fieldnameValue = form[fieldToCheck][j].value;
                    }
                }
                else if (form[fieldToCheck].type == "checkbox")
                {
                    if (form[fieldToCheck].checked)
                    fieldnameValue = form[parts[0]].value;
                }
                else
                fieldnameValue = form[parts[0]].value;
                if (comparison == "equal" && fieldnameValue != valueToCheck)
                {
                    satisfiesIfConditions = false;
                    break;
                }
                else if (comparison == "not_equal" && fieldnameValue == valueToCheck)
                {
                    satisfiesIfConditions = false;
                    break;
                }
                else
                row.shift();
            }
            if (!satisfiesIfConditions)
            continue;
            var requirement = row[0];
            var fieldName = row[1];
            var fieldName2,
            fieldName3,
            errorMessage,
            lengthRequirements,
            date_flag;
            if (requirement != "function" && form[fieldName] == undefined)
            {
                alert("RSV Error: the field \"" + fieldName + "\" doesn't exist! Please check your form and settings.");
                return false;
            }
            if (requirement != "function" && options.errorFieldClass)
            {
                if (form[fieldName].type == undefined)
                {
                    for (var j = 0; j < form[fieldName].length; j++)
                    {
                        if ($(form[fieldName][j]).hasClass(options.errorFieldClass))
                        $(form[fieldName][j]).removeClass(options.errorFieldClass);
                    }
                }
                else
                {
                    if ($(form[fieldName]).hasClass(options.errorFieldClass))
                    $(form[fieldName]).removeClass(options.errorFieldClass);
                }
            }
            if (row.length == 6)
            {
                fieldName2 = row[2];
                fieldName3 = row[3];
                date_flag = row[4];
                errorMessage = row[5];
            }
            else if (row.length == 5)
            {
                fieldName2 = row[2];
                fieldName3 = row[3];
                errorMessage = row[4];
            }
            else if (row.length == 4)
            {
                fieldName2 = row[2];
                errorMessage = row[3];
            }
            else
            errorMessage = row[2];
            if (requirement.match("^length"))
            {
                lengthRequirements = requirement;
                requirement = "length";
            }
            if (requirement.match("^range"))
            {
                rangeRequirements = requirement;
                requirement = "range";
            }
            switch (requirement)
            {
            case "required":
                if (form[fieldName].type == undefined)
                {
                    var oneIsChecked = false;
                    for (var j = 0; j < form[fieldName].length; j++)
                    {
                        if (form[fieldName][j].checked)
                        oneIsChecked = true;
                    }
                    if (!oneIsChecked)
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                }
                else if (form[fieldName].type == "select-multiple")
                {
                    var oneIsSelected = false;
                    for (var k = 0; k < form[fieldName].length; k++)
                    {
                        if (form[fieldName][k].selected)
                        oneIsSelected = true;
                    }
                    if (!oneIsSelected || form[fieldName].length == 0)
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                }
                else if (form[fieldName].type == "checkbox")
                {
                    if (!form[fieldName].checked)
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                }
                else if (!form[fieldName].value)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "digits_only":
                if (form[fieldName].value && form[fieldName].value.match(/\D/))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "letters_only":
                if (form[fieldName].value && form[fieldName].value.match(/[^a-zA-Z]/))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "is_alpha":
                if (form[fieldName].value && form[fieldName].value.match(/\W/))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "custom_alpha":
                var conversion = {
                    "L": "[A-Z]",
                    "V": "[AEIOU]",
                    "l": "[a-z]",
                    "v": "[aeiou]",
                    "D": "[a-zA-Z]",
                    "F": "[aeiouAEIOU]",
                    "C": "[BCDFGHJKLMNPQRSTVWXYZ]",
                    "x": "[0-9]",
                    "c": "[bcdfghjklmnpqrstvwxyz]",
                    "X": "[1-9]",
                    "E": "[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]"
                };
                var reg_exp_str = "";
                for (var j = 0; j < fieldName2.length; j++)
                {
                    if (conversion[fieldName2.charAt(j)])
                    reg_exp_str += conversion[fieldName2.charAt(j)];
                    else
                    reg_exp_str += fieldName2.charAt(j);
                }
                var reg_exp = new RegExp(reg_exp_str);
                if (form[fieldName].value && reg_exp.exec(form[fieldName].value) == null)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "reg_exp":
                var reg_exp_str = fieldName2;
                if (row.length == 5)
                var reg_exp = new RegExp(reg_exp_str, fieldName3);
                else
                var reg_exp = new RegExp(reg_exp_str);
                if (form[fieldName].value && reg_exp.exec(form[fieldName].value) == null)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "length":
                comparison_rule = "";
                rule_string = "";
                if (lengthRequirements.match(/length=/))
                {
                    comparison_rule = "equal";
                    rule_string = lengthRequirements.replace("length=", "");
                }
                else if (lengthRequirements.match(/length>=/))
                {
                    comparison_rule = "greater_than_or_equal";
                    rule_string = lengthRequirements.replace("length>=", "");
                }
                else if (lengthRequirements.match(/length>/))
                {
                    comparison_rule = "greater_than";
                    rule_string = lengthRequirements.replace("length>", "");
                }
                else if (lengthRequirements.match(/length<=/))
                {
                    comparison_rule = "less_than_or_equal";
                    rule_string = lengthRequirements.replace("length<=", "");
                }
                else if (lengthRequirements.match(/length</))
                {
                    comparison_rule = "less_than";
                    rule_string = lengthRequirements.replace("length<", "");
                }
                switch (comparison_rule)
                {
                case "greater_than_or_equal":
                    if (! (form[fieldName].value.length >= parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "greater_than":
                    if (! (form[fieldName].value.length > parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than_or_equal":
                    if (! (form[fieldName].value.length <= parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than":
                    if (! (form[fieldName].value.length < parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "equal":
                    var range_or_exact_number = rule_string.match(/[^_]+/);
                    var fieldCount = range_or_exact_number[0].split("-");
                    if (fieldCount.length == 2)
                    {
                        if (form[fieldName].value.length < fieldCount[0] || form[fieldName].value.length > fieldCount[1])
                        {
                            if (!processError(form[fieldName], errorMessage))
                            return false;
                        }
                    }
                    else
                    {
                        if (form[fieldName].value.length != fieldCount[0])
                        {
                            if (!processError(form[fieldName], errorMessage))
                            return false;
                        }
                    }
                    break;
                }
                break;
            case "valid_email":
                if (form[fieldName].value && !isValidEmail(form[fieldName].value))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "valid_date":
                var isLaterDate = false;
                if (date_flag == "later_date")
                isLaterDate = true;
                else if (date_flag == "any_date")
                isLaterDate = false;
                if (!isValidDate(form[fieldName].value, form[fieldName2].value, form[fieldName3].value, isLaterDate))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "same_as":
                if (form[fieldName].value != form[fieldName2].value)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "range":
                comparison_rule = "";
                rule_string = "";
                if (rangeRequirements.match(/range=/))
                {
                    comparison_rule = "equal";
                    rule_string = rangeRequirements.replace("range=", "");
                }
                else if (rangeRequirements.match(/range>=/))
                {
                    comparison_rule = "greater_than_or_equal";
                    rule_string = rangeRequirements.replace("range>=", "");
                }
                else if (rangeRequirements.match(/range>/))
                {
                    comparison_rule = "greater_than";
                    rule_string = rangeRequirements.replace("range>", "");
                }
                else if (rangeRequirements.match(/range<=/))
                {
                    comparison_rule = "less_than_or_equal";
                    rule_string = rangeRequirements.replace("range<=", "");
                }
                else if (rangeRequirements.match(/range</))
                {
                    comparison_rule = "less_than";
                    rule_string = rangeRequirements.replace("range<", "");
                }
                switch (comparison_rule)
                {
                case "greater_than_or_equal":
                    if (! (form[fieldName].value >= Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "greater_than":
                    if (! (form[fieldName].value > Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than_or_equal":
                    if (! (form[fieldName].value <= Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than":
                    if (! (form[fieldName].value < Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "equal":
                    var rangeValues = rule_string.split("-");
                    if ((form[fieldName].value < Number(rangeValues[0])) || (form[fieldName].value > Number(rangeValues[1])))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                }
                break;
            case "function":
                custom_function = fieldName;
                eval("var result = " + custom_function + "()");
                if (result.constructor.toString().indexOf("Array") != -1)
                {
                    for (var j = 0; j < result.length; j++)
                    {
                        if (!processError(result[j][0], result[j][1]))
                        return false;
                    }
                }
                break;
            default:
                alert("Unknown requirement flag in validateFields(): " + requirement);
                return false;
            }
        }
        if (typeof options.customErrorHandler == 'function')
        return options.customErrorHandler(form, returnHash);
        else if (options.displayType == "alert-all")
        {
            var errorStr = options.errorTextIntro + "\n\n";
            for (var i = 0; i < returnHash.length; i++)
            {
                errorStr += options.errorJSItemBullet + returnHash[i][1] + "\n";
                styleField(returnHash[i][0], i == 0);
            }
            if (returnHash.length > 0)
            {
                alert(errorStr);
                return false;
            }
        }
        else if (options.displayType == "display-html")
        {
            var success = displayHTMLErrors(form, returnHash);
            if (!success)
            return false;
        }
        if (typeof options.onCompleteHandler == 'function')
        return options.onCompleteHandler();
        else
        return true;
    }
    function processError(obj, message)
    {
        message = message.replace(/%%C%%/ig, ",");
        var continueProcessing = true;
        switch (options.displayType)
        {
        case "alert-one":
            alert(message);
            styleField(obj, true);
            continueProcessing = false;
            break;
        case "alert-all":
        case "display-html":
            returnHash.push([obj, message]);
            break;
        }
        return continueProcessing;
    }
    function displayHTMLErrors(f, errorInfo)
    {
        var errorHTML = options.errorTextIntro + "<br /><br />";
        for (var i = 0; i < errorInfo.length; i++)
        {
            errorHTML += options.errorHTMLItemBullet + errorInfo[i][1] + "<br />";
            styleField(errorInfo[i][0], i == 0);
        }
        if (errorInfo.length > 0)
        {
            $("#" + options.errorTargetElementId).css("display", "block");
            $("#" + options.errorTargetElementId).html(errorHTML);
            return false;
        }
        return true;
    }
    function styleField(field, focus)
    {
        if (field.type == undefined)
        {
            if (focus)
            field[0].focus();
            for (var i = 0; i < field.length; i++)
            {
                if (!$(field[i]).hasClass(options.errorFieldClass))
                $(field[i]).addClass(options.errorFieldClass);
            }
        }
        else
        {
            if (options.errorFieldClass)
            $(field).addClass(options.errorFieldClass);
            if (focus)
            field.focus();
        }
    }
    function isValidEmail(str)
    {
        var s = $.trim(str);
        var at = "@";
        var dot = ".";
        var lat = s.indexOf(at);
        var lstr = s.length;
        var ldot = s.indexOf(dot);
        if (s.indexOf(at) == -1 || (s.indexOf(at) == -1 || s.indexOf(at) == 0 || s.indexOf(at) == lstr) || (s.indexOf(dot) == -1 || s.indexOf(dot) == 0 || s.indexOf(dot) == lstr) || (s.indexOf(at, (lat + 1)) != -1) || (s.substring(lat - 1, lat) == dot || s.substring(lat + 1, lat + 2) == dot) || (s.indexOf(dot, (lat + 2)) == -1) || (s.indexOf(" ") != -1))
        {
            return false;
        }
        return true;
    }
    function isValidDate(month, day, year, isLaterDate)
    {
        var daysInMonth;
        if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))
        daysInMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        else
        daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        if (!month || !day || !year) return false;
        if (1 > month || month > 12) return false;
        if (year < 0) return false;
        if (1 > day || day > daysInMonth[month - 1]) return false;
        if (isLaterDate)
        {
            var today = new Date();
            var currMonth = today.getMonth() + 1;
            var currDay = today.getDate();
            var currYear = today.getFullYear();
            if (String(currMonth).length == 1) currMonth = "0" + currMonth;
            if (String(currDay).length == 1) currDay = "0" + currDay;
            var currDate = String(currYear) + String(currMonth) + String(currDay);
            if (String(month).length == 1) month = "0" + month;
            if (String(day).length == 1) day = "0" + day;
            incomingDate = String(year) + String(month) + String(day);
            if (Number(currDate) > Number(incomingDate))
            return false;
        }
        return true;
    }
})(jQuery);

/**
 * Appendo Plugin for jQuery v1.01
 * Creates interface to create duplicate clones of last table row (usually for forms)
 * (c) 2008 Kelly Hallman. Free software released under MIT License.
 * See http://deepliquid.com/content/Appendo.html for more info
 */

// Attach appendo as a jQuery plugin
jQuery.fn.appendo = function(opt)
 {
    this.each(function() {
        jQuery.appendo.init(this, opt);
    });
    return this;
};

// appendo namespace
jQuery.appendo = function() {

    // Create a closure so that we can refer to "this" correctly down the line
    var myself = this;

    // Global Options
    // These can be set with inline Javascript like so:
    // jQuery.appendo.opt.maxRows = 5;
    // $.appendo.opt.allowDelete = false;
    // (no need, in fact you shouldn't, wrap in jQuery(document).ready() etc)
    this.opt = {};

    this.init = function(obj, opt) {

        // Extend the defaults with global options and options given, if any
        var options = jQuery.extend({
            labelAdd: 'Add Row',
            labelDel: 'Remove',
            allowDelete: true,
            // copyHandlers does not seem to work
            // it's been removed from the docs for now...
            copyHandlers: false,
            focusFirst: true,
            onAdd: function() {
                return true;
            },
            onDel: function() {
                return true;
            },
            maxRows: 0,
            wrapClass: 'appendoButtons',
            wrapStyle: {
                padding: '.4em .2em .5em'
            },
            buttonStyle: {
                marginRight: '.5em'
            },
            subSelect: 'tr:last'
        },
        myself.opt,
        opt
        );

        // Store clone of last table row
        var $cpy = jQuery(obj).find(options.subSelect).clone(options.copyHandlers);
        // We consider this starting off with 1 row
        var rows = 1;
        // Create two button objects
        var $add_btn = new_button(options.labelAdd).click(clicked_add),
        $del_btn = new_button(options.labelDel).click(clicked_del).hide()
        ;

        // Append a row to table instance
        function add_row()
        {
            var $dup = $cpy.clone(options.copyHandlers);
            $dup.appendTo(obj);
            update_buttons(1);
            if (typeof(options.onAdd) == "function") options.onAdd($dup);
            if ( !! options.focusFirst) $dup.find('input:first').focus();
        };

        // Remove last row from table instance
        function del_row()
        {
            var $row = jQuery(obj).find(options.subSelect);
            if ((typeof(options.onDel) != "function") || options.onDel($row))
            {
                $row.remove();
                update_buttons( - 1);
            }
        };

        // Updates the button states after rows change
        function update_buttons(rowdelta)
        {
            // Update rows if a delta is provided
            rows = rows + (rowdelta || 0);
            // Disable the add button if maxRows is set and we have that many rows
            $add_btn.attr('disabled', (!options.maxRows || (rows < options.maxRows)) ? false: true);
            // Show remove button if we've added rows and allowDelete is set
            (options.allowDelete && (rows > 1)) ? $del_btn.show() : $del_btn.hide();
        };

        // Returns (jQuery) button objects with label
        function new_button(label)
        {
            return jQuery('<button />')
            .css(options.buttonStyle)
            .html(label);
        };

        // This function can be returned to kill a received event
        function nothing(e)
        {
            e.stopPropagation();
            e.preventDefault();
            return false;
        };

        // Handles a click on the add button
        function clicked_add(e)
        {
            if (!options.maxRows || (rows < options.maxRows)) add_row();
            return nothing(e);
        };

        // Handles a click event on the remove button
        function clicked_del(e)
        {
            if (rows > 1) del_row();
            return nothing(e);
        };

        // Add the buttons after the table instance
        jQuery('<div />')
        .addClass(options.wrapClass)
        .css(options.wrapStyle)
        .append($add_btn, $del_btn)
        .insertAfter(obj);

        // Update the buttons
        update_buttons();

    };
    return this;
} ();

// Call default options on any table with class "appendo"
jQuery(function() {
    jQuery('table.appendo').appendo();
});

/*
 *
 * jqTransform
 * by mathieu vilaplana mvilaplana@dfc-e.com
 * Designer ghyslain armand garmand@dfc-e.com
 *
 *
 * Version 1.0 25.09.08
 * Version 1.1 06.08.09
 * Add event click on Checkbox and Radio
 * Auto calculate the size of a select element
 * Can now, disabled the elements
 * Correct bug in ff if click on select (overflow=hidden)
 * No need any more preloading !!
 * 
 ******************************************** */

 (function($) {
    var defaultOptions = {
        preloadImg: true
    };
    var jqTransformImgPreloaded = false;

    var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
        //guillemets to remove for ie
        strImgUrl = strImgUrl.replace(/^url\((.*)\)/, '$1').replace(/^\"(.*)\"$/, '$1');
        var imgHover = new Image();
        imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/, '-hover.$1');
        var imgFocus = new Image();
        imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/, '-focus.$1');
    };


    /***************************
	  Labels
	***************************/
    var jqTransformGetLabel = function(objfield) {
        var selfForm = $(objfield.get(0).form);
		//oLabel.style.filter = null;
        var oLabel = objfield.next();
		
        if (!oLabel.is('label')) {
            oLabel = objfield.prev();
            if (oLabel.is('label')) {
                var inputname = objfield.attr('id');
                if (inputname) {
                    oLabel = selfForm.find('label[for="' + inputname + '"]');
                }
            }
        }
		
        if (oLabel.is('label')) {
            return oLabel.css('cursor', 'pointer');
        }
        return false;
    };

    /* Hide all open selects */
    var jqTransformHideSelect = function(oTarget) {
        var ulVisible = $('.jqTransformSelectWrapper ul:visible');
        ulVisible.each(function() {
            var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
            //do not hide if click on the label object associated to the select
            if (! (oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0))) {
                $(this).hide();
            }
        });
    };
    /* Check for an external click */
    var jqTransformCheckExternalClick = function(event) {
        if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) {
            jqTransformHideSelect($(event.target));
        }
    };

    /* Apply document listener */
    var jqTransformAddDocumentListener = function() {
        $(document).mousedown(jqTransformCheckExternalClick);
    };

    /* Add a new handler for the reset action */
    var jqTransformReset = function(f) {
        var sel;
        $('.jqTransformSelectWrapper select', f).each(function() {
            sel = (this.selectedIndex < 0) ? 0: this.selectedIndex;
            $('ul', $(this).parent()).each(function() {
                $('a:eq(' + sel + ')', this).click();
            });
        });
        $('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
        $('input:checkbox, input:radio', f).each(function() {
            if (this.checked) {
                $('a', $(this).parent()).addClass('jqTransformChecked');
            }
        });
    };

    /***************************
	  Buttons
	 ***************************/
    $.fn.jqTransInputButton = function() {
        return this.each(function() {
            var newBtn = $('<button id="' + this.id + '" name="' + this.name + '" type="' + this.type + '" class="' + this.className + ' jqTransformButton"><span><span>' + $(this).attr('value') + '</span></span>')
            .hover(function() {
                newBtn.addClass('jqTransformButton_hover');
            },
            function() {
                newBtn.removeClass('jqTransformButton_hover')
            })
            .mousedown(function() {
                newBtn.addClass('jqTransformButton_click')
            })
            .mouseup(function() {
                newBtn.removeClass('jqTransformButton_click')
            })
            ;
            $(this).replaceWith(newBtn);
        });
    };

    /***************************
	  Text Fields 
	 ***************************/
    $.fn.jqTransInputText = function() {
        return this.each(function() {
                  var $input = $(this);
        
                  if ($input.hasClass('jqtranformdone') || !$input.is('input')) {
                      return;
                  }
                  $input.addClass('jqtranformdone');
        
                  var oLabel = jqTransformGetLabel($(this));
                  oLabel && oLabel.bind('click',
                  function() {
                      $input.focus();
                  });
        
                  var inputSize = $input.width();
                  // if ($input.attr('size')) {
                  //     inputSize = $input.attr('size') * 10;
                  //     $input.css('width', inputSize);
                  // }
        
                  $input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
                  var $wrapper = $input.parent().parent().parent();
                  $wrapper.css("width", inputSize + 10);
                  $input
                  .focus(function() {
                      $wrapper.addClass("jqTransformInputWrapper_focus");
                  })
                  .blur(function() {
                      $wrapper.removeClass("jqTransformInputWrapper_focus");
                  })
                  .hover(function() {
                      $wrapper.addClass("jqTransformInputWrapper_hover");
                  },
                  function() {
                      $wrapper.removeClass("jqTransformInputWrapper_hover");
                  })
                  ;
        
                  /* If this is safari we need to add an extra class */
                  $.browser.safari && $wrapper.addClass('jqTransformSafari');
                  $.browser.safari && $input.css('width', $wrapper.width() + 16);
                  this.wrapper = $wrapper;
        
              });
    };

    /***************************
	  Check Boxes 
	 ***************************/
    $.fn.jqTransCheckBox = function() {
        return this.each(function() {
            if ($(this).hasClass('jqTransformHidden')) {
                return;
            }

            var $input = $(this);
            var inputSelf = this;

            //set the click on the label
            var oLabel = jqTransformGetLabel($input);
            oLabel && oLabel.click(function() {
                aLink.trigger('click');
            });

            var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
            //wrap and add the link
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
            //on change, change the class of the link
            $input.change(function() {
                this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                return true;
            });
            // Click Handler, trigger the click and change event on the input
            aLink.click(function() {
                //do nothing if the original input is disabled
                if ($input.attr('disabled')) {
                    return false;
                }
                //trigger the envents on the input object
                $input.trigger('click').trigger("change");
                return false;
            });

            // set the default state
            this.checked && aLink.addClass('jqTransformChecked');
        });
    };
    /***************************
	  Radio Buttons 
	 ***************************/
    $.fn.jqTransRadio = function() {
        return this.each(function() {
            if ($(this).hasClass('jqTransformHidden')) {
                return;
            }

            var $input = $(this);
            var inputSelf = this;

            oLabel = jqTransformGetLabel($input);
            oLabel && oLabel.click(function() {
                aLink.trigger('click');
            });

            var aLink = $('<a href="#" class="jqTransformRadio" rel="' + this.name + '"></a>');
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);

            $input.change(function() {
                inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                return true;
            });
            // Click Handler
            aLink.click(function() {
                if ($input.attr('disabled')) {
                    return false;
                }
                $input.trigger('click').trigger('change');

                // uncheck all others of same name input radio elements
                $('input[name="' + $input.attr('name') + '"]', inputSelf.form).not($input).each(function() {
                    $(this).attr('type') == 'radio' && $(this).trigger('change');
                });

                return false;
            });
            // set the default state
            inputSelf.checked && aLink.addClass('jqTransformChecked');
        });
    };

    /***************************
	  TextArea 
	 ***************************/
    $.fn.jqTransTextarea = function() {
        return this.each(function() {
            var textarea = $(this);

            if (textarea.hasClass('jqtransformdone')) {
                return;
            }
            textarea.addClass('jqtransformdone');

            oLabel = jqTransformGetLabel(textarea);
            oLabel && oLabel.click(function() {
                textarea.focus();
            });

            var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
            strTable += '<tr><td id="jqTransformTextarea-tl"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>';
            strTable += '<tr><td id="jqTransformTextarea-ml">&nbsp;</td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr">&nbsp;</td></tr>';
            strTable += '<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></td></tr>';
            strTable += '</table>';
            var oTable = $(strTable)
            .insertAfter(textarea)
            .hover(function() {
                ! oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
            },
            function() {
                oTable.removeClass('jqTransformTextarea-hover');
            })
            ;

            textarea
            .focus(function() {
                oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');
            })
            .blur(function() {
                oTable.removeClass('jqTransformTextarea-focus');
            })
            .appendTo($('#jqTransformTextarea-mm div', oTable))
            ;
            this.oTable = oTable;
            if ($.browser.safari) {
                $('#jqTransformTextarea-mm', oTable)
                .addClass('jqTransformSafariTextarea')
                .find('div')
                .css('height', textarea.height())
                .css('width', textarea.width())
                ;
            }
        });
    };

    /***************************
	  Select 
	 ***************************/
    $.fn.jqTransSelect = function() {
        return this.each(function(index) {
            var $select = $(this);

            if ($select.hasClass('jqTransformHidden')) {
                return;
            }
            if ($select.attr('multiple')) {
                return;
            }

            var oLabel = jqTransformGetLabel($select);
            /* First thing we do is Wrap it */
            var $wrapper = $select
            .addClass('jqTransformHidden')
            .wrap('<div class="jqTransformSelectWrapper"></div>')
            .parent()
            .css({
                zIndex: 10 - index
            })
            ;

            /* Now add the html for the select */
            $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
            var $ul = $('ul', $wrapper).css('width', $select.width()).hide();
            /* Now we add the options */
            $('option', this).each(function(i) {
                var oLi = $('<li><a href="#" index="' + i + '">' + $(this).html() + '</a></li>');
                $ul.append(oLi);
            });



            /* Add click handler to the a */
            $ul.find('a').click(function() {
                $('a.selected', $wrapper).removeClass('selected');
                $(this).addClass('selected');
                /* Fire the onchange event */

                $select[0].selectedIndex = $(this).attr('index');
                $('span:eq(0)', $wrapper).html($(this).html());
                $ul.hide();
                $($select).change();
                return false;
            });
            /* Set the default */
            $('a:eq(' + this.selectedIndex + ')', $ul).click();
            $('span:first', $wrapper).click(function() {
                $("a.jqTransformSelectOpen", $wrapper).trigger('click');
            });
            oLabel && oLabel.click(function() {
                $("a.jqTransformSelectOpen", $wrapper).trigger('click');
            });
            this.oLabel = oLabel;

            /* Apply the click handler to the Open */
            var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
            .click(function() {
                //Check if box is already open to still allow toggle, but close all other selects
                if ($ul.css('display') == 'none') {
                    jqTransformHideSelect();
                }
                if ($select.attr('disabled')) {
                    return false;
                }

                $ul.slideToggle('fast',
                function() {
                    // var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top + 10);
                    // 						$ul.animate({scrollTop: offSet});
                    });
                return false;
            })
            ;

            // Set the new width
            var iSelectWidth = $select.outerWidth();
            var oSpan = $('span:first', $wrapper);
            var newWidth = (iSelectWidth > oSpan.innerWidth()) ? iSelectWidth + oLinkOpen.outerWidth() : $wrapper.width();
            $wrapper.css('width', 87);
            $('div.jqTransformSelectWrapper:first').css('margin-left', '2px');
            $ul.css('width', 85).css('margin', '0');
            oSpan.css({
                width: iSelectWidth
            });

            // Calculate the height if necessary, less elements that the default height
            //show the ul to calculate the block, if ul is not displayed li height value is 0
            $ul.css({
                display: 'block',
                visibility: 'hidden'
            });
            var iSelectHeight = ($('li', $ul).length) * ($('li:first', $ul).height());
            //+1 else bug ff
            (iSelectHeight < $ul.height()) && $ul.css({
                height: iSelectHeight,
                'overflow': 'hidden'
            });
            //hidden else bug with ff
            $ul.css({
                display: 'none',
                visibility: 'visible'
            });

        });
    };
    $.fn.jqTransform = function(options) {
        var opt = $.extend({},
        defaultOptions, options);

        /* each form */
        return this.each(function() {
            var selfForm = $(this);
            if (selfForm.hasClass('jqtransformdone')) {
                return;
            }
            selfForm.addClass('jqtransformdone');

            $('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();
            $('input:text, input:password', this).jqTransInputText();
            $('input:checkbox', this).jqTransCheckBox();
            $('input:radio', this).jqTransRadio();
            $('textarea', this).jqTransTextarea();

            if ($('select', this).jqTransSelect().length > 0) {
                jqTransformAddDocumentListener();
            }
            selfForm.bind('reset',
            function() {
                var action = function() {
                    jqTransformReset(this);
                };
                window.setTimeout(action, 10);
            });

        });
        /* End Form each */

    };
    /* End the Plugin */

})(jQuery);

