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

Changeset 4932

Show
Ignore:
Timestamp:
09/03/06 20:18:49 (2 years ago)
Author:
madrobby
Message:

script.aculo.us: update Prototype to revision [4930]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/scriptaculous/lib/prototype.js

    r4184 r4932  
    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() { 
     
    196216    var pairs = this.match(/^\??(.*)$/)[1].split('&'); 
    197217    return pairs.inject({}, function(params, pairString) { 
    198       var pair = pairString.split('='); 
    199       params[pair[0]] = pair[1]; 
     218      var pair  = pairString.split('='); 
     219      var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; 
     220      params[decodeURIComponent(pair[0])] = value; 
    200221      return params; 
    201222    }); 
     
    500521  }, 
    501522 
     523  reduce: function() { 
     524    return this.length > 1 ? this : this.first(); 
     525  }, 
     526 
    502527  inspect: function() { 
    503528    return '[' + this.map(Object.inspect).join(', ') + ']'; 
     
    670695    if (parameters.length > 0) parameters += '&_='; 
    671696 
     697    /* Simulate other verbs over post */ 
     698    if (this.options.method != 'get' && this.options.method != 'post') { 
     699      parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method; 
     700      this.options.method = 'post'; 
     701    } 
     702 
    672703    try { 
    673704      this.url = url; 
     
    680711        this.options.asynchronous); 
    681712 
    682       if (this.options.asynchronous) { 
    683         this.transport.onreadystatechange = this.onStateChange.bind(this); 
    684         setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); 
    685       } 
    686  
     713      if (this.options.asynchronous) 
     714        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); 
     715 
     716      this.transport.onreadystatechange = this.onStateChange.bind(this); 
    687717      this.setRequestHeaders(); 
    688718 
    689719      var body = this.options.postBody ? this.options.postBody : parameters; 
    690720      this.transport.send(this.options.method == 'post' ? body : null); 
     721 
     722      /* Force Firefox to handle ready state 4 for synchronous requests */ 
     723      if (!this.options.asynchronous && this.transport.overrideMimeType) 
     724        this.onStateChange(); 
    691725 
    692726    } catch (e) { 
     
    847881 
    848882  stop: function() { 
    849     this.updater.onComplete = undefined; 
     883    this.updater.options.onComplete = undefined; 
    850884    clearTimeout(this.timer); 
    851885    (this.onComplete || Prototype.emptyFunction).apply(this, arguments); 
     
    897931 
    898932  if (!element._extended && element.tagName && element != window) { 
    899     var methods = Element.Methods, cache = Element.extend.cache; 
     933    var methods = Object.clone(Element.Methods), cache = Element.extend.cache; 
     934 
     935    if (element.tagName == 'FORM') 
     936      Object.extend(methods, Form.Methods); 
     937    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) 
     938      Object.extend(methods, Form.Element.Methods); 
     939 
    900940    for (property in methods) { 
    901941      var value = methods[property]; 
     
    922962  }, 
    923963 
    924   toggle: function() { 
    925     for (var i = 0; i < arguments.length; i++) { 
    926       var element = $(arguments[i]); 
    927       Element[Element.visible(element) ? 'hide' : 'show'](element); 
    928     } 
    929   }, 
    930  
    931   hide: function() { 
    932     for (var i = 0; i < arguments.length; i++) { 
    933       var element = $(arguments[i]); 
    934       element.style.display = 'none'; 
    935     } 
    936   }, 
    937  
    938   show: function() { 
    939     for (var i = 0; i < arguments.length; i++) { 
    940       var element = $(arguments[i]); 
    941       element.style.display = ''; 
    942     } 
     964  toggle: function(element) { 
     965    element = $(element); 
     966    Element[Element.visible(element) ? 'hide' : 'show'](element); 
     967    return element; 
     968  }, 
     969 
     970  hide: function(element) { 
     971    $(element).style.display = 'none'; 
     972    return element; 
     973  }, 
     974 
     975  show: function(element) { 
     976    $(element).style.display = ''; 
     977    return element; 
    943978  }, 
    944979 
     
    946981    element = $(element); 
    947982    element.parentNode.removeChild(element); 
     983    return element; 
    948984  }, 
    949985 
     
    951987    $(element).innerHTML = html.stripScripts(); 
    952988    setTimeout(function() {html.evalScripts()}, 10); 
     989    return element; 
    953990  }, 
    954991 
     
    9641001    } 
    9651002    setTimeout(function() {html.evalScripts()}, 10); 
     1003    return element; 
     1004  }, 
     1005 
     1006  getElementsByClassName: function(element, className) { 
     1007    element = $(element); 
     1008    return document.getElementsByClassName(className, element); 
     1009  }, 
     1010 
     1011  getElementsBySelector: function() { 
     1012    var args = $A(arguments), element = args.shift(); 
     1013    return $$.apply(null, args).select(function(potentialChild) { 
     1014      return potentialChild.childOf(element); 
     1015    }); 
    9661016  }, 
    9671017 
     
    9821032  addClassName: function(element, className) { 
    9831033    if (!(element = $(element))) return; 
    984     return Element.classNames(element).add(className); 
     1034    Element.classNames(element).add(className); 
     1035    return element; 
    9851036  }, 
    9861037 
    9871038  removeClassName: function(element, className) { 
    9881039    if (!(element = $(element))) return; 
    989     return Element.classNames(element).remove(className); 
     1040    Element.classNames(element).remove(className); 
     1041    return element; 
     1042  }, 
     1043 
     1044  observe: function() { 
     1045    Event.observe.apply(Event, arguments); 
     1046    return $A(arguments).first(); 
     1047  }, 
     1048 
     1049  stopObserving: function() { 
     1050    Event.stopObserving.apply(Event, arguments); 
     1051    return $A(arguments).first(); 
    9901052  }, 
    9911053 
     
    9981060        Element.remove(node); 
    9991061    } 
     1062    return element; 
    10001063  }, 
    10011064 
     
    10161079        y = element.y ? element.y : element.offsetTop; 
    10171080    window.scrollTo(x, y); 
     1081    return element; 
    10181082  }, 
    10191083 
     
    10401104    for (var name in style) 
    10411105      element.style[name.camelize()] = style[name]; 
     1106    return element; 
    10421107  }, 
    10431108 
     
    10761141      } 
    10771142    } 
     1143    return element; 
    10781144  }, 
    10791145 
     
    10881154        element.style.right = ''; 
    10891155    } 
     1156    return element; 
    10901157  }, 
    10911158 
     
    10961163    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') 
    10971164      element.style.overflow = 'hidden'; 
     1165    return element; 
    10981166  }, 
    10991167 
     
    11031171    element.style.overflow = element._overflow; 
    11041172    element._overflow = undefined; 
     1173    return element; 
     1174  } 
     1175} 
     1176 
     1177// IE is missing .innerHTML support for TABLE-related elements 
     1178if(document.all){ 
     1179  Element.Methods.update = function(element, html) { 
     1180    element = $(element); 
     1181    var tagName = element.tagName.toUpperCase(); 
     1182    if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) { 
     1183      var div = document.createElement('div'); 
     1184      switch (tagName) { 
     1185        case 'THEAD': 
     1186        case 'TBODY': 
     1187          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>'; 
     1188          depth = 2; 
     1189          break; 
     1190        case 'TR': 
     1191          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>'; 
     1192          depth = 3; 
     1193          break; 
     1194        case 'TD': 
     1195          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>'; 
     1196          depth = 4; 
     1197      } 
     1198      $A(element.childNodes).each(function(node){ 
     1199        element.removeChild(node) 
     1200      }); 
     1201      depth.times(function(){ div = div.firstChild }); 
     1202 
     1203      $A(div.childNodes).each( 
     1204        function(node){ element.appendChild(node) }); 
     1205    } else { 
     1206      element.innerHTML = html.stripScripts(); 
     1207    } 
     1208    setTimeout(function() {html.evalScripts()}, 10); 
     1209    return element; 
    11051210  } 
    11061211} 
     
    11101215var _nativeExtensions = false; 
    11111216 
    1112 if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 
    1113   var HTMLElement = {} 
    1114   HTMLElement.prototype = document.createElement('div').__proto__; 
     1217if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 
     1218  /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement, 
     1219     and HTMLSelectElement in Safari */ 
     1220  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { 
     1221    var klass = window['HTML' + tag + 'Element'] = {}; 
     1222    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; 
     1223  }); 
    11151224} 
    11161225 
     
    11181227  Object.extend(Element.Methods, methods || {}); 
    11191228 
    1120   if(typeof HTMLElement != 'undefined') { 
    1121     var methods = Element.Methods, cache = Element.extend.cache; 
    1122     for (property in methods) { 
     1229  function copy(methods, destination) { 
     1230    var cache = Element.extend.cache; 
     1231    for (var property in methods) { 
    11231232      var value = methods[property]; 
    1124       if (typeof value == 'function') 
    1125         HTMLElement.prototype[property] = cache.findOrStore(value); 
    1126     } 
     1233      destination[property] = cache.findOrStore(value); 
     1234    } 
     1235  } 
     1236 
     1237  if (typeof HTMLElement != 'undefined') { 
     1238    copy(Element.Methods, HTMLElement.prototype); 
     1239    copy(Form.Methods, HTMLFormElement.prototype); 
     1240    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { 
     1241      copy(Form.Element.Methods, klass.prototype); 
     1242    }); 
    11271243    _nativeExtensions = true; 
    11281244  } 
    11291245} 
    1130  
    1131 Element.addMethods(); 
    11321246 
    11331247var Toggle = new Object(); 
     
    13751489  }).flatten(); 
    13761490} 
    1377 var Field = { 
    1378   clear: function() { 
    1379     for (var i = 0; i < arguments.length; i++) 
    1380       $(arguments[i]).value = ''; 
    1381   }, 
    1382  
    1383   focus: function(element) { 
    1384     $(element).focus(); 
    1385   }, 
    1386  
    1387   present: function() { 
    1388     for (var i = 0; i < arguments.length; i++) 
    1389       if ($(arguments[i]).value == '') return false; 
    1390     return true; 
    1391   }, 
    1392  
    1393   select: function(element) { 
    1394     $(element).select(); 
    1395   }, 
    1396  
    1397   activate: function(element) { 
    1398     element = $(element); 
    1399     element.focus(); 
    1400     if (element.select) 
    1401       element.select(); 
    1402   } 
    1403 } 
    1404  
    1405 /*--------------------------------------------------------------------------*/ 
    1406  
    14071491var Form = { 
     1492  reset: function(form) { 
     1493    $(form).reset(); 
     1494    return form; 
     1495  } 
     1496}; 
     1497 
     1498Form.Methods = { 
    14081499  serialize: function(form) { 
    14091500    var elements = Form.getElements($(form)); 
     
    14511542 
    14521543  disable: function(form) { 
     1544    form = $(form); 
    14531545    var elements = Form.getElements(form); 
    14541546    for (var i = 0; i < elements.length; i++) { 
     
    14571549      element.disabled = 'true'; 
    14581550    } 
     1551    return form; 
    14591552  }, 
    14601553 
    14611554  enable: function(form) { 
     1555    form = $(form); 
    14621556    var elements = Form.getElements(form); 
    14631557    for (var i = 0; i < elements.length; i++) { 
     
    14651559      element.disabled = ''; 
    14661560    } 
     1561    return form; 
    14671562  }, 
    14681563 
     
    14751570 
    14761571  focusFirstElement: function(form) { 
     1572    form = $(form); 
    14771573    Field.activate(Form.findFirstElement(form)); 
    1478   }, 
    1479  
    1480   reset: function(form) { 
    1481     $(form).reset(); 
    1482   } 
    1483 
     1574    return form; 
     1575  } 
     1576
     1577 
     1578Object.extend(Form, Form.Methods); 
     1579 
     1580/*--------------------------------------------------------------------------*/ 
    14841581 
    14851582Form.Element = { 
     1583  focus: function(element) { 
     1584    $(element).focus(); 
     1585    return element; 
     1586  }, 
     1587 
     1588  select: function(element) { 
     1589    $(element).select(); 
     1590    return element; 
     1591  } 
     1592} 
     1593 
     1594Form.Element.Methods = { 
    14861595  serialize: function(element) { 
    14871596    element = $(element); 
     
    15091618    if (parameter) 
    15101619      return parameter[1]; 
    1511   } 
    1512 
     1620  }, 
     1621 
     1622  clear: function(element) { 
     1623    $(element).value = ''; 
     1624    return element; 
     1625  }, 
     1626 
     1627  present: function(element) { 
     1628    return $(element).value != ''; 
     1629  }, 
     1630 
     1631  activate: function(element) { 
     1632    element = $(element); 
     1633    element.focus(); 
     1634    if (element.select) 
     1635      element.select(); 
     1636    return element; 
     1637  }, 
     1638 
     1639  disable: function(element) { 
     1640    element = $(element); 
     1641    element.disabled = ''; 
     1642    return element; 
     1643  }, 
     1644 
     1645  enable: function(element) { 
     1646    element = $(element); 
     1647    element.blur(); 
     1648    element.disabled = 'true'; 
     1649    return element; 
     1650  } 
     1651
     1652 
     1653Object.extend(Form.Element, Form.Element.Methods); 
     1654var Field = Form.Element; 
     1655 
     1656/*--------------------------------------------------------------------------*/ 
    15131657 
    15141658Form.Element.Serializers = { 
    15151659  input: function(element) { 
    15161660    switch (element.type.toLowerCase()) { 
    1517       case 'submit': 
    1518       case 'hidden': 
    1519       case 'password': 
    1520       case 'text': 
    1521         return Form.Element.Serializers.textarea(element); 
    15221661      case 'checkbox': 
    15231662      case 'radio': 
    15241663        return Form.Element.Serializers.inputSelector(element); 
     1664      default: 
     1665        return Form.Element.Serializers.textarea(element); 
    15251666    } 
    15261667    return false; 
     
    16411782          Event.observe(element, 'click', this.onElementEvent.bind(this)); 
    16421783          break; 
    1643         case 'password': 
    1644         case 'text': 
    1645         case 'textarea': 
    1646         case 'select-one': 
    1647         case 'select-multiple': 
     1784        default: 
    16481785          Event.observe(element, 'change', this.onElementEvent.bind(this)); 
    16491786          break; 
     
    17511888      name = 'keydown'; 
    17521889 
    1753     this._observeAndCache(element, name, observer, useCapture); 
     1890    Event._observeAndCache(element, name, observer, useCapture); 
    17541891  }, 
    17551892 
     
    17661903      element.removeEventListener(name, observer, useCapture); 
    17671904    } else if (element.detachEvent) { 
    1768       element.detachEvent('on' + name, observer); 
     1905      try { 
     1906        element.detachEvent('on' + name, observer); 
     1907      } catch (e) {} 
    17691908    } 
    17701909  } 
     
    18762015  }, 
    18772016 
    1878   clone: function(source, target) { 
    1879     source = $(source); 
    1880     target = $(target); 
    1881     target.style.position = 'absolute'; 
    1882     var offsets = this.cumulativeOffset(source); 
    1883     target.style.top    = offsets[1] + 'px'; 
    1884     target.style.left   = offsets[0] + 'px'; 
    1885     target.style.width  = source.offsetWidth + 'px'; 
    1886     target.style.height = source.offsetHeight + 'px'; 
    1887   }, 
    1888  
    18892017  page: function(forElement) { 
    18902018    var valueT = 0, valueL = 0; 
     
    19032031    element = forElement; 
    19042032    do { 
    1905       valueT -= element.scrollTop  || 0; 
    1906       valueL -= element.scrollLeft || 0; 
     2033      if (!window.opera || element.tagName=='BODY') { 
     2034        valueT -= element.scrollTop  || 0; 
     2035        valueL -= element.scrollLeft || 0; 
     2036      } 
    19072037    } while (element = element.parentNode); 
    19082038 
     
    20052135  } 
    20062136} 
     2137 
     2138Element.addMethods();