Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 4043

Show
Ignore:
Timestamp:
03/26/06 08:37:19 (3 years ago)
Author:
madrobby
Message:

Update to script.aculo.us 1.6

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/CHANGELOG

    r4024 r4043  
    11*SVN* 
     2 
     3* Update to script.aculo.us 1.6 [Thomas Fuchs] 
    24 
    35* Enable application/x-yaml processing by default [Jamis Buck] 
  • trunk/actionpack/lib/action_view/helpers/javascripts/dragdrop.js

    r3801 r4043  
    213213    if(!this.handle) this.handle = this.element; 
    214214     
    215     if(options.scroll) options.scroll = $(options.scroll); 
     215    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) 
     216      options.scroll = $(options.scroll); 
    216217 
    217218    Element.makePositioned(this.element); // fix IE     
     
    278279     
    279280    if(this.options.scroll) { 
    280       this.originalScrollLeft = this.options.scroll.scrollLeft; 
    281       this.originalScrollTop = this.options.scroll.scrollTop; 
     281      if (this.options.scroll == window) { 
     282        var where = this._getWindowScroll(this.options.scroll); 
     283        this.originalScrollLeft = where.left; 
     284        this.originalScrollTop = where.top; 
     285      } else { 
     286        this.originalScrollLeft = this.options.scroll.scrollLeft; 
     287        this.originalScrollTop = this.options.scroll.scrollTop; 
     288      } 
    282289    } 
    283290     
     
    295302     
    296303    if(this.options.scroll) { 
    297       //if(this.scrollInterval) this.scroll(); 
    298304      this.stopScrolling(); 
    299       var p = Position.page(this.options.scroll); 
    300       p[0] += this.options.scroll.scrollLeft; 
    301       p[1] += this.options.scroll.scrollTop; 
    302       p.push(p[0]+this.options.scroll.offsetWidth); 
    303       p.push(p[1]+this.options.scroll.offsetHeight); 
     305       
     306      var p; 
     307      if (this.options.scroll == window) { 
     308        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } 
     309      } else { 
     310        p = Position.page(this.options.scroll); 
     311        p[0] += this.options.scroll.scrollLeft; 
     312        p[1] += this.options.scroll.scrollTop; 
     313        p.push(p[0]+this.options.scroll.offsetWidth); 
     314        p.push(p[1]+this.options.scroll.offsetHeight); 
     315      } 
    304316      var speed = [0,0]; 
    305317      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); 
     
    367379    pos[0] -= d[0]; pos[1] -= d[1]; 
    368380     
    369     if(this.options.scroll) { 
     381    if(this.options.scroll && (this.options.scroll != window)) { 
    370382      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 
    371383      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; 
     
    414426    var delta = current - this.lastScrolled; 
    415427    this.lastScrolled = current; 
    416     this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 
    417     this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; 
     428    if(this.options.scroll == window) { 
     429      with (this._getWindowScroll(this.options.scroll)) { 
     430        if (this.scrollSpeed[0] || this.scrollSpeed[1]) { 
     431          var d = delta / 1000; 
     432          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); 
     433        } 
     434      } 
     435    } else { 
     436      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 
     437      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; 
     438    } 
    418439     
    419440    Position.prepare(); 
     
    423444     
    424445    if(this.options.change) this.options.change(this); 
     446  }, 
     447   
     448  _getWindowScroll: function(w) { 
     449    var T, L, W, H; 
     450    with (w.document) { 
     451      if (w.document.documentElement && documentElement.scrollTop) { 
     452        T = documentElement.scrollTop; 
     453        L = documentElement.scrollLeft; 
     454      } else if (w.document.body) { 
     455        T = body.scrollTop; 
     456        L = body.scrollLeft; 
     457      } 
     458      if (w.innerWidth) { 
     459        W = w.innerWidth; 
     460        H = w.innerHeight; 
     461      } else if (w.document.documentElement && documentElement.clientWidth) { 
     462        W = documentElement.clientWidth; 
     463        H = documentElement.clientHeight; 
     464      } else { 
     465        W = body.offsetWidth; 
     466        H = body.offsetHeight 
     467      } 
     468    } 
     469    return { top: T, left: L, width: W, height: H }; 
    425470  } 
    426471} 
     
    480525      ghosting:    false, 
    481526      scroll:      false, 
     527      scrollSensitivity: 20, 
     528      scrollSpeed: 15, 
    482529      format:      /^[^_]*_(.*)$/, 
    483530      onChange:    Prototype.emptyFunction, 
     
    492539      revert:      true, 
    493540      scroll:      options.scroll, 
     541      scrollSpeed: options.scrollSpeed, 
     542      scrollSensitivity: options.scrollSensitivity, 
    494543      ghosting:    options.ghosting, 
    495544      constraint:  options.constraint, 
  • trunk/actionpack/lib/action_view/helpers/javascripts/effects.js

    r3824 r4043  
    77// See scriptaculous.js for full license.   
    88 
    9 /* ------------- element ext -------------- */   
    10   
    119// converts rgb() and #xxx to #xxxxxx format,   
    1210// returns self (or first argument) if not convertable   
     
    2523} 
    2624 
     25/*--------------------------------------------------------------------------*/ 
     26 
    2727Element.collectTextNodes = function(element) {   
    2828  return $A($(element).childNodes).collect( function(node) { 
     
    4040} 
    4141 
    42 Element.setStyle = function(element, style) { 
    43   element = $(element); 
    44   for(k in style) element.style[k.camelize()] = style[k]; 
    45 
    46  
    47 Element.setContentZoom = function(element, percent) {   
     42Element.setContentZoom = function(element, percent) { 
     43  element = $(element);   
    4844  Element.setStyle(element, {fontSize: (percent/100) + 'em'});    
    49   if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);   
     45  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); 
    5046} 
    5147 
     
    7470       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 
    7571                 'alpha(opacity='+value*100+')' });   
    76   }    
     72  } 
    7773 
    7874  
     
    9288    element.appendChild(n); 
    9389    element.removeChild(n); 
    94   } catch(e) {} 
    95 
     90  } catch(e) { } 
     91}; 
     92 
     93['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', 
     94 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(  
     95  function(f) { Element.Methods[f] = Element[f]; }  
     96); 
     97 
     98/*--------------------------------------------------------------------------*/ 
    9699 
    97100Array.prototype.call = function() { 
     
    149152      queue: { position:'end', scope:(element.id || 'global'), limit: 1 } 
    150153    }, arguments[2] || {}); 
    151     Effect[Element.visible(element) ?  
     154    Effect[element.visible() ?  
    152155      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); 
    153156  } 
     
    353356    // make this work on IE on elements without 'layout' 
    354357    if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) 
    355       Element.setStyle(this.element, {zoom: 1}); 
     358      this.element.setStyle({zoom: 1}); 
    356359    var options = Object.extend({ 
    357       from: Element.getOpacity(this.element) || 0.0, 
     360      from: this.element.getOpacity() || 0.0, 
    358361      to:   1.0 
    359362    }, arguments[1] || {}); 
     
    361364  }, 
    362365  update: function(position) { 
    363     Element.setOpacity(this.element, position); 
     366    this.element.setOpacity(position); 
    364367  } 
    365368}); 
     
    381384    // ==> Always set top and left for position relative elements in your stylesheets  
    382385    // (to 0 if you do not need them)  
    383     Element.makePositioned(this.element); 
    384     this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0'); 
    385     this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0'); 
     386    this.element.makePositioned(); 
     387    this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); 
     388    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0'); 
    386389    if(this.options.mode == 'absolute') { 
    387390      // absolute movement, so we need to calc deltaX and deltaY 
     
    391394  }, 
    392395  update: function(position) { 
    393     Element.setStyle(this.element,
     396    this.element.setStyle(
    394397      left: this.options.x  * position + this.originalLeft + 'px', 
    395398      top:  this.options.y  * position + this.originalTop  + 'px' 
     
    421424  setup: function() { 
    422425    this.restoreAfterFinish = this.options.restoreAfterFinish || false; 
    423     this.elementPositioning = Element.getStyle(this.element,'position'); 
     426    this.elementPositioning = this.element.getStyle('position'); 
    424427     
    425428    this.originalStyle = {}; 
     
    431434    this.originalLeft = this.element.offsetLeft; 
    432435     
    433     var fontSize = Element.getStyle(this.element,'font-size') || '100%'; 
     436    var fontSize = this.element.getStyle('font-size') || '100%'; 
    434437    ['em','px','%'].each( function(fontSizeType) { 
    435438      if(fontSize.indexOf(fontSizeType)>0) { 
     
    453456    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); 
    454457    if(this.options.scaleContent && this.fontSize) 
    455       Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType }); 
     458      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); 
    456459    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); 
    457460  }, 
    458461  finish: function(position) { 
    459     if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle); 
     462    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); 
    460463  }, 
    461464  setDimensions: function(height, width) { 
     
    474477      } 
    475478    } 
    476     Element.setStyle(this.element, d); 
     479    this.element.setStyle(d); 
    477480  } 
    478481}); 
     
    487490  setup: function() { 
    488491    // Prevent executing on elements not in the layout flow 
    489     if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; } 
     492    if(this.element.getStyle('display')=='none') { this.cancel(); return; } 
    490493    // Disable background image during the effect 
    491494    this.oldStyle = { 
    492       backgroundImage: Element.getStyle(this.element, 'background-image') }; 
    493     Element.setStyle(this.element, {backgroundImage: 'none'}); 
     495      backgroundImage: this.element.getStyle('background-image') }; 
     496    this.element.setStyle({backgroundImage: 'none'}); 
    494497    if(!this.options.endcolor) 
    495       this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff'); 
     498      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); 
    496499    if(!this.options.restorecolor) 
    497       this.options.restorecolor = Element.getStyle(this.element, 'background-color'); 
     500      this.options.restorecolor = this.element.getStyle('background-color'); 
    498501    // init color calculations 
    499502    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); 
     
    501504  }, 
    502505  update: function(position) { 
    503     Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){ 
     506    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ 
    504507      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); 
    505508  }, 
    506509  finish: function() { 
    507     Element.setStyle(this.element, Object.extend(this.oldStyle, { 
     510    this.element.setStyle(Object.extend(this.oldStyle, { 
    508511      backgroundColor: this.options.restorecolor 
    509512    })); 
     
    539542 
    540543Effect.Fade = function(element) { 
    541   var oldOpacity = Element.getInlineOpacity(element); 
     544  element = $(element); 
     545  var oldOpacity = element.getInlineOpacity(); 
    542546  var options = Object.extend({ 
    543   from: Element.getOpacity(element) || 1.0, 
     547  from: element.getOpacity() || 1.0, 
    544548  to:   0.0, 
    545   afterFinishInternal: function(effect) { with(Element) {  
     549  afterFinishInternal: function(effect) {  
    546550    if(effect.options.to!=0) return; 
    547     hide(effect.element); 
    548     setStyle(effect.element, {opacity: oldOpacity}); }} 
    549   }, arguments[1] || {}); 
     551    effect.element.hide(); 
     552    effect.element.setStyle({opacity: oldOpacity});  
     553  }}, arguments[1] || {}); 
    550554  return new Effect.Opacity(element,options); 
    551555} 
    552556 
    553557Effect.Appear = function(element) { 
     558  element = $(element); 
    554559  var options = Object.extend({ 
    555   from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0), 
     560  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), 
    556561  to:   1.0, 
    557562  // force Safari to render floated elements properly 
    558563  afterFinishInternal: function(effect) { 
    559     Element.forceRerendering(effect.element); 
    560   }, 
    561   beforeSetup: function(effect) { with(Element) { 
    562     setOpacity(effect.element, effect.options.from); 
    563     show(effect.element); }} 
    564   }, arguments[1] || {}); 
     564    effect.element.forceRerendering(); 
     565  }, 
     566  beforeSetup: function(effect) { 
     567    effect.element.setOpacity(effect.options.from); 
     568    effect.element.show();  
     569  }}, arguments[1] || {}); 
    565570  return new Effect.Opacity(element,options); 
    566571} 
     
    568573Effect.Puff = function(element) { 
    569574  element = $(element); 
    570   var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') }; 
     575  var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') }; 
    571576  return new Effect.Parallel( 
    572577   [ new Effect.Scale(element, 200,  
     
    574579     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],  
    575580     Object.extend({ duration: 1.0,  
    576       beforeSetupInternal: function(effect) { with(Element) { 
    577         setStyle(effect.effects[0].element, {position: 'absolute'}); }}, 
    578       afterFinishInternal: function(effect) { with(Element) { 
    579          hide(effect.effects[0].element); 
    580          setStyle(effect.effects[0].element, oldStyle); }} 
     581      beforeSetupInternal: function(effect) { 
     582        effect.effects[0].element.setStyle({position: 'absolute'}); }, 
     583      afterFinishInternal: function(effect) { 
     584         effect.effects[0].element.hide().setStyle(oldStyle); } 
    581585     }, arguments[1] || {}) 
    582586   ); 
     
    585589Effect.BlindUp = function(element) { 
    586590  element = $(element); 
    587   Element.makeClipping(element); 
     591  element.makeClipping(); 
    588592  return new Effect.Scale(element, 0,  
    589593    Object.extend({ scaleContent: false,  
    590594      scaleX: false,  
    591595      restoreAfterFinish: true, 
    592       afterFinishInternal: function(effect) { with(Element) { 
    593         [hide, undoClipping].call(effect.element); }}  
     596      afterFinishInternal: function(effect) { 
     597        effect.element.hide(); 
     598        effect.element.undoClipping(); 
     599      }  
    594600    }, arguments[1] || {}) 
    595601  ); 
     
    598604Effect.BlindDown = function(element) { 
    599605  element = $(element); 
    600   var elementDimensions = Element.getDimensions(element); 
     606  var elementDimensions = element.getDimensions(); 
    601607  return new Effect.Scale(element, 100,  
    602608    Object.extend({ scaleContent: false,  
     
    605611      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, 
    606612      restoreAfterFinish: true, 
    607       afterSetup: function(effect) { with(Element) { 
    608         makeClipping(effect.element); 
    609         setStyle(effect.element, {height: '0px'}); 
    610         show(effect.element);  
    611       }},   
     613      afterSetup: function(effect) { 
     614        effect.element.makeClipping(); 
     615        effect.element.setStyle({height: '0px'}); 
     616        effect.element.show();  
     617      },   
    612618      afterFinishInternal: function(effect) { 
    613         Element.undoClipping(effect.element); 
     619        effect.element.undoClipping(); 
    614620      } 
    615621    }, arguments[1] || {}) 
     
    619625Effect.SwitchOff = function(element) { 
    620626  element = $(element); 
    621   var oldOpacity = Element.getInlineOpacity(element); 
     627  var oldOpacity = element.getInlineOpacity(); 
    622628  return new Effect.Appear(element, {  
    623629    duration: 0.4, 
     
    628634        duration: 0.3, scaleFromCenter: true, 
    629635        scaleX: false, scaleContent: false, restoreAfterFinish: true, 
    630         beforeSetup: function(effect) { with(Element) { 
    631           [makePositioned,makeClipping].call(effect.element); 
    632         }}, 
    633         afterFinishInternal: function(effect) { with(Element) { 
    634           [hide,undoClipping,undoPositioned].call(effect.element); 
    635           setStyle(effect.element, {opacity: oldOpacity}); 
    636         }} 
     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.undoPositionend(); 
     644          effect.element.setStyle({opacity: oldOpacity}); 
     645        } 
    637646      }) 
    638647    } 
     
    643652  element = $(element); 
    644653  var oldStyle = { 
    645     top: Element.getStyle(element, 'top'), 
    646     left: Element.getStyle(element, 'left'), 
    647     opacity: Element.getInlineOpacity(element) }; 
     654    top: element.getStyle('top'), 
     655    left: element.getStyle('left'), 
     656    opacity: element.getInlineOpacity() }; 
    648657  return new Effect.Parallel( 
    649658    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),  
     
    651660    Object.extend( 
    652661      { duration: 0.5, 
    653         beforeSetup: function(effect) { with(Element) { 
    654           makePositioned(effect.effects[0].element); }}, 
    655         afterFinishInternal: function(effect) { with(Element) { 
    656           [hide, undoPositioned].call(effect.effects[0].element); 
    657           setStyle(effect.effects[0].element, oldStyle); }}  
     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        }  
    658670      }, arguments[1] || {})); 
    659671} 
     
    662674  element = $(element); 
    663675  var oldStyle = { 
    664     top: Element.getStyle(element, 'top'), 
    665     left: Element.getStyle(element, 'left') }; 
    666          return new Effect.Move(element,  
    667            { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { 
    668          new Effect.Move(effect.element, 
    669            { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) { 
    670          new Effect.Move(effect.element, 
    671            { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) { 
    672          new Effect.Move(effect.element, 
    673            { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) { 
    674          new Effect.Move(effect.element, 
    675            { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) { 
    676          new Effect.Move(effect.element, 
    677            { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { with(Element) { 
    678         undoPositioned(effect.element); 
    679         setStyle(effect.element, oldStyle); 
    680   }}}) }}) }}) }}) }}) }}); 
     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  }}) }}) }}) }}) }}) }}); 
    681693} 
    682694 
    683695Effect.SlideDown = function(element) { 
    684696  element = $(element); 
    685   Element.cleanWhitespace(element); 
     697  element.cleanWhitespace(); 
    686698  // SlideDown need to have the content of the element wrapped in a container element with fixed height! 
    687   var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); 
    688   var elementDimensions = Element.getDimensions(element); 
     699  var oldInnerBottom = $(element.firstChild).getStyle('bottom'); 
     700  var elementDimensions = element.getDimensions(); 
    689701  return new Effect.Scale(element, 100, Object.extend({  
    690702    scaleContent: false,  
     
    693705    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, 
    694706    restoreAfterFinish: true, 
    695     afterSetup: function(effect) { with(Element) { 
    696       makePositioned(effect.element); 
    697       makePositioned(effect.element.firstChild); 
    698       if(window.opera) setStyle(effect.element, {top: ''}); 
    699       makeClipping(effect.element); 
    700       setStyle(effect.element, {height: '0px'}); 
    701       show(element); }}, 
    702     afterUpdateInternal: function(effect) { with(Element) { 
    703       setStyle(effect.element.firstChild, {bottom: 
    704         (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, 
    705     afterFinishInternal: function(effect) { with(Element) { 
    706       undoClipping(effect.element);  
     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();  
    707720      // IE will crash if child is undoPositioned first 
    708721      if(/MSIE/.test(navigator.userAgent)){ 
    709         undoPositioned(effect.element); 
    710         undoPositioned(effect.element.firstChild); 
     722        effect.element.undoPositioned(); 
     723        effect.element.firstChild.undoPositioned(); 
    711724      }else{ 
    712         undoPositioned(effect.element.firstChild); 
    713         undoPositioned(effect.element); 
     725        effect.element.firstChild.undoPositioned(); 
     726        effect.element.undoPositioned(); 
    714727      } 
    715       setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }
     728      effect.element.firstChild.setStyle({bottom: oldInnerBottom});
    716729    }, arguments[1] || {}) 
    717730  ); 
     
    720733Effect.SlideUp = function(element) { 
    721734  element = $(element); 
    722   Element.cleanWhitespace(element); 
    723   var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); 
     735  element.cleanWhitespace(); 
     736  var oldInnerBottom = $(element.firstChild).getStyle('bottom'); 
    724737  return new Effect.Scale(element, 0,  
    725738   Object.extend({ scaleContent: false,  
     
    728741    scaleFrom: 100, 
    729742    restoreAfterFinish: true, 
    730     beforeStartInternal: function(effect) { with(Element) { 
    731       makePositioned(effect.element); 
    732       makePositioned(effect.element.firstChild); 
    733       if(window.opera) setStyle(effect.element, {top: ''}); 
    734       makeClipping(effect.element); 
    735       show(element); }},   
    736     afterUpdateInternal: function(effect) { with(Element) { 
    737       setStyle(effect.element.firstChild, {bottom: 
    738         (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, 
    739     afterFinishInternal: function(effect) { with(Element) { 
    740         [hide, undoClipping].call(effect.element);  
    741         undoPositioned(effect.element.firstChild); 
    742         undoPositioned(effect.element); 
    743         setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} 
     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}); } 
    744758   }, arguments[1] || {}) 
    745759  ); 
     
    750764  return new Effect.Scale(element, window.opera ? 1 : 0,  
    751765    { restoreAfterFinish: true, 
    752       beforeSetup: function(effect) { with(Element) { 
    753         makeClipping(effect.element); }},   
    754       afterFinishInternal: function(effect) { with(Element) { 
    755         hide(effect.element);  
    756         undoClipping(effect.element); }
     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);
    757771  }); 
    758772} 
     
    771785    height: element.style.height, 
    772786    width: element.style.width, 
    773     opacity: Element.getInlineOpacity(element) }; 
    774  
    775   var dims = Element.getDimensions(element);     
     787    opacity: element.getInlineOpacity() }; 
     788 
     789  var dims = element.getDimensions();     
    776790  var initialMoveX, initialMoveY; 
    777791  var moveX, moveY; 
     
    809823    y: initialMoveY, 
    810824    duration: 0.01,  
    811     beforeSetup: function(effect) { with(Element) { 
    812       hide(effect.element); 
    813       makeClipping(effect.element); 
    814       makePositioned(effect.element); 
    815     }}
     825    beforeSetup: function(effect) { 
     826      effect.element.hide(); 
     827      effect.element.makeClipping(); 
     828      effect.element.makePositioned(); 
     829    }
    816830    afterFinishInternal: function(effect) { 
    817831      new Effect.Parallel( 
     
    822836            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) 
    823837        ], Object.extend({ 
    824              beforeSetup: function(effect) { with(Element) { 
    825                setStyle(effect.effects[0].element, {height: '0px'}); 
    826                show(effect.effects[0].element); }}, 
    827              afterFinishInternal: function(effect) { with(Element) { 
    828                [undoClipping, undoPositioned].call(effect.effects[0].element);  
    829                setStyle(effect.effects[0].element, oldStyle); }} 
     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             } 
    830847           }, options) 
    831848      ) 
     
    847864    height: element.style.height, 
    848865    width: element.style.width, 
    849     opacity: Element.getInlineOpacity(element) }; 
    850  
    851   var dims = Element.getDimensions(element); 
     866    opacity: element.getInlineOpacity() }; 
     867 
     868  var dims = element.getDimensions(); 
    852869  var moveX, moveY; 
    853870   
     
    879896      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) 
    880897    ], Object.extend({             
    881          beforeStartInternal: function(effect) { with(Element) { 
    882            [makePositioned, makeClipping].call(effect.effects[0].element) }}, 
    883          afterFinishInternal: function(effect) { with(Element) { 
    884            [hide, undoClipping, undoPositioned].call(effect.effects[0].element); 
    885            setStyle(effect.effects[0].element, oldStyle); }} 
     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); } 
    886906       }, options) 
    887907  ); 
     
    891911  element = $(element); 
    892912  var options    = arguments[1] || {}; 
    893   var oldOpacity = Element.getInlineOpacity(element); 
     913  var oldOpacity = element.getInlineOpacity(); 
    894914  var transition = options.transition || Effect.Transitions.sinoidal; 
    895915  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; 
     
    897917  return new Effect.Opacity(element,  
    898918    Object.extend(Object.extend({  duration: 3.0, from: 0, 
    899       afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); } 
     919      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } 
    900920    }, options), {transition: reverser})); 
    901921} 
     
    916936      scaleContent: false,  
    917937      scaleY: false, 
    918       afterFinishInternal: function(effect) { with(Element) { 
    919         [hide, undoClipping].call(effect.element);  
    920         setStyle(effect.element, oldStyle); 
    921       }} }); 
     938      afterFinishInternal: function(effect) { 
     939        effect.element.hide(); 
     940        effect.element.undoClipping();  
     941        effect.element.setStyle(oldStyle); 
     942      } }); 
    922943  }}, arguments[1] || {})); 
    923944} 
    924945 
    925 if(Element.Methods) { 
    926   Element.Methods.visualEffect = function(element, effect, options) { 
    927     s = effect.gsub(/_/, '-').camelize(); 
    928     effect_class = s.charAt(0).toUpperCase() + s.substring(1); 
    929     new Effect[effect_class](element, options); 
    930     return $(element); 
    931   } 
    932 
     946Element.Methods.visualEffect = function(element, effect, options) { 
     947  s = effect.gsub(/_/, '-').camelize(); 
     948  effect_class = s.charAt(0).toUpperCase() + s.substring(1); 
     949  new Effect[effect_class](element, options); 
     950  return $(element); 
     951}; 
  • trunk/railties/CHANGELOG

    r4027 r4043  
    11*SVN* 
     2 
     3* Update to script.aculo.us 1.6 [Thomas Fuchs] 
    24 
    35* Add an integration_test generator [Jamis Buck] 
  • trunk/railties/html/javascripts/dragdrop.js

    r3824 r4043  
    213213    if(!this.handle) this.handle = this.element; 
    214214     
    215     if(options.scroll) options.scroll = $(options.scroll); 
     215    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) 
     216      options.scroll = $(options.scroll); 
    216217 
    217218    Element.makePositioned(this.element); // fix IE     
     
    278279     
    279280    if(this.options.scroll) { 
    280       this.originalScrollLeft = this.options.scroll.scrollLeft; 
    281       this.originalScrollTop = this.options.scroll.scrollTop; 
     281      if (this.options.scroll == window) { 
     282        var where = this._getWindowScroll(this.options.scroll); 
     283        this.originalScrollLeft = where.left; 
     284        this.originalScrollTop = where.top; 
     285      } else { 
     286        this.originalScrollLeft = this.options.scroll.scrollLeft; 
     287        this.originalScrollTop = this.options.scroll.scrollTop; 
     288      } 
    282289    } 
    283290     
     
    295302     
    296303    if(this.options.scroll) { 
    297       //if(this.scrollInterval) this.scroll(); 
    298304      this.stopScrolling(); 
    299       var p = Position.page(this.options.scroll); 
    300       p[0] += this.options.scroll.scrollLeft; 
    301       p[1] += this.options.scroll.scrollTop; 
    302       p.push(p[0]+this.options.scroll.offsetWidth); 
    303       p.push(p[1]+this.options.scroll.offsetHeight); 
     305       
     306      var p; 
     307      if (this.options.scroll == window) { 
     308        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } 
     309      } else { 
     310        p = Position.page(this.options.scroll); 
     311        p[0] += this.options.scroll.scrollLeft; 
     312        p[1] += this.options.scroll.scrollTop; 
     313        p.push(p[0]+this.options.scroll.offsetWidth); 
     314        p.push(p[1]+this.options.scroll.offsetHeight); 
     315      } 
    304316      var speed = [0,0]; 
    305317      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); 
     
    367379    pos[0] -= d[0]; pos[1] -= d[1]; 
    368380     
    369     if(this.options.scroll) { 
     381    if(this.options.scroll && (this.options.scroll != window)) { 
    370382      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 
    371383      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; 
     
    414426    var delta = current - this.lastScrolled; 
    415427    this.lastScrolled = current; 
    416     this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 
    417     this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; 
     428    if(this.options.scroll == window) { 
     429      with (this._getWindowScroll(this.options.scroll)) { 
     430        if (this.scrollSpeed[0] || this.scrollSpeed[1]) { 
     431          var d = delta / 1000; 
     432          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); 
     433        } 
     434      } 
     435    } else { 
     436      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; 
     437      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000; 
     438    } 
    418439     
    419440    Position.prepare(); 
     
    423444     
    424445    if(this.options.change) this.options.change(this); 
     446  }, 
     447   
     448  _getWindowScroll: function(w) { 
     449    var T, L, W, H; 
     450    with (w.document) { 
     451      if (w.document.documentElement && documentElement.scrollTop) { 
     452        T = documentElement.scrollTop; 
     453        L = documentElement.scrollLeft; 
     454      } else if (w.document.body) { 
     455        T = body.scrollTop; 
     456        L = body.scrollLeft; 
     457      } 
     458      if (w.innerWidth) { 
     459        W = w.innerWidth; 
     460        H = w.innerHeight; 
     461      } else if (w.document.documentElement && documentElement.clientWidth) { 
     462        W = documentElement.clientWidth; 
     463        H = documentElement.clientHeight; 
     464      } else { 
     465        W = body.offsetWidth; 
     466        H = body.offsetHeight 
     467      } 
     468    } 
     469    return { top: T, left: L, width: W, height: H }; 
    425470  } 
    426471} 
     
    480525      ghosting:    false, 
    481526      scroll:      false, 
     527      scrollSensitivity: 20, 
     528      scrollSpeed: 15, 
    482529      format:      /^[^_]*_(.*)$/, 
    483530      onChange:    Prototype.emptyFunction, 
     
    492539      revert:      true, 
    493540      scroll:      options.scroll, 
     541      scrollSpeed: options.scrollSpeed, 
     542      scrollSensitivity: options.scrollSensitivity, 
    494543      ghosting:    options.ghosting, 
    495544      constraint:  options.constraint, 
  • trunk/railties/html/javascripts/effects.js

    r3824 r4043  
    77// See scriptaculous.js for full license.   
    88 
    9 /* ------------- element ext -------------- */   
    10   
    119// converts rgb() and #xxx to #xxxxxx format,   
    1210// returns self (or first argument) if not convertable   
     
    2523} 
    2624 
     25/*--------------------------------------------------------------------------*/ 
     26 
    2727Element.collectTextNodes = function(element) {   
    2828  return $A($(element).childNodes).collect( function(node) { 
     
    4040} 
    4141 
    42 Element.setStyle = function(element, style) { 
    43   element = $(element); 
    44   for(k in style) element.style[k.camelize()] = style[k]; 
    45 
    46  
    47 Element.setContentZoom = function(element, percent) {   
     42Element.setContentZoom = function(element, percent) { 
     43  element = $(element);   
    4844  Element.setStyle(element, {fontSize: (percent/100) + 'em'});    
    49   if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);   
     45  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); 
    5046} 
    5147 
     
    7470       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 
    7571                 'alpha(opacity='+value*100+')' });   
    76   }    
     72  } 
    7773 
    7874  
     
    9288    element.appendChild(n); 
    9389    element.removeChild(n); 
    94   } catch(e) {} 
    95 
     90  } catch(e) { } 
     91}; 
     92 
     93['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', 
     94 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(  
     95  function(f) { Element.Methods[f] = Element[f]; }  
     96); 
     97 
     98/*--------------------------------------------------------------------------*/ 
    9699 
    97100Array.prototype.call = function() { 
     
    149152      queue: { position:'end', scope:(element.id || 'global'), limit: 1 } 
    150153    }, arguments[2] || {}); 
    151     Effect[Element.visible(element) ?  
     154    Effect[element.visible() ?  
    152155      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); 
    153156  } 
     
    353356    // make this work on IE on elements without 'layout' 
    354357    if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) 
    355       Element.setStyle(this.element, {zoom: 1}); 
     358      this.element.setStyle({zoom: 1}); 
    356359    var options = Object.extend({ 
    357       from: Element.getOpacity(this.element) || 0.0, 
     360      from: this.element.getOpacity() || 0.0, 
    358361      to:   1.0 
    359362    }, arguments[1] || {}); 
     
    361364  }, 
    362365  update: function(position) { 
    363     Element.setOpacity(this.element, position); 
     366    this.element.setOpacity(position); 
    364367  } 
    365368}); 
     
    381384    // ==> Always set top and left for position relative elements in your stylesheets  
    382385    // (to 0 if you do not need them)  
    383     Element.makePositioned(this.element); 
    384     this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0'); 
    385     this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0'); 
     386    this.element.makePositioned(); 
     387    this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); 
     388    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0'); 
    386389    if(this.options.mode == 'absolute') { 
    387390      // absolute movement, so we need to calc deltaX and deltaY 
     
    391394  }, 
    392395  update: function(position) { 
    393     Element.setStyle(this.element,
     396    this.element.setStyle(
    394397      left: this.options.x  * position + this.originalLeft + 'px', 
    395398      top:  this.options.y  * position + this.originalTop  + 'px' 
     
    421424  setup: function() { 
    422425    this.restoreAfterFinish = this.options.restoreAfterFinish || false; 
    423     this.elementPositioning = Element.getStyle(this.element,'position'); 
     426    this.elementPositioning = this.element.getStyle('position'); 
    424427     
    425428    this.originalStyle = {}; 
     
    431434    this.originalLeft = this.element.offsetLeft; 
    432435     
    433     var fontSize = Element.