Changeset 5991
- Timestamp:
- 01/18/07 22:15:19 (2 years ago)
- Files:
-
- spinoffs/scriptaculous/CHANGELOG (modified) (1 diff)
- spinoffs/scriptaculous/lib/prototype.js (modified) (35 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
spinoffs/scriptaculous/CHANGELOG
r5949 r5991 1 1 *SVN* 2 3 * Update to Prototype 1.5.0 final 2 4 3 5 * New option keepBackgroundImage: true for Effect.Highlight, fixes #5037 [docwhat, tomg] spinoffs/scriptaculous/lib/prototype.js
r5850 r5991 1 /* Prototype JavaScript framework, version 1.5.0 _rc21 /* Prototype JavaScript framework, version 1.5.0 2 2 * (c) 2005-2007 Sam Stephenson 3 3 * … … 8 8 9 9 var Prototype = { 10 Version: '1.5.0 _rc2',10 Version: '1.5.0', 11 11 BrowserFeatures: { 12 12 XPath: !!document.evaluate … … 630 630 } 631 631 } 632 var Hash = { 632 var Hash = function(obj) { 633 Object.extend(this, obj || {}); 634 }; 635 636 Object.extend(Hash, { 637 toQueryString: function(obj) { 638 var parts = []; 639 640 this.prototype._each.call(obj, function(pair) { 641 if (!pair.key) return; 642 643 if (pair.value && pair.value.constructor == Array) { 644 var values = pair.value.compact(); 645 if (values.length < 2) pair.value = values.reduce(); 646 else { 647 key = encodeURIComponent(pair.key); 648 values.each(function(value) { 649 value = value != undefined ? encodeURIComponent(value) : ''; 650 parts.push(key + '=' + encodeURIComponent(value)); 651 }); 652 return; 653 } 654 } 655 if (pair.value == undefined) pair[1] = ''; 656 parts.push(pair.map(encodeURIComponent).join('=')); 657 }); 658 659 return parts.join('&'); 660 } 661 }); 662 663 Object.extend(Hash.prototype, Enumerable); 664 Object.extend(Hash.prototype, { 633 665 _each: function(iterator) { 634 666 for (var key in this) { 635 667 var value = this[key]; 636 if ( typeof value == 'function') continue;668 if (value && value == Hash.prototype[key]) continue; 637 669 638 670 var pair = [key, value]; … … 658 690 }, 659 691 660 toQueryString: function() { 661 return this.map(function(pair) { 662 if (!pair.key) return null; 663 664 if (pair.value && pair.value.constructor == Array) { 665 pair.value = pair.value.compact(); 666 667 if (pair.value.length < 2) { 668 pair.value = pair.value.reduce(); 669 } else { 670 var key = encodeURIComponent(pair.key); 671 return pair.value.map(function(value) { 672 return key + '=' + encodeURIComponent(value); 673 }).join('&'); 692 remove: function() { 693 var result; 694 for(var i = 0, length = arguments.length; i < length; i++) { 695 var value = this[arguments[i]]; 696 if (value !== undefined){ 697 if (result === undefined) result = value; 698 else { 699 if (result.constructor != Array) result = [result]; 700 result.push(value) 674 701 } 675 702 } 676 677 if (pair.value == undefined) pair[1] = ''; 678 return pair.map(encodeURIComponent).join('='); 679 }).join('&'); 703 delete this[arguments[i]]; 704 } 705 return result; 706 }, 707 708 toQueryString: function() { 709 return Hash.toQueryString(this); 680 710 }, 681 711 … … 685 715 }).join(', ') + '}>'; 686 716 } 687 } 717 }); 688 718 689 719 function $H(object) { 690 var hash = Object.extend({}, object || {}); 691 Object.extend(hash, Enumerable); 692 Object.extend(hash, Hash); 693 return hash; 694 } 720 if (object && object.constructor == Hash) return object; 721 return new Hash(object); 722 }; 695 723 ObjectRange = Class.create(); 696 724 Object.extend(ObjectRange.prototype, Enumerable); … … 786 814 787 815 this.options.method = this.options.method.toLowerCase(); 788 this.options.parameters = $H(typeof this.options.parameters == 'string' ?789 this.options.parameters .toQueryParams() : this.options.parameters);816 if (typeof this.options.parameters == 'string') 817 this.options.parameters = this.options.parameters.toQueryParams(); 790 818 } 791 819 } … … 805 833 806 834 request: function(url) { 835 this.url = url; 836 this.method = this.options.method; 807 837 var params = this.options.parameters; 808 if (params.any()) params['_'] = ''; 809 810 if (!['get', 'post'].include(this.options.method)) { 838 839 if (!['get', 'post'].include(this.method)) { 811 840 // simulate other verbs over post 812 params['_method'] = this.options.method; 813 this.options.method = 'post'; 814 } 815 816 this.url = url; 841 params['_method'] = this.method; 842 this.method = 'post'; 843 } 844 845 params = Hash.toQueryString(params); 846 if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_=' 817 847 818 848 // when GET, append parameters to URL 819 if (this.options.method == 'get' && params.any()) 820 this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + 821 params.toQueryString(); 849 if (this.method == 'get' && params) 850 this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params; 822 851 823 852 try { 824 853 Ajax.Responders.dispatch('onCreate', this, this.transport); 825 854 826 this.transport.open(this. options.method.toUpperCase(), this.url,855 this.transport.open(this.method.toUpperCase(), this.url, 827 856 this.options.asynchronous); 828 857 … … 833 862 this.setRequestHeaders(); 834 863 835 var body = this.options.method == 'post' ? 836 (this.options.postBody || params.toQueryString()) : null; 864 var body = this.method == 'post' ? (this.options.postBody || params) : null; 837 865 838 866 this.transport.send(body); … … 861 889 }; 862 890 863 if (this. options.method == 'post') {891 if (this.method == 'post') { 864 892 headers['Content-type'] = this.options.contentType + 865 893 (this.options.encoding ? '; charset=' + this.options.encoding : ''); … … 1055 1083 results.push(query.snapshotItem(i)); 1056 1084 return results; 1057 } 1085 }; 1058 1086 } 1059 1087 … … 1072 1100 return elements; 1073 1101 } 1074 } 1102 }; 1075 1103 1076 1104 /*--------------------------------------------------------------------------*/ … … 1101 1129 element._extended = true; 1102 1130 return element; 1103 } 1131 }; 1104 1132 1105 1133 Element.extend.cache = { … … 1109 1137 } 1110 1138 } 1111 } 1139 }; 1112 1140 1113 1141 Element.Methods = { … … 1147 1175 replace: function(element, html) { 1148 1176 element = $(element); 1177 html = typeof html == 'undefined' ? '' : html.toString(); 1149 1178 if (element.outerHTML) { 1150 1179 element.outerHTML = html.stripScripts(); … … 1239 1268 1240 1269 readAttribute: function(element, name) { 1241 return $(element).getAttribute(name); 1270 element = $(element); 1271 if (document.all && !window.opera) { 1272 var t = Element._attributeTranslations; 1273 if (t.values[name]) return t.values[name](element, name); 1274 if (t.names[name]) name = t.names[name]; 1275 var attribute = element.attributes[name]; 1276 if(attribute) return attribute.nodeValue; 1277 } 1278 return element.getAttribute(name); 1242 1279 }, 1243 1280 1244 1281 getHeight: function(element) { 1245 return $(element).offsetHeight; 1282 return $(element).getDimensions().height; 1283 }, 1284 1285 getWidth: function(element) { 1286 return $(element).getDimensions().width; 1246 1287 }, 1247 1288 … … 1305 1346 }, 1306 1347 1307 childOf: function(element, ancestor) {1348 descendantOf: function(element, ancestor) { 1308 1349 element = $(element), ancestor = $(ancestor); 1309 1350 while (element = element.parentNode) … … 1321 1362 getStyle: function(element, style) { 1322 1363 element = $(element); 1323 var camelizedStyle = (style == 'float' ? 1324 (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat') : style).camelize(); 1325 var value = element.style[camelizedStyle]; 1364 if (['float','cssFloat'].include(style)) 1365 style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat'); 1366 style = style.camelize(); 1367 var value = element.style[style]; 1326 1368 if (!value) { 1327 1369 if (document.defaultView && document.defaultView.getComputedStyle) { 1328 1370 var css = document.defaultView.getComputedStyle(element, null); 1329 value = css ? css[ camelizedStyle] : null;1371 value = css ? css[style] : null; 1330 1372 } else if (element.currentStyle) { 1331 value = element.currentStyle[ camelizedStyle];1373 value = element.currentStyle[style]; 1332 1374 } 1333 1375 } … … 1357 1399 if(/MSIE/.test(navigator.userAgent) && !window.opera) 1358 1400 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); 1401 } else if(value == '') { 1402 if(/MSIE/.test(navigator.userAgent) && !window.opera) 1403 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,''); 1359 1404 } else { 1360 1405 if(value < 0.00001) value = 0; … … 1363 1408 'alpha(opacity='+value*100+')'; 1364 1409 } 1365 } else if( name == 'float') name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';1410 } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat'; 1366 1411 element.style[name.camelize()] = value; 1367 1412 } … … 1371 1416 getDimensions: function(element) { 1372 1417 element = $(element); 1373 if (Element.getStyle(element, 'display') != 'none') 1418 var display = $(element).getStyle('display'); 1419 if (display != 'none' && display != null) // Safari bug 1374 1420 return {width: element.offsetWidth, height: element.offsetHeight}; 1375 1421 … … 1379 1425 var originalVisibility = els.visibility; 1380 1426 var originalPosition = els.position; 1427 var originalDisplay = els.display; 1381 1428 els.visibility = 'hidden'; 1382 1429 els.position = 'absolute'; 1383 els.display = ' ';1430 els.display = 'block'; 1384 1431 var originalWidth = element.clientWidth; 1385 1432 var originalHeight = element.clientHeight; 1386 els.display = 'none';1433 els.display = originalDisplay; 1387 1434 els.position = originalPosition; 1388 1435 els.visibility = originalVisibility; … … 1435 1482 return element; 1436 1483 } 1437 } 1484 }; 1485 1486 Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf}); 1487 1488 Element._attributeTranslations = {}; 1489 1490 Element._attributeTranslations.names = { 1491 colspan: "colSpan", 1492 rowspan: "rowSpan", 1493 valign: "vAlign", 1494 datetime: "dateTime", 1495 accesskey: "accessKey", 1496 tabindex: "tabIndex", 1497 enctype: "encType", 1498 maxlength: "maxLength", 1499 readonly: "readOnly", 1500 longdesc: "longDesc" 1501 }; 1502 1503 Element._attributeTranslations.values = { 1504 _getAttr: function(element, attribute) { 1505 return element.getAttribute(attribute, 2); 1506 }, 1507 1508 _flag: function(element, attribute) { 1509 return $(element).hasAttribute(attribute) ? attribute : null; 1510 }, 1511 1512 style: function(element) { 1513 return element.style.cssText.toLowerCase(); 1514 }, 1515 1516 title: function(element) { 1517 var node = element.getAttributeNode('title'); 1518 return node.specified ? node.nodeValue : null; 1519 } 1520 }; 1521 1522 Object.extend(Element._attributeTranslations.values, { 1523 href: Element._attributeTranslations.values._getAttr, 1524 src: Element._attributeTranslations.values._getAttr, 1525 disabled: Element._attributeTranslations.values._flag, 1526 checked: Element._attributeTranslations.values._flag, 1527 readonly: Element._attributeTranslations.values._flag, 1528 multiple: Element._attributeTranslations.values._flag 1529 }); 1438 1530 1439 1531 Element.Methods.Simulated = { 1440 1532 hasAttribute: function(element, attribute) { 1533 var t = Element._attributeTranslations; 1534 attribute = t.names[attribute] || attribute; 1441 1535 return $(element).getAttributeNode(attribute).specified; 1442 1536 } 1443 } 1537 }; 1444 1538 1445 1539 // IE is missing .innerHTML support for TABLE-related elements 1446 if (document.all){1540 if (document.all && !window.opera){ 1447 1541 Element.Methods.update = function(element, html) { 1448 1542 element = $(element); … … 1478 1572 return element; 1479 1573 } 1480 } 1574 }; 1481 1575 1482 1576 Object.extend(Element, Element.Methods); … … 1645 1739 return $A(this).join(' '); 1646 1740 } 1647 } 1741 }; 1648 1742 1649 1743 Object.extend(Element.ClassNames.prototype, Enumerable); … … 1692 1786 conditions.push('true'); 1693 1787 if (clause = params.id) 1694 conditions.push('element. getAttribute("id") == ' + clause.inspect());1788 conditions.push('element.readAttribute("id") == ' + clause.inspect()); 1695 1789 if (clause = params.tagName) 1696 1790 conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); 1697 1791 if ((clause = params.classNames).length > 0) 1698 1792 for (var i = 0, length = clause.length; i < length; i++) 1699 conditions.push(' Element.hasClassName(element,' + clause[i].inspect() + ')');1793 conditions.push('element.hasClassName(' + clause[i].inspect() + ')'); 1700 1794 if (clause = params.attributes) { 1701 1795 clause.each(function(attribute) { 1702 var value = 'element. getAttribute(' + attribute.name.inspect() + ')';1796 var value = 'element.readAttribute(' + attribute.name.inspect() + ')'; 1703 1797 var splitValueBy = function(delimiter) { 1704 1798 return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; … … 1713 1807 case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; 1714 1808 case '': 1715 case undefined: conditions.push( value + ' != null'); break;1809 case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break; 1716 1810 default: throw 'Unknown operator ' + attribute.operator + ' in selector'; 1717 1811 } … … 1724 1818 compileMatcher: function() { 1725 1819 this.match = new Function('element', 'if (!element.tagName) return false; \ 1820 element = $(element); \ 1726 1821 return ' + this.buildMatchExpression()); 1727 1822 }, … … 1763 1858 findChildElements: function(element, expressions) { 1764 1859 return expressions.map(function(expression) { 1765 return expression. strip().split(/\s+/).inject([null], function(results, expr) {1860 return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) { 1766 1861 var selector = new Selector(expr); 1767 1862 return results.inject([], function(elements, result) { … … 1782 1877 }, 1783 1878 1784 serializeElements: function(elements) { 1785 return elements.inject([], function(queryComponents, element) { 1786 var queryComponent = Form.Element.serialize(element); 1787 if (queryComponent) queryComponents.push(queryComponent); 1788 return queryComponents; 1789 }).join('&'); 1879 serializeElements: function(elements, getHash) { 1880 var data = elements.inject({}, function(result, element) { 1881 if (!element.disabled && element.name) { 1882 var key = element.name, value = $(element).getValue(); 1883 if (value != undefined) { 1884 if (result[key]) { 1885 if (result[key].constructor != Array) result[key] = [result[key]]; 1886 result[key].push(value); 1887 } 1888 else result[key] = value; 1889 } 1890 } 1891 return result; 1892 }); 1893 1894 return getHash ? data : Hash.toQueryString(data); 1790 1895 } 1791 1896 }; 1792 1897 1793 1898 Form.Methods = { 1794 serialize: function(form ) {1795 return Form.serializeElements(Form.getElements(form) );1899 serialize: function(form, getHash) { 1900 return Form.serializeElements(Form.getElements(form), getHash); 1796 1901 }, 1797 1902 … … 1808 1913 getInputs: function(form, typeName, name) { 1809 1914 form = $(form); 1810 var inputs = form.getElementsByTagName('input'), matchingInputs = []; 1811 1812 if (!typeName && !name) 1813 return $A(inputs).map(Element.extend); 1814 1815 for (var i = 0, length = inputs.length; i < length; i++) { 1915 var inputs = form.getElementsByTagName('input'); 1916 1917 if (!typeName && !name) return $A(inputs).map(Element.extend); 1918 1919 for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { 1816 1920 var input = inputs[i]; 1817 if ((typeName && input.type != typeName) || 1818 (name && input.name != name)) 1921 if ((typeName && input.type != typeName) || (name && input.name != name)) 1819 1922 continue; 1820 1923 matchingInputs.push(Element.extend(input)); … … 1874 1977 serialize: function(element) { 1875 1978 element = $(element); 1876 if (element.disabled) return ''; 1877 var method = element.tagName.toLowerCase(); 1878 var parameter = Form.Element.Serializers[method](element); 1879 1880 if (parameter) { 1881 var key = encodeURIComponent(parameter[0]); 1882 if (key.length == 0) return; 1883 1884 if (parameter[1].constructor != Array) 1885 parameter[1] = [parameter[1]]; 1886 1887 return parameter[1].map(function(value) { 1888 return key + '=' + encodeURIComponent(value); 1889 }).join('&'); 1890 } 1979 if (!element.disabled && element.name) { 1980 var value = element.getValue(); 1981 if (value != undefined) { 1982 var pair = {}; 1983 pair[element.name] = value; 1984 return Hash.toQueryString(pair); 1985 } 1986 } 1987 return ''; 1891 1988 }, 1892 1989 … … 1894 1991 element = $(element); 1895 1992 var method = element.tagName.toLowerCase(); 1896 var parameter = Form.Element.Serializers[method](element); 1897 1898 if (parameter) 1899 return parameter[1]; 1993 return Form.Element.Serializers[method](element); 1900 1994 }, 1901 1995 … … 1934 2028 Object.extend(Form.Element, Form.Element.Methods); 1935 2029 var Field = Form.Element; 2030 var $F = Form.Element.getValue; 1936 2031 1937 2032 /*--------------------------------------------------------------------------*/ … … 1946 2041 return Form.Element.Serializers.textarea(element); 1947 2042 } 1948 return false;1949 2043 }, 1950 2044 1951 2045 inputSelector: function(element) { 1952 if (element.checked) 1953 return [element.name, element.value]; 2046 return element.checked ? element.value : null; 1954 2047 }, 1955 2048 1956 2049 textarea: function(element) { 1957 return [element.name, element.value];2050 return element.value; 1958 2051 }, 1959 2052 1960 2053 select: function(element) { 1961 return Form.Element.Serializers[element.type == 'select-one' ?2054 return this[element.type == 'select-one' ? 1962 2055 'selectOne' : 'selectMany'](element); 1963 2056 }, 1964 2057 1965 2058 selectOne: function(element) { 1966 var value = '', opt, index = element.selectedIndex; 1967 if (index >= 0) { 1968 opt = Element.extend(element.options[index]); 1969 // Uses the new potential extension if hasAttribute isn't native. 1970 value = opt.hasAttribute('value') ? opt.value : opt.text; 1971 } 1972 return [element.name, value]; 2059 var index = element.selectedIndex; 2060 return index >= 0 ? this.optionValue(element.options[index]) : null; 1973 2061 }, 1974 2062 1975 2063 selectMany: function(element) { 1976 var value = []; 1977 for (var i = 0, length = element.length; i < length; i++) { 1978 var opt = Element.extend(element.options[i]); 1979 if (opt.selected) 1980 // Uses the new potential extension if hasAttribute isn't native. 1981 value.push(opt.hasAttribute('value') ? opt.value : opt.text); 1982 } 1983 return [element.name, value]; 1984 } 1985 } 1986 1987 /*--------------------------------------------------------------------------*/ 1988 1989 var $F = Form.Element.getValue; 2064 var values, length = element.length; 2065 if (!length) return null; 2066 2067 for (var i = 0, values = []; i < length; i++) { 2068 var opt = element.options[i]; 2069 if (opt.selected) values.push(this.optionValue(opt)); 2070 } 2071 return values; 2072 }, 2073 2074 optionValue: function(opt) { 2075 // extend element because hasAttribute may not be native 2076 return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; 2077 } 2078 } 1990 2079 1991 2080 /*--------------------------------------------------------------------------*/ … … 2383 2472 2384 2473 element.style.position = 'absolute'; 2385 element.style.top = top + 'px'; ;2386 element.style.left = left + 'px'; ;2387 element.style.width = width + 'px'; ;2388 element.style.height = height + 'px'; ;2474 element.style.top = top + 'px'; 2475 element.style.left = left + 'px'; 2476 element.style.width = width + 'px'; 2477 element.style.height = height + 'px'; 2389 2478 }, 2390 2479