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

Changeset 5015

Show
Ignore:
Timestamp:
09/05/06 10:42:41 (2 years ago)
Author:
madrobby
Message:

Update to script.aculo.us 1.6.3 [Thomas Fuchs]

Files:

Legend:

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

    r5012 r5015  
    11*SVN* 
     2 
     3* Update to script.aculo.us 1.6.3 [Thomas Fuchs] 
    24 
    35* Update to Prototype 1.5.0_rc1 [sam] 
  • trunk/actionpack/lib/action_view/helpers/javascripts/controls.js

    r4766 r5015  
    4949    this.entryCount  = 0; 
    5050 
    51     if (this.setOptions) 
     51    if(this.setOptions) 
    5252      this.setOptions(options); 
    5353    else 
     
    5959    this.options.minChars     = this.options.minChars || 1; 
    6060    this.options.onShow       = this.options.onShow ||  
    61     function(element, update){  
    62       if(!update.style.position || update.style.position=='absolute') { 
    63         update.style.position = 'absolute'; 
    64         Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight}); 
    65       } 
    66       Effect.Appear(update,{duration:0.15}); 
    67     }; 
     61      function(element, update){  
     62        if(!update.style.position || update.style.position=='absolute') { 
     63          update.style.position = 'absolute'; 
     64          Position.clone(element, update, { 
     65            setHeight: false,  
     66            offsetTop: element.offsetHeight 
     67          }); 
     68        } 
     69        Effect.Appear(update,{duration:0.15}); 
     70      }; 
    6871    this.options.onHide = this.options.onHide ||  
    69     function(element, update){ new Effect.Fade(update,{duration:0.15}) }; 
    70  
    71     if (typeof(this.options.tokens) == 'string')  
     72      function(element, update){ new Effect.Fade(update,{duration:0.15}) }; 
     73 
     74    if(typeof(this.options.tokens) == 'string')  
    7275      this.options.tokens = new Array(this.options.tokens); 
    7376 
     
    275278 
    276279      this.stopIndicator(); 
    277  
    278280      this.index = 0; 
    279       this.render(); 
     281       
     282      if(this.entryCount==1 && this.options.autoSelect) { 
     283        this.selectEntry(); 
     284        this.hide(); 
     285      } else { 
     286        this.render(); 
     287      } 
    280288    } 
    281289  }, 
     
    779787        optionTag = document.createElement("option"); 
    780788        optionTag.value = (e instanceof Array) ? e[0] : e; 
     789        if((typeof this.options.value == 'undefined') &&  
     790          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true; 
    781791        if(this.options.value==optionTag.value) optionTag.selected = true; 
    782792        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e)); 
  • trunk/actionpack/lib/action_view/helpers/javascripts/dragdrop.js

    r4766 r5015  
    149149   
    150150  activate: function(draggable) { 
    151     window.focus(); // allows keypress events if window isn't currently focused, fails for Safari 
    152     this.activeDraggable = draggable; 
     151    if(draggable.options.delay) {  
     152      this._timeout = setTimeout(function() {  
     153        Draggables._timeout = null;  
     154        window.focus();  
     155        Draggables.activeDraggable = draggable;  
     156      }.bind(this), draggable.options.delay);  
     157    } else { 
     158      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari 
     159      this.activeDraggable = draggable; 
     160    } 
    153161  }, 
    154162   
     
    164172    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; 
    165173    this._lastPointer = pointer; 
     174     
    166175    this.activeDraggable.updateDrag(event, pointer); 
    167176  }, 
    168177   
    169178  endDrag: function(event) { 
     179    if(this._timeout) {  
     180      clearTimeout(this._timeout);  
     181      this._timeout = null;  
     182    } 
    170183    if(!this.activeDraggable) return; 
    171184    this._lastPointer = null; 
     
    194207        if(o[eventName]) o[eventName](eventName, draggable, event); 
    195208      }); 
     209    if(draggable.options[eventName]) draggable.options[eventName](draggable, event); 
    196210  }, 
    197211   
     
    208222 
    209223var Draggable = Class.create(); 
    210 Draggable._revertCache = {}; 
    211224Draggable._dragging    = {}; 
    212225 
    213226Draggable.prototype = { 
    214227  initialize: function(element) { 
    215     var options = Object.extend(
     228    var defaults =
    216229      handle: false, 
    217       starteffect: function(element) { 
    218         element._opacity = Element.getOpacity(element); 
    219         Draggable._dragging[element] = true; 
    220         new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});  
    221       }, 
    222230      reverteffect: function(element, top_offset, left_offset) { 
    223231        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; 
    224         Draggable._revertCache[element] = 
    225           new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, 
    226             queue: {scope:'_draggable', position:'end'} 
    227           }); 
     232        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, 
     233          queue: {scope:'_draggable', position:'end'} 
     234        }); 
    228235      }, 
    229236      endeffect: function(element) { 
     
    231238        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,  
    232239          queue: {scope:'_draggable', position:'end'}, 
    233           afterFinish: function(){ Draggable._dragging[element] = false } 
     240          afterFinish: function(){  
     241            Draggable._dragging[element] = false  
     242          } 
    234243        });  
    235244      }, 
     
    239248      scrollSensitivity: 20, 
    240249      scrollSpeed: 15, 
    241       snap: false   // false, or xy or [x,y] or function(x,y){ return [x,y] } 
    242     }, arguments[1] || {}); 
     250      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] } 
     251      delay: 0 
     252    }; 
     253     
     254    if(arguments[1] && typeof arguments[1].endeffect == 'undefined') 
     255      Object.extend(defaults, { 
     256        starteffect: function(element) { 
     257          element._opacity = Element.getOpacity(element); 
     258          Draggable._dragging[element] = true; 
     259          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});  
     260        } 
     261      }); 
     262     
     263    var options = Object.extend(defaults, arguments[1] || {}); 
    243264 
    244265    this.element = $(element); 
     
    251272    if(!this.handle) this.handle = this.element; 
    252273     
    253     if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) 
     274    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { 
    254275      options.scroll = $(options.scroll); 
     276      this._isScrollChild = Element.childOf(this.element, options.scroll); 
     277    } 
    255278 
    256279    Element.makePositioned(this.element); // fix IE     
     
    278301   
    279302  initDrag: function(event) { 
    280     if(typeof Draggable._dragging[this.element] != undefined && 
     303    if(typeof Draggable._dragging[this.element] != 'undefined' && 
    281304      Draggable._dragging[this.element]) return; 
    282305    if(Event.isLeftClick(event)) {     
     
    290313        src.tagName=='TEXTAREA')) return; 
    291314         
    292       if(Draggable._revertCache[this.element]) { 
    293         Draggable._revertCache[this.element].cancel(); 
    294         Draggable._revertCache[this.element] = null; 
    295       } 
    296        
    297315      var pointer = [Event.pointerX(event), Event.pointerY(event)]; 
    298316      var pos     = Position.cumulativeOffset(this.element); 
     
    330348     
    331349    Draggables.notify('onStart', this, event); 
     350         
    332351    if(this.options.starteffect) this.options.starteffect(this.element); 
    333352  }, 
     
    338357    Droppables.show(pointer, this.element); 
    339358    Draggables.notify('onDrag', this, event); 
     359     
    340360    this.draw(pointer); 
    341361    if(this.options.change) this.options.change(this); 
     
    351371        p[0] += this.options.scroll.scrollLeft; 
    352372        p[1] += this.options.scroll.scrollTop; 
     373         
     374        p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0); 
     375        p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); 
     376         
    353377        p.push(p[0]+this.options.scroll.offsetWidth); 
    354378        p.push(p[1]+this.options.scroll.offsetHeight); 
     
    396420    if(this.options.endeffect)  
    397421      this.options.endeffect(this.element); 
    398  
     422       
    399423    Draggables.deactivate(this); 
    400424    Droppables.reset(); 
     
    416440  draw: function(point) { 
    417441    var pos = Position.cumulativeOffset(this.element); 
     442    if(this.options.ghosting) { 
     443      var r   = Position.realOffset(this.element); 
     444      window.status = r.inspect(); 
     445      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; 
     446    } 
     447     
    418448    var d = this.currentDelta(); 
    419449    pos[0] -= d[0]; pos[1] -= d[1]; 
    420450     
    421     if(this.options.scroll && (this.options.scroll != window)) { 
     451    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { 
    422452      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 
    423453      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; 
     
    446476    if((!this.options.constraint) || (this.options.constraint=='vertical')) 
    447477      style.top  = p[1] + "px"; 
     478     
    448479    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering 
    449480  }, 
     
    483514    Droppables.show(Draggables._lastPointer, this.element); 
    484515    Draggables.notify('onDrag', this); 
    485     Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 
    486     Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; 
    487     Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; 
    488     if (Draggables._lastScrollPointer[0] < 0) 
    489       Draggables._lastScrollPointer[0] = 0; 
    490     if (Draggables._lastScrollPointer[1] < 0) 
    491       Draggables._lastScrollPointer[1] = 0; 
    492     this.draw(Draggables._lastScrollPointer); 
     516    if (this._isScrollChild) { 
     517      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 
     518      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; 
     519      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; 
     520      if (Draggables._lastScrollPointer[0] < 0) 
     521        Draggables._lastScrollPointer[0] = 0; 
     522      if (Draggables._lastScrollPointer[1] < 0) 
     523        Draggables._lastScrollPointer[1] = 0; 
     524      this.draw(Draggables._lastScrollPointer); 
     525    } 
    493526     
    494527    if(this.options.change) this.options.change(this); 
     
    542575 
    543576var Sortable = { 
     577  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, 
     578   
    544579  sortables: {}, 
    545580   
     
    582617      handle:      false,      // or a CSS class 
    583618      only:        false, 
     619      delay:       0, 
    584620      hoverclass:  null, 
    585621      ghosting:    false, 
     
    587623      scrollSensitivity: 20, 
    588624      scrollSpeed: 15, 
    589       format:      /^[^_]*_(.*)$/
     625      format:      this.SERIALIZE_RULE
    590626      onChange:    Prototype.emptyFunction, 
    591627      onUpdate:    Prototype.emptyFunction 
     
    601637      scrollSpeed: options.scrollSpeed, 
    602638      scrollSensitivity: options.scrollSensitivity, 
     639      delay:       options.delay, 
    603640      ghosting:    options.ghosting, 
    604641      constraint:  options.constraint, 
  • trunk/actionpack/lib/action_view/helpers/javascripts/effects.js

    r4766 r5015  
    6060    Element.setStyle(element, { opacity:  
    6161      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?  
    62       0.999999 : null }); 
    63     if(/MSIE/.test(navigator.userAgent))   
     62      0.999999 : 1.0 }); 
     63    if(/MSIE/.test(navigator.userAgent) && !window.opera)   
    6464      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});   
    6565  } else {   
    6666    if(value < 0.00001) value = 0;   
    6767    Element.setStyle(element, {opacity: value}); 
    68     if(/MSIE/.test(navigator.userAgent))   
     68    if(/MSIE/.test(navigator.userAgent) && !window.opera)   
    6969     Element.setStyle(element,  
    7070       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 
     
    105105 
    106106var Effect = { 
     107  _elementDoesNotExistError: { 
     108    name: 'ElementDoesNotExistError', 
     109    message: 'The specified DOM element does not exist, but is required for this effect to operate' 
     110  }, 
    107111  tagifyText: function(element) { 
    108112    if(typeof Builder == 'undefined') 
     
    110114       
    111115    var tagifyStyle = 'position:relative'; 
    112     if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; 
     116    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1'; 
    113117    element = $(element); 
    114118    $A(element.childNodes).each( function(child) { 
     
    355359  initialize: function(element) { 
    356360    this.element = $(element); 
     361    if(!this.element) throw(Effect._elementDoesNotExistError); 
    357362    // make this work on IE on elements without 'layout' 
    358     if(/MSIE/.test(navigator.userAgent) && (!this.element.currentStyle.hasLayout)) 
     363    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) 
    359364      this.element.setStyle({zoom: 1}); 
    360365    var options = Object.extend({ 
     
    373378  initialize: function(element) { 
    374379    this.element = $(element); 
     380    if(!this.element) throw(Effect._elementDoesNotExistError); 
    375381    var options = Object.extend({ 
    376382      x:    0, 
     
    411417Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { 
    412418  initialize: function(element, percent) { 
    413     this.element = $(element) 
     419    this.element = $(element); 
     420    if(!this.element) throw(Effect._elementDoesNotExistError); 
    414421    var options = Object.extend({ 
    415422      scaleX: true, 
     
    486493  initialize: function(element) { 
    487494    this.element = $(element); 
     495    if(!this.element) throw(Effect._elementDoesNotExistError); 
    488496    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); 
    489497    this.start(options); 
     
    574582Effect.Puff = function(element) { 
    575583  element = $(element); 
    576   var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') }; 
     584  var oldStyle = {  
     585    opacity: element.getInlineOpacity(),  
     586    position: element.getStyle('position'), 
     587    top:  element.style.top, 
     588    left: element.style.left, 
     589    width: element.style.width, 
     590    height: element.style.height 
     591  }; 
    577592  return new Effect.Parallel( 
    578593   [ new Effect.Scale(element, 200,  
     
    581596     Object.extend({ duration: 1.0,  
    582597      beforeSetupInternal: function(effect) { 
    583         effect.effects[0].element.setStyle({position: 'absolute'}); }, 
     598        Position.absolutize(effect.effects[0].element) 
     599      }, 
    584600      afterFinishInternal: function(effect) { 
    585601         effect.effects[0].element.hide(); 
     
    720736      effect.element.undoClipping();  
    721737      // IE will crash if child is undoPositioned first 
    722       if(/MSIE/.test(navigator.userAgent)){ 
     738      if(/MSIE/.test(navigator.userAgent) && !window.opera){ 
    723739        effect.element.undoPositioned(); 
    724740        effect.element.firstChild.undoPositioned(); 
  • trunk/railties/CHANGELOG

    r5012 r5015  
    11*SVN* 
     2 
     3* Update to script.aculo.us 1.6.3 [Thomas Fuchs] 
    24 
    35* Update to Prototype 1.5.0_rc1 [sam] 
  • trunk/railties/html/javascripts/controls.js

    r4766 r5015  
    4949    this.entryCount  = 0; 
    5050 
    51     if (this.setOptions) 
     51    if(this.setOptions) 
    5252      this.setOptions(options); 
    5353    else 
     
    5959    this.options.minChars     = this.options.minChars || 1; 
    6060    this.options.onShow       = this.options.onShow ||  
    61     function(element, update){  
    62       if(!update.style.position || update.style.position=='absolute') { 
    63         update.style.position = 'absolute'; 
    64         Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight}); 
    65       } 
    66       Effect.Appear(update,{duration:0.15}); 
    67     }; 
     61      function(element, update){  
     62        if(!update.style.position || update.style.position=='absolute') { 
     63          update.style.position = 'absolute'; 
     64          Position.clone(element, update, { 
     65            setHeight: false,  
     66            offsetTop: element.offsetHeight 
     67          }); 
     68        } 
     69        Effect.Appear(update,{duration:0.15}); 
     70      }; 
    6871    this.options.onHide = this.options.onHide ||  
    69     function(element, update){ new Effect.Fade(update,{duration:0.15}) }; 
    70  
    71     if (typeof(this.options.tokens) == 'string')  
     72      function(element, update){ new Effect.Fade(update,{duration:0.15}) }; 
     73 
     74    if(typeof(this.options.tokens) == 'string')  
    7275      this.options.tokens = new Array(this.options.tokens); 
    7376 
     
    275278 
    276279      this.stopIndicator(); 
    277  
    278280      this.index = 0; 
    279       this.render(); 
     281       
     282      if(this.entryCount==1 && this.options.autoSelect) { 
     283        this.selectEntry(); 
     284        this.hide(); 
     285      } else { 
     286        this.render(); 
     287      } 
    280288    } 
    281289  }, 
     
    779787        optionTag = document.createElement("option"); 
    780788        optionTag.value = (e instanceof Array) ? e[0] : e; 
     789        if((typeof this.options.value == 'undefined') &&  
     790          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true; 
    781791        if(this.options.value==optionTag.value) optionTag.selected = true; 
    782792        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e)); 
  • trunk/railties/html/javascripts/dragdrop.js

    r4766 r5015  
    149149   
    150150  activate: function(draggable) { 
    151     window.focus(); // allows keypress events if window isn't currently focused, fails for Safari 
    152     this.activeDraggable = draggable; 
     151    if(draggable.options.delay) {  
     152      this._timeout = setTimeout(function() {  
     153        Draggables._timeout = null;  
     154        window.focus();  
     155        Draggables.activeDraggable = draggable;  
     156      }.bind(this), draggable.options.delay);  
     157    } else { 
     158      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari 
     159      this.activeDraggable = draggable; 
     160    } 
    153161  }, 
    154162   
     
    164172    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; 
    165173    this._lastPointer = pointer; 
     174     
    166175    this.activeDraggable.updateDrag(event, pointer); 
    167176  }, 
    168177   
    169178  endDrag: function(event) { 
     179    if(this._timeout) {  
     180      clearTimeout(this._timeout);  
     181      this._timeout = null;  
     182    } 
    170183    if(!this.activeDraggable) return; 
    171184    this._lastPointer = null; 
     
    194207        if(o[eventName]) o[eventName](eventName, draggable, event); 
    195208      }); 
     209    if(draggable.options[eventName]) draggable.options[eventName](draggable, event); 
    196210  }, 
    197211   
     
    208222 
    209223var Draggable = Class.create(); 
    210 Draggable._revertCache = {}; 
    211224Draggable._dragging    = {}; 
    212225 
    213226Draggable.prototype = { 
    214227  initialize: function(element) { 
    215     var options = Object.extend(
     228    var defaults =
    216229      handle: false, 
    217       starteffect: function(element) { 
    218         element._opacity = Element.getOpacity(element); 
    219         Draggable._dragging[element] = true; 
    220         new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});  
    221       }, 
    222230      reverteffect: function(element, top_offset, left_offset) { 
    223231        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; 
    224         Draggable._revertCache[element] = 
    225           new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, 
    226             queue: {scope:'_draggable', position:'end'} 
    227           }); 
     232        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, 
     233          queue: {scope:'_draggable', position:'end'} 
     234        }); 
    228235      }, 
    229236      endeffect: function(element) { 
     
    231238        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,  
    232239          queue: {scope:'_draggable', position:'end'}, 
    233           afterFinish: function(){ Draggable._dragging[element] = false } 
     240          afterFinish: function(){  
     241            Draggable._dragging[element] = false  
     242          } 
    234243        });  
    235244      }, 
     
    239248      scrollSensitivity: 20, 
    240249      scrollSpeed: 15, 
    241       snap: false   // false, or xy or [x,y] or function(x,y){ return [x,y] } 
    242     }, arguments[1] || {}); 
     250      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] } 
     251      delay: 0 
     252    }; 
     253     
     254    if(arguments[1] && typeof arguments[1].endeffect == 'undefined') 
     255      Object.extend(defaults, { 
     256        starteffect: function(element) { 
     257          element._opacity = Element.getOpacity(element); 
     258          Draggable._dragging[element] = true; 
     259          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});  
     260        } 
     261      }); 
     262     
     263    var options = Object.extend(defaults, arguments[1] || {}); 
    243264 
    244265    this.element = $(element); 
     
    251272    if(!this.handle) this.handle = this.element; 
    252273     
    253     if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) 
     274    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { 
    254275      options.scroll = $(options.scroll); 
     276      this._isScrollChild = Element.childOf(this.element, options.scroll); 
     277    } 
    255278 
    256279    Element.makePositioned(this.element); // fix IE     
     
    278301   
    279302  initDrag: function(event) { 
    280     if(typeof Draggable._dragging[this.element] != undefined && 
     303    if(typeof Draggable._dragging[this.element] != 'undefined' && 
    281304      Draggable._dragging[this.element]) return; 
    282305    if(Event.isLeftClick(event)) {     
     
    290313        src.tagName=='TEXTAREA')) return; 
    291314         
    292       if(Draggable._revertCache[this.element]) { 
    293         Draggable._revertCache[this.element].cancel(); 
    294         Draggable._revertCache[this.element] = null; 
    295       } 
    296        
    297315      var pointer = [Event.pointerX(event), Event.pointerY(event)]; 
    298316      var pos     = Position.cumulativeOffset(this.element); 
     
    330348     
    331349    Draggables.notify('onStart', this, event); 
     350         
    332351    if(this.options.starteffect) this.options.starteffect(this.element); 
    333352  }, 
     
    338357    Droppables.show(pointer, this.element); 
    339358    Draggables.notify('onDrag', this, event); 
     359     
    340360    this.draw(pointer); 
    341361    if(this.options.change) this.options.change(this); 
     
    351371        p[0] += this.options.scroll.scrollLeft; 
    352372        p[1] += this.options.scroll.scrollTop; 
     373         
     374        p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0); 
     375        p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); 
     376         
    353377        p.push(p[0]+this.options.scroll.offsetWidth); 
    354378        p.push(p[1]+this.options.scroll.offsetHeight); 
     
    396420    if(this.options.endeffect)  
    397421      this.options.endeffect(this.element); 
    398  
     422       
    399423    Draggables.deactivate(this); 
    400424    Droppables.reset(); 
     
    416440  draw: function(point) { 
    417441    var pos = Position.cumulativeOffset(this.element); 
     442    if(this.options.ghosting) { 
     443      var r   = Position.realOffset(this.element); 
     444      window.status = r.inspect(); 
     445      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; 
     446    } 
     447     
    418448    var d = this.currentDelta(); 
    419449    pos[0] -= d[0]; pos[1] -= d[1]; 
    420450     
    421     if(this.options.scroll && (this.options.scroll != window)) { 
     451    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { 
    422452      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 
    423453      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; 
     
    446476    if((!this.options.constraint) || (this.options.constraint=='vertical')) 
    447477      style.top  = p[1] + "px"; 
     478     
    448479    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering 
    449480  }, 
     
    483514    Droppables.show(Draggables._lastPointer, this.element); 
    484515    Draggables.notify('onDrag', this); 
    485     Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 
    486     Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; 
    487     Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; 
    488     if (Draggables._lastScrollPointer[0] < 0) 
    489       Draggables._lastScrollPointer[0] = 0; 
    490     if (Draggables._lastScrollPointer[1] < 0) 
    491       Draggables._lastScrollPointer[1] = 0; 
    492     this.draw(Draggables._lastScrollPointer); 
     516    if (this._isScrollChild) { 
     517      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 
     518      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; 
     519      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; 
     520      if (Draggables._lastScrollPointer[0] < 0) 
     521        Draggables._lastScrollPointer[0] = 0; 
     522      if (Draggables._lastScrollPointer[1] < 0) 
     523        Draggables._lastScrollPointer[1] = 0; 
     524      this.draw(Draggables._lastScrollPointer); 
     525    } 
    493526     
    494527    if(this.options.change) this.options.change(this); 
     
    542575 
    543576var Sortable = { 
     577  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, 
     578   
    544579  sortables: {}, 
    545580   
     
    582617      handle:      false,      // or a CSS class 
    583618      only:        false, 
     619      delay:       0, 
    584620      hoverclass:  null, 
    585621      ghosting:    false, 
     
    587623      scrollSensitivity: 20, 
    588624      scrollSpeed: 15, 
    589       format:      /^[^_]*_(.*)$/
     625      format:      this.SERIALIZE_RULE
    590626      onChange:    Prototype.emptyFunction, 
    591627      onUpdate:    Prototype.emptyFunction 
     
    601637      scrollSpeed: options.scrollSpeed, 
    602638      scrollSensitivity: options.scrollSensitivity, 
     639      delay:       options.delay, 
    603640      ghosting:    options.ghosting, 
    604641      constraint:  options.constraint, 
  • trunk/railties/html/javascripts/effects.js

    r4766 r5015  
    6060    Element.setStyle(element, { opacity:  
    6161      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?  
    62       0.999999 : null }); 
    63     if(/MSIE/.test(navigator.userAgent))   
     62      0.999999 : 1.0 }); 
     63    if(/MSIE/.test(navigator.userAgent) && !window.opera)   
    6464      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});   
    6565  } else {   
    6666    if(value < 0.00001) value = 0;   
    6767    Element.setStyle(element, {opacity: value}); 
    68     if(/MSIE/.test(navigator.userAgent))   
     68    if(/MSIE/.test(navigator.userAgent) && !window.opera)   
    6969     Element.setStyle(element,  
    7070       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 
     
    105105 
    106106var Effect = { 
     107  _elementDoesNotExistError: { 
     108    name: 'ElementDoesNotExistError', 
     109    message: 'The specified DOM element does not exist, but is required for this effect to operate' 
     110  }, 
    107111  tagifyText: function(element) { 
    108112    if(typeof Builder == 'undefined') 
     
    110114       
    111115    var tagifyStyle = 'position:relative'; 
    112     if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; 
     116    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1'; 
    113117    element = $(element); 
    114118    $A(element.childNodes).each( function(child) { 
     
    355359  initialize: function(element) { 
    356360    this.element = $(element); 
     361    if(!this.element) throw(Effect._elementDoesNotExistError); 
    357362    // make this work on IE on elements without 'layout' 
    358     if(/MSIE/.test(navigator.userAgent) && (!this.element.currentStyle.hasLayout)) 
     363    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) 
    359364      this.element.setStyle({zoom: 1}); 
    360365    var options = Object.extend({ 
     
    373378  initialize: function(element) { 
    374379    this.element = $(element); 
     380    if(!this.element) throw(Effect._elementDoesNotExistError); 
    375381    var options = Object.extend({ 
    376382      x:    0, 
     
    411417Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { 
    412418  initialize: function(element, percent) { 
    413     this.element = $(element) 
     419    this.element = $(element); 
     420    if(!this.element) throw(Effect._elementDoesNotExistError); 
    414421    var options = Object.extend({ 
    415422      scaleX: true, 
     
    486493  initialize: function(element) { 
    487494    this.element = $(element); 
     495    if(!this.element) throw(Effect._elementDoesNotExistError); 
    488496    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); 
    489497    this.start(options); 
     
    574582Effect.Puff = function(element) { 
    575583  element = $(element); 
    576   var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') }; 
     584  var oldStyle = {  
     585    opacity: element.getInlineOpacity(),  
     586    position: element.getStyle('position'), 
     587    top:  element.style.top, 
     588    left: element.style.left, 
     589    width: element.style.width, 
     590    height: element.style.height 
     591  }; 
    577592  return new Effect.Parallel( 
    578593   [ new Effect.Scale(element, 200,  
     
    581596     Object.extend({ duration: 1.0,  
    582597      beforeSetupInternal: function(effect) { 
    583         effect.effects[0].element.setStyle({position: 'absolute'}); }, 
     598        Position.absolutize(effect.effects[0].element) 
     599      }, 
    584600      afterFinishInternal: function(effect) { 
    585601         effect.effects[0].element.hide(); 
     
    720736      effect.element.undoClipping();  
    721737      // IE will crash if child is undoPositioned first 
    722       if(/MSIE/.test(navigator.userAgent)){ 
     738      if(/MSIE/.test(navigator.userAgent) && !window.opera){ 
    723739        effect.element.undoPositioned(); 
    724740        effect.element.firstChild.undoPositioned();