[ Index ]
 

Code source de PHPonTrax 2.6.6-svn

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/vendor/trax/action_view/helpers/javascripts/ -> effects.js (source)

   1  // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
   2  // Contributors:
   3  //  Justin Palmer (http://encytemedia.com/)
   4  //  Mark Pilgrim (http://diveintomark.org/)
   5  //  Martin Bialasinki
   6  //  
   7  // See scriptaculous.js for full license.  
   8  
   9  // converts rgb() and #xxx to #xxxxxx format,  
  10  // returns self (or first argument) if not convertable  
  11  String.prototype.parseColor = function() {  
  12    var color = '#';  
  13    if(this.slice(0,4) == 'rgb(') {  
  14      var cols = this.slice(4,this.length-1).split(',');  
  15      var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
  16    } else {  
  17      if(this.slice(0,1) == '#') {  
  18        if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
  19        if(this.length==7) color = this.toLowerCase();  
  20      }  
  21    }  
  22    return(color.length==7 ? color : (arguments[0] || this));  
  23  }
  24  
  25  /*--------------------------------------------------------------------------*/
  26  
  27  Element.collectTextNodes = function(element) {  
  28    return $A($(element).childNodes).collect( function(node) {
  29      return (node.nodeType==3 ? node.nodeValue : 
  30        (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  31    }).flatten().join('');
  32  }
  33  
  34  Element.collectTextNodesIgnoreClass = function(element, className) {  
  35    return $A($(element).childNodes).collect( function(node) {
  36      return (node.nodeType==3 ? node.nodeValue : 
  37        ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
  38          Element.collectTextNodesIgnoreClass(node, className) : ''));
  39    }).flatten().join('');
  40  }
  41  
  42  Element.setContentZoom = function(element, percent) {
  43    element = $(element);  
  44    Element.setStyle(element, {fontSize: (percent/100) + 'em'});   
  45    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
  46  }
  47  
  48  Element.getOpacity = function(element){  
  49    var opacity;
  50    if (opacity = Element.getStyle(element, 'opacity'))  
  51      return parseFloat(opacity);  
  52    if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))  
  53      if(opacity[1]) return parseFloat(opacity[1]) / 100;  
  54    return 1.0;  
  55  }
  56  
  57  Element.setOpacity = function(element, value){  
  58    element= $(element);  
  59    if (value == 1){
  60      Element.setStyle(element, { opacity: 
  61        (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
  62        0.999999 : null });
  63      if(/MSIE/.test(navigator.userAgent))  
  64        Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
  65    } else {  
  66      if(value < 0.00001) value = 0;  
  67      Element.setStyle(element, {opacity: value});
  68      if(/MSIE/.test(navigator.userAgent))  
  69       Element.setStyle(element, 
  70         { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
  71                   'alpha(opacity='+value*100+')' });  
  72    }
  73  }  
  74   
  75  Element.getInlineOpacity = function(element){  
  76    return $(element).style.opacity || '';
  77  }  
  78  
  79  Element.childrenWithClassName = function(element, className, findFirst) {
  80    var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
  81    var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { 
  82      return (c.className && c.className.match(classNameRegExp));
  83    });
  84    if(!results) results = [];
  85    return results;
  86  }
  87  
  88  Element.forceRerendering = function(element) {
  89    try {
  90      element = $(element);
  91      var n = document.createTextNode(' ');
  92      element.appendChild(n);
  93      element.removeChild(n);
  94    } catch(e) { }
  95  };
  96  
  97  /*--------------------------------------------------------------------------*/
  98  
  99  Array.prototype.call = function() {
 100    var args = arguments;
 101    this.each(function(f){ f.apply(this, args) });
 102  }
 103  
 104  /*--------------------------------------------------------------------------*/
 105  
 106  var Effect = {
 107    tagifyText: function(element) {
 108      var tagifyStyle = 'position:relative';
 109      if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
 110      element = $(element);
 111      $A(element.childNodes).each( function(child) {
 112        if(child.nodeType==3) {
 113          child.nodeValue.toArray().each( function(character) {
 114            element.insertBefore(
 115              Builder.node('span',{style: tagifyStyle},
 116                character == ' ' ? String.fromCharCode(160) : character), 
 117                child);
 118          });
 119          Element.remove(child);
 120        }
 121      });
 122    },
 123    multiple: function(element, effect) {
 124      var elements;
 125      if(((typeof element == 'object') || 
 126          (typeof element == 'function')) && 
 127         (element.length))
 128        elements = element;
 129      else
 130        elements = $(element).childNodes;
 131        
 132      var options = Object.extend({
 133        speed: 0.1,
 134        delay: 0.0
 135      }, arguments[2] || {});
 136      var masterDelay = options.delay;
 137  
 138      $A(elements).each( function(element, index) {
 139        new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
 140      });
 141    },
 142    PAIRS: {
 143      'slide':  ['SlideDown','SlideUp'],
 144      'blind':  ['BlindDown','BlindUp'],
 145      'appear': ['Appear','Fade']
 146    },
 147    toggle: function(element, effect) {
 148      element = $(element);
 149      effect = (effect || 'appear').toLowerCase();
 150      var options = Object.extend({
 151        queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
 152      }, arguments[2] || {});
 153      Effect[element.visible() ? 
 154        Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
 155    }
 156  };
 157  
 158  var Effect2 = Effect; // deprecated
 159  
 160  /* ------------- transitions ------------- */
 161  
 162  Effect.Transitions = {}
 163  
 164  Effect.Transitions.linear = function(pos) {
 165    return pos;
 166  }
 167  Effect.Transitions.sinoidal = function(pos) {
 168    return (-Math.cos(pos*Math.PI)/2) + 0.5;
 169  }
 170  Effect.Transitions.reverse  = function(pos) {
 171    return 1-pos;
 172  }
 173  Effect.Transitions.flicker = function(pos) {
 174    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
 175  }
 176  Effect.Transitions.wobble = function(pos) {
 177    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
 178  }
 179  Effect.Transitions.pulse = function(pos) {
 180    return (Math.floor(pos*10) % 2 == 0 ? 
 181      (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
 182  }
 183  Effect.Transitions.none = function(pos) {
 184    return 0;
 185  }
 186  Effect.Transitions.full = function(pos) {
 187    return 1;
 188  }
 189  
 190  /* ------------- core effects ------------- */
 191  
 192  Effect.ScopedQueue = Class.create();
 193  Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
 194    initialize: function() {
 195      this.effects  = [];
 196      this.interval = null;
 197    },
 198    _each: function(iterator) {
 199      this.effects._each(iterator);
 200    },
 201    add: function(effect) {
 202      var timestamp = new Date().getTime();
 203      
 204      var position = (typeof effect.options.queue == 'string') ? 
 205        effect.options.queue : effect.options.queue.position;
 206      
 207      switch(position) {
 208        case 'front':
 209          // move unstarted effects after this effect  
 210          this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
 211              e.startOn  += effect.finishOn;
 212              e.finishOn += effect.finishOn;
 213            });
 214          break;
 215        case 'end':
 216          // start effect after last queued effect has finished
 217          timestamp = this.effects.pluck('finishOn').max() || timestamp;
 218          break;
 219      }
 220      
 221      effect.startOn  += timestamp;
 222      effect.finishOn += timestamp;
 223  
 224      if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
 225        this.effects.push(effect);
 226      
 227      if(!this.interval) 
 228        this.interval = setInterval(this.loop.bind(this), 40);
 229    },
 230    remove: function(effect) {
 231      this.effects = this.effects.reject(function(e) { return e==effect });
 232      if(this.effects.length == 0) {
 233        clearInterval(this.interval);
 234        this.interval = null;
 235      }
 236    },
 237    loop: function() {
 238      var timePos = new Date().getTime();
 239      this.effects.invoke('loop', timePos);
 240    }
 241  });
 242  
 243  Effect.Queues = {
 244    instances: $H(),
 245    get: function(queueName) {
 246      if(typeof queueName != 'string') return queueName;
 247      
 248      if(!this.instances[queueName])
 249        this.instances[queueName] = new Effect.ScopedQueue();
 250        
 251      return this.instances[queueName];
 252    }
 253  }
 254  Effect.Queue = Effect.Queues.get('global');
 255  
 256  Effect.DefaultOptions = {
 257    transition: Effect.Transitions.sinoidal,
 258    duration:   1.0,   // seconds
 259    fps:        25.0,  // max. 25fps due to Effect.Queue implementation
 260    sync:       false, // true for combining
 261    from:       0.0,
 262    to:         1.0,
 263    delay:      0.0,
 264    queue:      'parallel'
 265  }
 266  
 267  Effect.Base = function() {};
 268  Effect.Base.prototype = {
 269    position: null,
 270    start: function(options) {
 271      this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
 272      this.currentFrame = 0;
 273      this.state        = 'idle';
 274      this.startOn      = this.options.delay*1000;
 275      this.finishOn     = this.startOn + (this.options.duration*1000);
 276      this.event('beforeStart');
 277      if(!this.options.sync)
 278        Effect.Queues.get(typeof this.options.queue == 'string' ? 
 279          'global' : this.options.queue.scope).add(this);
 280    },
 281    loop: function(timePos) {
 282      if(timePos >= this.startOn) {
 283        if(timePos >= this.finishOn) {
 284          this.render(1.0);
 285          this.cancel();
 286          this.event('beforeFinish');
 287          if(this.finish) this.finish(); 
 288          this.event('afterFinish');
 289          return;  
 290        }
 291        var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
 292        var frame = Math.round(pos * this.options.fps * this.options.duration);
 293        if(frame > this.currentFrame) {
 294          this.render(pos);
 295          this.currentFrame = frame;
 296        }
 297      }
 298    },
 299    render: function(pos) {
 300      if(this.state == 'idle') {
 301        this.state = 'running';
 302        this.event('beforeSetup');
 303        if(this.setup) this.setup();
 304        this.event('afterSetup');
 305      }
 306      if(this.state == 'running') {
 307        if(this.options.transition) pos = this.options.transition(pos);
 308        pos *= (this.options.to-this.options.from);
 309        pos += this.options.from;
 310        this.position = pos;
 311        this.event('beforeUpdate');
 312        if(this.update) this.update(pos);
 313        this.event('afterUpdate');
 314      }
 315    },
 316    cancel: function() {
 317      if(!this.options.sync)
 318        Effect.Queues.get(typeof this.options.queue == 'string' ? 
 319          'global' : this.options.queue.scope).remove(this);
 320      this.state = 'finished';
 321    },
 322    event: function(eventName) {
 323      if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
 324      if(this.options[eventName]) this.options[eventName](this);
 325    },
 326    inspect: function() {
 327      return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
 328    }
 329  }
 330  
 331  Effect.Parallel = Class.create();
 332  Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
 333    initialize: function(effects) {
 334      this.effects = effects || [];
 335      this.start(arguments[1]);
 336    },
 337    update: function(position) {
 338      this.effects.invoke('render', position);
 339    },
 340    finish: function(position) {
 341      this.effects.each( function(effect) {
 342        effect.render(1.0);
 343        effect.cancel();
 344        effect.event('beforeFinish');
 345        if(effect.finish) effect.finish(position);
 346        effect.event('afterFinish');
 347      });
 348    }
 349  });
 350  
 351  Effect.Opacity = Class.create();
 352  Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
 353    initialize: function(element) {
 354      this.element = $(element);
 355      // make this work on IE on elements without 'layout'
 356      if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
 357        this.element.setStyle({zoom: 1});
 358      var options = Object.extend({
 359        from: this.element.getOpacity() || 0.0,
 360        to:   1.0
 361      }, arguments[1] || {});
 362      this.start(options);
 363    },
 364    update: function(position) {
 365      this.element.setOpacity(position);
 366    }
 367  });
 368  
 369  Effect.Move = Class.create();
 370  Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
 371    initialize: function(element) {
 372      this.element = $(element);
 373      var options = Object.extend({
 374        x:    0,
 375        y:    0,
 376        mode: 'relative'
 377      }, arguments[1] || {});
 378      this.start(options);
 379    },
 380    setup: function() {
 381      // Bug in Opera: Opera returns the "real" position of a static element or
 382      // relative element that does not have top/left explicitly set.
 383      // ==> Always set top and left for position relative elements in your stylesheets 
 384      // (to 0 if you do not need them) 
 385      this.element.makePositioned();
 386      this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
 387      this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
 388      if(this.options.mode == 'absolute') {
 389        // absolute movement, so we need to calc deltaX and deltaY
 390        this.options.x = this.options.x - this.originalLeft;
 391        this.options.y = this.options.y - this.originalTop;
 392      }
 393    },
 394    update: function(position) {
 395      this.element.setStyle({
 396        left: this.options.x  * position + this.originalLeft + 'px',
 397        top:  this.options.y  * position + this.originalTop  + 'px'
 398      });
 399    }
 400  });
 401  
 402  // for backwards compatibility
 403  Effect.MoveBy = function(element, toTop, toLeft) {
 404    return new Effect.Move(element, 
 405      Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
 406  };
 407  
 408  Effect.Scale = Class.create();
 409  Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
 410    initialize: function(element, percent) {
 411      this.element = $(element)
 412      var options = Object.extend({
 413        scaleX: true,
 414        scaleY: true,
 415        scaleContent: true,
 416        scaleFromCenter: false,
 417        scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
 418        scaleFrom: 100.0,
 419        scaleTo:   percent
 420      }, arguments[2] || {});
 421      this.start(options);
 422    },
 423    setup: function() {
 424      this.restoreAfterFinish = this.options.restoreAfterFinish || false;
 425      this.elementPositioning = this.element.getStyle('position');
 426      
 427      this.originalStyle = {};
 428      ['top','left','width','height','fontSize'].each( function(k) {
 429        this.originalStyle[k] = this.element.style[k];
 430      }.bind(this));
 431        
 432      this.originalTop  = this.element.offsetTop;
 433      this.originalLeft = this.element.offsetLeft;
 434      
 435      var fontSize = this.element.getStyle('font-size') || '100%';
 436      ['em','px','%'].each( function(fontSizeType) {
 437        if(fontSize.indexOf(fontSizeType)>0) {
 438          this.fontSize     = parseFloat(fontSize);
 439          this.fontSizeType = fontSizeType;
 440        }
 441      }.bind(this));
 442      
 443      this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
 444      
 445      this.dims = null;
 446      if(this.options.scaleMode=='box')
 447        this.dims = [this.element.offsetHeight, this.element.offsetWidth];
 448      if(/^content/.test(this.options.scaleMode))
 449        this.dims = [this.element.scrollHeight, this.element.scrollWidth];
 450      if(!this.dims)
 451        this.dims = [this.options.scaleMode.originalHeight,
 452                     this.options.scaleMode.originalWidth];
 453    },
 454    update: function(position) {
 455      var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
 456      if(this.options.scaleContent && this.fontSize)
 457        this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
 458      this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
 459    },
 460    finish: function(position) {
 461      if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
 462    },
 463    setDimensions: function(height, width) {
 464      var d = {};
 465      if(this.options.scaleX) d.width = width + 'px';
 466      if(this.options.scaleY) d.height = height + 'px';
 467      if(this.options.scaleFromCenter) {
 468        var topd  = (height - this.dims[0])/2;
 469        var leftd = (width  - this.dims[1])/2;
 470        if(this.elementPositioning == 'absolute') {
 471          if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
 472          if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
 473        } else {
 474          if(this.options.scaleY) d.top = -topd + 'px';
 475          if(this.options.scaleX) d.left = -leftd + 'px';
 476        }
 477      }
 478      this.element.setStyle(d);
 479    }
 480  });
 481  
 482  Effect.Highlight = Class.create();
 483  Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
 484    initialize: function(element) {
 485      this.element = $(element);
 486      var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
 487      this.start(options);
 488    },
 489    setup: function() {
 490      // Prevent executing on elements not in the layout flow
 491      if(this.element.getStyle('display')=='none') { this.cancel(); return; }
 492      // Disable background image during the effect
 493      this.oldStyle = {
 494        backgroundImage: this.element.getStyle('background-image') };
 495      this.element.setStyle({backgroundImage: 'none'});
 496      if(!this.options.endcolor)
 497        this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
 498      if(!this.options.restorecolor)
 499        this.options.restorecolor = this.element.getStyle('background-color');
 500      // init color calculations
 501      this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
 502      this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
 503    },
 504    update: function(position) {
 505      this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
 506        return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
 507    },
 508    finish: function() {
 509      this.element.setStyle(Object.extend(this.oldStyle, {
 510        backgroundColor: this.options.restorecolor
 511      }));
 512    }
 513  });
 514  
 515  Effect.ScrollTo = Class.create();
 516  Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
 517    initialize: function(element) {
 518      this.element = $(element);
 519      this.start(arguments[1] || {});
 520    },
 521    setup: function() {
 522      Position.prepare();
 523      var offsets = Position.cumulativeOffset(this.element);
 524      if(this.options.offset) offsets[1] += this.options.offset;
 525      var max = window.innerHeight ? 
 526        window.height - window.innerHeight :
 527        document.body.scrollHeight - 
 528          (document.documentElement.clientHeight ? 
 529            document.documentElement.clientHeight : document.body.clientHeight);
 530      this.scrollStart = Position.deltaY;
 531      this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
 532    },
 533    update: function(position) {
 534      Position.prepare();
 535      window.scrollTo(Position.deltaX, 
 536        this.scrollStart + (position*this.delta));
 537    }
 538  });
 539  
 540  /* ------------- combination effects ------------- */
 541  
 542  Effect.Fade = function(element) {
 543    element = $(element);
 544    var oldOpacity = element.getInlineOpacity();
 545    var options = Object.extend({
 546    from: element.getOpacity() || 1.0,
 547    to:   0.0,
 548    afterFinishInternal: function(effect) { 
 549      if(effect.options.to!=0) return;
 550      effect.element.hide();
 551      effect.element.setStyle({opacity: oldOpacity}); 
 552    }}, arguments[1] || {});
 553    return new Effect.Opacity(element,options);
 554  }
 555  
 556  Effect.Appear = function(element) {
 557    element = $(element);
 558    var options = Object.extend({
 559    from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
 560    to:   1.0,
 561    // force Safari to render floated elements properly
 562    afterFinishInternal: function(effect) {
 563      effect.element.forceRerendering();
 564    },
 565    beforeSetup: function(effect) {
 566      effect.element.setOpacity(effect.options.from);
 567      effect.element.show(); 
 568    }}, arguments[1] || {});
 569    return new Effect.Opacity(element,options);
 570  }
 571  
 572  Effect.Puff = function(element) {
 573    element = $(element);
 574    var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') };
 575    return new Effect.Parallel(
 576     [ new Effect.Scale(element, 200, 
 577        { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
 578       new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
 579       Object.extend({ duration: 1.0, 
 580        beforeSetupInternal: function(effect) {
 581          effect.effects[0].element.setStyle({position: 'absolute'}); },
 582        afterFinishInternal: function(effect) {
 583           effect.effects[0].element.hide();
 584           effect.effects[0].element.setStyle(oldStyle); }
 585       }, arguments[1] || {})
 586     );
 587  }
 588  
 589  Effect.BlindUp = function(element) {
 590    element = $(element);
 591    element.makeClipping();
 592    return new Effect.Scale(element, 0, 
 593      Object.extend({ scaleContent: false, 
 594        scaleX: false, 
 595        restoreAfterFinish: true,
 596        afterFinishInternal: function(effect) {
 597          effect.element.hide();
 598          effect.element.undoClipping();
 599        } 
 600      }, arguments[1] || {})
 601    );
 602  }
 603  
 604  Effect.BlindDown = function(element) {
 605    element = $(element);
 606    var elementDimensions = element.getDimensions();
 607    return new Effect.Scale(element, 100, 
 608      Object.extend({ scaleContent: false, 
 609        scaleX: false,
 610        scaleFrom: 0,
 611        scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
 612        restoreAfterFinish: true,
 613        afterSetup: function(effect) {
 614          effect.element.makeClipping();
 615          effect.element.setStyle({height: '0px'});
 616          effect.element.show(); 
 617        },  
 618        afterFinishInternal: function(effect) {
 619          effect.element.undoClipping();
 620        }
 621      }, arguments[1] || {})
 622    );
 623  }
 624  
 625  Effect.SwitchOff = function(element) {
 626    element = $(element);
 627    var oldOpacity = element.getInlineOpacity();
 628    return new Effect.Appear(element, { 
 629      duration: 0.4,
 630      from: 0,
 631      transition: Effect.Transitions.flicker,
 632      afterFinishInternal: function(effect) {
 633        new Effect.Scale(effect.element, 1, { 
 634          duration: 0.3, scaleFromCenter: true,
 635          scaleX: false, scaleContent: false, restoreAfterFinish: true,
 636          beforeSetup: function(effect) { 
 637            effect.element.makePositioned();
 638            effect.element.makeClipping();
 639          },
 640          afterFinishInternal: function(effect) {
 641            effect.element.hide();
 642            effect.element.undoClipping();
 643            effect.element.undoPositioned();
 644            effect.element.setStyle({opacity: oldOpacity});
 645          }
 646        })
 647      }
 648    });
 649  }
 650  
 651  Effect.DropOut = function(element) {
 652    element = $(element);
 653    var oldStyle = {
 654      top: element.getStyle('top'),
 655      left: element.getStyle('left'),
 656      opacity: element.getInlineOpacity() };
 657    return new Effect.Parallel(
 658      [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
 659        new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
 660      Object.extend(
 661        { duration: 0.5,
 662          beforeSetup: function(effect) {
 663            effect.effects[0].element.makePositioned(); 
 664          },
 665          afterFinishInternal: function(effect) {
 666            effect.effects[0].element.hide();
 667            effect.effects[0].element.undoPositioned();
 668            effect.effects[0].element.setStyle(oldStyle);
 669          } 
 670        }, arguments[1] || {}));
 671  }
 672  
 673  Effect.Shake = function(element) {
 674    element = $(element);
 675    var oldStyle = {
 676      top: element.getStyle('top'),
 677      left: element.getStyle('left') };
 678      return new Effect.Move(element, 
 679        { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
 680      new Effect.Move(effect.element,
 681        { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
 682      new Effect.Move(effect.element,
 683        { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
 684      new Effect.Move(effect.element,
 685        { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
 686      new Effect.Move(effect.element,
 687        { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
 688      new Effect.Move(effect.element,
 689        { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
 690          effect.element.undoPositioned();
 691          effect.element.setStyle(oldStyle);
 692    }}) }}) }}) }}) }}) }});
 693  }
 694  
 695  Effect.SlideDown = function(element) {
 696    element = $(element);
 697    element.cleanWhitespace();
 698    // SlideDown need to have the content of the element wrapped in a container element with fixed height!
 699    var oldInnerBottom = $(element.firstChild).getStyle('bottom');
 700    var elementDimensions = element.getDimensions();
 701    return new Effect.Scale(element, 100, Object.extend({ 
 702      scaleContent: false, 
 703      scaleX: false, 
 704      scaleFrom: window.opera ? 0 : 1,
 705      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
 706      restoreAfterFinish: true,
 707      afterSetup: function(effect) {
 708        effect.element.makePositioned();
 709        effect.element.firstChild.makePositioned();
 710        if(window.opera) effect.element.setStyle({top: ''});
 711        effect.element.makeClipping();
 712        effect.element.setStyle({height: '0px'});
 713        effect.element.show(); },
 714      afterUpdateInternal: function(effect) {
 715        effect.element.firstChild.setStyle({bottom:
 716          (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
 717      },
 718      afterFinishInternal: function(effect) {
 719        effect.element.undoClipping(); 
 720        // IE will crash if child is undoPositioned first
 721        if(/MSIE/.test(navigator.userAgent)){
 722          effect.element.undoPositioned();
 723          effect.element.firstChild.undoPositioned();
 724        }else{
 725          effect.element.firstChild.undoPositioned();
 726          effect.element.undoPositioned();
 727        }
 728        effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
 729      }, arguments[1] || {})
 730    );
 731  }
 732    
 733  Effect.SlideUp = function(element) {
 734    element = $(element);
 735    element.cleanWhitespace();
 736    var oldInnerBottom = $(element.firstChild).getStyle('bottom');
 737    return new Effect.Scale(element, window.opera ? 0 : 1,
 738     Object.extend({ scaleContent: false, 
 739      scaleX: false, 
 740      scaleMode: 'box',
 741      scaleFrom: 100,
 742      restoreAfterFinish: true,
 743      beforeStartInternal: function(effect) {
 744        effect.element.makePositioned();
 745        effect.element.firstChild.makePositioned();
 746        if(window.opera) effect.element.setStyle({top: ''});
 747        effect.element.makeClipping();
 748        effect.element.show(); },  
 749      afterUpdateInternal: function(effect) {
 750        effect.element.firstChild.setStyle({bottom:
 751          (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
 752      afterFinishInternal: function(effect) {
 753        effect.element.hide();
 754        effect.element.undoClipping();
 755        effect.element.firstChild.undoPositioned();
 756        effect.element.undoPositioned();
 757        effect.element.setStyle({bottom: oldInnerBottom}); }
 758     }, arguments[1] || {})
 759    );
 760  }
 761  
 762  // Bug in opera makes the TD containing this element expand for a instance after finish 
 763  Effect.Squish = function(element) {
 764    return new Effect.Scale(element, window.opera ? 1 : 0, 
 765      { restoreAfterFinish: true,
 766        beforeSetup: function(effect) {
 767          effect.element.makeClipping(effect.element); },  
 768        afterFinishInternal: function(effect) {
 769          effect.element.hide(effect.element); 
 770          effect.element.undoClipping(effect.element); }
 771    });
 772  }
 773  
 774  Effect.Grow = function(element) {
 775    element = $(element);
 776    var options = Object.extend({
 777      direction: 'center',
 778      moveTransition: Effect.Transitions.sinoidal,
 779      scaleTransition: Effect.Transitions.sinoidal,
 780      opacityTransition: Effect.Transitions.full
 781    }, arguments[1] || {});
 782    var oldStyle = {
 783      top: element.style.top,
 784      left: element.style.left,
 785      height: element.style.height,
 786      width: element.style.width,
 787      opacity: element.getInlineOpacity() };
 788  
 789    var dims = element.getDimensions();    
 790    var initialMoveX, initialMoveY;
 791    var moveX, moveY;
 792    
 793    switch (options.direction) {
 794      case 'top-left':
 795        initialMoveX = initialMoveY = moveX = moveY = 0; 
 796        break;
 797      case 'top-right':
 798        initialMoveX = dims.width;
 799        initialMoveY = moveY = 0;
 800        moveX = -dims.width;
 801        break;
 802      case 'bottom-left':
 803        initialMoveX = moveX = 0;
 804        initialMoveY = dims.height;
 805        moveY = -dims.height;
 806        break;
 807      case 'bottom-right':
 808        initialMoveX = dims.width;
 809        initialMoveY = dims.height;
 810        moveX = -dims.width;
 811        moveY = -dims.height;
 812        break;
 813      case 'center':
 814        initialMoveX = dims.width / 2;
 815        initialMoveY = dims.height / 2;
 816        moveX = -dims.width / 2;
 817        moveY = -dims.height / 2;
 818        break;
 819    }
 820    
 821    return new Effect.Move(element, {
 822      x: initialMoveX,
 823      y: initialMoveY,
 824      duration: 0.01, 
 825      beforeSetup: function(effect) {
 826        effect.element.hide();
 827        effect.element.makeClipping();
 828        effect.element.makePositioned();
 829      },
 830      afterFinishInternal: function(effect) {
 831        new Effect.Parallel(
 832          [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
 833            new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
 834            new Effect.Scale(effect.element, 100, {
 835              scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
 836              sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
 837          ], Object.extend({
 838               beforeSetup: function(effect) {
 839                 effect.effects[0].element.setStyle({height: '0px'});
 840                 effect.effects[0].element.show(); 
 841               },
 842               afterFinishInternal: function(effect) {
 843                 effect.effects[0].element.undoClipping();
 844                 effect.effects[0].element.undoPositioned();
 845                 effect.effects[0].element.setStyle(oldStyle); 
 846               }
 847             }, options)
 848        )
 849      }
 850    });
 851  }
 852  
 853  Effect.Shrink = function(element) {
 854    element = $(element);
 855    var options = Object.extend({
 856      direction: 'center',
 857      moveTransition: Effect.Transitions.sinoidal,
 858      scaleTransition: Effect.Transitions.sinoidal,
 859      opacityTransition: Effect.Transitions.none
 860    }, arguments[1] || {});
 861    var oldStyle = {
 862      top: element.style.top,
 863      left: element.style.left,
 864      height: element.style.height,
 865      width: element.style.width,
 866      opacity: element.getInlineOpacity() };
 867  
 868    var dims = element.getDimensions();
 869    var moveX, moveY;
 870    
 871    switch (options.direction) {
 872      case 'top-left':
 873        moveX = moveY = 0;
 874        break;
 875      case 'top-right':
 876        moveX = dims.width;
 877        moveY = 0;
 878        break;
 879      case 'bottom-left':
 880        moveX = 0;
 881        moveY = dims.height;
 882        break;
 883      case 'bottom-right':
 884        moveX = dims.width;
 885        moveY = dims.height;
 886        break;
 887      case 'center':  
 888        moveX = dims.width / 2;
 889        moveY = dims.height / 2;
 890        break;
 891    }
 892    
 893    return new Effect.Parallel(
 894      [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
 895        new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
 896        new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
 897      ], Object.extend({            
 898           beforeStartInternal: function(effect) {
 899             effect.effects[0].element.makePositioned();
 900             effect.effects[0].element.makeClipping(); },
 901           afterFinishInternal: function(effect) {
 902             effect.effects[0].element.hide();
 903             effect.effects[0].element.undoClipping();
 904             effect.effects[0].element.undoPositioned();
 905             effect.effects[0].element.setStyle(oldStyle); }
 906         }, options)
 907    );
 908  }
 909  
 910  Effect.Pulsate = function(element) {
 911    element = $(element);
 912    var options    = arguments[1] || {};
 913    var oldOpacity = element.getInlineOpacity();
 914    var transition = options.transition || Effect.Transitions.sinoidal;
 915    var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
 916    reverser.bind(transition);
 917    return new Effect.Opacity(element, 
 918      Object.extend(Object.extend({  duration: 3.0, from: 0,
 919        afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
 920      }, options), {transition: reverser}));
 921  }
 922  
 923  Effect.Fold = function(element) {
 924    element = $(element);
 925    var oldStyle = {
 926      top: element.style.top,
 927      left: element.style.left,
 928      width: element.style.width,
 929      height: element.style.height };
 930    Element.makeClipping(element);
 931    return new Effect.Scale(element, 5, Object.extend({   
 932      scaleContent: false,
 933      scaleX: false,
 934      afterFinishInternal: function(effect) {
 935      new Effect.Scale(element, 1, { 
 936        scaleContent: false, 
 937        scaleY: false,
 938        afterFinishInternal: function(effect) {
 939          effect.element.hide();
 940          effect.element.undoClipping(); 
 941          effect.element.setStyle(oldStyle);
 942        } });
 943    }}, arguments[1] || {}));
 944  };
 945  
 946  ['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 947   'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each( 
 948    function(f) { Element.Methods[f] = Element[f]; }
 949  );
 950  
 951  Element.Methods.visualEffect = function(element, effect, options) {
 952    s = effect.gsub(/_/, '-').camelize();
 953    effect_class = s.charAt(0).toUpperCase() + s.substring(1);
 954    new Effect[effect_class](element, options);
 955    return $(element);
 956  };
 957  
 958  Element.addMethods();


Généré le : Sun Feb 25 20:04:38 2007 par Balluche grâce à PHPXref 0.7