Changeset 4813
- Timestamp:
- 01/26/2007 03:41:17 AM (18 years ago)
- Location:
- trunk/wp-includes
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-includes/js/list-manipulation-js.php
r4768 r4813 33 33 if ( ajaxAdd.notInitialized() ) 34 34 return true; 35 ajaxAdd.options.parameters += '&action=' + ( update ? 'update-' : 'add-' ) + what + '&' + this.grabInputs( where, ajaxAdd ) + this.inputData; 35 var action = ( update ? 'update-' : 'add-' ) + what; 36 ajaxAdd.options.parameters = $H(ajaxAdd.options.parameters).merge({action: action}).merge(this.inputData.toQueryParams()).merge(this.grabInputs( where, ajaxAdd ).toQueryParams()); 37 36 38 var tempObj=this; 37 39 ajaxAdd.addOnComplete( function(transport) { … … 80 82 return true; 81 83 var tempObj = this; 82 var action = 'delete-' + what + '&id=' + id; 84 var action = 'delete-' + what; 85 var actionId = action + '&id=' + id; 83 86 var idName = what.replace('-as-spam','') + '-' + id; 84 87 ajaxDel.addOnComplete( function(transport) { 85 88 Element.update(ajaxDel.myResponseElement,''); 86 tempObj.destore(action );89 tempObj.destore(actionId); 87 90 if( tempObj.delComplete && typeof tempObj.delComplete == 'function' ) 88 91 tempObj.delComplete( what, id, transport ); 89 92 }); 90 ajaxDel.addOnWPError( function(transport) { tempObj.restore(action , true); });91 ajaxDel.options.parameters += '&action=' + action + this.inputData;93 ajaxDel.addOnWPError( function(transport) { tempObj.restore(actionId, true); }); 94 ajaxDel.options.parameters = $H(ajaxDel.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams()); 92 95 ajaxDel.request(ajaxDel.url); 93 this.store(action , idName);96 this.store(actionId, idName); 94 97 tempObj.removeListItem( idName ); 95 98 return false; … … 103 106 return true; 104 107 var tempObj = this; 105 var action = 'dim-' + what + '&id=' + id; 108 var action = 'dim-' + what; 109 var actionId = action + '&id=' + id; 106 110 var idName = what + '-' + id; 107 111 ajaxDim.addOnComplete( function(transport) { 108 112 Element.update(ajaxDim.myResponseElement,''); 109 tempObj.destore(action );113 tempObj.destore(actionId); 110 114 if ( tempObj.dimComplete && typeof tempObj.dimComplete == 'function' ) 111 115 tempObj.dimComplete( what, id, dimClass, transport ); 112 116 }); 113 ajaxDim.addOnWPError( function(transport) { tempObj.restore(action , true); });114 ajaxDim.options.parameters += '&action=' + action + this.inputData;117 ajaxDim.addOnWPError( function(transport) { tempObj.restore(actionId, true); }); 118 ajaxDim.options.parameters = $H(ajaxDim.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams()); 115 119 ajaxDim.request(ajaxDim.url); 116 this.store(action , idName);120 this.store(actionId, idName); 117 121 this.dimItem( idName, dimClass ); 118 122 return false; -
trunk/wp-includes/js/prototype.js
r4082 r4813 1 /* Prototype JavaScript framework, version 1.5.0 _rc02 * (c) 2005 Sam Stephenson <sam@conio.net>1 /* Prototype JavaScript framework, version 1.5.0 2 * (c) 2005-2007 Sam Stephenson 3 3 * 4 4 * Prototype is freely distributable under the terms of an MIT-style license. … … 8 8 9 9 var Prototype = { 10 Version: '1.5.0_rc0', 10 Version: '1.5.0', 11 BrowserFeatures: { 12 XPath: !!document.evaluate 13 }, 14 11 15 ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 12 13 16 emptyFunction: function() {}, 14 K: function(x) { return x}17 K: function(x) { return x } 15 18 } 16 19 … … 32 35 } 33 36 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 } 37 Object.extend(Object, { 38 inspect: function(object) { 39 try { 40 if (object === undefined) return 'undefined'; 41 if (object === null) return 'null'; 42 return object.inspect ? object.inspect() : object.toString(); 43 } catch (e) { 44 if (e instanceof RangeError) return '...'; 45 throw e; 46 } 47 }, 48 49 keys: function(object) { 50 var keys = []; 51 for (var property in object) 52 keys.push(property); 53 return keys; 54 }, 55 56 values: function(object) { 57 var values = []; 58 for (var property in object) 59 values.push(object[property]); 60 return values; 61 }, 62 63 clone: function(object) { 64 return Object.extend({}, object); 65 } 66 }); 44 67 45 68 Function.prototype.bind = function() { … … 51 74 52 75 Function.prototype.bindAsEventListener = function(object) { 53 var __method = this ;76 var __method = this, args = $A(arguments), object = args.shift(); 54 77 return function(event) { 55 return __method. call(object, event || window.event);78 return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); 56 79 } 57 80 } … … 78 101 var returnValue; 79 102 80 for (var i = 0 ; i < arguments.length; i++) {103 for (var i = 0, length = arguments.length; i < length; i++) { 81 104 var lambda = arguments[i]; 82 105 try { … … 103 126 104 127 registerCallback: function() { 105 setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 128 this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 129 }, 130 131 stop: function() { 132 if (!this.timer) return; 133 clearInterval(this.timer); 134 this.timer = null; 106 135 }, 107 136 … … 110 139 try { 111 140 this.currentlyExecuting = true; 112 this.callback( );141 this.callback(this); 113 142 } finally { 114 143 this.currentlyExecuting = false; … … 117 146 } 118 147 } 148 String.interpret = function(value){ 149 return value == null ? '' : String(value); 150 } 151 119 152 Object.extend(String.prototype, { 120 153 gsub: function(pattern, replacement) { … … 125 158 if (match = source.match(pattern)) { 126 159 result += source.slice(0, match.index); 127 result += (replacement(match) || '').toString();160 result += String.interpret(replacement(match)); 128 161 source = source.slice(match.index + match[0].length); 129 162 } else { … … 190 223 var div = document.createElement('div'); 191 224 div.innerHTML = this.stripTags(); 192 return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; 193 }, 194 195 toQueryParams: function() { 196 var pairs = this.match(/^\??(.*)$/)[1].split('&'); 197 return pairs.inject({}, function(params, pairString) { 198 var pair = pairString.split('='); 199 params[pair[0]] = pair[1]; 200 return params; 225 return div.childNodes[0] ? (div.childNodes.length > 1 ? 226 $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) : 227 div.childNodes[0].nodeValue) : ''; 228 }, 229 230 toQueryParams: function(separator) { 231 var match = this.strip().match(/([^?#]*)(#.*)?$/); 232 if (!match) return {}; 233 234 return match[1].split(separator || '&').inject({}, function(hash, pair) { 235 if ((pair = pair.split('='))[0]) { 236 var name = decodeURIComponent(pair[0]); 237 var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; 238 239 if (hash[name] !== undefined) { 240 if (hash[name].constructor != Array) 241 hash[name] = [hash[name]]; 242 if (value) hash[name].push(value); 243 } 244 else hash[name] = value; 245 } 246 return hash; 201 247 }); 202 248 }, … … 206 252 }, 207 253 254 succ: function() { 255 return this.slice(0, this.length - 1) + 256 String.fromCharCode(this.charCodeAt(this.length - 1) + 1); 257 }, 258 208 259 camelize: function() { 209 var oStringList = this.split('-'); 210 if (oStringList.length == 1) return oStringList[0]; 211 212 var camelizedString = this.indexOf('-') == 0 213 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) 214 : oStringList[0]; 215 216 for (var i = 1, len = oStringList.length; i < len; i++) { 217 var s = oStringList[i]; 218 camelizedString += s.charAt(0).toUpperCase() + s.substring(1); 219 } 220 221 return camelizedString; 222 }, 223 224 inspect: function() { 225 return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'"; 260 var parts = this.split('-'), len = parts.length; 261 if (len == 1) return parts[0]; 262 263 var camelized = this.charAt(0) == '-' 264 ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) 265 : parts[0]; 266 267 for (var i = 1; i < len; i++) 268 camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); 269 270 return camelized; 271 }, 272 273 capitalize: function(){ 274 return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); 275 }, 276 277 underscore: function() { 278 return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); 279 }, 280 281 dasherize: function() { 282 return this.gsub(/_/,'-'); 283 }, 284 285 inspect: function(useDoubleQuotes) { 286 var escapedString = this.replace(/\\/g, '\\\\'); 287 if (useDoubleQuotes) 288 return '"' + escapedString.replace(/"/g, '\\"') + '"'; 289 else 290 return "'" + escapedString.replace(/'/g, '\\\'') + "'"; 226 291 } 227 292 }); … … 247 312 var before = match[1]; 248 313 if (before == '\\') return match[2]; 249 return before + (object[match[3]] || '').toString();314 return before + String.interpret(object[match[3]]); 250 315 }); 251 316 } … … 269 334 if (e != $break) throw e; 270 335 } 336 return this; 337 }, 338 339 eachSlice: function(number, iterator) { 340 var index = -number, slices = [], array = this.toArray(); 341 while ((index += number) < array.length) 342 slices.push(array.slice(index, index+number)); 343 return slices.map(iterator); 271 344 }, 272 345 … … 281 354 282 355 any: function(iterator) { 283 var result = true;356 var result = false; 284 357 this.each(function(value, index) { 285 358 if (result = !!(iterator || Prototype.K)(value, index)) … … 292 365 var results = []; 293 366 this.each(function(value, index) { 294 results.push( iterator(value, index));367 results.push((iterator || Prototype.K)(value, index)); 295 368 }); 296 369 return results; 297 370 }, 298 371 299 detect: function 372 detect: function(iterator) { 300 373 var result; 301 374 this.each(function(value, index) { … … 338 411 }, 339 412 413 inGroupsOf: function(number, fillWith) { 414 fillWith = fillWith === undefined ? null : fillWith; 415 return this.eachSlice(number, function(slice) { 416 while(slice.length < number) slice.push(fillWith); 417 return slice; 418 }); 419 }, 420 340 421 inject: function(memo, iterator) { 341 422 this.each(function(value, index) { … … 347 428 invoke: function(method) { 348 429 var args = $A(arguments).slice(1); 349 return this. collect(function(value) {430 return this.map(function(value) { 350 431 return value[method].apply(value, args); 351 432 }); … … 399 480 400 481 sortBy: function(iterator) { 401 return this. collect(function(value, index) {482 return this.map(function(value, index) { 402 483 return {value: value, criteria: iterator(value, index)}; 403 484 }).sort(function(left, right) { … … 408 489 409 490 toArray: function() { 410 return this. collect(Prototype.K);491 return this.map(); 411 492 }, 412 493 … … 420 501 return iterator(collections.pluck(index)); 421 502 }); 503 }, 504 505 size: function() { 506 return this.toArray().length; 422 507 }, 423 508 … … 440 525 } else { 441 526 var results = []; 442 for (var i = 0 ; i < iterable.length; i++)527 for (var i = 0, length = iterable.length; i < length; i++) 443 528 results.push(iterable[i]); 444 529 return results; … … 453 538 Object.extend(Array.prototype, { 454 539 _each: function(iterator) { 455 for (var i = 0 ; i < this.length; i++)540 for (var i = 0, length = this.length; i < length; i++) 456 541 iterator(this[i]); 457 542 }, … … 472 557 compact: function() { 473 558 return this.select(function(value) { 474 return value != undefined || value !=null;559 return value != null; 475 560 }); 476 561 }, … … 491 576 492 577 indexOf: function(object) { 493 for (var i = 0 ; i < this.length; i++)578 for (var i = 0, length = this.length; i < length; i++) 494 579 if (this[i] == object) return i; 495 580 return -1; … … 500 585 }, 501 586 587 reduce: function() { 588 return this.length > 1 ? this : this[0]; 589 }, 590 591 uniq: function() { 592 return this.inject([], function(array, value) { 593 return array.include(value) ? array : array.concat([value]); 594 }); 595 }, 596 597 clone: function() { 598 return [].concat(this); 599 }, 600 601 size: function() { 602 return this.length; 603 }, 604 502 605 inspect: function() { 503 606 return '[' + this.map(Object.inspect).join(', ') + ']'; 504 607 } 505 608 }); 506 var Hash = { 609 610 Array.prototype.toArray = Array.prototype.clone; 611 612 function $w(string){ 613 string = string.strip(); 614 return string ? string.split(/\s+/) : []; 615 } 616 617 if(window.opera){ 618 Array.prototype.concat = function(){ 619 var array = []; 620 for(var i = 0, length = this.length; i < length; i++) array.push(this[i]); 621 for(var i = 0, length = arguments.length; i < length; i++) { 622 if(arguments[i].constructor == Array) { 623 for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) 624 array.push(arguments[i][j]); 625 } else { 626 array.push(arguments[i]); 627 } 628 } 629 return array; 630 } 631 } 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, { 507 665 _each: function(iterator) { 508 666 for (var key in this) { 509 667 var value = this[key]; 510 if ( typeof value == 'function') continue;668 if (value && value == Hash.prototype[key]) continue; 511 669 512 670 var pair = [key, value]; … … 526 684 527 685 merge: function(hash) { 528 return $H(hash).inject( $H(this), function(mergedHash, pair) {686 return $H(hash).inject(this, function(mergedHash, pair) { 529 687 mergedHash[pair.key] = pair.value; 530 688 return mergedHash; … … 532 690 }, 533 691 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) 701 } 702 } 703 delete this[arguments[i]]; 704 } 705 return result; 706 }, 707 534 708 toQueryString: function() { 535 return this.map(function(pair) { 536 return pair.map(encodeURIComponent).join('='); 537 }).join('&'); 709 return Hash.toQueryString(this); 538 710 }, 539 711 … … 543 715 }).join(', ') + '}>'; 544 716 } 545 } 717 }); 546 718 547 719 function $H(object) { 548 var hash = Object.extend({}, object || {}); 549 Object.extend(hash, Enumerable); 550 Object.extend(hash, Hash); 551 return hash; 552 } 720 if (object && object.constructor == Hash) return object; 721 return new Hash(object); 722 }; 553 723 ObjectRange = Class.create(); 554 724 Object.extend(ObjectRange.prototype, Enumerable); … … 562 732 _each: function(iterator) { 563 733 var value = this.start; 564 do{734 while (this.include(value)) { 565 735 iterator(value); 566 736 value = value.succ(); 567 } while (this.include(value));737 } 568 738 }, 569 739 … … 600 770 }, 601 771 602 register: function(responder ToAdd) {603 if (!this.include(responder ToAdd))604 this.responders.push(responder ToAdd);605 }, 606 607 unregister: function(responder ToRemove) {608 this.responders = this.responders.without(responder ToRemove);772 register: function(responder) { 773 if (!this.include(responder)) 774 this.responders.push(responder); 775 }, 776 777 unregister: function(responder) { 778 this.responders = this.responders.without(responder); 609 779 }, 610 780 611 781 dispatch: function(callback, request, transport, json) { 612 782 this.each(function(responder) { 613 if ( responder[callback] &&typeof responder[callback] == 'function') {783 if (typeof responder[callback] == 'function') { 614 784 try { 615 785 responder[callback].apply(responder, [request, transport, json]); … … 626 796 Ajax.activeRequestCount++; 627 797 }, 628 629 798 onComplete: function() { 630 799 Ajax.activeRequestCount--; … … 639 808 asynchronous: true, 640 809 contentType: 'application/x-www-form-urlencoded', 810 encoding: 'UTF-8', 641 811 parameters: '' 642 812 } 643 813 Object.extend(this.options, options || {}); 644 }, 645 646 responseIsSuccess: function() { 647 return this.transport.status == undefined 648 || this.transport.status == 0 649 || (this.transport.status >= 200 && this.transport.status < 300); 650 }, 651 652 responseIsFailure: function() { 653 return !this.responseIsSuccess(); 814 815 this.options.method = this.options.method.toLowerCase(); 816 if (typeof this.options.parameters == 'string') 817 this.options.parameters = this.options.parameters.toQueryParams(); 654 818 } 655 819 } … … 660 824 661 825 Ajax.Request.prototype = Object.extend(new Ajax.Base(), { 826 _complete: false, 827 662 828 initialize: function(url, options) { 663 829 this.transport = Ajax.getTransport(); … … 667 833 668 834 request: function(url) { 669 var parameters = this.options.parameters || ''; 670 if (parameters.length > 0) parameters += '&_='; 835 this.url = url; 836 this.method = this.options.method; 837 var params = this.options.parameters; 838 839 if (!['get', 'post'].include(this.method)) { 840 // simulate other verbs over post 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 += '&_=' 847 848 // when GET, append parameters to URL 849 if (this.method == 'get' && params) 850 this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params; 671 851 672 852 try { 673 this.url = url;674 if (this.options.method == 'get' && parameters.length > 0)675 this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;676 677 853 Ajax.Responders.dispatch('onCreate', this, this.transport); 678 854 679 this.transport.open(this. options.method, this.url,855 this.transport.open(this.method.toUpperCase(), this.url, 680 856 this.options.asynchronous); 681 857 682 if (this.options.asynchronous) { 683 this.transport.onreadystatechange = this.onStateChange.bind(this); 684 setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); 858 if (this.options.asynchronous) 859 setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); 860 861 this.transport.onreadystatechange = this.onStateChange.bind(this); 862 this.setRequestHeaders(); 863 864 var body = this.method == 'post' ? (this.options.postBody || params) : null; 865 866 this.transport.send(body); 867 868 /* Force Firefox to handle ready state 4 for synchronous requests */ 869 if (!this.options.asynchronous && this.transport.overrideMimeType) 870 this.onStateChange(); 871 872 } 873 catch (e) { 874 this.dispatchException(e); 875 } 876 }, 877 878 onStateChange: function() { 879 var readyState = this.transport.readyState; 880 if (readyState > 1 && !((readyState == 4) && this._complete)) 881 this.respondToReadyState(this.transport.readyState); 882 }, 883 884 setRequestHeaders: function() { 885 var headers = { 886 'X-Requested-With': 'XMLHttpRequest', 887 'X-Prototype-Version': Prototype.Version, 888 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' 889 }; 890 891 if (this.method == 'post') { 892 headers['Content-type'] = this.options.contentType + 893 (this.options.encoding ? '; charset=' + this.options.encoding : ''); 894 895 /* Force "Connection: close" for older Mozilla browsers to work 896 * around a bug where XMLHttpRequest sends an incorrect 897 * Content-length header. See Mozilla Bugzilla #246651. 898 */ 899 if (this.transport.overrideMimeType && 900 (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) 901 headers['Connection'] = 'close'; 902 } 903 904 // user-defined headers 905 if (typeof this.options.requestHeaders == 'object') { 906 var extras = this.options.requestHeaders; 907 908 if (typeof extras.push == 'function') 909 for (var i = 0, length = extras.length; i < length; i += 2) 910 headers[extras[i]] = extras[i+1]; 911 else 912 $H(extras).each(function(pair) { headers[pair.key] = pair.value }); 913 } 914 915 for (var name in headers) 916 this.transport.setRequestHeader(name, headers[name]); 917 }, 918 919 success: function() { 920 return !this.transport.status 921 || (this.transport.status >= 200 && this.transport.status < 300); 922 }, 923 924 respondToReadyState: function(readyState) { 925 var state = Ajax.Request.Events[readyState]; 926 var transport = this.transport, json = this.evalJSON(); 927 928 if (state == 'Complete') { 929 try { 930 this._complete = true; 931 (this.options['on' + this.transport.status] 932 || this.options['on' + (this.success() ? 'Success' : 'Failure')] 933 || Prototype.emptyFunction)(transport, json); 934 } catch (e) { 935 this.dispatchException(e); 685 936 } 686 937 687 this.setRequestHeaders(); 688 689 var body = this.options.postBody ? this.options.postBody : parameters; 690 this.transport.send(this.options.method == 'post' ? body : null); 691 938 if ((this.getHeader('Content-type') || 'text/javascript').strip(). 939 match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) 940 this.evalResponse(); 941 } 942 943 try { 944 (this.options['on' + state] || Prototype.emptyFunction)(transport, json); 945 Ajax.Responders.dispatch('on' + state, this, transport, json); 692 946 } catch (e) { 693 947 this.dispatchException(e); 694 948 } 695 }, 696 697 setRequestHeaders: function() { 698 var requestHeaders = 699 ['X-Requested-With', 'XMLHttpRequest', 700 'X-Prototype-Version', Prototype.Version, 701 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*']; 702 703 if (this.options.method == 'post') { 704 requestHeaders.push('Content-type', this.options.contentType); 705 706 /* Force "Connection: close" for Mozilla browsers to work around 707 * a bug where XMLHttpReqeuest sends an incorrect Content-length 708 * header. See Mozilla Bugzilla #246651. 709 */ 710 if (this.transport.overrideMimeType) 711 requestHeaders.push('Connection', 'close'); 712 } 713 714 if (this.options.requestHeaders) 715 requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); 716 717 for (var i = 0; i < requestHeaders.length; i += 2) 718 this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); 719 }, 720 721 onStateChange: function() { 722 var readyState = this.transport.readyState; 723 if (readyState != 1) 724 this.respondToReadyState(this.transport.readyState); 725 }, 726 727 header: function(name) { 949 950 if (state == 'Complete') { 951 // avoid memory leak in MSIE: clean up 952 this.transport.onreadystatechange = Prototype.emptyFunction; 953 } 954 }, 955 956 getHeader: function(name) { 728 957 try { 729 958 return this.transport.getResponseHeader(name); 730 } catch (e) { }959 } catch (e) { return null } 731 960 }, 732 961 733 962 evalJSON: function() { 734 963 try { 735 return eval('(' + this.header('X-JSON') + ')'); 736 } catch (e) {} 964 var json = this.getHeader('X-JSON'); 965 return json ? eval('(' + json + ')') : null; 966 } catch (e) { return null } 737 967 }, 738 968 … … 745 975 }, 746 976 747 respondToReadyState: function(readyState) {748 var event = Ajax.Request.Events[readyState];749 var transport = this.transport, json = this.evalJSON();750 751 if (event == 'Complete') {752 try {753 (this.options['on' + this.transport.status]754 || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]755 || Prototype.emptyFunction)(transport, json);756 } catch (e) {757 this.dispatchException(e);758 }759 760 if ((this.header('Content-type') || '').match(/^text\/javascript/i))761 this.evalResponse();762 }763 764 try {765 (this.options['on' + event] || Prototype.emptyFunction)(transport, json);766 Ajax.Responders.dispatch('on' + event, this, transport, json);767 } catch (e) {768 this.dispatchException(e);769 }770 771 /* Avoid memory leak in MSIE: clean up the oncomplete event handler */772 if (event == 'Complete')773 this.transport.onreadystatechange = Prototype.emptyFunction;774 },775 776 977 dispatchException: function(exception) { 777 978 (this.options.onException || Prototype.emptyFunction)(this, exception); … … 784 985 Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { 785 986 initialize: function(container, url, options) { 786 this.containers = { 787 success: container.success ? $(container.success) : $(container), 788 failure: container.failure ? $(container.failure) : 789 (container.success ? null : $(container)) 987 this.container = { 988 success: (container.success || container), 989 failure: (container.failure || (container.success ? null : container)) 790 990 } 791 991 … … 794 994 795 995 var onComplete = this.options.onComplete || Prototype.emptyFunction; 796 this.options.onComplete = (function(transport, object) {996 this.options.onComplete = (function(transport, param) { 797 997 this.updateContent(); 798 onComplete(transport, object);998 onComplete(transport, param); 799 999 }).bind(this); 800 1000 … … 803 1003 804 1004 updateContent: function() { 805 var receiver = this.responseIsSuccess() ? 806 this.containers.success : this.containers.failure; 1005 var receiver = this.container[this.success() ? 'success' : 'failure']; 807 1006 var response = this.transport.responseText; 808 1007 809 if (!this.options.evalScripts) 810 response = response.stripScripts(); 811 812 if (receiver) { 813 if (this.options.insertion) { 1008 if (!this.options.evalScripts) response = response.stripScripts(); 1009 1010 if (receiver = $(receiver)) { 1011 if (this.options.insertion) 814 1012 new this.options.insertion(receiver, response); 815 } else { 816 Element.update(receiver, response); 817 } 818 } 819 820 if (this.responseIsSuccess()) { 1013 else 1014 receiver.update(response); 1015 } 1016 1017 if (this.success()) { 821 1018 if (this.onComplete) 822 1019 setTimeout(this.onComplete.bind(this), 10); … … 847 1044 848 1045 stop: function() { 849 this.updater.o nComplete = undefined;1046 this.updater.options.onComplete = undefined; 850 1047 clearTimeout(this.timer); 851 1048 (this.onComplete || Prototype.emptyFunction).apply(this, arguments); … … 867 1064 } 868 1065 }); 869 function $() { 870 var results = [], element; 871 for (var i = 0; i < arguments.length; i++) { 872 element = arguments[i]; 873 if (typeof element == 'string') 874 element = document.getElementById(element); 875 results.push(Element.extend(element)); 876 } 877 return results.length < 2 ? results[0] : results; 1066 function $(element) { 1067 if (arguments.length > 1) { 1068 for (var i = 0, elements = [], length = arguments.length; i < length; i++) 1069 elements.push($(arguments[i])); 1070 return elements; 1071 } 1072 if (typeof element == 'string') 1073 element = document.getElementById(element); 1074 return Element.extend(element); 1075 } 1076 1077 if (Prototype.BrowserFeatures.XPath) { 1078 document._getElementsByXPath = function(expression, parentElement) { 1079 var results = []; 1080 var query = document.evaluate(expression, $(parentElement) || document, 1081 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 1082 for (var i = 0, length = query.snapshotLength; i < length; i++) 1083 results.push(query.snapshotItem(i)); 1084 return results; 1085 }; 878 1086 } 879 1087 880 1088 document.getElementsByClassName = function(className, parentElement) { 881 var children = ($(parentElement) || document.body).getElementsByTagName('*'); 882 return $A(children).inject([], function(elements, child) { 883 if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 884 elements.push(Element.extend(child)); 1089 if (Prototype.BrowserFeatures.XPath) { 1090 var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; 1091 return document._getElementsByXPath(q, parentElement); 1092 } else { 1093 var children = ($(parentElement) || document.body).getElementsByTagName('*'); 1094 var elements = [], child; 1095 for (var i = 0, length = children.length; i < length; i++) { 1096 child = children[i]; 1097 if (Element.hasClassName(child, className)) 1098 elements.push(Element.extend(child)); 1099 } 885 1100 return elements; 886 } );887 } 1101 } 1102 }; 888 1103 889 1104 /*--------------------------------------------------------------------------*/ … … 893 1108 894 1109 Element.extend = function(element) { 895 if (!element) return; 896 if (_nativeExtensions) return element; 1110 if (!element || _nativeExtensions || element.nodeType == 3) return element; 897 1111 898 1112 if (!element._extended && element.tagName && element != window) { 899 var methods = Element.Methods, cache = Element.extend.cache; 900 for (property in methods) { 1113 var methods = Object.clone(Element.Methods), cache = Element.extend.cache; 1114 1115 if (element.tagName == 'FORM') 1116 Object.extend(methods, Form.Methods); 1117 if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) 1118 Object.extend(methods, Form.Element.Methods); 1119 1120 Object.extend(methods, Element.Methods.Simulated); 1121 1122 for (var property in methods) { 901 1123 var value = methods[property]; 902 if (typeof value == 'function' )1124 if (typeof value == 'function' && !(property in element)) 903 1125 element[property] = cache.findOrStore(value); 904 1126 } … … 907 1129 element._extended = true; 908 1130 return element; 909 } 1131 }; 910 1132 911 1133 Element.extend.cache = { … … 915 1137 } 916 1138 } 917 } 1139 }; 918 1140 919 1141 Element.Methods = { … … 922 1144 }, 923 1145 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 } 1146 toggle: function(element) { 1147 element = $(element); 1148 Element[Element.visible(element) ? 'hide' : 'show'](element); 1149 return element; 1150 }, 1151 1152 hide: function(element) { 1153 $(element).style.display = 'none'; 1154 return element; 1155 }, 1156 1157 show: function(element) { 1158 $(element).style.display = ''; 1159 return element; 943 1160 }, 944 1161 … … 946 1163 element = $(element); 947 1164 element.parentNode.removeChild(element); 1165 return element; 948 1166 }, 949 1167 950 1168 update: function(element, html) { 1169 html = typeof html == 'undefined' ? '' : html.toString(); 951 1170 $(element).innerHTML = html.stripScripts(); 952 1171 setTimeout(function() {html.evalScripts()}, 10); 1172 return element; 953 1173 }, 954 1174 955 1175 replace: function(element, html) { 956 1176 element = $(element); 1177 html = typeof html == 'undefined' ? '' : html.toString(); 957 1178 if (element.outerHTML) { 958 1179 element.outerHTML = html.stripScripts(); … … 964 1185 } 965 1186 setTimeout(function() {html.evalScripts()}, 10); 1187 return element; 1188 }, 1189 1190 inspect: function(element) { 1191 element = $(element); 1192 var result = '<' + element.tagName.toLowerCase(); 1193 $H({'id': 'id', 'className': 'class'}).each(function(pair) { 1194 var property = pair.first(), attribute = pair.last(); 1195 var value = (element[property] || '').toString(); 1196 if (value) result += ' ' + attribute + '=' + value.inspect(true); 1197 }); 1198 return result + '>'; 1199 }, 1200 1201 recursivelyCollect: function(element, property) { 1202 element = $(element); 1203 var elements = []; 1204 while (element = element[property]) 1205 if (element.nodeType == 1) 1206 elements.push(Element.extend(element)); 1207 return elements; 1208 }, 1209 1210 ancestors: function(element) { 1211 return $(element).recursivelyCollect('parentNode'); 1212 }, 1213 1214 descendants: function(element) { 1215 return $A($(element).getElementsByTagName('*')); 1216 }, 1217 1218 immediateDescendants: function(element) { 1219 if (!(element = $(element).firstChild)) return []; 1220 while (element && element.nodeType != 1) element = element.nextSibling; 1221 if (element) return [element].concat($(element).nextSiblings()); 1222 return []; 1223 }, 1224 1225 previousSiblings: function(element) { 1226 return $(element).recursivelyCollect('previousSibling'); 1227 }, 1228 1229 nextSiblings: function(element) { 1230 return $(element).recursivelyCollect('nextSibling'); 1231 }, 1232 1233 siblings: function(element) { 1234 element = $(element); 1235 return element.previousSiblings().reverse().concat(element.nextSiblings()); 1236 }, 1237 1238 match: function(element, selector) { 1239 if (typeof selector == 'string') 1240 selector = new Selector(selector); 1241 return selector.match($(element)); 1242 }, 1243 1244 up: function(element, expression, index) { 1245 return Selector.findElement($(element).ancestors(), expression, index); 1246 }, 1247 1248 down: function(element, expression, index) { 1249 return Selector.findElement($(element).descendants(), expression, index); 1250 }, 1251 1252 previous: function(element, expression, index) { 1253 return Selector.findElement($(element).previousSiblings(), expression, index); 1254 }, 1255 1256 next: function(element, expression, index) { 1257 return Selector.findElement($(element).nextSiblings(), expression, index); 1258 }, 1259 1260 getElementsBySelector: function() { 1261 var args = $A(arguments), element = $(args.shift()); 1262 return Selector.findChildElements(element, args); 1263 }, 1264 1265 getElementsByClassName: function(element, className) { 1266 return document.getElementsByClassName(className, element); 1267 }, 1268 1269 readAttribute: function(element, 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); 966 1279 }, 967 1280 968 1281 getHeight: function(element) { 969 element = $(element); 970 return element.offsetHeight; 1282 return $(element).getDimensions().height; 1283 }, 1284 1285 getWidth: function(element) { 1286 return $(element).getDimensions().width; 971 1287 }, 972 1288 … … 977 1293 hasClassName: function(element, className) { 978 1294 if (!(element = $(element))) return; 979 return Element.classNames(element).include(className); 1295 var elementClassName = element.className; 1296 if (elementClassName.length == 0) return false; 1297 if (elementClassName == className || 1298 elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 1299 return true; 1300 return false; 980 1301 }, 981 1302 982 1303 addClassName: function(element, className) { 983 1304 if (!(element = $(element))) return; 984 return Element.classNames(element).add(className); 1305 Element.classNames(element).add(className); 1306 return element; 985 1307 }, 986 1308 987 1309 removeClassName: function(element, className) { 988 1310 if (!(element = $(element))) return; 989 return Element.classNames(element).remove(className); 1311 Element.classNames(element).remove(className); 1312 return element; 1313 }, 1314 1315 toggleClassName: function(element, className) { 1316 if (!(element = $(element))) return; 1317 Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className); 1318 return element; 1319 }, 1320 1321 observe: function() { 1322 Event.observe.apply(Event, arguments); 1323 return $A(arguments).first(); 1324 }, 1325 1326 stopObserving: function() { 1327 Event.stopObserving.apply(Event, arguments); 1328 return $A(arguments).first(); 990 1329 }, 991 1330 … … 993 1332 cleanWhitespace: function(element) { 994 1333 element = $(element); 995 for (var i = 0; i < element.childNodes.length; i++) { 996 var node = element.childNodes[i]; 1334 var node = element.firstChild; 1335 while (node) { 1336 var nextNode = node.nextSibling; 997 1337 if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 998 Element.remove(node); 999 } 1338 element.removeChild(node); 1339 node = nextNode; 1340 } 1341 return element; 1000 1342 }, 1001 1343 … … 1004 1346 }, 1005 1347 1006 childOf: function(element, ancestor) {1348 descendantOf: function(element, ancestor) { 1007 1349 element = $(element), ancestor = $(ancestor); 1008 1350 while (element = element.parentNode) … … 1013 1355 scrollTo: function(element) { 1014 1356 element = $(element); 1015 var x = element.x ? element.x : element.offsetLeft,1016 y = element.y ? element.y : element.offsetTop;1017 window.scrollTo(x, y);1357 var pos = Position.cumulativeOffset(element); 1358 window.scrollTo(pos[0], pos[1]); 1359 return element; 1018 1360 }, 1019 1361 1020 1362 getStyle: function(element, style) { 1021 1363 element = $(element); 1022 var value = element.style[style.camelize()]; 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]; 1023 1368 if (!value) { 1024 1369 if (document.defaultView && document.defaultView.getComputedStyle) { 1025 1370 var css = document.defaultView.getComputedStyle(element, null); 1026 value = css ? css .getPropertyValue(style): null;1371 value = css ? css[style] : null; 1027 1372 } else if (element.currentStyle) { 1028 value = element.currentStyle[style .camelize()];1373 value = element.currentStyle[style]; 1029 1374 } 1030 1375 } 1376 1377 if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none')) 1378 value = element['offset'+style.capitalize()] + 'px'; 1031 1379 1032 1380 if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) 1033 1381 if (Element.getStyle(element, 'position') == 'static') value = 'auto'; 1034 1382 if(style == 'opacity') { 1383 if(value) return parseFloat(value); 1384 if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) 1385 if(value[1]) return parseFloat(value[1]) / 100; 1386 return 1.0; 1387 } 1035 1388 return value == 'auto' ? null : value; 1036 1389 }, … … 1038 1391 setStyle: function(element, style) { 1039 1392 element = $(element); 1040 for (var name in style) 1041 element.style[name.camelize()] = style[name]; 1393 for (var name in style) { 1394 var value = style[name]; 1395 if(name == 'opacity') { 1396 if (value == 1) { 1397 value = (/Gecko/.test(navigator.userAgent) && 1398 !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0; 1399 if(/MSIE/.test(navigator.userAgent) && !window.opera) 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,''); 1404 } else { 1405 if(value < 0.00001) value = 0; 1406 if(/MSIE/.test(navigator.userAgent) && !window.opera) 1407 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') + 1408 'alpha(opacity='+value*100+')'; 1409 } 1410 } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat'; 1411 element.style[name.camelize()] = value; 1412 } 1413 return element; 1042 1414 }, 1043 1415 1044 1416 getDimensions: function(element) { 1045 1417 element = $(element); 1046 if (Element.getStyle(element, 'display') != 'none') 1418 var display = $(element).getStyle('display'); 1419 if (display != 'none' && display != null) // Safari bug 1047 1420 return {width: element.offsetWidth, height: element.offsetHeight}; 1048 1421 … … 1052 1425 var originalVisibility = els.visibility; 1053 1426 var originalPosition = els.position; 1427 var originalDisplay = els.display; 1054 1428 els.visibility = 'hidden'; 1055 1429 els.position = 'absolute'; 1056 els.display = ' ';1430 els.display = 'block'; 1057 1431 var originalWidth = element.clientWidth; 1058 1432 var originalHeight = element.clientHeight; 1059 els.display = 'none';1433 els.display = originalDisplay; 1060 1434 els.position = originalPosition; 1061 1435 els.visibility = originalVisibility; … … 1076 1450 } 1077 1451 } 1452 return element; 1078 1453 }, 1079 1454 … … 1088 1463 element.style.right = ''; 1089 1464 } 1465 return element; 1090 1466 }, 1091 1467 1092 1468 makeClipping: function(element) { 1093 1469 element = $(element); 1094 if (element._overflow) return ;1095 element._overflow = element.style.overflow ;1470 if (element._overflow) return element; 1471 element._overflow = element.style.overflow || 'auto'; 1096 1472 if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') 1097 1473 element.style.overflow = 'hidden'; 1474 return element; 1098 1475 }, 1099 1476 1100 1477 undoClipping: function(element) { 1101 1478 element = $(element); 1102 if (element._overflow) return; 1103 element.style.overflow = element._overflow; 1104 element._overflow = undefined; 1105 } 1106 } 1479 if (!element._overflow) return element; 1480 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; 1481 element._overflow = null; 1482 return element; 1483 } 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 }); 1530 1531 Element.Methods.Simulated = { 1532 hasAttribute: function(element, attribute) { 1533 var t = Element._attributeTranslations; 1534 attribute = t.names[attribute] || attribute; 1535 return $(element).getAttributeNode(attribute).specified; 1536 } 1537 }; 1538 1539 // IE is missing .innerHTML support for TABLE-related elements 1540 if (document.all && !window.opera){ 1541 Element.Methods.update = function(element, html) { 1542 element = $(element); 1543 html = typeof html == 'undefined' ? '' : html.toString(); 1544 var tagName = element.tagName.toUpperCase(); 1545 if (['THEAD','TBODY','TR','TD'].include(tagName)) { 1546 var div = document.createElement('div'); 1547 switch (tagName) { 1548 case 'THEAD': 1549 case 'TBODY': 1550 div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>'; 1551 depth = 2; 1552 break; 1553 case 'TR': 1554 div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>'; 1555 depth = 3; 1556 break; 1557 case 'TD': 1558 div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>'; 1559 depth = 4; 1560 } 1561 $A(element.childNodes).each(function(node){ 1562 element.removeChild(node) 1563 }); 1564 depth.times(function(){ div = div.firstChild }); 1565 1566 $A(div.childNodes).each( 1567 function(node){ element.appendChild(node) }); 1568 } else { 1569 element.innerHTML = html.stripScripts(); 1570 } 1571 setTimeout(function() {html.evalScripts()}, 10); 1572 return element; 1573 } 1574 }; 1107 1575 1108 1576 Object.extend(Element, Element.Methods); … … 1110 1578 var _nativeExtensions = false; 1111 1579 1112 if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 1113 var HTMLElement = {} 1114 HTMLElement.prototype = document.createElement('div').__proto__; 1115 } 1580 if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 1581 ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { 1582 var className = 'HTML' + tag + 'Element'; 1583 if(window[className]) return; 1584 var klass = window[className] = {}; 1585 klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; 1586 }); 1116 1587 1117 1588 Element.addMethods = function(methods) { 1118 1589 Object.extend(Element.Methods, methods || {}); 1119 1590 1120 if(typeof HTMLElement != 'undefined') { 1121 var methods = Element.Methods, cache = Element.extend.cache; 1122 for (property in methods) { 1591 function copy(methods, destination, onlyIfAbsent) { 1592 onlyIfAbsent = onlyIfAbsent || false; 1593 var cache = Element.extend.cache; 1594 for (var property in methods) { 1123 1595 var value = methods[property]; 1124 if (typeof value == 'function') 1125 HTMLElement.prototype[property] = cache.findOrStore(value); 1126 } 1596 if (!onlyIfAbsent || !(property in destination)) 1597 destination[property] = cache.findOrStore(value); 1598 } 1599 } 1600 1601 if (typeof HTMLElement != 'undefined') { 1602 copy(Element.Methods, HTMLElement.prototype); 1603 copy(Element.Methods.Simulated, HTMLElement.prototype, true); 1604 copy(Form.Methods, HTMLFormElement.prototype); 1605 [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { 1606 copy(Form.Element.Methods, klass.prototype); 1607 }); 1127 1608 _nativeExtensions = true; 1128 1609 } 1129 1610 } 1130 1131 Element.addMethods();1132 1611 1133 1612 var Toggle = new Object(); … … 1149 1628 this.element.insertAdjacentHTML(this.adjacency, this.content); 1150 1629 } catch (e) { 1151 var tagName = this.element.tagName.to LowerCase();1152 if ( tagName == 'tbody' || tagName == 'tr') {1630 var tagName = this.element.tagName.toUpperCase(); 1631 if (['TBODY', 'TR'].include(tagName)) { 1153 1632 this.insertContent(this.contentFromAnonymousTable()); 1154 1633 } else { … … 1249 1728 add: function(classNameToAdd) { 1250 1729 if (this.include(classNameToAdd)) return; 1251 this.set( this.toArray().concat(classNameToAdd).join(' '));1730 this.set($A(this).concat(classNameToAdd).join(' ')); 1252 1731 }, 1253 1732 1254 1733 remove: function(classNameToRemove) { 1255 1734 if (!this.include(classNameToRemove)) return; 1256 this.set(this.select(function(className) { 1257 return className != classNameToRemove; 1258 }).join(' ')); 1735 this.set($A(this).without(classNameToRemove).join(' ')); 1259 1736 }, 1260 1737 1261 1738 toString: function() { 1262 return this.toArray().join(' ');1263 } 1264 } 1739 return $A(this).join(' '); 1740 } 1741 }; 1265 1742 1266 1743 Object.extend(Element.ClassNames.prototype, Enumerable); … … 1309 1786 conditions.push('true'); 1310 1787 if (clause = params.id) 1311 conditions.push('element. id== ' + clause.inspect());1788 conditions.push('element.readAttribute("id") == ' + clause.inspect()); 1312 1789 if (clause = params.tagName) 1313 1790 conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); 1314 1791 if ((clause = params.classNames).length > 0) 1315 for (var i = 0 ; i < clause.length; i++)1316 conditions.push(' Element.hasClassName(element,' + clause[i].inspect() + ')');1792 for (var i = 0, length = clause.length; i < length; i++) 1793 conditions.push('element.hasClassName(' + clause[i].inspect() + ')'); 1317 1794 if (clause = params.attributes) { 1318 1795 clause.each(function(attribute) { 1319 var value = 'element. getAttribute(' + attribute.name.inspect() + ')';1796 var value = 'element.readAttribute(' + attribute.name.inspect() + ')'; 1320 1797 var splitValueBy = function(delimiter) { 1321 1798 return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; … … 1330 1807 case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; 1331 1808 case '': 1332 case undefined: conditions.push( value + ' != null'); break;1809 case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break; 1333 1810 default: throw 'Unknown operator ' + attribute.operator + ' in selector'; 1334 1811 } … … 1341 1818 compileMatcher: function() { 1342 1819 this.match = new Function('element', 'if (!element.tagName) return false; \ 1820 element = $(element); \ 1343 1821 return ' + this.buildMatchExpression()); 1344 1822 }, … … 1355 1833 1356 1834 var results = []; 1357 for (var i = 0 ; i < scope.length; i++)1835 for (var i = 0, length = scope.length; i < length; i++) 1358 1836 if (this.match(element = scope[i])) 1359 1837 results.push(Element.extend(element)); … … 1367 1845 } 1368 1846 1847 Object.extend(Selector, { 1848 matchElements: function(elements, expression) { 1849 var selector = new Selector(expression); 1850 return elements.select(selector.match.bind(selector)).map(Element.extend); 1851 }, 1852 1853 findElement: function(elements, expression, index) { 1854 if (typeof expression == 'number') index = expression, expression = false; 1855 return Selector.matchElements(elements, expression || '*')[index || 0]; 1856 }, 1857 1858 findChildElements: function(element, expressions) { 1859 return expressions.map(function(expression) { 1860 return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) { 1861 var selector = new Selector(expr); 1862 return results.inject([], function(elements, result) { 1863 return elements.concat(selector.findElements(result || element)); 1864 }); 1865 }); 1866 }).flatten(); 1867 } 1868 }); 1869 1369 1870 function $$() { 1370 return $A(arguments).map(function(expression) { 1371 return expression.strip().split(/\s+/).inject([null], function(results, expr) { 1372 var selector = new Selector(expr); 1373 return results.map(selector.findElements.bind(selector)).flatten(); 1374 }); 1375 }).flatten(); 1376 } 1377 var Field = { 1378 clear: function() { 1379 for (var i = 0; i < arguments.length; i++) 1380 $(arguments[i]).value = ''; 1381 }, 1382 1871 return Selector.findChildElements(document, $A(arguments)); 1872 } 1873 var Form = { 1874 reset: function(form) { 1875 $(form).reset(); 1876 return form; 1877 }, 1878 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); 1895 } 1896 }; 1897 1898 Form.Methods = { 1899 serialize: function(form, getHash) { 1900 return Form.serializeElements(Form.getElements(form), getHash); 1901 }, 1902 1903 getElements: function(form) { 1904 return $A($(form).getElementsByTagName('*')).inject([], 1905 function(elements, child) { 1906 if (Form.Element.Serializers[child.tagName.toLowerCase()]) 1907 elements.push(Element.extend(child)); 1908 return elements; 1909 } 1910 ); 1911 }, 1912 1913 getInputs: function(form, typeName, name) { 1914 form = $(form); 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++) { 1920 var input = inputs[i]; 1921 if ((typeName && input.type != typeName) || (name && input.name != name)) 1922 continue; 1923 matchingInputs.push(Element.extend(input)); 1924 } 1925 1926 return matchingInputs; 1927 }, 1928 1929 disable: function(form) { 1930 form = $(form); 1931 form.getElements().each(function(element) { 1932 element.blur(); 1933 element.disabled = 'true'; 1934 }); 1935 return form; 1936 }, 1937 1938 enable: function(form) { 1939 form = $(form); 1940 form.getElements().each(function(element) { 1941 element.disabled = ''; 1942 }); 1943 return form; 1944 }, 1945 1946 findFirstElement: function(form) { 1947 return $(form).getElements().find(function(element) { 1948 return element.type != 'hidden' && !element.disabled && 1949 ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); 1950 }); 1951 }, 1952 1953 focusFirstElement: function(form) { 1954 form = $(form); 1955 form.findFirstElement().activate(); 1956 return form; 1957 } 1958 } 1959 1960 Object.extend(Form, Form.Methods); 1961 1962 /*--------------------------------------------------------------------------*/ 1963 1964 Form.Element = { 1383 1965 focus: function(element) { 1384 1966 $(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; 1967 return element; 1391 1968 }, 1392 1969 1393 1970 select: function(element) { 1394 1971 $(element).select(); 1972 return element; 1973 } 1974 } 1975 1976 Form.Element.Methods = { 1977 serialize: function(element) { 1978 element = $(element); 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 ''; 1988 }, 1989 1990 getValue: function(element) { 1991 element = $(element); 1992 var method = element.tagName.toLowerCase(); 1993 return Form.Element.Serializers[method](element); 1994 }, 1995 1996 clear: function(element) { 1997 $(element).value = ''; 1998 return element; 1999 }, 2000 2001 present: function(element) { 2002 return $(element).value != ''; 1395 2003 }, 1396 2004 … … 1398 2006 element = $(element); 1399 2007 element.focus(); 1400 if (element.select) 2008 if (element.select && ( element.tagName.toLowerCase() != 'input' || 2009 !['button', 'reset', 'submit'].include(element.type) ) ) 1401 2010 element.select(); 1402 } 1403 } 2011 return element; 2012 }, 2013 2014 disable: function(element) { 2015 element = $(element); 2016 element.disabled = true; 2017 return element; 2018 }, 2019 2020 enable: function(element) { 2021 element = $(element); 2022 element.blur(); 2023 element.disabled = false; 2024 return element; 2025 } 2026 } 2027 2028 Object.extend(Form.Element, Form.Element.Methods); 2029 var Field = Form.Element; 2030 var $F = Form.Element.getValue; 1404 2031 1405 2032 /*--------------------------------------------------------------------------*/ 1406 1407 var Form = {1408 serialize: function(form) {1409 var elements = Form.getElements($(form));1410 var queryComponents = new Array();1411 1412 for (var i = 0; i < elements.length; i++) {1413 var queryComponent = Form.Element.serialize(elements[i]);1414 if (queryComponent)1415 queryComponents.push(queryComponent);1416 }1417 1418 return queryComponents.join('&');1419 },1420 1421 getElements: function(form) {1422 form = $(form);1423 var elements = new Array();1424 1425 for (var tagName in Form.Element.Serializers) {1426 var tagElements = form.getElementsByTagName(tagName);1427 for (var j = 0; j < tagElements.length; j++)1428 elements.push(tagElements[j]);1429 }1430 return elements;1431 },1432 1433 getInputs: function(form, typeName, name) {1434 form = $(form);1435 var inputs = form.getElementsByTagName('input');1436 1437 if (!typeName && !name)1438 return inputs;1439 1440 var matchingInputs = new Array();1441 for (var i = 0; i < inputs.length; i++) {1442 var input = inputs[i];1443 if ((typeName && input.type != typeName) ||1444 (name && input.name != name))1445 continue;1446 matchingInputs.push(input);1447 }1448 1449 return matchingInputs;1450 },1451 1452 disable: function(form) {1453 var elements = Form.getElements(form);1454 for (var i = 0; i < elements.length; i++) {1455 var element = elements[i];1456 element.blur();1457 element.disabled = 'true';1458 }1459 },1460 1461 enable: function(form) {1462 var elements = Form.getElements(form);1463 for (var i = 0; i < elements.length; i++) {1464 var element = elements[i];1465 element.disabled = '';1466 }1467 },1468 1469 findFirstElement: function(form) {1470 return Form.getElements(form).find(function(element) {1471 return element.type != 'hidden' && !element.disabled &&1472 ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());1473 });1474 },1475 1476 focusFirstElement: function(form) {1477 Field.activate(Form.findFirstElement(form));1478 },1479 1480 reset: function(form) {1481 $(form).reset();1482 }1483 }1484 1485 Form.Element = {1486 serialize: function(element) {1487 element = $(element);1488 var method = element.tagName.toLowerCase();1489 var parameter = Form.Element.Serializers[method](element);1490 1491 if (parameter) {1492 var key = encodeURIComponent(parameter[0]);1493 if (key.length == 0) return;1494 1495 if (parameter[1].constructor != Array)1496 parameter[1] = [parameter[1]];1497 1498 return parameter[1].map(function(value) {1499 return key + '=' + encodeURIComponent(value);1500 }).join('&');1501 }1502 },1503 1504 getValue: function(element) {1505 element = $(element);1506 var method = element.tagName.toLowerCase();1507 var parameter = Form.Element.Serializers[method](element);1508 1509 if (parameter)1510 return parameter[1];1511 }1512 }1513 2033 1514 2034 Form.Element.Serializers = { 1515 2035 input: function(element) { 1516 2036 switch (element.type.toLowerCase()) { 1517 case 'submit':1518 case 'hidden':1519 case 'password':1520 case 'text':1521 return Form.Element.Serializers.textarea(element);1522 2037 case 'checkbox': 1523 2038 case 'radio': 1524 2039 return Form.Element.Serializers.inputSelector(element); 1525 } 1526 return false; 2040 default: 2041 return Form.Element.Serializers.textarea(element); 2042 } 1527 2043 }, 1528 2044 1529 2045 inputSelector: function(element) { 1530 if (element.checked) 1531 return [element.name, element.value]; 2046 return element.checked ? element.value : null; 1532 2047 }, 1533 2048 1534 2049 textarea: function(element) { 1535 return [element.name, element.value];2050 return element.value; 1536 2051 }, 1537 2052 1538 2053 select: function(element) { 1539 return Form.Element.Serializers[element.type == 'select-one' ?2054 return this[element.type == 'select-one' ? 1540 2055 'selectOne' : 'selectMany'](element); 1541 2056 }, 1542 2057 1543 2058 selectOne: function(element) { 1544 var value = '', opt, index = element.selectedIndex; 1545 if (index >= 0) { 1546 opt = element.options[index]; 1547 value = opt.value || opt.text; 1548 } 1549 return [element.name, value]; 2059 var index = element.selectedIndex; 2060 return index >= 0 ? this.optionValue(element.options[index]) : null; 1550 2061 }, 1551 2062 1552 2063 selectMany: function(element) { 1553 var value = []; 1554 for (var i = 0; i < element.length; i++) { 2064 var values, length = element.length; 2065 if (!length) return null; 2066 2067 for (var i = 0, values = []; i < length; i++) { 1555 2068 var opt = element.options[i]; 1556 if (opt.selected) 1557 value.push(opt.value || opt.text);1558 }1559 return [element.name, value];1560 } 1561 } 1562 1563 /*--------------------------------------------------------------------------*/ 1564 1565 var $F = Form.Element.getValue; 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 } 1566 2079 1567 2080 /*--------------------------------------------------------------------------*/ … … 1584 2097 onTimerEvent: function() { 1585 2098 var value = this.getValue(); 1586 if (this.lastValue != value) { 2099 var changed = ('string' == typeof this.lastValue && 'string' == typeof value 2100 ? this.lastValue != value : String(this.lastValue) != String(value)); 2101 if (changed) { 1587 2102 this.callback(this.element, value); 1588 2103 this.lastValue = value; … … 1629 2144 1630 2145 registerFormCallbacks: function() { 1631 var elements = Form.getElements(this.element); 1632 for (var i = 0; i < elements.length; i++) 1633 this.registerCallback(elements[i]); 2146 Form.getElements(this.element).each(this.registerCallback.bind(this)); 1634 2147 }, 1635 2148 … … 1641 2154 Event.observe(element, 'click', this.onElementEvent.bind(this)); 1642 2155 break; 1643 case 'password': 1644 case 'text': 1645 case 'textarea': 1646 case 'select-one': 1647 case 'select-multiple': 2156 default: 1648 2157 Event.observe(element, 'change', this.onElementEvent.bind(this)); 1649 2158 break; … … 1680 2189 KEY_DOWN: 40, 1681 2190 KEY_DELETE: 46, 2191 KEY_HOME: 36, 2192 KEY_END: 35, 2193 KEY_PAGEUP: 33, 2194 KEY_PAGEDOWN: 34, 1682 2195 1683 2196 element: function(event) { … … 1735 2248 unloadCache: function() { 1736 2249 if (!Event.observers) return; 1737 for (var i = 0 ; i < Event.observers.length; i++) {2250 for (var i = 0, length = Event.observers.length; i < length; i++) { 1738 2251 Event.stopObserving.apply(this, Event.observers[i]); 1739 2252 Event.observers[i][0] = null; … … 1743 2256 1744 2257 observe: function(element, name, observer, useCapture) { 1745 varelement = $(element);2258 element = $(element); 1746 2259 useCapture = useCapture || false; 1747 2260 … … 1751 2264 name = 'keydown'; 1752 2265 1753 this._observeAndCache(element, name, observer, useCapture);2266 Event._observeAndCache(element, name, observer, useCapture); 1754 2267 }, 1755 2268 1756 2269 stopObserving: function(element, name, observer, useCapture) { 1757 varelement = $(element);2270 element = $(element); 1758 2271 useCapture = useCapture || false; 1759 2272 … … 1822 2335 element = element.offsetParent; 1823 2336 if (element) { 1824 p = Element.getStyle(element, 'position'); 2337 if(element.tagName=='BODY') break; 2338 var p = Element.getStyle(element, 'position'); 1825 2339 if (p == 'relative' || p == 'absolute') break; 1826 2340 } … … 1878 2392 }, 1879 2393 1880 clone: function(source, target) {1881 source = $(source);1882 target = $(target);1883 target.style.position = 'absolute';1884 var offsets = this.cumulativeOffset(source);1885 target.style.top = offsets[1] + 'px';1886 target.style.left = offsets[0] + 'px';1887 target.style.width = source.offsetWidth + 'px';1888 target.style.height = source.offsetHeight + 'px';1889 },1890 1891 2394 page: function(forElement) { 1892 2395 var valueT = 0, valueL = 0; … … 1905 2408 element = forElement; 1906 2409 do { 1907 valueT -= element.scrollTop || 0; 1908 valueL -= element.scrollLeft || 0; 2410 if (!window.opera || element.tagName=='BODY') { 2411 valueT -= element.scrollTop || 0; 2412 valueL -= element.scrollLeft || 0; 2413 } 1909 2414 } while (element = element.parentNode); 1910 2415 … … 1967 2472 1968 2473 element.style.position = 'absolute'; 1969 element.style.top = top + 'px'; ;1970 element.style.left = left + 'px'; ;1971 element.style.width = width + 'px'; ;1972 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'; 1973 2478 }, 1974 2479 … … 2007 2512 } 2008 2513 } 2514 2515 Element.addMethods(); -
trunk/wp-includes/js/scriptaculous/MIT-LICENSE
r4629 r4813 1 Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)1 Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 2 3 3 Permission is hereby granted, free of charge, to any person obtaining -
trunk/wp-includes/js/scriptaculous/builder.js
r4629 r4813 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 1 // script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 4 // 3 // See scriptaculous.js for full license. 5 // script.aculo.us is freely distributable under the terms of an MIT-style license. 6 // For details, see the script.aculo.us web site: http://script.aculo.us/ 4 7 5 8 var Builder = { … … 34 37 35 38 // see if browser added wrapping tags 36 if(element && (element.tagName != elementName))39 if(element && (element.tagName.toUpperCase() != elementName)) 37 40 element = element.getElementsByTagName(elementName)[0]; 38 41 … … 62 65 element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; 63 66 } 64 if(element.tagName != elementName)67 if(element.tagName.toUpperCase() != elementName) 65 68 element = parentElement.getElementsByTagName(elementName)[0]; 66 69 } … … 76 79 return document.createTextNode(text); 77 80 }, 81 82 ATTR_MAP: { 83 'className': 'class', 84 'htmlFor': 'for' 85 }, 86 78 87 _attributes: function(attributes) { 79 88 var attrs = []; 80 89 for(attribute in attributes) 81 attrs.push((attribute =='className' ? 'class': attribute) +90 attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + 82 91 '="' + attributes[attribute].toString().escapeHTML() + '"'); 83 92 return attrs.join(" "); … … 98 107 _isStringOrNumber: function(param) { 99 108 return(typeof param=='string' || typeof param=='number'); 109 }, 110 build: function(html) { 111 var element = this.node('div'); 112 $(element).update(html.strip()); 113 return element.down(); 114 }, 115 dump: function(scope) { 116 if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 117 118 var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + 119 "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + 120 "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ 121 "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ 122 "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ 123 "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); 124 125 tags.each( function(tag){ 126 scope[tag] = function() { 127 return Builder.node.apply(Builder, [tag].concat($A(arguments))); 128 } 129 }); 100 130 } 101 131 } -
trunk/wp-includes/js/scriptaculous/controls.js
r4629 r4813 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 // (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan) 3 // (c) 2005 Jon Tirsen (http://www.tirsen.com) 1 // script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 // (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan) 5 // (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com) 4 6 // Contributors: 5 7 // Richard Livsey … … 7 9 // Rob Wills 8 10 // 9 // See scriptaculous.js for full license. 11 // script.aculo.us is freely distributable under the terms of an MIT-style license. 12 // For details, see the script.aculo.us web site: http://script.aculo.us/ 10 13 11 14 // Autocompleter.Base handles all the autocompletion functionality … … 33 36 // useful when one of the tokens is \n (a newline), as it 34 37 // allows smart autocompletion after linebreaks. 38 39 if(typeof Effect == 'undefined') 40 throw("controls.js requires including script.aculo.us' effects.js library"); 35 41 36 42 var Autocompleter = {} … … 46 52 this.entryCount = 0; 47 53 48 if 54 if(this.setOptions) 49 55 this.setOptions(options); 50 56 else … … 56 62 this.options.minChars = this.options.minChars || 1; 57 63 this.options.onShow = this.options.onShow || 58 function(element, update){ 59 if(!update.style.position || update.style.position=='absolute') { 60 update.style.position = 'absolute'; 61 Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight}); 62 } 63 Effect.Appear(update,{duration:0.15}); 64 }; 64 function(element, update){ 65 if(!update.style.position || update.style.position=='absolute') { 66 update.style.position = 'absolute'; 67 Position.clone(element, update, { 68 setHeight: false, 69 offsetTop: element.offsetHeight 70 }); 71 } 72 Effect.Appear(update,{duration:0.15}); 73 }; 65 74 this.options.onHide = this.options.onHide || 66 function(element, update){ new Effect.Fade(update,{duration:0.15}) };67 68 if 75 function(element, update){ new Effect.Fade(update,{duration:0.15}) }; 76 77 if(typeof(this.options.tokens) == 'string') 69 78 this.options.tokens = new Array(this.options.tokens); 70 79 … … 95 104 96 105 fixIEOverlapping: function() { 97 Position.clone(this.update, this.iefix );106 Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); 98 107 this.iefix.style.zIndex = 1; 99 108 this.update.style.zIndex = 2; … … 203 212 if(this.index > 0) this.index-- 204 213 else this.index = this.entryCount-1; 214 this.getEntry(this.index).scrollIntoView(true); 205 215 }, 206 216 … … 208 218 if(this.index < this.entryCount-1) this.index++ 209 219 else this.index = 0; 220 this.getEntry(this.index).scrollIntoView(false); 210 221 }, 211 222 … … 255 266 this.update.innerHTML = choices; 256 267 Element.cleanWhitespace(this.update); 257 Element.cleanWhitespace(this.update. firstChild);258 259 if(this.update.firstChild && this.update. firstChild.childNodes) {268 Element.cleanWhitespace(this.update.down()); 269 270 if(this.update.firstChild && this.update.down().childNodes) { 260 271 this.entryCount = 261 this.update. firstChild.childNodes.length;272 this.update.down().childNodes.length; 262 273 for (var i = 0; i < this.entryCount; i++) { 263 274 var entry = this.getEntry(i); … … 270 281 271 282 this.stopIndicator(); 272 273 283 this.index = 0; 274 this.render(); 284 285 if(this.entryCount==1 && this.options.autoSelect) { 286 this.selectEntry(); 287 this.hide(); 288 } else { 289 this.render(); 290 } 275 291 } 276 292 }, … … 460 476 461 477 this.options = Object.extend({ 478 paramName: "value", 462 479 okButton: true, 463 480 okText: "ok", … … 532 549 this.createForm(); 533 550 this.element.parentNode.insertBefore(this.form, this.element); 534 Field.scrollFreeActivate(this.editField);551 if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField); 535 552 // stop the event to avoid a page refresh in Safari 536 553 if (evt) { … … 591 608 textField.obj = this; 592 609 textField.type = "text"; 593 textField.name = "value";610 textField.name = this.options.paramName; 594 611 textField.value = text; 595 612 textField.style.backgroundColor = this.options.highlightcolor; … … 604 621 var textArea = document.createElement("textarea"); 605 622 textArea.obj = this; 606 textArea.name = "value";623 textArea.name = this.options.paramName; 607 624 textArea.value = this.convertHTMLLineBreaks(text); 608 625 textArea.rows = this.options.rows; … … 637 654 this.editField.disabled = false; 638 655 this.editField.value = transport.responseText.stripTags(); 656 Field.scrollFreeActivate(this.editField); 639 657 }, 640 658 onclickCancel: function() { … … 773 791 optionTag = document.createElement("option"); 774 792 optionTag.value = (e instanceof Array) ? e[0] : e; 793 if((typeof this.options.value == 'undefined') && 794 ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true; 775 795 if(this.options.value==optionTag.value) optionTag.selected = true; 776 796 optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e)); -
trunk/wp-includes/js/scriptaculous/dragdrop.js
r4629 r4813 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 // (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) 1 // script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 // (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) 3 5 // 4 // See scriptaculous.js for full license. 5 6 /*--------------------------------------------------------------------------*/ 6 // script.aculo.us is freely distributable under the terms of an MIT-style license. 7 // For details, see the script.aculo.us web site: http://script.aculo.us/ 8 9 if(typeof Effect == 'undefined') 10 throw("dragdrop.js requires including script.aculo.us' effects.js library"); 7 11 8 12 var Droppables = { … … 146 150 147 151 activate: function(draggable) { 148 window.focus(); // allows keypress events if window isn't currently focused, fails for Safari 149 this.activeDraggable = draggable; 152 if(draggable.options.delay) { 153 this._timeout = setTimeout(function() { 154 Draggables._timeout = null; 155 window.focus(); 156 Draggables.activeDraggable = draggable; 157 }.bind(this), draggable.options.delay); 158 } else { 159 window.focus(); // allows keypress events if window isn't currently focused, fails for Safari 160 this.activeDraggable = draggable; 161 } 150 162 }, 151 163 … … 161 173 if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; 162 174 this._lastPointer = pointer; 175 163 176 this.activeDraggable.updateDrag(event, pointer); 164 177 }, 165 178 166 179 endDrag: function(event) { 180 if(this._timeout) { 181 clearTimeout(this._timeout); 182 this._timeout = null; 183 } 167 184 if(!this.activeDraggable) return; 168 185 this._lastPointer = null; … … 191 208 if(o[eventName]) o[eventName](eventName, draggable, event); 192 209 }); 210 if(draggable.options[eventName]) draggable.options[eventName](draggable, event); 193 211 }, 194 212 … … 205 223 206 224 var Draggable = Class.create(); 225 Draggable._dragging = {}; 226 207 227 Draggable.prototype = { 208 228 initialize: function(element) { 209 var options = Object.extend({229 var defaults = { 210 230 handle: false, 211 starteffect: function(element) {212 element._opacity = Element.getOpacity(element);213 new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});214 },215 231 reverteffect: function(element, top_offset, left_offset) { 216 232 var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; 217 element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur}); 233 new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, 234 queue: {scope:'_draggable', position:'end'} 235 }); 218 236 }, 219 237 endeffect: function(element) { 220 var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0 221 new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity}); 238 var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0; 239 new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 240 queue: {scope:'_draggable', position:'end'}, 241 afterFinish: function(){ 242 Draggable._dragging[element] = false 243 } 244 }); 222 245 }, 223 246 zindex: 1000, … … 226 249 scrollSensitivity: 20, 227 250 scrollSpeed: 15, 228 snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] } 229 }, arguments[1] || {}); 251 snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } 252 delay: 0 253 }; 254 255 if(!arguments[1] || typeof arguments[1].endeffect == 'undefined') 256 Object.extend(defaults, { 257 starteffect: function(element) { 258 element._opacity = Element.getOpacity(element); 259 Draggable._dragging[element] = true; 260 new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 261 } 262 }); 263 264 var options = Object.extend(defaults, arguments[1] || {}); 230 265 231 266 this.element = $(element); 232 267 233 if(options.handle && (typeof options.handle == 'string')) { 234 var h = Element.childrenWithClassName(this.element, options.handle, true); 235 if(h.length>0) this.handle = h[0]; 236 } 268 if(options.handle && (typeof options.handle == 'string')) 269 this.handle = this.element.down('.'+options.handle, 0); 270 237 271 if(!this.handle) this.handle = $(options.handle); 238 272 if(!this.handle) this.handle = this.element; 239 273 240 if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) 274 if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { 241 275 options.scroll = $(options.scroll); 276 this._isScrollChild = Element.childOf(this.element, options.scroll); 277 } 242 278 243 279 Element.makePositioned(this.element); // fix IE … … 265 301 266 302 initDrag: function(event) { 303 if(typeof Draggable._dragging[this.element] != 'undefined' && 304 Draggable._dragging[this.element]) return; 267 305 if(Event.isLeftClick(event)) { 268 306 // abort on form elements, fixes a Firefox issue 269 307 var src = Event.element(event); 270 if( src.tagName&& (271 src.tagName=='INPUT' ||272 src.tagName=='SELECT' ||273 src.tagName=='OPTION' ||274 src.tagName=='BUTTON' ||275 src.tagName=='TEXTAREA')) return;308 if((tag_name = src.tagName.toUpperCase()) && ( 309 tag_name=='INPUT' || 310 tag_name=='SELECT' || 311 tag_name=='OPTION' || 312 tag_name=='BUTTON' || 313 tag_name=='TEXTAREA')) return; 276 314 277 if(this.element._revert) {278 this.element._revert.cancel();279 this.element._revert = null;280 }281 282 315 var pointer = [Event.pointerX(event), Event.pointerY(event)]; 283 316 var pos = Position.cumulativeOffset(this.element); … … 315 348 316 349 Draggables.notify('onStart', this, event); 350 317 351 if(this.options.starteffect) this.options.starteffect(this.element); 318 352 }, … … 323 357 Droppables.show(pointer, this.element); 324 358 Draggables.notify('onDrag', this, event); 359 325 360 this.draw(pointer); 326 361 if(this.options.change) this.options.change(this); … … 334 369 } else { 335 370 p = Position.page(this.options.scroll); 336 p[0] += this.options.scroll.scrollLeft ;337 p[1] += this.options.scroll.scrollTop ;371 p[0] += this.options.scroll.scrollLeft + Position.deltaX; 372 p[1] += this.options.scroll.scrollTop + Position.deltaY; 338 373 p.push(p[0]+this.options.scroll.offsetWidth); 339 374 p.push(p[1]+this.options.scroll.offsetHeight); … … 381 416 if(this.options.endeffect) 382 417 this.options.endeffect(this.element); 383 418 384 419 Draggables.deactivate(this); 385 420 Droppables.reset(); … … 401 436 draw: function(point) { 402 437 var pos = Position.cumulativeOffset(this.element); 438 if(this.options.ghosting) { 439 var r = Position.realOffset(this.element); 440 pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; 441 } 442 403 443 var d = this.currentDelta(); 404 444 pos[0] -= d[0]; pos[1] -= d[1]; 405 445 406 if(this.options.scroll && (this.options.scroll != window )) {446 if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { 407 447 pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; 408 448 pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; … … 431 471 if((!this.options.constraint) || (this.options.constraint=='vertical')) 432 472 style.top = p[1] + "px"; 473 433 474 if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering 434 475 }, … … 443 484 444 485 startScrolling: function(speed) { 486 if(!(speed[0] || speed[1])) return; 445 487 this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; 446 488 this.lastScrolled = new Date(); … … 467 509 Droppables.show(Draggables._lastPointer, this.element); 468 510 Draggables.notify('onDrag', this); 469 Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 470 Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; 471 Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; 472 if (Draggables._lastScrollPointer[0] < 0) 473 Draggables._lastScrollPointer[0] = 0; 474 if (Draggables._lastScrollPointer[1] < 0) 475 Draggables._lastScrollPointer[1] = 0; 476 this.draw(Draggables._lastScrollPointer); 511 if (this._isScrollChild) { 512 Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); 513 Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; 514 Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; 515 if (Draggables._lastScrollPointer[0] < 0) 516 Draggables._lastScrollPointer[0] = 0; 517 if (Draggables._lastScrollPointer[1] < 0) 518 Draggables._lastScrollPointer[1] = 0; 519 this.draw(Draggables._lastScrollPointer); 520 } 477 521 478 522 if(this.options.change) this.options.change(this); … … 526 570 527 571 var Sortable = { 572 SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, 573 528 574 sortables: {}, 529 575 530 576 _findRootElement: function(element) { 531 while (element.tagName != "BODY") {577 while (element.tagName.toUpperCase() != "BODY") { 532 578 if(element.id && Sortable.sortables[element.id]) return element; 533 579 element = element.parentNode; … … 566 612 handle: false, // or a CSS class 567 613 only: false, 614 delay: 0, 568 615 hoverclass: null, 569 616 ghosting: false, … … 571 618 scrollSensitivity: 20, 572 619 scrollSpeed: 15, 573 format: /^[^_]*_(.*)$/,620 format: this.SERIALIZE_RULE, 574 621 onChange: Prototype.emptyFunction, 575 622 onUpdate: Prototype.emptyFunction … … 585 632 scrollSpeed: options.scrollSpeed, 586 633 scrollSensitivity: options.scrollSensitivity, 634 delay: options.delay, 587 635 ghosting: options.ghosting, 588 636 constraint: options.constraint, … … 613 661 hoverclass: options.hoverclass, 614 662 onHover: Sortable.onHover 615 //greedy: !options.dropOnEmpty616 663 } 617 664 … … 638 685 // handles are per-draggable 639 686 var handle = options.handle ? 640 Element.childrenWithClassName(e, options.handle)[0]: e;687 $(e).down('.'+options.handle,0) : e; 641 688 options.draggables.push( 642 689 new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); … … 709 756 var index; 710 757 711 var children = Sortable.findElements(dropon, {tag: droponOptions.tag });758 var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); 712 759 var child = null; 713 760 … … 736 783 737 784 unmark: function() { 738 if(Sortable._marker) Element.hide(Sortable._marker);785 if(Sortable._marker) Sortable._marker.hide(); 739 786 }, 740 787 … … 745 792 746 793 if(!Sortable._marker) { 747 Sortable._marker = $('dropmarker') || document.createElement('DIV'); 748 Element.hide(Sortable._marker); 749 Element.addClassName(Sortable._marker, 'dropmarker'); 750 Sortable._marker.style.position = 'absolute'; 794 Sortable._marker = 795 ($('dropmarker') || Element.extend(document.createElement('DIV'))). 796 hide().addClassName('dropmarker').setStyle({position:'absolute'}); 751 797 document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); 752 798 } 753 799 var offsets = Position.cumulativeOffset(dropon); 754 Sortable._marker.style.left = offsets[0] + 'px'; 755 Sortable._marker.style.top = offsets[1] + 'px'; 800 Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); 756 801 757 802 if(position=='after') 758 803 if(sortable.overlap == 'horizontal') 759 Sortable._marker.s tyle.left = (offsets[0]+dropon.clientWidth) + 'px';804 Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); 760 805 else 761 Sortable._marker.s tyle.top = (offsets[1]+dropon.clientHeight) + 'px';762 763 Element.show(Sortable._marker);806 Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); 807 808 Sortable._marker.show(); 764 809 }, 765 810 … … 776 821 element: element, 777 822 parent: parent, 778 children: new Array,823 children: [], 779 824 position: parent.children.length, 780 container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())825 container: $(children[i]).down(options.treeTag) 781 826 } 782 827 … … 789 834 790 835 return parent; 791 },792 793 /* Finds the first element of the given tag type within a parent element.794 Used for finding the first LI[ST] within a L[IST]I[TEM].*/795 _findChildrenElement: function (element, containerTag) {796 if (element && element.hasChildNodes)797 for (var i = 0; i < element.childNodes.length; ++i)798 if (element.childNodes[i].tagName == containerTag)799 return element.childNodes[i];800 801 return null;802 836 }, 803 837 … … 816 850 id: null, 817 851 parent: null, 818 children: new Array,852 children: [], 819 853 container: element, 820 854 position: 0 821 855 } 822 856 823 return Sortable._tree 857 return Sortable._tree(element, options, root); 824 858 }, 825 859 … … 870 904 if (options.tree) { 871 905 return Sortable.tree(element, arguments[1]).children.map( function (item) { 872 return [name + Sortable._constructIndex(item) + " =" +906 return [name + Sortable._constructIndex(item) + "[id]=" + 873 907 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); 874 908 }).flatten().join('&'); … … 881 915 } 882 916 883 / * Returns true if child is contained within element */917 // Returns true if child is contained within element 884 918 Element.isParent = function(child, element) { 885 919 if (!child.parentNode || child == element) return false; 886 887 920 if (child.parentNode == element) return true; 888 889 921 return Element.isParent(child.parentNode, element); 890 922 } … … 909 941 910 942 Element.offsetSize = function (element, type) { 911 if (type == 'vertical' || type == 'height') 912 return element.offsetHeight; 913 else 914 return element.offsetWidth; 943 return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; 915 944 } -
trunk/wp-includes/js/scriptaculous/effects.js
r4629 r4813 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 1 // script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 4 // Contributors: 3 5 // Justin Palmer (http://encytemedia.com/) … … 5 7 // Martin Bialasinki 6 8 // 7 // See scriptaculous.js for full license. 9 // script.aculo.us is freely distributable under the terms of an MIT-style license. 10 // For details, see the script.aculo.us web site: http://script.aculo.us/ 8 11 9 12 // converts rgb() and #xxx to #xxxxxx format, 10 13 // returns self (or first argument) if not convertable 11 14 String.prototype.parseColor = function() { 12 var color = '#'; 15 var color = '#'; 13 16 if(this.slice(0,4) == 'rgb(') { 14 17 var cols = this.slice(4,this.length-1).split(','); … … 42 45 Element.setContentZoom = function(element, percent) { 43 46 element = $(element); 44 Element.setStyle(element,{fontSize: (percent/100) + 'em'});47 element.setStyle({fontSize: (percent/100) + 'em'}); 45 48 if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); 46 } 47 48 Element.getOpacity = function(element){ 49 var opacity; 50 if (opacity = Element.getStyle(element, 'opacity')) 51 return parseFloat(opacity); 52 if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) 53 if(opacity[1]) return parseFloat(opacity[1]) / 100; 54 return 1.0; 55 } 56 57 Element.setOpacity = function(element, value){ 58 element= $(element); 59 if (value == 1){ 60 Element.setStyle(element, { opacity: 61 (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 62 0.999999 : null }); 63 if(/MSIE/.test(navigator.userAgent)) 64 Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); 65 } else { 66 if(value < 0.00001) value = 0; 67 Element.setStyle(element, {opacity: value}); 68 if(/MSIE/.test(navigator.userAgent)) 69 Element.setStyle(element, 70 { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + 71 'alpha(opacity='+value*100+')' }); 72 } 73 } 74 75 Element.getInlineOpacity = function(element){ 49 return element; 50 } 51 52 Element.getOpacity = function(element){ 53 return $(element).getStyle('opacity'); 54 } 55 56 Element.setOpacity = function(element, value){ 57 return $(element).setStyle({opacity:value}); 58 } 59 60 Element.getInlineOpacity = function(element){ 76 61 return $(element).style.opacity || ''; 77 }78 79 Element.childrenWithClassName = function(element, className, findFirst) {80 var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");81 var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {82 return (c.className && c.className.match(classNameRegExp));83 });84 if(!results) results = [];85 return results;86 62 } 87 63 … … 105 81 106 82 var Effect = { 83 _elementDoesNotExistError: { 84 name: 'ElementDoesNotExistError', 85 message: 'The specified DOM element does not exist, but is required for this effect to operate' 86 }, 107 87 tagifyText: function(element) { 88 if(typeof Builder == 'undefined') 89 throw("Effect.tagifyText requires including script.aculo.us' builder.js library"); 90 108 91 var tagifyStyle = 'position:relative'; 109 if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; 92 if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1'; 93 110 94 element = $(element); 111 95 $A(element.childNodes).each( function(child) { … … 160 144 /* ------------- transitions ------------- */ 161 145 162 Effect.Transitions = {} 163 164 Effect.Transitions.linear = function(pos) { 165 return pos; 166 } 167 Effect.Transitions.sinoidal = function(pos) { 168 return (-Math.cos(pos*Math.PI)/2) + 0.5; 169 } 170 Effect.Transitions.reverse = function(pos) { 171 return 1-pos; 172 } 173 Effect.Transitions.flicker = function(pos) { 174 return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; 175 } 176 Effect.Transitions.wobble = function(pos) { 177 return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; 178 } 179 Effect.Transitions.pulse = function(pos) { 180 return (Math.floor(pos*10) % 2 == 0 ? 181 (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); 182 } 183 Effect.Transitions.none = function(pos) { 184 return 0; 185 } 186 Effect.Transitions.full = function(pos) { 187 return 1; 188 } 146 Effect.Transitions = { 147 linear: Prototype.K, 148 sinoidal: function(pos) { 149 return (-Math.cos(pos*Math.PI)/2) + 0.5; 150 }, 151 reverse: function(pos) { 152 return 1-pos; 153 }, 154 flicker: function(pos) { 155 return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; 156 }, 157 wobble: function(pos) { 158 return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; 159 }, 160 pulse: function(pos, pulses) { 161 pulses = pulses || 5; 162 return ( 163 Math.round((pos % (1/pulses)) * pulses) == 0 ? 164 ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 165 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) 166 ); 167 }, 168 none: function(pos) { 169 return 0; 170 }, 171 full: function(pos) { 172 return 1; 173 } 174 }; 189 175 190 176 /* ------------- core effects ------------- */ … … 213 199 }); 214 200 break; 201 case 'with-last': 202 timestamp = this.effects.pluck('startOn').max() || timestamp; 203 break; 215 204 case 'end': 216 205 // start effect after last queued effect has finished … … 226 215 227 216 if(!this.interval) 228 this.interval = setInterval(this.loop.bind(this), 40);217 this.interval = setInterval(this.loop.bind(this), 15); 229 218 }, 230 219 remove: function(effect) { … … 237 226 loop: function() { 238 227 var timePos = new Date().getTime(); 239 this.effects.invoke('loop', timePos); 228 for(var i=0, len=this.effects.length;i<len;i++) 229 if(this.effects[i]) this.effects[i].loop(timePos); 240 230 } 241 231 }); … … 257 247 transition: Effect.Transitions.sinoidal, 258 248 duration: 1.0, // seconds 259 fps: 25.0, // max. 25fps due to Effect.Queue implementation249 fps: 60.0, // max. 60fps due to Effect.Queue implementation 260 250 sync: false, // true for combining 261 251 from: 0.0, … … 325 315 }, 326 316 inspect: function() { 327 return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>'; 317 var data = $H(); 318 for(property in this) 319 if(typeof this[property] != 'function') data[property] = this[property]; 320 return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>'; 328 321 } 329 322 } … … 349 342 }); 350 343 344 Effect.Event = Class.create(); 345 Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), { 346 initialize: function() { 347 var options = Object.extend({ 348 duration: 0 349 }, arguments[0] || {}); 350 this.start(options); 351 }, 352 update: Prototype.emptyFunction 353 }); 354 351 355 Effect.Opacity = Class.create(); 352 356 Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { 353 357 initialize: function(element) { 354 358 this.element = $(element); 359 if(!this.element) throw(Effect._elementDoesNotExistError); 355 360 // make this work on IE on elements without 'layout' 356 if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))361 if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) 357 362 this.element.setStyle({zoom: 1}); 358 363 var options = Object.extend({ … … 371 376 initialize: function(element) { 372 377 this.element = $(element); 378 if(!this.element) throw(Effect._elementDoesNotExistError); 373 379 var options = Object.extend({ 374 380 x: 0, … … 394 400 update: function(position) { 395 401 this.element.setStyle({ 396 left: this.options.x * position + this.originalLeft+ 'px',397 top: this.options.y * position + this.originalTop+ 'px'402 left: Math.round(this.options.x * position + this.originalLeft) + 'px', 403 top: Math.round(this.options.y * position + this.originalTop) + 'px' 398 404 }); 399 405 } … … 409 415 Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { 410 416 initialize: function(element, percent) { 411 this.element = $(element) 417 this.element = $(element); 418 if(!this.element) throw(Effect._elementDoesNotExistError); 412 419 var options = Object.extend({ 413 420 scaleX: true, … … 434 441 435 442 var fontSize = this.element.getStyle('font-size') || '100%'; 436 ['em','px','%' ].each( function(fontSizeType) {443 ['em','px','%','pt'].each( function(fontSizeType) { 437 444 if(fontSize.indexOf(fontSizeType)>0) { 438 445 this.fontSize = parseFloat(fontSize); … … 459 466 }, 460 467 finish: function(position) { 461 if 468 if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle); 462 469 }, 463 470 setDimensions: function(height, width) { 464 471 var d = {}; 465 if(this.options.scaleX) d.width = width+ 'px';466 if(this.options.scaleY) d.height = height+ 'px';472 if(this.options.scaleX) d.width = Math.round(width) + 'px'; 473 if(this.options.scaleY) d.height = Math.round(height) + 'px'; 467 474 if(this.options.scaleFromCenter) { 468 475 var topd = (height - this.dims[0])/2; … … 484 491 initialize: function(element) { 485 492 this.element = $(element); 493 if(!this.element) throw(Effect._elementDoesNotExistError); 486 494 var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); 487 495 this.start(options); … … 491 499 if(this.element.getStyle('display')=='none') { this.cancel(); return; } 492 500 // Disable background image during the effect 493 this.oldStyle = { 494 backgroundImage: this.element.getStyle('background-image') }; 495 this.element.setStyle({backgroundImage: 'none'}); 501 this.oldStyle = {}; 502 if (!this.options.keepBackgroundImage) { 503 this.oldStyle.backgroundImage = this.element.getStyle('background-image'); 504 this.element.setStyle({backgroundImage: 'none'}); 505 } 496 506 if(!this.options.endcolor) 497 507 this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); … … 548 558 afterFinishInternal: function(effect) { 549 559 if(effect.options.to!=0) return; 550 effect.element.hide(); 551 effect.element.setStyle({opacity: oldOpacity}); 560 effect.element.hide().setStyle({opacity: oldOpacity}); 552 561 }}, arguments[1] || {}); 553 562 return new Effect.Opacity(element,options); … … 564 573 }, 565 574 beforeSetup: function(effect) { 566 effect.element.setOpacity(effect.options.from); 567 effect.element.show(); 575 effect.element.setOpacity(effect.options.from).show(); 568 576 }}, arguments[1] || {}); 569 577 return new Effect.Opacity(element,options); … … 572 580 Effect.Puff = function(element) { 573 581 element = $(element); 574 var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') }; 582 var oldStyle = { 583 opacity: element.getInlineOpacity(), 584 position: element.getStyle('position'), 585 top: element.style.top, 586 left: element.style.left, 587 width: element.style.width, 588 height: element.style.height 589 }; 575 590 return new Effect.Parallel( 576 591 [ new Effect.Scale(element, 200, … … 579 594 Object.extend({ duration: 1.0, 580 595 beforeSetupInternal: function(effect) { 581 effect.effects[0].element.setStyle({position: 'absolute'}); }, 596 Position.absolutize(effect.effects[0].element) 597 }, 582 598 afterFinishInternal: function(effect) { 583 effect.effects[0].element.hide(); 584 effect.effects[0].element.setStyle(oldStyle); } 599 effect.effects[0].element.hide().setStyle(oldStyle); } 585 600 }, arguments[1] || {}) 586 601 ); … … 590 605 element = $(element); 591 606 element.makeClipping(); 592 return new Effect.Scale(element, 0, 607 return new Effect.Scale(element, 0, 593 608 Object.extend({ scaleContent: false, 594 609 scaleX: false, 595 610 restoreAfterFinish: true, 596 611 afterFinishInternal: function(effect) { 597 effect.element.hide(); 598 effect.element.undoClipping(); 612 effect.element.hide().undoClipping(); 599 613 } 600 614 }, arguments[1] || {}) … … 605 619 element = $(element); 606 620 var elementDimensions = element.getDimensions(); 607 return new Effect.Scale(element, 100, 608 Object.extend({ scaleContent: false, 609 scaleX: false, 610 scaleFrom: 0, 611 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, 612 restoreAfterFinish: true, 613 afterSetup: function(effect) { 614 effect.element.makeClipping(); 615 effect.element.setStyle({height: '0px'}); 616 effect.element.show(); 617 }, 618 afterFinishInternal: function(effect) { 619 effect.element.undoClipping(); 620 } 621 }, arguments[1] || {}) 622 ); 621 return new Effect.Scale(element, 100, Object.extend({ 622 scaleContent: false, 623 scaleX: false, 624 scaleFrom: 0, 625 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, 626 restoreAfterFinish: true, 627 afterSetup: function(effect) { 628 effect.element.makeClipping().setStyle({height: '0px'}).show(); 629 }, 630 afterFinishInternal: function(effect) { 631 effect.element.undoClipping(); 632 } 633 }, arguments[1] || {})); 623 634 } 624 635 … … 626 637 element = $(element); 627 638 var oldOpacity = element.getInlineOpacity(); 628 return new Effect.Appear(element, {639 return new Effect.Appear(element, Object.extend({ 629 640 duration: 0.4, 630 641 from: 0, … … 635 646 scaleX: false, scaleContent: false, restoreAfterFinish: true, 636 647 beforeSetup: function(effect) { 637 effect.element.makePositioned(); 638 effect.element.makeClipping(); 648 effect.element.makePositioned().makeClipping(); 639 649 }, 640 650 afterFinishInternal: function(effect) { 641 effect.element.hide(); 642 effect.element.undoClipping(); 643 effect.element.undoPositioned(); 644 effect.element.setStyle({opacity: oldOpacity}); 651 effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); 645 652 } 646 653 }) 647 654 } 648 } );655 }, arguments[1] || {})); 649 656 } 650 657 … … 664 671 }, 665 672 afterFinishInternal: function(effect) { 666 effect.effects[0].element.hide(); 667 effect.effects[0].element.undoPositioned(); 668 effect.effects[0].element.setStyle(oldStyle); 673 effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); 669 674 } 670 675 }, arguments[1] || {})); … … 688 693 new Effect.Move(effect.element, 689 694 { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { 690 effect.element.undoPositioned(); 691 effect.element.setStyle(oldStyle); 695 effect.element.undoPositioned().setStyle(oldStyle); 692 696 }}) }}) }}) }}) }}) }}); 693 697 } 694 698 695 699 Effect.SlideDown = function(element) { 696 element = $(element); 697 element.cleanWhitespace(); 700 element = $(element).cleanWhitespace(); 698 701 // SlideDown need to have the content of the element wrapped in a container element with fixed height! 699 var oldInnerBottom = $(element.firstChild).getStyle('bottom');702 var oldInnerBottom = element.down().getStyle('bottom'); 700 703 var elementDimensions = element.getDimensions(); 701 704 return new Effect.Scale(element, 100, Object.extend({ … … 707 710 afterSetup: function(effect) { 708 711 effect.element.makePositioned(); 709 effect.element. firstChild.makePositioned();712 effect.element.down().makePositioned(); 710 713 if(window.opera) effect.element.setStyle({top: ''}); 711 effect.element.makeClipping(); 712 effect.element.setStyle({height: '0px'}); 713 effect.element.show(); }, 714 effect.element.makeClipping().setStyle({height: '0px'}).show(); 715 }, 714 716 afterUpdateInternal: function(effect) { 715 effect.element. firstChild.setStyle({bottom:717 effect.element.down().setStyle({bottom: 716 718 (effect.dims[0] - effect.element.clientHeight) + 'px' }); 717 719 }, 718 720 afterFinishInternal: function(effect) { 719 effect.element.undoClipping(); 720 // IE will crash if child is undoPositioned first 721 if(/MSIE/.test(navigator.userAgent)){ 722 effect.element.undoPositioned(); 723 effect.element.firstChild.undoPositioned(); 724 }else{ 725 effect.element.firstChild.undoPositioned(); 726 effect.element.undoPositioned(); 727 } 728 effect.element.firstChild.setStyle({bottom: oldInnerBottom}); } 721 effect.element.undoClipping().undoPositioned(); 722 effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } 729 723 }, arguments[1] || {}) 730 724 ); 731 725 } 732 726 733 727 Effect.SlideUp = function(element) { 734 element = $(element); 735 element.cleanWhitespace(); 736 var oldInnerBottom = $(element.firstChild).getStyle('bottom'); 728 element = $(element).cleanWhitespace(); 729 var oldInnerBottom = element.down().getStyle('bottom'); 737 730 return new Effect.Scale(element, window.opera ? 0 : 1, 738 731 Object.extend({ scaleContent: false, … … 743 736 beforeStartInternal: function(effect) { 744 737 effect.element.makePositioned(); 745 effect.element. firstChild.makePositioned();738 effect.element.down().makePositioned(); 746 739 if(window.opera) effect.element.setStyle({top: ''}); 747 effect.element.makeClipping() ;748 effect.element.show();},740 effect.element.makeClipping().show(); 741 }, 749 742 afterUpdateInternal: function(effect) { 750 effect.element.firstChild.setStyle({bottom: 751 (effect.dims[0] - effect.element.clientHeight) + 'px' }); }, 743 effect.element.down().setStyle({bottom: 744 (effect.dims[0] - effect.element.clientHeight) + 'px' }); 745 }, 752 746 afterFinishInternal: function(effect) { 753 effect.element.hide(); 754 effect.element.undoClipping(); 755 effect.element.firstChild.undoPositioned(); 756 effect.element.undoPositioned(); 757 effect.element.setStyle({bottom: oldInnerBottom}); } 747 effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom}); 748 effect.element.down().undoPositioned(); 749 } 758 750 }, arguments[1] || {}) 759 751 ); … … 762 754 // Bug in opera makes the TD containing this element expand for a instance after finish 763 755 Effect.Squish = function(element) { 764 return new Effect.Scale(element, window.opera ? 1 : 0, 765 { restoreAfterFinish: true, 766 beforeSetup: function(effect) { 767 effect.element.makeClipping(effect.element); }, 768 afterFinishInternal: function(effect) { 769 effect.element.hide(effect.element); 770 effect.element.undoClipping(effect.element); } 756 return new Effect.Scale(element, window.opera ? 1 : 0, { 757 restoreAfterFinish: true, 758 beforeSetup: function(effect) { 759 effect.element.makeClipping(); 760 }, 761 afterFinishInternal: function(effect) { 762 effect.element.hide().undoClipping(); 763 } 771 764 }); 772 765 } … … 824 817 duration: 0.01, 825 818 beforeSetup: function(effect) { 826 effect.element.hide(); 827 effect.element.makeClipping(); 828 effect.element.makePositioned(); 819 effect.element.hide().makeClipping().makePositioned(); 829 820 }, 830 821 afterFinishInternal: function(effect) { … … 837 828 ], Object.extend({ 838 829 beforeSetup: function(effect) { 839 effect.effects[0].element.setStyle({height: '0px'}); 840 effect.effects[0].element.show(); 830 effect.effects[0].element.setStyle({height: '0px'}).show(); 841 831 }, 842 832 afterFinishInternal: function(effect) { 843 effect.effects[0].element.undoClipping(); 844 effect.effects[0].element.undoPositioned(); 845 effect.effects[0].element.setStyle(oldStyle); 833 effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 846 834 } 847 835 }, options) … … 897 885 ], Object.extend({ 898 886 beforeStartInternal: function(effect) { 899 effect.effects[0].element.makePositioned() ;900 effect.effects[0].element.makeClipping();},887 effect.effects[0].element.makePositioned().makeClipping(); 888 }, 901 889 afterFinishInternal: function(effect) { 902 effect.effects[0].element.hide(); 903 effect.effects[0].element.undoClipping(); 904 effect.effects[0].element.undoPositioned(); 905 effect.effects[0].element.setStyle(oldStyle); } 890 effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } 906 891 }, options) 907 892 ); … … 913 898 var oldOpacity = element.getInlineOpacity(); 914 899 var transition = options.transition || Effect.Transitions.sinoidal; 915 var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos )) };900 var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; 916 901 reverser.bind(transition); 917 902 return new Effect.Opacity(element, 918 Object.extend(Object.extend({ duration: 3.0, from: 0,903 Object.extend(Object.extend({ duration: 2.0, from: 0, 919 904 afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } 920 905 }, options), {transition: reverser})); … … 928 913 width: element.style.width, 929 914 height: element.style.height }; 930 Element.makeClipping(element);915 element.makeClipping(); 931 916 return new Effect.Scale(element, 5, Object.extend({ 932 917 scaleContent: false, … … 937 922 scaleY: false, 938 923 afterFinishInternal: function(effect) { 939 effect.element.hide(); 940 effect.element.undoClipping(); 941 effect.element.setStyle(oldStyle); 924 effect.element.hide().undoClipping().setStyle(oldStyle); 942 925 } }); 943 926 }}, arguments[1] || {})); 944 927 }; 945 928 929 Effect.Morph = Class.create(); 930 Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), { 931 initialize: function(element) { 932 this.element = $(element); 933 if(!this.element) throw(Effect._elementDoesNotExistError); 934 var options = Object.extend({ 935 style: {} 936 }, arguments[1] || {}); 937 if (typeof options.style == 'string') { 938 if(options.style.indexOf(':') == -1) { 939 var cssText = '', selector = '.' + options.style; 940 $A(document.styleSheets).reverse().each(function(styleSheet) { 941 if (styleSheet.cssRules) cssRules = styleSheet.cssRules; 942 else if (styleSheet.rules) cssRules = styleSheet.rules; 943 $A(cssRules).reverse().each(function(rule) { 944 if (selector == rule.selectorText) { 945 cssText = rule.style.cssText; 946 throw $break; 947 } 948 }); 949 if (cssText) throw $break; 950 }); 951 this.style = cssText.parseStyle(); 952 options.afterFinishInternal = function(effect){ 953 effect.element.addClassName(effect.options.style); 954 effect.transforms.each(function(transform) { 955 if(transform.style != 'opacity') 956 effect.element.style[transform.style.camelize()] = ''; 957 }); 958 } 959 } else this.style = options.style.parseStyle(); 960 } else this.style = $H(options.style) 961 this.start(options); 962 }, 963 setup: function(){ 964 function parseColor(color){ 965 if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; 966 color = color.parseColor(); 967 return $R(0,2).map(function(i){ 968 return parseInt( color.slice(i*2+1,i*2+3), 16 ) 969 }); 970 } 971 this.transforms = this.style.map(function(pair){ 972 var property = pair[0].underscore().dasherize(), value = pair[1], unit = null; 973 974 if(value.parseColor('#zzzzzz') != '#zzzzzz') { 975 value = value.parseColor(); 976 unit = 'color'; 977 } else if(property == 'opacity') { 978 value = parseFloat(value); 979 if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) 980 this.element.setStyle({zoom: 1}); 981 } else if(Element.CSS_LENGTH.test(value)) 982 var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/), 983 value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null; 984 985 var originalValue = this.element.getStyle(property); 986 return $H({ 987 style: property, 988 originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 989 targetValue: unit=='color' ? parseColor(value) : value, 990 unit: unit 991 }); 992 }.bind(this)).reject(function(transform){ 993 return ( 994 (transform.originalValue == transform.targetValue) || 995 ( 996 transform.unit != 'color' && 997 (isNaN(transform.originalValue) || isNaN(transform.targetValue)) 998 ) 999 ) 1000 }); 1001 }, 1002 update: function(position) { 1003 var style = $H(), value = null; 1004 this.transforms.each(function(transform){ 1005 value = transform.unit=='color' ? 1006 $R(0,2).inject('#',function(m,v,i){ 1007 return m+(Math.round(transform.originalValue[i]+ 1008 (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 1009 transform.originalValue + Math.round( 1010 ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit; 1011 style[transform.style] = value; 1012 }); 1013 this.element.setStyle(style); 1014 } 1015 }); 1016 1017 Effect.Transform = Class.create(); 1018 Object.extend(Effect.Transform.prototype, { 1019 initialize: function(tracks){ 1020 this.tracks = []; 1021 this.options = arguments[1] || {}; 1022 this.addTracks(tracks); 1023 }, 1024 addTracks: function(tracks){ 1025 tracks.each(function(track){ 1026 var data = $H(track).values().first(); 1027 this.tracks.push($H({ 1028 ids: $H(track).keys().first(), 1029 effect: Effect.Morph, 1030 options: { style: data } 1031 })); 1032 }.bind(this)); 1033 return this; 1034 }, 1035 play: function(){ 1036 return new Effect.Parallel( 1037 this.tracks.map(function(track){ 1038 var elements = [$(track.ids) || $$(track.ids)].flatten(); 1039 return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) }); 1040 }).flatten(), 1041 this.options 1042 ); 1043 } 1044 }); 1045 1046 Element.CSS_PROPERTIES = $w( 1047 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 1048 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + 1049 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + 1050 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + 1051 'fontSize fontWeight height left letterSpacing lineHeight ' + 1052 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ 1053 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + 1054 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + 1055 'right textIndent top width wordSpacing zIndex'); 1056 1057 Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; 1058 1059 String.prototype.parseStyle = function(){ 1060 var element = Element.extend(document.createElement('div')); 1061 element.innerHTML = '<div style="' + this + '"></div>'; 1062 var style = element.down().style, styleRules = $H(); 1063 1064 Element.CSS_PROPERTIES.each(function(property){ 1065 if(style[property]) styleRules[property] = style[property]; 1066 }); 1067 if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) { 1068 styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]; 1069 } 1070 return styleRules; 1071 }; 1072 1073 Element.morph = function(element, style) { 1074 new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {})); 1075 return element; 1076 }; 1077 946 1078 ['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', 947 'collectTextNodes','collectTextNodesIgnoreClass',' childrenWithClassName'].each(1079 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 948 1080 function(f) { Element.Methods[f] = Element[f]; } 949 1081 ); -
trunk/wp-includes/js/scriptaculous/prototype.js
r4629 r4813 1 /* Prototype JavaScript framework, version 1.5.0 _rc02 * (c) 2005 Sam Stephenson <sam@conio.net>1 /* Prototype JavaScript framework, version 1.5.0 2 * (c) 2005-2007 Sam Stephenson 3 3 * 4 4 * Prototype is freely distributable under the terms of an MIT-style license. … … 8 8 9 9 var Prototype = { 10 Version: '1.5.0_rc0', 10 Version: '1.5.0', 11 BrowserFeatures: { 12 XPath: !!document.evaluate 13 }, 14 11 15 ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 12 13 16 emptyFunction: function() {}, 14 K: function(x) { return x}17 K: function(x) { return x } 15 18 } 16 19 … … 32 35 } 33 36 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 } 37 Object.extend(Object, { 38 inspect: function(object) { 39 try { 40 if (object === undefined) return 'undefined'; 41 if (object === null) return 'null'; 42 return object.inspect ? object.inspect() : object.toString(); 43 } catch (e) { 44 if (e instanceof RangeError) return '...'; 45 throw e; 46 } 47 }, 48 49 keys: function(object) { 50 var keys = []; 51 for (var property in object) 52 keys.push(property); 53 return keys; 54 }, 55 56 values: function(object) { 57 var values = []; 58 for (var property in object) 59 values.push(object[property]); 60 return values; 61 }, 62 63 clone: function(object) { 64 return Object.extend({}, object); 65 } 66 }); 44 67 45 68 Function.prototype.bind = function() { … … 51 74 52 75 Function.prototype.bindAsEventListener = function(object) { 53 var __method = this ;76 var __method = this, args = $A(arguments), object = args.shift(); 54 77 return function(event) { 55 return __method. call(object, event || window.event);78 return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); 56 79 } 57 80 } … … 78 101 var returnValue; 79 102 80 for (var i = 0 ; i < arguments.length; i++) {103 for (var i = 0, length = arguments.length; i < length; i++) { 81 104 var lambda = arguments[i]; 82 105 try { … … 103 126 104 127 registerCallback: function() { 105 setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 128 this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 129 }, 130 131 stop: function() { 132 if (!this.timer) return; 133 clearInterval(this.timer); 134 this.timer = null; 106 135 }, 107 136 … … 110 139 try { 111 140 this.currentlyExecuting = true; 112 this.callback( );141 this.callback(this); 113 142 } finally { 114 143 this.currentlyExecuting = false; … … 117 146 } 118 147 } 148 String.interpret = function(value){ 149 return value == null ? '' : String(value); 150 } 151 119 152 Object.extend(String.prototype, { 120 153 gsub: function(pattern, replacement) { … … 125 158 if (match = source.match(pattern)) { 126 159 result += source.slice(0, match.index); 127 result += (replacement(match) || '').toString();160 result += String.interpret(replacement(match)); 128 161 source = source.slice(match.index + match[0].length); 129 162 } else { … … 190 223 var div = document.createElement('div'); 191 224 div.innerHTML = this.stripTags(); 192 return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; 193 }, 194 195 toQueryParams: function() { 196 var pairs = this.match(/^\??(.*)$/)[1].split('&'); 197 return pairs.inject({}, function(params, pairString) { 198 var pair = pairString.split('='); 199 params[pair[0]] = pair[1]; 200 return params; 225 return div.childNodes[0] ? (div.childNodes.length > 1 ? 226 $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) : 227 div.childNodes[0].nodeValue) : ''; 228 }, 229 230 toQueryParams: function(separator) { 231 var match = this.strip().match(/([^?#]*)(#.*)?$/); 232 if (!match) return {}; 233 234 return match[1].split(separator || '&').inject({}, function(hash, pair) { 235 if ((pair = pair.split('='))[0]) { 236 var name = decodeURIComponent(pair[0]); 237 var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; 238 239 if (hash[name] !== undefined) { 240 if (hash[name].constructor != Array) 241 hash[name] = [hash[name]]; 242 if (value) hash[name].push(value); 243 } 244 else hash[name] = value; 245 } 246 return hash; 201 247 }); 202 248 }, … … 206 252 }, 207 253 254 succ: function() { 255 return this.slice(0, this.length - 1) + 256 String.fromCharCode(this.charCodeAt(this.length - 1) + 1); 257 }, 258 208 259 camelize: function() { 209 var oStringList = this.split('-'); 210 if (oStringList.length == 1) return oStringList[0]; 211 212 var camelizedString = this.indexOf('-') == 0 213 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) 214 : oStringList[0]; 215 216 for (var i = 1, len = oStringList.length; i < len; i++) { 217 var s = oStringList[i]; 218 camelizedString += s.charAt(0).toUpperCase() + s.substring(1); 219 } 220 221 return camelizedString; 222 }, 223 224 inspect: function() { 225 return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'"; 260 var parts = this.split('-'), len = parts.length; 261 if (len == 1) return parts[0]; 262 263 var camelized = this.charAt(0) == '-' 264 ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) 265 : parts[0]; 266 267 for (var i = 1; i < len; i++) 268 camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); 269 270 return camelized; 271 }, 272 273 capitalize: function(){ 274 return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); 275 }, 276 277 underscore: function() { 278 return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); 279 }, 280 281 dasherize: function() { 282 return this.gsub(/_/,'-'); 283 }, 284 285 inspect: function(useDoubleQuotes) { 286 var escapedString = this.replace(/\\/g, '\\\\'); 287 if (useDoubleQuotes) 288 return '"' + escapedString.replace(/"/g, '\\"') + '"'; 289 else 290 return "'" + escapedString.replace(/'/g, '\\\'') + "'"; 226 291 } 227 292 }); … … 247 312 var before = match[1]; 248 313 if (before == '\\') return match[2]; 249 return before + (object[match[3]] || '').toString();314 return before + String.interpret(object[match[3]]); 250 315 }); 251 316 } … … 269 334 if (e != $break) throw e; 270 335 } 336 return this; 337 }, 338 339 eachSlice: function(number, iterator) { 340 var index = -number, slices = [], array = this.toArray(); 341 while ((index += number) < array.length) 342 slices.push(array.slice(index, index+number)); 343 return slices.map(iterator); 271 344 }, 272 345 … … 281 354 282 355 any: function(iterator) { 283 var result = true;356 var result = false; 284 357 this.each(function(value, index) { 285 358 if (result = !!(iterator || Prototype.K)(value, index)) … … 292 365 var results = []; 293 366 this.each(function(value, index) { 294 results.push( iterator(value, index));367 results.push((iterator || Prototype.K)(value, index)); 295 368 }); 296 369 return results; 297 370 }, 298 371 299 detect: function 372 detect: function(iterator) { 300 373 var result; 301 374 this.each(function(value, index) { … … 338 411 }, 339 412 413 inGroupsOf: function(number, fillWith) { 414 fillWith = fillWith === undefined ? null : fillWith; 415 return this.eachSlice(number, function(slice) { 416 while(slice.length < number) slice.push(fillWith); 417 return slice; 418 }); 419 }, 420 340 421 inject: function(memo, iterator) { 341 422 this.each(function(value, index) { … … 347 428 invoke: function(method) { 348 429 var args = $A(arguments).slice(1); 349 return this. collect(function(value) {430 return this.map(function(value) { 350 431 return value[method].apply(value, args); 351 432 }); … … 399 480 400 481 sortBy: function(iterator) { 401 return this. collect(function(value, index) {482 return this.map(function(value, index) { 402 483 return {value: value, criteria: iterator(value, index)}; 403 484 }).sort(function(left, right) { … … 408 489 409 490 toArray: function() { 410 return this. collect(Prototype.K);491 return this.map(); 411 492 }, 412 493 … … 420 501 return iterator(collections.pluck(index)); 421 502 }); 503 }, 504 505 size: function() { 506 return this.toArray().length; 422 507 }, 423 508 … … 440 525 } else { 441 526 var results = []; 442 for (var i = 0 ; i < iterable.length; i++)527 for (var i = 0, length = iterable.length; i < length; i++) 443 528 results.push(iterable[i]); 444 529 return results; … … 453 538 Object.extend(Array.prototype, { 454 539 _each: function(iterator) { 455 for (var i = 0 ; i < this.length; i++)540 for (var i = 0, length = this.length; i < length; i++) 456 541 iterator(this[i]); 457 542 }, … … 472 557 compact: function() { 473 558 return this.select(function(value) { 474 return value != undefined || value !=null;559 return value != null; 475 560 }); 476 561 }, … … 491 576 492 577 indexOf: function(object) { 493 for (var i = 0 ; i < this.length; i++)578 for (var i = 0, length = this.length; i < length; i++) 494 579 if (this[i] == object) return i; 495 580 return -1; … … 500 585 }, 501 586 587 reduce: function() { 588 return this.length > 1 ? this : this[0]; 589 }, 590 591 uniq: function() { 592 return this.inject([], function(array, value) { 593 return array.include(value) ? array : array.concat([value]); 594 }); 595 }, 596 597 clone: function() { 598 return [].concat(this); 599 }, 600 601 size: function() { 602 return this.length; 603 }, 604 502 605 inspect: function() { 503 606 return '[' + this.map(Object.inspect).join(', ') + ']'; 504 607 } 505 608 }); 506 var Hash = { 609 610 Array.prototype.toArray = Array.prototype.clone; 611 612 function $w(string){ 613 string = string.strip(); 614 return string ? string.split(/\s+/) : []; 615 } 616 617 if(window.opera){ 618 Array.prototype.concat = function(){ 619 var array = []; 620 for(var i = 0, length = this.length; i < length; i++) array.push(this[i]); 621 for(var i = 0, length = arguments.length; i < length; i++) { 622 if(arguments[i].constructor == Array) { 623 for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) 624 array.push(arguments[i][j]); 625 } else { 626 array.push(arguments[i]); 627 } 628 } 629 return array; 630 } 631 } 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, { 507 665 _each: function(iterator) { 508 666 for (var key in this) { 509 667 var value = this[key]; 510 if ( typeof value == 'function') continue;668 if (value && value == Hash.prototype[key]) continue; 511 669 512 670 var pair = [key, value]; … … 526 684 527 685 merge: function(hash) { 528 return $H(hash).inject( $H(this), function(mergedHash, pair) {686 return $H(hash).inject(this, function(mergedHash, pair) { 529 687 mergedHash[pair.key] = pair.value; 530 688 return mergedHash; … … 532 690 }, 533 691 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) 701 } 702 } 703 delete this[arguments[i]]; 704 } 705 return result; 706 }, 707 534 708 toQueryString: function() { 535 return this.map(function(pair) { 536 return pair.map(encodeURIComponent).join('='); 537 }).join('&'); 709 return Hash.toQueryString(this); 538 710 }, 539 711 … … 543 715 }).join(', ') + '}>'; 544 716 } 545 } 717 }); 546 718 547 719 function $H(object) { 548 var hash = Object.extend({}, object || {}); 549 Object.extend(hash, Enumerable); 550 Object.extend(hash, Hash); 551 return hash; 552 } 720 if (object && object.constructor == Hash) return object; 721 return new Hash(object); 722 }; 553 723 ObjectRange = Class.create(); 554 724 Object.extend(ObjectRange.prototype, Enumerable); … … 562 732 _each: function(iterator) { 563 733 var value = this.start; 564 do{734 while (this.include(value)) { 565 735 iterator(value); 566 736 value = value.succ(); 567 } while (this.include(value));737 } 568 738 }, 569 739 … … 600 770 }, 601 771 602 register: function(responder ToAdd) {603 if (!this.include(responder ToAdd))604 this.responders.push(responder ToAdd);605 }, 606 607 unregister: function(responder ToRemove) {608 this.responders = this.responders.without(responder ToRemove);772 register: function(responder) { 773 if (!this.include(responder)) 774 this.responders.push(responder); 775 }, 776 777 unregister: function(responder) { 778 this.responders = this.responders.without(responder); 609 779 }, 610 780 611 781 dispatch: function(callback, request, transport, json) { 612 782 this.each(function(responder) { 613 if ( responder[callback] &&typeof responder[callback] == 'function') {783 if (typeof responder[callback] == 'function') { 614 784 try { 615 785 responder[callback].apply(responder, [request, transport, json]); … … 626 796 Ajax.activeRequestCount++; 627 797 }, 628 629 798 onComplete: function() { 630 799 Ajax.activeRequestCount--; … … 639 808 asynchronous: true, 640 809 contentType: 'application/x-www-form-urlencoded', 810 encoding: 'UTF-8', 641 811 parameters: '' 642 812 } 643 813 Object.extend(this.options, options || {}); 644 }, 645 646 responseIsSuccess: function() { 647 return this.transport.status == undefined 648 || this.transport.status == 0 649 || (this.transport.status >= 200 && this.transport.status < 300); 650 }, 651 652 responseIsFailure: function() { 653 return !this.responseIsSuccess(); 814 815 this.options.method = this.options.method.toLowerCase(); 816 if (typeof this.options.parameters == 'string') 817 this.options.parameters = this.options.parameters.toQueryParams(); 654 818 } 655 819 } … … 660 824 661 825 Ajax.Request.prototype = Object.extend(new Ajax.Base(), { 826 _complete: false, 827 662 828 initialize: function(url, options) { 663 829 this.transport = Ajax.getTransport(); … … 667 833 668 834 request: function(url) { 669 var parameters = this.options.parameters || ''; 670 if (parameters.length > 0) parameters += '&_='; 835 this.url = url; 836 this.method = this.options.method; 837 var params = this.options.parameters; 838 839 if (!['get', 'post'].include(this.method)) { 840 // simulate other verbs over post 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 += '&_=' 847 848 // when GET, append parameters to URL 849 if (this.method == 'get' && params) 850 this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params; 671 851 672 852 try { 673 this.url = url;674 if (this.options.method == 'get' && parameters.length > 0)675 this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;676 677 853 Ajax.Responders.dispatch('onCreate', this, this.transport); 678 854 679 this.transport.open(this. options.method, this.url,855 this.transport.open(this.method.toUpperCase(), this.url, 680 856 this.options.asynchronous); 681 857 682 if (this.options.asynchronous) { 683 this.transport.onreadystatechange = this.onStateChange.bind(this); 684 setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); 858 if (this.options.asynchronous) 859 setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); 860 861 this.transport.onreadystatechange = this.onStateChange.bind(this); 862 this.setRequestHeaders(); 863 864 var body = this.method == 'post' ? (this.options.postBody || params) : null; 865 866 this.transport.send(body); 867 868 /* Force Firefox to handle ready state 4 for synchronous requests */ 869 if (!this.options.asynchronous && this.transport.overrideMimeType) 870 this.onStateChange(); 871 872 } 873 catch (e) { 874 this.dispatchException(e); 875 } 876 }, 877 878 onStateChange: function() { 879 var readyState = this.transport.readyState; 880 if (readyState > 1 && !((readyState == 4) && this._complete)) 881 this.respondToReadyState(this.transport.readyState); 882 }, 883 884 setRequestHeaders: function() { 885 var headers = { 886 'X-Requested-With': 'XMLHttpRequest', 887 'X-Prototype-Version': Prototype.Version, 888 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' 889 }; 890 891 if (this.method == 'post') { 892 headers['Content-type'] = this.options.contentType + 893 (this.options.encoding ? '; charset=' + this.options.encoding : ''); 894 895 /* Force "Connection: close" for older Mozilla browsers to work 896 * around a bug where XMLHttpRequest sends an incorrect 897 * Content-length header. See Mozilla Bugzilla #246651. 898 */ 899 if (this.transport.overrideMimeType && 900 (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) 901 headers['Connection'] = 'close'; 902 } 903 904 // user-defined headers 905 if (typeof this.options.requestHeaders == 'object') { 906 var extras = this.options.requestHeaders; 907 908 if (typeof extras.push == 'function') 909 for (var i = 0, length = extras.length; i < length; i += 2) 910 headers[extras[i]] = extras[i+1]; 911 else 912 $H(extras).each(function(pair) { headers[pair.key] = pair.value }); 913 } 914 915 for (var name in headers) 916 this.transport.setRequestHeader(name, headers[name]); 917 }, 918 919 success: function() { 920 return !this.transport.status 921 || (this.transport.status >= 200 && this.transport.status < 300); 922 }, 923 924 respondToReadyState: function(readyState) { 925 var state = Ajax.Request.Events[readyState]; 926 var transport = this.transport, json = this.evalJSON(); 927 928 if (state == 'Complete') { 929 try { 930 this._complete = true; 931 (this.options['on' + this.transport.status] 932 || this.options['on' + (this.success() ? 'Success' : 'Failure')] 933 || Prototype.emptyFunction)(transport, json); 934 } catch (e) { 935 this.dispatchException(e); 685 936 } 686 937 687 this.setRequestHeaders(); 688 689 var body = this.options.postBody ? this.options.postBody : parameters; 690 this.transport.send(this.options.method == 'post' ? body : null); 691 938 if ((this.getHeader('Content-type') || 'text/javascript').strip(). 939 match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) 940 this.evalResponse(); 941 } 942 943 try { 944 (this.options['on' + state] || Prototype.emptyFunction)(transport, json); 945 Ajax.Responders.dispatch('on' + state, this, transport, json); 692 946 } catch (e) { 693 947 this.dispatchException(e); 694 948 } 695 }, 696 697 setRequestHeaders: function() { 698 var requestHeaders = 699 ['X-Requested-With', 'XMLHttpRequest', 700 'X-Prototype-Version', Prototype.Version, 701 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*']; 702 703 if (this.options.method == 'post') { 704 requestHeaders.push('Content-type', this.options.contentType); 705 706 /* Force "Connection: close" for Mozilla browsers to work around 707 * a bug where XMLHttpReqeuest sends an incorrect Content-length 708 * header. See Mozilla Bugzilla #246651. 709 */ 710 if (this.transport.overrideMimeType) 711 requestHeaders.push('Connection', 'close'); 712 } 713 714 if (this.options.requestHeaders) 715 requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); 716 717 for (var i = 0; i < requestHeaders.length; i += 2) 718 this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); 719 }, 720 721 onStateChange: function() { 722 var readyState = this.transport.readyState; 723 if (readyState != 1) 724 this.respondToReadyState(this.transport.readyState); 725 }, 726 727 header: function(name) { 949 950 if (state == 'Complete') { 951 // avoid memory leak in MSIE: clean up 952 this.transport.onreadystatechange = Prototype.emptyFunction; 953 } 954 }, 955 956 getHeader: function(name) { 728 957 try { 729 958 return this.transport.getResponseHeader(name); 730 } catch (e) { }959 } catch (e) { return null } 731 960 }, 732 961 733 962 evalJSON: function() { 734 963 try { 735 return eval('(' + this.header('X-JSON') + ')'); 736 } catch (e) {} 964 var json = this.getHeader('X-JSON'); 965 return json ? eval('(' + json + ')') : null; 966 } catch (e) { return null } 737 967 }, 738 968 … … 745 975 }, 746 976 747 respondToReadyState: function(readyState) {748 var event = Ajax.Request.Events[readyState];749 var transport = this.transport, json = this.evalJSON();750 751 if (event == 'Complete') {752 try {753 (this.options['on' + this.transport.status]754 || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]755 || Prototype.emptyFunction)(transport, json);756 } catch (e) {757 this.dispatchException(e);758 }759 760 if ((this.header('Content-type') || '').match(/^text\/javascript/i))761 this.evalResponse();762 }763 764 try {765 (this.options['on' + event] || Prototype.emptyFunction)(transport, json);766 Ajax.Responders.dispatch('on' + event, this, transport, json);767 } catch (e) {768 this.dispatchException(e);769 }770 771 /* Avoid memory leak in MSIE: clean up the oncomplete event handler */772 if (event == 'Complete')773 this.transport.onreadystatechange = Prototype.emptyFunction;774 },775 776 977 dispatchException: function(exception) { 777 978 (this.options.onException || Prototype.emptyFunction)(this, exception); … … 784 985 Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { 785 986 initialize: function(container, url, options) { 786 this.containers = { 787 success: container.success ? $(container.success) : $(container), 788 failure: container.failure ? $(container.failure) : 789 (container.success ? null : $(container)) 987 this.container = { 988 success: (container.success || container), 989 failure: (container.failure || (container.success ? null : container)) 790 990 } 791 991 … … 794 994 795 995 var onComplete = this.options.onComplete || Prototype.emptyFunction; 796 this.options.onComplete = (function(transport, object) {996 this.options.onComplete = (function(transport, param) { 797 997 this.updateContent(); 798 onComplete(transport, object);998 onComplete(transport, param); 799 999 }).bind(this); 800 1000 … … 803 1003 804 1004 updateContent: function() { 805 var receiver = this.responseIsSuccess() ? 806 this.containers.success : this.containers.failure; 1005 var receiver = this.container[this.success() ? 'success' : 'failure']; 807 1006 var response = this.transport.responseText; 808 1007 809 if (!this.options.evalScripts) 810 response = response.stripScripts(); 811 812 if (receiver) { 813 if (this.options.insertion) { 1008 if (!this.options.evalScripts) response = response.stripScripts(); 1009 1010 if (receiver = $(receiver)) { 1011 if (this.options.insertion) 814 1012 new this.options.insertion(receiver, response); 815 } else { 816 Element.update(receiver, response); 817 } 818 } 819 820 if (this.responseIsSuccess()) { 1013 else 1014 receiver.update(response); 1015 } 1016 1017 if (this.success()) { 821 1018 if (this.onComplete) 822 1019 setTimeout(this.onComplete.bind(this), 10); … … 847 1044 848 1045 stop: function() { 849 this.updater.o nComplete = undefined;1046 this.updater.options.onComplete = undefined; 850 1047 clearTimeout(this.timer); 851 1048 (this.onComplete || Prototype.emptyFunction).apply(this, arguments); … … 867 1064 } 868 1065 }); 869 function $() { 870 var results = [], element; 871 for (var i = 0; i < arguments.length; i++) { 872 element = arguments[i]; 873 if (typeof element == 'string') 874 element = document.getElementById(element); 875 results.push(Element.extend(element)); 876 } 877 return results.length < 2 ? results[0] : results; 1066 function $(element) { 1067 if (arguments.length > 1) { 1068 for (var i = 0, elements = [], length = arguments.length; i < length; i++) 1069 elements.push($(arguments[i])); 1070 return elements; 1071 } 1072 if (typeof element == 'string') 1073 element = document.getElementById(element); 1074 return Element.extend(element); 1075 } 1076 1077 if (Prototype.BrowserFeatures.XPath) { 1078 document._getElementsByXPath = function(expression, parentElement) { 1079 var results = []; 1080 var query = document.evaluate(expression, $(parentElement) || document, 1081 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 1082 for (var i = 0, length = query.snapshotLength; i < length; i++) 1083 results.push(query.snapshotItem(i)); 1084 return results; 1085 }; 878 1086 } 879 1087 880 1088 document.getElementsByClassName = function(className, parentElement) { 881 var children = ($(parentElement) || document.body).getElementsByTagName('*'); 882 return $A(children).inject([], function(elements, child) { 883 if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 884 elements.push(Element.extend(child)); 1089 if (Prototype.BrowserFeatures.XPath) { 1090 var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; 1091 return document._getElementsByXPath(q, parentElement); 1092 } else { 1093 var children = ($(parentElement) || document.body).getElementsByTagName('*'); 1094 var elements = [], child; 1095 for (var i = 0, length = children.length; i < length; i++) { 1096 child = children[i]; 1097 if (Element.hasClassName(child, className)) 1098 elements.push(Element.extend(child)); 1099 } 885 1100 return elements; 886 } );887 } 1101 } 1102 }; 888 1103 889 1104 /*--------------------------------------------------------------------------*/ … … 893 1108 894 1109 Element.extend = function(element) { 895 if (!element) return; 896 if (_nativeExtensions) return element; 1110 if (!element || _nativeExtensions || element.nodeType == 3) return element; 897 1111 898 1112 if (!element._extended && element.tagName && element != window) { 899 var methods = Element.Methods, cache = Element.extend.cache; 900 for (property in methods) { 1113 var methods = Object.clone(Element.Methods), cache = Element.extend.cache; 1114 1115 if (element.tagName == 'FORM') 1116 Object.extend(methods, Form.Methods); 1117 if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) 1118 Object.extend(methods, Form.Element.Methods); 1119 1120 Object.extend(methods, Element.Methods.Simulated); 1121 1122 for (var property in methods) { 901 1123 var value = methods[property]; 902 if (typeof value == 'function' )1124 if (typeof value == 'function' && !(property in element)) 903 1125 element[property] = cache.findOrStore(value); 904 1126 } … … 907 1129 element._extended = true; 908 1130 return element; 909 } 1131 }; 910 1132 911 1133 Element.extend.cache = { … … 915 1137 } 916 1138 } 917 } 1139 }; 918 1140 919 1141 Element.Methods = { … … 922 1144 }, 923 1145 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 } 1146 toggle: function(element) { 1147 element = $(element); 1148 Element[Element.visible(element) ? 'hide' : 'show'](element); 1149 return element; 1150 }, 1151 1152 hide: function(element) { 1153 $(element).style.display = 'none'; 1154 return element; 1155 }, 1156 1157 show: function(element) { 1158 $(element).style.display = ''; 1159 return element; 943 1160 }, 944 1161 … … 946 1163 element = $(element); 947 1164 element.parentNode.removeChild(element); 1165 return element; 948 1166 }, 949 1167 950 1168 update: function(element, html) { 1169 html = typeof html == 'undefined' ? '' : html.toString(); 951 1170 $(element).innerHTML = html.stripScripts(); 952 1171 setTimeout(function() {html.evalScripts()}, 10); 1172 return element; 953 1173 }, 954 1174 955 1175 replace: function(element, html) { 956 1176 element = $(element); 1177 html = typeof html == 'undefined' ? '' : html.toString(); 957 1178 if (element.outerHTML) { 958 1179 element.outerHTML = html.stripScripts(); … … 964 1185 } 965 1186 setTimeout(function() {html.evalScripts()}, 10); 1187 return element; 1188 }, 1189 1190 inspect: function(element) { 1191 element = $(element); 1192 var result = '<' + element.tagName.toLowerCase(); 1193 $H({'id': 'id', 'className': 'class'}).each(function(pair) { 1194 var property = pair.first(), attribute = pair.last(); 1195 var value = (element[property] || '').toString(); 1196 if (value) result += ' ' + attribute + '=' + value.inspect(true); 1197 }); 1198 return result + '>'; 1199 }, 1200 1201 recursivelyCollect: function(element, property) { 1202 element = $(element); 1203 var elements = []; 1204 while (element = element[property]) 1205 if (element.nodeType == 1) 1206 elements.push(Element.extend(element)); 1207 return elements; 1208 }, 1209 1210 ancestors: function(element) { 1211 return $(element).recursivelyCollect('parentNode'); 1212 }, 1213 1214 descendants: function(element) { 1215 return $A($(element).getElementsByTagName('*')); 1216 }, 1217 1218 immediateDescendants: function(element) { 1219 if (!(element = $(element).firstChild)) return []; 1220 while (element && element.nodeType != 1) element = element.nextSibling; 1221 if (element) return [element].concat($(element).nextSiblings()); 1222 return []; 1223 }, 1224 1225 previousSiblings: function(element) { 1226 return $(element).recursivelyCollect('previousSibling'); 1227 }, 1228 1229 nextSiblings: function(element) { 1230 return $(element).recursivelyCollect('nextSibling'); 1231 }, 1232 1233 siblings: function(element) { 1234 element = $(element); 1235 return element.previousSiblings().reverse().concat(element.nextSiblings()); 1236 }, 1237 1238 match: function(element, selector) { 1239 if (typeof selector == 'string') 1240 selector = new Selector(selector); 1241 return selector.match($(element)); 1242 }, 1243 1244 up: function(element, expression, index) { 1245 return Selector.findElement($(element).ancestors(), expression, index); 1246 }, 1247 1248 down: function(element, expression, index) { 1249 return Selector.findElement($(element).descendants(), expression, index); 1250 }, 1251 1252 previous: function(element, expression, index) { 1253 return Selector.findElement($(element).previousSiblings(), expression, index); 1254 }, 1255 1256 next: function(element, expression, index) { 1257 return Selector.findElement($(element).nextSiblings(), expression, index); 1258 }, 1259 1260 getElementsBySelector: function() { 1261 var args = $A(arguments), element = $(args.shift()); 1262 return Selector.findChildElements(element, args); 1263 }, 1264 1265 getElementsByClassName: function(element, className) { 1266 return document.getElementsByClassName(className, element); 1267 }, 1268 1269 readAttribute: function(element, 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); 966 1279 }, 967 1280 968 1281 getHeight: function(element) { 969 element = $(element); 970 return element.offsetHeight; 1282 return $(element).getDimensions().height; 1283 }, 1284 1285 getWidth: function(element) { 1286 return $(element).getDimensions().width; 971 1287 }, 972 1288 … … 977 1293 hasClassName: function(element, className) { 978 1294 if (!(element = $(element))) return; 979 return Element.classNames(element).include(className); 1295 var elementClassName = element.className; 1296 if (elementClassName.length == 0) return false; 1297 if (elementClassName == className || 1298 elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 1299 return true; 1300 return false; 980 1301 }, 981 1302 982 1303 addClassName: function(element, className) { 983 1304 if (!(element = $(element))) return; 984 return Element.classNames(element).add(className); 1305 Element.classNames(element).add(className); 1306 return element; 985 1307 }, 986 1308 987 1309 removeClassName: function(element, className) { 988 1310 if (!(element = $(element))) return; 989 return Element.classNames(element).remove(className); 1311 Element.classNames(element).remove(className); 1312 return element; 1313 }, 1314 1315 toggleClassName: function(element, className) { 1316 if (!(element = $(element))) return; 1317 Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className); 1318 return element; 1319 }, 1320 1321 observe: function() { 1322 Event.observe.apply(Event, arguments); 1323 return $A(arguments).first(); 1324 }, 1325 1326 stopObserving: function() { 1327 Event.stopObserving.apply(Event, arguments); 1328 return $A(arguments).first(); 990 1329 }, 991 1330 … … 993 1332 cleanWhitespace: function(element) { 994 1333 element = $(element); 995 for (var i = 0; i < element.childNodes.length; i++) { 996 var node = element.childNodes[i]; 1334 var node = element.firstChild; 1335 while (node) { 1336 var nextNode = node.nextSibling; 997 1337 if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 998 Element.remove(node); 999 } 1338 element.removeChild(node); 1339 node = nextNode; 1340 } 1341 return element; 1000 1342 }, 1001 1343 … … 1004 1346 }, 1005 1347 1006 childOf: function(element, ancestor) {1348 descendantOf: function(element, ancestor) { 1007 1349 element = $(element), ancestor = $(ancestor); 1008 1350 while (element = element.parentNode) … … 1013 1355 scrollTo: function(element) { 1014 1356 element = $(element); 1015 var x = element.x ? element.x : element.offsetLeft,1016 y = element.y ? element.y : element.offsetTop;1017 window.scrollTo(x, y);1357 var pos = Position.cumulativeOffset(element); 1358 window.scrollTo(pos[0], pos[1]); 1359 return element; 1018 1360 }, 1019 1361 1020 1362 getStyle: function(element, style) { 1021 1363 element = $(element); 1022 var value = element.style[style.camelize()]; 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]; 1023 1368 if (!value) { 1024 1369 if (document.defaultView && document.defaultView.getComputedStyle) { 1025 1370 var css = document.defaultView.getComputedStyle(element, null); 1026 value = css ? css .getPropertyValue(style): null;1371 value = css ? css[style] : null; 1027 1372 } else if (element.currentStyle) { 1028 value = element.currentStyle[style .camelize()];1373 value = element.currentStyle[style]; 1029 1374 } 1030 1375 } 1376 1377 if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none')) 1378 value = element['offset'+style.capitalize()] + 'px'; 1031 1379 1032 1380 if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) 1033 1381 if (Element.getStyle(element, 'position') == 'static') value = 'auto'; 1034 1382 if(style == 'opacity') { 1383 if(value) return parseFloat(value); 1384 if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) 1385 if(value[1]) return parseFloat(value[1]) / 100; 1386 return 1.0; 1387 } 1035 1388 return value == 'auto' ? null : value; 1036 1389 }, … … 1038 1391 setStyle: function(element, style) { 1039 1392 element = $(element); 1040 for (var name in style) 1041 element.style[name.camelize()] = style[name]; 1393 for (var name in style) { 1394 var value = style[name]; 1395 if(name == 'opacity') { 1396 if (value == 1) { 1397 value = (/Gecko/.test(navigator.userAgent) && 1398 !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0; 1399 if(/MSIE/.test(navigator.userAgent) && !window.opera) 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,''); 1404 } else { 1405 if(value < 0.00001) value = 0; 1406 if(/MSIE/.test(navigator.userAgent) && !window.opera) 1407 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') + 1408 'alpha(opacity='+value*100+')'; 1409 } 1410 } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat'; 1411 element.style[name.camelize()] = value; 1412 } 1413 return element; 1042 1414 }, 1043 1415 1044 1416 getDimensions: function(element) { 1045 1417 element = $(element); 1046 if (Element.getStyle(element, 'display') != 'none') 1418 var display = $(element).getStyle('display'); 1419 if (display != 'none' && display != null) // Safari bug 1047 1420 return {width: element.offsetWidth, height: element.offsetHeight}; 1048 1421 … … 1052 1425 var originalVisibility = els.visibility; 1053 1426 var originalPosition = els.position; 1427 var originalDisplay = els.display; 1054 1428 els.visibility = 'hidden'; 1055 1429 els.position = 'absolute'; 1056 els.display = ' ';1430 els.display = 'block'; 1057 1431 var originalWidth = element.clientWidth; 1058 1432 var originalHeight = element.clientHeight; 1059 els.display = 'none';1433 els.display = originalDisplay; 1060 1434 els.position = originalPosition; 1061 1435 els.visibility = originalVisibility; … … 1076 1450 } 1077 1451 } 1452 return element; 1078 1453 }, 1079 1454 … … 1088 1463 element.style.right = ''; 1089 1464 } 1465 return element; 1090 1466 }, 1091 1467 1092 1468 makeClipping: function(element) { 1093 1469 element = $(element); 1094 if (element._overflow) return ;1095 element._overflow = element.style.overflow ;1470 if (element._overflow) return element; 1471 element._overflow = element.style.overflow || 'auto'; 1096 1472 if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') 1097 1473 element.style.overflow = 'hidden'; 1474 return element; 1098 1475 }, 1099 1476 1100 1477 undoClipping: function(element) { 1101 1478 element = $(element); 1102 if (element._overflow) return; 1103 element.style.overflow = element._overflow; 1104 element._overflow = undefined; 1105 } 1106 } 1479 if (!element._overflow) return element; 1480 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; 1481 element._overflow = null; 1482 return element; 1483 } 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 }); 1530 1531 Element.Methods.Simulated = { 1532 hasAttribute: function(element, attribute) { 1533 var t = Element._attributeTranslations; 1534 attribute = t.names[attribute] || attribute; 1535 return $(element).getAttributeNode(attribute).specified; 1536 } 1537 }; 1538 1539 // IE is missing .innerHTML support for TABLE-related elements 1540 if (document.all && !window.opera){ 1541 Element.Methods.update = function(element, html) { 1542 element = $(element); 1543 html = typeof html == 'undefined' ? '' : html.toString(); 1544 var tagName = element.tagName.toUpperCase(); 1545 if (['THEAD','TBODY','TR','TD'].include(tagName)) { 1546 var div = document.createElement('div'); 1547 switch (tagName) { 1548 case 'THEAD': 1549 case 'TBODY': 1550 div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>'; 1551 depth = 2; 1552 break; 1553 case 'TR': 1554 div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>'; 1555 depth = 3; 1556 break; 1557 case 'TD': 1558 div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>'; 1559 depth = 4; 1560 } 1561 $A(element.childNodes).each(function(node){ 1562 element.removeChild(node) 1563 }); 1564 depth.times(function(){ div = div.firstChild }); 1565 1566 $A(div.childNodes).each( 1567 function(node){ element.appendChild(node) }); 1568 } else { 1569 element.innerHTML = html.stripScripts(); 1570 } 1571 setTimeout(function() {html.evalScripts()}, 10); 1572 return element; 1573 } 1574 }; 1107 1575 1108 1576 Object.extend(Element, Element.Methods); … … 1110 1578 var _nativeExtensions = false; 1111 1579 1112 if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { 1113 var HTMLElement = {} 1114 HTMLElement.prototype = document.createElement('div').__proto__; 1115 } 1580 if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 1581 ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { 1582 var className = 'HTML' + tag + 'Element'; 1583 if(window[className]) return; 1584 var klass = window[className] = {}; 1585 klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; 1586 }); 1116 1587 1117 1588 Element.addMethods = function(methods) { 1118 1589 Object.extend(Element.Methods, methods || {}); 1119 1590 1120 if(typeof HTMLElement != 'undefined') { 1121 var methods = Element.Methods, cache = Element.extend.cache; 1122 for (property in methods) { 1591 function copy(methods, destination, onlyIfAbsent) { 1592 onlyIfAbsent = onlyIfAbsent || false; 1593 var cache = Element.extend.cache; 1594 for (var property in methods) { 1123 1595 var value = methods[property]; 1124 if (typeof value == 'function') 1125 HTMLElement.prototype[property] = cache.findOrStore(value); 1126 } 1596 if (!onlyIfAbsent || !(property in destination)) 1597 destination[property] = cache.findOrStore(value); 1598 } 1599 } 1600 1601 if (typeof HTMLElement != 'undefined') { 1602 copy(Element.Methods, HTMLElement.prototype); 1603 copy(Element.Methods.Simulated, HTMLElement.prototype, true); 1604 copy(Form.Methods, HTMLFormElement.prototype); 1605 [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { 1606 copy(Form.Element.Methods, klass.prototype); 1607 }); 1127 1608 _nativeExtensions = true; 1128 1609 } 1129 1610 } 1130 1131 Element.addMethods();1132 1611 1133 1612 var Toggle = new Object(); … … 1149 1628 this.element.insertAdjacentHTML(this.adjacency, this.content); 1150 1629 } catch (e) { 1151 var tagName = this.element.tagName.to LowerCase();1152 if ( tagName == 'tbody' || tagName == 'tr') {1630 var tagName = this.element.tagName.toUpperCase(); 1631 if (['TBODY', 'TR'].include(tagName)) { 1153 1632 this.insertContent(this.contentFromAnonymousTable()); 1154 1633 } else { … … 1249 1728 add: function(classNameToAdd) { 1250 1729 if (this.include(classNameToAdd)) return; 1251 this.set( this.toArray().concat(classNameToAdd).join(' '));1730 this.set($A(this).concat(classNameToAdd).join(' ')); 1252 1731 }, 1253 1732 1254 1733 remove: function(classNameToRemove) { 1255 1734 if (!this.include(classNameToRemove)) return; 1256 this.set(this.select(function(className) { 1257 return className != classNameToRemove; 1258 }).join(' ')); 1735 this.set($A(this).without(classNameToRemove).join(' ')); 1259 1736 }, 1260 1737 1261 1738 toString: function() { 1262 return this.toArray().join(' ');1263 } 1264 } 1739 return $A(this).join(' '); 1740 } 1741 }; 1265 1742 1266 1743 Object.extend(Element.ClassNames.prototype, Enumerable); … … 1309 1786 conditions.push('true'); 1310 1787 if (clause = params.id) 1311 conditions.push('element. id== ' + clause.inspect());1788 conditions.push('element.readAttribute("id") == ' + clause.inspect()); 1312 1789 if (clause = params.tagName) 1313 1790 conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); 1314 1791 if ((clause = params.classNames).length > 0) 1315 for (var i = 0 ; i < clause.length; i++)1316 conditions.push(' Element.hasClassName(element,' + clause[i].inspect() + ')');1792 for (var i = 0, length = clause.length; i < length; i++) 1793 conditions.push('element.hasClassName(' + clause[i].inspect() + ')'); 1317 1794 if (clause = params.attributes) { 1318 1795 clause.each(function(attribute) { 1319 var value = 'element. getAttribute(' + attribute.name.inspect() + ')';1796 var value = 'element.readAttribute(' + attribute.name.inspect() + ')'; 1320 1797 var splitValueBy = function(delimiter) { 1321 1798 return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; … … 1330 1807 case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; 1331 1808 case '': 1332 case undefined: conditions.push( value + ' != null'); break;1809 case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break; 1333 1810 default: throw 'Unknown operator ' + attribute.operator + ' in selector'; 1334 1811 } … … 1341 1818 compileMatcher: function() { 1342 1819 this.match = new Function('element', 'if (!element.tagName) return false; \ 1820 element = $(element); \ 1343 1821 return ' + this.buildMatchExpression()); 1344 1822 }, … … 1355 1833 1356 1834 var results = []; 1357 for (var i = 0 ; i < scope.length; i++)1835 for (var i = 0, length = scope.length; i < length; i++) 1358 1836 if (this.match(element = scope[i])) 1359 1837 results.push(Element.extend(element)); … … 1367 1845 } 1368 1846 1847 Object.extend(Selector, { 1848 matchElements: function(elements, expression) { 1849 var selector = new Selector(expression); 1850 return elements.select(selector.match.bind(selector)).map(Element.extend); 1851 }, 1852 1853 findElement: function(elements, expression, index) { 1854 if (typeof expression == 'number') index = expression, expression = false; 1855 return Selector.matchElements(elements, expression || '*')[index || 0]; 1856 }, 1857 1858 findChildElements: function(element, expressions) { 1859 return expressions.map(function(expression) { 1860 return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) { 1861 var selector = new Selector(expr); 1862 return results.inject([], function(elements, result) { 1863 return elements.concat(selector.findElements(result || element)); 1864 }); 1865 }); 1866 }).flatten(); 1867 } 1868 }); 1869 1369 1870 function $$() { 1370 return $A(arguments).map(function(expression) { 1371 return expression.strip().split(/\s+/).inject([null], function(results, expr) { 1372 var selector = new Selector(expr); 1373 return results.map(selector.findElements.bind(selector)).flatten(); 1374 }); 1375 }).flatten(); 1376 } 1377 var Field = { 1378 clear: function() { 1379 for (var i = 0; i < arguments.length; i++) 1380 $(arguments[i]).value = ''; 1381 }, 1382 1871 return Selector.findChildElements(document, $A(arguments)); 1872 } 1873 var Form = { 1874 reset: function(form) { 1875 $(form).reset(); 1876 return form; 1877 }, 1878 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); 1895 } 1896 }; 1897 1898 Form.Methods = { 1899 serialize: function(form, getHash) { 1900 return Form.serializeElements(Form.getElements(form), getHash); 1901 }, 1902 1903 getElements: function(form) { 1904 return $A($(form).getElementsByTagName('*')).inject([], 1905 function(elements, child) { 1906 if (Form.Element.Serializers[child.tagName.toLowerCase()]) 1907 elements.push(Element.extend(child)); 1908 return elements; 1909 } 1910 ); 1911 }, 1912 1913 getInputs: function(form, typeName, name) { 1914 form = $(form); 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++) { 1920 var input = inputs[i]; 1921 if ((typeName && input.type != typeName) || (name && input.name != name)) 1922 continue; 1923 matchingInputs.push(Element.extend(input)); 1924 } 1925 1926 return matchingInputs; 1927 }, 1928 1929 disable: function(form) { 1930 form = $(form); 1931 form.getElements().each(function(element) { 1932 element.blur(); 1933 element.disabled = 'true'; 1934 }); 1935 return form; 1936 }, 1937 1938 enable: function(form) { 1939 form = $(form); 1940 form.getElements().each(function(element) { 1941 element.disabled = ''; 1942 }); 1943 return form; 1944 }, 1945 1946 findFirstElement: function(form) { 1947 return $(form).getElements().find(function(element) { 1948 return element.type != 'hidden' && !element.disabled && 1949 ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); 1950 }); 1951 }, 1952 1953 focusFirstElement: function(form) { 1954 form = $(form); 1955 form.findFirstElement().activate(); 1956 return form; 1957 } 1958 } 1959 1960 Object.extend(Form, Form.Methods); 1961 1962 /*--------------------------------------------------------------------------*/ 1963 1964 Form.Element = { 1383 1965 focus: function(element) { 1384 1966 $(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; 1967 return element; 1391 1968 }, 1392 1969 1393 1970 select: function(element) { 1394 1971 $(element).select(); 1972 return element; 1973 } 1974 } 1975 1976 Form.Element.Methods = { 1977 serialize: function(element) { 1978 element = $(element); 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 ''; 1988 }, 1989 1990 getValue: function(element) { 1991 element = $(element); 1992 var method = element.tagName.toLowerCase(); 1993 return Form.Element.Serializers[method](element); 1994 }, 1995 1996 clear: function(element) { 1997 $(element).value = ''; 1998 return element; 1999 }, 2000 2001 present: function(element) { 2002 return $(element).value != ''; 1395 2003 }, 1396 2004 … … 1398 2006 element = $(element); 1399 2007 element.focus(); 1400 if (element.select) 2008 if (element.select && ( element.tagName.toLowerCase() != 'input' || 2009 !['button', 'reset', 'submit'].include(element.type) ) ) 1401 2010 element.select(); 1402 } 1403 } 2011 return element; 2012 }, 2013 2014 disable: function(element) { 2015 element = $(element); 2016 element.disabled = true; 2017 return element; 2018 }, 2019 2020 enable: function(element) { 2021 element = $(element); 2022 element.blur(); 2023 element.disabled = false; 2024 return element; 2025 } 2026 } 2027 2028 Object.extend(Form.Element, Form.Element.Methods); 2029 var Field = Form.Element; 2030 var $F = Form.Element.getValue; 1404 2031 1405 2032 /*--------------------------------------------------------------------------*/ 1406 1407 var Form = {1408 serialize: function(form) {1409 var elements = Form.getElements($(form));1410 var queryComponents = new Array();1411 1412 for (var i = 0; i < elements.length; i++) {1413 var queryComponent = Form.Element.serialize(elements[i]);1414 if (queryComponent)1415 queryComponents.push(queryComponent);1416 }1417 1418 return queryComponents.join('&');1419 },1420 1421 getElements: function(form) {1422 form = $(form);1423 var elements = new Array();1424 1425 for (var tagName in Form.Element.Serializers) {1426 var tagElements = form.getElementsByTagName(tagName);1427 for (var j = 0; j < tagElements.length; j++)1428 elements.push(tagElements[j]);1429 }1430 return elements;1431 },1432 1433 getInputs: function(form, typeName, name) {1434 form = $(form);1435 var inputs = form.getElementsByTagName('input');1436 1437 if (!typeName && !name)1438 return inputs;1439 1440 var matchingInputs = new Array();1441 for (var i = 0; i < inputs.length; i++) {1442 var input = inputs[i];1443 if ((typeName && input.type != typeName) ||1444 (name && input.name != name))1445 continue;1446 matchingInputs.push(input);1447 }1448 1449 return matchingInputs;1450 },1451 1452 disable: function(form) {1453 var elements = Form.getElements(form);1454 for (var i = 0; i < elements.length; i++) {1455 var element = elements[i];1456 element.blur();1457 element.disabled = 'true';1458 }1459 },1460 1461 enable: function(form) {1462 var elements = Form.getElements(form);1463 for (var i = 0; i < elements.length; i++) {1464 var element = elements[i];1465 element.disabled = '';1466 }1467 },1468 1469 findFirstElement: function(form) {1470 return Form.getElements(form).find(function(element) {1471 return element.type != 'hidden' && !element.disabled &&1472 ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());1473 });1474 },1475 1476 focusFirstElement: function(form) {1477 Field.activate(Form.findFirstElement(form));1478 },1479 1480 reset: function(form) {1481 $(form).reset();1482 }1483 }1484 1485 Form.Element = {1486 serialize: function(element) {1487 element = $(element);1488 var method = element.tagName.toLowerCase();1489 var parameter = Form.Element.Serializers[method](element);1490 1491 if (parameter) {1492 var key = encodeURIComponent(parameter[0]);1493 if (key.length == 0) return;1494 1495 if (parameter[1].constructor != Array)1496 parameter[1] = [parameter[1]];1497 1498 return parameter[1].map(function(value) {1499 return key + '=' + encodeURIComponent(value);1500 }).join('&');1501 }1502 },1503 1504 getValue: function(element) {1505 element = $(element);1506 var method = element.tagName.toLowerCase();1507 var parameter = Form.Element.Serializers[method](element);1508 1509 if (parameter)1510 return parameter[1];1511 }1512 }1513 2033 1514 2034 Form.Element.Serializers = { 1515 2035 input: function(element) { 1516 2036 switch (element.type.toLowerCase()) { 1517 case 'submit':1518 case 'hidden':1519 case 'password':1520 case 'text':1521 return Form.Element.Serializers.textarea(element);1522 2037 case 'checkbox': 1523 2038 case 'radio': 1524 2039 return Form.Element.Serializers.inputSelector(element); 1525 } 1526 return false; 2040 default: 2041 return Form.Element.Serializers.textarea(element); 2042 } 1527 2043 }, 1528 2044 1529 2045 inputSelector: function(element) { 1530 if (element.checked) 1531 return [element.name, element.value]; 2046 return element.checked ? element.value : null; 1532 2047 }, 1533 2048 1534 2049 textarea: function(element) { 1535 return [element.name, element.value];2050 return element.value; 1536 2051 }, 1537 2052 1538 2053 select: function(element) { 1539 return Form.Element.Serializers[element.type == 'select-one' ?2054 return this[element.type == 'select-one' ? 1540 2055 'selectOne' : 'selectMany'](element); 1541 2056 }, 1542 2057 1543 2058 selectOne: function(element) { 1544 var value = '', opt, index = element.selectedIndex; 1545 if (index >= 0) { 1546 opt = element.options[index]; 1547 value = opt.value || opt.text; 1548 } 1549 return [element.name, value]; 2059 var index = element.selectedIndex; 2060 return index >= 0 ? this.optionValue(element.options[index]) : null; 1550 2061 }, 1551 2062 1552 2063 selectMany: function(element) { 1553 var value = []; 1554 for (var i = 0; i < element.length; i++) { 2064 var values, length = element.length; 2065 if (!length) return null; 2066 2067 for (var i = 0, values = []; i < length; i++) { 1555 2068 var opt = element.options[i]; 1556 if (opt.selected) 1557 value.push(opt.value || opt.text);1558 }1559 return [element.name, value];1560 } 1561 } 1562 1563 /*--------------------------------------------------------------------------*/ 1564 1565 var $F = Form.Element.getValue; 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 } 1566 2079 1567 2080 /*--------------------------------------------------------------------------*/ … … 1584 2097 onTimerEvent: function() { 1585 2098 var value = this.getValue(); 1586 if (this.lastValue != value) { 2099 var changed = ('string' == typeof this.lastValue && 'string' == typeof value 2100 ? this.lastValue != value : String(this.lastValue) != String(value)); 2101 if (changed) { 1587 2102 this.callback(this.element, value); 1588 2103 this.lastValue = value; … … 1629 2144 1630 2145 registerFormCallbacks: function() { 1631 var elements = Form.getElements(this.element); 1632 for (var i = 0; i < elements.length; i++) 1633 this.registerCallback(elements[i]); 2146 Form.getElements(this.element).each(this.registerCallback.bind(this)); 1634 2147 }, 1635 2148 … … 1641 2154 Event.observe(element, 'click', this.onElementEvent.bind(this)); 1642 2155 break; 1643 case 'password': 1644 case 'text': 1645 case 'textarea': 1646 case 'select-one': 1647 case 'select-multiple': 2156 default: 1648 2157 Event.observe(element, 'change', this.onElementEvent.bind(this)); 1649 2158 break; … … 1680 2189 KEY_DOWN: 40, 1681 2190 KEY_DELETE: 46, 2191 KEY_HOME: 36, 2192 KEY_END: 35, 2193 KEY_PAGEUP: 33, 2194 KEY_PAGEDOWN: 34, 1682 2195 1683 2196 element: function(event) { … … 1735 2248 unloadCache: function() { 1736 2249 if (!Event.observers) return; 1737 for (var i = 0 ; i < Event.observers.length; i++) {2250 for (var i = 0, length = Event.observers.length; i < length; i++) { 1738 2251 Event.stopObserving.apply(this, Event.observers[i]); 1739 2252 Event.observers[i][0] = null; … … 1743 2256 1744 2257 observe: function(element, name, observer, useCapture) { 1745 varelement = $(element);2258 element = $(element); 1746 2259 useCapture = useCapture || false; 1747 2260 … … 1751 2264 name = 'keydown'; 1752 2265 1753 this._observeAndCache(element, name, observer, useCapture);2266 Event._observeAndCache(element, name, observer, useCapture); 1754 2267 }, 1755 2268 1756 2269 stopObserving: function(element, name, observer, useCapture) { 1757 varelement = $(element);2270 element = $(element); 1758 2271 useCapture = useCapture || false; 1759 2272 … … 1822 2335 element = element.offsetParent; 1823 2336 if (element) { 1824 p = Element.getStyle(element, 'position'); 2337 if(element.tagName=='BODY') break; 2338 var p = Element.getStyle(element, 'position'); 1825 2339 if (p == 'relative' || p == 'absolute') break; 1826 2340 } … … 1878 2392 }, 1879 2393 1880 clone: function(source, target) {1881 source = $(source);1882 target = $(target);1883 target.style.position = 'absolute';1884 var offsets = this.cumulativeOffset(source);1885 target.style.top = offsets[1] + 'px';1886 target.style.left = offsets[0] + 'px';1887 target.style.width = source.offsetWidth + 'px';1888 target.style.height = source.offsetHeight + 'px';1889 },1890 1891 2394 page: function(forElement) { 1892 2395 var valueT = 0, valueL = 0; … … 1905 2408 element = forElement; 1906 2409 do { 1907 valueT -= element.scrollTop || 0; 1908 valueL -= element.scrollLeft || 0; 2410 if (!window.opera || element.tagName=='BODY') { 2411 valueT -= element.scrollTop || 0; 2412 valueL -= element.scrollLeft || 0; 2413 } 1909 2414 } while (element = element.parentNode); 1910 2415 … … 1967 2472 1968 2473 element.style.position = 'absolute'; 1969 element.style.top = top + 'px'; ;1970 element.style.left = left + 'px'; ;1971 element.style.width = width + 'px'; ;1972 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'; 1973 2478 }, 1974 2479 … … 2007 2512 } 2008 2513 } 2514 2515 Element.addMethods(); -
trunk/wp-includes/js/scriptaculous/scriptaculous.js
r4629 r4813 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 1 // script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 4 // 3 5 // Permission is hereby granted, free of charge, to any person obtaining … … 19 21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 // 24 // For details, see the script.aculo.us web site: http://script.aculo.us/ 21 25 22 26 var Scriptaculous = { 23 Version: '1. 6.1',27 Version: '1.7.0', 24 28 require: function(libraryName) { 25 29 // inserting via DOM fails in Safari 2.0, so brute force approach -
trunk/wp-includes/js/scriptaculous/slider.js
r4629 r4813 1 // Copyright (c) 2005 Marty Haught, Thomas Fuchs 1 // script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs 2 4 // 3 // See http://script.aculo.us for more info 4 // 5 // Permission is hereby granted, free of charge, to any person obtaining 6 // a copy of this software and associated documentation files (the 7 // "Software"), to deal in the Software without restriction, including 8 // without limitation the rights to use, copy, modify, merge, publish, 9 // distribute, sublicense, and/or sell copies of the Software, and to 10 // permit persons to whom the Software is furnished to do so, subject to 11 // the following conditions: 12 // 13 // The above copyright notice and this permission notice shall be 14 // included in all copies or substantial portions of the Software. 15 // 16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 5 // script.aculo.us is freely distributable under the terms of an MIT-style license. 6 // For details, see the script.aculo.us web site: http://script.aculo.us/ 23 7 24 8 if(!Control) var Control = {}; … … 65 49 66 50 this.trackLength = this.maximumOffset() - this.minimumOffset(); 67 this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth; 51 52 this.handleLength = this.isVertical() ? 53 (this.handles[0].offsetHeight != 0 ? 54 this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : 55 (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : 56 this.handles[0].style.width.replace(/px$/,"")); 68 57 69 58 this.active = false; … … 138 127 setValue: function(sliderValue, handleIdx){ 139 128 if(!this.active) { 140 this.activeHandle = this.handles[handleIdx];141 this.activeHandle Idx = handleIdx;129 this.activeHandleIdx = handleIdx || 0; 130 this.activeHandle = this.handles[this.activeHandleIdx]; 142 131 this.updateStyles(); 143 132 } … … 181 170 }, 182 171 maximumOffset: function(){ 183 return(this.isVertical() ? 184 this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX); 172 return(this.isVertical() ? 173 (this.track.offsetHeight != 0 ? this.track.offsetHeight : 174 this.track.style.height.replace(/px$/,"")) - this.alignY : 175 (this.track.offsetWidth != 0 ? this.track.offsetWidth : 176 this.track.style.width.replace(/px$/,"")) - this.alignY); 185 177 }, 186 178 isVertical: function(){ … … 218 210 var handle = Event.element(event); 219 211 var pointer = [Event.pointerX(event), Event.pointerY(event)]; 220 if(handle==this.track) { 212 var track = handle; 213 if(track==this.track) { 221 214 var offsets = Position.cumulativeOffset(this.track); 222 215 this.event = event; … … 231 224 while((this.handles.indexOf(handle) == -1) && handle.parentNode) 232 225 handle = handle.parentNode; 233 234 this.activeHandle = handle; 235 this.activeHandleIdx = this.handles.indexOf(this.activeHandle); 236 this.updateStyles(); 237 238 var offsets = Position.cumulativeOffset(this.activeHandle); 239 this.offsetX = (pointer[0] - offsets[0]); 240 this.offsetY = (pointer[1] - offsets[1]); 226 227 if(this.handles.indexOf(handle)!=-1) { 228 this.activeHandle = handle; 229 this.activeHandleIdx = this.handles.indexOf(this.activeHandle); 230 this.updateStyles(); 231 232 var offsets = Position.cumulativeOffset(this.activeHandle); 233 this.offsetX = (pointer[0] - offsets[0]); 234 this.offsetY = (pointer[1] - offsets[1]); 235 } 241 236 } 242 237 } -
trunk/wp-includes/js/scriptaculous/unittest.js
r4629 r4813 1 // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 // (c) 2005 Jon Tirsen (http://www.tirsen.com) 3 // (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/) 1 // script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 2 3 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 // (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com) 5 // (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/) 4 6 // 5 // Permission is hereby granted, free of charge, to any person obtaining 6 // a copy of this software and associated documentation files (the 7 // "Software"), to deal in the Software without restriction, including 8 // without limitation the rights to use, copy, modify, merge, publish, 9 // distribute, sublicense, and/or sell copies of the Software, and to 10 // permit persons to whom the Software is furnished to do so, subject to 11 // the following conditions: 12 // 13 // The above copyright notice and this permission notice shall be 14 // included in all copies or substantial portions of the Software. 15 // 16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 7 // script.aculo.us is freely distributable under the terms of an MIT-style license. 8 // For details, see the script.aculo.us web site: http://script.aculo.us/ 24 9 25 10 // experimental, Firefox-only … … 28 13 pointerX: 0, 29 14 pointerY: 0, 30 buttons: 0 15 buttons: 0, 16 ctrlKey: false, 17 altKey: false, 18 shiftKey: false, 19 metaKey: false 31 20 }, arguments[2] || {}); 32 21 var oEvent = document.createEvent("MouseEvents"); 33 22 oEvent.initMouseEvent(eventName, true, true, document.defaultView, 34 23 options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, 35 false, false, false, false, 0, $(element));24 options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element)); 36 25 37 26 if(this.mark) Element.remove(this.mark); … … 99 88 this.statusCell = document.createElement('td'); 100 89 this.nameCell = document.createElement('td'); 90 this.nameCell.className = "nameCell"; 101 91 this.nameCell.appendChild(document.createTextNode(testName)); 102 92 this.messageCell = document.createElement('td'); … … 111 101 this.statusCell.innerHTML = status; 112 102 this.messageCell.innerHTML = this._toHTML(summary); 103 this.addLinksToResults(); 113 104 }, 114 105 message: function(message) { … … 132 123 _toHTML: function(txt) { 133 124 return txt.escapeHTML().replace(/\n/g,"<br/>"); 125 }, 126 addLinksToResults: function(){ 127 $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log 128 td.title = "Run only this test" 129 Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;}); 130 }); 131 $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log 132 td.title = "Run all tests" 133 Event.observe(td, 'click', function(){ window.location.search = "";}); 134 }); 134 135 } 135 136 } … … 142 143 }, arguments[1] || {}); 143 144 this.options.resultsURL = this.parseResultsURLQueryParameter(); 145 this.options.tests = this.parseTestsQueryParameter(); 144 146 if (this.options.testLog) { 145 147 this.options.testLog = $(this.options.testLog) || null; … … 159 161 for(var testcase in testcases) { 160 162 if(/^test/.test(testcase)) { 161 this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases["setup"], testcases["teardown"])); 163 this.tests.push( 164 new Test.Unit.Testcase( 165 this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, 166 testcases[testcase], testcases["setup"], testcases["teardown"] 167 )); 162 168 } 163 169 } … … 170 176 parseResultsURLQueryParameter: function() { 171 177 return window.location.search.parseQuery()["resultsURL"]; 178 }, 179 parseTestsQueryParameter: function(){ 180 if (window.location.search.parseQuery()["tests"]){ 181 return window.location.search.parseQuery()["tests"].split(','); 182 }; 172 183 }, 173 184 // Returns: … … 230 241 } 231 242 return ( 243 (this.options.context ? this.options.context + ': ': '') + 232 244 this.tests.length + " tests, " + 233 245 assertions + " assertions, " + … … 284 296 catch(e) { this.error(e); } 285 297 }, 298 assertInspect: function(expected, actual) { 299 var message = arguments[2] || "assertInspect"; 300 try { (expected == actual.inspect()) ? this.pass() : 301 this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 302 '", actual "' + Test.Unit.inspect(actual) + '"'); } 303 catch(e) { this.error(e); } 304 }, 286 305 assertEnumEqual: function(expected, actual) { 287 306 var message = arguments[2] || "assertEnumEqual"; … … 298 317 catch(e) { this.error(e); } 299 318 }, 319 assertIdentical: function(expected, actual) { 320 var message = arguments[2] || "assertIdentical"; 321 try { (expected === actual) ? this.pass() : 322 this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 323 '", actual "' + Test.Unit.inspect(actual) + '"'); } 324 catch(e) { this.error(e); } 325 }, 326 assertNotIdentical: function(expected, actual) { 327 var message = arguments[2] || "assertNotIdentical"; 328 try { !(expected === actual) ? this.pass() : 329 this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 330 '", actual "' + Test.Unit.inspect(actual) + '"'); } 331 catch(e) { this.error(e); } 332 }, 300 333 assertNull: function(obj) { 301 334 var message = arguments[1] || 'assertNull' … … 304 337 catch(e) { this.error(e); } 305 338 }, 339 assertMatch: function(expected, actual) { 340 var message = arguments[2] || 'assertMatch'; 341 var regex = new RegExp(expected); 342 try { (regex.exec(actual)) ? this.pass() : 343 this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); } 344 catch(e) { this.error(e); } 345 }, 306 346 assertHidden: function(element) { 307 347 var message = arguments[1] || 'assertHidden'; … … 311 351 var message = arguments[1] || 'assertNotNull'; 312 352 this.assert(object != null, message); 353 }, 354 assertType: function(expected, actual) { 355 var message = arguments[2] || 'assertType'; 356 try { 357 (actual.constructor == expected) ? this.pass() : 358 this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 359 '", actual "' + (actual.constructor) + '"'); } 360 catch(e) { this.error(e); } 361 }, 362 assertNotOfType: function(expected, actual) { 363 var message = arguments[2] || 'assertNotOfType'; 364 try { 365 (actual.constructor != expected) ? this.pass() : 366 this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 367 '", actual "' + (actual.constructor) + '"'); } 368 catch(e) { this.error(e); } 313 369 }, 314 370 assertInstanceOf: function(expected, actual) { … … 325 381 this.fail(message + ": object was an instance of the not expected type"); } 326 382 catch(e) { this.error(e); } 383 }, 384 assertRespondsTo: function(method, obj) { 385 var message = arguments[2] || 'assertRespondsTo'; 386 try { 387 (obj[method] && typeof obj[method] == 'function') ? this.pass() : 388 this.fail(message + ": object doesn't respond to [" + method + "]"); } 389 catch(e) { this.error(e); } 390 }, 391 assertReturnsTrue: function(method, obj) { 392 var message = arguments[2] || 'assertReturnsTrue'; 393 try { 394 var m = obj[method]; 395 if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; 396 m() ? this.pass() : 397 this.fail(message + ": method returned false"); } 398 catch(e) { this.error(e); } 399 }, 400 assertReturnsFalse: function(method, obj) { 401 var message = arguments[2] || 'assertReturnsFalse'; 402 try { 403 var m = obj[method]; 404 if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; 405 !m() ? this.pass() : 406 this.fail(message + ": method returned true"); } 407 catch(e) { this.error(e); } 408 }, 409 assertRaise: function(exceptionName, method) { 410 var message = arguments[2] || 'assertRaise'; 411 try { 412 method(); 413 this.fail(message + ": exception expected but none was raised"); } 414 catch(e) { 415 ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); 416 } 417 }, 418 assertElementsMatch: function() { 419 var expressions = $A(arguments), elements = $A(expressions.shift()); 420 if (elements.length != expressions.length) { 421 this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions'); 422 return false; 423 } 424 elements.zip(expressions).all(function(pair, index) { 425 var element = $(pair.first()), expression = pair.last(); 426 if (element.match(expression)) return true; 427 this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect()); 428 }.bind(this)) && this.pass(); 429 }, 430 assertElementMatches: function(element, expression) { 431 this.assertElementsMatch([element], expression); 432 }, 433 benchmark: function(operation, iterations) { 434 var startAt = new Date(); 435 (iterations || 1).times(operation); 436 var timeTaken = ((new Date())-startAt); 437 this.info((arguments[2] || 'Operation') + ' finished ' + 438 iterations + ' iterations in ' + (timeTaken/1000)+'s' ); 439 return timeTaken; 327 440 }, 328 441 _isVisible: function(element) { … … 356 469 Test.Unit.Assertions.prototype.initialize.bind(this)(); 357 470 this.name = name; 358 this.test = test || function() {}; 471 472 if(typeof test == 'string') { 473 test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,'); 474 test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)'); 475 this.test = function() { 476 eval('with(this){'+test+'}'); 477 } 478 } else { 479 this.test = test || function() {}; 480 } 481 359 482 this.setup = setup || function() {}; 360 483 this.teardown = teardown || function() {}; … … 382 505 } 383 506 }); 507 508 // *EXPERIMENTAL* BDD-style testing to please non-technical folk 509 // This draws many ideas from RSpec http://rspec.rubyforge.org/ 510 511 Test.setupBDDExtensionMethods = function(){ 512 var METHODMAP = { 513 shouldEqual: 'assertEqual', 514 shouldNotEqual: 'assertNotEqual', 515 shouldEqualEnum: 'assertEnumEqual', 516 shouldBeA: 'assertType', 517 shouldNotBeA: 'assertNotOfType', 518 shouldBeAn: 'assertType', 519 shouldNotBeAn: 'assertNotOfType', 520 shouldBeNull: 'assertNull', 521 shouldNotBeNull: 'assertNotNull', 522 523 shouldBe: 'assertReturnsTrue', 524 shouldNotBe: 'assertReturnsFalse', 525 shouldRespondTo: 'assertRespondsTo' 526 }; 527 Test.BDDMethods = {}; 528 for(m in METHODMAP) { 529 Test.BDDMethods[m] = eval( 530 'function(){'+ 531 'var args = $A(arguments);'+ 532 'var scope = args.shift();'+ 533 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }'); 534 } 535 [Array.prototype, String.prototype, Number.prototype].each( 536 function(p){ Object.extend(p, Test.BDDMethods) } 537 ); 538 } 539 540 Test.context = function(name, spec, log){ 541 Test.setupBDDExtensionMethods(); 542 543 var compiledSpec = {}; 544 var titles = {}; 545 for(specName in spec) { 546 switch(specName){ 547 case "setup": 548 case "teardown": 549 compiledSpec[specName] = spec[specName]; 550 break; 551 default: 552 var testName = 'test'+specName.gsub(/\s+/,'-').camelize(); 553 var body = spec[specName].toString().split('\n').slice(1); 554 if(/^\{/.test(body[0])) body = body.slice(1); 555 body.pop(); 556 body = body.map(function(statement){ 557 return statement.strip() 558 }); 559 compiledSpec[testName] = body.join('\n'); 560 titles[testName] = specName; 561 } 562 } 563 new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name }); 564 }; -
trunk/wp-includes/js/wp-ajax-js.php
r4768 r4813 24 24 }, 25 25 addArg: function(key, value) { 26 var a = $H(this.options.parameters.parseQuery());26 var a = []; 27 27 a[encodeURIComponent(key)] = encodeURIComponent(value); 28 this.options.parameters = a.map(function(pair) { 29 return pair.join('='); 30 }).join('&'); 28 this.options.parameters = $H(this.options.parameters).merge($H(a)); 31 29 }, 32 30 getResponseElement: function(r) { -
trunk/wp-includes/script-loader.php
r4799 r4813 19 19 $mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php'); 20 20 $this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20070124' ); 21 $this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0 ');21 $this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0-0'); 22 22 $this->add( 'autosave', '/wp-includes/js/autosave-js.php', array('prototype', 'sack'), '20070116'); 23 23 $this->add( 'wp-ajax', '/wp-includes/js/wp-ajax-js.php', array('prototype'), '20070118'); 24 24 $this->add( 'listman', '/wp-includes/js/list-manipulation-js.php', array('wp-ajax', 'fat'), '20070118'); 25 $this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1. 6.1');26 $this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1. 6.1');27 $this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder' ), '1.6.1');28 $this->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1. 6.1');29 $this->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1. 6.1');30 $this->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1. 6.1');31 $this->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1. 6.1');25 $this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.7.0'); 26 $this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.7.0'); 27 $this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.7.0'); 28 $this->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.7.0'); 29 $this->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.7.0'); 30 $this->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.7.0'); 31 $this->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.7.0'); 32 32 $this->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118'); 33 33 if ( is_admin() ) {
Note: See TracChangeset
for help on using the changeset viewer.