sproutcore 0.9.14 → 0.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +43 -0
- data/Manifest.txt +12 -3
- data/bin/sc-build +19 -3
- data/bin/sc-install +5 -0
- data/bin/sc-remove +5 -0
- data/bin/sc-update +5 -0
- data/frameworks/prototype/prototype.js +267 -230
- data/frameworks/sproutcore/HISTORY +281 -135
- data/frameworks/sproutcore/controllers/array.js +133 -22
- data/frameworks/sproutcore/controllers/collection.js +4 -5
- data/frameworks/sproutcore/controllers/object.js +8 -2
- data/frameworks/sproutcore/core.js +361 -159
- data/frameworks/sproutcore/{foundation → debug}/unittest.js +3 -3
- data/frameworks/sproutcore/english.lproj/detect-browser +1 -1
- data/frameworks/sproutcore/english.lproj/theme.css +2 -2
- data/frameworks/sproutcore/foundation/application.js +6 -1
- data/frameworks/sproutcore/foundation/benchmark.js +37 -11
- data/frameworks/sproutcore/foundation/date.js +1 -1
- data/frameworks/sproutcore/foundation/enumerator.js +105 -0
- data/frameworks/sproutcore/foundation/object.js +19 -20
- data/frameworks/sproutcore/foundation/responder.js +1 -1
- data/frameworks/sproutcore/foundation/set.js +164 -57
- data/frameworks/sproutcore/foundation/string.js +151 -47
- data/frameworks/sproutcore/foundation/utils.js +84 -3
- data/frameworks/sproutcore/lib/collection_view.rb +1 -0
- data/frameworks/sproutcore/license.js +28 -0
- data/frameworks/sproutcore/mixins/array.js +73 -209
- data/frameworks/sproutcore/mixins/delegate_support.js +1 -1
- data/frameworks/sproutcore/mixins/enumerable.js +1006 -0
- data/frameworks/sproutcore/mixins/observable.js +153 -84
- data/frameworks/sproutcore/mixins/selection_support.js +13 -1
- data/frameworks/sproutcore/models/record.js +74 -27
- data/frameworks/sproutcore/models/store.js +7 -3
- data/frameworks/sproutcore/server/rails_server.js +82 -0
- data/frameworks/sproutcore/server/rest_server.js +178 -0
- data/frameworks/sproutcore/{foundation → server}/server.js +101 -48
- data/frameworks/sproutcore/tests/core/guidFor.rhtml +114 -0
- data/frameworks/sproutcore/tests/foundation/array.rhtml +6 -7
- data/frameworks/sproutcore/tests/foundation/set.rhtml +254 -0
- data/frameworks/sproutcore/tests/mixins/enumerable.rhtml +421 -0
- data/frameworks/sproutcore/tests/mixins/observable.rhtml +127 -0
- data/frameworks/sproutcore/tests/models/model.rhtml +23 -22
- data/frameworks/sproutcore/tests/views/collection/incremental_rendering.rhtml +2 -2
- data/frameworks/sproutcore/tests/views/view/clippingFrame.rhtml +112 -109
- data/frameworks/sproutcore/tests/views/view/frame.rhtml +91 -88
- data/frameworks/sproutcore/validators/date.js +1 -7
- data/frameworks/sproutcore/views/collection/collection.js +7 -2
- data/frameworks/sproutcore/views/list_item.js +141 -3
- data/frameworks/sproutcore/views/split.js +14 -11
- data/frameworks/sproutcore/views/view.js +9 -6
- data/lib/sproutcore/build_tools/html_builder.rb +19 -3
- data/lib/sproutcore/build_tools/resource_builder.rb +9 -3
- data/lib/sproutcore/bundle.rb +21 -0
- data/lib/sproutcore/bundle_manifest.rb +64 -20
- data/lib/sproutcore/helpers/capture_helper.rb +2 -2
- data/lib/sproutcore/library.rb +33 -9
- data/lib/sproutcore/merb/bundle_controller.rb +16 -5
- data/lib/sproutcore/version.rb +1 -1
- data/lib/sproutcore/view_helpers.rb +1 -1
- data/{sc-config.rb → sc-config} +5 -2
- metadata +24 -5
@@ -9,7 +9,7 @@
|
|
9
9
|
@license */
|
10
10
|
|
11
11
|
var Prototype = {
|
12
|
-
Version: '1.6.0',
|
12
|
+
Version: '1.6.0.2',
|
13
13
|
|
14
14
|
Browser: {
|
15
15
|
IE: !!(window.attachEvent && !window.opera),
|
@@ -38,8 +38,6 @@ var Prototype = {
|
|
38
38
|
if (Prototype.Browser.MobileSafari)
|
39
39
|
Prototype.BrowserFeatures.SpecificElementExtensions = false;
|
40
40
|
|
41
|
-
if (Prototype.Browser.WebKit)
|
42
|
-
Prototype.BrowserFeatures.XPath = false;
|
43
41
|
|
44
42
|
/* Based on Alex Arnell's inheritance implementation. */
|
45
43
|
var Class = {
|
@@ -112,9 +110,9 @@ Object.extend = function(destination, source) {
|
|
112
110
|
Object.extend(Object, {
|
113
111
|
inspect: function(object) {
|
114
112
|
try {
|
115
|
-
if (object
|
113
|
+
if (Object.isUndefined(object)) return 'undefined';
|
116
114
|
if (object === null) return 'null';
|
117
|
-
return object.inspect ? object.inspect() : object
|
115
|
+
return object.inspect ? object.inspect() : String(object);
|
118
116
|
} catch (e) {
|
119
117
|
if (e instanceof RangeError) return '...';
|
120
118
|
throw e;
|
@@ -137,7 +135,7 @@ Object.extend(Object, {
|
|
137
135
|
var results = [];
|
138
136
|
for (var property in object) {
|
139
137
|
var value = Object.toJSON(object[property]);
|
140
|
-
if (value
|
138
|
+
if (!Object.isUndefined(value))
|
141
139
|
results.push(property.toJSON() + ': ' + value);
|
142
140
|
}
|
143
141
|
|
@@ -175,7 +173,8 @@ Object.extend(Object, {
|
|
175
173
|
},
|
176
174
|
|
177
175
|
isArray: function(object) {
|
178
|
-
return object && object
|
176
|
+
return object != null && typeof object == "object" &&
|
177
|
+
'splice' in object && 'join' in object;
|
179
178
|
},
|
180
179
|
|
181
180
|
isHash: function(object) {
|
@@ -206,7 +205,7 @@ Object.extend(Function.prototype, {
|
|
206
205
|
},
|
207
206
|
|
208
207
|
bind: function() {
|
209
|
-
if (arguments.length < 2 && arguments[0]
|
208
|
+
if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
|
210
209
|
var __method = this, args = $A(arguments), object = args.shift();
|
211
210
|
return function() {
|
212
211
|
return __method.apply(object, args.concat($A(arguments)));
|
@@ -353,7 +352,7 @@ Object.extend(String.prototype, {
|
|
353
352
|
|
354
353
|
sub: function(pattern, replacement, count) {
|
355
354
|
replacement = this.gsub.prepareReplacement(replacement);
|
356
|
-
count = count
|
355
|
+
count = Object.isUndefined(count) ? 1 : count;
|
357
356
|
|
358
357
|
return this.gsub(pattern, function(match) {
|
359
358
|
if (--count < 0) return match[0];
|
@@ -368,7 +367,7 @@ Object.extend(String.prototype, {
|
|
368
367
|
|
369
368
|
truncate: function(length, truncation) {
|
370
369
|
length = length || 30;
|
371
|
-
truncation = truncation
|
370
|
+
truncation = Object.isUndefined(truncation) ? '...' : truncation;
|
372
371
|
return this.length > length ?
|
373
372
|
this.slice(0, length - truncation.length) + truncation : String(this);
|
374
373
|
},
|
@@ -488,7 +487,9 @@ Object.extend(String.prototype, {
|
|
488
487
|
},
|
489
488
|
|
490
489
|
isJSON: function() {
|
491
|
-
var str = this
|
490
|
+
var str = this;
|
491
|
+
if (str.blank()) return false;
|
492
|
+
str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
|
492
493
|
return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
|
493
494
|
},
|
494
495
|
|
@@ -567,7 +568,8 @@ var Template = Class.create({
|
|
567
568
|
if (before == '\\') return match[2];
|
568
569
|
|
569
570
|
var ctx = object, expr = match[3];
|
570
|
-
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)
|
571
|
+
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
|
572
|
+
match = pattern.exec(expr);
|
571
573
|
if (match == null) return before;
|
572
574
|
|
573
575
|
while (match != null) {
|
@@ -579,7 +581,7 @@ var Template = Class.create({
|
|
579
581
|
}
|
580
582
|
|
581
583
|
return before + String.interpret(ctx);
|
582
|
-
}
|
584
|
+
});
|
583
585
|
}
|
584
586
|
});
|
585
587
|
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
|
@@ -688,7 +690,7 @@ var Enumerable = {
|
|
688
690
|
},
|
689
691
|
|
690
692
|
inGroupsOf: function(number, fillWith) {
|
691
|
-
fillWith = fillWith
|
693
|
+
fillWith = Object.isUndefined(fillWith) ? null : fillWith;
|
692
694
|
return this.eachSlice(number, function(slice) {
|
693
695
|
while(slice.length < number) slice.push(fillWith);
|
694
696
|
return slice;
|
@@ -715,7 +717,7 @@ var Enumerable = {
|
|
715
717
|
var result;
|
716
718
|
this.each(function(value, index) {
|
717
719
|
value = iterator(value, index);
|
718
|
-
if (result ==
|
720
|
+
if (result == null || value >= result)
|
719
721
|
result = value;
|
720
722
|
});
|
721
723
|
return result;
|
@@ -726,7 +728,7 @@ var Enumerable = {
|
|
726
728
|
var result;
|
727
729
|
this.each(function(value, index) {
|
728
730
|
value = iterator(value, index);
|
729
|
-
if (result ==
|
731
|
+
if (result == null || value < result)
|
730
732
|
result = value;
|
731
733
|
});
|
732
734
|
return result;
|
@@ -807,20 +809,20 @@ Object.extend(Enumerable, {
|
|
807
809
|
function $A(iterable) {
|
808
810
|
if (!iterable) return [];
|
809
811
|
if (iterable.toArray) return iterable.toArray();
|
810
|
-
var length = iterable.length, results = new Array(length);
|
812
|
+
var length = iterable.length || 0, results = new Array(length);
|
811
813
|
while (length--) results[length] = iterable[length];
|
812
814
|
return results;
|
813
815
|
}
|
814
816
|
|
815
817
|
if (Prototype.Browser.WebKit) {
|
816
|
-
|
818
|
+
$A = function(iterable) {
|
817
819
|
if (!iterable) return [];
|
818
820
|
if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
|
819
821
|
iterable.toArray) return iterable.toArray();
|
820
|
-
var length = iterable.length, results = new Array(length);
|
822
|
+
var length = iterable.length || 0, results = new Array(length);
|
821
823
|
while (length--) results[length] = iterable[length];
|
822
824
|
return results;
|
823
|
-
}
|
825
|
+
};
|
824
826
|
}
|
825
827
|
|
826
828
|
Array.from = $A;
|
@@ -906,7 +908,7 @@ Object.extend(Array.prototype, {
|
|
906
908
|
var results = [];
|
907
909
|
this.each(function(object) {
|
908
910
|
var value = Object.toJSON(object);
|
909
|
-
if (value
|
911
|
+
if (!Object.isUndefined(value)) results.push(value);
|
910
912
|
});
|
911
913
|
return '[' + results.join(', ') + ']';
|
912
914
|
}
|
@@ -986,34 +988,6 @@ function $H(object) {
|
|
986
988
|
};
|
987
989
|
|
988
990
|
var Hash = Class.create(Enumerable, (function() {
|
989
|
-
if (function() {
|
990
|
-
var i = 0, Test = function(value) { this.key = value; };
|
991
|
-
Test.prototype.key = 'foo';
|
992
|
-
for (var property in new Test('bar')) i++;
|
993
|
-
return i > 1;
|
994
|
-
}()) {
|
995
|
-
function each(iterator) {
|
996
|
-
var cache = [];
|
997
|
-
for (var key in this._object) {
|
998
|
-
var value = this._object[key];
|
999
|
-
if (cache.include(key)) continue;
|
1000
|
-
cache.push(key);
|
1001
|
-
var pair = [key, value];
|
1002
|
-
pair.key = key;
|
1003
|
-
pair.value = value;
|
1004
|
-
iterator(pair);
|
1005
|
-
}
|
1006
|
-
}
|
1007
|
-
} else {
|
1008
|
-
function each(iterator) {
|
1009
|
-
for (var key in this._object) {
|
1010
|
-
var value = this._object[key], pair = [key, value];
|
1011
|
-
pair.key = key;
|
1012
|
-
pair.value = value;
|
1013
|
-
iterator(pair);
|
1014
|
-
}
|
1015
|
-
}
|
1016
|
-
}
|
1017
991
|
|
1018
992
|
function toQueryPair(key, value) {
|
1019
993
|
if (Object.isUndefined(value)) return key;
|
@@ -1025,7 +999,14 @@ var Hash = Class.create(Enumerable, (function() {
|
|
1025
999
|
this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
|
1026
1000
|
},
|
1027
1001
|
|
1028
|
-
_each:
|
1002
|
+
_each: function(iterator) {
|
1003
|
+
for (var key in this._object) {
|
1004
|
+
var value = this._object[key], pair = [key, value];
|
1005
|
+
pair.key = key;
|
1006
|
+
pair.value = value;
|
1007
|
+
iterator(pair);
|
1008
|
+
}
|
1009
|
+
},
|
1029
1010
|
|
1030
1011
|
set: function(key, value) {
|
1031
1012
|
return this._object[key] = value;
|
@@ -1189,8 +1170,11 @@ Ajax.Base = Class.create({
|
|
1189
1170
|
Object.extend(this.options, options || { });
|
1190
1171
|
|
1191
1172
|
this.options.method = this.options.method.toLowerCase();
|
1173
|
+
|
1192
1174
|
if (Object.isString(this.options.parameters))
|
1193
1175
|
this.options.parameters = this.options.parameters.toQueryParams();
|
1176
|
+
else if (Object.isHash(this.options.parameters))
|
1177
|
+
this.options.parameters = this.options.parameters.toObject();
|
1194
1178
|
}
|
1195
1179
|
});
|
1196
1180
|
|
@@ -1208,7 +1192,7 @@ Ajax.Request = Class.create(Ajax.Base, {
|
|
1208
1192
|
this.method = this.options.method;
|
1209
1193
|
var params = Object.clone(this.options.parameters);
|
1210
1194
|
|
1211
|
-
if (!['get', 'post'].include(this.method)) {
|
1195
|
+
if (this.options.emulateUncommonMethods && !['get', 'post'].include(this.method)) {
|
1212
1196
|
// simulate other verbs over post
|
1213
1197
|
params['_method'] = this.method;
|
1214
1198
|
this.method = 'post';
|
@@ -1230,14 +1214,14 @@ Ajax.Request = Class.create(Ajax.Base, {
|
|
1230
1214
|
Ajax.Responders.dispatch('onCreate', this, response);
|
1231
1215
|
|
1232
1216
|
this.transport.open(this.method.toUpperCase(), this.url,
|
1233
|
-
this.options.asynchronous);
|
1217
|
+
this.options.asynchronous);
|
1234
1218
|
|
1235
1219
|
if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
|
1236
1220
|
|
1237
1221
|
this.transport.onreadystatechange = this.onStateChange.bind(this);
|
1238
1222
|
this.setRequestHeaders();
|
1239
1223
|
|
1240
|
-
this.body = this.method
|
1224
|
+
this.body = this.method != 'get' ? (this.options.postBody || params) : null;
|
1241
1225
|
this.transport.send(this.body);
|
1242
1226
|
|
1243
1227
|
/* Force Firefox to handle ready state 4 for synchronous requests */
|
@@ -1317,7 +1301,7 @@ Ajax.Request = Class.create(Ajax.Base, {
|
|
1317
1301
|
|
1318
1302
|
var contentType = response.getHeader('Content-type');
|
1319
1303
|
if (this.options.evalJS == 'force'
|
1320
|
-
|| (this.options.evalJS && contentType
|
1304
|
+
|| (this.options.evalJS && this.isSameOrigin() && contentType
|
1321
1305
|
&& contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
|
1322
1306
|
this.evalResponse();
|
1323
1307
|
}
|
@@ -1335,9 +1319,18 @@ Ajax.Request = Class.create(Ajax.Base, {
|
|
1335
1319
|
}
|
1336
1320
|
},
|
1337
1321
|
|
1322
|
+
isSameOrigin: function() {
|
1323
|
+
var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
|
1324
|
+
return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
|
1325
|
+
protocol: location.protocol,
|
1326
|
+
domain: document.domain,
|
1327
|
+
port: location.port ? ':' + location.port : ''
|
1328
|
+
}));
|
1329
|
+
},
|
1330
|
+
|
1338
1331
|
getHeader: function(name) {
|
1339
1332
|
try {
|
1340
|
-
return this.transport.getResponseHeader(name);
|
1333
|
+
return this.transport.getResponseHeader(name) || null;
|
1341
1334
|
} catch (e) { return null; }
|
1342
1335
|
},
|
1343
1336
|
|
@@ -1373,7 +1366,7 @@ Ajax.Response = Class.create({
|
|
1373
1366
|
|
1374
1367
|
if(readyState == 4) {
|
1375
1368
|
var xml = transport.responseXML;
|
1376
|
-
this.responseXML = xml
|
1369
|
+
this.responseXML = Object.isUndefined(xml) ? null : xml;
|
1377
1370
|
this.responseJSON = this._getResponseJSON();
|
1378
1371
|
}
|
1379
1372
|
},
|
@@ -1410,7 +1403,8 @@ Ajax.Response = Class.create({
|
|
1410
1403
|
if (!json) return null;
|
1411
1404
|
json = decodeURIComponent(escape(json));
|
1412
1405
|
try {
|
1413
|
-
return json.evalJSON(this.request.options.sanitizeJSON
|
1406
|
+
return json.evalJSON(this.request.options.sanitizeJSON ||
|
1407
|
+
!this.request.isSameOrigin());
|
1414
1408
|
} catch (e) {
|
1415
1409
|
this.request.dispatchException(e);
|
1416
1410
|
}
|
@@ -1419,10 +1413,12 @@ Ajax.Response = Class.create({
|
|
1419
1413
|
_getResponseJSON: function() {
|
1420
1414
|
var options = this.request.options;
|
1421
1415
|
if (!options.evalJSON || (options.evalJSON != 'force' &&
|
1422
|
-
!(this.getHeader('Content-type') || '').include('application/json'))
|
1423
|
-
|
1416
|
+
!(this.getHeader('Content-type') || '').include('application/json')) ||
|
1417
|
+
this.responseText.blank())
|
1418
|
+
return null;
|
1424
1419
|
try {
|
1425
|
-
return this.
|
1420
|
+
return this.responseText.evalJSON(options.sanitizeJSON ||
|
1421
|
+
!this.request.isSameOrigin());
|
1426
1422
|
} catch (e) {
|
1427
1423
|
this.request.dispatchException(e);
|
1428
1424
|
}
|
@@ -1436,11 +1432,11 @@ Ajax.Updater = Class.create(Ajax.Request, {
|
|
1436
1432
|
failure: (container.failure || (container.success ? null : container))
|
1437
1433
|
};
|
1438
1434
|
|
1439
|
-
options = options
|
1435
|
+
options = Object.clone(options);
|
1440
1436
|
var onComplete = options.onComplete;
|
1441
|
-
options.onComplete = (function(response,
|
1437
|
+
options.onComplete = (function(response, json) {
|
1442
1438
|
this.updateContent(response.responseText);
|
1443
|
-
if (Object.isFunction(onComplete)) onComplete(response,
|
1439
|
+
if (Object.isFunction(onComplete)) onComplete(response, json);
|
1444
1440
|
}).bind(this);
|
1445
1441
|
|
1446
1442
|
$super(url, options);
|
@@ -1462,10 +1458,6 @@ Ajax.Updater = Class.create(Ajax.Request, {
|
|
1462
1458
|
}
|
1463
1459
|
else receiver.update(responseText);
|
1464
1460
|
}
|
1465
|
-
|
1466
|
-
if (this.success()) {
|
1467
|
-
if (this.onComplete) this.onComplete.bind(this).defer();
|
1468
|
-
}
|
1469
1461
|
}
|
1470
1462
|
});
|
1471
1463
|
|
@@ -1630,24 +1622,28 @@ Element.Methods = {
|
|
1630
1622
|
Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
|
1631
1623
|
insertions = {bottom:insertions};
|
1632
1624
|
|
1633
|
-
var content,
|
1625
|
+
var content, insert, tagName, childNodes;
|
1634
1626
|
|
1635
|
-
for (position in insertions) {
|
1627
|
+
for (var position in insertions) {
|
1636
1628
|
content = insertions[position];
|
1637
1629
|
position = position.toLowerCase();
|
1638
|
-
|
1630
|
+
insert = Element._insertionTranslations[position];
|
1639
1631
|
|
1640
1632
|
if (content && content.toElement) content = content.toElement();
|
1641
1633
|
if (Object.isElement(content)) {
|
1642
|
-
|
1634
|
+
insert(element, content);
|
1643
1635
|
continue;
|
1644
1636
|
}
|
1645
1637
|
|
1646
1638
|
content = Object.toHTML(content);
|
1647
1639
|
|
1648
|
-
|
1649
|
-
|
1650
|
-
|
1640
|
+
tagName = ((position == 'before' || position == 'after')
|
1641
|
+
? element.parentNode : element).tagName.toUpperCase();
|
1642
|
+
|
1643
|
+
childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
|
1644
|
+
|
1645
|
+
if (position == 'top' || position == 'after') childNodes.reverse();
|
1646
|
+
childNodes.each(insert.curry(element));
|
1651
1647
|
|
1652
1648
|
content.evalScripts.bind(content).defer();
|
1653
1649
|
}
|
@@ -1692,7 +1688,7 @@ Element.Methods = {
|
|
1692
1688
|
},
|
1693
1689
|
|
1694
1690
|
descendants: function(element) {
|
1695
|
-
return $
|
1691
|
+
return $(element).select("*");
|
1696
1692
|
},
|
1697
1693
|
|
1698
1694
|
firstDescendant: function(element) {
|
@@ -1731,32 +1727,31 @@ Element.Methods = {
|
|
1731
1727
|
element = $(element);
|
1732
1728
|
if (arguments.length == 1) return $(element.parentNode);
|
1733
1729
|
var ancestors = element.ancestors();
|
1734
|
-
return expression ?
|
1735
|
-
ancestors
|
1730
|
+
return Object.isNumber(expression) ? ancestors[expression] :
|
1731
|
+
Selector.findElement(ancestors, expression, index);
|
1736
1732
|
},
|
1737
1733
|
|
1738
1734
|
down: function(element, expression, index) {
|
1739
1735
|
element = $(element);
|
1740
1736
|
if (arguments.length == 1) return element.firstDescendant();
|
1741
|
-
|
1742
|
-
|
1743
|
-
descendants[index || 0];
|
1737
|
+
return Object.isNumber(expression) ? element.descendants()[expression] :
|
1738
|
+
element.select(expression)[index || 0];
|
1744
1739
|
},
|
1745
1740
|
|
1746
1741
|
previous: function(element, expression, index) {
|
1747
1742
|
element = $(element);
|
1748
1743
|
if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
|
1749
1744
|
var previousSiblings = element.previousSiblings();
|
1750
|
-
return expression ?
|
1751
|
-
previousSiblings
|
1745
|
+
return Object.isNumber(expression) ? previousSiblings[expression] :
|
1746
|
+
Selector.findElement(previousSiblings, expression, index);
|
1752
1747
|
},
|
1753
1748
|
|
1754
1749
|
next: function(element, expression, index) {
|
1755
1750
|
element = $(element);
|
1756
1751
|
if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
|
1757
1752
|
var nextSiblings = element.nextSiblings();
|
1758
|
-
return expression ?
|
1759
|
-
nextSiblings
|
1753
|
+
return Object.isNumber(expression) ? nextSiblings[expression] :
|
1754
|
+
Selector.findElement(nextSiblings, expression, index);
|
1760
1755
|
},
|
1761
1756
|
|
1762
1757
|
select: function() {
|
@@ -1797,10 +1792,11 @@ Element.Methods = {
|
|
1797
1792
|
var attributes = { }, t = Element._attributeTranslations.write;
|
1798
1793
|
|
1799
1794
|
if (typeof name == 'object') attributes = name;
|
1800
|
-
else attributes[name] = value
|
1795
|
+
else attributes[name] = Object.isUndefined(value) ? true : value;
|
1801
1796
|
|
1802
1797
|
for (var attr in attributes) {
|
1803
|
-
|
1798
|
+
name = t.names[attr] || attr;
|
1799
|
+
value = attributes[attr];
|
1804
1800
|
if (t.values[attr]) name = t.values[attr](element, value);
|
1805
1801
|
if (value === false || value === null)
|
1806
1802
|
element.removeAttribute(name);
|
@@ -1869,6 +1865,7 @@ Element.Methods = {
|
|
1869
1865
|
|
1870
1866
|
descendantOf: function(element, ancestor) {
|
1871
1867
|
element = $(element); ancestor = $(ancestor);
|
1868
|
+
var originalAncestor = ancestor;
|
1872
1869
|
|
1873
1870
|
if (element.compareDocumentPosition)
|
1874
1871
|
return (element.compareDocumentPosition(ancestor) & 8) === 8;
|
@@ -1880,11 +1877,12 @@ Element.Methods = {
|
|
1880
1877
|
do { ancestor = ancestor.parentNode; }
|
1881
1878
|
while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
|
1882
1879
|
}
|
1883
|
-
if (nextAncestor
|
1880
|
+
if (nextAncestor && nextAncestor.sourceIndex)
|
1881
|
+
return (e > a && e < nextAncestor.sourceIndex);
|
1884
1882
|
}
|
1885
1883
|
|
1886
1884
|
while (element = element.parentNode)
|
1887
|
-
if (element ==
|
1885
|
+
if (element == originalAncestor) return true;
|
1888
1886
|
return false;
|
1889
1887
|
},
|
1890
1888
|
|
@@ -1923,7 +1921,7 @@ Element.Methods = {
|
|
1923
1921
|
if (property == 'opacity') element.setOpacity(styles[property]);
|
1924
1922
|
else
|
1925
1923
|
elementStyle[(property == 'float' || property == 'cssFloat') ?
|
1926
|
-
(elementStyle.styleFloat
|
1924
|
+
(Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
|
1927
1925
|
property] = styles[property];
|
1928
1926
|
|
1929
1927
|
return element;
|
@@ -2024,7 +2022,7 @@ Element.Methods = {
|
|
2024
2022
|
if (element) {
|
2025
2023
|
if (element.tagName == 'BODY') break;
|
2026
2024
|
var p = Element.getStyle(element, 'position');
|
2027
|
-
if (p
|
2025
|
+
if (p !== 'static') break;
|
2028
2026
|
}
|
2029
2027
|
} while (element);
|
2030
2028
|
return Element._returnOffset(valueL, valueT);
|
@@ -2173,72 +2171,75 @@ Element._attributeTranslations = {
|
|
2173
2171
|
}
|
2174
2172
|
};
|
2175
2173
|
|
2176
|
-
|
2177
|
-
|
2178
|
-
|
2179
|
-
|
2180
|
-
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
|
2185
|
-
|
2186
|
-
|
2187
|
-
|
2188
|
-
|
2189
|
-
|
2190
|
-
|
2191
|
-
|
2192
|
-
|
2193
|
-
|
2194
|
-
|
2195
|
-
|
2196
|
-
|
2197
|
-
|
2198
|
-
|
2199
|
-
|
2200
|
-
|
2201
|
-
|
2202
|
-
|
2203
|
-
|
2204
|
-
|
2205
|
-
|
2174
|
+
if (Prototype.Browser.Opera) {
|
2175
|
+
Element.Methods.getStyle = Element.Methods.getStyle.wrap(
|
2176
|
+
function(proceed, element, style) {
|
2177
|
+
switch (style) {
|
2178
|
+
case 'left': case 'top': case 'right': case 'bottom':
|
2179
|
+
if (proceed(element, 'position') === 'static') return null;
|
2180
|
+
case 'height': case 'width':
|
2181
|
+
// returns '0px' for hidden elements; we want it to return null
|
2182
|
+
if (!Element.visible(element)) return null;
|
2183
|
+
|
2184
|
+
// returns the border-box dimensions rather than the content-box
|
2185
|
+
// dimensions, so we subtract padding and borders from the value
|
2186
|
+
var dim = parseInt(proceed(element, style), 10);
|
2187
|
+
|
2188
|
+
if (dim !== element['offset' + style.capitalize()])
|
2189
|
+
return dim + 'px';
|
2190
|
+
|
2191
|
+
var properties;
|
2192
|
+
if (style === 'height') {
|
2193
|
+
properties = ['border-top-width', 'padding-top',
|
2194
|
+
'padding-bottom', 'border-bottom-width'];
|
2195
|
+
}
|
2196
|
+
else {
|
2197
|
+
properties = ['border-left-width', 'padding-left',
|
2198
|
+
'padding-right', 'border-right-width'];
|
2199
|
+
}
|
2200
|
+
return properties.inject(dim, function(memo, property) {
|
2201
|
+
var val = proceed(element, property);
|
2202
|
+
return val === null ? memo : memo - parseInt(val, 10);
|
2203
|
+
}) + 'px';
|
2204
|
+
default: return proceed(element, style);
|
2206
2205
|
}
|
2207
|
-
else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
|
2208
|
-
|
2209
|
-
content.evalScripts.bind(content).defer();
|
2210
2206
|
}
|
2207
|
+
);
|
2211
2208
|
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
if (Prototype.Browser.Opera) {
|
2217
|
-
Element.Methods._getStyle = Element.Methods.getStyle;
|
2218
|
-
Element.Methods.getStyle = function(element, style) {
|
2219
|
-
switch(style) {
|
2220
|
-
case 'left':
|
2221
|
-
case 'top':
|
2222
|
-
case 'right':
|
2223
|
-
case 'bottom':
|
2224
|
-
if (Element._getStyle(element, 'position') == 'static') return null;
|
2225
|
-
default: return Element._getStyle(element, style);
|
2209
|
+
Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
|
2210
|
+
function(proceed, element, attribute) {
|
2211
|
+
if (attribute === 'title') return element.title;
|
2212
|
+
return proceed(element, attribute);
|
2226
2213
|
}
|
2227
|
-
|
2228
|
-
Element.Methods._readAttribute = Element.Methods.readAttribute;
|
2229
|
-
Element.Methods.readAttribute = function(element, attribute) {
|
2230
|
-
if (attribute == 'title') return element.title;
|
2231
|
-
return Element._readAttribute(element, attribute);
|
2232
|
-
};
|
2214
|
+
);
|
2233
2215
|
}
|
2234
2216
|
|
2235
2217
|
else if (Prototype.Browser.IE) {
|
2236
|
-
|
2218
|
+
// IE doesn't report offsets correctly for static elements, so we change them
|
2219
|
+
// to "relative" to get the values, then change them back.
|
2220
|
+
Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
|
2221
|
+
function(proceed, element) {
|
2222
|
+
element = $(element);
|
2223
|
+
var position = element.getStyle('position');
|
2224
|
+
if (position !== 'static') return proceed(element);
|
2225
|
+
element.setStyle({ position: 'relative' });
|
2226
|
+
var value = proceed(element);
|
2227
|
+
element.setStyle({ position: position });
|
2228
|
+
return value;
|
2229
|
+
}
|
2230
|
+
);
|
2231
|
+
|
2232
|
+
$w('positionedOffset viewportOffset').each(function(method) {
|
2237
2233
|
Element.Methods[method] = Element.Methods[method].wrap(
|
2238
2234
|
function(proceed, element) {
|
2239
2235
|
element = $(element);
|
2240
2236
|
var position = element.getStyle('position');
|
2241
|
-
if (position
|
2237
|
+
if (position !== 'static') return proceed(element);
|
2238
|
+
// Trigger hasLayout on the offset parent so that IE6 reports
|
2239
|
+
// accurate offsetTop and offsetLeft values for position: fixed.
|
2240
|
+
var offsetParent = element.getOffsetParent();
|
2241
|
+
if (offsetParent && offsetParent.getStyle('position') === 'fixed')
|
2242
|
+
offsetParent.setStyle({ zoom: 1 });
|
2242
2243
|
element.setStyle({ position: 'relative' });
|
2243
2244
|
var value = proceed(element);
|
2244
2245
|
element.setStyle({ position: position });
|
@@ -2303,7 +2304,7 @@ else if (Prototype.Browser.IE) {
|
|
2303
2304
|
return node ? node.value : "";
|
2304
2305
|
},
|
2305
2306
|
_getEv: function(element, attribute) {
|
2306
|
-
|
2307
|
+
attribute = element.getAttribute(attribute);
|
2307
2308
|
return attribute ? attribute.toString().slice(23, -2) : null;
|
2308
2309
|
},
|
2309
2310
|
_flag: function(element, attribute) {
|
@@ -2320,7 +2321,10 @@ else if (Prototype.Browser.IE) {
|
|
2320
2321
|
};
|
2321
2322
|
|
2322
2323
|
Element._attributeTranslations.write = {
|
2323
|
-
names: Object.
|
2324
|
+
names: Object.extend({
|
2325
|
+
cellpadding: 'cellPadding',
|
2326
|
+
cellspacing: 'cellSpacing'
|
2327
|
+
}, Element._attributeTranslations.read.names),
|
2324
2328
|
values: {
|
2325
2329
|
checked: function(element, value) {
|
2326
2330
|
element.checked = !!value;
|
@@ -2400,7 +2404,7 @@ else if (Prototype.Browser.WebKit) {
|
|
2400
2404
|
};
|
2401
2405
|
|
2402
2406
|
// Safari returns margins on body which is incorrect if the child is absolutely
|
2403
|
-
// positioned. For performance reasons, redefine
|
2407
|
+
// positioned. For performance reasons, redefine Element#cumulativeOffset for
|
2404
2408
|
// KHTML/WebKit only.
|
2405
2409
|
Element.Methods.cumulativeOffset = function(element) {
|
2406
2410
|
var valueT = 0, valueL = 0;
|
@@ -2440,7 +2444,7 @@ if (Prototype.Browser.IE || Prototype.Browser.Opera) {
|
|
2440
2444
|
};
|
2441
2445
|
}
|
2442
2446
|
|
2443
|
-
if (document.createElement('div')
|
2447
|
+
if ('outerHTML' in document.createElement('div')) {
|
2444
2448
|
Element.Methods.replace = function(element, content) {
|
2445
2449
|
element = $(element);
|
2446
2450
|
|
@@ -2478,45 +2482,25 @@ Element._returnOffset = function(l, t) {
|
|
2478
2482
|
|
2479
2483
|
Element._getContentFromAnonymousElement = function(tagName, html) {
|
2480
2484
|
var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
|
2481
|
-
|
2482
|
-
|
2485
|
+
if (t) {
|
2486
|
+
div.innerHTML = t[0] + html + t[1];
|
2487
|
+
t[2].times(function() { div = div.firstChild; });
|
2488
|
+
} else div.innerHTML = html;
|
2483
2489
|
return $A(div.childNodes);
|
2484
2490
|
};
|
2485
2491
|
|
2486
2492
|
Element._insertionTranslations = {
|
2487
|
-
before: {
|
2488
|
-
|
2489
|
-
insert: function(element, node) {
|
2490
|
-
element.parentNode.insertBefore(node, element);
|
2491
|
-
},
|
2492
|
-
initializeRange: function(element, range) {
|
2493
|
-
range.setStartBefore(element);
|
2494
|
-
}
|
2493
|
+
before: function(element, node) {
|
2494
|
+
element.parentNode.insertBefore(node, element);
|
2495
2495
|
},
|
2496
|
-
top: {
|
2497
|
-
|
2498
|
-
insert: function(element, node) {
|
2499
|
-
element.insertBefore(node, element.firstChild);
|
2500
|
-
},
|
2501
|
-
initializeRange: function(element, range) {
|
2502
|
-
range.selectNodeContents(element);
|
2503
|
-
range.collapse(true);
|
2504
|
-
}
|
2496
|
+
top: function(element, node) {
|
2497
|
+
element.insertBefore(node, element.firstChild);
|
2505
2498
|
},
|
2506
|
-
bottom: {
|
2507
|
-
|
2508
|
-
insert: function(element, node) {
|
2509
|
-
element.appendChild(node);
|
2510
|
-
}
|
2499
|
+
bottom: function(element, node) {
|
2500
|
+
element.appendChild(node);
|
2511
2501
|
},
|
2512
|
-
after: {
|
2513
|
-
|
2514
|
-
insert: function(element, node) {
|
2515
|
-
element.parentNode.insertBefore(node, element.nextSibling);
|
2516
|
-
},
|
2517
|
-
initializeRange: function(element, range) {
|
2518
|
-
range.setStartAfter(element);
|
2519
|
-
}
|
2502
|
+
after: function(element, node) {
|
2503
|
+
element.parentNode.insertBefore(node, element.nextSibling);
|
2520
2504
|
},
|
2521
2505
|
tags: {
|
2522
2506
|
TABLE: ['<table>', '</table>', 1],
|
@@ -2528,7 +2512,6 @@ Element._insertionTranslations = {
|
|
2528
2512
|
};
|
2529
2513
|
|
2530
2514
|
(function() {
|
2531
|
-
this.bottom.initializeRange = this.top.initializeRange;
|
2532
2515
|
Object.extend(this.tags, {
|
2533
2516
|
THEAD: this.tags.TBODY,
|
2534
2517
|
TFOOT: this.tags.TBODY,
|
@@ -2689,10 +2672,11 @@ Element.addMethods = function(methods) {
|
|
2689
2672
|
document.viewport = {
|
2690
2673
|
getDimensions: function() {
|
2691
2674
|
var dimensions = { };
|
2675
|
+
var B = Prototype.Browser;
|
2692
2676
|
$w('width height').each(function(d) {
|
2693
2677
|
var D = d.capitalize();
|
2694
|
-
dimensions[d] = self['inner' + D]
|
2695
|
-
|
2678
|
+
dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
|
2679
|
+
(B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];
|
2696
2680
|
});
|
2697
2681
|
return dimensions;
|
2698
2682
|
},
|
@@ -2721,9 +2705,26 @@ var Selector = Class.create({
|
|
2721
2705
|
this.compileMatcher();
|
2722
2706
|
},
|
2723
2707
|
|
2708
|
+
shouldUseXPath: function() {
|
2709
|
+
if (!Prototype.BrowserFeatures.XPath) return false;
|
2710
|
+
|
2711
|
+
var e = this.expression;
|
2712
|
+
|
2713
|
+
// Safari 3 chokes on :*-of-type and :empty
|
2714
|
+
if (Prototype.Browser.WebKit &&
|
2715
|
+
(e.include("-of-type") || e.include(":empty")))
|
2716
|
+
return false;
|
2717
|
+
|
2718
|
+
// XPath can't do namespaced attributes, nor can it read
|
2719
|
+
// the "checked" property from DOM nodes
|
2720
|
+
if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
|
2721
|
+
return false;
|
2722
|
+
|
2723
|
+
return true;
|
2724
|
+
},
|
2725
|
+
|
2724
2726
|
compileMatcher: function() {
|
2725
|
-
|
2726
|
-
if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
|
2727
|
+
if (this.shouldUseXPath())
|
2727
2728
|
return this.compileXPathMatcher();
|
2728
2729
|
|
2729
2730
|
var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
|
@@ -2846,8 +2847,12 @@ Object.extend(Selector, {
|
|
2846
2847
|
},
|
2847
2848
|
className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
|
2848
2849
|
id: "[@id='#{1}']",
|
2849
|
-
attrPresence:
|
2850
|
+
attrPresence: function(m) {
|
2851
|
+
m[1] = m[1].toLowerCase();
|
2852
|
+
return new Template("[@#{1}]").evaluate(m);
|
2853
|
+
},
|
2850
2854
|
attr: function(m) {
|
2855
|
+
m[1] = m[1].toLowerCase();
|
2851
2856
|
m[3] = m[5] || m[6];
|
2852
2857
|
return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
|
2853
2858
|
},
|
@@ -2876,7 +2881,7 @@ Object.extend(Selector, {
|
|
2876
2881
|
'enabled': "[not(@disabled)]",
|
2877
2882
|
'not': function(m) {
|
2878
2883
|
var e = m[6], p = Selector.patterns,
|
2879
|
-
x = Selector.xpath, le,
|
2884
|
+
x = Selector.xpath, le, v;
|
2880
2885
|
|
2881
2886
|
var exclusion = [];
|
2882
2887
|
while (e && le != e && (/\S/).test(e)) {
|
@@ -2933,13 +2938,13 @@ Object.extend(Selector, {
|
|
2933
2938
|
},
|
2934
2939
|
|
2935
2940
|
criteria: {
|
2936
|
-
tagName: 'n = h.tagName(n, r, "#{1}", c);
|
2937
|
-
className: 'n = h.className(n, r, "#{1}", c);
|
2938
|
-
id: 'n = h.id(n, r, "#{1}", c);
|
2939
|
-
attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
|
2941
|
+
tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
|
2942
|
+
className: 'n = h.className(n, r, "#{1}", c); c = false;',
|
2943
|
+
id: 'n = h.id(n, r, "#{1}", c); c = false;',
|
2944
|
+
attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
|
2940
2945
|
attr: function(m) {
|
2941
2946
|
m[3] = (m[5] || m[6]);
|
2942
|
-
return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
|
2947
|
+
return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
|
2943
2948
|
},
|
2944
2949
|
pseudo: function(m) {
|
2945
2950
|
if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
|
@@ -2963,7 +2968,8 @@ Object.extend(Selector, {
|
|
2963
2968
|
tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
|
2964
2969
|
id: /^#([\w\-\*]+)(\b|$)/,
|
2965
2970
|
className: /^\.([\w\-\*]+)(\b|$)/,
|
2966
|
-
pseudo:
|
2971
|
+
pseudo:
|
2972
|
+
/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
|
2967
2973
|
attrPresence: /^\[([\w]+)\]/,
|
2968
2974
|
attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
|
2969
2975
|
},
|
@@ -2988,7 +2994,7 @@ Object.extend(Selector, {
|
|
2988
2994
|
|
2989
2995
|
attr: function(element, matches) {
|
2990
2996
|
var nodeValue = Element.readAttribute(element, matches[1]);
|
2991
|
-
return Selector.operators[matches[2]](nodeValue, matches[
|
2997
|
+
return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
|
2992
2998
|
}
|
2993
2999
|
},
|
2994
3000
|
|
@@ -3003,14 +3009,15 @@ Object.extend(Selector, {
|
|
3003
3009
|
|
3004
3010
|
// marks an array of nodes for counting
|
3005
3011
|
mark: function(nodes) {
|
3012
|
+
var _true = Prototype.emptyFunction;
|
3006
3013
|
for (var i = 0, node; node = nodes[i]; i++)
|
3007
|
-
node.
|
3014
|
+
node._countedByPrototype = _true;
|
3008
3015
|
return nodes;
|
3009
3016
|
},
|
3010
3017
|
|
3011
3018
|
unmark: function(nodes) {
|
3012
3019
|
for (var i = 0, node; node = nodes[i]; i++)
|
3013
|
-
node.
|
3020
|
+
node._countedByPrototype = undefined;
|
3014
3021
|
return nodes;
|
3015
3022
|
},
|
3016
3023
|
|
@@ -3018,15 +3025,15 @@ Object.extend(Selector, {
|
|
3018
3025
|
// "ofType" flag indicates whether we're indexing for nth-of-type
|
3019
3026
|
// rather than nth-child
|
3020
3027
|
index: function(parentNode, reverse, ofType) {
|
3021
|
-
parentNode.
|
3028
|
+
parentNode._countedByPrototype = Prototype.emptyFunction;
|
3022
3029
|
if (reverse) {
|
3023
3030
|
for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
|
3024
3031
|
var node = nodes[i];
|
3025
|
-
if (node.nodeType == 1 && (!ofType || node.
|
3032
|
+
if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
|
3026
3033
|
}
|
3027
3034
|
} else {
|
3028
3035
|
for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
|
3029
|
-
if (node.nodeType == 1 && (!ofType || node.
|
3036
|
+
if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
|
3030
3037
|
}
|
3031
3038
|
},
|
3032
3039
|
|
@@ -3035,8 +3042,8 @@ Object.extend(Selector, {
|
|
3035
3042
|
if (nodes.length == 0) return nodes;
|
3036
3043
|
var results = [], n;
|
3037
3044
|
for (var i = 0, l = nodes.length; i < l; i++)
|
3038
|
-
if (!(n = nodes[i]).
|
3039
|
-
n.
|
3045
|
+
if (!(n = nodes[i])._countedByPrototype) {
|
3046
|
+
n._countedByPrototype = Prototype.emptyFunction;
|
3040
3047
|
results.push(Element.extend(n));
|
3041
3048
|
}
|
3042
3049
|
return Selector.handlers.unmark(results);
|
@@ -3053,7 +3060,7 @@ Object.extend(Selector, {
|
|
3053
3060
|
child: function(nodes) {
|
3054
3061
|
var h = Selector.handlers;
|
3055
3062
|
for (var i = 0, results = [], node; node = nodes[i]; i++) {
|
3056
|
-
for (var j = 0,
|
3063
|
+
for (var j = 0, child; child = node.childNodes[j]; j++)
|
3057
3064
|
if (child.nodeType == 1 && child.tagName != '!') results.push(child);
|
3058
3065
|
}
|
3059
3066
|
return results;
|
@@ -3088,7 +3095,7 @@ Object.extend(Selector, {
|
|
3088
3095
|
|
3089
3096
|
// TOKEN FUNCTIONS
|
3090
3097
|
tagName: function(nodes, root, tagName, combinator) {
|
3091
|
-
|
3098
|
+
var uTagName = tagName.toUpperCase();
|
3092
3099
|
var results = [], h = Selector.handlers;
|
3093
3100
|
if (nodes) {
|
3094
3101
|
if (combinator) {
|
@@ -3101,7 +3108,7 @@ Object.extend(Selector, {
|
|
3101
3108
|
if (tagName == "*") return nodes;
|
3102
3109
|
}
|
3103
3110
|
for (var i = 0, node; node = nodes[i]; i++)
|
3104
|
-
if (node.tagName.toUpperCase()
|
3111
|
+
if (node.tagName.toUpperCase() === uTagName) results.push(node);
|
3105
3112
|
return results;
|
3106
3113
|
} else return root.getElementsByTagName(tagName);
|
3107
3114
|
},
|
@@ -3148,16 +3155,18 @@ Object.extend(Selector, {
|
|
3148
3155
|
return results;
|
3149
3156
|
},
|
3150
3157
|
|
3151
|
-
attrPresence: function(nodes, root, attr) {
|
3158
|
+
attrPresence: function(nodes, root, attr, combinator) {
|
3152
3159
|
if (!nodes) nodes = root.getElementsByTagName("*");
|
3160
|
+
if (nodes && combinator) nodes = this[combinator](nodes);
|
3153
3161
|
var results = [];
|
3154
3162
|
for (var i = 0, node; node = nodes[i]; i++)
|
3155
3163
|
if (Element.hasAttribute(node, attr)) results.push(node);
|
3156
3164
|
return results;
|
3157
3165
|
},
|
3158
3166
|
|
3159
|
-
attr: function(nodes, root, attr, value, operator) {
|
3167
|
+
attr: function(nodes, root, attr, value, operator, combinator) {
|
3160
3168
|
if (!nodes) nodes = root.getElementsByTagName("*");
|
3169
|
+
if (nodes && combinator) nodes = this[combinator](nodes);
|
3161
3170
|
var handler = Selector.operators[operator], results = [];
|
3162
3171
|
for (var i = 0, node; node = nodes[i]; i++) {
|
3163
3172
|
var nodeValue = Element.readAttribute(node, attr);
|
@@ -3236,7 +3245,7 @@ Object.extend(Selector, {
|
|
3236
3245
|
var h = Selector.handlers, results = [], indexed = [], m;
|
3237
3246
|
h.mark(nodes);
|
3238
3247
|
for (var i = 0, node; node = nodes[i]; i++) {
|
3239
|
-
if (!node.parentNode.
|
3248
|
+
if (!node.parentNode._countedByPrototype) {
|
3240
3249
|
h.index(node.parentNode, reverse, ofType);
|
3241
3250
|
indexed.push(node.parentNode);
|
3242
3251
|
}
|
@@ -3274,7 +3283,7 @@ Object.extend(Selector, {
|
|
3274
3283
|
var exclusions = new Selector(selector).findElements(root);
|
3275
3284
|
h.mark(exclusions);
|
3276
3285
|
for (var i = 0, results = [], node; node = nodes[i]; i++)
|
3277
|
-
if (!node.
|
3286
|
+
if (!node._countedByPrototype) results.push(node);
|
3278
3287
|
h.unmark(exclusions);
|
3279
3288
|
return results;
|
3280
3289
|
},
|
@@ -3308,11 +3317,19 @@ Object.extend(Selector, {
|
|
3308
3317
|
'|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
|
3309
3318
|
},
|
3310
3319
|
|
3320
|
+
split: function(expression) {
|
3321
|
+
var expressions = [];
|
3322
|
+
expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
|
3323
|
+
expressions.push(m[1].strip());
|
3324
|
+
});
|
3325
|
+
return expressions;
|
3326
|
+
},
|
3327
|
+
|
3311
3328
|
matchElements: function(elements, expression) {
|
3312
|
-
var matches =
|
3329
|
+
var matches = $$(expression), h = Selector.handlers;
|
3313
3330
|
h.mark(matches);
|
3314
3331
|
for (var i = 0, results = [], element; element = elements[i]; i++)
|
3315
|
-
if (element.
|
3332
|
+
if (element._countedByPrototype) results.push(element);
|
3316
3333
|
h.unmark(matches);
|
3317
3334
|
return results;
|
3318
3335
|
},
|
@@ -3325,10 +3342,7 @@ Object.extend(Selector, {
|
|
3325
3342
|
},
|
3326
3343
|
|
3327
3344
|
findChildElements: function(element, expressions) {
|
3328
|
-
|
3329
|
-
exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
|
3330
|
-
expressions.push(m[1].strip());
|
3331
|
-
});
|
3345
|
+
expressions = Selector.split(expressions.join(','));
|
3332
3346
|
var results = [], h = Selector.handlers;
|
3333
3347
|
for (var i = 0, l = expressions.length, selector; i < l; i++) {
|
3334
3348
|
selector = new Selector(expressions[i].strip());
|
@@ -3338,6 +3352,25 @@ Object.extend(Selector, {
|
|
3338
3352
|
}
|
3339
3353
|
});
|
3340
3354
|
|
3355
|
+
if (Prototype.Browser.IE) {
|
3356
|
+
Object.extend(Selector.handlers, {
|
3357
|
+
// IE returns comment nodes on getElementsByTagName("*").
|
3358
|
+
// Filter them out.
|
3359
|
+
concat: function(a, b) {
|
3360
|
+
for (var i = 0, node; node = b[i]; i++)
|
3361
|
+
if (node.tagName !== "!") a.push(node);
|
3362
|
+
return a;
|
3363
|
+
},
|
3364
|
+
|
3365
|
+
// IE improperly serializes _countedByPrototype in (inner|outer)HTML.
|
3366
|
+
unmark: function(nodes) {
|
3367
|
+
for (var i = 0, node; node = nodes[i]; i++)
|
3368
|
+
node.removeAttribute('_countedByPrototype');
|
3369
|
+
return nodes;
|
3370
|
+
}
|
3371
|
+
});
|
3372
|
+
}
|
3373
|
+
|
3341
3374
|
function $$() {
|
3342
3375
|
return Selector.findChildElements(document, $A(arguments));
|
3343
3376
|
}
|
@@ -3349,7 +3382,7 @@ var Form = {
|
|
3349
3382
|
|
3350
3383
|
serializeElements: function(elements, options) {
|
3351
3384
|
if (typeof options != 'object') options = { hash: !!options };
|
3352
|
-
else if (options.hash
|
3385
|
+
else if (Object.isUndefined(options.hash)) options.hash = true;
|
3353
3386
|
var key, value, submitted = false, submit = options.submit;
|
3354
3387
|
|
3355
3388
|
var data = elements.inject({ }, function(result, element) {
|
@@ -3547,17 +3580,17 @@ Form.Element.Serializers = {
|
|
3547
3580
|
},
|
3548
3581
|
|
3549
3582
|
inputSelector: function(element, value) {
|
3550
|
-
if (value
|
3583
|
+
if (Object.isUndefined(value)) return element.checked ? element.value : null;
|
3551
3584
|
else element.checked = !!value;
|
3552
3585
|
},
|
3553
3586
|
|
3554
3587
|
textarea: function(element, value) {
|
3555
|
-
if (value
|
3588
|
+
if (Object.isUndefined(value)) return element.value;
|
3556
3589
|
else element.value = value;
|
3557
3590
|
},
|
3558
3591
|
|
3559
3592
|
select: function(element, index) {
|
3560
|
-
if (index
|
3593
|
+
if (Object.isUndefined(index))
|
3561
3594
|
return this[element.type == 'select-one' ?
|
3562
3595
|
'selectOne' : 'selectMany'](element);
|
3563
3596
|
else {
|
@@ -3748,7 +3781,9 @@ Event.Methods = (function() {
|
|
3748
3781
|
|
3749
3782
|
findElement: function(event, expression) {
|
3750
3783
|
var element = Event.element(event);
|
3751
|
-
|
3784
|
+
if (!expression) return element;
|
3785
|
+
var elements = [element].concat(element.ancestors());
|
3786
|
+
return Selector.findElement(elements, expression, 0);
|
3752
3787
|
},
|
3753
3788
|
|
3754
3789
|
pointer: function(event) {
|
@@ -3811,9 +3846,9 @@ Object.extend(Event, (function() {
|
|
3811
3846
|
var cache = Event.cache;
|
3812
3847
|
|
3813
3848
|
function getEventID(element) {
|
3814
|
-
if (element.
|
3849
|
+
if (element._prototypeEventID) return element._prototypeEventID[0];
|
3815
3850
|
arguments.callee.id = arguments.callee.id || 1;
|
3816
|
-
return element.
|
3851
|
+
return element._prototypeEventID = [++arguments.callee.id];
|
3817
3852
|
}
|
3818
3853
|
|
3819
3854
|
function getDOMEventName(eventName) {
|
@@ -3923,11 +3958,12 @@ Object.extend(Event, (function() {
|
|
3923
3958
|
if (element == document && document.createEvent && !element.dispatchEvent)
|
3924
3959
|
element = document.documentElement;
|
3925
3960
|
|
3961
|
+
var event;
|
3926
3962
|
if (document.createEvent) {
|
3927
|
-
|
3963
|
+
event = document.createEvent("HTMLEvents");
|
3928
3964
|
event.initEvent("dataavailable", true, true);
|
3929
3965
|
} else {
|
3930
|
-
|
3966
|
+
event = document.createEventObject();
|
3931
3967
|
event.eventType = "ondataavailable";
|
3932
3968
|
}
|
3933
3969
|
|
@@ -3940,7 +3976,7 @@ Object.extend(Event, (function() {
|
|
3940
3976
|
element.fireEvent(event.eventType, event);
|
3941
3977
|
}
|
3942
3978
|
|
3943
|
-
return event;
|
3979
|
+
return Event.extend(event);
|
3944
3980
|
}
|
3945
3981
|
};
|
3946
3982
|
})());
|
@@ -3956,20 +3992,21 @@ Element.addMethods({
|
|
3956
3992
|
Object.extend(document, {
|
3957
3993
|
fire: Element.Methods.fire.methodize(),
|
3958
3994
|
observe: Element.Methods.observe.methodize(),
|
3959
|
-
stopObserving: Element.Methods.stopObserving.methodize()
|
3995
|
+
stopObserving: Element.Methods.stopObserving.methodize(),
|
3996
|
+
loaded: false
|
3960
3997
|
});
|
3961
3998
|
|
3962
3999
|
(function() {
|
3963
4000
|
/* Support for the DOMContentLoaded event is based on work by Dan Webb,
|
3964
4001
|
Matthias Miller, Dean Edwards and John Resig. */
|
3965
4002
|
|
3966
|
-
var timer
|
4003
|
+
var timer;
|
3967
4004
|
|
3968
4005
|
function fireContentLoadedEvent() {
|
3969
|
-
if (
|
4006
|
+
if (document.loaded) return;
|
3970
4007
|
if (timer) window.clearInterval(timer);
|
3971
4008
|
document.fire("dom:loaded");
|
3972
|
-
|
4009
|
+
document.loaded = true;
|
3973
4010
|
}
|
3974
4011
|
|
3975
4012
|
if (document.addEventListener) {
|
@@ -4183,4 +4220,4 @@ Object.extend(Element.ClassNames.prototype, Enumerable);
|
|
4183
4220
|
|
4184
4221
|
/*--------------------------------------------------------------------------*/
|
4185
4222
|
|
4186
|
-
Element.addMethods();
|
4223
|
+
Element.addMethods();
|