[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

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