[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/yuilib/2in3/2.9.0/build/yui2-animation/ -> yui2-animation.js (source)

   1  YUI.add('yui2-animation', function(Y) {
   2      var YAHOO    = Y.YUI2;
   3      /*
   4  Copyright (c) 2011, Yahoo! Inc. All rights reserved.
   5  Code licensed under the BSD License:
   6  http://developer.yahoo.com/yui/license.html
   7  version: 2.9.0
   8  */
   9  (function() {
  10  
  11  var Y = YAHOO.util;
  12  
  13  /*
  14  Copyright (c) 2006, Yahoo! Inc. All rights reserved.
  15  Code licensed under the BSD License:
  16  http://developer.yahoo.net/yui/license.txt
  17  */
  18  
  19  /**
  20   * The animation module provides allows effects to be added to HTMLElements.
  21   * @module animation
  22   * @requires yahoo, event, dom
  23   */
  24  
  25  /**
  26   *
  27   * Base animation class that provides the interface for building animated effects.
  28   * <p>Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);</p>
  29   * @class Anim
  30   * @namespace YAHOO.util
  31   * @requires YAHOO.util.AnimMgr
  32   * @requires YAHOO.util.Easing
  33   * @requires YAHOO.util.Dom
  34   * @requires YAHOO.util.Event
  35   * @requires YAHOO.util.CustomEvent
  36   * @constructor
  37   * @param {String | HTMLElement} el Reference to the element that will be animated
  38   * @param {Object} attributes The attribute(s) to be animated.  
  39   * Each attribute is an object with at minimum a "to" or "by" member defined.  
  40   * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").  
  41   * All attribute names use camelCase.
  42   * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  43   * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
  44   */
  45  
  46  var Anim = function(el, attributes, duration, method) {
  47      if (!el) {
  48      }
  49      this.init(el, attributes, duration, method); 
  50  };
  51  
  52  Anim.NAME = 'Anim';
  53  
  54  Anim.prototype = {
  55      /**
  56       * Provides a readable name for the Anim instance.
  57       * @method toString
  58       * @return {String}
  59       */
  60      toString: function() {
  61          var el = this.getEl() || {};
  62          var id = el.id || el.tagName;
  63          return (this.constructor.NAME + ': ' + id);
  64      },
  65      
  66      patterns: { // cached for performance
  67          noNegatives:        /width|height|opacity|padding/i, // keep at zero or above
  68          offsetAttribute:  /^((width|height)|(top|left))$/, // use offsetValue as default
  69          defaultUnit:        /width|height|top$|bottom$|left$|right$/i, // use 'px' by default
  70          offsetUnit:         /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset
  71      },
  72      
  73      /**
  74       * Returns the value computed by the animation's "method".
  75       * @method doMethod
  76       * @param {String} attr The name of the attribute.
  77       * @param {Number} start The value this attribute should start from for this animation.
  78       * @param {Number} end  The value this attribute should end at for this animation.
  79       * @return {Number} The Value to be applied to the attribute.
  80       */
  81      doMethod: function(attr, start, end) {
  82          return this.method(this.currentFrame, start, end - start, this.totalFrames);
  83      },
  84      
  85      /**
  86       * Applies a value to an attribute.
  87       * @method setAttribute
  88       * @param {String} attr The name of the attribute.
  89       * @param {Number} val The value to be applied to the attribute.
  90       * @param {String} unit The unit ('px', '%', etc.) of the value.
  91       */
  92      setAttribute: function(attr, val, unit) {
  93          var el = this.getEl();
  94          if ( this.patterns.noNegatives.test(attr) ) {
  95              val = (val > 0) ? val : 0;
  96          }
  97  
  98          if (attr in el && !('style' in el && attr in el.style)) {
  99              el[attr] = val;
 100          } else {
 101              Y.Dom.setStyle(el, attr, val + unit);
 102          }
 103      },                        
 104      
 105      /**
 106       * Returns current value of the attribute.
 107       * @method getAttribute
 108       * @param {String} attr The name of the attribute.
 109       * @return {Number} val The current value of the attribute.
 110       */
 111      getAttribute: function(attr) {
 112          var el = this.getEl();
 113          var val = Y.Dom.getStyle(el, attr);
 114  
 115          if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) {
 116              return parseFloat(val);
 117          }
 118          
 119          var a = this.patterns.offsetAttribute.exec(attr) || [];
 120          var pos = !!( a[3] ); // top or left
 121          var box = !!( a[2] ); // width or height
 122          
 123          if ('style' in el) {
 124              // use offsets for width/height and abs pos top/left
 125              if ( box || (Y.Dom.getStyle(el, 'position') == 'absolute' && pos) ) {
 126                  val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)];
 127              } else { // default to zero for other 'auto'
 128                  val = 0;
 129              }
 130          } else if (attr in el) {
 131              val = el[attr];
 132          }
 133  
 134          return val;
 135      },
 136      
 137      /**
 138       * Returns the unit to use when none is supplied.
 139       * @method getDefaultUnit
 140       * @param {attr} attr The name of the attribute.
 141       * @return {String} The default unit to be used.
 142       */
 143      getDefaultUnit: function(attr) {
 144           if ( this.patterns.defaultUnit.test(attr) ) {
 145              return 'px';
 146           }
 147           
 148           return '';
 149      },
 150          
 151      /**
 152       * Sets the actual values to be used during the animation.  Should only be needed for subclass use.
 153       * @method setRuntimeAttribute
 154       * @param {Object} attr The attribute object
 155       * @private 
 156       */
 157      setRuntimeAttribute: function(attr) {
 158          var start;
 159          var end;
 160          var attributes = this.attributes;
 161  
 162          this.runtimeAttributes[attr] = {};
 163          
 164          var isset = function(prop) {
 165              return (typeof prop !== 'undefined');
 166          };
 167          
 168          if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) {
 169              return false; // note return; nothing to animate to
 170          }
 171          
 172          start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr);
 173  
 174          // To beats by, per SMIL 2.1 spec
 175          if ( isset(attributes[attr]['to']) ) {
 176              end = attributes[attr]['to'];
 177          } else if ( isset(attributes[attr]['by']) ) {
 178              if (start.constructor == Array) {
 179                  end = [];
 180                  for (var i = 0, len = start.length; i < len; ++i) {
 181                      end[i] = start[i] + attributes[attr]['by'][i] * 1; // times 1 to cast "by" 
 182                  }
 183              } else {
 184                  end = start + attributes[attr]['by'] * 1;
 185              }
 186          }
 187          
 188          this.runtimeAttributes[attr].start = start;
 189          this.runtimeAttributes[attr].end = end;
 190  
 191          // set units if needed
 192          this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ?
 193                  attributes[attr]['unit'] : this.getDefaultUnit(attr);
 194          return true;
 195      },
 196  
 197      /**
 198       * Constructor for Anim instance.
 199       * @method init
 200       * @param {String | HTMLElement} el Reference to the element that will be animated
 201       * @param {Object} attributes The attribute(s) to be animated.  
 202       * Each attribute is an object with at minimum a "to" or "by" member defined.  
 203       * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").  
 204       * All attribute names use camelCase.
 205       * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
 206       * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
 207       */ 
 208      init: function(el, attributes, duration, method) {
 209          /**
 210           * Whether or not the animation is running.
 211           * @property isAnimated
 212           * @private
 213           * @type Boolean
 214           */
 215          var isAnimated = false;
 216          
 217          /**
 218           * A Date object that is created when the animation begins.
 219           * @property startTime
 220           * @private
 221           * @type Date
 222           */
 223          var startTime = null;
 224          
 225          /**
 226           * The number of frames this animation was able to execute.
 227           * @property actualFrames
 228           * @private
 229           * @type Int
 230           */
 231          var actualFrames = 0; 
 232  
 233          /**
 234           * The element to be animated.
 235           * @property el
 236           * @private
 237           * @type HTMLElement
 238           */
 239          el = Y.Dom.get(el);
 240          
 241          /**
 242           * The collection of attributes to be animated.  
 243           * Each attribute must have at least a "to" or "by" defined in order to animate.  
 244           * If "to" is supplied, the animation will end with the attribute at that value.  
 245           * If "by" is supplied, the animation will end at that value plus its starting value. 
 246           * If both are supplied, "to" is used, and "by" is ignored. 
 247           * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values).
 248           * @property attributes
 249           * @type Object
 250           */
 251          this.attributes = attributes || {};
 252          
 253          /**
 254           * The length of the animation.  Defaults to "1" (second).
 255           * @property duration
 256           * @type Number
 257           */
 258          this.duration = !YAHOO.lang.isUndefined(duration) ? duration : 1;
 259          
 260          /**
 261           * The method that will provide values to the attribute(s) during the animation. 
 262           * Defaults to "YAHOO.util.Easing.easeNone".
 263           * @property method
 264           * @type Function
 265           */
 266          this.method = method || Y.Easing.easeNone;
 267  
 268          /**
 269           * Whether or not the duration should be treated as seconds.
 270           * Defaults to true.
 271           * @property useSeconds
 272           * @type Boolean
 273           */
 274          this.useSeconds = true; // default to seconds
 275          
 276          /**
 277           * The location of the current animation on the timeline.
 278           * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
 279           * @property currentFrame
 280           * @type Int
 281           */
 282          this.currentFrame = 0;
 283          
 284          /**
 285           * The total number of frames to be executed.
 286           * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
 287           * @property totalFrames
 288           * @type Int
 289           */
 290          this.totalFrames = Y.AnimMgr.fps;
 291          
 292          /**
 293           * Changes the animated element
 294           * @method setEl
 295           */
 296          this.setEl = function(element) {
 297              el = Y.Dom.get(element);
 298          };
 299          
 300          /**
 301           * Returns a reference to the animated element.
 302           * @method getEl
 303           * @return {HTMLElement}
 304           */
 305          this.getEl = function() { return el; };
 306          
 307          /**
 308           * Checks whether the element is currently animated.
 309           * @method isAnimated
 310           * @return {Boolean} current value of isAnimated.     
 311           */
 312          this.isAnimated = function() {
 313              return isAnimated;
 314          };
 315          
 316          /**
 317           * Returns the animation start time.
 318           * @method getStartTime
 319           * @return {Date} current value of startTime.      
 320           */
 321          this.getStartTime = function() {
 322              return startTime;
 323          };        
 324          
 325          this.runtimeAttributes = {};
 326          
 327          
 328          
 329          /**
 330           * Starts the animation by registering it with the animation manager. 
 331           * @method animate  
 332           */
 333          this.animate = function() {
 334              if ( this.isAnimated() ) {
 335                  return false;
 336              }
 337              
 338              this.currentFrame = 0;
 339              
 340              this.totalFrames = ( this.useSeconds ) ? Math.ceil(Y.AnimMgr.fps * this.duration) : this.duration;
 341      
 342              if (this.duration === 0 && this.useSeconds) { // jump to last frame if zero second duration 
 343                  this.totalFrames = 1; 
 344              }
 345              Y.AnimMgr.registerElement(this);
 346              return true;
 347          };
 348            
 349          /**
 350           * Stops the animation.  Normally called by AnimMgr when animation completes.
 351           * @method stop
 352           * @param {Boolean} finish (optional) If true, animation will jump to final frame.
 353           */ 
 354          this.stop = function(finish) {
 355              if (!this.isAnimated()) { // nothing to stop
 356                  return false;
 357              }
 358  
 359              if (finish) {
 360                   this.currentFrame = this.totalFrames;
 361                   this._onTween.fire();
 362              }
 363              Y.AnimMgr.stop(this);
 364          };
 365          
 366          this._handleStart = function() {            
 367              this.onStart.fire();
 368              
 369              this.runtimeAttributes = {};
 370              for (var attr in this.attributes) {
 371                  if (this.attributes.hasOwnProperty(attr)) {
 372                      this.setRuntimeAttribute(attr);
 373                  }
 374              }
 375              
 376              isAnimated = true;
 377              actualFrames = 0;
 378              startTime = new Date(); 
 379          };
 380          
 381          /**
 382           * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s).
 383           * @private
 384           */
 385           
 386          this._handleTween = function() {
 387              var data = {
 388                  duration: new Date() - this.getStartTime(),
 389                  currentFrame: this.currentFrame
 390              };
 391              
 392              data.toString = function() {
 393                  return (
 394                      'duration: ' + data.duration +
 395                      ', currentFrame: ' + data.currentFrame
 396                  );
 397              };
 398              
 399              this.onTween.fire(data);
 400              
 401              var runtimeAttributes = this.runtimeAttributes;
 402              
 403              for (var attr in runtimeAttributes) {
 404                  if (runtimeAttributes.hasOwnProperty(attr)) {
 405                      this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); 
 406                  }
 407              }
 408              
 409              this.afterTween.fire(data);
 410              
 411              actualFrames += 1;
 412          };
 413          
 414          this._handleComplete = function() {
 415              var actual_duration = (new Date() - startTime) / 1000 ;
 416              
 417              var data = {
 418                  duration: actual_duration,
 419                  frames: actualFrames,
 420                  fps: actualFrames / actual_duration
 421              };
 422              
 423              data.toString = function() {
 424                  return (
 425                      'duration: ' + data.duration +
 426                      ', frames: ' + data.frames +
 427                      ', fps: ' + data.fps
 428                  );
 429              };
 430              
 431              isAnimated = false;
 432              actualFrames = 0;
 433              this.onComplete.fire(data);
 434          };
 435          
 436          /**
 437           * Custom event that fires after onStart, useful in subclassing
 438           * @private
 439           */    
 440          this._onStart = new Y.CustomEvent('_start', this, true);
 441  
 442          /**
 443           * Custom event that fires when animation begins
 444           * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction)
 445           * @event onStart
 446           */    
 447          this.onStart = new Y.CustomEvent('start', this);
 448          
 449          /**
 450           * Custom event that fires between each frame
 451           * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction)
 452           * @event onTween
 453           */
 454          this.onTween = new Y.CustomEvent('tween', this);
 455          
 456          /**
 457           * Custom event that fires between each frame
 458           * Listen via subscribe method (e.g. myAnim.afterTween.subscribe(someFunction)
 459           * @event afterTween
 460           */
 461          this.afterTween = new Y.CustomEvent('afterTween', this);
 462          
 463          /**
 464           * Custom event that fires after onTween
 465           * @private
 466           */
 467          this._onTween = new Y.CustomEvent('_tween', this, true);
 468          
 469          /**
 470           * Custom event that fires when animation ends
 471           * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction)
 472           * @event onComplete
 473           */
 474          this.onComplete = new Y.CustomEvent('complete', this);
 475          /**
 476           * Custom event that fires after onComplete
 477           * @private
 478           */
 479          this._onComplete = new Y.CustomEvent('_complete', this, true);
 480  
 481          this._onStart.subscribe(this._handleStart);
 482          this._onTween.subscribe(this._handleTween);
 483          this._onComplete.subscribe(this._handleComplete);
 484      }
 485  };
 486  
 487      Y.Anim = Anim;
 488  })();
 489  /**
 490   * Handles animation queueing and threading.
 491   * Used by Anim and subclasses.
 492   * @class AnimMgr
 493   * @namespace YAHOO.util
 494   */
 495  YAHOO.util.AnimMgr = new function() {
 496      /** 
 497       * Reference to the animation Interval.
 498       * @property thread
 499       * @private
 500       * @type Int
 501       */
 502      var thread = null;
 503      
 504      /** 
 505       * The current queue of registered animation objects.
 506       * @property queue
 507       * @private
 508       * @type Array
 509       */    
 510      var queue = [];
 511  
 512      /** 
 513       * The number of active animations.
 514       * @property tweenCount
 515       * @private
 516       * @type Int
 517       */        
 518      var tweenCount = 0;
 519  
 520      /** 
 521       * Base frame rate (frames per second). 
 522       * Arbitrarily high for better x-browser calibration (slower browsers drop more frames).
 523       * @property fps
 524       * @type Int
 525       * 
 526       */
 527      this.fps = 1000;
 528  
 529      /** 
 530       * Interval delay in milliseconds, defaults to fastest possible.
 531       * @property delay
 532       * @type Int
 533       * 
 534       */
 535      this.delay = 20;
 536  
 537      /**
 538       * Adds an animation instance to the animation queue.
 539       * All animation instances must be registered in order to animate.
 540       * @method registerElement
 541       * @param {object} tween The Anim instance to be be registered
 542       */
 543      this.registerElement = function(tween) {
 544          queue[queue.length] = tween;
 545          tweenCount += 1;
 546          tween._onStart.fire();
 547          this.start();
 548      };
 549      
 550      var _unregisterQueue = [];
 551      var _unregistering = false;
 552  
 553      var doUnregister = function() {
 554          var next_args = _unregisterQueue.shift();
 555          unRegister.apply(YAHOO.util.AnimMgr,next_args);
 556          if (_unregisterQueue.length) {
 557              arguments.callee();
 558          }
 559      };
 560  
 561      var unRegister = function(tween, index) {
 562          index = index || getIndex(tween);
 563          if (!tween.isAnimated() || index === -1) {
 564              return false;
 565          }
 566          
 567          tween._onComplete.fire();
 568          queue.splice(index, 1);
 569  
 570          tweenCount -= 1;
 571          if (tweenCount <= 0) {
 572              this.stop();
 573          }
 574  
 575          return true;
 576      };
 577  
 578      /**
 579       * removes an animation instance from the animation queue.
 580       * All animation instances must be registered in order to animate.
 581       * @method unRegister
 582       * @param {object} tween The Anim instance to be be registered
 583       * @param {Int} index The index of the Anim instance
 584       * @private
 585       */
 586      this.unRegister = function() {
 587          _unregisterQueue.push(arguments);
 588          if (!_unregistering) {
 589              _unregistering = true;
 590              doUnregister();
 591              _unregistering = false;
 592          }
 593      }
 594  
 595      /**
 596       * Starts the animation thread.
 597      * Only one thread can run at a time.
 598       * @method start
 599       */    
 600      this.start = function() {
 601          if (thread === null) {
 602              thread = setInterval(this.run, this.delay);
 603          }
 604      };
 605  
 606      /**
 607       * Stops the animation thread or a specific animation instance.
 608       * @method stop
 609       * @param {object} tween A specific Anim instance to stop (optional)
 610       * If no instance given, Manager stops thread and all animations.
 611       */    
 612      this.stop = function(tween) {
 613          if (!tween) {
 614              clearInterval(thread);
 615              
 616              for (var i = 0, len = queue.length; i < len; ++i) {
 617                  this.unRegister(queue[0], 0);  
 618              }
 619  
 620              queue = [];
 621              thread = null;
 622              tweenCount = 0;
 623          }
 624          else {
 625              this.unRegister(tween);
 626          }
 627      };
 628      
 629      /**
 630       * Called per Interval to handle each animation frame.
 631       * @method run
 632       */    
 633      this.run = function() {
 634          for (var i = 0, len = queue.length; i < len; ++i) {
 635              var tween = queue[i];
 636              if ( !tween || !tween.isAnimated() ) { continue; }
 637  
 638              if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null)
 639              {
 640                  tween.currentFrame += 1;
 641                  
 642                  if (tween.useSeconds) {
 643                      correctFrame(tween);
 644                  }
 645                  tween._onTween.fire();          
 646              }
 647              else { YAHOO.util.AnimMgr.stop(tween, i); }
 648          }
 649      };
 650      
 651      var getIndex = function(anim) {
 652          for (var i = 0, len = queue.length; i < len; ++i) {
 653              if (queue[i] === anim) {
 654                  return i; // note return;
 655              }
 656          }
 657          return -1;
 658      };
 659      
 660      /**
 661       * On the fly frame correction to keep animation on time.
 662       * @method correctFrame
 663       * @private
 664       * @param {Object} tween The Anim instance being corrected.
 665       */
 666      var correctFrame = function(tween) {
 667          var frames = tween.totalFrames;
 668          var frame = tween.currentFrame;
 669          var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames);
 670          var elapsed = (new Date() - tween.getStartTime());
 671          var tweak = 0;
 672          
 673          if (elapsed < tween.duration * 1000) { // check if falling behind
 674              tweak = Math.round((elapsed / expected - 1) * tween.currentFrame);
 675          } else { // went over duration, so jump to end
 676              tweak = frames - (frame + 1); 
 677          }
 678          if (tweak > 0 && isFinite(tweak)) { // adjust if needed
 679              if (tween.currentFrame + tweak >= frames) {// dont go past last frame
 680                  tweak = frames - (frame + 1);
 681              }
 682              
 683              tween.currentFrame += tweak;      
 684          }
 685      };
 686      this._queue = queue;
 687      this._getIndex = getIndex;
 688  };
 689  /**
 690   * Used to calculate Bezier splines for any number of control points.
 691   * @class Bezier
 692   * @namespace YAHOO.util
 693   *
 694   */
 695  YAHOO.util.Bezier = new function() {
 696      /**
 697       * Get the current position of the animated element based on t.
 698       * Each point is an array of "x" and "y" values (0 = x, 1 = y)
 699       * At least 2 points are required (start and end).
 700       * First point is start. Last point is end.
 701       * Additional control points are optional.     
 702       * @method getPosition
 703       * @param {Array} points An array containing Bezier points
 704       * @param {Number} t A number between 0 and 1 which is the basis for determining current position
 705       * @return {Array} An array containing int x and y member data
 706       */
 707      this.getPosition = function(points, t) {  
 708          var n = points.length;
 709          var tmp = [];
 710  
 711          for (var i = 0; i < n; ++i){
 712              tmp[i] = [points[i][0], points[i][1]]; // save input
 713          }
 714          
 715          for (var j = 1; j < n; ++j) {
 716              for (i = 0; i < n - j; ++i) {
 717                  tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
 718                  tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; 
 719              }
 720          }
 721      
 722          return [ tmp[0][0], tmp[0][1] ]; 
 723      
 724      };
 725  };
 726  (function() {
 727  /**
 728   * Anim subclass for color transitions.
 729   * <p>Usage: <code>var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut);</code> Color values can be specified with either 112233, #112233, 
 730   * [255,255,255], or rgb(255,255,255)</p>
 731   * @class ColorAnim
 732   * @namespace YAHOO.util
 733   * @requires YAHOO.util.Anim
 734   * @requires YAHOO.util.AnimMgr
 735   * @requires YAHOO.util.Easing
 736   * @requires YAHOO.util.Bezier
 737   * @requires YAHOO.util.Dom
 738   * @requires YAHOO.util.Event
 739   * @constructor
 740   * @extends YAHOO.util.Anim
 741   * @param {HTMLElement | String} el Reference to the element that will be animated
 742   * @param {Object} attributes The attribute(s) to be animated.
 743   * Each attribute is an object with at minimum a "to" or "by" member defined.
 744   * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").
 745   * All attribute names use camelCase.
 746   * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
 747   * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
 748   */
 749      var ColorAnim = function(el, attributes, duration,  method) {
 750          ColorAnim.superclass.constructor.call(this, el, attributes, duration, method);
 751      };
 752      
 753      ColorAnim.NAME = 'ColorAnim';
 754  
 755      ColorAnim.DEFAULT_BGCOLOR = '#fff';
 756      // shorthand
 757      var Y = YAHOO.util;
 758      YAHOO.extend(ColorAnim, Y.Anim);
 759  
 760      var superclass = ColorAnim.superclass;
 761      var proto = ColorAnim.prototype;
 762      
 763      proto.patterns.color = /color$/i;
 764      proto.patterns.rgb            = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;
 765      proto.patterns.hex            = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
 766      proto.patterns.hex3          = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;
 767      proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari
 768      
 769      /**
 770       * Attempts to parse the given string and return a 3-tuple.
 771       * @method parseColor
 772       * @param {String} s The string to parse.
 773       * @return {Array} The 3-tuple of rgb values.
 774       */
 775      proto.parseColor = function(s) {
 776          if (s.length == 3) { return s; }
 777      
 778          var c = this.patterns.hex.exec(s);
 779          if (c && c.length == 4) {
 780              return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ];
 781          }
 782      
 783          c = this.patterns.rgb.exec(s);
 784          if (c && c.length == 4) {
 785              return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ];
 786          }
 787      
 788          c = this.patterns.hex3.exec(s);
 789          if (c && c.length == 4) {
 790              return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ];
 791          }
 792          
 793          return null;
 794      };
 795  
 796      proto.getAttribute = function(attr) {
 797          var el = this.getEl();
 798          if (this.patterns.color.test(attr) ) {
 799              var val = YAHOO.util.Dom.getStyle(el, attr);
 800              
 801              var that = this;
 802              if (this.patterns.transparent.test(val)) { // bgcolor default
 803                  var parent = YAHOO.util.Dom.getAncestorBy(el, function(node) {
 804                      return !that.patterns.transparent.test(val);
 805                  });
 806  
 807                  if (parent) {
 808                      val = Y.Dom.getStyle(parent, attr);
 809                  } else {
 810                      val = ColorAnim.DEFAULT_BGCOLOR;
 811                  }
 812              }
 813          } else {
 814              val = superclass.getAttribute.call(this, attr);
 815          }
 816  
 817          return val;
 818      };
 819      
 820      proto.doMethod = function(attr, start, end) {
 821          var val;
 822      
 823          if ( this.patterns.color.test(attr) ) {
 824              val = [];
 825              for (var i = 0, len = start.length; i < len; ++i) {
 826                  val[i] = superclass.doMethod.call(this, attr, start[i], end[i]);
 827              }
 828              
 829              val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')';
 830          }
 831          else {
 832              val = superclass.doMethod.call(this, attr, start, end);
 833          }
 834  
 835          return val;
 836      };
 837  
 838      proto.setRuntimeAttribute = function(attr) {
 839          superclass.setRuntimeAttribute.call(this, attr);
 840          
 841          if ( this.patterns.color.test(attr) ) {
 842              var attributes = this.attributes;
 843              var start = this.parseColor(this.runtimeAttributes[attr].start);
 844              var end = this.parseColor(this.runtimeAttributes[attr].end);
 845              // fix colors if going "by"
 846              if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) {
 847                  end = this.parseColor(attributes[attr].by);
 848              
 849                  for (var i = 0, len = start.length; i < len; ++i) {
 850                      end[i] = start[i] + end[i];
 851                  }
 852              }
 853              
 854              this.runtimeAttributes[attr].start = start;
 855              this.runtimeAttributes[attr].end = end;
 856          }
 857      };
 858  
 859      Y.ColorAnim = ColorAnim;
 860  })();
 861  /*!
 862  TERMS OF USE - EASING EQUATIONS
 863  Open source under the BSD License.
 864  Copyright 2001 Robert Penner All rights reserved.
 865  
 866  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 867  
 868   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 869   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
 870   * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
 871  
 872  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 873  */
 874  
 875  /**
 876   * Singleton that determines how an animation proceeds from start to end.
 877   * @class Easing
 878   * @namespace YAHOO.util
 879  */
 880  
 881  YAHOO.util.Easing = {
 882  
 883      /**
 884       * Uniform speed between points.
 885       * @method easeNone
 886       * @param {Number} t Time value used to compute current value
 887       * @param {Number} b Starting value
 888       * @param {Number} c Delta between start and end values
 889       * @param {Number} d Total length of animation
 890       * @return {Number} The computed value for the current animation frame
 891       */
 892      easeNone: function (t, b, c, d) {
 893          return c*t/d + b;
 894      },
 895      
 896      /**
 897       * Begins slowly and accelerates towards end.
 898       * @method easeIn
 899       * @param {Number} t Time value used to compute current value
 900       * @param {Number} b Starting value
 901       * @param {Number} c Delta between start and end values
 902       * @param {Number} d Total length of animation
 903       * @return {Number} The computed value for the current animation frame
 904       */
 905      easeIn: function (t, b, c, d) {
 906          return c*(t/=d)*t + b;
 907      },
 908  
 909      /**
 910       * Begins quickly and decelerates towards end.
 911       * @method easeOut
 912       * @param {Number} t Time value used to compute current value
 913       * @param {Number} b Starting value
 914       * @param {Number} c Delta between start and end values
 915       * @param {Number} d Total length of animation
 916       * @return {Number} The computed value for the current animation frame
 917       */
 918      easeOut: function (t, b, c, d) {
 919          return -c *(t/=d)*(t-2) + b;
 920      },
 921      
 922      /**
 923       * Begins slowly and decelerates towards end.
 924       * @method easeBoth
 925       * @param {Number} t Time value used to compute current value
 926       * @param {Number} b Starting value
 927       * @param {Number} c Delta between start and end values
 928       * @param {Number} d Total length of animation
 929       * @return {Number} The computed value for the current animation frame
 930       */
 931      easeBoth: function (t, b, c, d) {
 932          if ((t/=d/2) < 1) {
 933              return c/2*t*t + b;
 934          }
 935          
 936          return -c/2 * ((--t)*(t-2) - 1) + b;
 937      },
 938      
 939      /**
 940       * Begins slowly and accelerates towards end.
 941       * @method easeInStrong
 942       * @param {Number} t Time value used to compute current value
 943       * @param {Number} b Starting value
 944       * @param {Number} c Delta between start and end values
 945       * @param {Number} d Total length of animation
 946       * @return {Number} The computed value for the current animation frame
 947       */
 948      easeInStrong: function (t, b, c, d) {
 949          return c*(t/=d)*t*t*t + b;
 950      },
 951      
 952      /**
 953       * Begins quickly and decelerates towards end.
 954       * @method easeOutStrong
 955       * @param {Number} t Time value used to compute current value
 956       * @param {Number} b Starting value
 957       * @param {Number} c Delta between start and end values
 958       * @param {Number} d Total length of animation
 959       * @return {Number} The computed value for the current animation frame
 960       */
 961      easeOutStrong: function (t, b, c, d) {
 962          return -c * ((t=t/d-1)*t*t*t - 1) + b;
 963      },
 964      
 965      /**
 966       * Begins slowly and decelerates towards end.
 967       * @method easeBothStrong
 968       * @param {Number} t Time value used to compute current value
 969       * @param {Number} b Starting value
 970       * @param {Number} c Delta between start and end values
 971       * @param {Number} d Total length of animation
 972       * @return {Number} The computed value for the current animation frame
 973       */
 974      easeBothStrong: function (t, b, c, d) {
 975          if ((t/=d/2) < 1) {
 976              return c/2*t*t*t*t + b;
 977          }
 978          
 979          return -c/2 * ((t-=2)*t*t*t - 2) + b;
 980      },
 981  
 982      /**
 983       * Snap in elastic effect.
 984       * @method elasticIn
 985       * @param {Number} t Time value used to compute current value
 986       * @param {Number} b Starting value
 987       * @param {Number} c Delta between start and end values
 988       * @param {Number} d Total length of animation
 989       * @param {Number} a Amplitude (optional)
 990       * @param {Number} p Period (optional)
 991       * @return {Number} The computed value for the current animation frame
 992       */
 993  
 994      elasticIn: function (t, b, c, d, a, p) {
 995          if (t == 0) {
 996              return b;
 997          }
 998          if ( (t /= d) == 1 ) {
 999              return b+c;
1000          }
1001          if (!p) {
1002              p=d*.3;
1003          }
1004          
1005          if (!a || a < Math.abs(c)) {
1006              a = c; 
1007              var s = p/4;
1008          }
1009          else {
1010              var s = p/(2*Math.PI) * Math.asin (c/a);
1011          }
1012          
1013          return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
1014      },
1015  
1016      /**
1017       * Snap out elastic effect.
1018       * @method elasticOut
1019       * @param {Number} t Time value used to compute current value
1020       * @param {Number} b Starting value
1021       * @param {Number} c Delta between start and end values
1022       * @param {Number} d Total length of animation
1023       * @param {Number} a Amplitude (optional)
1024       * @param {Number} p Period (optional)
1025       * @return {Number} The computed value for the current animation frame
1026       */
1027      elasticOut: function (t, b, c, d, a, p) {
1028          if (t == 0) {
1029              return b;
1030          }
1031          if ( (t /= d) == 1 ) {
1032              return b+c;
1033          }
1034          if (!p) {
1035              p=d*.3;
1036          }
1037          
1038          if (!a || a < Math.abs(c)) {
1039              a = c;
1040              var s = p / 4;
1041          }
1042          else {
1043              var s = p/(2*Math.PI) * Math.asin (c/a);
1044          }
1045          
1046          return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
1047      },
1048      
1049      /**
1050       * Snap both elastic effect.
1051       * @method elasticBoth
1052       * @param {Number} t Time value used to compute current value
1053       * @param {Number} b Starting value
1054       * @param {Number} c Delta between start and end values
1055       * @param {Number} d Total length of animation
1056       * @param {Number} a Amplitude (optional)
1057       * @param {Number} p Period (optional)
1058       * @return {Number} The computed value for the current animation frame
1059       */
1060      elasticBoth: function (t, b, c, d, a, p) {
1061          if (t == 0) {
1062              return b;
1063          }
1064          
1065          if ( (t /= d/2) == 2 ) {
1066              return b+c;
1067          }
1068          
1069          if (!p) {
1070              p = d*(.3*1.5);
1071          }
1072          
1073          if ( !a || a < Math.abs(c) ) {
1074              a = c; 
1075              var s = p/4;
1076          }
1077          else {
1078              var s = p/(2*Math.PI) * Math.asin (c/a);
1079          }
1080          
1081          if (t < 1) {
1082              return -.5*(a*Math.pow(2,10*(t-=1)) * 
1083                      Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
1084          }
1085          return a*Math.pow(2,-10*(t-=1)) * 
1086                  Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
1087      },
1088  
1089  
1090      /**
1091       * Backtracks slightly, then reverses direction and moves to end.
1092       * @method backIn
1093       * @param {Number} t Time value used to compute current value
1094       * @param {Number} b Starting value
1095       * @param {Number} c Delta between start and end values
1096       * @param {Number} d Total length of animation
1097       * @param {Number} s Overshoot (optional)
1098       * @return {Number} The computed value for the current animation frame
1099       */
1100      backIn: function (t, b, c, d, s) {
1101          if (typeof s == 'undefined') {
1102              s = 1.70158;
1103          }
1104          return c*(t/=d)*t*((s+1)*t - s) + b;
1105      },
1106  
1107      /**
1108       * Overshoots end, then reverses and comes back to end.
1109       * @method backOut
1110       * @param {Number} t Time value used to compute current value
1111       * @param {Number} b Starting value
1112       * @param {Number} c Delta between start and end values
1113       * @param {Number} d Total length of animation
1114       * @param {Number} s Overshoot (optional)
1115       * @return {Number} The computed value for the current animation frame
1116       */
1117      backOut: function (t, b, c, d, s) {
1118          if (typeof s == 'undefined') {
1119              s = 1.70158;
1120          }
1121          return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
1122      },
1123      
1124      /**
1125       * Backtracks slightly, then reverses direction, overshoots end, 
1126       * then reverses and comes back to end.
1127       * @method backBoth
1128       * @param {Number} t Time value used to compute current value
1129       * @param {Number} b Starting value
1130       * @param {Number} c Delta between start and end values
1131       * @param {Number} d Total length of animation
1132       * @param {Number} s Overshoot (optional)
1133       * @return {Number} The computed value for the current animation frame
1134       */
1135      backBoth: function (t, b, c, d, s) {
1136          if (typeof s == 'undefined') {
1137              s = 1.70158; 
1138          }
1139          
1140          if ((t /= d/2 ) < 1) {
1141              return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
1142          }
1143          return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
1144      },
1145  
1146      /**
1147       * Bounce off of start.
1148       * @method bounceIn
1149       * @param {Number} t Time value used to compute current value
1150       * @param {Number} b Starting value
1151       * @param {Number} c Delta between start and end values
1152       * @param {Number} d Total length of animation
1153       * @return {Number} The computed value for the current animation frame
1154       */
1155      bounceIn: function (t, b, c, d) {
1156          return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b;
1157      },
1158      
1159      /**
1160       * Bounces off end.
1161       * @method bounceOut
1162       * @param {Number} t Time value used to compute current value
1163       * @param {Number} b Starting value
1164       * @param {Number} c Delta between start and end values
1165       * @param {Number} d Total length of animation
1166       * @return {Number} The computed value for the current animation frame
1167       */
1168      bounceOut: function (t, b, c, d) {
1169          if ((t/=d) < (1/2.75)) {
1170              return c*(7.5625*t*t) + b;
1171          } else if (t < (2/2.75)) {
1172              return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
1173          } else if (t < (2.5/2.75)) {
1174              return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
1175          }
1176          return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
1177      },
1178      
1179      /**
1180       * Bounces off start and end.
1181       * @method bounceBoth
1182       * @param {Number} t Time value used to compute current value
1183       * @param {Number} b Starting value
1184       * @param {Number} c Delta between start and end values
1185       * @param {Number} d Total length of animation
1186       * @return {Number} The computed value for the current animation frame
1187       */
1188      bounceBoth: function (t, b, c, d) {
1189          if (t < d/2) {
1190              return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b;
1191          }
1192          return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
1193      }
1194  };
1195  
1196  (function() {
1197  /**
1198   * Anim subclass for moving elements along a path defined by the "points" 
1199   * member of "attributes".  All "points" are arrays with x, y coordinates.
1200   * <p>Usage: <code>var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);</code></p>
1201   * @class Motion
1202   * @namespace YAHOO.util
1203   * @requires YAHOO.util.Anim
1204   * @requires YAHOO.util.AnimMgr
1205   * @requires YAHOO.util.Easing
1206   * @requires YAHOO.util.Bezier
1207   * @requires YAHOO.util.Dom
1208   * @requires YAHOO.util.Event
1209   * @requires YAHOO.util.CustomEvent 
1210   * @constructor
1211   * @extends YAHOO.util.ColorAnim
1212   * @param {String | HTMLElement} el Reference to the element that will be animated
1213   * @param {Object} attributes The attribute(s) to be animated.  
1214   * Each attribute is an object with at minimum a "to" or "by" member defined.  
1215   * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").  
1216   * All attribute names use camelCase.
1217   * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
1218   * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
1219   */
1220      var Motion = function(el, attributes, duration,  method) {
1221          if (el) { // dont break existing subclasses not using YAHOO.extend
1222              Motion.superclass.constructor.call(this, el, attributes, duration, method);
1223          }
1224      };
1225  
1226  
1227      Motion.NAME = 'Motion';
1228  
1229      // shorthand
1230      var Y = YAHOO.util;
1231      YAHOO.extend(Motion, Y.ColorAnim);
1232      
1233      var superclass = Motion.superclass;
1234      var proto = Motion.prototype;
1235  
1236      proto.patterns.points = /^points$/i;
1237      
1238      proto.setAttribute = function(attr, val, unit) {
1239          if (  this.patterns.points.test(attr) ) {
1240              unit = unit || 'px';
1241              superclass.setAttribute.call(this, 'left', val[0], unit);
1242              superclass.setAttribute.call(this, 'top', val[1], unit);
1243          } else {
1244              superclass.setAttribute.call(this, attr, val, unit);
1245          }
1246      };
1247  
1248      proto.getAttribute = function(attr) {
1249          if (  this.patterns.points.test(attr) ) {
1250              var val = [
1251                  superclass.getAttribute.call(this, 'left'),
1252                  superclass.getAttribute.call(this, 'top')
1253              ];
1254          } else {
1255              val = superclass.getAttribute.call(this, attr);
1256          }
1257  
1258          return val;
1259      };
1260  
1261      proto.doMethod = function(attr, start, end) {
1262          var val = null;
1263  
1264          if ( this.patterns.points.test(attr) ) {
1265              var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;                
1266              val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t);
1267          } else {
1268              val = superclass.doMethod.call(this, attr, start, end);
1269          }
1270          return val;
1271      };
1272  
1273      proto.setRuntimeAttribute = function(attr) {
1274          if ( this.patterns.points.test(attr) ) {
1275              var el = this.getEl();
1276              var attributes = this.attributes;
1277              var start;
1278              var control = attributes['points']['control'] || [];
1279              var end;
1280              var i, len;
1281              
1282              if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points
1283                  control = [control];
1284              } else { // break reference to attributes.points.control
1285                  var tmp = []; 
1286                  for (i = 0, len = control.length; i< len; ++i) {
1287                      tmp[i] = control[i];
1288                  }
1289                  control = tmp;
1290              }
1291  
1292              if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative
1293                  Y.Dom.setStyle(el, 'position', 'relative');
1294              }
1295      
1296              if ( isset(attributes['points']['from']) ) {
1297                  Y.Dom.setXY(el, attributes['points']['from']); // set position to from point
1298              } 
1299              else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position
1300              
1301              start = this.getAttribute('points'); // get actual top & left
1302              
1303              // TO beats BY, per SMIL 2.1 spec
1304              if ( isset(attributes['points']['to']) ) {
1305                  end = translateValues.call(this, attributes['points']['to'], start);
1306                  
1307                  var pageXY = Y.Dom.getXY(this.getEl());
1308                  for (i = 0, len = control.length; i < len; ++i) {
1309                      control[i] = translateValues.call(this, control[i], start);
1310                  }
1311  
1312                  
1313              } else if ( isset(attributes['points']['by']) ) {
1314                  end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ];
1315                  
1316                  for (i = 0, len = control.length; i < len; ++i) {
1317                      control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ];
1318                  }
1319              }
1320  
1321              this.runtimeAttributes[attr] = [start];
1322              
1323              if (control.length > 0) {
1324                  this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); 
1325              }
1326  
1327              this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end;
1328          }
1329          else {
1330              superclass.setRuntimeAttribute.call(this, attr);
1331          }
1332      };
1333      
1334      var translateValues = function(val, start) {
1335          var pageXY = Y.Dom.getXY(this.getEl());
1336          val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ];
1337  
1338          return val; 
1339      };
1340      
1341      var isset = function(prop) {
1342          return (typeof prop !== 'undefined');
1343      };
1344  
1345      Y.Motion = Motion;
1346  })();
1347  (function() {
1348  /**
1349   * Anim subclass for scrolling elements to a position defined by the "scroll"
1350   * member of "attributes".  All "scroll" members are arrays with x, y scroll positions.
1351   * <p>Usage: <code>var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);</code></p>
1352   * @class Scroll
1353   * @namespace YAHOO.util
1354   * @requires YAHOO.util.Anim
1355   * @requires YAHOO.util.AnimMgr
1356   * @requires YAHOO.util.Easing
1357   * @requires YAHOO.util.Bezier
1358   * @requires YAHOO.util.Dom
1359   * @requires YAHOO.util.Event
1360   * @requires YAHOO.util.CustomEvent 
1361   * @extends YAHOO.util.ColorAnim
1362   * @constructor
1363   * @param {String or HTMLElement} el Reference to the element that will be animated
1364   * @param {Object} attributes The attribute(s) to be animated.  
1365   * Each attribute is an object with at minimum a "to" or "by" member defined.  
1366   * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").  
1367   * All attribute names use camelCase.
1368   * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
1369   * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
1370   */
1371      var Scroll = function(el, attributes, duration,  method) {
1372          if (el) { // dont break existing subclasses not using YAHOO.extend
1373              Scroll.superclass.constructor.call(this, el, attributes, duration, method);
1374          }
1375      };
1376  
1377      Scroll.NAME = 'Scroll';
1378  
1379      // shorthand
1380      var Y = YAHOO.util;
1381      YAHOO.extend(Scroll, Y.ColorAnim);
1382      
1383      var superclass = Scroll.superclass;
1384      var proto = Scroll.prototype;
1385  
1386      proto.doMethod = function(attr, start, end) {
1387          var val = null;
1388      
1389          if (attr == 'scroll') {
1390              val = [
1391                  this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames),
1392                  this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)
1393              ];
1394              
1395          } else {
1396              val = superclass.doMethod.call(this, attr, start, end);
1397          }
1398          return val;
1399      };
1400  
1401      proto.getAttribute = function(attr) {
1402          var val = null;
1403          var el = this.getEl();
1404          
1405          if (attr == 'scroll') {
1406              val = [ el.scrollLeft, el.scrollTop ];
1407          } else {
1408              val = superclass.getAttribute.call(this, attr);
1409          }
1410          
1411          return val;
1412      };
1413  
1414      proto.setAttribute = function(attr, val, unit) {
1415          var el = this.getEl();
1416          
1417          if (attr == 'scroll') {
1418              el.scrollLeft = val[0];
1419              el.scrollTop = val[1];
1420          } else {
1421              superclass.setAttribute.call(this, attr, val, unit);
1422          }
1423      };
1424  
1425      Y.Scroll = Scroll;
1426  })();
1427  YAHOO.register("animation", YAHOO.util.Anim, {version: "2.9.0", build: "2800"});
1428  
1429  }, '2.9.0' ,{"requires": ["yui2-yahoo", "yui2-dom", "yui2-event"]});


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1