backlog 0.35.5 → 0.36.2
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/Gemfile +19 -0
- data/Gemfile~ +4 -0
- data/History.txt +25 -0
- data/Rakefile +3 -3
- data/app/controllers/{application.rb → application_controller.rb} +1 -2
- data/app/controllers/backlogs_controller.rb +0 -16
- data/app/controllers/search_controller.rb +0 -2
- data/app/controllers/user_controller.rb +7 -7
- data/app/controllers/work_locks_controller.rb +2 -2
- data/app/controllers/works_controller.rb +23 -23
- data/app/helpers/application_helper.rb +9 -6
- data/app/helpers/backlogs_helper.rb +1 -1
- data/app/helpers/periods_helper.rb +1 -1
- data/app/models/backlog.rb +13 -10
- data/app/models/period.rb +0 -5
- data/app/models/sidebar.rb +1 -0
- data/app/models/task.rb +4 -10
- data/app/models/user.rb +5 -6
- data/app/models/user_notify.rb +0 -1
- data/app/models/work.rb +20 -25
- data/app/models/works_report_filter.rb +4 -4
- data/app/views/backlogs/_buttons.rhtml +1 -1
- data/app/views/backlogs/_form.rhtml +5 -9
- data/app/views/layouts/_left_top.rhtml +0 -1
- data/app/views/periods/_form.rhtml +1 -1
- data/app/views/search/results.rhtml +1 -12
- data/app/views/task_notify/{invite_en.rhtml → invite.en.html.erb} +0 -0
- data/app/views/task_notify/{invite_no.rhtml → invite.no.html.erb} +0 -0
- data/app/views/tasks/_task.rhtml +49 -50
- data/app/views/tasks/edit.rhtml +4 -4
- data/app/views/tasks/start_work.rjs +1 -1
- data/app/views/user/_edit.rhtml +1 -1
- data/app/views/user/change_password.rhtml +1 -1
- data/app/views/user/edit.rhtml +4 -4
- data/app/views/user/signup.rhtml +2 -2
- data/app/views/user_notify/{change_password_en.rhtml → change_password.en.html.erb} +0 -0
- data/app/views/user_notify/{change_password_no.rhtml → change_password.no.html.erb} +0 -0
- data/app/views/user_notify/{forgot_password_en.rhtml → forgot_password.en.html.erb} +0 -0
- data/app/views/user_notify/{forgot_password_no.rhtml → forgot_password.no.html.erb} +0 -0
- data/app/views/user_notify/{monitoring_en.rhtml → monitoring.en.html.erb} +0 -0
- data/app/views/user_notify/{monitoring_no.rhtml → monitoring.no.html.erb} +0 -0
- data/app/views/user_notify/{monitoring_invitation_en.rhtml → monitoring_invitation.en.html.erb} +0 -0
- data/app/views/user_notify/{monitoring_invitation_no.rhtml → monitoring_invitation.no.html.erb} +0 -0
- data/app/views/user_notify/{signup_en.rhtml → signup.en.html.erb} +0 -0
- data/app/views/user_notify/{signup_no.rhtml → signup.no.html.erb} +0 -0
- data/app/views/work_lock_notify/{lock_en.rhtml → lock.en.html.erb} +0 -0
- data/app/views/work_lock_notify/{lock_no.rhtml → lock.no.html.erb} +0 -0
- data/app/views/work_lock_notify/{nag_en.rhtml → nag.en.html.erb} +0 -0
- data/app/views/work_lock_notify/{nag_no.rhtml → nag.no.html.erb} +0 -0
- data/app/views/works/_form.rhtml +6 -6
- data/app/views/works/_new_row.rhtml +6 -6
- data/app/views/works/_row.rhtml +2 -2
- data/app/views/works/daily_work_sheet.rhtml +1 -1
- data/app/views/works/list.rhtml +6 -6
- data/app/views/works/list_excel.rhtml +8 -4
- data/app/views/works/timeliste.rhtml +14 -14
- data/app/views/works/update_row.rjs +1 -1
- data/app/views/works/weekly_work_sheet.rhtml +5 -5
- data/app/views/works/weekly_work_sheet_details.rhtml +5 -5
- data/config/boot.rb +108 -27
- data/config/database.yml +3 -26
- data/config/environment.rb +4 -12
- data/config/environments/development.rb +0 -1
- data/config/initializers/jdbc.rb +7 -0
- data/config/initializers/mongrel.rb +83 -0
- data/config/locales/en.yml +189 -0
- data/config/locales/no.yml +192 -0
- data/config/preinitializer.rb +20 -0
- data/cruise_build.sh +10 -0
- data/cruise_config.rb +1 -1
- data/db/migrate/20100720124707_merge_work_account_into_backlog.rb +74 -0
- data/db/schema.rb +93 -127
- data/lib/class_table_inheritance.rb +53 -11
- data/lib/tasks/jdbc.rake +8 -0
- data/lib/user_system.rb +5 -1
- data/public/javascripts/controls.js +76 -79
- data/public/javascripts/dragdrop.js +166 -167
- data/public/javascripts/effects.js +174 -168
- data/public/javascripts/prototype.js +470 -334
- data/public/stylesheets/mwrt002.css +6 -6
- data/script/dbconsole +3 -0
- data/test/fixtures/backlogs.yml +2 -2
- data/test/fixtures/work_lock_subscriptions.yml +2 -2
- data/test/fixtures/works.yml +6 -6
- data/test/functional/absences_controller_test.rb +1 -1
- data/test/functional/backlogs_controller_test.rb +4 -4
- data/test/functional/customers_controller_test.rb +1 -1
- data/test/functional/dashboard_controller_test.rb +1 -1
- data/test/functional/estimates_controller_test.rb +1 -1
- data/test/functional/groups_controller_test.rb +1 -1
- data/test/functional/parties_controller_test.rb +1 -1
- data/test/functional/periods_controller_test.rb +1 -1
- data/test/functional/public_holidays_controller_test.rb +1 -1
- data/test/functional/search_controller_test.rb +1 -1
- data/test/functional/task_files_controller_test.rb +1 -1
- data/test/functional/tasks_controller_test.rb +6 -6
- data/test/functional/user_controller_test.rb +3 -2
- data/test/functional/welcome_controller_test.rb +1 -1
- data/test/functional/work_locks_controller_test.rb +1 -1
- data/test/functional/works_controller_test.rb +11 -11
- data/test/test_helper.rb +2 -2
- data/test/unit/absence_test.rb +1 -1
- data/test/unit/configuration_test.rb +1 -1
- data/test/unit/customer_test.rb +1 -1
- data/test/unit/estimate_test.rb +1 -1
- data/test/unit/group_test.rb +1 -1
- data/test/unit/party_test.rb +1 -1
- data/test/unit/period_test.rb +1 -1
- data/test/unit/public_holiday_test.rb +1 -1
- data/test/unit/task_file_test.rb +1 -1
- data/test/unit/task_test.rb +1 -1
- data/test/unit/user_test.rb +1 -1
- data/test/unit/work_lock_subscription_test.rb +1 -1
- data/test/unit/work_lock_test.rb +1 -1
- data/test/unit/work_test.rb +8 -8
- data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +3 -3
- data/vendor/plugins/assert_cookie/lib/assert_cookie.rb +2 -2
- data/vendor/plugins/auto_complete/README +23 -0
- data/vendor/plugins/auto_complete/Rakefile +22 -0
- data/vendor/plugins/auto_complete/init.rb +2 -0
- data/vendor/plugins/auto_complete/lib/auto_complete.rb +47 -0
- data/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb +143 -0
- data/vendor/plugins/auto_complete/test/auto_complete_test.rb +67 -0
- data/vendor/plugins/backlog_jira/init.rb +4 -0
- data/vendor/plugins/backlog_jira/{tasks → lib/tasks}/backlog_jira_tasks.rake +0 -0
- data/vendor/plugins/has_history/{tasks → lib/tasks}/has_history_tasks.rake +0 -0
- metadata +745 -817
- data/#SearchRequest.xml# +0 -3443
- data/app/controllers/application.rb~ +0 -207
- data/app/controllers/work_accounts_controller.rb +0 -58
- data/app/helpers/work_accounts_helper.rb +0 -2
- data/app/models/work_account.rb +0 -18
- data/app/models/work_lock_subscription.rb +0 -3
- data/app/views/work_accounts/_form.rhtml +0 -16
- data/app/views/work_accounts/_name_list.rhtml +0 -5
- data/app/views/work_accounts/_title.rhtml +0 -5
- data/app/views/work_accounts/edit.rhtml +0 -12
- data/app/views/work_accounts/list.rhtml +0 -31
- data/app/views/work_accounts/new.rhtml +0 -10
- data/app/views/work_accounts/show.rhtml +0 -50
- data/config/environments/localization_environment.rb +0 -10
- data/jira.log +0 -98246
- data/lang/en.yaml +0 -147
- data/lang/localizations.yaml +0 -2
- data/lang/no.yaml +0 -146
- data/lib/localization.rb +0 -88
- data/test/fixtures/work_accounts.yml +0 -7
- data/test/functional/work_accounts_controller_test.rb +0 -94
- data/test/unit/localization_test.rb +0 -47
- data/test/unit/work_account_test.rb +0 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/* Prototype JavaScript framework, version 1.6.0
|
|
2
|
-
* (c) 2005-
|
|
1
|
+
/* Prototype JavaScript framework, version 1.6.0.3
|
|
2
|
+
* (c) 2005-2008 Sam Stephenson
|
|
3
3
|
*
|
|
4
4
|
* Prototype is freely distributable under the terms of an MIT-style license.
|
|
5
5
|
* For details, see the Prototype web site: http://www.prototypejs.org/
|
|
@@ -7,23 +7,26 @@
|
|
|
7
7
|
*--------------------------------------------------------------------------*/
|
|
8
8
|
|
|
9
9
|
var Prototype = {
|
|
10
|
-
Version: '1.6.0',
|
|
10
|
+
Version: '1.6.0.3',
|
|
11
11
|
|
|
12
12
|
Browser: {
|
|
13
|
-
IE: !!(window.attachEvent &&
|
|
14
|
-
|
|
13
|
+
IE: !!(window.attachEvent &&
|
|
14
|
+
navigator.userAgent.indexOf('Opera') === -1),
|
|
15
|
+
Opera: navigator.userAgent.indexOf('Opera') > -1,
|
|
15
16
|
WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
|
|
16
|
-
Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
|
|
17
|
+
Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
|
|
18
|
+
navigator.userAgent.indexOf('KHTML') === -1,
|
|
17
19
|
MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
|
|
18
20
|
},
|
|
19
21
|
|
|
20
22
|
BrowserFeatures: {
|
|
21
23
|
XPath: !!document.evaluate,
|
|
24
|
+
SelectorsAPI: !!document.querySelector,
|
|
22
25
|
ElementExtensions: !!window.HTMLElement,
|
|
23
26
|
SpecificElementExtensions:
|
|
24
|
-
document.createElement('div')
|
|
25
|
-
document.createElement('div')
|
|
26
|
-
document.createElement('form')
|
|
27
|
+
document.createElement('div')['__proto__'] &&
|
|
28
|
+
document.createElement('div')['__proto__'] !==
|
|
29
|
+
document.createElement('form')['__proto__']
|
|
27
30
|
},
|
|
28
31
|
|
|
29
32
|
ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
|
|
@@ -36,8 +39,6 @@ var Prototype = {
|
|
|
36
39
|
if (Prototype.Browser.MobileSafari)
|
|
37
40
|
Prototype.BrowserFeatures.SpecificElementExtensions = false;
|
|
38
41
|
|
|
39
|
-
if (Prototype.Browser.WebKit)
|
|
40
|
-
Prototype.BrowserFeatures.XPath = false;
|
|
41
42
|
|
|
42
43
|
/* Based on Alex Arnell's inheritance implementation. */
|
|
43
44
|
var Class = {
|
|
@@ -85,12 +86,13 @@ Class.Methods = {
|
|
|
85
86
|
var property = properties[i], value = source[property];
|
|
86
87
|
if (ancestor && Object.isFunction(value) &&
|
|
87
88
|
value.argumentNames().first() == "$super") {
|
|
88
|
-
var method = value
|
|
89
|
+
var method = value;
|
|
90
|
+
value = (function(m) {
|
|
89
91
|
return function() { return ancestor[m].apply(this, arguments) };
|
|
90
|
-
})(property).wrap(method)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
})(property).wrap(method);
|
|
93
|
+
|
|
94
|
+
value.valueOf = method.valueOf.bind(method);
|
|
95
|
+
value.toString = method.toString.bind(method);
|
|
94
96
|
}
|
|
95
97
|
this.prototype[property] = value;
|
|
96
98
|
}
|
|
@@ -110,9 +112,9 @@ Object.extend = function(destination, source) {
|
|
|
110
112
|
Object.extend(Object, {
|
|
111
113
|
inspect: function(object) {
|
|
112
114
|
try {
|
|
113
|
-
if (object
|
|
115
|
+
if (Object.isUndefined(object)) return 'undefined';
|
|
114
116
|
if (object === null) return 'null';
|
|
115
|
-
return object.inspect ? object.inspect() : object
|
|
117
|
+
return object.inspect ? object.inspect() : String(object);
|
|
116
118
|
} catch (e) {
|
|
117
119
|
if (e instanceof RangeError) return '...';
|
|
118
120
|
throw e;
|
|
@@ -135,7 +137,7 @@ Object.extend(Object, {
|
|
|
135
137
|
var results = [];
|
|
136
138
|
for (var property in object) {
|
|
137
139
|
var value = Object.toJSON(object[property]);
|
|
138
|
-
if (value
|
|
140
|
+
if (!Object.isUndefined(value))
|
|
139
141
|
results.push(property.toJSON() + ': ' + value);
|
|
140
142
|
}
|
|
141
143
|
|
|
@@ -169,11 +171,12 @@ Object.extend(Object, {
|
|
|
169
171
|
},
|
|
170
172
|
|
|
171
173
|
isElement: function(object) {
|
|
172
|
-
return object && object.nodeType == 1;
|
|
174
|
+
return !!(object && object.nodeType == 1);
|
|
173
175
|
},
|
|
174
176
|
|
|
175
177
|
isArray: function(object) {
|
|
176
|
-
return object && object
|
|
178
|
+
return object != null && typeof object == "object" &&
|
|
179
|
+
'splice' in object && 'join' in object;
|
|
177
180
|
},
|
|
178
181
|
|
|
179
182
|
isHash: function(object) {
|
|
@@ -199,12 +202,13 @@ Object.extend(Object, {
|
|
|
199
202
|
|
|
200
203
|
Object.extend(Function.prototype, {
|
|
201
204
|
argumentNames: function() {
|
|
202
|
-
var names = this.toString().match(/^[\s\(]*function[^(]*\((
|
|
205
|
+
var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
|
|
206
|
+
.replace(/\s+/g, '').split(',');
|
|
203
207
|
return names.length == 1 && !names[0] ? [] : names;
|
|
204
208
|
},
|
|
205
209
|
|
|
206
210
|
bind: function() {
|
|
207
|
-
if (arguments.length < 2 && arguments[0]
|
|
211
|
+
if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
|
|
208
212
|
var __method = this, args = $A(arguments), object = args.shift();
|
|
209
213
|
return function() {
|
|
210
214
|
return __method.apply(object, args.concat($A(arguments)));
|
|
@@ -233,6 +237,11 @@ Object.extend(Function.prototype, {
|
|
|
233
237
|
}, timeout);
|
|
234
238
|
},
|
|
235
239
|
|
|
240
|
+
defer: function() {
|
|
241
|
+
var args = [0.01].concat($A(arguments));
|
|
242
|
+
return this.delay.apply(this, args);
|
|
243
|
+
},
|
|
244
|
+
|
|
236
245
|
wrap: function(wrapper) {
|
|
237
246
|
var __method = this;
|
|
238
247
|
return function() {
|
|
@@ -249,8 +258,6 @@ Object.extend(Function.prototype, {
|
|
|
249
258
|
}
|
|
250
259
|
});
|
|
251
260
|
|
|
252
|
-
Function.prototype.defer = Function.prototype.delay.curry(0.01);
|
|
253
|
-
|
|
254
261
|
Date.prototype.toJSON = function() {
|
|
255
262
|
return '"' + this.getUTCFullYear() + '-' +
|
|
256
263
|
(this.getUTCMonth() + 1).toPaddedString(2) + '-' +
|
|
@@ -351,7 +358,7 @@ Object.extend(String.prototype, {
|
|
|
351
358
|
|
|
352
359
|
sub: function(pattern, replacement, count) {
|
|
353
360
|
replacement = this.gsub.prepareReplacement(replacement);
|
|
354
|
-
count = count
|
|
361
|
+
count = Object.isUndefined(count) ? 1 : count;
|
|
355
362
|
|
|
356
363
|
return this.gsub(pattern, function(match) {
|
|
357
364
|
if (--count < 0) return match[0];
|
|
@@ -366,7 +373,7 @@ Object.extend(String.prototype, {
|
|
|
366
373
|
|
|
367
374
|
truncate: function(length, truncation) {
|
|
368
375
|
length = length || 30;
|
|
369
|
-
truncation = truncation
|
|
376
|
+
truncation = Object.isUndefined(truncation) ? '...' : truncation;
|
|
370
377
|
return this.length > length ?
|
|
371
378
|
this.slice(0, length - truncation.length) + truncation : String(this);
|
|
372
379
|
},
|
|
@@ -486,7 +493,9 @@ Object.extend(String.prototype, {
|
|
|
486
493
|
},
|
|
487
494
|
|
|
488
495
|
isJSON: function() {
|
|
489
|
-
var str = this
|
|
496
|
+
var str = this;
|
|
497
|
+
if (str.blank()) return false;
|
|
498
|
+
str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
|
|
490
499
|
return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
|
|
491
500
|
},
|
|
492
501
|
|
|
@@ -529,7 +538,7 @@ if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.proto
|
|
|
529
538
|
return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
|
530
539
|
},
|
|
531
540
|
unescapeHTML: function() {
|
|
532
|
-
return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
|
541
|
+
return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
|
533
542
|
}
|
|
534
543
|
});
|
|
535
544
|
|
|
@@ -546,7 +555,7 @@ Object.extend(String.prototype.escapeHTML, {
|
|
|
546
555
|
text: document.createTextNode('')
|
|
547
556
|
});
|
|
548
557
|
|
|
549
|
-
|
|
558
|
+
String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
|
|
550
559
|
|
|
551
560
|
var Template = Class.create({
|
|
552
561
|
initialize: function(template, pattern) {
|
|
@@ -565,7 +574,8 @@ var Template = Class.create({
|
|
|
565
574
|
if (before == '\\') return match[2];
|
|
566
575
|
|
|
567
576
|
var ctx = object, expr = match[3];
|
|
568
|
-
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)
|
|
577
|
+
var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
|
|
578
|
+
match = pattern.exec(expr);
|
|
569
579
|
if (match == null) return before;
|
|
570
580
|
|
|
571
581
|
while (match != null) {
|
|
@@ -577,7 +587,7 @@ var Template = Class.create({
|
|
|
577
587
|
}
|
|
578
588
|
|
|
579
589
|
return before + String.interpret(ctx);
|
|
580
|
-
}
|
|
590
|
+
});
|
|
581
591
|
}
|
|
582
592
|
});
|
|
583
593
|
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
|
|
@@ -587,10 +597,9 @@ var $break = { };
|
|
|
587
597
|
var Enumerable = {
|
|
588
598
|
each: function(iterator, context) {
|
|
589
599
|
var index = 0;
|
|
590
|
-
iterator = iterator.bind(context);
|
|
591
600
|
try {
|
|
592
601
|
this._each(function(value) {
|
|
593
|
-
iterator(value, index++);
|
|
602
|
+
iterator.call(context, value, index++);
|
|
594
603
|
});
|
|
595
604
|
} catch (e) {
|
|
596
605
|
if (e != $break) throw e;
|
|
@@ -599,47 +608,46 @@ var Enumerable = {
|
|
|
599
608
|
},
|
|
600
609
|
|
|
601
610
|
eachSlice: function(number, iterator, context) {
|
|
602
|
-
iterator = iterator ? iterator.bind(context) : Prototype.K;
|
|
603
611
|
var index = -number, slices = [], array = this.toArray();
|
|
612
|
+
if (number < 1) return array;
|
|
604
613
|
while ((index += number) < array.length)
|
|
605
614
|
slices.push(array.slice(index, index+number));
|
|
606
615
|
return slices.collect(iterator, context);
|
|
607
616
|
},
|
|
608
617
|
|
|
609
618
|
all: function(iterator, context) {
|
|
610
|
-
iterator = iterator
|
|
619
|
+
iterator = iterator || Prototype.K;
|
|
611
620
|
var result = true;
|
|
612
621
|
this.each(function(value, index) {
|
|
613
|
-
result = result && !!iterator(value, index);
|
|
622
|
+
result = result && !!iterator.call(context, value, index);
|
|
614
623
|
if (!result) throw $break;
|
|
615
624
|
});
|
|
616
625
|
return result;
|
|
617
626
|
},
|
|
618
627
|
|
|
619
628
|
any: function(iterator, context) {
|
|
620
|
-
iterator = iterator
|
|
629
|
+
iterator = iterator || Prototype.K;
|
|
621
630
|
var result = false;
|
|
622
631
|
this.each(function(value, index) {
|
|
623
|
-
if (result = !!iterator(value, index))
|
|
632
|
+
if (result = !!iterator.call(context, value, index))
|
|
624
633
|
throw $break;
|
|
625
634
|
});
|
|
626
635
|
return result;
|
|
627
636
|
},
|
|
628
637
|
|
|
629
638
|
collect: function(iterator, context) {
|
|
630
|
-
iterator = iterator
|
|
639
|
+
iterator = iterator || Prototype.K;
|
|
631
640
|
var results = [];
|
|
632
641
|
this.each(function(value, index) {
|
|
633
|
-
results.push(iterator(value, index));
|
|
642
|
+
results.push(iterator.call(context, value, index));
|
|
634
643
|
});
|
|
635
644
|
return results;
|
|
636
645
|
},
|
|
637
646
|
|
|
638
647
|
detect: function(iterator, context) {
|
|
639
|
-
iterator = iterator.bind(context);
|
|
640
648
|
var result;
|
|
641
649
|
this.each(function(value, index) {
|
|
642
|
-
if (iterator(value, index)) {
|
|
650
|
+
if (iterator.call(context, value, index)) {
|
|
643
651
|
result = value;
|
|
644
652
|
throw $break;
|
|
645
653
|
}
|
|
@@ -648,17 +656,16 @@ var Enumerable = {
|
|
|
648
656
|
},
|
|
649
657
|
|
|
650
658
|
findAll: function(iterator, context) {
|
|
651
|
-
iterator = iterator.bind(context);
|
|
652
659
|
var results = [];
|
|
653
660
|
this.each(function(value, index) {
|
|
654
|
-
if (iterator(value, index))
|
|
661
|
+
if (iterator.call(context, value, index))
|
|
655
662
|
results.push(value);
|
|
656
663
|
});
|
|
657
664
|
return results;
|
|
658
665
|
},
|
|
659
666
|
|
|
660
667
|
grep: function(filter, iterator, context) {
|
|
661
|
-
iterator = iterator
|
|
668
|
+
iterator = iterator || Prototype.K;
|
|
662
669
|
var results = [];
|
|
663
670
|
|
|
664
671
|
if (Object.isString(filter))
|
|
@@ -666,7 +673,7 @@ var Enumerable = {
|
|
|
666
673
|
|
|
667
674
|
this.each(function(value, index) {
|
|
668
675
|
if (filter.match(value))
|
|
669
|
-
results.push(iterator(value, index));
|
|
676
|
+
results.push(iterator.call(context, value, index));
|
|
670
677
|
});
|
|
671
678
|
return results;
|
|
672
679
|
},
|
|
@@ -686,7 +693,7 @@ var Enumerable = {
|
|
|
686
693
|
},
|
|
687
694
|
|
|
688
695
|
inGroupsOf: function(number, fillWith) {
|
|
689
|
-
fillWith = fillWith
|
|
696
|
+
fillWith = Object.isUndefined(fillWith) ? null : fillWith;
|
|
690
697
|
return this.eachSlice(number, function(slice) {
|
|
691
698
|
while(slice.length < number) slice.push(fillWith);
|
|
692
699
|
return slice;
|
|
@@ -694,9 +701,8 @@ var Enumerable = {
|
|
|
694
701
|
},
|
|
695
702
|
|
|
696
703
|
inject: function(memo, iterator, context) {
|
|
697
|
-
iterator = iterator.bind(context);
|
|
698
704
|
this.each(function(value, index) {
|
|
699
|
-
memo = iterator(memo, value, index);
|
|
705
|
+
memo = iterator.call(context, memo, value, index);
|
|
700
706
|
});
|
|
701
707
|
return memo;
|
|
702
708
|
},
|
|
@@ -709,32 +715,32 @@ var Enumerable = {
|
|
|
709
715
|
},
|
|
710
716
|
|
|
711
717
|
max: function(iterator, context) {
|
|
712
|
-
iterator = iterator
|
|
718
|
+
iterator = iterator || Prototype.K;
|
|
713
719
|
var result;
|
|
714
720
|
this.each(function(value, index) {
|
|
715
|
-
value = iterator(value, index);
|
|
716
|
-
if (result ==
|
|
721
|
+
value = iterator.call(context, value, index);
|
|
722
|
+
if (result == null || value >= result)
|
|
717
723
|
result = value;
|
|
718
724
|
});
|
|
719
725
|
return result;
|
|
720
726
|
},
|
|
721
727
|
|
|
722
728
|
min: function(iterator, context) {
|
|
723
|
-
iterator = iterator
|
|
729
|
+
iterator = iterator || Prototype.K;
|
|
724
730
|
var result;
|
|
725
731
|
this.each(function(value, index) {
|
|
726
|
-
value = iterator(value, index);
|
|
727
|
-
if (result ==
|
|
732
|
+
value = iterator.call(context, value, index);
|
|
733
|
+
if (result == null || value < result)
|
|
728
734
|
result = value;
|
|
729
735
|
});
|
|
730
736
|
return result;
|
|
731
737
|
},
|
|
732
738
|
|
|
733
739
|
partition: function(iterator, context) {
|
|
734
|
-
iterator = iterator
|
|
740
|
+
iterator = iterator || Prototype.K;
|
|
735
741
|
var trues = [], falses = [];
|
|
736
742
|
this.each(function(value, index) {
|
|
737
|
-
(iterator(value, index) ?
|
|
743
|
+
(iterator.call(context, value, index) ?
|
|
738
744
|
trues : falses).push(value);
|
|
739
745
|
});
|
|
740
746
|
return [trues, falses];
|
|
@@ -749,19 +755,20 @@ var Enumerable = {
|
|
|
749
755
|
},
|
|
750
756
|
|
|
751
757
|
reject: function(iterator, context) {
|
|
752
|
-
iterator = iterator.bind(context);
|
|
753
758
|
var results = [];
|
|
754
759
|
this.each(function(value, index) {
|
|
755
|
-
if (!iterator(value, index))
|
|
760
|
+
if (!iterator.call(context, value, index))
|
|
756
761
|
results.push(value);
|
|
757
762
|
});
|
|
758
763
|
return results;
|
|
759
764
|
},
|
|
760
765
|
|
|
761
766
|
sortBy: function(iterator, context) {
|
|
762
|
-
iterator = iterator.bind(context);
|
|
763
767
|
return this.map(function(value, index) {
|
|
764
|
-
return {
|
|
768
|
+
return {
|
|
769
|
+
value: value,
|
|
770
|
+
criteria: iterator.call(context, value, index)
|
|
771
|
+
};
|
|
765
772
|
}).sort(function(left, right) {
|
|
766
773
|
var a = left.criteria, b = right.criteria;
|
|
767
774
|
return a < b ? -1 : a > b ? 1 : 0;
|
|
@@ -805,20 +812,24 @@ Object.extend(Enumerable, {
|
|
|
805
812
|
function $A(iterable) {
|
|
806
813
|
if (!iterable) return [];
|
|
807
814
|
if (iterable.toArray) return iterable.toArray();
|
|
808
|
-
var length = iterable.length, results = new Array(length);
|
|
815
|
+
var length = iterable.length || 0, results = new Array(length);
|
|
809
816
|
while (length--) results[length] = iterable[length];
|
|
810
817
|
return results;
|
|
811
818
|
}
|
|
812
819
|
|
|
813
820
|
if (Prototype.Browser.WebKit) {
|
|
814
|
-
|
|
821
|
+
$A = function(iterable) {
|
|
815
822
|
if (!iterable) return [];
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
823
|
+
// In Safari, only use the `toArray` method if it's not a NodeList.
|
|
824
|
+
// A NodeList is a function, has an function `item` property, and a numeric
|
|
825
|
+
// `length` property. Adapted from Google Doctype.
|
|
826
|
+
if (!(typeof iterable === 'function' && typeof iterable.length ===
|
|
827
|
+
'number' && typeof iterable.item === 'function') && iterable.toArray)
|
|
828
|
+
return iterable.toArray();
|
|
829
|
+
var length = iterable.length || 0, results = new Array(length);
|
|
819
830
|
while (length--) results[length] = iterable[length];
|
|
820
831
|
return results;
|
|
821
|
-
}
|
|
832
|
+
};
|
|
822
833
|
}
|
|
823
834
|
|
|
824
835
|
Array.from = $A;
|
|
@@ -904,7 +915,7 @@ Object.extend(Array.prototype, {
|
|
|
904
915
|
var results = [];
|
|
905
916
|
this.each(function(object) {
|
|
906
917
|
var value = Object.toJSON(object);
|
|
907
|
-
if (value
|
|
918
|
+
if (!Object.isUndefined(value)) results.push(value);
|
|
908
919
|
});
|
|
909
920
|
return '[' + results.join(', ') + ']';
|
|
910
921
|
}
|
|
@@ -961,8 +972,8 @@ Object.extend(Number.prototype, {
|
|
|
961
972
|
return this + 1;
|
|
962
973
|
},
|
|
963
974
|
|
|
964
|
-
times: function(iterator) {
|
|
965
|
-
$R(0, this, true).each(iterator);
|
|
975
|
+
times: function(iterator, context) {
|
|
976
|
+
$R(0, this, true).each(iterator, context);
|
|
966
977
|
return this;
|
|
967
978
|
},
|
|
968
979
|
|
|
@@ -984,34 +995,6 @@ function $H(object) {
|
|
|
984
995
|
};
|
|
985
996
|
|
|
986
997
|
var Hash = Class.create(Enumerable, (function() {
|
|
987
|
-
if (function() {
|
|
988
|
-
var i = 0, Test = function(value) { this.key = value };
|
|
989
|
-
Test.prototype.key = 'foo';
|
|
990
|
-
for (var property in new Test('bar')) i++;
|
|
991
|
-
return i > 1;
|
|
992
|
-
}()) {
|
|
993
|
-
function each(iterator) {
|
|
994
|
-
var cache = [];
|
|
995
|
-
for (var key in this._object) {
|
|
996
|
-
var value = this._object[key];
|
|
997
|
-
if (cache.include(key)) continue;
|
|
998
|
-
cache.push(key);
|
|
999
|
-
var pair = [key, value];
|
|
1000
|
-
pair.key = key;
|
|
1001
|
-
pair.value = value;
|
|
1002
|
-
iterator(pair);
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
} else {
|
|
1006
|
-
function each(iterator) {
|
|
1007
|
-
for (var key in this._object) {
|
|
1008
|
-
var value = this._object[key], pair = [key, value];
|
|
1009
|
-
pair.key = key;
|
|
1010
|
-
pair.value = value;
|
|
1011
|
-
iterator(pair);
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
998
|
|
|
1016
999
|
function toQueryPair(key, value) {
|
|
1017
1000
|
if (Object.isUndefined(value)) return key;
|
|
@@ -1023,14 +1006,23 @@ var Hash = Class.create(Enumerable, (function() {
|
|
|
1023
1006
|
this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
|
|
1024
1007
|
},
|
|
1025
1008
|
|
|
1026
|
-
_each:
|
|
1009
|
+
_each: function(iterator) {
|
|
1010
|
+
for (var key in this._object) {
|
|
1011
|
+
var value = this._object[key], pair = [key, value];
|
|
1012
|
+
pair.key = key;
|
|
1013
|
+
pair.value = value;
|
|
1014
|
+
iterator(pair);
|
|
1015
|
+
}
|
|
1016
|
+
},
|
|
1027
1017
|
|
|
1028
1018
|
set: function(key, value) {
|
|
1029
1019
|
return this._object[key] = value;
|
|
1030
1020
|
},
|
|
1031
1021
|
|
|
1032
1022
|
get: function(key) {
|
|
1033
|
-
|
|
1023
|
+
// simulating poorly supported hasOwnProperty
|
|
1024
|
+
if (this._object[key] !== Object.prototype[key])
|
|
1025
|
+
return this._object[key];
|
|
1034
1026
|
},
|
|
1035
1027
|
|
|
1036
1028
|
unset: function(key) {
|
|
@@ -1070,14 +1062,14 @@ var Hash = Class.create(Enumerable, (function() {
|
|
|
1070
1062
|
},
|
|
1071
1063
|
|
|
1072
1064
|
toQueryString: function() {
|
|
1073
|
-
return this.
|
|
1065
|
+
return this.inject([], function(results, pair) {
|
|
1074
1066
|
var key = encodeURIComponent(pair.key), values = pair.value;
|
|
1075
1067
|
|
|
1076
1068
|
if (values && typeof values == 'object') {
|
|
1077
1069
|
if (Object.isArray(values))
|
|
1078
|
-
return values.map(toQueryPair.curry(key))
|
|
1079
|
-
}
|
|
1080
|
-
return
|
|
1070
|
+
return results.concat(values.map(toQueryPair.curry(key)));
|
|
1071
|
+
} else results.push(toQueryPair(key, values));
|
|
1072
|
+
return results;
|
|
1081
1073
|
}).join('&');
|
|
1082
1074
|
},
|
|
1083
1075
|
|
|
@@ -1187,8 +1179,11 @@ Ajax.Base = Class.create({
|
|
|
1187
1179
|
Object.extend(this.options, options || { });
|
|
1188
1180
|
|
|
1189
1181
|
this.options.method = this.options.method.toLowerCase();
|
|
1182
|
+
|
|
1190
1183
|
if (Object.isString(this.options.parameters))
|
|
1191
1184
|
this.options.parameters = this.options.parameters.toQueryParams();
|
|
1185
|
+
else if (Object.isHash(this.options.parameters))
|
|
1186
|
+
this.options.parameters = this.options.parameters.toObject();
|
|
1192
1187
|
}
|
|
1193
1188
|
});
|
|
1194
1189
|
|
|
@@ -1315,7 +1310,7 @@ Ajax.Request = Class.create(Ajax.Base, {
|
|
|
1315
1310
|
|
|
1316
1311
|
var contentType = response.getHeader('Content-type');
|
|
1317
1312
|
if (this.options.evalJS == 'force'
|
|
1318
|
-
|| (this.options.evalJS && contentType
|
|
1313
|
+
|| (this.options.evalJS && this.isSameOrigin() && contentType
|
|
1319
1314
|
&& contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
|
|
1320
1315
|
this.evalResponse();
|
|
1321
1316
|
}
|
|
@@ -1333,9 +1328,18 @@ Ajax.Request = Class.create(Ajax.Base, {
|
|
|
1333
1328
|
}
|
|
1334
1329
|
},
|
|
1335
1330
|
|
|
1331
|
+
isSameOrigin: function() {
|
|
1332
|
+
var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
|
|
1333
|
+
return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
|
|
1334
|
+
protocol: location.protocol,
|
|
1335
|
+
domain: document.domain,
|
|
1336
|
+
port: location.port ? ':' + location.port : ''
|
|
1337
|
+
}));
|
|
1338
|
+
},
|
|
1339
|
+
|
|
1336
1340
|
getHeader: function(name) {
|
|
1337
1341
|
try {
|
|
1338
|
-
return this.transport.getResponseHeader(name);
|
|
1342
|
+
return this.transport.getResponseHeader(name) || null;
|
|
1339
1343
|
} catch (e) { return null }
|
|
1340
1344
|
},
|
|
1341
1345
|
|
|
@@ -1371,7 +1375,7 @@ Ajax.Response = Class.create({
|
|
|
1371
1375
|
|
|
1372
1376
|
if(readyState == 4) {
|
|
1373
1377
|
var xml = transport.responseXML;
|
|
1374
|
-
this.responseXML = xml
|
|
1378
|
+
this.responseXML = Object.isUndefined(xml) ? null : xml;
|
|
1375
1379
|
this.responseJSON = this._getResponseJSON();
|
|
1376
1380
|
}
|
|
1377
1381
|
},
|
|
@@ -1408,7 +1412,8 @@ Ajax.Response = Class.create({
|
|
|
1408
1412
|
if (!json) return null;
|
|
1409
1413
|
json = decodeURIComponent(escape(json));
|
|
1410
1414
|
try {
|
|
1411
|
-
return json.evalJSON(this.request.options.sanitizeJSON
|
|
1415
|
+
return json.evalJSON(this.request.options.sanitizeJSON ||
|
|
1416
|
+
!this.request.isSameOrigin());
|
|
1412
1417
|
} catch (e) {
|
|
1413
1418
|
this.request.dispatchException(e);
|
|
1414
1419
|
}
|
|
@@ -1417,10 +1422,12 @@ Ajax.Response = Class.create({
|
|
|
1417
1422
|
_getResponseJSON: function() {
|
|
1418
1423
|
var options = this.request.options;
|
|
1419
1424
|
if (!options.evalJSON || (options.evalJSON != 'force' &&
|
|
1420
|
-
!(this.getHeader('Content-type') || '').include('application/json'))
|
|
1421
|
-
|
|
1425
|
+
!(this.getHeader('Content-type') || '').include('application/json')) ||
|
|
1426
|
+
this.responseText.blank())
|
|
1427
|
+
return null;
|
|
1422
1428
|
try {
|
|
1423
|
-
return this.
|
|
1429
|
+
return this.responseText.evalJSON(options.sanitizeJSON ||
|
|
1430
|
+
!this.request.isSameOrigin());
|
|
1424
1431
|
} catch (e) {
|
|
1425
1432
|
this.request.dispatchException(e);
|
|
1426
1433
|
}
|
|
@@ -1434,11 +1441,11 @@ Ajax.Updater = Class.create(Ajax.Request, {
|
|
|
1434
1441
|
failure: (container.failure || (container.success ? null : container))
|
|
1435
1442
|
};
|
|
1436
1443
|
|
|
1437
|
-
options = options
|
|
1444
|
+
options = Object.clone(options);
|
|
1438
1445
|
var onComplete = options.onComplete;
|
|
1439
|
-
options.onComplete = (function(response,
|
|
1446
|
+
options.onComplete = (function(response, json) {
|
|
1440
1447
|
this.updateContent(response.responseText);
|
|
1441
|
-
if (Object.isFunction(onComplete)) onComplete(response,
|
|
1448
|
+
if (Object.isFunction(onComplete)) onComplete(response, json);
|
|
1442
1449
|
}).bind(this);
|
|
1443
1450
|
|
|
1444
1451
|
$super(url, options);
|
|
@@ -1460,10 +1467,6 @@ Ajax.Updater = Class.create(Ajax.Request, {
|
|
|
1460
1467
|
}
|
|
1461
1468
|
else receiver.update(responseText);
|
|
1462
1469
|
}
|
|
1463
|
-
|
|
1464
|
-
if (this.success()) {
|
|
1465
|
-
if (this.onComplete) this.onComplete.bind(this).defer();
|
|
1466
|
-
}
|
|
1467
1470
|
}
|
|
1468
1471
|
});
|
|
1469
1472
|
|
|
@@ -1566,6 +1569,7 @@ if (!Node.ELEMENT_NODE) {
|
|
|
1566
1569
|
return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
|
|
1567
1570
|
};
|
|
1568
1571
|
Object.extend(this.Element, element || { });
|
|
1572
|
+
if (element) this.Element.prototype = element.prototype;
|
|
1569
1573
|
}).call(window);
|
|
1570
1574
|
|
|
1571
1575
|
Element.cache = { };
|
|
@@ -1582,12 +1586,14 @@ Element.Methods = {
|
|
|
1582
1586
|
},
|
|
1583
1587
|
|
|
1584
1588
|
hide: function(element) {
|
|
1585
|
-
$(element)
|
|
1589
|
+
element = $(element);
|
|
1590
|
+
element.style.display = 'none';
|
|
1586
1591
|
return element;
|
|
1587
1592
|
},
|
|
1588
1593
|
|
|
1589
1594
|
show: function(element) {
|
|
1590
|
-
$(element)
|
|
1595
|
+
element = $(element);
|
|
1596
|
+
element.style.display = '';
|
|
1591
1597
|
return element;
|
|
1592
1598
|
},
|
|
1593
1599
|
|
|
@@ -1628,24 +1634,28 @@ Element.Methods = {
|
|
|
1628
1634
|
Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
|
|
1629
1635
|
insertions = {bottom:insertions};
|
|
1630
1636
|
|
|
1631
|
-
var content,
|
|
1637
|
+
var content, insert, tagName, childNodes;
|
|
1632
1638
|
|
|
1633
|
-
for (position in insertions) {
|
|
1639
|
+
for (var position in insertions) {
|
|
1634
1640
|
content = insertions[position];
|
|
1635
1641
|
position = position.toLowerCase();
|
|
1636
|
-
|
|
1642
|
+
insert = Element._insertionTranslations[position];
|
|
1637
1643
|
|
|
1638
1644
|
if (content && content.toElement) content = content.toElement();
|
|
1639
1645
|
if (Object.isElement(content)) {
|
|
1640
|
-
|
|
1646
|
+
insert(element, content);
|
|
1641
1647
|
continue;
|
|
1642
1648
|
}
|
|
1643
1649
|
|
|
1644
1650
|
content = Object.toHTML(content);
|
|
1645
1651
|
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1652
|
+
tagName = ((position == 'before' || position == 'after')
|
|
1653
|
+
? element.parentNode : element).tagName.toUpperCase();
|
|
1654
|
+
|
|
1655
|
+
childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
|
|
1656
|
+
|
|
1657
|
+
if (position == 'top' || position == 'after') childNodes.reverse();
|
|
1658
|
+
childNodes.each(insert.curry(element));
|
|
1649
1659
|
|
|
1650
1660
|
content.evalScripts.bind(content).defer();
|
|
1651
1661
|
}
|
|
@@ -1690,7 +1700,7 @@ Element.Methods = {
|
|
|
1690
1700
|
},
|
|
1691
1701
|
|
|
1692
1702
|
descendants: function(element) {
|
|
1693
|
-
return $
|
|
1703
|
+
return $(element).select("*");
|
|
1694
1704
|
},
|
|
1695
1705
|
|
|
1696
1706
|
firstDescendant: function(element) {
|
|
@@ -1729,32 +1739,31 @@ Element.Methods = {
|
|
|
1729
1739
|
element = $(element);
|
|
1730
1740
|
if (arguments.length == 1) return $(element.parentNode);
|
|
1731
1741
|
var ancestors = element.ancestors();
|
|
1732
|
-
return expression ?
|
|
1733
|
-
ancestors
|
|
1742
|
+
return Object.isNumber(expression) ? ancestors[expression] :
|
|
1743
|
+
Selector.findElement(ancestors, expression, index);
|
|
1734
1744
|
},
|
|
1735
1745
|
|
|
1736
1746
|
down: function(element, expression, index) {
|
|
1737
1747
|
element = $(element);
|
|
1738
1748
|
if (arguments.length == 1) return element.firstDescendant();
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
descendants[index || 0];
|
|
1749
|
+
return Object.isNumber(expression) ? element.descendants()[expression] :
|
|
1750
|
+
Element.select(element, expression)[index || 0];
|
|
1742
1751
|
},
|
|
1743
1752
|
|
|
1744
1753
|
previous: function(element, expression, index) {
|
|
1745
1754
|
element = $(element);
|
|
1746
1755
|
if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
|
|
1747
1756
|
var previousSiblings = element.previousSiblings();
|
|
1748
|
-
return expression ?
|
|
1749
|
-
previousSiblings
|
|
1757
|
+
return Object.isNumber(expression) ? previousSiblings[expression] :
|
|
1758
|
+
Selector.findElement(previousSiblings, expression, index);
|
|
1750
1759
|
},
|
|
1751
1760
|
|
|
1752
1761
|
next: function(element, expression, index) {
|
|
1753
1762
|
element = $(element);
|
|
1754
1763
|
if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
|
|
1755
1764
|
var nextSiblings = element.nextSiblings();
|
|
1756
|
-
return expression ?
|
|
1757
|
-
nextSiblings
|
|
1765
|
+
return Object.isNumber(expression) ? nextSiblings[expression] :
|
|
1766
|
+
Selector.findElement(nextSiblings, expression, index);
|
|
1758
1767
|
},
|
|
1759
1768
|
|
|
1760
1769
|
select: function() {
|
|
@@ -1795,10 +1804,11 @@ Element.Methods = {
|
|
|
1795
1804
|
var attributes = { }, t = Element._attributeTranslations.write;
|
|
1796
1805
|
|
|
1797
1806
|
if (typeof name == 'object') attributes = name;
|
|
1798
|
-
else attributes[name] = value
|
|
1807
|
+
else attributes[name] = Object.isUndefined(value) ? true : value;
|
|
1799
1808
|
|
|
1800
1809
|
for (var attr in attributes) {
|
|
1801
|
-
|
|
1810
|
+
name = t.names[attr] || attr;
|
|
1811
|
+
value = attributes[attr];
|
|
1802
1812
|
if (t.values[attr]) name = t.values[attr](element, value);
|
|
1803
1813
|
if (value === false || value === null)
|
|
1804
1814
|
element.removeAttribute(name);
|
|
@@ -1871,18 +1881,12 @@ Element.Methods = {
|
|
|
1871
1881
|
if (element.compareDocumentPosition)
|
|
1872
1882
|
return (element.compareDocumentPosition(ancestor) & 8) === 8;
|
|
1873
1883
|
|
|
1874
|
-
if (
|
|
1875
|
-
|
|
1876
|
-
nextAncestor = ancestor.nextSibling;
|
|
1877
|
-
if (!nextAncestor) {
|
|
1878
|
-
do { ancestor = ancestor.parentNode; }
|
|
1879
|
-
while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
|
|
1880
|
-
}
|
|
1881
|
-
if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
|
|
1882
|
-
}
|
|
1884
|
+
if (ancestor.contains)
|
|
1885
|
+
return ancestor.contains(element) && ancestor !== element;
|
|
1883
1886
|
|
|
1884
1887
|
while (element = element.parentNode)
|
|
1885
1888
|
if (element == ancestor) return true;
|
|
1889
|
+
|
|
1886
1890
|
return false;
|
|
1887
1891
|
},
|
|
1888
1892
|
|
|
@@ -1897,7 +1901,7 @@ Element.Methods = {
|
|
|
1897
1901
|
element = $(element);
|
|
1898
1902
|
style = style == 'float' ? 'cssFloat' : style.camelize();
|
|
1899
1903
|
var value = element.style[style];
|
|
1900
|
-
if (!value) {
|
|
1904
|
+
if (!value || value == 'auto') {
|
|
1901
1905
|
var css = document.defaultView.getComputedStyle(element, null);
|
|
1902
1906
|
value = css ? css[style] : null;
|
|
1903
1907
|
}
|
|
@@ -1921,7 +1925,7 @@ Element.Methods = {
|
|
|
1921
1925
|
if (property == 'opacity') element.setOpacity(styles[property]);
|
|
1922
1926
|
else
|
|
1923
1927
|
elementStyle[(property == 'float' || property == 'cssFloat') ?
|
|
1924
|
-
(elementStyle.styleFloat
|
|
1928
|
+
(Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
|
|
1925
1929
|
property] = styles[property];
|
|
1926
1930
|
|
|
1927
1931
|
return element;
|
|
@@ -1936,7 +1940,7 @@ Element.Methods = {
|
|
|
1936
1940
|
|
|
1937
1941
|
getDimensions: function(element) {
|
|
1938
1942
|
element = $(element);
|
|
1939
|
-
var display =
|
|
1943
|
+
var display = element.getStyle('display');
|
|
1940
1944
|
if (display != 'none' && display != null) // Safari bug
|
|
1941
1945
|
return {width: element.offsetWidth, height: element.offsetHeight};
|
|
1942
1946
|
|
|
@@ -1965,7 +1969,7 @@ Element.Methods = {
|
|
|
1965
1969
|
element.style.position = 'relative';
|
|
1966
1970
|
// Opera returns the offset relative to the positioning context, when an
|
|
1967
1971
|
// element is position relative but top and left have not been defined
|
|
1968
|
-
if (
|
|
1972
|
+
if (Prototype.Browser.Opera) {
|
|
1969
1973
|
element.style.top = 0;
|
|
1970
1974
|
element.style.left = 0;
|
|
1971
1975
|
}
|
|
@@ -2020,9 +2024,9 @@ Element.Methods = {
|
|
|
2020
2024
|
valueL += element.offsetLeft || 0;
|
|
2021
2025
|
element = element.offsetParent;
|
|
2022
2026
|
if (element) {
|
|
2023
|
-
if (element.tagName == 'BODY') break;
|
|
2027
|
+
if (element.tagName.toUpperCase() == 'BODY') break;
|
|
2024
2028
|
var p = Element.getStyle(element, 'position');
|
|
2025
|
-
if (p
|
|
2029
|
+
if (p !== 'static') break;
|
|
2026
2030
|
}
|
|
2027
2031
|
} while (element);
|
|
2028
2032
|
return Element._returnOffset(valueL, valueT);
|
|
@@ -2030,7 +2034,7 @@ Element.Methods = {
|
|
|
2030
2034
|
|
|
2031
2035
|
absolutize: function(element) {
|
|
2032
2036
|
element = $(element);
|
|
2033
|
-
if (element.getStyle('position') == 'absolute') return;
|
|
2037
|
+
if (element.getStyle('position') == 'absolute') return element;
|
|
2034
2038
|
// Position.prepare(); // To be done manually by Scripty when it needs it.
|
|
2035
2039
|
|
|
2036
2040
|
var offsets = element.positionedOffset();
|
|
@@ -2054,7 +2058,7 @@ Element.Methods = {
|
|
|
2054
2058
|
|
|
2055
2059
|
relativize: function(element) {
|
|
2056
2060
|
element = $(element);
|
|
2057
|
-
if (element.getStyle('position') == 'relative') return;
|
|
2061
|
+
if (element.getStyle('position') == 'relative') return element;
|
|
2058
2062
|
// Position.prepare(); // To be done manually by Scripty when it needs it.
|
|
2059
2063
|
|
|
2060
2064
|
element.style.position = 'relative';
|
|
@@ -2105,7 +2109,7 @@ Element.Methods = {
|
|
|
2105
2109
|
|
|
2106
2110
|
element = forElement;
|
|
2107
2111
|
do {
|
|
2108
|
-
if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
|
|
2112
|
+
if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
|
|
2109
2113
|
valueT -= element.scrollTop || 0;
|
|
2110
2114
|
valueL -= element.scrollLeft || 0;
|
|
2111
2115
|
}
|
|
@@ -2171,72 +2175,80 @@ Element._attributeTranslations = {
|
|
|
2171
2175
|
}
|
|
2172
2176
|
};
|
|
2173
2177
|
|
|
2174
|
-
|
|
2175
|
-
|
|
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
|
-
|
|
2178
|
+
if (Prototype.Browser.Opera) {
|
|
2179
|
+
Element.Methods.getStyle = Element.Methods.getStyle.wrap(
|
|
2180
|
+
function(proceed, element, style) {
|
|
2181
|
+
switch (style) {
|
|
2182
|
+
case 'left': case 'top': case 'right': case 'bottom':
|
|
2183
|
+
if (proceed(element, 'position') === 'static') return null;
|
|
2184
|
+
case 'height': case 'width':
|
|
2185
|
+
// returns '0px' for hidden elements; we want it to return null
|
|
2186
|
+
if (!Element.visible(element)) return null;
|
|
2187
|
+
|
|
2188
|
+
// returns the border-box dimensions rather than the content-box
|
|
2189
|
+
// dimensions, so we subtract padding and borders from the value
|
|
2190
|
+
var dim = parseInt(proceed(element, style), 10);
|
|
2191
|
+
|
|
2192
|
+
if (dim !== element['offset' + style.capitalize()])
|
|
2193
|
+
return dim + 'px';
|
|
2194
|
+
|
|
2195
|
+
var properties;
|
|
2196
|
+
if (style === 'height') {
|
|
2197
|
+
properties = ['border-top-width', 'padding-top',
|
|
2198
|
+
'padding-bottom', 'border-bottom-width'];
|
|
2199
|
+
}
|
|
2200
|
+
else {
|
|
2201
|
+
properties = ['border-left-width', 'padding-left',
|
|
2202
|
+
'padding-right', 'border-right-width'];
|
|
2203
|
+
}
|
|
2204
|
+
return properties.inject(dim, function(memo, property) {
|
|
2205
|
+
var val = proceed(element, property);
|
|
2206
|
+
return val === null ? memo : memo - parseInt(val, 10);
|
|
2207
|
+
}) + 'px';
|
|
2208
|
+
default: return proceed(element, style);
|
|
2204
2209
|
}
|
|
2205
|
-
else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
|
|
2206
|
-
|
|
2207
|
-
content.evalScripts.bind(content).defer();
|
|
2208
2210
|
}
|
|
2211
|
+
);
|
|
2209
2212
|
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
if (Prototype.Browser.Opera) {
|
|
2215
|
-
Element.Methods._getStyle = Element.Methods.getStyle;
|
|
2216
|
-
Element.Methods.getStyle = function(element, style) {
|
|
2217
|
-
switch(style) {
|
|
2218
|
-
case 'left':
|
|
2219
|
-
case 'top':
|
|
2220
|
-
case 'right':
|
|
2221
|
-
case 'bottom':
|
|
2222
|
-
if (Element._getStyle(element, 'position') == 'static') return null;
|
|
2223
|
-
default: return Element._getStyle(element, style);
|
|
2213
|
+
Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
|
|
2214
|
+
function(proceed, element, attribute) {
|
|
2215
|
+
if (attribute === 'title') return element.title;
|
|
2216
|
+
return proceed(element, attribute);
|
|
2224
2217
|
}
|
|
2225
|
-
|
|
2226
|
-
Element.Methods._readAttribute = Element.Methods.readAttribute;
|
|
2227
|
-
Element.Methods.readAttribute = function(element, attribute) {
|
|
2228
|
-
if (attribute == 'title') return element.title;
|
|
2229
|
-
return Element._readAttribute(element, attribute);
|
|
2230
|
-
};
|
|
2218
|
+
);
|
|
2231
2219
|
}
|
|
2232
2220
|
|
|
2233
2221
|
else if (Prototype.Browser.IE) {
|
|
2234
|
-
|
|
2222
|
+
// IE doesn't report offsets correctly for static elements, so we change them
|
|
2223
|
+
// to "relative" to get the values, then change them back.
|
|
2224
|
+
Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
|
|
2225
|
+
function(proceed, element) {
|
|
2226
|
+
element = $(element);
|
|
2227
|
+
// IE throws an error if element is not in document
|
|
2228
|
+
try { element.offsetParent }
|
|
2229
|
+
catch(e) { return $(document.body) }
|
|
2230
|
+
var position = element.getStyle('position');
|
|
2231
|
+
if (position !== 'static') return proceed(element);
|
|
2232
|
+
element.setStyle({ position: 'relative' });
|
|
2233
|
+
var value = proceed(element);
|
|
2234
|
+
element.setStyle({ position: position });
|
|
2235
|
+
return value;
|
|
2236
|
+
}
|
|
2237
|
+
);
|
|
2238
|
+
|
|
2239
|
+
$w('positionedOffset viewportOffset').each(function(method) {
|
|
2235
2240
|
Element.Methods[method] = Element.Methods[method].wrap(
|
|
2236
2241
|
function(proceed, element) {
|
|
2237
2242
|
element = $(element);
|
|
2243
|
+
try { element.offsetParent }
|
|
2244
|
+
catch(e) { return Element._returnOffset(0,0) }
|
|
2238
2245
|
var position = element.getStyle('position');
|
|
2239
|
-
if (position
|
|
2246
|
+
if (position !== 'static') return proceed(element);
|
|
2247
|
+
// Trigger hasLayout on the offset parent so that IE6 reports
|
|
2248
|
+
// accurate offsetTop and offsetLeft values for position: fixed.
|
|
2249
|
+
var offsetParent = element.getOffsetParent();
|
|
2250
|
+
if (offsetParent && offsetParent.getStyle('position') === 'fixed')
|
|
2251
|
+
offsetParent.setStyle({ zoom: 1 });
|
|
2240
2252
|
element.setStyle({ position: 'relative' });
|
|
2241
2253
|
var value = proceed(element);
|
|
2242
2254
|
element.setStyle({ position: position });
|
|
@@ -2245,6 +2257,14 @@ else if (Prototype.Browser.IE) {
|
|
|
2245
2257
|
);
|
|
2246
2258
|
});
|
|
2247
2259
|
|
|
2260
|
+
Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
|
|
2261
|
+
function(proceed, element) {
|
|
2262
|
+
try { element.offsetParent }
|
|
2263
|
+
catch(e) { return Element._returnOffset(0,0) }
|
|
2264
|
+
return proceed(element);
|
|
2265
|
+
}
|
|
2266
|
+
);
|
|
2267
|
+
|
|
2248
2268
|
Element.Methods.getStyle = function(element, style) {
|
|
2249
2269
|
element = $(element);
|
|
2250
2270
|
style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
|
|
@@ -2301,7 +2321,7 @@ else if (Prototype.Browser.IE) {
|
|
|
2301
2321
|
return node ? node.value : "";
|
|
2302
2322
|
},
|
|
2303
2323
|
_getEv: function(element, attribute) {
|
|
2304
|
-
|
|
2324
|
+
attribute = element.getAttribute(attribute);
|
|
2305
2325
|
return attribute ? attribute.toString().slice(23, -2) : null;
|
|
2306
2326
|
},
|
|
2307
2327
|
_flag: function(element, attribute) {
|
|
@@ -2318,7 +2338,10 @@ else if (Prototype.Browser.IE) {
|
|
|
2318
2338
|
};
|
|
2319
2339
|
|
|
2320
2340
|
Element._attributeTranslations.write = {
|
|
2321
|
-
names: Object.
|
|
2341
|
+
names: Object.extend({
|
|
2342
|
+
cellpadding: 'cellPadding',
|
|
2343
|
+
cellspacing: 'cellSpacing'
|
|
2344
|
+
}, Element._attributeTranslations.read.names),
|
|
2322
2345
|
values: {
|
|
2323
2346
|
checked: function(element, value) {
|
|
2324
2347
|
element.checked = !!value;
|
|
@@ -2333,7 +2356,7 @@ else if (Prototype.Browser.IE) {
|
|
|
2333
2356
|
Element._attributeTranslations.has = {};
|
|
2334
2357
|
|
|
2335
2358
|
$w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
|
|
2336
|
-
'encType maxLength readOnly longDesc').each(function(attr) {
|
|
2359
|
+
'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
|
|
2337
2360
|
Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
|
|
2338
2361
|
Element._attributeTranslations.has[attr.toLowerCase()] = attr;
|
|
2339
2362
|
});
|
|
@@ -2386,7 +2409,7 @@ else if (Prototype.Browser.WebKit) {
|
|
|
2386
2409
|
(value < 0.00001) ? 0 : value;
|
|
2387
2410
|
|
|
2388
2411
|
if (value == 1)
|
|
2389
|
-
if(element.tagName == 'IMG' && element.width) {
|
|
2412
|
+
if(element.tagName.toUpperCase() == 'IMG' && element.width) {
|
|
2390
2413
|
element.width++; element.width--;
|
|
2391
2414
|
} else try {
|
|
2392
2415
|
var n = document.createTextNode(' ');
|
|
@@ -2398,7 +2421,7 @@ else if (Prototype.Browser.WebKit) {
|
|
|
2398
2421
|
};
|
|
2399
2422
|
|
|
2400
2423
|
// Safari returns margins on body which is incorrect if the child is absolutely
|
|
2401
|
-
// positioned. For performance reasons, redefine
|
|
2424
|
+
// positioned. For performance reasons, redefine Element#cumulativeOffset for
|
|
2402
2425
|
// KHTML/WebKit only.
|
|
2403
2426
|
Element.Methods.cumulativeOffset = function(element) {
|
|
2404
2427
|
var valueT = 0, valueL = 0;
|
|
@@ -2438,7 +2461,7 @@ if (Prototype.Browser.IE || Prototype.Browser.Opera) {
|
|
|
2438
2461
|
};
|
|
2439
2462
|
}
|
|
2440
2463
|
|
|
2441
|
-
if (document.createElement('div')
|
|
2464
|
+
if ('outerHTML' in document.createElement('div')) {
|
|
2442
2465
|
Element.Methods.replace = function(element, content) {
|
|
2443
2466
|
element = $(element);
|
|
2444
2467
|
|
|
@@ -2476,45 +2499,25 @@ Element._returnOffset = function(l, t) {
|
|
|
2476
2499
|
|
|
2477
2500
|
Element._getContentFromAnonymousElement = function(tagName, html) {
|
|
2478
2501
|
var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
|
|
2479
|
-
|
|
2480
|
-
|
|
2502
|
+
if (t) {
|
|
2503
|
+
div.innerHTML = t[0] + html + t[1];
|
|
2504
|
+
t[2].times(function() { div = div.firstChild });
|
|
2505
|
+
} else div.innerHTML = html;
|
|
2481
2506
|
return $A(div.childNodes);
|
|
2482
2507
|
};
|
|
2483
2508
|
|
|
2484
2509
|
Element._insertionTranslations = {
|
|
2485
|
-
before: {
|
|
2486
|
-
|
|
2487
|
-
insert: function(element, node) {
|
|
2488
|
-
element.parentNode.insertBefore(node, element);
|
|
2489
|
-
},
|
|
2490
|
-
initializeRange: function(element, range) {
|
|
2491
|
-
range.setStartBefore(element);
|
|
2492
|
-
}
|
|
2510
|
+
before: function(element, node) {
|
|
2511
|
+
element.parentNode.insertBefore(node, element);
|
|
2493
2512
|
},
|
|
2494
|
-
top: {
|
|
2495
|
-
|
|
2496
|
-
insert: function(element, node) {
|
|
2497
|
-
element.insertBefore(node, element.firstChild);
|
|
2498
|
-
},
|
|
2499
|
-
initializeRange: function(element, range) {
|
|
2500
|
-
range.selectNodeContents(element);
|
|
2501
|
-
range.collapse(true);
|
|
2502
|
-
}
|
|
2513
|
+
top: function(element, node) {
|
|
2514
|
+
element.insertBefore(node, element.firstChild);
|
|
2503
2515
|
},
|
|
2504
|
-
bottom: {
|
|
2505
|
-
|
|
2506
|
-
insert: function(element, node) {
|
|
2507
|
-
element.appendChild(node);
|
|
2508
|
-
}
|
|
2516
|
+
bottom: function(element, node) {
|
|
2517
|
+
element.appendChild(node);
|
|
2509
2518
|
},
|
|
2510
|
-
after: {
|
|
2511
|
-
|
|
2512
|
-
insert: function(element, node) {
|
|
2513
|
-
element.parentNode.insertBefore(node, element.nextSibling);
|
|
2514
|
-
},
|
|
2515
|
-
initializeRange: function(element, range) {
|
|
2516
|
-
range.setStartAfter(element);
|
|
2517
|
-
}
|
|
2519
|
+
after: function(element, node) {
|
|
2520
|
+
element.parentNode.insertBefore(node, element.nextSibling);
|
|
2518
2521
|
},
|
|
2519
2522
|
tags: {
|
|
2520
2523
|
TABLE: ['<table>', '</table>', 1],
|
|
@@ -2526,7 +2529,6 @@ Element._insertionTranslations = {
|
|
|
2526
2529
|
};
|
|
2527
2530
|
|
|
2528
2531
|
(function() {
|
|
2529
|
-
this.bottom.initializeRange = this.top.initializeRange;
|
|
2530
2532
|
Object.extend(this.tags, {
|
|
2531
2533
|
THEAD: this.tags.TBODY,
|
|
2532
2534
|
TFOOT: this.tags.TBODY,
|
|
@@ -2538,7 +2540,7 @@ Element.Methods.Simulated = {
|
|
|
2538
2540
|
hasAttribute: function(element, attribute) {
|
|
2539
2541
|
attribute = Element._attributeTranslations.has[attribute] || attribute;
|
|
2540
2542
|
var node = $(element).getAttributeNode(attribute);
|
|
2541
|
-
return node && node.specified;
|
|
2543
|
+
return !!(node && node.specified);
|
|
2542
2544
|
}
|
|
2543
2545
|
};
|
|
2544
2546
|
|
|
@@ -2547,9 +2549,9 @@ Element.Methods.ByTag = { };
|
|
|
2547
2549
|
Object.extend(Element, Element.Methods);
|
|
2548
2550
|
|
|
2549
2551
|
if (!Prototype.BrowserFeatures.ElementExtensions &&
|
|
2550
|
-
document.createElement('div')
|
|
2552
|
+
document.createElement('div')['__proto__']) {
|
|
2551
2553
|
window.HTMLElement = { };
|
|
2552
|
-
window.HTMLElement.prototype = document.createElement('div')
|
|
2554
|
+
window.HTMLElement.prototype = document.createElement('div')['__proto__'];
|
|
2553
2555
|
Prototype.BrowserFeatures.ElementExtensions = true;
|
|
2554
2556
|
}
|
|
2555
2557
|
|
|
@@ -2564,7 +2566,7 @@ Element.extend = (function() {
|
|
|
2564
2566
|
element.nodeType != 1 || element == window) return element;
|
|
2565
2567
|
|
|
2566
2568
|
var methods = Object.clone(Methods),
|
|
2567
|
-
tagName = element.tagName, property, value;
|
|
2569
|
+
tagName = element.tagName.toUpperCase(), property, value;
|
|
2568
2570
|
|
|
2569
2571
|
// extend methods for specific tags
|
|
2570
2572
|
if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
|
|
@@ -2660,7 +2662,7 @@ Element.addMethods = function(methods) {
|
|
|
2660
2662
|
if (window[klass]) return window[klass];
|
|
2661
2663
|
|
|
2662
2664
|
window[klass] = { };
|
|
2663
|
-
window[klass].prototype = document.createElement(tagName)
|
|
2665
|
+
window[klass].prototype = document.createElement(tagName)['__proto__'];
|
|
2664
2666
|
return window[klass];
|
|
2665
2667
|
}
|
|
2666
2668
|
|
|
@@ -2686,11 +2688,18 @@ Element.addMethods = function(methods) {
|
|
|
2686
2688
|
|
|
2687
2689
|
document.viewport = {
|
|
2688
2690
|
getDimensions: function() {
|
|
2689
|
-
var dimensions = { };
|
|
2691
|
+
var dimensions = { }, B = Prototype.Browser;
|
|
2690
2692
|
$w('width height').each(function(d) {
|
|
2691
2693
|
var D = d.capitalize();
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
+
if (B.WebKit && !document.evaluate) {
|
|
2695
|
+
// Safari <3.0 needs self.innerWidth/Height
|
|
2696
|
+
dimensions[d] = self['inner' + D];
|
|
2697
|
+
} else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
|
|
2698
|
+
// Opera <9.5 needs document.body.clientWidth/Height
|
|
2699
|
+
dimensions[d] = document.body['client' + D]
|
|
2700
|
+
} else {
|
|
2701
|
+
dimensions[d] = document.documentElement['client' + D];
|
|
2702
|
+
}
|
|
2694
2703
|
});
|
|
2695
2704
|
return dimensions;
|
|
2696
2705
|
},
|
|
@@ -2709,21 +2718,61 @@ document.viewport = {
|
|
|
2709
2718
|
window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
|
|
2710
2719
|
}
|
|
2711
2720
|
};
|
|
2712
|
-
/* Portions of the Selector class are derived from Jack Slocum
|
|
2721
|
+
/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
|
|
2713
2722
|
* part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
|
|
2714
2723
|
* license. Please see http://www.yui-ext.com/ for more information. */
|
|
2715
2724
|
|
|
2716
2725
|
var Selector = Class.create({
|
|
2717
2726
|
initialize: function(expression) {
|
|
2718
2727
|
this.expression = expression.strip();
|
|
2719
|
-
|
|
2728
|
+
|
|
2729
|
+
if (this.shouldUseSelectorsAPI()) {
|
|
2730
|
+
this.mode = 'selectorsAPI';
|
|
2731
|
+
} else if (this.shouldUseXPath()) {
|
|
2732
|
+
this.mode = 'xpath';
|
|
2733
|
+
this.compileXPathMatcher();
|
|
2734
|
+
} else {
|
|
2735
|
+
this.mode = "normal";
|
|
2736
|
+
this.compileMatcher();
|
|
2737
|
+
}
|
|
2738
|
+
|
|
2720
2739
|
},
|
|
2721
2740
|
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2741
|
+
shouldUseXPath: function() {
|
|
2742
|
+
if (!Prototype.BrowserFeatures.XPath) return false;
|
|
2743
|
+
|
|
2744
|
+
var e = this.expression;
|
|
2745
|
+
|
|
2746
|
+
// Safari 3 chokes on :*-of-type and :empty
|
|
2747
|
+
if (Prototype.Browser.WebKit &&
|
|
2748
|
+
(e.include("-of-type") || e.include(":empty")))
|
|
2749
|
+
return false;
|
|
2726
2750
|
|
|
2751
|
+
// XPath can't do namespaced attributes, nor can it read
|
|
2752
|
+
// the "checked" property from DOM nodes
|
|
2753
|
+
if ((/(\[[\w-]*?:|:checked)/).test(e))
|
|
2754
|
+
return false;
|
|
2755
|
+
|
|
2756
|
+
return true;
|
|
2757
|
+
},
|
|
2758
|
+
|
|
2759
|
+
shouldUseSelectorsAPI: function() {
|
|
2760
|
+
if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
|
|
2761
|
+
|
|
2762
|
+
if (!Selector._div) Selector._div = new Element('div');
|
|
2763
|
+
|
|
2764
|
+
// Make sure the browser treats the selector as valid. Test on an
|
|
2765
|
+
// isolated element to minimize cost of this check.
|
|
2766
|
+
try {
|
|
2767
|
+
Selector._div.querySelector(this.expression);
|
|
2768
|
+
} catch(e) {
|
|
2769
|
+
return false;
|
|
2770
|
+
}
|
|
2771
|
+
|
|
2772
|
+
return true;
|
|
2773
|
+
},
|
|
2774
|
+
|
|
2775
|
+
compileMatcher: function() {
|
|
2727
2776
|
var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
|
|
2728
2777
|
c = Selector.criteria, le, p, m;
|
|
2729
2778
|
|
|
@@ -2741,7 +2790,7 @@ var Selector = Class.create({
|
|
|
2741
2790
|
p = ps[i];
|
|
2742
2791
|
if (m = e.match(p)) {
|
|
2743
2792
|
this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
|
|
2744
|
-
|
|
2793
|
+
new Template(c[i]).evaluate(m));
|
|
2745
2794
|
e = e.replace(m[0], '');
|
|
2746
2795
|
break;
|
|
2747
2796
|
}
|
|
@@ -2780,8 +2829,27 @@ var Selector = Class.create({
|
|
|
2780
2829
|
|
|
2781
2830
|
findElements: function(root) {
|
|
2782
2831
|
root = root || document;
|
|
2783
|
-
|
|
2784
|
-
|
|
2832
|
+
var e = this.expression, results;
|
|
2833
|
+
|
|
2834
|
+
switch (this.mode) {
|
|
2835
|
+
case 'selectorsAPI':
|
|
2836
|
+
// querySelectorAll queries document-wide, then filters to descendants
|
|
2837
|
+
// of the context element. That's not what we want.
|
|
2838
|
+
// Add an explicit context to the selector if necessary.
|
|
2839
|
+
if (root !== document) {
|
|
2840
|
+
var oldId = root.id, id = $(root).identify();
|
|
2841
|
+
e = "#" + id + " " + e;
|
|
2842
|
+
}
|
|
2843
|
+
|
|
2844
|
+
results = $A(root.querySelectorAll(e)).map(Element.extend);
|
|
2845
|
+
root.id = oldId;
|
|
2846
|
+
|
|
2847
|
+
return results;
|
|
2848
|
+
case 'xpath':
|
|
2849
|
+
return document._getElementsByXPath(this.xpath, root);
|
|
2850
|
+
default:
|
|
2851
|
+
return this.matcher(root);
|
|
2852
|
+
}
|
|
2785
2853
|
},
|
|
2786
2854
|
|
|
2787
2855
|
match: function(element) {
|
|
@@ -2844,8 +2912,12 @@ Object.extend(Selector, {
|
|
|
2844
2912
|
},
|
|
2845
2913
|
className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
|
|
2846
2914
|
id: "[@id='#{1}']",
|
|
2847
|
-
attrPresence:
|
|
2915
|
+
attrPresence: function(m) {
|
|
2916
|
+
m[1] = m[1].toLowerCase();
|
|
2917
|
+
return new Template("[@#{1}]").evaluate(m);
|
|
2918
|
+
},
|
|
2848
2919
|
attr: function(m) {
|
|
2920
|
+
m[1] = m[1].toLowerCase();
|
|
2849
2921
|
m[3] = m[5] || m[6];
|
|
2850
2922
|
return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
|
|
2851
2923
|
},
|
|
@@ -2868,13 +2940,13 @@ Object.extend(Selector, {
|
|
|
2868
2940
|
'first-child': '[not(preceding-sibling::*)]',
|
|
2869
2941
|
'last-child': '[not(following-sibling::*)]',
|
|
2870
2942
|
'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
|
|
2871
|
-
'empty': "[count(*) = 0 and (count(text()) = 0
|
|
2943
|
+
'empty': "[count(*) = 0 and (count(text()) = 0)]",
|
|
2872
2944
|
'checked': "[@checked]",
|
|
2873
|
-
'disabled': "[@disabled]",
|
|
2874
|
-
'enabled': "[not(@disabled)]",
|
|
2945
|
+
'disabled': "[(@disabled) and (@type!='hidden')]",
|
|
2946
|
+
'enabled': "[not(@disabled) and (@type!='hidden')]",
|
|
2875
2947
|
'not': function(m) {
|
|
2876
2948
|
var e = m[6], p = Selector.patterns,
|
|
2877
|
-
x = Selector.xpath, le,
|
|
2949
|
+
x = Selector.xpath, le, v;
|
|
2878
2950
|
|
|
2879
2951
|
var exclusion = [];
|
|
2880
2952
|
while (e && le != e && (/\S/).test(e)) {
|
|
@@ -2931,13 +3003,13 @@ Object.extend(Selector, {
|
|
|
2931
3003
|
},
|
|
2932
3004
|
|
|
2933
3005
|
criteria: {
|
|
2934
|
-
tagName: 'n = h.tagName(n, r, "#{1}", c);
|
|
2935
|
-
className: 'n = h.className(n, r, "#{1}", c);
|
|
2936
|
-
id: 'n = h.id(n, r, "#{1}", c);
|
|
2937
|
-
attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
|
|
3006
|
+
tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
|
|
3007
|
+
className: 'n = h.className(n, r, "#{1}", c); c = false;',
|
|
3008
|
+
id: 'n = h.id(n, r, "#{1}", c); c = false;',
|
|
3009
|
+
attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
|
|
2938
3010
|
attr: function(m) {
|
|
2939
3011
|
m[3] = (m[5] || m[6]);
|
|
2940
|
-
return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
|
|
3012
|
+
return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
|
|
2941
3013
|
},
|
|
2942
3014
|
pseudo: function(m) {
|
|
2943
3015
|
if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
|
|
@@ -2961,8 +3033,9 @@ Object.extend(Selector, {
|
|
|
2961
3033
|
tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
|
|
2962
3034
|
id: /^#([\w\-\*]+)(\b|$)/,
|
|
2963
3035
|
className: /^\.([\w\-\*]+)(\b|$)/,
|
|
2964
|
-
pseudo:
|
|
2965
|
-
|
|
3036
|
+
pseudo:
|
|
3037
|
+
/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
|
|
3038
|
+
attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
|
|
2966
3039
|
attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
|
|
2967
3040
|
},
|
|
2968
3041
|
|
|
@@ -2986,7 +3059,7 @@ Object.extend(Selector, {
|
|
|
2986
3059
|
|
|
2987
3060
|
attr: function(element, matches) {
|
|
2988
3061
|
var nodeValue = Element.readAttribute(element, matches[1]);
|
|
2989
|
-
return Selector.operators[matches[2]](nodeValue, matches[
|
|
3062
|
+
return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
|
|
2990
3063
|
}
|
|
2991
3064
|
},
|
|
2992
3065
|
|
|
@@ -3001,14 +3074,15 @@ Object.extend(Selector, {
|
|
|
3001
3074
|
|
|
3002
3075
|
// marks an array of nodes for counting
|
|
3003
3076
|
mark: function(nodes) {
|
|
3077
|
+
var _true = Prototype.emptyFunction;
|
|
3004
3078
|
for (var i = 0, node; node = nodes[i]; i++)
|
|
3005
|
-
node.
|
|
3079
|
+
node._countedByPrototype = _true;
|
|
3006
3080
|
return nodes;
|
|
3007
3081
|
},
|
|
3008
3082
|
|
|
3009
3083
|
unmark: function(nodes) {
|
|
3010
3084
|
for (var i = 0, node; node = nodes[i]; i++)
|
|
3011
|
-
node.
|
|
3085
|
+
node._countedByPrototype = undefined;
|
|
3012
3086
|
return nodes;
|
|
3013
3087
|
},
|
|
3014
3088
|
|
|
@@ -3016,15 +3090,15 @@ Object.extend(Selector, {
|
|
|
3016
3090
|
// "ofType" flag indicates whether we're indexing for nth-of-type
|
|
3017
3091
|
// rather than nth-child
|
|
3018
3092
|
index: function(parentNode, reverse, ofType) {
|
|
3019
|
-
parentNode.
|
|
3093
|
+
parentNode._countedByPrototype = Prototype.emptyFunction;
|
|
3020
3094
|
if (reverse) {
|
|
3021
3095
|
for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
|
|
3022
3096
|
var node = nodes[i];
|
|
3023
|
-
if (node.nodeType == 1 && (!ofType || node.
|
|
3097
|
+
if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
|
|
3024
3098
|
}
|
|
3025
3099
|
} else {
|
|
3026
3100
|
for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
|
|
3027
|
-
if (node.nodeType == 1 && (!ofType || node.
|
|
3101
|
+
if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
|
|
3028
3102
|
}
|
|
3029
3103
|
},
|
|
3030
3104
|
|
|
@@ -3033,8 +3107,8 @@ Object.extend(Selector, {
|
|
|
3033
3107
|
if (nodes.length == 0) return nodes;
|
|
3034
3108
|
var results = [], n;
|
|
3035
3109
|
for (var i = 0, l = nodes.length; i < l; i++)
|
|
3036
|
-
if (!(n = nodes[i]).
|
|
3037
|
-
n.
|
|
3110
|
+
if (!(n = nodes[i])._countedByPrototype) {
|
|
3111
|
+
n._countedByPrototype = Prototype.emptyFunction;
|
|
3038
3112
|
results.push(Element.extend(n));
|
|
3039
3113
|
}
|
|
3040
3114
|
return Selector.handlers.unmark(results);
|
|
@@ -3051,7 +3125,7 @@ Object.extend(Selector, {
|
|
|
3051
3125
|
child: function(nodes) {
|
|
3052
3126
|
var h = Selector.handlers;
|
|
3053
3127
|
for (var i = 0, results = [], node; node = nodes[i]; i++) {
|
|
3054
|
-
for (var j = 0,
|
|
3128
|
+
for (var j = 0, child; child = node.childNodes[j]; j++)
|
|
3055
3129
|
if (child.nodeType == 1 && child.tagName != '!') results.push(child);
|
|
3056
3130
|
}
|
|
3057
3131
|
return results;
|
|
@@ -3074,7 +3148,7 @@ Object.extend(Selector, {
|
|
|
3074
3148
|
|
|
3075
3149
|
nextElementSibling: function(node) {
|
|
3076
3150
|
while (node = node.nextSibling)
|
|
3077
|
-
|
|
3151
|
+
if (node.nodeType == 1) return node;
|
|
3078
3152
|
return null;
|
|
3079
3153
|
},
|
|
3080
3154
|
|
|
@@ -3086,7 +3160,7 @@ Object.extend(Selector, {
|
|
|
3086
3160
|
|
|
3087
3161
|
// TOKEN FUNCTIONS
|
|
3088
3162
|
tagName: function(nodes, root, tagName, combinator) {
|
|
3089
|
-
|
|
3163
|
+
var uTagName = tagName.toUpperCase();
|
|
3090
3164
|
var results = [], h = Selector.handlers;
|
|
3091
3165
|
if (nodes) {
|
|
3092
3166
|
if (combinator) {
|
|
@@ -3099,7 +3173,7 @@ Object.extend(Selector, {
|
|
|
3099
3173
|
if (tagName == "*") return nodes;
|
|
3100
3174
|
}
|
|
3101
3175
|
for (var i = 0, node; node = nodes[i]; i++)
|
|
3102
|
-
if (node.tagName.toUpperCase()
|
|
3176
|
+
if (node.tagName.toUpperCase() === uTagName) results.push(node);
|
|
3103
3177
|
return results;
|
|
3104
3178
|
} else return root.getElementsByTagName(tagName);
|
|
3105
3179
|
},
|
|
@@ -3146,16 +3220,18 @@ Object.extend(Selector, {
|
|
|
3146
3220
|
return results;
|
|
3147
3221
|
},
|
|
3148
3222
|
|
|
3149
|
-
attrPresence: function(nodes, root, attr) {
|
|
3223
|
+
attrPresence: function(nodes, root, attr, combinator) {
|
|
3150
3224
|
if (!nodes) nodes = root.getElementsByTagName("*");
|
|
3225
|
+
if (nodes && combinator) nodes = this[combinator](nodes);
|
|
3151
3226
|
var results = [];
|
|
3152
3227
|
for (var i = 0, node; node = nodes[i]; i++)
|
|
3153
3228
|
if (Element.hasAttribute(node, attr)) results.push(node);
|
|
3154
3229
|
return results;
|
|
3155
3230
|
},
|
|
3156
3231
|
|
|
3157
|
-
attr: function(nodes, root, attr, value, operator) {
|
|
3232
|
+
attr: function(nodes, root, attr, value, operator, combinator) {
|
|
3158
3233
|
if (!nodes) nodes = root.getElementsByTagName("*");
|
|
3234
|
+
if (nodes && combinator) nodes = this[combinator](nodes);
|
|
3159
3235
|
var handler = Selector.operators[operator], results = [];
|
|
3160
3236
|
for (var i = 0, node; node = nodes[i]; i++) {
|
|
3161
3237
|
var nodeValue = Element.readAttribute(node, attr);
|
|
@@ -3234,7 +3310,7 @@ Object.extend(Selector, {
|
|
|
3234
3310
|
var h = Selector.handlers, results = [], indexed = [], m;
|
|
3235
3311
|
h.mark(nodes);
|
|
3236
3312
|
for (var i = 0, node; node = nodes[i]; i++) {
|
|
3237
|
-
if (!node.parentNode.
|
|
3313
|
+
if (!node.parentNode._countedByPrototype) {
|
|
3238
3314
|
h.index(node.parentNode, reverse, ofType);
|
|
3239
3315
|
indexed.push(node.parentNode);
|
|
3240
3316
|
}
|
|
@@ -3261,7 +3337,7 @@ Object.extend(Selector, {
|
|
|
3261
3337
|
'empty': function(nodes, value, root) {
|
|
3262
3338
|
for (var i = 0, results = [], node; node = nodes[i]; i++) {
|
|
3263
3339
|
// IE treats comments as element nodes
|
|
3264
|
-
if (node.tagName == '!' ||
|
|
3340
|
+
if (node.tagName == '!' || node.firstChild) continue;
|
|
3265
3341
|
results.push(node);
|
|
3266
3342
|
}
|
|
3267
3343
|
return results;
|
|
@@ -3272,14 +3348,15 @@ Object.extend(Selector, {
|
|
|
3272
3348
|
var exclusions = new Selector(selector).findElements(root);
|
|
3273
3349
|
h.mark(exclusions);
|
|
3274
3350
|
for (var i = 0, results = [], node; node = nodes[i]; i++)
|
|
3275
|
-
if (!node.
|
|
3351
|
+
if (!node._countedByPrototype) results.push(node);
|
|
3276
3352
|
h.unmark(exclusions);
|
|
3277
3353
|
return results;
|
|
3278
3354
|
},
|
|
3279
3355
|
|
|
3280
3356
|
'enabled': function(nodes, value, root) {
|
|
3281
3357
|
for (var i = 0, results = [], node; node = nodes[i]; i++)
|
|
3282
|
-
if (!node.disabled
|
|
3358
|
+
if (!node.disabled && (!node.type || node.type !== 'hidden'))
|
|
3359
|
+
results.push(node);
|
|
3283
3360
|
return results;
|
|
3284
3361
|
},
|
|
3285
3362
|
|
|
@@ -3299,18 +3376,29 @@ Object.extend(Selector, {
|
|
|
3299
3376
|
operators: {
|
|
3300
3377
|
'=': function(nv, v) { return nv == v; },
|
|
3301
3378
|
'!=': function(nv, v) { return nv != v; },
|
|
3302
|
-
'^=': function(nv, v) { return nv.startsWith(v); },
|
|
3379
|
+
'^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
|
|
3380
|
+
'$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
|
|
3381
|
+
'*=': function(nv, v) { return nv == v || nv && nv.include(v); },
|
|
3303
3382
|
'$=': function(nv, v) { return nv.endsWith(v); },
|
|
3304
3383
|
'*=': function(nv, v) { return nv.include(v); },
|
|
3305
3384
|
'~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
|
|
3306
|
-
'|=': function(nv, v) { return ('-' + nv
|
|
3385
|
+
'|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
|
|
3386
|
+
'-').include('-' + (v || "").toUpperCase() + '-'); }
|
|
3387
|
+
},
|
|
3388
|
+
|
|
3389
|
+
split: function(expression) {
|
|
3390
|
+
var expressions = [];
|
|
3391
|
+
expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
|
|
3392
|
+
expressions.push(m[1].strip());
|
|
3393
|
+
});
|
|
3394
|
+
return expressions;
|
|
3307
3395
|
},
|
|
3308
3396
|
|
|
3309
3397
|
matchElements: function(elements, expression) {
|
|
3310
|
-
var matches =
|
|
3398
|
+
var matches = $$(expression), h = Selector.handlers;
|
|
3311
3399
|
h.mark(matches);
|
|
3312
3400
|
for (var i = 0, results = [], element; element = elements[i]; i++)
|
|
3313
|
-
if (element.
|
|
3401
|
+
if (element._countedByPrototype) results.push(element);
|
|
3314
3402
|
h.unmark(matches);
|
|
3315
3403
|
return results;
|
|
3316
3404
|
},
|
|
@@ -3323,10 +3411,7 @@ Object.extend(Selector, {
|
|
|
3323
3411
|
},
|
|
3324
3412
|
|
|
3325
3413
|
findChildElements: function(element, expressions) {
|
|
3326
|
-
|
|
3327
|
-
exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
|
|
3328
|
-
expressions.push(m[1].strip());
|
|
3329
|
-
});
|
|
3414
|
+
expressions = Selector.split(expressions.join(','));
|
|
3330
3415
|
var results = [], h = Selector.handlers;
|
|
3331
3416
|
for (var i = 0, l = expressions.length, selector; i < l; i++) {
|
|
3332
3417
|
selector = new Selector(expressions[i].strip());
|
|
@@ -3336,6 +3421,25 @@ Object.extend(Selector, {
|
|
|
3336
3421
|
}
|
|
3337
3422
|
});
|
|
3338
3423
|
|
|
3424
|
+
if (Prototype.Browser.IE) {
|
|
3425
|
+
Object.extend(Selector.handlers, {
|
|
3426
|
+
// IE returns comment nodes on getElementsByTagName("*").
|
|
3427
|
+
// Filter them out.
|
|
3428
|
+
concat: function(a, b) {
|
|
3429
|
+
for (var i = 0, node; node = b[i]; i++)
|
|
3430
|
+
if (node.tagName !== "!") a.push(node);
|
|
3431
|
+
return a;
|
|
3432
|
+
},
|
|
3433
|
+
|
|
3434
|
+
// IE improperly serializes _countedByPrototype in (inner|outer)HTML.
|
|
3435
|
+
unmark: function(nodes) {
|
|
3436
|
+
for (var i = 0, node; node = nodes[i]; i++)
|
|
3437
|
+
node.removeAttribute('_countedByPrototype');
|
|
3438
|
+
return nodes;
|
|
3439
|
+
}
|
|
3440
|
+
});
|
|
3441
|
+
}
|
|
3442
|
+
|
|
3339
3443
|
function $$() {
|
|
3340
3444
|
return Selector.findChildElements(document, $A(arguments));
|
|
3341
3445
|
}
|
|
@@ -3347,13 +3451,13 @@ var Form = {
|
|
|
3347
3451
|
|
|
3348
3452
|
serializeElements: function(elements, options) {
|
|
3349
3453
|
if (typeof options != 'object') options = { hash: !!options };
|
|
3350
|
-
else if (options.hash
|
|
3454
|
+
else if (Object.isUndefined(options.hash)) options.hash = true;
|
|
3351
3455
|
var key, value, submitted = false, submit = options.submit;
|
|
3352
3456
|
|
|
3353
3457
|
var data = elements.inject({ }, function(result, element) {
|
|
3354
3458
|
if (!element.disabled && element.name) {
|
|
3355
3459
|
key = element.name; value = $(element).getValue();
|
|
3356
|
-
if (value != null && (element.type != 'submit' || (!submitted &&
|
|
3460
|
+
if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
|
|
3357
3461
|
submit !== false && (!submit || key == submit) && (submitted = true)))) {
|
|
3358
3462
|
if (key in result) {
|
|
3359
3463
|
// a key is already present; construct an array of values
|
|
@@ -3514,7 +3618,6 @@ Form.Element.Methods = {
|
|
|
3514
3618
|
|
|
3515
3619
|
disable: function(element) {
|
|
3516
3620
|
element = $(element);
|
|
3517
|
-
element.blur();
|
|
3518
3621
|
element.disabled = true;
|
|
3519
3622
|
return element;
|
|
3520
3623
|
},
|
|
@@ -3545,31 +3648,31 @@ Form.Element.Serializers = {
|
|
|
3545
3648
|
},
|
|
3546
3649
|
|
|
3547
3650
|
inputSelector: function(element, value) {
|
|
3548
|
-
if (value
|
|
3651
|
+
if (Object.isUndefined(value)) return element.checked ? element.value : null;
|
|
3549
3652
|
else element.checked = !!value;
|
|
3550
3653
|
},
|
|
3551
3654
|
|
|
3552
3655
|
textarea: function(element, value) {
|
|
3553
|
-
if (value
|
|
3656
|
+
if (Object.isUndefined(value)) return element.value;
|
|
3554
3657
|
else element.value = value;
|
|
3555
3658
|
},
|
|
3556
3659
|
|
|
3557
|
-
select: function(element,
|
|
3558
|
-
if (
|
|
3660
|
+
select: function(element, value) {
|
|
3661
|
+
if (Object.isUndefined(value))
|
|
3559
3662
|
return this[element.type == 'select-one' ?
|
|
3560
3663
|
'selectOne' : 'selectMany'](element);
|
|
3561
3664
|
else {
|
|
3562
|
-
var opt,
|
|
3665
|
+
var opt, currentValue, single = !Object.isArray(value);
|
|
3563
3666
|
for (var i = 0, length = element.length; i < length; i++) {
|
|
3564
3667
|
opt = element.options[i];
|
|
3565
|
-
|
|
3668
|
+
currentValue = this.optionValue(opt);
|
|
3566
3669
|
if (single) {
|
|
3567
|
-
if (
|
|
3670
|
+
if (currentValue == value) {
|
|
3568
3671
|
opt.selected = true;
|
|
3569
3672
|
return;
|
|
3570
3673
|
}
|
|
3571
3674
|
}
|
|
3572
|
-
else opt.selected =
|
|
3675
|
+
else opt.selected = value.include(currentValue);
|
|
3573
3676
|
}
|
|
3574
3677
|
}
|
|
3575
3678
|
},
|
|
@@ -3740,21 +3843,42 @@ Event.Methods = (function() {
|
|
|
3740
3843
|
isRightClick: function(event) { return isButton(event, 2) },
|
|
3741
3844
|
|
|
3742
3845
|
element: function(event) {
|
|
3743
|
-
|
|
3744
|
-
|
|
3846
|
+
event = Event.extend(event);
|
|
3847
|
+
|
|
3848
|
+
var node = event.target,
|
|
3849
|
+
type = event.type,
|
|
3850
|
+
currentTarget = event.currentTarget;
|
|
3851
|
+
|
|
3852
|
+
if (currentTarget && currentTarget.tagName) {
|
|
3853
|
+
// Firefox screws up the "click" event when moving between radio buttons
|
|
3854
|
+
// via arrow keys. It also screws up the "load" and "error" events on images,
|
|
3855
|
+
// reporting the document as the target instead of the original image.
|
|
3856
|
+
if (type === 'load' || type === 'error' ||
|
|
3857
|
+
(type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
|
|
3858
|
+
&& currentTarget.type === 'radio'))
|
|
3859
|
+
node = currentTarget;
|
|
3860
|
+
}
|
|
3861
|
+
if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
|
|
3862
|
+
return Element.extend(node);
|
|
3745
3863
|
},
|
|
3746
3864
|
|
|
3747
3865
|
findElement: function(event, expression) {
|
|
3748
3866
|
var element = Event.element(event);
|
|
3749
|
-
|
|
3867
|
+
if (!expression) return element;
|
|
3868
|
+
var elements = [element].concat(element.ancestors());
|
|
3869
|
+
return Selector.findElement(elements, expression, 0);
|
|
3750
3870
|
},
|
|
3751
3871
|
|
|
3752
3872
|
pointer: function(event) {
|
|
3873
|
+
var docElement = document.documentElement,
|
|
3874
|
+
body = document.body || { scrollLeft: 0, scrollTop: 0 };
|
|
3753
3875
|
return {
|
|
3754
3876
|
x: event.pageX || (event.clientX +
|
|
3755
|
-
(
|
|
3877
|
+
(docElement.scrollLeft || body.scrollLeft) -
|
|
3878
|
+
(docElement.clientLeft || 0)),
|
|
3756
3879
|
y: event.pageY || (event.clientY +
|
|
3757
|
-
(
|
|
3880
|
+
(docElement.scrollTop || body.scrollTop) -
|
|
3881
|
+
(docElement.clientTop || 0))
|
|
3758
3882
|
};
|
|
3759
3883
|
},
|
|
3760
3884
|
|
|
@@ -3799,7 +3923,7 @@ Event.extend = (function() {
|
|
|
3799
3923
|
};
|
|
3800
3924
|
|
|
3801
3925
|
} else {
|
|
3802
|
-
Event.prototype = Event.prototype || document.createEvent("HTMLEvents")
|
|
3926
|
+
Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
|
|
3803
3927
|
Object.extend(Event.prototype, methods);
|
|
3804
3928
|
return Prototype.K;
|
|
3805
3929
|
}
|
|
@@ -3809,9 +3933,9 @@ Object.extend(Event, (function() {
|
|
|
3809
3933
|
var cache = Event.cache;
|
|
3810
3934
|
|
|
3811
3935
|
function getEventID(element) {
|
|
3812
|
-
if (element.
|
|
3936
|
+
if (element._prototypeEventID) return element._prototypeEventID[0];
|
|
3813
3937
|
arguments.callee.id = arguments.callee.id || 1;
|
|
3814
|
-
return element.
|
|
3938
|
+
return element._prototypeEventID = [++arguments.callee.id];
|
|
3815
3939
|
}
|
|
3816
3940
|
|
|
3817
3941
|
function getDOMEventName(eventName) {
|
|
@@ -3839,7 +3963,7 @@ Object.extend(Event, (function() {
|
|
|
3839
3963
|
return false;
|
|
3840
3964
|
|
|
3841
3965
|
Event.extend(event);
|
|
3842
|
-
handler.call(element, event)
|
|
3966
|
+
handler.call(element, event);
|
|
3843
3967
|
};
|
|
3844
3968
|
|
|
3845
3969
|
wrapper.handler = handler;
|
|
@@ -3864,10 +3988,20 @@ Object.extend(Event, (function() {
|
|
|
3864
3988
|
cache[id][eventName] = null;
|
|
3865
3989
|
}
|
|
3866
3990
|
|
|
3991
|
+
|
|
3992
|
+
// Internet Explorer needs to remove event handlers on page unload
|
|
3993
|
+
// in order to avoid memory leaks.
|
|
3867
3994
|
if (window.attachEvent) {
|
|
3868
3995
|
window.attachEvent("onunload", destroyCache);
|
|
3869
3996
|
}
|
|
3870
3997
|
|
|
3998
|
+
// Safari has a dummy event handler on page unload so that it won't
|
|
3999
|
+
// use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
|
|
4000
|
+
// object when page is returned to via the back button using its bfcache.
|
|
4001
|
+
if (Prototype.Browser.WebKit) {
|
|
4002
|
+
window.addEventListener('unload', Prototype.emptyFunction, false);
|
|
4003
|
+
}
|
|
4004
|
+
|
|
3871
4005
|
return {
|
|
3872
4006
|
observe: function(element, eventName, handler) {
|
|
3873
4007
|
element = $(element);
|
|
@@ -3921,11 +4055,12 @@ Object.extend(Event, (function() {
|
|
|
3921
4055
|
if (element == document && document.createEvent && !element.dispatchEvent)
|
|
3922
4056
|
element = document.documentElement;
|
|
3923
4057
|
|
|
4058
|
+
var event;
|
|
3924
4059
|
if (document.createEvent) {
|
|
3925
|
-
|
|
4060
|
+
event = document.createEvent("HTMLEvents");
|
|
3926
4061
|
event.initEvent("dataavailable", true, true);
|
|
3927
4062
|
} else {
|
|
3928
|
-
|
|
4063
|
+
event = document.createEventObject();
|
|
3929
4064
|
event.eventType = "ondataavailable";
|
|
3930
4065
|
}
|
|
3931
4066
|
|
|
@@ -3938,7 +4073,7 @@ Object.extend(Event, (function() {
|
|
|
3938
4073
|
element.fireEvent(event.eventType, event);
|
|
3939
4074
|
}
|
|
3940
4075
|
|
|
3941
|
-
return event;
|
|
4076
|
+
return Event.extend(event);
|
|
3942
4077
|
}
|
|
3943
4078
|
};
|
|
3944
4079
|
})());
|
|
@@ -3954,20 +4089,21 @@ Element.addMethods({
|
|
|
3954
4089
|
Object.extend(document, {
|
|
3955
4090
|
fire: Element.Methods.fire.methodize(),
|
|
3956
4091
|
observe: Element.Methods.observe.methodize(),
|
|
3957
|
-
stopObserving: Element.Methods.stopObserving.methodize()
|
|
4092
|
+
stopObserving: Element.Methods.stopObserving.methodize(),
|
|
4093
|
+
loaded: false
|
|
3958
4094
|
});
|
|
3959
4095
|
|
|
3960
4096
|
(function() {
|
|
3961
4097
|
/* Support for the DOMContentLoaded event is based on work by Dan Webb,
|
|
3962
4098
|
Matthias Miller, Dean Edwards and John Resig. */
|
|
3963
4099
|
|
|
3964
|
-
var timer
|
|
4100
|
+
var timer;
|
|
3965
4101
|
|
|
3966
4102
|
function fireContentLoadedEvent() {
|
|
3967
|
-
if (
|
|
4103
|
+
if (document.loaded) return;
|
|
3968
4104
|
if (timer) window.clearInterval(timer);
|
|
3969
4105
|
document.fire("dom:loaded");
|
|
3970
|
-
|
|
4106
|
+
document.loaded = true;
|
|
3971
4107
|
}
|
|
3972
4108
|
|
|
3973
4109
|
if (document.addEventListener) {
|