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

Changeset 3033

Show
Ignore:
Timestamp:
11/14/05 20:49:10 (3 years ago)
Author:
madrobby
Message:

Update trunk to latests script.aculo.us

Files:

Legend:

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

    r3032 r3033  
    11*SVN* 
     2 
     3* Update to latest script.aculo.us version (as of [3031]) 
    24 
    35* Updated docs for in_place_editor, fixes a couple bugs and offers extended support for external controls [Justin Palmer] 
  • trunk/actionpack/lib/action_view/helpers/javascripts/controls.js

    r2802 r3033  
    8181  show: function() { 
    8282    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); 
    83     if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && (Element.getStyle(this.update, 'position')=='absolute')) { 
     83    if(!this.iefix &&  
     84      (navigator.appVersion.indexOf('MSIE')>0) && 
     85      (navigator.userAgent.indexOf('Opera')<0) && 
     86      (Element.getStyle(this.update, 'position')=='absolute')) { 
    8487      new Insertion.After(this.update,  
    8588       '<iframe id="' + this.update.id + '_iefix" '+ 
     
    720723  } 
    721724}; 
     725 
     726// Delayed observer, like Form.Element.Observer,  
     727// but waits for delay after last key input 
     728// Ideal for live-search fields 
     729 
     730Form.Element.DelayedObserver = Class.create(); 
     731Form.Element.DelayedObserver.prototype = { 
     732  initialize: function(element, delay, callback) { 
     733    this.delay     = delay || 0.5; 
     734    this.element   = $(element); 
     735    this.callback  = callback; 
     736    this.timer     = null; 
     737    this.lastValue = $F(this.element);  
     738    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); 
     739  }, 
     740  delayedListener: function(event) { 
     741    if(this.lastValue == $F(this.element)) return; 
     742    if(this.timer) clearTimeout(this.timer); 
     743    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); 
     744    this.lastValue = $F(this.element); 
     745  }, 
     746  onTimerEvent: function() { 
     747    this.timer = null; 
     748    this.callback(this.element, $F(this.element)); 
     749  } 
     750}; 
  • trunk/actionpack/lib/action_view/helpers/javascripts/dragdrop.js

    r2802 r3033  
    11// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 
    2 //  
    3 // Element.Class part Copyright (c) 2005 by Rick Olson 
    42//  
    53// See scriptaculous.js for full license. 
     
    3230      } 
    3331    } 
     32     
     33    if(options.accept) options.accept = [options.accept].flatten(); 
    3434 
    3535    Element.makePositioned(element); // fix IE 
     
    5050        this.isContained(element, drop)) && 
    5151      ((!drop.accept) || 
    52         (Element.Class.has_any(element, drop.accept))) && 
     52        (Element.classNames(element).detect(  
     53          function(v) { return drop.accept.include(v) } ) )) && 
    5354      Position.within(drop.element, pX, pY) ); 
    5455  }, 
     
    5657  deactivate: function(drop) { 
    5758    if(drop.hoverclass) 
    58       Element.Class.remove(drop.element, drop.hoverclass); 
     59      Element.removeClassName(drop.element, drop.hoverclass); 
    5960    this.last_active = null; 
    6061  }, 
     
    6364    if(this.last_active) this.deactivate(this.last_active); 
    6465    if(drop.hoverclass) 
    65       Element.Class.add(drop.element, drop.hoverclass); 
     66      Element.addClassName(drop.element, drop.hoverclass); 
    6667    this.last_active = drop; 
    6768  }, 
     
    106107  observers: [], 
    107108  addObserver: function(observer) { 
    108     this.observers.push(observer);     
    109   }, 
    110   removeObserver: function(element) {  // element instead of obsever fixes mem leaks 
     109    this.observers.push(observer); 
     110    this._cacheObserverCallbacks(); 
     111  }, 
     112  removeObserver: function(element) {  // element instead of observer fixes mem leaks 
    111113    this.observers = this.observers.reject( function(o) { return o.element==element }); 
    112   }, 
    113   notify: function(eventName, draggable) {  // 'onStart', 'onEnd' 
    114     this.observers.invoke(eventName, draggable); 
     114    this._cacheObserverCallbacks(); 
     115  }, 
     116  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag' 
     117    if(this[eventName+'Count'] > 0) 
     118      this.observers.each( function(o) { 
     119        if(o[eventName]) o[eventName](eventName, draggable, event); 
     120      }); 
     121  }, 
     122  _cacheObserverCallbacks: function() { 
     123    ['onStart','onEnd','onDrag'].each( function(eventName) { 
     124      Draggables[eventName+'Count'] = Draggables.observers.select( 
     125        function(o) { return o[eventName]; } 
     126      ).length; 
     127    }); 
    115128  } 
    116129} 
     
    139152    this.element      = $(element); 
    140153    if(options.handle && (typeof options.handle == 'string')) 
    141       this.handle = Element.Class.childrenWith(this.element, options.handle)[0]; 
     154      this.handle = Element.childrenWithClassName(this.element, options.handle)[0]; 
    142155       
    143156    if(!this.handle) this.handle = $(options.handle); 
     
    220233 
    221234    if(success) Droppables.fire(event, this.element); 
    222     Draggables.notify('onEnd', this); 
     235    Draggables.notify('onEnd', this, event); 
    223236 
    224237    var revert = this.options.revert; 
     
    291304        } 
    292305 
    293         Draggables.notify('onStart', this); 
     306        Draggables.notify('onStart', this, event); 
    294307        if(this.options.starteffect) this.options.starteffect(this.element); 
    295308      } 
    296309 
    297310      Droppables.show(event, this.element); 
     311      Draggables.notify('onDrag', this, event); 
    298312      this.draw(event); 
    299313      if(this.options.change) this.options.change(this); 
     
    414428      // handles are per-draggable 
    415429      var handle = options.handle ?  
    416         Element.Class.childrenWith(e, options.handle)[0] : e;     
     430        Element.childrenWithClassName(e, options.handle)[0] : e;     
    417431      options.draggables.push( 
    418432        new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); 
     
    435449    $A(element.childNodes).each( function(e) { 
    436450      if(e.tagName && e.tagName==options.tag.toUpperCase() && 
    437         (!options.only || (Element.Class.has(e, options.only)))) 
     451        (!options.only || (Element.hasClassName(e, options.only)))) 
    438452          elements.push(e); 
    439453      if(options.tree) { 
     
    492506      Sortable._marker = $('dropmarker') || document.createElement('DIV'); 
    493507      Element.hide(Sortable._marker); 
    494       Element.Class.add(Sortable._marker, 'dropmarker'); 
     508      Element.addClassName(Sortable._marker, 'dropmarker'); 
    495509      Sortable._marker.style.position = 'absolute'; 
    496510      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); 
    497511    }     
    498512    var offsets = Position.cumulativeOffset(dropon); 
    499     Sortable._marker.style.top  = offsets[1] + 'px'; 
    500     if(position=='after') Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; 
    501513    Sortable._marker.style.left = offsets[0] + 'px'; 
     514    Sortable._marker.style.top = offsets[1] + 'px'; 
     515     
     516    if(position=='after') 
     517      if(sortable.overlap == 'horizontal')  
     518        Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px'; 
     519      else 
     520        Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; 
     521     
    502522    Element.show(Sortable._marker); 
    503523  }, 
  • trunk/actionpack/lib/action_view/helpers/javascripts/effects.js

    r2802 r3033  
    8787 
    8888  
    89 /*--------------------------------------------------------------------------*/   
    90   
    91 Element.Class = {   
    92     // Element.toggleClass(element, className) toggles the class being on/off   
    93     // Element.toggleClass(element, className1, className2) toggles between both classes,   
    94     //   defaulting to className1 if neither exist   
    95     toggle: function(element, className) {   
    96       if(Element.Class.has(element, className)) {   
    97         Element.Class.remove(element, className);   
    98         if(arguments.length == 3) Element.Class.add(element, arguments[2]);   
    99       } else {   
    100         Element.Class.add(element, className);   
    101         if(arguments.length == 3) Element.Class.remove(element, arguments[2]);   
    102       }   
    103     },   
    104   
    105     // gets space-delimited classnames of an element as an array   
    106     get: function(element) {   
    107       return $(element).className.split(' ');   
    108     },   
    109   
    110     // functions adapted from original functions by Gavin Kistner   
    111     remove: function(element) {   
    112       element = $(element);   
    113       var removeClasses = arguments;   
    114       $R(1,arguments.length-1).each( function(index) {   
    115         element.className =   
    116           element.className.split(' ').reject(   
    117             function(klass) { return (klass == removeClasses[index]) } ).join(' ');   
    118       });   
    119     },   
    120   
    121     add: function(element) {   
    122       element = $(element);   
    123       for(var i = 1; i < arguments.length; i++) {   
    124         Element.Class.remove(element, arguments[i]);   
    125         element.className += (element.className.length > 0 ? ' ' : '') + arguments[i];   
    126       }   
    127     },   
    128   
    129     // returns true if all given classes exist in said element   
    130     has: function(element) {   
    131       element = $(element);   
    132       if(!element || !element.className) return false;   
    133       var regEx;   
    134       for(var i = 1; i < arguments.length; i++) {   
    135         if((typeof arguments[i] == 'object') &&   
    136           (arguments[i].constructor == Array)) {   
    137           for(var j = 0; j < arguments[i].length; j++) {   
    138             regEx = new RegExp("(^|\\s)" + arguments[i][j] + "(\\s|$)");   
    139             if(!regEx.test(element.className)) return false;   
    140           }   
    141         } else {   
    142           regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)");   
    143           if(!regEx.test(element.className)) return false;   
    144         }   
    145       }   
    146       return true;   
    147     },   
    148   
    149     // expects arrays of strings and/or strings as optional paramters   
    150     // Element.Class.has_any(element, ['classA','classB','classC'], 'classD')   
    151     has_any: function(element) {   
    152       element = $(element);   
    153       if(!element || !element.className) return false;   
    154       var regEx;   
    155       for(var i = 1; i < arguments.length; i++) {   
    156         if((typeof arguments[i] == 'object') &&   
    157           (arguments[i].constructor == Array)) {   
    158           for(var j = 0; j < arguments[i].length; j++) {   
    159             regEx = new RegExp("(^|\\s)" + arguments[i][j] + "(\\s|$)");   
    160             if(regEx.test(element.className)) return true;   
    161           }   
    162         } else {   
    163           regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)");   
    164           if(regEx.test(element.className)) return true;   
    165         }   
    166       }   
    167       return false;   
    168     },   
    169   
    170     childrenWith: function(element, className) {   
    171       var children = $(element).getElementsByTagName('*');   
    172       var elements = new Array();   
    173   
    174       for (var i = 0; i < children.length; i++)   
    175         if (Element.Class.has(children[i], className))   
    176           elements.push(children[i]);   
    177   
    178       return elements;   
    179     }   
     89Element.childrenWithClassName = function(element, className) {   
     90  return $A($(element).getElementsByTagName('*')).select( 
     91    function(c) { return Element.hasClassName(c, className) }); 
    18092 
    18193  
  • trunk/railties/CHANGELOG

    r3012 r3033  
    11*SVN* 
     2 
     3* Update to latest script.aculo.us version (as of [3031]) 
    24 
    35* Eliminate Subversion dependencies in scripts/plugin.  Correct install options.  Introduce --force option to reinstall a plugin.  Remove useless --long option for list.  Use --quiet to quiet the download output and --revision to update to a specific svn revision.  #2842 [Chad Fowler, Rick Olson] 
  • trunk/railties/html/javascripts/controls.js

    r2802 r3033  
    8181  show: function() { 
    8282    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); 
    83     if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && (Element.getStyle(this.update, 'position')=='absolute')) { 
     83    if(!this.iefix &&  
     84      (navigator.appVersion.indexOf('MSIE')>0) && 
     85      (navigator.userAgent.indexOf('Opera')<0) && 
     86      (Element.getStyle(this.update, 'position')=='absolute')) { 
    8487      new Insertion.After(this.update,  
    8588       '<iframe id="' + this.update.id + '_iefix" '+ 
     
    720723  } 
    721724}; 
     725 
     726// Delayed observer, like Form.Element.Observer,  
     727// but waits for delay after last key input 
     728// Ideal for live-search fields 
     729 
     730Form.Element.DelayedObserver = Class.create(); 
     731Form.Element.DelayedObserver.prototype = { 
     732  initialize: function(element, delay, callback) { 
     733    this.delay     = delay || 0.5; 
     734    this.element   = $(element); 
     735    this.callback  = callback; 
     736    this.timer     = null; 
     737    this.lastValue = $F(this.element);  
     738    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); 
     739  }, 
     740  delayedListener: function(event) { 
     741    if(this.lastValue == $F(this.element)) return; 
     742    if(this.timer) clearTimeout(this.timer); 
     743    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); 
     744    this.lastValue = $F(this.element); 
     745  }, 
     746  onTimerEvent: function() { 
     747    this.timer = null; 
     748    this.callback(this.element, $F(this.element)); 
     749  } 
     750}; 
  • trunk/railties/html/javascripts/dragdrop.js

    r2802 r3033  
    11// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 
    2 //  
    3 // Element.Class part Copyright (c) 2005 by Rick Olson 
    42//  
    53// See scriptaculous.js for full license. 
     
    3230      } 
    3331    } 
     32     
     33    if(options.accept) options.accept = [options.accept].flatten(); 
    3434 
    3535    Element.makePositioned(element); // fix IE 
     
    5050        this.isContained(element, drop)) && 
    5151      ((!drop.accept) || 
    52         (Element.Class.has_any(element, drop.accept))) && 
     52        (Element.classNames(element).detect(  
     53          function(v) { return drop.accept.include(v) } ) )) && 
    5354      Position.within(drop.element, pX, pY) ); 
    5455  }, 
     
    5657  deactivate: function(drop) { 
    5758    if(drop.hoverclass) 
    58       Element.Class.remove(drop.element, drop.hoverclass); 
     59      Element.removeClassName(drop.element, drop.hoverclass); 
    5960    this.last_active = null; 
    6061  }, 
     
    6364    if(this.last_active) this.deactivate(this.last_active); 
    6465    if(drop.hoverclass) 
    65       Element.Class.add(drop.element, drop.hoverclass); 
     66      Element.addClassName(drop.element, drop.hoverclass); 
    6667    this.last_active = drop; 
    6768  }, 
     
    106107  observers: [], 
    107108  addObserver: function(observer) { 
    108     this.observers.push(observer);     
    109   }, 
    110   removeObserver: function(element) {  // element instead of obsever fixes mem leaks 
     109    this.observers.push(observer); 
     110    this._cacheObserverCallbacks(); 
     111  }, 
     112  removeObserver: function(element) {  // element instead of observer fixes mem leaks 
    111113    this.observers = this.observers.reject( function(o) { return o.element==element }); 
    112   }, 
    113   notify: function(eventName, draggable) {  // 'onStart', 'onEnd' 
    114     this.observers.invoke(eventName, draggable); 
     114    this._cacheObserverCallbacks(); 
     115  }, 
     116  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag' 
     117    if(this[eventName+'Count'] > 0) 
     118      this.observers.each( function(o) { 
     119        if(o[eventName]) o[eventName](eventName, draggable, event); 
     120      }); 
     121  }, 
     122  _cacheObserverCallbacks: function() { 
     123    ['onStart','onEnd','onDrag'].each( function(eventName) { 
     124      Draggables[eventName+'Count'] = Draggables.observers.select( 
     125        function(o) { return o[eventName]; } 
     126      ).length; 
     127    }); 
    115128  } 
    116129} 
     
    139152    this.element      = $(element); 
    140153    if(options.handle && (typeof options.handle == 'string')) 
    141       this.handle = Element.Class.childrenWith(this.element, options.handle)[0]; 
     154      this.handle = Element.childrenWithClassName(this.element, options.handle)[0]; 
    142155       
    143156    if(!this.handle) this.handle = $(options.handle); 
     
    220233 
    221234    if(success) Droppables.fire(event, this.element); 
    222     Draggables.notify('onEnd', this); 
     235    Draggables.notify('onEnd', this, event); 
    223236 
    224237    var revert = this.options.revert; 
     
    291304        } 
    292305 
    293         Draggables.notify('onStart', this); 
     306        Draggables.notify('onStart', this, event); 
    294307        if(this.options.starteffect) this.options.starteffect(this.element); 
    295308      } 
    296309 
    297310      Droppables.show(event, this.element); 
     311      Draggables.notify('onDrag', this, event); 
    298312      this.draw(event); 
    299313      if(this.options.change) this.options.change(this); 
     
    414428      // handles are per-draggable 
    415429      var handle = options.handle ?  
    416         Element.Class.childrenWith(e, options.handle)[0] : e;     
     430        Element.childrenWithClassName(e, options.handle)[0] : e;     
    417431      options.draggables.push( 
    418432        new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); 
     
    435449    $A(element.childNodes).each( function(e) { 
    436450      if(e.tagName && e.tagName==options.tag.toUpperCase() && 
    437         (!options.only || (Element.Class.has(e, options.only)))) 
     451        (!options.only || (Element.hasClassName(e, options.only)))) 
    438452          elements.push(e); 
    439453      if(options.tree) { 
     
    492506      Sortable._marker = $('dropmarker') || document.createElement('DIV'); 
    493507      Element.hide(Sortable._marker); 
    494       Element.Class.add(Sortable._marker, 'dropmarker'); 
     508      Element.addClassName(Sortable._marker, 'dropmarker'); 
    495509      Sortable._marker.style.position = 'absolute'; 
    496510      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); 
    497511    }     
    498512    var offsets = Position.cumulativeOffset(dropon); 
    499     Sortable._marker.style.top  = offsets[1] + 'px'; 
    500     if(position=='after') Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; 
    501513    Sortable._marker.style.left = offsets[0] + 'px'; 
     514    Sortable._marker.style.top = offsets[1] + 'px'; 
     515     
     516    if(position=='after') 
     517      if(sortable.overlap == 'horizontal')  
     518        Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px'; 
     519      else 
     520        Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; 
     521     
    502522    Element.show(Sortable._marker); 
    503523  }, 
  • trunk/railties/html/javascripts/effects.js

    r2802 r3033  
    8787 
    8888  
    89 /*--------------------------------------------------------------------------*/   
    90   
    91 Element.Class = {   
    92     // Element.toggleClass(element, className) toggles the class being on/off   
    93     // Element.toggleClass(element, className1, className2) toggles between both classes,   
    94     //   defaulting to className1 if neither exist   
    95     toggle: function(element, className) {   
    96       if(Element.Class.has(element, className)) {   
    97         Element.Class.remove(element, className);   
    98         if(arguments.length == 3) Element.Class.add(element, arguments[2]);   
    99       } else {   
    100         Element.Class.add(element, className);   
    101         if(arguments.length == 3) Element.Class.remove(element, arguments[2]);   
    102       }   
    103     },   
    104   
    105     // gets space-delimited classnames of an element as an array   
    106     get: function(element) {   
    107       return $(element).className.split(' ');   
    108     },   
    109   
    110     // functions adapted from original functions by Gavin Kistner   
    111     remove: function(element) {   
    112       element = $(element);   
    113       var removeClasses = arguments;   
    114       $R(1,arguments.length-1).each( function(index) {   
    115         element.className =   
    116           element.className.split(' ').reject(   
    117             function(klass) { return (klass == removeClasses[index]) } ).join(' ');   
    118       });   
    119     },   
    120   
    121     add: function(element) {   
    122       element = $(element);   
    123       for(var i = 1; i < arguments.length; i++) {   
    124         Element.Class.remove(element, arguments[i]);   
    125         element.className += (element.className.length > 0 ? ' ' : '') + arguments[i];   
    126       }   
    127     },   
    128   
    129     // returns true if all given classes exist in said element   
    130     has: function(element) {   
    131       element = $(element);   
    132       if(!element || !element.className) return false;   
    133       var regEx;   
    134       for(var i = 1; i < arguments.length; i++) {   
    135         if((typeof arguments[i] == 'object') &&   
    136           (arguments[i].constructor == Array)) {   
    137           for(var j = 0; j < arguments[i].length; j++) {   
    138             regEx = new RegExp("(^|\\s)" + arguments[i][j] + "(\\s|$)");   
    139             if(!regEx.test(element.className)) return false;   
    140           }   
    141         } else {   
    142           regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)");   
    143           if(!regEx.test(element.className)) return false;   
    144         }   
    145       }   
    146       return true;   
    147     },   
    148   
    149     // expects arrays of strings and/or strings as optional paramters   
    150     // Element.Class.has_any(element, ['classA','classB','classC'], 'classD')   
    151     has_any: function(element) {   
    152       element = $(element);   
    153       if(!element || !element.className) return false;   
    154       var regEx;   
    155       for(var i = 1; i < arguments.length; i++) {   
    156         if((typeof arguments[i] == 'object') &&   
    157           (arguments[i].constructor == Array)) {   
    158           for(var j = 0; j < arguments[i].length; j++) {   
    159             regEx = new RegExp("(^|\\s)" + arguments[i][j] + "(\\s|$)");   
    160             if(regEx.test(element.className)) return true;   
    161           }   
    162         } else {   
    163           regEx = new RegExp("(^|\\s)" + arguments[i] + "(\\s|$)");   
    164           if(regEx.test(element.className)) return true;   
    165         }   
    166       }   
    167       return false;   
    168     },   
    169   
    170     childrenWith: function(element, className) {   
    171       var children = $(element).getElementsByTagName('*');   
    172       var elements = new Array();   
    173   
    174       for (var i = 0; i < children.length; i++)   
    175         if (Element.Class.has(children[i], className))   
    176           elements.push(children[i]);   
    177   
    178       return elements;   
    179     }   
     89Element.childrenWithClassName = function(element, className) {   
     90  return $A($(element).getElementsByTagName('*')).select( 
     91    function(c) { return Element.hasClassName(c, className) }); 
    18092 
    18193