<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -257,7 +257,7 @@ s2.css = {
 
   ElementMethods: {
     /**
-     *  s2.css.ElementMethods.getStyles(@element) -&gt; Object
+     *  Element.getStyles(@element) -&gt; Object
      *  - element (String | Object): DOM object or element ID
      *  
      *  Returns an object with all currently applied style attributes for</diff>
      <filename>src/css.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,9 @@
+/** section: Effects
+ *  class s2.fx.Parallel &lt; s2.fx.Base
+ *
+ *  This effect can change an object property or call
+ *  a method with a numerical interpolation.
+**/
 s2.fx.Attribute = Class.create(s2.fx.Base, {
   initialize: function($super, object, from, to, options, method) {
     object = Object.isString(object) ? $(object) : object;</diff>
      <filename>src/effects/attribute.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,6 @@
+/** section: Effects
+ *  class s2.fx.Heartbeat
+**/
 s2.fx.Heartbeat = Class.create({
   initialize: function(options) {
     this.options = Object.extend({</diff>
      <filename>src/effects/heartbeat.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 /** section: Effects
- *  class s2.fx.Parallel &lt; s2.fx.Element
+ *  class s2.fx.Parallel &lt; s2.fx.Base
  *
  *  Effect to execute several other effects in parallel.
 **/</diff>
      <filename>src/effects/parallel.js</filename>
    </modified>
    <modified>
      <diff>@@ -11,180 +11,418 @@
  */
 
 Object.extend(s2.fx.Transitions, {
+  /**
+   *  s2.fx.Transitions.easeInQuad(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
   easeInQuad: function(pos){
      return Math.pow(pos, 2);
-   },
-
-   easeOutQuad: function(pos){
-     return -(Math.pow((pos-1), 2) -1);
-   },
-
-   easeInOutQuad: function(pos){
-     if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,2);
-     return -0.5 * ((pos-=2)*pos - 2);
-   },
-
-   easeInCubic: function(pos){
-     return Math.pow(pos, 3);
-   },
-
-   easeOutCubic: function(pos){
-     return (Math.pow((pos-1), 3) +1);
-   },
-
-   easeInOutCubic: function(pos){
-     if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,3);
-     return 0.5 * (Math.pow((pos-2),3) + 2);
-   },
-
-   easeInQuart: function(pos){
-     return Math.pow(pos, 4);
-   },
-
-   easeOutQuart: function(pos){
-     return -(Math.pow((pos-1), 4) -1)
-   },
-
-   easeInOutQuart: function(pos){
-     if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,4);
-     return -0.5 * ((pos-=2)*Math.pow(pos,3) - 2);
-   },
-
-   easeInQuint: function(pos){
-     return Math.pow(pos, 5);
-   },
-
-   easeOutQuint: function(pos){
-     return (Math.pow((pos-1), 5) +1);
-   },
-
-   easeInOutQuint: function(pos){
-     if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,5);
-     return 0.5 * (Math.pow((pos-2),5) + 2);
-   },
-
-   easeInSine: function(pos){
-     return -Math.cos(pos * (Math.PI/2)) + 1;
-   },
-
-   easeOutSine: function(pos){
-     return Math.sin(pos * (Math.PI/2));
-   },
-
-   easeInOutSine: function(pos){
-     return (-.5 * (Math.cos(Math.PI*pos) -1));
-   },
-
-   easeInExpo: function(pos){
-     return (pos==0) ? 0 : Math.pow(2, 10 * (pos - 1));
-   },
-
-   easeOutExpo: function(pos){
-     return (pos==1) ? 1 : -Math.pow(2, -10 * pos) + 1;
-   },
-
-   easeInOutExpo: function(pos){
-     if(pos==0) return 0;
-     if(pos==1) return 1;
-     if((pos/=0.5) &lt; 1) return 0.5 * Math.pow(2,10 * (pos-1));
-     return 0.5 * (-Math.pow(2, -10 * --pos) + 2);
-   },
-
-   easeInCirc: function(pos){
-     return -(Math.sqrt(1 - (pos*pos)) - 1);
-   },
-
-   easeOutCirc: function(pos){
-     return Math.sqrt(1 - Math.pow((pos-1), 2))
-   },
-
-   easeInOutCirc: function(pos){
-     if((pos/=0.5) &lt; 1) return -0.5 * (Math.sqrt(1 - pos*pos) - 1);
-     return 0.5 * (Math.sqrt(1 - (pos-=2)*pos) + 1);
-   },
-
-   easeOutBounce: function(pos){
-     if ((pos) &lt; (1/2.75)) {
-       return (7.5625*pos*pos);
-     } else if (pos &lt; (2/2.75)) {
-       return (7.5625*(pos-=(1.5/2.75))*pos + .75);
-     } else if (pos &lt; (2.5/2.75)) {
-       return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
-     } else {
-       return (7.5625*(pos-=(2.625/2.75))*pos + .984375);
-     }
-   },
-
-   easeInBack: function(pos){
-     var s = 1.70158;
-     return (pos)*pos*((s+1)*pos - s);
-   },
-
-   easeOutBack: function(pos){
-     var s = 1.70158;
-     return (pos=pos-1)*pos*((s+1)*pos + s) + 1;
-   },
-
-   easeInOutBack: function(pos){
-     var s = 1.70158;
-     if((pos/=0.5) &lt; 1) return 0.5*(pos*pos*(((s*=(1.525))+1)*pos -s));
-     return 0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos +s) +2);
-   },
-
-   elastic: function(pos) {
-     return -1 * Math.pow(4,-8*pos) * Math.sin((pos*6-1)*(2*Math.PI)/2) + 1;
-   },
-
-   swingFromTo: function(pos) {
-     var s = 1.70158;
-     return ((pos/=0.5) &lt; 1) ? 0.5*(pos*pos*(((s*=(1.525))+1)*pos - s)) :
-       0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos + s) + 2);
-   },
-
-   swingFrom: function(pos) {
-     var s = 1.70158;
-     return pos*pos*((s+1)*pos - s);
-   },
-
-   swingTo: function(pos) {
-     var s = 1.70158;
-     return (pos-=1)*pos*((s+1)*pos + s) + 1;
-   },
-
-   bounce: function(pos) {
-     if (pos &lt; (1/2.75)) {
-         return (7.5625*pos*pos);
-     } else if (pos &lt; (2/2.75)) {
-         return (7.5625*(pos-=(1.5/2.75))*pos + .75);
-     } else if (pos &lt; (2.5/2.75)) {
-         return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
-     } else {
-         return (7.5625*(pos-=(2.625/2.75))*pos + .984375);
-     }
-   },
-
-   bouncePast: function(pos) {
-     if (pos &lt; (1/2.75)) {
-         return (7.5625*pos*pos);
-     } else if (pos &lt; (2/2.75)) {
-         return 2 - (7.5625*(pos-=(1.5/2.75))*pos + .75);
-     } else if (pos &lt; (2.5/2.75)) {
-         return 2 - (7.5625*(pos-=(2.25/2.75))*pos + .9375);
-     } else {
-         return 2 - (7.5625*(pos-=(2.625/2.75))*pos + .984375);
-     }
-   },
-
-   easeFromTo: function(pos) {
-     if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,4);
-     return -0.5 * ((pos-=2)*Math.pow(pos,3) - 2);
-   },
-
-   easeFrom: function(pos) {
-     return Math.pow(pos,4);
-   },
-
-   easeTo: function(pos) {
-     return Math.pow(pos,0.25);
-   }
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutQuad(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutQuad: function(pos){
+    return -(Math.pow((pos-1), 2) -1);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutQuad(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutQuad: function(pos){
+    if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,2);
+    return -0.5 * ((pos-=2)*pos - 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInCubic(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInCubic: function(pos){
+    return Math.pow(pos, 3);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutCubic(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutCubic: function(pos){
+    return (Math.pow((pos-1), 3) +1);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutCubic(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutCubic: function(pos){
+    if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,3);
+    return 0.5 * (Math.pow((pos-2),3) + 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInQuart(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInQuart: function(pos){
+    return Math.pow(pos, 4);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutQuart(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutQuart: function(pos){
+    return -(Math.pow((pos-1), 4) -1)
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutQuart(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutQuart: function(pos){
+    if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,4);
+    return -0.5 * ((pos-=2)*Math.pow(pos,3) - 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInQuint(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInQuint: function(pos){
+    return Math.pow(pos, 5);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutQuint(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutQuint: function(pos){
+    return (Math.pow((pos-1), 5) +1);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutQuint(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutQuint: function(pos){
+    if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,5);
+    return 0.5 * (Math.pow((pos-2),5) + 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInSine(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInSine: function(pos){
+    return -Math.cos(pos * (Math.PI/2)) + 1;
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutSine(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutSine: function(pos){
+    return Math.sin(pos * (Math.PI/2));
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutSine(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutSine: function(pos){
+    return (-.5 * (Math.cos(Math.PI*pos) -1));
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInExpo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInExpo: function(pos){
+    return (pos==0) ? 0 : Math.pow(2, 10 * (pos - 1));
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutExpo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutExpo: function(pos){
+    return (pos==1) ? 1 : -Math.pow(2, -10 * pos) + 1;
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutExpo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutExpo: function(pos){
+    if(pos==0) return 0;
+    if(pos==1) return 1;
+    if((pos/=0.5) &lt; 1) return 0.5 * Math.pow(2,10 * (pos-1));
+    return 0.5 * (-Math.pow(2, -10 * --pos) + 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInCirc(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInCirc: function(pos){
+    return -(Math.sqrt(1 - (pos*pos)) - 1);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutCirc(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutCirc: function(pos){
+    return Math.sqrt(1 - Math.pow((pos-1), 2))
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutCirc(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutCirc: function(pos){
+    if((pos/=0.5) &lt; 1) return -0.5 * (Math.sqrt(1 - pos*pos) - 1);
+    return 0.5 * (Math.sqrt(1 - (pos-=2)*pos) + 1);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutBounce(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutBounce: function(pos){
+    if ((pos) &lt; (1/2.75)) {
+      return (7.5625*pos*pos);
+    } else if (pos &lt; (2/2.75)) {
+      return (7.5625*(pos-=(1.5/2.75))*pos + .75);
+    } else if (pos &lt; (2.5/2.75)) {
+      return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
+    } else {
+      return (7.5625*(pos-=(2.625/2.75))*pos + .984375);
+    }
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInBack(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInBack: function(pos){
+    var s = 1.70158;
+    return (pos)*pos*((s+1)*pos - s);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeOutBack(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeOutBack: function(pos){
+    var s = 1.70158;
+    return (pos=pos-1)*pos*((s+1)*pos + s) + 1;
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeInOutBack(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeInOutBack: function(pos){
+    var s = 1.70158;
+    if((pos/=0.5) &lt; 1) return 0.5*(pos*pos*(((s*=(1.525))+1)*pos -s));
+    return 0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos +s) +2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.elastic(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  elastic: function(pos) {
+    return -1 * Math.pow(4,-8*pos) * Math.sin((pos*6-1)*(2*Math.PI)/2) + 1;
+  },
+  
+  /**
+   *  s2.fx.Transitions.swingFromTo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  swingFromTo: function(pos) {
+    var s = 1.70158;
+    return ((pos/=0.5) &lt; 1) ? 0.5*(pos*pos*(((s*=(1.525))+1)*pos - s)) :
+      0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos + s) + 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.swingFrom(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  swingFrom: function(pos) {
+    var s = 1.70158;
+    return pos*pos*((s+1)*pos - s);
+  },
+  
+  /**
+   *  s2.fx.Transitions.swingTo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  swingTo: function(pos) {
+    var s = 1.70158;
+    return (pos-=1)*pos*((s+1)*pos + s) + 1;
+  },
+  
+  /**
+   *  s2.fx.Transitions.bounce(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  bounce: function(pos) {
+    if (pos &lt; (1/2.75)) {
+        return (7.5625*pos*pos);
+    } else if (pos &lt; (2/2.75)) {
+        return (7.5625*(pos-=(1.5/2.75))*pos + .75);
+    } else if (pos &lt; (2.5/2.75)) {
+        return (7.5625*(pos-=(2.25/2.75))*pos + .9375);
+    } else {
+        return (7.5625*(pos-=(2.625/2.75))*pos + .984375);
+    }
+  },
+  
+  /**
+   *  s2.fx.Transitions.bouncePast(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  bouncePast: function(pos) {
+    if (pos &lt; (1/2.75)) {
+        return (7.5625*pos*pos);
+    } else if (pos &lt; (2/2.75)) {
+        return 2 - (7.5625*(pos-=(1.5/2.75))*pos + .75);
+    } else if (pos &lt; (2.5/2.75)) {
+        return 2 - (7.5625*(pos-=(2.25/2.75))*pos + .9375);
+    } else {
+        return 2 - (7.5625*(pos-=(2.625/2.75))*pos + .984375);
+    }
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeFromTo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeFromTo: function(pos) {
+    if ((pos/=0.5) &lt; 1) return 0.5*Math.pow(pos,4);
+    return -0.5 * ((pos-=2)*Math.pow(pos,3) - 2);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeFrom(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeFrom: function(pos) {
+    return Math.pow(pos,4);
+  },
+  
+  /**
+   *  s2.fx.Transitions.easeTo(pos) -&gt; Number
+   *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
+   *
+   *  Based on Easing Equations by Robert Penner.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
+  **/
+  easeTo: function(pos) {
+    return Math.pow(pos,0.25);
+  }
 });
\ No newline at end of file</diff>
      <filename>src/effects/transitions/penner.js</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,26 @@
  *
  * By using Transitions, it is easily possible to add movement easing,
  * pulsation, bouncing, reversal and other forms of special effects.
+ *
+ * &lt;h4&gt;Default transition&lt;/h4
+ *
+ * If no transition option is given to an effect, [[s2.fx.Transitions.sinusoidal]] is used.
+ * This setting can be changed by redifining [[s2.fx.DefaultOptions.transition]].
+ *
+ * &lt;h4&gt;Implementing your own transitions&lt;/h4&gt;
+ *
+ * Transitions can easily be added, by using this template:
+ *
+ *     Object.extend(s2.fx.Transitions, {
+ *       myTransition: function(pos) {
+ *         return pos; // do your calculations here!
+ *       }
+ *     });
+ *
+ * Transitions defined this way automatically become available to be used with
+ * the shorthand syntax for the `options.transition` argument:
+ *
+ *     $('some_element').morph('left:300px', { transition: 'myTransition' });
 **/
 
 s2.fx.Transitions = {
@@ -20,6 +40,7 @@ s2.fx.Transitions = {
    *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
    *
    *  Basic linear transition, no easing or other alteration of the effect.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   linear: Prototype.K,
   
@@ -28,6 +49,7 @@ s2.fx.Transitions = {
    *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
    *
    *  Alters the effect timing to be aligned to a sine wave.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   sinusoidal: function(pos) {
     return (-Math.cos(pos*Math.PI)/2) + 0.5;
@@ -38,6 +60,7 @@ s2.fx.Transitions = {
    *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
    *
    *  Effect is executed in a reverse linear fashion.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   reverse: function(pos) {
     return 1 - pos;
@@ -48,6 +71,7 @@ s2.fx.Transitions = {
    *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
    *
    *  Effect flickers along a sine wave.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   flicker: function(pos) {
     return Math.max((-Math.cos(pos*Math.PI)/4) + 0.75 + Math.random()/4, 1);
@@ -57,7 +81,8 @@ s2.fx.Transitions = {
    *  s2.fx.Transitions.wobble(pos) -&gt; Number
    *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
    *
-   *  Effect wobbles between start and end positions.
+   *  Effect wobbles increasingly fast between start and end positions.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   wobble: function(pos) {
     return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
@@ -69,6 +94,7 @@ s2.fx.Transitions = {
    *  - pulses (Number): Number of pulses, defaults to 5
    *
    *  Effect pulses along a sinusoidal transition.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   pulse: function(pos, pulses) { 
     return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
@@ -78,7 +104,8 @@ s2.fx.Transitions = {
    *  s2.fx.Transitions.spring(pos) -&gt; Number
    *  - pos (Number): position between 0 (start of effect) and 1 (end of effect)
    *
-   *  Alters the effect timing to a &quot;string&quot;.
+   *  Alters the effect timing to a &quot;spring&quot;.
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   spring: function(pos) { 
     return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
@@ -88,6 +115,7 @@ s2.fx.Transitions = {
    *  s2.fx.Transitions.none() -&gt; Number
    *
    *  No transition, the effect stays in intial state (returns 0 regardless of input values).
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   none: Prototype.K.curry(0),
 
@@ -95,6 +123,7 @@ s2.fx.Transitions = {
    *  s2.fx.Transitions.full() -&gt; Number
    *
    *  No transition, the effect is always in final state (returns 1 regardless of input values).
+   *  &lt;div class=&quot;transition&quot;&gt;&lt;/div&gt;
   **/
   full: Prototype.K.curry(1)
 };</diff>
      <filename>src/effects/transitions/transitions.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,15 @@
-s2.fx.ElementMethods = {
+/** section: Effects
+ * Element
+ *
+ * A collection of shortcut methods that are added to all DOM elements.
+ * [[Element.Morph]] is the preferred way to invoke morph effects.
+**/
+Element.addMethods({
+  /** 
+   *  Element.effect(@element, effect[, options]) -&gt; element
+   *
+   *  Initialize and play the specified effect on the element.
+  **/
   effect: function(element, effect, options){
     if (Object.isFunction(effect))
       effect = new effect(element, options);
@@ -8,11 +19,22 @@ s2.fx.ElementMethods = {
     return element;
   },
 
+  /** 
+   *  Element.morph(@element, style[, options]) -&gt; element
+   *
+   *  Dynamically adjust an element's CSS styles to the CSS properties given
+   *  in the `style` argument. See [[s2.fx.Morph]].
+  **/
   morph: function(element, style, options){
     options = s2.fx.parseOptions(options);
     return element.effect('morph', Object.extend(options, {style: style}));
   }.optionize(),
 
+  /** 
+   *  Element.appear(@element[, options]) -&gt; element
+   *
+   *  Make an element appear by fading it in from 0% opacity.
+  **/
   appear: function(element, options){
     return element.effect('morph', Object.extend({
       before: function(){ element.show().setStyle({opacity: 0}); },
@@ -20,6 +42,11 @@ s2.fx.ElementMethods = {
     }, options));
   },
 
+  /** 
+   *  Element.fade(@element[, options]) -&gt; element
+   *
+   *  Fade out an element from it's current opacity setting (or 100%).
+  **/
   fade: function(element, options){
     return element.effect(Effect.Morph, Object.extend({
       style: 'opacity:0',
@@ -27,6 +54,11 @@ s2.fx.ElementMethods = {
     }, options));
   },
 
+  /** 
+   *  Element.cloneWithoutIDs(@element) -&gt; element
+   *
+   *  Returns a clone of the element with all `id` attributed removed.
+  **/
   cloneWithoutIDs: function(element) {
     element = $(element);
     var clone = element.cloneNode(true);
@@ -34,6 +66,4 @@ s2.fx.ElementMethods = {
     $(clone).select('*[id]').each(function(e) { e.id = ''; });
     return clone;
   }
-};
-
-Element.addMethods(s2.fx.ElementMethods);
\ No newline at end of file
+});
\ No newline at end of file</diff>
      <filename>src/extensions/element.js</filename>
    </modified>
    <modified>
      <diff>@@ -56,7 +56,26 @@ PDoc.highlight = function(element) {
       window.scrollBy(0, frameOffset.top - 10);
     }    
   }).defer();
+};
+
+var s2doc = {
+  init: function(){
+    $$('.transition').each(s2doc.TransitionExample);
+  },
   
+  TransitionExample: function(element){
+    var type = element.up().down('.ebnf').innerHTML.gsub(/s2\.fx\.Transitions\./,'').split('(').first(),
+      transition = s2.fx.Transitions[type];
+      
+    var values = $R(0,200).map(function(v){ return transition(v/200)*200; }),
+      min = values.min(), max = values.max(), factor = 200/(max-min),
+      grid = '&lt;span style=&quot;bottom:'+((0-min)*factor).round()+'px&quot;&gt;0&lt;/span&gt;'+
+        '&lt;span style=&quot;bottom:'+((200-min)*factor).round()+'px&quot;&gt;1&lt;/span&gt;';
+      
+    element.innerHTML = grid + $R(0,200).map(function(v){
+      return '&lt;div style=&quot;left:'+v+'px;bottom:'+((values[v]-min)*factor).round()+'px;height:1px&quot;&gt;&lt;/div&gt;';
+    }).join('');
+  }
 };
 
 // Live API search.
@@ -380,4 +399,5 @@ Form.GhostedField = Class.create({
 
 document.observe(&quot;dom:loaded&quot;, function() {
   new Form.GhostedField($('search'), &quot;Search&quot;);
+  s2doc.init();
 });
\ No newline at end of file</diff>
      <filename>templates/html/assets/javascripts/application.js</filename>
    </modified>
    <modified>
      <diff>@@ -29,6 +29,29 @@ span.hidden {
 display: none;
 }
 
+div.transition {
+  margin-top: 30px;
+  width: 200px;
+  height: 200px;
+  position: relative;
+}
+
+div.transition div {
+  position: absolute;
+  height: 1px;
+  width: 1px;
+  background: #000;
+}
+
+div.transition span {
+  display: block;
+  position: absolute;
+  border-bottom: 1px solid #dadada;
+  font-size: 10x;
+  color: #888;
+  width: 200px;
+  left: 0px;
+}
 
 body {
 font-size: 82.5%;</diff>
      <filename>templates/html/assets/stylesheets/apidocs.css</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8cb6b1c3554e9590a026c56e2f2b2cb43a24d35c</id>
    </parent>
  </parents>
  <author>
    <name>Thomas Fuchs</name>
    <email>thomas@fesch.at</email>
  </author>
  <url>http://github.com/madrobby/scripty2/commit/10c8c42fdccffea202530f20e2374b952b629770</url>
  <id>10c8c42fdccffea202530f20e2374b952b629770</id>
  <committed-date>2009-06-12T05:52:15-07:00</committed-date>
  <authored-date>2009-06-12T05:52:15-07:00</authored-date>
  <message>add more documentation, nice graphs for effect transitions</message>
  <tree>e6db82c9b6f7f35765627e410d2452cb969bf8db</tree>
  <committer>
    <name>Thomas Fuchs</name>
    <email>thomas@fesch.at</email>
  </committer>
</commit>
