(function(){var J=CS.UTIL.set,E=CS.UTIL.is_a,F=CS.UTIL.is_F,B=CS.UTIL.extend,H=CS.CORE.OPS.do_both;window.CS=J(window.CS,{});CS.UI=J(CS.UI,{});CS.UI.Carousel=function(S,O){if(!S||!S.length){throw new Error("Missing Parameter: CS.UI.Carousel: `mappings` is required!")}if(!E(S,Array)){throw new TypeError("Type Mismatch: CS.UI.Carousel: `mappings` is of type "+typeof (S)+", and not Array!")}this.options=O=B({guard:true},O);this.active={trigger:null,target:null};this.mutex=new CS.CORE.Mutex();this.triggers=$A();this.targets=$A();var R=this;function Q(T,U){R.triggers.push(T);R.targets.push(U);D(R,T,U)}if((S.length==1)&&E(S[0].trigger,String)&&E(S[0].target,String)&&O.num_nodes){var N=S[0].trigger,M=S[0].target;O.starting_active=(E(O.starting_active,Number)?N+O.starting_active:O.starting_active);for(var P=0;P<O.num_nodes;P++){Q($(N+P),$(M+P))}}else{S.each(function(T){Q($(T.trigger),$(T.target))});if(E(O.starting_active,Number)&&(O.starting_active>0)&&(O.starting_active<this.triggers.length)){O.starting_active=this.triggers[O.starting_active]}}this.active=this.get_pair($(O.starting_active)||this.triggers[0]);this.scrubber=Object.extend({move_duration:1},O.scrubber||{});this.scrubber.element=$(this.scrubber.element);this.scrubber.track=$(this.scrubber.track);this.move_scrubber({reset:true})};function A(N,R,S){var U=this,Q=U.options.guard,T=((Q===true)||(E(Q,Array)&&(Q.indexOf(R)!==-1)));var M=U.mutex.request_lock(R);if(T&&!M){return false}var O=U.get_pair(N);function P(b,c,Y,a){if(!Y){return true}var Z=Y.beforeTransition,V=F(Y.afterTransition);var X=V?function(){return Y.afterTransition.call(U,S,b,c)}:false;var W=F(Z)?Z.call(U,S,b,c):true;if(W===false){if(a){M()}return false}if(F(Y.fn)){Y.fn.apply(U,[S,b,c,(T&&a?H(M,X):X)].concat(Y.args||[]))}else{if(V){X()}if(a){M()}}return true}if(CS.CORE.OPS.and(P(O.trigger,U.active.trigger,U.options.trigger_transitions[R],false),P(O.target,U.active.target,U.options.target_transitions[R],true))&&R=="active"){U.active=O;U.move_scrubber()}if(!T&&M){return M()}}function C(M){this.fire.call(M,"active")}function G(M){this.fire.call(M,"hover_on")}function I(M){this.fire.call(M,"hover_off")}function L(O){var P=$(O),N=this.triggers.indexOf(O),M=this.targets.indexOf(O);if(P===null){throw new Error("Invalid Parameter: CS.UI.Carousel: `node` #"+O+" is not a valid element!")}if(N==-1&&M!=-1){throw new RangeError("Invalid Parameter: CS.UI.Carousel: Unable to find trigger-target pair for `node` #"+P.id+"!")}else{return(N!=-1?{trigger:this.triggers[N],target:this.targets[N]}:{trigger:this.triggers[M],target:this.targets[M]})}}function D(O,M,N){$H({active:"click",hover_on:"mouseover",hover_off:"mouseout"}).each(function(R){var Q=R.key,P=R.value;M.observe(P,A.bind(O,M,Q))})}function K(P){if(!this.scrubber.element){return }P=P||{};var O=(P.to&&this.get_pair(P.to).trigger)||this.active.trigger,Q=this.scrubber.element,N=this.scrubber.track;var M=CS.UI.getLeft(O)-CS.UI.getLeft(N);P.reset&&Q.setStyle({top:(P.top||N.getHeight()/2-Q.getHeight()/2)+"px",left:0});new Effect.Move(Q,{duration:this.scrubber.move_duration,x:(M-Q.offsetLeft)+(O.getWidth()/2)-(Q.getWidth()/2),y:0,mode:"relative"})}Object.extend(CS.UI.Carousel.prototype,{active:null,triggers:null,targets:null,get_pair:L,fire:A,fire_activate:C,fire_hover_on:G,fire_hover_off:I,move_scrubber:K})})();