Changeset 3033
- Timestamp:
- 11/14/05 20:49:10 (3 years ago)
- Files:
-
- trunk/actionpack/CHANGELOG (modified) (1 diff)
- trunk/actionpack/lib/action_view/helpers/javascripts/controls.js (modified) (2 diffs)
- trunk/actionpack/lib/action_view/helpers/javascripts/dragdrop.js (modified) (12 diffs)
- trunk/actionpack/lib/action_view/helpers/javascripts/effects.js (modified) (1 diff)
- trunk/railties/CHANGELOG (modified) (1 diff)
- trunk/railties/html/javascripts/controls.js (modified) (2 diffs)
- trunk/railties/html/javascripts/dragdrop.js (modified) (12 diffs)
- trunk/railties/html/javascripts/effects.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/actionpack/CHANGELOG
r3032 r3033 1 1 *SVN* 2 3 * Update to latest script.aculo.us version (as of [3031]) 2 4 3 5 * 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 81 81 show: function() { 82 82 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')) { 84 87 new Insertion.After(this.update, 85 88 '<iframe id="' + this.update.id + '_iefix" '+ … … 720 723 } 721 724 }; 725 726 // Delayed observer, like Form.Element.Observer, 727 // but waits for delay after last key input 728 // Ideal for live-search fields 729 730 Form.Element.DelayedObserver = Class.create(); 731 Form.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 1 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 //3 // Element.Class part Copyright (c) 2005 by Rick Olson4 2 // 5 3 // See scriptaculous.js for full license. … … 32 30 } 33 31 } 32 33 if(options.accept) options.accept = [options.accept].flatten(); 34 34 35 35 Element.makePositioned(element); // fix IE … … 50 50 this.isContained(element, drop)) && 51 51 ((!drop.accept) || 52 (Element.Class.has_any(element, drop.accept))) && 52 (Element.classNames(element).detect( 53 function(v) { return drop.accept.include(v) } ) )) && 53 54 Position.within(drop.element, pX, pY) ); 54 55 }, … … 56 57 deactivate: function(drop) { 57 58 if(drop.hoverclass) 58 Element. Class.remove(drop.element, drop.hoverclass);59 Element.removeClassName(drop.element, drop.hoverclass); 59 60 this.last_active = null; 60 61 }, … … 63 64 if(this.last_active) this.deactivate(this.last_active); 64 65 if(drop.hoverclass) 65 Element. Class.add(drop.element, drop.hoverclass);66 Element.addClassName(drop.element, drop.hoverclass); 66 67 this.last_active = drop; 67 68 }, … … 106 107 observers: [], 107 108 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 111 113 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 }); 115 128 } 116 129 } … … 139 152 this.element = $(element); 140 153 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]; 142 155 143 156 if(!this.handle) this.handle = $(options.handle); … … 220 233 221 234 if(success) Droppables.fire(event, this.element); 222 Draggables.notify('onEnd', this );235 Draggables.notify('onEnd', this, event); 223 236 224 237 var revert = this.options.revert; … … 291 304 } 292 305 293 Draggables.notify('onStart', this );306 Draggables.notify('onStart', this, event); 294 307 if(this.options.starteffect) this.options.starteffect(this.element); 295 308 } 296 309 297 310 Droppables.show(event, this.element); 311 Draggables.notify('onDrag', this, event); 298 312 this.draw(event); 299 313 if(this.options.change) this.options.change(this); … … 414 428 // handles are per-draggable 415 429 var handle = options.handle ? 416 Element. Class.childrenWith(e, options.handle)[0] : e;430 Element.childrenWithClassName(e, options.handle)[0] : e; 417 431 options.draggables.push( 418 432 new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); … … 435 449 $A(element.childNodes).each( function(e) { 436 450 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)))) 438 452 elements.push(e); 439 453 if(options.tree) { … … 492 506 Sortable._marker = $('dropmarker') || document.createElement('DIV'); 493 507 Element.hide(Sortable._marker); 494 Element. Class.add(Sortable._marker, 'dropmarker');508 Element.addClassName(Sortable._marker, 'dropmarker'); 495 509 Sortable._marker.style.position = 'absolute'; 496 510 document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); 497 511 } 498 512 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';501 513 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 502 522 Element.show(Sortable._marker); 503 523 }, trunk/actionpack/lib/action_view/helpers/javascripts/effects.js
r2802 r3033 87 87 } 88 88 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 } 89 Element.childrenWithClassName = function(element, className) { 90 return $A($(element).getElementsByTagName('*')).select( 91 function(c) { return Element.hasClassName(c, className) }); 180 92 } 181 93 trunk/railties/CHANGELOG
r3012 r3033 1 1 *SVN* 2 3 * Update to latest script.aculo.us version (as of [3031]) 2 4 3 5 * 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 81 81 show: function() { 82 82 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')) { 84 87 new Insertion.After(this.update, 85 88 '<iframe id="' + this.update.id + '_iefix" '+ … … 720 723 } 721 724 }; 725 726 // Delayed observer, like Form.Element.Observer, 727 // but waits for delay after last key input 728 // Ideal for live-search fields 729 730 Form.Element.DelayedObserver = Class.create(); 731 Form.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 1 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 //3 // Element.Class part Copyright (c) 2005 by Rick Olson4 2 // 5 3 // See scriptaculous.js for full license. … … 32 30 } 33 31 } 32 33 if(options.accept) options.accept = [options.accept].flatten(); 34 34 35 35 Element.makePositioned(element); // fix IE … … 50 50 this.isContained(element, drop)) && 51 51 ((!drop.accept) || 52 (Element.Class.has_any(element, drop.accept))) && 52 (Element.classNames(element).detect( 53 function(v) { return drop.accept.include(v) } ) )) && 53 54 Position.within(drop.element, pX, pY) ); 54 55 }, … … 56 57 deactivate: function(drop) { 57 58 if(drop.hoverclass) 58 Element. Class.remove(drop.element, drop.hoverclass);59 Element.removeClassName(drop.element, drop.hoverclass); 59 60 this.last_active = null; 60 61 }, … … 63 64 if(this.last_active) this.deactivate(this.last_active); 64 65 if(drop.hoverclass) 65 Element. Class.add(drop.element, drop.hoverclass);66 Element.addClassName(drop.element, drop.hoverclass); 66 67 this.last_active = drop; 67 68 }, … … 106 107 observers: [], 107 108 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 111 113 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 }); 115 128 } 116 129 } … … 139 152 this.element = $(element); 140 153 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]; 142 155 143 156 if(!this.handle) this.handle = $(options.handle); … … 220 233 221 234 if(success) Droppables.fire(event, this.element); 222 Draggables.notify('onEnd', this );235 Draggables.notify('onEnd', this, event); 223 236 224 237 var revert = this.options.revert; … … 291 304 } 292 305 293 Draggables.notify('onStart', this );306 Draggables.notify('onStart', this, event); 294 307 if(this.options.starteffect) this.options.starteffect(this.element); 295 308 } 296 309 297 310 Droppables.show(event, this.element); 311 Draggables.notify('onDrag', this, event); 298 312 this.draw(event); 299 313 if(this.options.change) this.options.change(this); … … 414 428 // handles are per-draggable 415 429 var handle = options.handle ? 416 Element. Class.childrenWith(e, options.handle)[0] : e;430 Element.childrenWithClassName(e, options.handle)[0] : e; 417 431 options.draggables.push( 418 432 new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); … … 435 449 $A(element.childNodes).each( function(e) { 436 450 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)))) 438 452 elements.push(e); 439 453 if(options.tree) { … … 492 506 Sortable._marker = $('dropmarker') || document.createElement('DIV'); 493 507 Element.hide(Sortable._marker); 494 Element. Class.add(Sortable._marker, 'dropmarker');508 Element.addClassName(Sortable._marker, 'dropmarker'); 495 509 Sortable._marker.style.position = 'absolute'; 496 510 document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); 497 511 } 498 512 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';501 513 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 502 522 Element.show(Sortable._marker); 503 523 }, trunk/railties/html/javascripts/effects.js
r2802 r3033 87 87 } 88 88 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 } 89 Element.childrenWithClassName = function(element, className) { 90 return $A($(element).getElementsByTagName('*')).select( 91 function(c) { return Element.hasClassName(c, className) }); 180 92 } 181 93