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

Changeset 5012

Show
Ignore:
Timestamp:
09/05/06 04:17:06 (2 years ago)
Author:
sam
Message:

Update to Prototype 1.5.0_rc1

Files:

Legend:

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

    r5004 r5012  
    11*SVN* 
     2 
     3* Update to Prototype 1.5.0_rc1 [sam] 
    24 
    35* Added access to nested attributes in RJS #4548 [richcollins@gmail.com]. Examples: 
  • trunk/actionpack/lib/action_view/helpers/javascripts/prototype.js

    r4375 r5012  
    1 /*  Prototype JavaScript framework, version 1.5.0_rc0 
     1/*  Prototype JavaScript framework, version 1.5.0_rc1 
    22 *  (c) 2005 Sam Stephenson <sam@conio.net> 
    33 * 
     
    88 
    99var Prototype = { 
    10   Version: '1.5.0_rc0', 
     10  Version: '1.5.0_rc1', 
    1111  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 
    1212 
     
    3232} 
    3333 
    34 Object.inspect = function(object) { 
    35   try { 
    36     if (object == undefined) return 'undefined'; 
    37     if (object == null) return 'null'; 
    38     return object.inspect ? object.inspect() : object.toString(); 
    39   } catch (e) { 
    40     if (e instanceof RangeError) return '...'; 
    41     throw e; 
    42   } 
    43 
     34Object.extend(Object, { 
     35  inspect: function(object) { 
     36    try { 
     37      if (object == undefined) return 'undefined'; 
     38      if (object == null) return 'null'; 
     39      return object.inspect ? object.inspect() : object.toString(); 
     40    } catch (e) { 
     41      if (e instanceof RangeError) return '...'; 
     42      throw e; 
     43    } 
     44  }, 
     45 
     46  keys: function(object) { 
     47    var keys = []; 
     48    for (var property in object) 
     49      keys.push(property); 
     50    return keys; 
     51  }, 
     52 
     53  values: function(object) { 
     54    var values = []; 
     55    for (var property in object) 
     56      values.push(object[property]); 
     57    return values; 
     58  }, 
     59 
     60  clone: function(object) { 
     61    return Object.extend({}, object); 
     62  } 
     63}); 
    4464 
    4565Function.prototype.bind = function() { 
     
    5171 
    5272Function.prototype.bindAsEventListener = function(object) { 
    53   var __method = this
     73  var __method = this, args = $A(arguments), object = args.shift()
    5474  return function(event) { 
    55     return __method.call(object, event || window.event); 
     75    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); 
    5676  } 
    5777} 
     
    103123 
    104124  registerCallback: function() { 
    105     setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 
     125    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 
     126  }, 
     127 
     128  stop: function() { 
     129    if (!this.timer) return; 
     130    clearInterval(this.timer); 
     131    this.timer = null; 
    106132  }, 
    107133 
     
    110136      try { 
    111137        this.currentlyExecuting = true; 
    112         this.callback(); 
     138        this.callback(this); 
    113139      } finally { 
    114140        this.currentlyExecuting = false; 
     
    196222    var pairs = this.match(/^\??(.*)$/)[1].split('&'); 
    197223    return pairs.inject({}, function(params, pairString) { 
    198       var pair = pairString.split('='); 
    199       params[pair[0]] = pair[1]; 
     224      var pair  = pairString.split('='); 
     225      var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; 
     226      params[decodeURIComponent(pair[0])] = value; 
    200227      return params; 
    201228    }); 
     
    222249  }, 
    223250 
    224   inspect: function() { 
    225     return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'"; 
     251  inspect: function(useDoubleQuotes) { 
     252    var escapedString = this.replace(/\\/g, '\\\\'); 
     253    if (useDoubleQuotes) 
     254      return '"' + escapedString.replace(/"/g, '\\"') + '"'; 
     255    else 
     256      return "'" + escapedString.replace(/'/g, '\\\'') + "'"; 
    226257  } 
    227258}); 
     
    281312 
    282313  any: function(iterator) { 
    283     var result = true; 
     314    var result = false; 
    284315    this.each(function(value, index) { 
    285316      if (result = !!(iterator || Prototype.K)(value, index)) 
     
    500531  }, 
    501532 
     533  reduce: function() { 
     534    return this.length > 1 ? this : this[0]; 
     535  }, 
     536 
     537  uniq: function() { 
     538    return this.inject([], function(array, value) { 
     539      return array.include(value) ? array : array.concat([value]); 
     540    }); 
     541  }, 
     542 
    502543  inspect: function() { 
    503544    return '[' + this.map(Object.inspect).join(', ') + ']'; 
     
    562603  _each: function(iterator) { 
    563604    var value = this.start; 
    564     do
     605    while (this.include(value))
    565606      iterator(value); 
    566607      value = value.succ(); 
    567     } while (this.include(value)); 
     608    } 
    568609  }, 
    569610 
     
    672713    /* Simulate other verbs over post */ 
    673714    if (this.options.method != 'get' && this.options.method != 'post') { 
    674       parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method 
    675       this.options.method = 'post' 
     715      parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method; 
     716      this.options.method = 'post'; 
    676717    } 
    677718 
     
    686727        this.options.asynchronous); 
    687728 
    688       if (this.options.asynchronous) { 
    689         this.transport.onreadystatechange = this.onStateChange.bind(this); 
    690         setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); 
    691       } 
    692  
     729      if (this.options.asynchronous) 
     730        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); 
     731 
     732      this.transport.onreadystatechange = this.onStateChange.bind(this); 
    693733      this.setRequestHeaders(); 
    694734 
    695735      var body = this.options.postBody ? this.options.postBody : parameters; 
    696736      this.transport.send(this.options.method == 'post' ? body : null); 
     737 
     738      /* Force Firefox to handle ready state 4 for synchronous requests */ 
     739      if (!this.options.asynchronous && this.transport.overrideMimeType) 
     740        this.onStateChange(); 
    697741 
    698742    } catch (e) { 
     
    853897 
    854898  stop: function() { 
    855     this.updater.onComplete = undefined; 
     899    this.updater.options.onComplete = undefined; 
    856900    clearTimeout(this.timer); 
    857901    (this.onComplete || Prototype.emptyFunction).apply(this, arguments); 
     
    881925    results.push(Element.extend(element)); 
    882926  } 
    883   return results.length < 2 ? results[0] : results
     927  return results.reduce()
    884928} 
    885929 
     
    903947 
    904948  if (!element._extended && element.tagName && element != window) { 
    905     var methods = Element.Methods, cache = Element.extend.cache; 
    906     for (property in methods) { 
     949    var methods = Object.clone(Element.Methods), cache = Element.extend.cache; 
     950 
     951    if (element.tagName == 'FORM') 
     952      Object.extend(methods, Form.Methods); 
     953    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) 
     954      Object.extend(methods, Form.Element.Methods); 
     955 
     956    for (var property in methods) { 
    907957      var value = methods[property]; 
    908958      if (typeof value == 'function') 
     
    928978  }, 
    929979 
    930   toggle: function() { 
    931     for (var i = 0; i < arguments.length; i++) { 
    932       var element = $(arguments[i]); 
    933       Element[Element.visible(element) ? 'hide' : 'show'](element); 
    934     } 
    935   }, 
    936  
    937   hide: function() { 
    938     for (var i = 0; i < arguments.length; i++) { 
    939       var element = $(arguments[i]); 
    940       element.style.display = 'none'; 
    941     } 
    942   }, 
    943  
    944   show: function() { 
    945     for (var i = 0; i < arguments.length; i++) { 
    946       var element = $(arguments[i]); 
    947       element.style.display = ''; 
    948     } 
     980  toggle: function(element) { 
     981    element = $(element); 
     982    Element[Element.visible(element) ? 'hide' : 'show'](element); 
     983    return element; 
     984  }, 
     985 
     986  hide: function(element) { 
     987    $(element).style.display = 'none'; 
     988    return element; 
     989  }, 
     990 
     991  show: function(element) { 
     992    $(element).style.display = ''; 
     993    return element; 
    949994  }, 
    950995 
     
    952997    element = $(element); 
    953998    element.parentNode.removeChild(element); 
     999    return element; 
    9541000  }, 
    9551001 
     
    9571003    $(element).innerHTML = html.stripScripts(); 
    9581004    setTimeout(function() {html.evalScripts()}, 10); 
     1005    return element; 
    9591006  }, 
    9601007 
     
    9701017    } 
    9711018    setTimeout(function() {html.evalScripts()}, 10); 
     1019    return element; 
     1020  }, 
     1021 
     1022  inspect: function(element) { 
     1023    element = $(element); 
     1024    var result = '<' + element.tagName.toLowerCase(); 
     1025    $H({'id': 'id', 'className': 'class'}).each(function(pair) { 
     1026      var property = pair.first(), attribute = pair.last(); 
     1027      var value = (element[property] || '').toString(); 
     1028      if (value) result += ' ' + attribute + '=' + value.inspect(true); 
     1029    }); 
     1030    return result + '>'; 
     1031  }, 
     1032 
     1033  recursivelyCollect: function(element, property) { 
     1034    element = $(element); 
     1035    var elements = []; 
     1036    while (element = element[property]) 
     1037      if (element.nodeType == 1) 
     1038        elements.push(Element.extend(element)); 
     1039    return elements; 
     1040  }, 
     1041 
     1042  ancestors: function(element) { 
     1043    return $(element).recursivelyCollect('parentNode'); 
     1044  }, 
     1045 
     1046  descendants: function(element) { 
     1047    element = $(element); 
     1048    return $A(element.getElementsByTagName('*')); 
     1049  }, 
     1050 
     1051  previousSiblings: function(element) { 
     1052    return $(element).recursivelyCollect('previousSibling'); 
     1053  }, 
     1054 
     1055  nextSiblings: function(element) { 
     1056    return $(element).recursivelyCollect('nextSibling'); 
     1057  }, 
     1058 
     1059  siblings: function(element) { 
     1060    element = $(element); 
     1061    return element.previousSiblings().reverse().concat(element.nextSiblings()); 
     1062  }, 
     1063 
     1064  match: function(element, selector) { 
     1065    element = $(element); 
     1066    if (typeof selector == 'string') 
     1067      selector = new Selector(selector); 
     1068    return selector.match(element); 
     1069  }, 
     1070 
     1071  up: function(element, expression, index) { 
     1072    return Selector.findElement($(element).ancestors(), expression, index); 
     1073  }, 
     1074 
     1075  down: function(element, expression, index) { 
     1076    return Selector.findElement($(element).descendants(), expression, index); 
     1077  }, 
     1078 
     1079  previous: function(element, expression, index) { 
     1080    return Selector.findElement($(element).previousSiblings(), expression, index); 
     1081  }, 
     1082 
     1083  next: function(element, expression, index) { 
     1084    return Selector.findElement($(element).nextSiblings(), expression, index); 
     1085  }, 
     1086 
     1087  getElementsBySelector: function() { 
     1088    var args = $A(arguments), element = $(args.shift()); 
     1089    return Selector.findChildElements(element, args); 
     1090  }, 
     1091 
     1092  getElementsByClassName: function(element, className) { 
     1093    element = $(element); 
     1094    return document.getElementsByClassName(className, element); 
    9721095  }, 
    9731096 
     
    9881111  addClassName: function(element, className) { 
    9891112    if (!(element = $(element))) return; 
    990     return Element.classNames(element).add(className); 
     1113    Element.classNames(element).add(className); 
     1114    return element; 
    9911115  }, 
    9921116 
    9931117  removeClassName: function(element, className) { 
    9941118    if (!(element = $(element))) return; 
    995     return Element.classNames(element).remove(className); 
     1119    Element.classNames(element).remove(className); 
     1120    return element; 
     1121  }, 
     1122 
     1123  observe: function() { 
     1124    Event.observe.apply(Event, arguments); 
     1125    return $A(arguments).first(); 
     1126  }, 
     1127 
     1128  stopObserving: function() { 
     1129    Event.stopObserving.apply(Event, arguments); 
     1130    return $A(arguments).first(); 
    9961131  }, 
    9971132 
     
    10041139        Element.remove(node); 
    10051140    } 
     1141    return element; 
    10061142  }, 
    10071143 
     
    10221158        y = element.y ? element.y : element.offsetTop; 
    10231159    window.scrollTo(x, y); 
     1160    return element; 
    10241161  }, 
    10251162 
     
    10461183    for (var name in style) 
    10471184      element.style[name.camelize()] = style[name]; 
     1185    return element; 
    10481186  }, 
    10491187 
     
    10821220      } 
    10831221    } 
     1222    return element; 
    10841223  }, 
    10851224 
     
    10941233        element.style.right = ''; 
    10951234    } 
     1235    return element; 
    10961236  }, 
    10971237 
     
    10991239    element = $(element); 
    11001240    if (element._overflow) return; 
    1101     element._overflow = element.style.overflow
     1241    element._overflow = element.style.overflow || 'auto'
    11021242    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') 
    11031243      element.style.overflow = 'hidden'; 
     1244    return element; 
    11041245  }, 
    11051246 
    11061247  undoClipping: function(element) { 
    11071248    element = $(element); 
    1108     if (element._overflow) return; 
    1109     element.style.overflow = element._overflow; 
    1110     element._overflow = undefined; 
     1249    if (!element._overflow) return; 
     1250    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; 
     1251    delete element._overflow; 
     1252    return element; 
     1253  } 
     1254
     1255 
     1256// IE is missing .innerHTML support for TABLE-related elements 
     1257if(document.all){ 
     1258  Element.Methods.update = function(element, html) { 
     1259    element = $(element); 
     1260    var tagName = element.tagName.toUpperCase(); 
     1261    if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) { 
     1262      var div = document.createElement('div'); 
     1263      switch (tagName) { 
     1264        case 'THEAD': 
     1265        case 'TBODY': 
     1266          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>'; 
     1267          depth = 2; 
     1268          break; 
     1269        case 'TR': 
     1270          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>'; 
     1271          depth = 3; 
     1272          break; 
     1273        case 'TD': 
     1274          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>'; 
     1275          depth = 4; 
     1276      } 
     1277      $A(element.childNodes).each(function(node){ 
     1278        element.removeChild(node) 
     1279      }); 
     1280      depth.times(function(){ div = div.firstChild }); 
     1281 
     1282      $A(div.childNodes).each( 
     1283        function(node){ element.appendChild(node) }); 
     1284    } else { 
     1285      element.innerHTML = html.stripScripts(); 
     1286    } 
     1287    setTimeout(function() {html.evalScripts()}, 10); 
     1288    return element; 
    11111289  } 
    11121290} 
     
    11161294var _nativeExtensions = false; 
    11171295 
    1118 if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 
    1119   var HTMLElement = {} 
    1120   HTMLElement.prototype = document.createElement('div').__proto__; 
     1296if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 
     1297  /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement, 
     1298     and HTMLSelectElement in Safari */ 
     1299  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { 
     1300    var klass = window['HTML' + tag + 'Element'] = {}; 
     1301    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; 
     1302  }); 
    11211303} 
    11221304 
     
    11241306  Object.extend(Element.Methods, methods || {}); 
    11251307 
    1126   if(typeof HTMLElement != 'undefined') { 
    1127     var methods = Element.Methods, cache = Element.extend.cache; 
    1128     for (property in methods) { 
     1308  function copy(methods, destination) { 
     1309    var cache = Element.extend.cache; 
     1310    for (var property in methods) { 
    11291311      var value = methods[property]; 
    1130       if (typeof value == 'function') 
    1131         HTMLElement.prototype[property] = cache.findOrStore(value); 
    1132     } 
     1312      destination[property] = cache.findOrStore(value); 
     1313    } 
     1314  } 
     1315 
     1316  if (typeof HTMLElement != 'undefined') { 
     1317    copy(Element.Methods, HTMLElement.prototype); 
     1318    copy(Form.Methods, HTMLFormElement.prototype); 
     1319    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { 
     1320      copy(Form.Element.Methods, klass.prototype); 
     1321    }); 
    11331322    _nativeExtensions = true; 
    11341323  } 
    11351324} 
    1136  
    1137 Element.addMethods(); 
    11381325 
    11391326var Toggle = new Object(); 
     
    13731560} 
    13741561 
     1562Object.extend(Selector, { 
     1563  matchElements: function(elements, expression) { 
     1564    var selector = new Selector(expression); 
     1565    return elements.select(selector.match.bind(selector)); 
     1566  }, 
     1567 
     1568  findElement: function(elements, expression, index) { 
     1569    if (typeof expression == 'number') index = expression, expression = false; 
     1570    return Selector.matchElements(elements, expression || '*')[index || 0]; 
     1571  }, 
     1572 
     1573  findChildElements: function(element, expressions) { 
     1574    return expressions.map(function(expression) { 
     1575      return expression.strip().split(/\s+/).inject([null], function(results, expr) { 
     1576        var selector = new Selector(expr); 
     1577        return results.inject([], function(elements, result) { 
     1578          return elements.concat(selector.findElements(result || element)); 
     1579        }); 
     1580      }); 
     1581    }).flatten(); 
     1582  } 
     1583}); 
     1584 
    13751585function $$() { 
    1376   return $A(arguments).map(function(expression) { 
    1377     return expression.strip().split(/\s+/).inject([null], function(results, expr) { 
    1378       var selector = new Selector(expr); 
    1379       return results.map(selector.findElements.bind(selector)).flatten(); 
    1380     }); 
    1381   }).flatten(); 
    1382 
    1383 var Field = { 
    1384   clear: function() { 
    1385     for (var i = 0; i < arguments.length; i++) 
    1386       $(arguments[i]).value = ''; 
    1387   }, 
    1388  
    1389   focus: function(element) { 
    1390     $(element).focus(); 
    1391   }, 
    1392  
    1393   present: function() { 
    1394     for (var i = 0; i < arguments.length; i++) 
    1395       if ($(arguments[i]).value == '') return false; 
    1396     return true; 
    1397   }, 
    1398  
    1399   select: function(element) { 
    1400     $(element).select(); 
    1401   }, 
    1402  
    1403   activate: function(element) { 
    1404     element = $(element); 
    1405     element.focus(); 
    1406     if (element.select) 
    1407       element.select(); 
    1408   } 
    1409 
    1410  
    1411 /*--------------------------------------------------------------------------*/ 
    1412  
     1586  return Selector.findChildElements(document, $A(arguments)); 
     1587
    14131588var Form = { 
     1589  reset: function(form) { 
     1590    $(form).reset(); 
     1591    return form; 
     1592  } 
     1593}; 
     1594 
     1595Form.Methods = { 
    14141596  serialize: function(form) { 
    14151597    var elements = Form.getElements($(form)); 
     
    14571639 
    14581640  disable: function(form) { 
     1641    form = $(form); 
    14591642    var elements = Form.getElements(form); 
    14601643    for (var i = 0; i < elements.length; i++) { 
     
    14631646      element.disabled = 'true'; 
    14641647    } 
     1648    return form; 
    14651649  }, 
    14661650 
    14671651  enable: function(form) { 
     1652    form = $(form); 
    14681653    var elements = Form.getElements(form); 
    14691654    for (var i = 0; i < elements.length; i++) { 
     
    14711656      element.disabled = ''; 
    14721657    } 
     1658    return form; 
    14731659  }, 
    14741660 
     
    14811667 
    14821668  focusFirstElement: function(form) { 
     1669    form = $(form); 
    14831670    Field.activate(Form.findFirstElement(form)); 
    1484   }, 
    1485  
    1486   reset: function(form) { 
    1487     $(form).reset(); 
    1488   } 
    1489 
     1671    return form; 
     1672  } 
     1673
     1674 
     1675Object.extend(Form, Form.Methods); 
     1676 
     1677/*--------------------------------------------------------------------------*/ 
    14901678 
    14911679Form.Element = { 
     1680  focus: function(element) { 
     1681    $(element).focus(); 
     1682    return element; 
     1683  }, 
     1684 
     1685  select: function(element) { 
     1686    $(element).select(); 
     1687    return element; 
     1688  } 
     1689} 
     1690 
     1691Form.Element.Methods = { 
    14921692  serialize: function(element) { 
    14931693    element = $(element); 
     
    15151715    if (parameter) 
    15161716      return parameter[1]; 
    1517   } 
    1518 
     1717  }, 
     1718 
     1719  clear: function(element) { 
     1720    $(element).value = ''; 
     1721    return element; 
     1722  }, 
     1723 
     1724  present: function(element) { 
     1725    return $(element).value != ''; 
     1726  }, 
     1727 
     1728  activate: function(element) { 
     1729    element = $(element); 
     1730    element.focus(); 
     1731    if (element.select) 
     1732      element.select(); 
     1733    return element; 
     1734  }, 
     1735 
     1736  disable: function(element) { 
     1737    element = $(element); 
     1738    element.disabled = ''; 
     1739    return element; 
     1740  }, 
     1741 
     1742  enable: function(element) { 
     1743    element = $(element); 
     1744    element.blur(); 
     1745    element.disabled = 'true'; 
     1746    return element; 
     1747  } 
     1748
     1749 
     1750Object.extend(Form.Element, Form.Element.Methods); 
     1751var Field = Form.Element; 
     1752 
     1753/*--------------------------------------------------------------------------*/ 
    15191754 
    15201755Form.Element.Serializers = { 
    15211756  input: function(element) { 
    15221757    switch (element.type.toLowerCase()) { 
    1523       case 'submit': 
    1524       case 'hidden': 
    1525       case 'password': 
    1526       case 'text': 
    1527         return Form.Element.Serializers.textarea(element); 
    15281758      case 'checkbox': 
    15291759      case 'radio': 
    15301760        return Form.Element.Serializers.inputSelector(element); 
     1761      default: 
     1762        return Form.Element.Serializers.textarea(element); 
    15311763    } 
    15321764    return false; 
     
    16471879          Event.observe(element, 'click', this.onElementEvent.bind(this)); 
    16481880          break; 
    1649         case 'password': 
    1650         case 'text': 
    1651         case 'textarea': 
    1652         case 'select-one': 
    1653         case 'select-multiple': 
     1881        default: 
    16541882          Event.observe(element, 'change', this.onElementEvent.bind(this)); 
    16551883          break; 
     
    16861914  KEY_DOWN:     40, 
    16871915  KEY_DELETE:   46, 
     1916  KEY_HOME:     36, 
     1917  KEY_END:      35, 
     1918  KEY_PAGEUP:   33, 
     1919  KEY_PAGEDOWN: 34, 
    16881920 
    16891921  element: function(event) { 
     
    17491981 
    17501982  observe: function(element, name, observer, useCapture) { 
    1751     var element = $(element); 
     1983    element = $(element); 
    17521984    useCapture = useCapture || false; 
    17531985 
     
    17571989      name = 'keydown'; 
    17581990 
    1759     this._observeAndCache(element, name, observer, useCapture); 
     1991    Event._observeAndCache(element, name, observer, useCapture); 
    17601992  }, 
    17611993 
    17621994  stopObserving: function(element, name, observer, useCapture) { 
    1763     var element = $(element); 
     1995    element = $(element); 
    17641996    useCapture = useCapture || false; 
    17651997 
     
    17722004      element.removeEventListener(name, observer, useCapture); 
    17732005    } else if (element.detachEvent) { 
    1774       element.detachEvent('on' + name, observer); 
     2006      try { 
     2007        element.detachEvent('on' + name, observer); 
     2008      } catch (e) {} 
    17752009    } 
    17762010  } 
     
    18822116  }, 
    18832117 
    1884   clone: function(source, target) { 
    1885     source = $(source); 
    1886     target = $(target); 
    1887     target.style.position = 'absolute'; 
    1888     var offsets = this.cumulativeOffset(source); 
    1889     target.style.top    = offsets[1] + 'px'; 
    1890     target.style.left   = offsets[0] + 'px'; 
    1891     target.style.width  = source.offsetWidth + 'px'; 
    1892     target.style.height = source.offsetHeight + 'px'; 
    1893   }, 
    1894  
    18952118  page: function(forElement) { 
    18962119    var valueT = 0, valueL = 0; 
     
    19092132    element = forElement; 
    19102133    do { 
    1911       valueT -= element.scrollTop  || 0; 
    1912       valueL -= element.scrollLeft || 0; 
     2134      if (!window.opera || element.tagName=='BODY') { 
     2135        valueT -= element.scrollTop  || 0; 
     2136        valueL -= element.scrollLeft || 0; 
     2137      } 
    19132138    } while (element = element.parentNode); 
    19142139 
     
    20112236  } 
    20122237} 
     2238 
     2239Element.addMethods(); 
  • trunk/railties/CHANGELOG

    r4960 r5012  
    11*SVN* 
     2 
     3* Update to Prototype 1.5.0_rc1 [sam] 
    24 
    35* Formally Deprecate the old rake tasks. [Koz] 
  • trunk/railties/html/javascripts/prototype.js

    <
    r4376 r5012  
    1 /*  Prototype JavaScript framework, version 1.5.0_rc0 
     1/*  Prototype JavaScript framework, version 1.5.0_rc1 
    22 *  (c) 2005 Sam Stephenson <sam@conio.net> 
    33 * 
     
    88 
    99var Prototype = { 
    10   Version: '1.5.0_rc0', 
     10  Version: '1.5.0_rc1', 
    1111  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 
    1212 
     
    3232} 
    3333 
    34 Object.inspect = function(object) { 
    35   try { 
    36     if (object == undefined) return 'undefined'; 
    37     if (object == null) return 'null'; 
    38     return object.inspect ? object.inspect() : object.toString(); 
    39   } catch (e) { 
    40     if (e instanceof RangeError) return '...'; 
    41     throw e; 
    42   } 
    43 
     34Object.extend(Object, { 
     35  inspect: function(object) { 
     36    try { 
     37      if (object == undefined) return 'undefined'; 
     38      if (object == null) return 'null'; 
     39      return object.inspect ? object.inspect() : object.toString(); 
     40    } catch (e) { 
     41      if (e instanceof RangeError) return '...'; 
     42      throw e; 
     43    } 
     44  }, 
     45 
     46  keys: function(object) { 
     47    var keys = []; 
     48    for (var property in object) 
     49      keys.push(property); 
     50    return keys; 
     51  }, 
     52 
     53  values: function(object) { 
     54    var values = []; 
     55    for (var property in object) 
     56      values.push(object[property]); 
     57    return values; 
     58  }, 
     59 
     60  clone: function(object) { 
     61    return Object.extend({}, object); 
     62  } 
     63}); 
    4464 
    4565Function.prototype.bind = function() { 
     
    5171 
    5272Function.prototype.bindAsEventListener = function(object) { 
    53   var __method = this
     73  var __method = this, args = $A(arguments), object = args.shift()
    5474  return function(event) { 
    55     return __method.call(object, event || window.event); 
     75    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); 
    5676  } 
    5777} 
     
    103123 
    104124  registerCallback: function() { 
    105     setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 
     125    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 
     126  }, 
     127 
     128  stop: function() { 
     129    if (!this.timer) return; 
     130    clearInterval(this.timer); 
     131    this.timer = null; 
    106132  }, 
    107133 
     
    110136      try { 
    111137        this.currentlyExecuting = true; 
    112         this.callback(); 
     138        this.callback(this); 
    113139      } finally { 
    114140        this.currentlyExecuting = false; 
     
    196222    var pairs = this.match(/^\??(.*)$/)[1].split('&'); 
    197223    return pairs.inject({}, function(params, pairString) { 
    198       var pair = pairString.split('='); 
    199       params[pair[0]] = pair[1]; 
     224      var pair  = pairString.split('='); 
     225      var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; 
     226      params[decodeURIComponent(pair[0])] = value; 
    200227      return params; 
    201228    }); 
     
    222249  }, 
    223250 
    224   inspect: function() { 
    225     return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'"; 
     251  inspect: function(useDoubleQuotes) { 
     252    var escapedString = this.replace(/\\/g, '\\\\'); 
     253    if (useDoubleQuotes) 
     254      return '"' + escapedString.replace(/"/g, '\\"') + '"'; 
     255    else 
     256      return "'" + escapedString.replace(/'/g, '\\\'') + "'"; 
    226257  } 
    227258}); 
     
    281312 
    282313  any: function(iterator) { 
    283     var result = true; 
     314    var result = false; 
    284315    this.each(function(value, index) { 
    285316      if (result = !!(iterator || Prototype.K)(value, index)) 
     
    500531  }, 
    501532 
     533  reduce: function() { 
     534    return this.length > 1 ? this : this[0]; 
     535  }, 
     536 
     537  uniq: function() { 
     538    return this.inject([], function(array, value) { 
     539      return array.include(value) ? array : array.concat([value]); 
     540    }); 
     541  }, 
     542 
    502543  inspect: function() { 
    503544    return '[' + this.map(Object.inspect).join(', ') + ']'; 
     
    562603  _each: function(iterator) { 
    563604    var value = this.start; 
    564     do
     605    while (this.include(value))
    565606      iterator(value); 
    566607      value = value.succ(); 
    567     } while (this.include(value)); 
     608    } 
    568609  }, 
    569610 
     
    672713    /* Simulate other verbs over post */ 
    673714    if (this.options.method != 'get' && this.options.method != 'post') { 
    674       parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method 
    675       this.options.method = 'post' 
     715      parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method; 
     716      this.options.method = 'post'; 
    676717    } 
    677718 
     
    686727        this.options.asynchronous); 
    687728 
    688       if (this.options.asynchronous) { 
    689         this.transport.onreadystatechange = this.onStateChange.bind(this); 
    690         setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); 
    691       } 
    692  
     729      if (this.options.asynchronous) 
     730        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); 
     731 
     732      this.transport.onreadystatechange = this.onStateChange.bind(this); 
    693733      this.setRequestHeaders(); 
    694734 
    695735      var body = this.options.postBody ? this.options.postBody : parameters; 
    696736      this.transport.send(this.options.method == 'post' ? body : null); 
     737 
     738      /* Force Firefox to handle ready state 4 for synchronous requests */ 
     739      if (!this.options.asynchronous && this.transport.overrideMimeType) 
     740        this.onStateChange(); 
    697741 
    698742    } catch (e) { 
     
    853897 
    854898  stop: function() { 
    855     this.updater.onComplete = undefined; 
     899    this.updater.options.onComplete = undefined; 
    856900    clearTimeout(this.timer); 
    857901    (this.onComplete || Prototype.emptyFunction).apply(this, arguments); 
     
    881925    results.push(Element.extend(element)); 
    882926  } 
    883   return results.length < 2 ? results[0] : results
     927  return results.reduce()
    884928} 
    885929 
     
    903947 
    904948  if (!element._extended && element.tagName && element != window) { 
    905     var methods = Element.Methods, cache = Element.extend.cache; 
    906     for (property in methods) { 
     949    var methods = Object.clone(Element.Methods), cache = Element.extend.cache; 
     950 
     951    if (element.tagName == 'FORM') 
     952      Object.extend(methods, Form.Methods); 
     953    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) 
     954      Object.extend(methods, Form.Element.Methods); 
     955 
     956    for (var property in methods) { 
    907957      var value = methods[property]; 
    908958      if (typeof value == 'function') 
     
    928978  }, 
    929979 
    930   toggle: function() { 
    931     for (var i = 0; i < arguments.length; i++) { 
    932       var element = $(arguments[i]); 
    933       Element[Element.visible(element) ? 'hide' : 'show'](element); 
    934     } 
    935   }, 
    936  
    937   hide: function() { 
    938     for (var i = 0; i < arguments.length; i++) { 
    939       var element = $(arguments[i]); 
    940       element.style.display = 'none'; 
    941     } 
    942   }, 
    943  
    944   show: function() { 
    945     for (var i = 0; i < arguments.length; i++) { 
    946       var element = $(arguments[i]); 
    947       element.style.display = ''; 
    948     } 
     980  toggle: function(element) { 
     981    element = $(element); 
     982    Element[Element.visible(element) ? 'hide' : 'show'](element); 
     983    return element; 
     984  }, 
     985 
     986  hide: function(element) { 
     987    $(element).style.display = 'none'; 
     988    return element; 
     989  }, 
     990 
     991  show: function(element) { 
     992    $(element).style.display = ''; 
     993    return element; 
    949994  }, 
    950995 
     
    952997    element = $(element); 
    953998    element.parentNode.removeChild(element); 
     999    return element; 
    9541000  }, 
    9551001 
     
    9571003    $(element).innerHTML = html.stripScripts(); 
    9581004    setTimeout(function() {html.evalScripts()}, 10); 
     1005    return element; 
    9591006  }, 
    9601007 
     
    9701017    } 
    9711018    setTimeout(function() {html.evalScripts()}, 10); 
     1019    return element; 
     1020  }, 
     1021 
     1022  inspect: function(element) { 
     1023    element = $(element); 
     1024    var result = '<' + element.tagName.toLowerCase(); 
     1025    $H({'id': 'id', 'className': 'class'}).each(function(pair) { 
     1026      var property = pair.first(), attribute = pair.last(); 
     1027      var value = (element[property] || '').toString(); 
     1028      if (value) result += ' ' + attribute + '=' + value.inspect(true); 
     1029    }); 
     1030    return result + '>'; 
     1031  }, 
     1032 
     1033  recursivelyCollect: function(element, property) { 
     1034    element = $(element); 
     1035    var elements = []; 
     1036    while (element = element[property]) 
     1037      if (element.nodeType == 1) 
     1038        elements.push(Element.extend(element)); 
     1039    return elements; 
     1040  }, 
     1041 
     1042  ancestors: function(element) { 
     1043    return $(element).recursivelyCollect('parentNode'); 
     1044  }, 
     1045 
     1046  descendants: function(element) { 
     1047    element = $(element); 
     1048    return $A(element.getElementsByTagName('*')); 
     1049  }, 
     1050 
     1051  previousSiblings: function(element) { 
     1052    return $(element).recursivelyCollect('previousSibling'); 
     1053  }, 
     1054 
     1055  nextSiblings: function(element) { 
     1056    return $(element).recursivelyCollect('nextSibling'); 
     1057  }, 
     1058 
     1059  siblings: function(element) { 
     1060    element = $(element); 
     1061    return element.previousSiblings().reverse().concat(element.nextSiblings()); 
     1062  }, 
     1063 
     1064  match: function(element, selector) { 
     1065    element = $(element); 
     1066    if (typeof selector == 'string') 
     1067      selector = new Selector(selector); 
     1068    return selector.match(element); 
     1069  }, 
     1070 
     1071  up: function(element, expression, index) { 
     1072    return Selector.findElement($(element).ancestors(), expression, index); 
     1073  }, 
     1074 
     1075  down: function(element, expression, index) { 
     1076    return Selector.findElement($(element).descendants(), expression, index); 
     1077  }, 
     1078 
     1079  previous: function(element, expression, index) { 
     1080    return Selector.findElement($(element).previousSiblings(), expression, index); 
     1081  }, 
     1082 
     1083  next: function(element, expression, index) { 
     1084    return Selector.findElement($(element).nextSiblings(), expression, index); 
     1085  }, 
     1086 
     1087  getElementsBySelector: function() { 
     1088    var args = $A(arguments), element = $(args.shift()); 
     1089    return Selector.findChildElements(element, args); 
     1090  }, 
     1091 
     1092  getElementsByClassName: function(element, className) { 
     1093    element = $(element); 
     1094    return document.getElementsByClassName(className, element); 
    9721095  }, 
    9731096 
     
    9881111  addClassName: function(element, className) { 
    9891112    if (!(element = $(element))) return; 
    990     return Element.classNames(element).add(className); 
     1113    Element.classNames(element).add(className); 
     1114    return element; 
    9911115  }, 
    9921116 
    9931117  removeClassName: function(element, className) { 
    9941118    if (!(element = $(element))) return; 
    995     return Element.classNames(element).remove(className);