Changeset 4932
- Timestamp:
- 09/03/06 20:18:49 (2 years ago)
- Files:
-
- spinoffs/scriptaculous/lib/prototype.js (modified) (33 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
spinoffs/scriptaculous/lib/prototype.js
r4184 r4932 32 32 } 33 33 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 } 34 Object.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 }); 44 64 45 65 Function.prototype.bind = function() { … … 196 216 var pairs = this.match(/^\??(.*)$/)[1].split('&'); 197 217 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; 200 221 return params; 201 222 }); … … 500 521 }, 501 522 523 reduce: function() { 524 return this.length > 1 ? this : this.first(); 525 }, 526 502 527 inspect: function() { 503 528 return '[' + this.map(Object.inspect).join(', ') + ']'; … … 670 695 if (parameters.length > 0) parameters += '&_='; 671 696 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 672 703 try { 673 704 this.url = url; … … 680 711 this.options.asynchronous); 681 712 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); 687 717 this.setRequestHeaders(); 688 718 689 719 var body = this.options.postBody ? this.options.postBody : parameters; 690 720 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(); 691 725 692 726 } catch (e) { … … 847 881 848 882 stop: function() { 849 this.updater.o nComplete = undefined;883 this.updater.options.onComplete = undefined; 850 884 clearTimeout(this.timer); 851 885 (this.onComplete || Prototype.emptyFunction).apply(this, arguments); … … 897 931 898 932 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 900 940 for (property in methods) { 901 941 var value = methods[property]; … … 922 962 }, 923 963 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; 943 978 }, 944 979 … … 946 981 element = $(element); 947 982 element.parentNode.removeChild(element); 983 return element; 948 984 }, 949 985 … … 951 987 $(element).innerHTML = html.stripScripts(); 952 988 setTimeout(function() {html.evalScripts()}, 10); 989 return element; 953 990 }, 954 991 … … 964 1001 } 965 1002 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 }); 966 1016 }, 967 1017 … … 982 1032 addClassName: function(element, className) { 983 1033 if (!(element = $(element))) return; 984 return Element.classNames(element).add(className); 1034 Element.classNames(element).add(className); 1035 return element; 985 1036 }, 986 1037 987 1038 removeClassName: function(element, className) { 988 1039 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(); 990 1052 }, 991 1053 … … 998 1060 Element.remove(node); 999 1061 } 1062 return element; 1000 1063 }, 1001 1064 … … 1016 1079 y = element.y ? element.y : element.offsetTop; 1017 1080 window.scrollTo(x, y); 1081 return element; 1018 1082 }, 1019 1083 … … 1040 1104 for (var name in style) 1041 1105 element.style[name.camelize()] = style[name]; 1106 return element; 1042 1107 }, 1043 1108 … … 1076 1141 } 1077 1142 } 1143 return element; 1078 1144 }, 1079 1145 … … 1088 1154 element.style.right = ''; 1089 1155 } 1156 return element; 1090 1157 }, 1091 1158 … … 1096 1163 if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') 1097 1164 element.style.overflow = 'hidden'; 1165 return element; 1098 1166 }, 1099 1167 … … 1103 1171 element.style.overflow = element._overflow; 1104 1172 element._overflow = undefined; 1173 return element; 1174 } 1175 } 1176 1177 // IE is missing .innerHTML support for TABLE-related elements 1178 if(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; 1105 1210 } 1106 1211 } … … 1110 1215 var _nativeExtensions = false; 1111 1216 1112 if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 1113 var HTMLElement = {} 1114 HTMLElement.prototype = document.createElement('div').__proto__; 1217 if (!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 }); 1115 1224 } 1116 1225 … … 1118 1227 Object.extend(Element.Methods, methods || {}); 1119 1228 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) { 1123 1232 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 }); 1127 1243 _nativeExtensions = true; 1128 1244 } 1129 1245 } 1130 1131 Element.addMethods();1132 1246 1133 1247 var Toggle = new Object(); … … 1375 1489 }).flatten(); 1376 1490 } 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 1407 1491 var Form = { 1492 reset: function(form) { 1493 $(form).reset(); 1494 return form; 1495 } 1496 }; 1497 1498 Form.Methods = { 1408 1499 serialize: function(form) { 1409 1500 var elements = Form.getElements($(form)); … … 1451 1542 1452 1543 disable: function(form) { 1544 form = $(form); 1453 1545 var elements = Form.getElements(form); 1454 1546 for (var i = 0; i < elements.length; i++) { … … 1457 1549 element.disabled = 'true'; 1458 1550 } 1551 return form; 1459 1552 }, 1460 1553 1461 1554 enable: function(form) { 1555 form = $(form); 1462 1556 var elements = Form.getElements(form); 1463 1557 for (var i = 0; i < elements.length; i++) { … … 1465 1559 element.disabled = ''; 1466 1560 } 1561 return form; 1467 1562 }, 1468 1563 … … 1475 1570 1476 1571 focusFirstElement: function(form) { 1572 form = $(form); 1477 1573 Field.activate(Form.findFirstElement(form)); 1478 }, 1479 1480 reset: function(form) { 1481 $(form).reset(); 1482 } 1483 } 1574 return form; 1575 } 1576 } 1577 1578 Object.extend(Form, Form.Methods); 1579 1580 /*--------------------------------------------------------------------------*/ 1484 1581 1485 1582 Form.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 1594 Form.Element.Methods = { 1486 1595 serialize: function(element) { 1487 1596 element = $(element); … … 1509 1618 if (parameter) 1510 1619 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 1653 Object.extend(Form.Element, Form.Element.Methods); 1654 var Field = Form.Element; 1655 1656 /*--------------------------------------------------------------------------*/ 1513 1657 1514 1658 Form.Element.Serializers = { 1515 1659 input: function(element) { 1516 1660 switch (element.type.toLowerCase()) { 1517 case 'submit':1518 case 'hidden':1519 case 'password':1520 case 'text':1521 return Form.Element.Serializers.textarea(element);1522 1661 case 'checkbox': 1523 1662 case 'radio': 1524 1663 return Form.Element.Serializers.inputSelector(element); 1664 default: 1665 return Form.Element.Serializers.textarea(element); 1525 1666 } 1526 1667 return false; … … 1641 1782 Event.observe(element, 'click', this.onElementEvent.bind(this)); 1642 1783 break; 1643 case 'password': 1644 case 'text': 1645 case 'textarea': 1646 case 'select-one': 1647 case 'select-multiple': 1784 default: 1648 1785 Event.observe(element, 'change', this.onElementEvent.bind(this)); 1649 1786 break; … … 1751 1888 name = 'keydown'; 1752 1889 1753 this._observeAndCache(element, name, observer, useCapture);1890 Event._observeAndCache(element, name, observer, useCapture); 1754 1891 }, 1755 1892 … … 1766 1903 element.removeEventListener(name, observer, useCapture); 1767 1904 } else if (element.detachEvent) { 1768 element.detachEvent('on' + name, observer); 1905 try { 1906 element.detachEvent('on' + name, observer); 1907 } catch (e) {} 1769 1908 } 1770 1909 } … … 1876 2015 }, 1877 2016 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 1889 2017 page: function(forElement) { 1890 2018 var valueT = 0, valueL = 0; … … 1903 2031 element = forElement; 1904 2032 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 } 1907 2037 } while (element = element.parentNode); 1908 2038 … … 2005 2135 } 2006 2136 } 2137 2138 Element.addMethods();