blob: ee5737f7e04c8273e76c241e4a346627afc5c3c8 [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.layout.RotatorContainer"]){
dojo._hasResource["dojox.layout.RotatorContainer"]=true;
dojo.provide("dojox.layout.RotatorContainer");
dojo.require("dojo.fx");
dojo.require("dijit.layout.StackContainer");
dojo.require("dijit.layout.StackController");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dijit._Contained");
dojo.declare("dojox.layout.RotatorContainer",[dijit.layout.StackContainer,dijit._Templated],{templateString:"<div class=\"dojoxRotatorContainer\"><div dojoAttachPoint=\"tabNode\"></div><div class=\"dojoxRotatorPager\" dojoAttachPoint=\"pagerNode\"></div><div class=\"dojoxRotatorContent\" dojoAttachPoint=\"containerNode\"></div></div>",showTabs:true,transitionDelay:5000,transition:"fade",transitionDuration:1000,autoStart:true,suspendOnHover:false,pauseOnManualChange:null,reverse:false,pagerId:"",cycles:-1,pagerClass:"dojox.layout.RotatorPager",postCreate:function(){
this.inherited(arguments);
dojo.style(this.domNode,"position","relative");
if(this.cycles-0==this.cycles&&this.cycles!=-1){
this.cycles++;
}else{
this.cycles=-1;
}
if(this.pauseOnManualChange===null){
this.pauseOnManualChange=!this.suspendOnHover;
}
var id=this.id||"rotator"+(new Date()).getTime(),sc=new dijit.layout.StackController({containerId:id},this.tabNode);
this.tabNode=sc.domNode;
this._stackController=sc;
dojo.style(this.tabNode,"display",this.showTabs?"":"none");
this.connect(sc,"onButtonClick","_manualChange");
this._subscriptions=[dojo.subscribe(this.id+"-cycle",this,"_cycle"),dojo.subscribe(this.id+"-state",this,"_state")];
var d=Math.round(this.transitionDelay*0.75);
if(d<this.transitionDuration){
this.transitionDuration=d;
}
if(this.suspendOnHover){
this.connect(this.domNode,"onmouseover","_onMouseOver");
this.connect(this.domNode,"onmouseout","_onMouseOut");
}
},startup:function(){
if(this._started){
return;
}
var c=this.getChildren();
for(var i=0,_1=c.length;i<_1;i++){
if(c[i].declaredClass==this.pagerClass){
this.pagerNode.appendChild(c[i].domNode);
break;
}
}
this.inherited(arguments);
if(this.autoStart){
setTimeout(dojo.hitch(this,"_play"),10);
}else{
this._updatePager();
}
},destroy:function(){
dojo.forEach(this._subscriptions,dojo.unsubscribe);
this.inherited(arguments);
},_setShowTabsAttr:function(_2){
this.showTabs=_2;
dojo.style(this.tabNode,"display",_2?"":"none");
},_updatePager:function(){
var c=this.getChildren();
dojo.publish(this.id+"-update",[this._playing,dojo.indexOf(c,this.selectedChildWidget)+1,c.length]);
},_onMouseOver:function(){
this._resetTimer();
this._over=true;
},_onMouseOut:function(){
this._over=false;
if(this._playing){
clearTimeout(this._timer);
this._timer=setTimeout(dojo.hitch(this,"_play",true),200);
}
},_resetTimer:function(){
clearTimeout(this._timer);
this._timer=null;
},_cycle:function(_3){
if(_3 instanceof Boolean||typeof _3=="boolean"){
this._manualChange();
}
var c=this.getChildren(),_4=c.length,i=dojo.indexOf(c,this.selectedChildWidget)+(_3===false||(_3!==true&&this.reverse)?-1:1);
this.selectChild(c[(i<_4?(i<0?_4-1:i):0)]);
this._updatePager();
},_manualChange:function(){
if(this.pauseOnManualChange){
this._playing=false;
}
this.cycles=-1;
},_play:function(_5){
this._playing=true;
this._resetTimer();
if(_5!==true&&this.cycles>0){
this.cycles--;
}
if(this.cycles==0){
this._pause();
}else{
if((!this.suspendOnHover||!this._over)&&this.transitionDelay){
this._timer=setTimeout(dojo.hitch(this,"_cycle"),this.selectedChildWidget.domNode.getAttribute("transitionDelay")||this.transitionDelay);
}
}
this._updatePager();
},_pause:function(){
this._playing=false;
this._resetTimer();
},_state:function(_6){
if(_6){
this.cycles=-1;
this._play();
}else{
this._pause();
}
},_transition:function(_7,_8){
this._resetTimer();
if(_8&&this.transitionDuration){
switch(this.transition){
case "fade":
this._fade(_7,_8);
return;
}
}
this._transitionEnd();
this.inherited(arguments);
},_transitionEnd:function(){
if(this._playing){
this._play();
}else{
this._updatePager();
}
},_fade:function(_9,_a){
this._styleNode(_a.domNode,1,1);
this._styleNode(_9.domNode,0,2);
this._showChild(_9);
if(this.doLayout&&_9.resize){
_9.resize(this._containerContentBox||this._contentBox);
}
var _b={duration:this.transitionDuration},_c=dojo.fx.combine([dojo["fadeOut"](dojo.mixin({node:_a.domNode},_b)),dojo["fadeIn"](dojo.mixin({node:_9.domNode},_b))]);
this.connect(_c,"onEnd",dojo.hitch(this,function(){
this._hideChild(_a);
this._transitionEnd();
}));
_c.play();
},_styleNode:function(_d,_e,_f){
dojo.style(_d,"opacity",_e);
dojo.style(_d,"zIndex",_f);
dojo.style(_d,"position","absolute");
}});
dojo.declare("dojox.layout.RotatorPager",[dijit._Widget,dijit._Templated,dijit._Contained],{widgetsInTemplate:true,rotatorId:"",postMixInProperties:function(){
this.templateString="<div>"+this.srcNodeRef.innerHTML+"</div>";
},postCreate:function(){
var p=dijit.byId(this.rotatorId)||this.getParent();
if(p&&p.declaredClass=="dojox.layout.RotatorContainer"){
if(this.previous){
dojo.connect(this.previous,"onClick",function(){
dojo.publish(p.id+"-cycle",[false]);
});
}
if(this.next){
dojo.connect(this.next,"onClick",function(){
dojo.publish(p.id+"-cycle",[true]);
});
}
if(this.playPause){
dojo.connect(this.playPause,"onClick",function(){
this.attr("label",this.checked?"Pause":"Play");
dojo.publish(p.id+"-state",[this.checked]);
});
}
this._subscriptions=[dojo.subscribe(p.id+"-state",this,"_state"),dojo.subscribe(p.id+"-update",this,"_update")];
}
},destroy:function(){
dojo.forEach(this._subscriptions,dojo.unsubscribe);
this.inherited(arguments);
},_state:function(_10){
if(this.playPause&&this.playPause.checked!=_10){
this.playPause.attr("label",_10?"Pause":"Play");
this.playPause.attr("checked",_10);
}
},_update:function(_11,_12,_13){
this._state(_11);
if(this.current&&_12){
this.current.innerHTML=_12;
}
if(this.total&&_13){
this.total.innerHTML=_13;
}
}});
}