123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- // wrapped by build app
- define("dojox/widget/AutoRotator", ["dijit","dojo","dojox","dojo/require!dojox/widget/Rotator"], function(dijit,dojo,dojox){
- dojo.provide("dojox.widget.AutoRotator");
- dojo.require("dojox.widget.Rotator");
- (function(d){
- d.declare("dojox.widget.AutoRotator", dojox.widget.Rotator, {
- // summary:
- // A rotator that automatically transitions between child nodes.
- //
- // description:
- // Adds automatic rotating to the dojox.widget.Rotator. The
- // AutoRotator has parameters that control how user input can
- // affect the rotator including a suspend when hovering over the
- // rotator and pausing when the user manually advances to another
- // pane.
- //
- // example:
- // | <div dojoType="dojox.widget.AutoRotator" duration="3000">
- // | <div>
- // | Pane 1!
- // | </div>
- // | <div duration="5000">
- // | Pane 2 with an overrided duration!
- // | </div>
- // | </div>
- // suspendOnHover: boolean
- // Pause the rotator when the mouse hovers over it.
- suspendOnHover: false,
- // duration: int
- // The time in milliseconds before transitioning to the next pane. The
- // default value is 4000 (4 seconds).
- duration: 4000,
- // autoStart: boolean
- // Starts the timer to transition children upon creation.
- autoStart: true,
- // pauseOnManualChange: boolean
- // Pause the rotator when the pane is changed or a controller's next or
- // previous buttons are clicked.
- pauseOnManualChange: false,
- // cycles: int
- // Number of cycles before pausing.
- cycles: -1,
- // random: boolean
- // Determines if the panes should cycle randomly.
- random: false,
- // reverse: boolean
- // Causes the rotator to rotate in reverse order.
- reverse: false,
- constructor: function(){
- // summary:
- // Initializes the timer and connect to the rotator.
- var _t = this;
- // validate the cycles counter
- if(_t.cycles-0 == _t.cycles && _t.cycles > 0){
- // we need to add 1 because we decrement cycles before the animation starts
- _t.cycles++;
- }else{
- _t.cycles = _t.cycles ? -1 : 0;
- }
- // wire up the mouse hover events
- _t._connects = [
- d.connect(_t._domNode, "onmouseover", function(){
- // temporarily suspend the cycling, but don't officially pause
- // it and don't allow suspending if we're transitioning
- if(_t.suspendOnHover && !_t.anim && !_t.wfe){
- var t = _t._endTime,
- n = _t._now();
- _t._suspended = true;
- _t._resetTimer();
- _t._resumeDuration = t > n ? t - n : 0.01;
- }
- }),
- d.connect(_t._domNode, "onmouseout", function(){
- // if we were playing, resume playback unless were in the
- // middle of a transition
- if(_t.suspendOnHover && !_t.anim){
- _t._suspended = false;
- if(_t.playing && !_t.wfe){
- _t.play(true);
- }
- }
- })
- ];
- // everything is ready, so start
- if(_t.autoStart && _t.panes.length > 1){
- // start playing
- _t.play();
- }else{
- // since we're not playing, lets pause
- _t.pause();
- }
- },
- destroy: function(){
- // summary:
- // Disconnect the AutoRotator's events.
- d.forEach(this._connects, d.disconnect);
- this.inherited(arguments);
- },
- play: function(/*boolean?*/skipCycleDecrement, /*boolean?*/skipDuration){
- // summary:
- // Sets the state to "playing" and schedules the next cycle to run.
- this.playing = true;
- this._resetTimer();
- // don't decrement the count if we're resuming play
- if(skipCycleDecrement !== true && this.cycles > 0){
- this.cycles--;
- }
- if(this.cycles == 0){
- // we have reached the number of cycles, so pause
- this.pause();
- }else if(!this._suspended){
- this.onUpdate("play");
- // if we haven't been suspended, then grab the duration for this pane and
- // schedule a cycle to be run
- if(skipDuration){
- this._cycle();
- }else{
- var r = (this._resumeDuration || 0)-0,
- u = (r > 0 ? r : (this.panes[this.idx].duration || this.duration))-0;
- // call _cycle() after a duration and pass in false so it isn't manual
- this._resumeDuration = 0;
- this._endTime = this._now() + u;
- this._timer = setTimeout(d.hitch(this, "_cycle", false), u);
- }
- }
- },
- pause: function(){
- // summary:
- // Sets the state to "not playing" and clears the cycle timer.
- this.playing = this._suspended = false;
- this.cycles = -1;
- this._resetTimer();
- // notify the controllers we're paused
- this.onUpdate("pause");
- },
- _now: function(){
- // summary:
- // Helper function to return the current system time in milliseconds.
- return (new Date()).getTime(); /*int*/
- },
- _resetTimer: function(){
- // summary:
- // Resets the timer used to schedule the next transition.
- clearTimeout(this._timer);
- },
- _cycle: function(/*boolean|int?*/manual){
- // summary:
- // Cycles the rotator to the next/previous pane.
- var _t = this,
- i = _t.idx,
- j;
- if(_t.random){
- // make sure we don't randomly pick the pane we're already on
- do{
- j = Math.floor(Math.random() * _t.panes.length + 1);
- }while(j == i);
- }else{
- j = i + (_t.reverse ? -1 : 1)
- }
- // rotate!
- var def = _t.go(j);
- if(def){
- def.addCallback(function(/*boolean?*/skipDuration){
- _t.onUpdate("cycle");
- if(_t.playing){
- _t.play(false, skipDuration);
- }
- });
- }
- },
- onManualChange: function(/*string*/action){
- // summary:
- // Override the Rotator's onManualChange so we can pause.
- this.cycles = -1;
- // obviously we don't want to pause if play was just clicked
- if(action != "play"){
- this._resetTimer();
- if(this.pauseOnManualChange){
- this.pause();
- }
- }
- if(this.playing){
- this.play();
- }
- }
- });
- })(dojo);
- });
|