diff options
| author | Louise Crow <louise.crow@gmail.com> | 2013-06-04 15:03:02 +0100 | 
|---|---|---|
| committer | Louise Crow <louise.crow@gmail.com> | 2013-06-04 15:03:02 +0100 | 
| commit | a885764b65916020d9182073b38f6951a20d4b8c (patch) | |
| tree | 0988651c144b65a8e46b28b376b2e72a5947d934 /public/javascripts/effects.js | |
| parent | eb1c465162420ad62c16dccb983cb28aa89a4639 (diff) | |
| parent | a919141992a40599f99b32bd4a8312a0009f3f7a (diff) | |
Merge branch 'release/0.11'0.11.0.3
Diffstat (limited to 'public/javascripts/effects.js')
| -rw-r--r-- | public/javascripts/effects.js | 357 | 
1 files changed, 180 insertions, 177 deletions
diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js index f030b5dbe..c81e6c7d5 100644 --- a/public/javascripts/effects.js +++ b/public/javascripts/effects.js @@ -1,48 +1,50 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  // Contributors:  //  Justin Palmer (http://encytemedia.com/)  //  Mark Pilgrim (http://diveintomark.org/)  //  Martin Bialasinki -//  +//  // script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/  +// For details, see the script.aculo.us web site: http://script.aculo.us/ -// converts rgb() and #xxx to #xxxxxx format,   -// returns self (or first argument) if not convertable   -String.prototype.parseColor = function() {   +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() {    var color = '#'; -  if (this.slice(0,4) == 'rgb(') {   -    var cols = this.slice(4,this.length-1).split(',');   -    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);   -  } else {   -    if (this.slice(0,1) == '#') {   -      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();   -      if (this.length==7) color = this.toLowerCase();   -    }   -  }   -  return (color.length==7 ? color : (arguments[0] || this));   +  if (this.slice(0,4) == 'rgb(') { +    var cols = this.slice(4,this.length-1).split(','); +    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); +  } else { +    if (this.slice(0,1) == '#') { +      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); +      if (this.length==7) color = this.toLowerCase(); +    } +  } +  return (color.length==7 ? color : (arguments[0] || this));  };  /*--------------------------------------------------------------------------*/ -Element.collectTextNodes = function(element) {   +Element.collectTextNodes = function(element) {    return $A($(element).childNodes).collect( function(node) { -    return (node.nodeType==3 ? node.nodeValue :  +    return (node.nodeType==3 ? node.nodeValue :        (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));    }).flatten().join('');  }; -Element.collectTextNodesIgnoreClass = function(element, className) {   +Element.collectTextNodesIgnoreClass = function(element, className) {    return $A($(element).childNodes).collect( function(node) { -    return (node.nodeType==3 ? node.nodeValue :  -      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?  +    return (node.nodeType==3 ? node.nodeValue : +      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?          Element.collectTextNodesIgnoreClass(node, className) : ''));    }).flatten().join('');  };  Element.setContentZoom = function(element, percent) { -  element = $(element);   -  element.setStyle({fontSize: (percent/100) + 'em'});    +  element = $(element); +  element.setStyle({fontSize: (percent/100) + 'em'});    if (Prototype.Browser.WebKit) window.scrollBy(0,0);    return element;  }; @@ -70,28 +72,23 @@ var Effect = {    Transitions: {      linear: Prototype.K,      sinoidal: function(pos) { -      return (-Math.cos(pos*Math.PI)/2) + 0.5; +      return (-Math.cos(pos*Math.PI)/2) + .5;      },      reverse: function(pos) {        return 1-pos;      },      flicker: function(pos) { -      var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; +      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;        return pos > 1 ? 1 : pos;      },      wobble: function(pos) { -      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; +      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;      }, -    pulse: function(pos, pulses) {  -      pulses = pulses || 5;  -      return ( -        ((pos % (1/pulses)) * pulses).round() == 0 ?  -              ((pos * pulses * 2) - (pos * pulses * 2).floor()) :  -          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) -        ); +    pulse: function(pos, pulses) { +      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;      }, -    spring: function(pos) {  -      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));  +    spring: function(pos) { +      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));      },      none: function(pos) {        return 0; @@ -112,14 +109,14 @@ var Effect = {    tagifyText: function(element) {      var tagifyStyle = 'position:relative';      if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; -     +      element = $(element);      $A(element.childNodes).each( function(child) {        if (child.nodeType==3) {          child.nodeValue.toArray().each( function(character) {            element.insertBefore(              new Element('span', {style: tagifyStyle}).update( -              character == ' ' ? String.fromCharCode(160) : character),  +              character == ' ' ? String.fromCharCode(160) : character),                child);          });          Element.remove(child); @@ -128,13 +125,13 @@ var Effect = {    },    multiple: function(element, effect) {      var elements; -    if (((typeof element == 'object') ||  -        Object.isFunction(element)) &&  +    if (((typeof element == 'object') || +        Object.isFunction(element)) &&         (element.length))        elements = element;      else        elements = $(element).childNodes; -       +      var options = Object.extend({        speed: 0.1,        delay: 0.0 @@ -150,14 +147,13 @@ var Effect = {      'blind':  ['BlindDown','BlindUp'],      'appear': ['Appear','Fade']    }, -  toggle: function(element, effect) { +  toggle: function(element, effect, options) {      element = $(element); -    effect = (effect || 'appear').toLowerCase(); -    var options = Object.extend({ +    effect  = (effect || 'appear').toLowerCase(); + +    return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({        queue: { position:'end', scope:(element.id || 'global'), limit: 1 } -    }, arguments[2] || { }); -    Effect[element.visible() ?  -      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); +    }, options || {}));    }  }; @@ -168,20 +164,20 @@ Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;  Effect.ScopedQueue = Class.create(Enumerable, {    initialize: function() {      this.effects  = []; -    this.interval = null;     +    this.interval = null;    },    _each: function(iterator) {      this.effects._each(iterator);    },    add: function(effect) {      var timestamp = new Date().getTime(); -     -    var position = Object.isString(effect.options.queue) ?  + +    var position = Object.isString(effect.options.queue) ?        effect.options.queue : effect.options.queue.position; -     +      switch(position) {        case 'front': -        // move unstarted effects after this effect   +        // move unstarted effects after this effect          this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {              e.startOn  += effect.finishOn;              e.finishOn += effect.finishOn; @@ -195,13 +191,13 @@ Effect.ScopedQueue = Class.create(Enumerable, {          timestamp = this.effects.pluck('finishOn').max() || timestamp;          break;      } -     +      effect.startOn  += timestamp;      effect.finishOn += timestamp;      if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))        this.effects.push(effect); -     +      if (!this.interval)        this.interval = setInterval(this.loop.bind(this), 15);    }, @@ -214,7 +210,7 @@ Effect.ScopedQueue = Class.create(Enumerable, {    },    loop: function() {      var timePos = new Date().getTime(); -    for(var i=0, len=this.effects.length;i<len;i++)  +    for(var i=0, len=this.effects.length;i<len;i++)        this.effects[i] && this.effects[i].loop(timePos);    }  }); @@ -223,7 +219,7 @@ Effect.Queues = {    instances: $H(),    get: function(queueName) {      if (!Object.isString(queueName)) return queueName; -     +      return this.instances.get(queueName) ||        this.instances.set(queueName, new Effect.ScopedQueue());    } @@ -233,12 +229,6 @@ Effect.Queue = Effect.Queues.get('global');  Effect.Base = Class.create({    position: null,    start: function(options) { -    function codeForEvent(options,eventName){ -      return ( -        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + -        (options[eventName] ? 'this.options.'+eventName+'(this);' : '') -      ); -    }      if (options && options.transition === false) options.transition = Effect.Transitions.linear;      this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });      this.currentFrame = 0; @@ -248,23 +238,35 @@ Effect.Base = Class.create({      this.fromToDelta  = this.options.to-this.options.from;      this.totalTime    = this.finishOn-this.startOn;      this.totalFrames  = this.options.fps*this.options.duration; -     -    eval('this.render = function(pos){ '+ -      'if (this.state=="idle"){this.state="running";'+ -      codeForEvent(this.options,'beforeSetup')+ -      (this.setup ? 'this.setup();':'')+  -      codeForEvent(this.options,'afterSetup')+ -      '};if (this.state=="running"){'+ -      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+ -      'this.position=pos;'+ -      codeForEvent(this.options,'beforeUpdate')+ -      (this.update ? 'this.update(pos);':'')+ -      codeForEvent(this.options,'afterUpdate')+ -      '}}'); -     + +    this.render = (function() { +      function dispatch(effect, eventName) { +        if (effect.options[eventName + 'Internal']) +          effect.options[eventName + 'Internal'](effect); +        if (effect.options[eventName]) +          effect.options[eventName](effect); +      } + +      return function(pos) { +        if (this.state === "idle") { +          this.state = "running"; +          dispatch(this, 'beforeSetup'); +          if (this.setup) this.setup(); +          dispatch(this, 'afterSetup'); +        } +        if (this.state === "running") { +          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from; +          this.position = pos; +          dispatch(this, 'beforeUpdate'); +          if (this.update) this.update(pos); +          dispatch(this, 'afterUpdate'); +        } +      }; +    })(); +      this.event('beforeStart');      if (!this.options.sync) -      Effect.Queues.get(Object.isString(this.options.queue) ?  +      Effect.Queues.get(Object.isString(this.options.queue) ?          'global' : this.options.queue.scope).add(this);    },    loop: function(timePos) { @@ -273,9 +275,9 @@ Effect.Base = Class.create({          this.render(1.0);          this.cancel();          this.event('beforeFinish'); -        if (this.finish) this.finish();  +        if (this.finish) this.finish();          this.event('afterFinish'); -        return;   +        return;        }        var pos   = (timePos - this.startOn) / this.totalTime,            frame = (pos * this.totalFrames).round(); @@ -287,7 +289,7 @@ Effect.Base = Class.create({    },    cancel: function() {      if (!this.options.sync) -      Effect.Queues.get(Object.isString(this.options.queue) ?  +      Effect.Queues.get(Object.isString(this.options.queue) ?          'global' : this.options.queue.scope).remove(this);      this.state = 'finished';    }, @@ -325,10 +327,10 @@ Effect.Parallel = Class.create(Effect.Base, {  Effect.Tween = Class.create(Effect.Base, {    initialize: function(object, from, to) {      object = Object.isString(object) ? $(object) : object; -    var args = $A(arguments), method = args.last(),  +    var args = $A(arguments), method = args.last(),        options = args.length == 5 ? args[3] : null;      this.method = Object.isFunction(method) ? method.bind(object) : -      Object.isFunction(object[method]) ? object[method].bind(object) :  +      Object.isFunction(object[method]) ? object[method].bind(object) :        function(value) { object[method] = value };      this.start(Object.extend({ from: from, to: to }, options || { }));    }, @@ -392,7 +394,7 @@ Effect.Move = Class.create(Effect.Base, {  // for backwards compatibility  Effect.MoveBy = function(element, toTop, toLeft) { -  return new Effect.Move(element,  +  return new Effect.Move(element,      Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));  }; @@ -414,15 +416,15 @@ Effect.Scale = Class.create(Effect.Base, {    setup: function() {      this.restoreAfterFinish = this.options.restoreAfterFinish || false;      this.elementPositioning = this.element.getStyle('position'); -     +      this.originalStyle = { };      ['top','left','width','height','fontSize'].each( function(k) {        this.originalStyle[k] = this.element.style[k];      }.bind(this)); -       +      this.originalTop  = this.element.offsetTop;      this.originalLeft = this.element.offsetLeft; -     +      var fontSize = this.element.getStyle('font-size') || '100%';      ['em','px','%','pt'].each( function(fontSizeType) {        if (fontSize.indexOf(fontSizeType)>0) { @@ -430,9 +432,9 @@ Effect.Scale = Class.create(Effect.Base, {          this.fontSizeType = fontSizeType;        }      }.bind(this)); -     +      this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; -     +      this.dims = null;      if (this.options.scaleMode=='box')        this.dims = [this.element.offsetHeight, this.element.offsetWidth]; @@ -507,17 +509,16 @@ Effect.Highlight = Class.create(Effect.Base, {  Effect.ScrollTo = function(element) {    var options = arguments[1] || { }, -    scrollOffsets = document.viewport.getScrollOffsets(), -    elementOffsets = $(element).cumulativeOffset(), -    max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();   +  scrollOffsets = document.viewport.getScrollOffsets(), +  elementOffsets = $(element).cumulativeOffset();    if (options.offset) elementOffsets[1] += options.offset;    return new Effect.Tween(null,      scrollOffsets.top, -    elementOffsets[1] > max ? max : elementOffsets[1], +    elementOffsets[1],      options, -    function(p){ scrollTo(scrollOffsets.left, p.round()) } +    function(p){ scrollTo(scrollOffsets.left, p.round()); }    );  }; @@ -529,9 +530,9 @@ Effect.Fade = function(element) {    var options = Object.extend({      from: element.getOpacity() || 1.0,      to:   0.0, -    afterFinishInternal: function(effect) {  +    afterFinishInternal: function(effect) {        if (effect.options.to!=0) return; -      effect.element.hide().setStyle({opacity: oldOpacity});  +      effect.element.hide().setStyle({opacity: oldOpacity});      }    }, arguments[1] || { });    return new Effect.Opacity(element,options); @@ -547,15 +548,15 @@ Effect.Appear = function(element) {      effect.element.forceRerendering();    },    beforeSetup: function(effect) { -    effect.element.setOpacity(effect.options.from).show();  +    effect.element.setOpacity(effect.options.from).show();    }}, arguments[1] || { });    return new Effect.Opacity(element,options);  };  Effect.Puff = function(element) {    element = $(element); -  var oldStyle = {  -    opacity: element.getInlineOpacity(),  +  var oldStyle = { +    opacity: element.getInlineOpacity(),      position: element.getStyle('position'),      top:  element.style.top,      left: element.style.left, @@ -563,12 +564,12 @@ Effect.Puff = function(element) {      height: element.style.height    };    return new Effect.Parallel( -   [ new Effect.Scale(element, 200,  -      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),  -     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],  -     Object.extend({ duration: 1.0,  +   [ new Effect.Scale(element, 200, +      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), +     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], +     Object.extend({ duration: 1.0,        beforeSetupInternal: function(effect) { -        Position.absolutize(effect.effects[0].element) +        Position.absolutize(effect.effects[0].element);        },        afterFinishInternal: function(effect) {           effect.effects[0].element.hide().setStyle(oldStyle); } @@ -580,12 +581,12 @@ Effect.BlindUp = function(element) {    element = $(element);    element.makeClipping();    return new Effect.Scale(element, 0, -    Object.extend({ scaleContent: false,  -      scaleX: false,  +    Object.extend({ scaleContent: false, +      scaleX: false,        restoreAfterFinish: true,        afterFinishInternal: function(effect) {          effect.element.hide().undoClipping(); -      }  +      }      }, arguments[1] || { })    );  }; @@ -593,15 +594,15 @@ Effect.BlindUp = function(element) {  Effect.BlindDown = function(element) {    element = $(element);    var elementDimensions = element.getDimensions(); -  return new Effect.Scale(element, 100, Object.extend({  -    scaleContent: false,  +  return new Effect.Scale(element, 100, Object.extend({ +    scaleContent: false,      scaleX: false,      scaleFrom: 0,      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},      restoreAfterFinish: true,      afterSetup: function(effect) { -      effect.element.makeClipping().setStyle({height: '0px'}).show();  -    },   +      effect.element.makeClipping().setStyle({height: '0px'}).show(); +    },      afterFinishInternal: function(effect) {        effect.element.undoClipping();      } @@ -616,16 +617,16 @@ Effect.SwitchOff = function(element) {      from: 0,      transition: Effect.Transitions.flicker,      afterFinishInternal: function(effect) { -      new Effect.Scale(effect.element, 1, {  +      new Effect.Scale(effect.element, 1, {          duration: 0.3, scaleFromCenter: true,          scaleX: false, scaleContent: false, restoreAfterFinish: true, -        beforeSetup: function(effect) {  +        beforeSetup: function(effect) {            effect.element.makePositioned().makeClipping();          },          afterFinishInternal: function(effect) {            effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});          } -      }) +      });      }    }, arguments[1] || { }));  }; @@ -637,16 +638,16 @@ Effect.DropOut = function(element) {      left: element.getStyle('left'),      opacity: element.getInlineOpacity() };    return new Effect.Parallel( -    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),  +    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),        new Effect.Opacity(element, { sync: true, to: 0.0 }) ],      Object.extend(        { duration: 0.5,          beforeSetup: function(effect) { -          effect.effects[0].element.makePositioned();  +          effect.effects[0].element.makePositioned();          },          afterFinishInternal: function(effect) {            effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); -        }  +        }        }, arguments[1] || { }));  }; @@ -674,7 +675,7 @@ Effect.Shake = function(element) {      new Effect.Move(effect.element,        { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {          effect.element.undoPositioned().setStyle(oldStyle); -  }}) }}) }}) }}) }}) }}); +  }}); }}); }}); }}); }}); }});  };  Effect.SlideDown = function(element) { @@ -682,9 +683,9 @@ Effect.SlideDown = function(element) {    // SlideDown need to have the content of the element wrapped in a container element with fixed height!    var oldInnerBottom = element.down().getStyle('bottom');    var elementDimensions = element.getDimensions(); -  return new Effect.Scale(element, 100, Object.extend({  -    scaleContent: false,  -    scaleX: false,  +  return new Effect.Scale(element, 100, Object.extend({ +    scaleContent: false, +    scaleX: false,      scaleFrom: window.opera ? 0 : 1,      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},      restoreAfterFinish: true, @@ -692,11 +693,11 @@ Effect.SlideDown = function(element) {        effect.element.makePositioned();        effect.element.down().makePositioned();        if (window.opera) effect.element.setStyle({top: ''}); -      effect.element.makeClipping().setStyle({height: '0px'}).show();  +      effect.element.makeClipping().setStyle({height: '0px'}).show();      },      afterUpdateInternal: function(effect) {        effect.element.down().setStyle({bottom: -        (effect.dims[0] - effect.element.clientHeight) + 'px' });  +        (effect.dims[0] - effect.element.clientHeight) + 'px' });      },      afterFinishInternal: function(effect) {        effect.element.undoClipping().undoPositioned(); @@ -710,8 +711,8 @@ Effect.SlideUp = function(element) {    var oldInnerBottom = element.down().getStyle('bottom');    var elementDimensions = element.getDimensions();    return new Effect.Scale(element, window.opera ? 0 : 1, -   Object.extend({ scaleContent: false,  -    scaleX: false,  +   Object.extend({ scaleContent: false, +    scaleX: false,      scaleMode: 'box',      scaleFrom: 100,      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, @@ -721,7 +722,7 @@ Effect.SlideUp = function(element) {        effect.element.down().makePositioned();        if (window.opera) effect.element.setStyle({top: ''});        effect.element.makeClipping().show(); -    },   +    },      afterUpdateInternal: function(effect) {        effect.element.down().setStyle({bottom:          (effect.dims[0] - effect.element.clientHeight) + 'px' }); @@ -734,15 +735,15 @@ Effect.SlideUp = function(element) {    );  }; -// Bug in opera makes the TD containing this element expand for a instance after finish  +// Bug in opera makes the TD containing this element expand for a instance after finish  Effect.Squish = function(element) { -  return new Effect.Scale(element, window.opera ? 1 : 0, {  +  return new Effect.Scale(element, window.opera ? 1 : 0, {      restoreAfterFinish: true,      beforeSetup: function(effect) { -      effect.element.makeClipping();  -    },   +      effect.element.makeClipping(); +    },      afterFinishInternal: function(effect) { -      effect.element.hide().undoClipping();  +      effect.element.hide().undoClipping();      }    });  }; @@ -762,13 +763,13 @@ Effect.Grow = function(element) {      width: element.style.width,      opacity: element.getInlineOpacity() }; -  var dims = element.getDimensions();     +  var dims = element.getDimensions();    var initialMoveX, initialMoveY;    var moveX, moveY; -   +    switch (options.direction) {      case 'top-left': -      initialMoveX = initialMoveY = moveX = moveY = 0;  +      initialMoveX = initialMoveY = moveX = moveY = 0;        break;      case 'top-right':        initialMoveX = dims.width; @@ -793,11 +794,11 @@ Effect.Grow = function(element) {        moveY = -dims.height / 2;        break;    } -   +    return new Effect.Move(element, {      x: initialMoveX,      y: initialMoveY, -    duration: 0.01,  +    duration: 0.01,      beforeSetup: function(effect) {        effect.element.hide().makeClipping().makePositioned();      }, @@ -806,17 +807,17 @@ Effect.Grow = function(element) {          [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),            new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),            new Effect.Scale(effect.element, 100, { -            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },  +            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },              sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})          ], Object.extend({               beforeSetup: function(effect) { -               effect.effects[0].element.setStyle({height: '0px'}).show();  +               effect.effects[0].element.setStyle({height: '0px'}).show();               },               afterFinishInternal: function(effect) { -               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);  +               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);               }             }, options) -      ) +      );      }    });  }; @@ -838,7 +839,7 @@ Effect.Shrink = function(element) {    var dims = element.getDimensions();    var moveX, moveY; -   +    switch (options.direction) {      case 'top-left':        moveX = moveY = 0; @@ -855,19 +856,19 @@ Effect.Shrink = function(element) {        moveX = dims.width;        moveY = dims.height;        break; -    case 'center':   +    case 'center':        moveX = dims.width / 2;        moveY = dims.height / 2;        break;    } -   +    return new Effect.Parallel(      [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),        new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),        new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) -    ], Object.extend({             +    ], Object.extend({           beforeStartInternal: function(effect) { -           effect.effects[0].element.makePositioned().makeClipping();  +           effect.effects[0].element.makePositioned().makeClipping();           },           afterFinishInternal: function(effect) {             effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } @@ -877,12 +878,14 @@ Effect.Shrink = function(element) {  Effect.Pulsate = function(element) {    element = $(element); -  var options    = arguments[1] || { }; -  var oldOpacity = element.getInlineOpacity(); -  var transition = options.transition || Effect.Transitions.sinoidal; -  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; -  reverser.bind(transition); -  return new Effect.Opacity(element,  +  var options    = arguments[1] || { }, +    oldOpacity = element.getInlineOpacity(), +    transition = options.transition || Effect.Transitions.linear, +    reverser   = function(pos){ +      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); +    }; + +  return new Effect.Opacity(element,      Object.extend(Object.extend({  duration: 2.0, from: 0,        afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }      }, options), {transition: reverser})); @@ -896,12 +899,12 @@ Effect.Fold = function(element) {      width: element.style.width,      height: element.style.height };    element.makeClipping(); -  return new Effect.Scale(element, 5, Object.extend({    +  return new Effect.Scale(element, 5, Object.extend({      scaleContent: false,      scaleX: false,      afterFinishInternal: function(effect) { -    new Effect.Scale(element, 1, {  -      scaleContent: false,  +    new Effect.Scale(element, 1, { +      scaleContent: false,        scaleY: false,        afterFinishInternal: function(effect) {          effect.element.hide().undoClipping().setStyle(oldStyle); @@ -916,7 +919,7 @@ Effect.Morph = Class.create(Effect.Base, {      var options = Object.extend({        style: { }      }, arguments[1] || { }); -     +      if (!Object.isString(options.style)) this.style = $H(options.style);      else {        if (options.style.include(':')) @@ -934,18 +937,18 @@ Effect.Morph = Class.create(Effect.Base, {            effect.transforms.each(function(transform) {              effect.element.style[transform.style] = '';            }); -        } +        };        }      }      this.start(options);    }, -   +    setup: function(){      function parseColor(color){        if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';        color = color.parseColor();        return $R(0,2).map(function(i){ -        return parseInt( color.slice(i*2+1,i*2+3), 16 )  +        return parseInt( color.slice(i*2+1,i*2+3), 16 );        });      }      this.transforms = this.style.map(function(pair){ @@ -965,9 +968,9 @@ Effect.Morph = Class.create(Effect.Base, {        }        var originalValue = this.element.getStyle(property); -      return {  -        style: property.camelize(),  -        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),  +      return { +        style: property.camelize(), +        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),          targetValue: unit=='color' ? parseColor(value) : value,          unit: unit        }; @@ -978,13 +981,13 @@ Effect.Morph = Class.create(Effect.Base, {            transform.unit != 'color' &&            (isNaN(transform.originalValue) || isNaN(transform.targetValue))          ) -      ) +      );      });    },    update: function(position) {      var style = { }, transform, i = this.transforms.length;      while(i--) -      style[(transform = this.transforms[i]).style] =  +      style[(transform = this.transforms[i]).style] =          transform.unit=='color' ? '#'+            (Math.round(transform.originalValue[0]+              (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + @@ -993,7 +996,7 @@ Effect.Morph = Class.create(Effect.Base, {            (Math.round(transform.originalValue[2]+              (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :          (transform.originalValue + -          (transform.targetValue - transform.originalValue) * position).toFixed(3) +  +          (transform.targetValue - transform.originalValue) * position).toFixed(3) +              (transform.unit === null ? '' : transform.unit);      this.element.setStyle(style, true);    } @@ -1030,7 +1033,7 @@ Effect.Transform = Class.create({  });  Element.CSS_PROPERTIES = $w( -  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +  +  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +    'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +    'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +    'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + @@ -1039,7 +1042,7 @@ Element.CSS_PROPERTIES = $w(    'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +    'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +    'right textIndent top width wordSpacing zIndex'); -   +  Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;  String.__parseStyleElement = document.createElement('div'); @@ -1051,11 +1054,11 @@ String.prototype.parseStyle = function(){      String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';      style = String.__parseStyleElement.childNodes[0].style;    } -   +    Element.CSS_PROPERTIES.each(function(property){ -    if (style[property]) styleRules.set(property, style[property]);  +    if (style[property]) styleRules.set(property, style[property]);    }); -   +    if (Prototype.Browser.IE && this.include('opacity'))      styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); @@ -1074,14 +1077,14 @@ if (document.defaultView && document.defaultView.getComputedStyle) {    Element.getStyles = function(element) {      element = $(element);      var css = element.currentStyle, styles; -    styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) { -      hash.set(property, css[property]); -      return hash; +    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { +      results[property] = css[property]; +      return results;      }); -    if (!styles.opacity) styles.set('opacity', element.getOpacity()); +    if (!styles.opacity) styles.opacity = element.getOpacity();      return styles;    }; -}; +}  Effect.Methods = {    morph: function(element, style) { @@ -1090,7 +1093,7 @@ Effect.Methods = {      return element;    },    visualEffect: function(element, effect, options) { -    element = $(element) +    element = $(element);      var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);      new Effect[klass](element, options);      return element; @@ -1104,17 +1107,17 @@ Effect.Methods = {  $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+    'pulsate shake puff squish switchOff dropOut').each( -  function(effect) {  +  function(effect) {      Effect.Methods[effect] = function(element, options){        element = $(element);        Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);        return element; -    } +    };    }  ); -$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(  +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(    function(f) { Effect.Methods[f] = Element[f]; }  ); -Element.addMethods(Effect.Methods); +Element.addMethods(Effect.Methods);
\ No newline at end of file  | 
