mack-javascript 0.8.2 → 0.8.3

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.
@@ -1,4225 +1,444 @@
1
- /* Prototype JavaScript framework, version 1.6.0.1
2
- * (c) 2005-2007 Sam Stephenson
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/
6
6
  *
7
7
  *--------------------------------------------------------------------------*/
8
8
 
9
- var Prototype = {
10
- Version: '1.6.0.1',
11
-
12
- Browser: {
13
- IE: !!(window.attachEvent && !window.opera),
14
- Opera: !!window.opera,
15
- WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
16
- Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
17
- MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
18
- },
19
-
20
- BrowserFeatures: {
21
- XPath: !!document.evaluate,
22
- ElementExtensions: !!window.HTMLElement,
23
- SpecificElementExtensions:
24
- document.createElement('div').__proto__ &&
25
- document.createElement('div').__proto__ !==
26
- document.createElement('form').__proto__
27
- },
28
-
29
- ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
30
- JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
31
-
32
- emptyFunction: function() { },
33
- K: function(x) { return x }
34
- };
35
-
36
- if (Prototype.Browser.MobileSafari)
37
- Prototype.BrowserFeatures.SpecificElementExtensions = false;
38
-
39
-
40
- /* Based on Alex Arnell's inheritance implementation. */
41
- var Class = {
42
- create: function() {
43
- var parent = null, properties = $A(arguments);
44
- if (Object.isFunction(properties[0]))
45
- parent = properties.shift();
46
-
47
- function klass() {
48
- this.initialize.apply(this, arguments);
49
- }
50
-
51
- Object.extend(klass, Class.Methods);
52
- klass.superclass = parent;
53
- klass.subclasses = [];
54
-
55
- if (parent) {
56
- var subclass = function() { };
57
- subclass.prototype = parent.prototype;
58
- klass.prototype = new subclass;
59
- parent.subclasses.push(klass);
60
- }
61
-
62
- for (var i = 0; i < properties.length; i++)
63
- klass.addMethods(properties[i]);
64
-
65
- if (!klass.prototype.initialize)
66
- klass.prototype.initialize = Prototype.emptyFunction;
67
-
68
- klass.prototype.constructor = klass;
69
-
70
- return klass;
71
- }
72
- };
73
-
74
- Class.Methods = {
75
- addMethods: function(source) {
76
- var ancestor = this.superclass && this.superclass.prototype;
77
- var properties = Object.keys(source);
78
-
79
- if (!Object.keys({ toString: true }).length)
80
- properties.push("toString", "valueOf");
81
-
82
- for (var i = 0, length = properties.length; i < length; i++) {
83
- var property = properties[i], value = source[property];
84
- if (ancestor && Object.isFunction(value) &&
85
- value.argumentNames().first() == "$super") {
86
- var method = value, value = Object.extend((function(m) {
87
- return function() { return ancestor[m].apply(this, arguments) };
88
- })(property).wrap(method), {
89
- valueOf: function() { return method },
90
- toString: function() { return method.toString() }
91
- });
92
- }
93
- this.prototype[property] = value;
94
- }
95
-
96
- return this;
97
- }
98
- };
99
-
100
- var Abstract = { };
101
-
102
- Object.extend = function(destination, source) {
103
- for (var property in source)
104
- destination[property] = source[property];
105
- return destination;
106
- };
107
-
108
- Object.extend(Object, {
109
- inspect: function(object) {
110
- try {
111
- if (Object.isUndefined(object)) return 'undefined';
112
- if (object === null) return 'null';
113
- return object.inspect ? object.inspect() : object.toString();
114
- } catch (e) {
115
- if (e instanceof RangeError) return '...';
116
- throw e;
117
- }
118
- },
119
-
120
- toJSON: function(object) {
121
- var type = typeof object;
122
- switch (type) {
123
- case 'undefined':
124
- case 'function':
125
- case 'unknown': return;
126
- case 'boolean': return object.toString();
127
- }
128
-
129
- if (object === null) return 'null';
130
- if (object.toJSON) return object.toJSON();
131
- if (Object.isElement(object)) return;
132
-
133
- var results = [];
134
- for (var property in object) {
135
- var value = Object.toJSON(object[property]);
136
- if (!Object.isUndefined(value))
137
- results.push(property.toJSON() + ': ' + value);
138
- }
139
-
140
- return '{' + results.join(', ') + '}';
141
- },
142
-
143
- toQueryString: function(object) {
144
- return $H(object).toQueryString();
145
- },
146
-
147
- toHTML: function(object) {
148
- return object && object.toHTML ? object.toHTML() : String.interpret(object);
149
- },
150
-
151
- keys: function(object) {
152
- var keys = [];
153
- for (var property in object)
154
- keys.push(property);
155
- return keys;
156
- },
157
-
158
- values: function(object) {
159
- var values = [];
160
- for (var property in object)
161
- values.push(object[property]);
162
- return values;
163
- },
164
-
165
- clone: function(object) {
166
- return Object.extend({ }, object);
167
- },
168
-
169
- isElement: function(object) {
170
- return object && object.nodeType == 1;
171
- },
172
-
173
- isArray: function(object) {
174
- return object && object.constructor === Array;
175
- },
176
-
177
- isHash: function(object) {
178
- return object instanceof Hash;
179
- },
180
-
181
- isFunction: function(object) {
182
- return typeof object == "function";
183
- },
184
-
185
- isString: function(object) {
186
- return typeof object == "string";
187
- },
188
-
189
- isNumber: function(object) {
190
- return typeof object == "number";
191
- },
192
-
193
- isUndefined: function(object) {
194
- return typeof object == "undefined";
195
- }
196
- });
197
-
198
- Object.extend(Function.prototype, {
199
- argumentNames: function() {
200
- var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
201
- return names.length == 1 && !names[0] ? [] : names;
202
- },
203
-
204
- bind: function() {
205
- if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
206
- var __method = this, args = $A(arguments), object = args.shift();
207
- return function() {
208
- return __method.apply(object, args.concat($A(arguments)));
209
- }
210
- },
211
-
212
- bindAsEventListener: function() {
213
- var __method = this, args = $A(arguments), object = args.shift();
214
- return function(event) {
215
- return __method.apply(object, [event || window.event].concat(args));
216
- }
217
- },
218
-
219
- curry: function() {
220
- if (!arguments.length) return this;
221
- var __method = this, args = $A(arguments);
222
- return function() {
223
- return __method.apply(this, args.concat($A(arguments)));
224
- }
225
- },
226
-
227
- delay: function() {
228
- var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
229
- return window.setTimeout(function() {
230
- return __method.apply(__method, args);
231
- }, timeout);
232
- },
233
-
234
- wrap: function(wrapper) {
235
- var __method = this;
236
- return function() {
237
- return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
238
- }
239
- },
240
-
241
- methodize: function() {
242
- if (this._methodized) return this._methodized;
243
- var __method = this;
244
- return this._methodized = function() {
245
- return __method.apply(null, [this].concat($A(arguments)));
246
- };
247
- }
248
- });
249
-
250
- Function.prototype.defer = Function.prototype.delay.curry(0.01);
251
-
252
- Date.prototype.toJSON = function() {
253
- return '"' + this.getUTCFullYear() + '-' +
254
- (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
255
- this.getUTCDate().toPaddedString(2) + 'T' +
256
- this.getUTCHours().toPaddedString(2) + ':' +
257
- this.getUTCMinutes().toPaddedString(2) + ':' +
258
- this.getUTCSeconds().toPaddedString(2) + 'Z"';
259
- };
260
-
261
- var Try = {
262
- these: function() {
263
- var returnValue;
264
-
265
- for (var i = 0, length = arguments.length; i < length; i++) {
266
- var lambda = arguments[i];
267
- try {
268
- returnValue = lambda();
269
- break;
270
- } catch (e) { }
271
- }
272
-
273
- return returnValue;
274
- }
275
- };
276
-
277
- RegExp.prototype.match = RegExp.prototype.test;
278
-
279
- RegExp.escape = function(str) {
280
- return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
281
- };
282
-
283
- /*--------------------------------------------------------------------------*/
284
-
285
- var PeriodicalExecuter = Class.create({
286
- initialize: function(callback, frequency) {
287
- this.callback = callback;
288
- this.frequency = frequency;
289
- this.currentlyExecuting = false;
290
-
291
- this.registerCallback();
292
- },
293
-
294
- registerCallback: function() {
295
- this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
296
- },
297
-
298
- execute: function() {
299
- this.callback(this);
300
- },
301
-
302
- stop: function() {
303
- if (!this.timer) return;
304
- clearInterval(this.timer);
305
- this.timer = null;
306
- },
307
-
308
- onTimerEvent: function() {
309
- if (!this.currentlyExecuting) {
310
- try {
311
- this.currentlyExecuting = true;
312
- this.execute();
313
- } finally {
314
- this.currentlyExecuting = false;
315
- }
316
- }
317
- }
318
- });
319
- Object.extend(String, {
320
- interpret: function(value) {
321
- return value == null ? '' : String(value);
322
- },
323
- specialChar: {
324
- '\b': '\\b',
325
- '\t': '\\t',
326
- '\n': '\\n',
327
- '\f': '\\f',
328
- '\r': '\\r',
329
- '\\': '\\\\'
330
- }
331
- });
332
-
333
- Object.extend(String.prototype, {
334
- gsub: function(pattern, replacement) {
335
- var result = '', source = this, match;
336
- replacement = arguments.callee.prepareReplacement(replacement);
337
-
338
- while (source.length > 0) {
339
- if (match = source.match(pattern)) {
340
- result += source.slice(0, match.index);
341
- result += String.interpret(replacement(match));
342
- source = source.slice(match.index + match[0].length);
343
- } else {
344
- result += source, source = '';
345
- }
346
- }
347
- return result;
348
- },
349
-
350
- sub: function(pattern, replacement, count) {
351
- replacement = this.gsub.prepareReplacement(replacement);
352
- count = Object.isUndefined(count) ? 1 : count;
353
-
354
- return this.gsub(pattern, function(match) {
355
- if (--count < 0) return match[0];
356
- return replacement(match);
357
- });
358
- },
359
-
360
- scan: function(pattern, iterator) {
361
- this.gsub(pattern, iterator);
362
- return String(this);
363
- },
364
-
365
- truncate: function(length, truncation) {
366
- length = length || 30;
367
- truncation = Object.isUndefined(truncation) ? '...' : truncation;
368
- return this.length > length ?
369
- this.slice(0, length - truncation.length) + truncation : String(this);
370
- },
371
-
372
- strip: function() {
373
- return this.replace(/^\s+/, '').replace(/\s+$/, '');
374
- },
375
-
376
- stripTags: function() {
377
- return this.replace(/<\/?[^>]+>/gi, '');
378
- },
379
-
380
- stripScripts: function() {
381
- return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
382
- },
383
-
384
- extractScripts: function() {
385
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
386
- var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
387
- return (this.match(matchAll) || []).map(function(scriptTag) {
388
- return (scriptTag.match(matchOne) || ['', ''])[1];
389
- });
390
- },
391
-
392
- evalScripts: function() {
393
- return this.extractScripts().map(function(script) { return eval(script) });
394
- },
395
-
396
- escapeHTML: function() {
397
- var self = arguments.callee;
398
- self.text.data = this;
399
- return self.div.innerHTML;
400
- },
401
-
402
- unescapeHTML: function() {
403
- var div = new Element('div');
404
- div.innerHTML = this.stripTags();
405
- return div.childNodes[0] ? (div.childNodes.length > 1 ?
406
- $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
407
- div.childNodes[0].nodeValue) : '';
408
- },
409
-
410
- toQueryParams: function(separator) {
411
- var match = this.strip().match(/([^?#]*)(#.*)?$/);
412
- if (!match) return { };
413
-
414
- return match[1].split(separator || '&').inject({ }, function(hash, pair) {
415
- if ((pair = pair.split('='))[0]) {
416
- var key = decodeURIComponent(pair.shift());
417
- var value = pair.length > 1 ? pair.join('=') : pair[0];
418
- if (value != undefined) value = decodeURIComponent(value);
419
-
420
- if (key in hash) {
421
- if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
422
- hash[key].push(value);
423
- }
424
- else hash[key] = value;
425
- }
426
- return hash;
427
- });
428
- },
429
-
430
- toArray: function() {
431
- return this.split('');
432
- },
433
-
434
- succ: function() {
435
- return this.slice(0, this.length - 1) +
436
- String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
437
- },
438
-
439
- times: function(count) {
440
- return count < 1 ? '' : new Array(count + 1).join(this);
441
- },
442
-
443
- camelize: function() {
444
- var parts = this.split('-'), len = parts.length;
445
- if (len == 1) return parts[0];
446
-
447
- var camelized = this.charAt(0) == '-'
448
- ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
449
- : parts[0];
450
-
451
- for (var i = 1; i < len; i++)
452
- camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
453
-
454
- return camelized;
455
- },
456
-
457
- capitalize: function() {
458
- return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
459
- },
460
-
461
- underscore: function() {
462
- return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
463
- },
464
-
465
- dasherize: function() {
466
- return this.gsub(/_/,'-');
467
- },
468
-
469
- inspect: function(useDoubleQuotes) {
470
- var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
471
- var character = String.specialChar[match[0]];
472
- return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
473
- });
474
- if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
475
- return "'" + escapedString.replace(/'/g, '\\\'') + "'";
476
- },
477
-
478
- toJSON: function() {
479
- return this.inspect(true);
480
- },
481
-
482
- unfilterJSON: function(filter) {
483
- return this.sub(filter || Prototype.JSONFilter, '#{1}');
484
- },
485
-
486
- isJSON: function() {
487
- var str = this;
488
- if (str.blank()) return false;
489
- str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
490
- return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
491
- },
492
-
493
- evalJSON: function(sanitize) {
494
- var json = this.unfilterJSON();
495
- try {
496
- if (!sanitize || json.isJSON()) return eval('(' + json + ')');
497
- } catch (e) { }
498
- throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
499
- },
500
-
501
- include: function(pattern) {
502
- return this.indexOf(pattern) > -1;
503
- },
504
-
505
- startsWith: function(pattern) {
506
- return this.indexOf(pattern) === 0;
507
- },
508
-
509
- endsWith: function(pattern) {
510
- var d = this.length - pattern.length;
511
- return d >= 0 && this.lastIndexOf(pattern) === d;
512
- },
513
-
514
- empty: function() {
515
- return this == '';
516
- },
517
-
518
- blank: function() {
519
- return /^\s*$/.test(this);
520
- },
521
-
522
- interpolate: function(object, pattern) {
523
- return new Template(this, pattern).evaluate(object);
524
- }
525
- });
526
-
527
- if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
528
- escapeHTML: function() {
529
- return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
530
- },
531
- unescapeHTML: function() {
532
- return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
533
- }
534
- });
535
-
536
- String.prototype.gsub.prepareReplacement = function(replacement) {
537
- if (Object.isFunction(replacement)) return replacement;
538
- var template = new Template(replacement);
539
- return function(match) { return template.evaluate(match) };
540
- };
541
-
542
- String.prototype.parseQuery = String.prototype.toQueryParams;
543
-
544
- Object.extend(String.prototype.escapeHTML, {
545
- div: document.createElement('div'),
546
- text: document.createTextNode('')
547
- });
548
-
549
- with (String.prototype.escapeHTML) div.appendChild(text);
550
-
551
- var Template = Class.create({
552
- initialize: function(template, pattern) {
553
- this.template = template.toString();
554
- this.pattern = pattern || Template.Pattern;
555
- },
556
-
557
- evaluate: function(object) {
558
- if (Object.isFunction(object.toTemplateReplacements))
559
- object = object.toTemplateReplacements();
560
-
561
- return this.template.gsub(this.pattern, function(match) {
562
- if (object == null) return '';
563
-
564
- var before = match[1] || '';
565
- if (before == '\\') return match[2];
566
-
567
- var ctx = object, expr = match[3];
568
- var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
569
- match = pattern.exec(expr);
570
- if (match == null) return before;
571
-
572
- while (match != null) {
573
- var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
574
- ctx = ctx[comp];
575
- if (null == ctx || '' == match[3]) break;
576
- expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
577
- match = pattern.exec(expr);
578
- }
579
-
580
- return before + String.interpret(ctx);
581
- }.bind(this));
582
- }
583
- });
584
- Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
585
-
586
- var $break = { };
587
-
588
- var Enumerable = {
589
- each: function(iterator, context) {
590
- var index = 0;
591
- iterator = iterator.bind(context);
592
- try {
593
- this._each(function(value) {
594
- iterator(value, index++);
595
- });
596
- } catch (e) {
597
- if (e != $break) throw e;
598
- }
599
- return this;
600
- },
601
-
602
- eachSlice: function(number, iterator, context) {
603
- iterator = iterator ? iterator.bind(context) : Prototype.K;
604
- var index = -number, slices = [], array = this.toArray();
605
- while ((index += number) < array.length)
606
- slices.push(array.slice(index, index+number));
607
- return slices.collect(iterator, context);
608
- },
609
-
610
- all: function(iterator, context) {
611
- iterator = iterator ? iterator.bind(context) : Prototype.K;
612
- var result = true;
613
- this.each(function(value, index) {
614
- result = result && !!iterator(value, index);
615
- if (!result) throw $break;
616
- });
617
- return result;
618
- },
619
-
620
- any: function(iterator, context) {
621
- iterator = iterator ? iterator.bind(context) : Prototype.K;
622
- var result = false;
623
- this.each(function(value, index) {
624
- if (result = !!iterator(value, index))
625
- throw $break;
626
- });
627
- return result;
628
- },
629
-
630
- collect: function(iterator, context) {
631
- iterator = iterator ? iterator.bind(context) : Prototype.K;
632
- var results = [];
633
- this.each(function(value, index) {
634
- results.push(iterator(value, index));
635
- });
636
- return results;
637
- },
638
-
639
- detect: function(iterator, context) {
640
- iterator = iterator.bind(context);
641
- var result;
642
- this.each(function(value, index) {
643
- if (iterator(value, index)) {
644
- result = value;
645
- throw $break;
646
- }
647
- });
648
- return result;
649
- },
650
-
651
- findAll: function(iterator, context) {
652
- iterator = iterator.bind(context);
653
- var results = [];
654
- this.each(function(value, index) {
655
- if (iterator(value, index))
656
- results.push(value);
657
- });
658
- return results;
659
- },
660
-
661
- grep: function(filter, iterator, context) {
662
- iterator = iterator ? iterator.bind(context) : Prototype.K;
663
- var results = [];
664
-
665
- if (Object.isString(filter))
666
- filter = new RegExp(filter);
667
-
668
- this.each(function(value, index) {
669
- if (filter.match(value))
670
- results.push(iterator(value, index));
671
- });
672
- return results;
673
- },
674
-
675
- include: function(object) {
676
- if (Object.isFunction(this.indexOf))
677
- if (this.indexOf(object) != -1) return true;
678
-
679
- var found = false;
680
- this.each(function(value) {
681
- if (value == object) {
682
- found = true;
683
- throw $break;
684
- }
685
- });
686
- return found;
687
- },
688
-
689
- inGroupsOf: function(number, fillWith) {
690
- fillWith = Object.isUndefined(fillWith) ? null : fillWith;
691
- return this.eachSlice(number, function(slice) {
692
- while(slice.length < number) slice.push(fillWith);
693
- return slice;
694
- });
695
- },
696
-
697
- inject: function(memo, iterator, context) {
698
- iterator = iterator.bind(context);
699
- this.each(function(value, index) {
700
- memo = iterator(memo, value, index);
701
- });
702
- return memo;
703
- },
704
-
705
- invoke: function(method) {
706
- var args = $A(arguments).slice(1);
707
- return this.map(function(value) {
708
- return value[method].apply(value, args);
709
- });
710
- },
711
-
712
- max: function(iterator, context) {
713
- iterator = iterator ? iterator.bind(context) : Prototype.K;
714
- var result;
715
- this.each(function(value, index) {
716
- value = iterator(value, index);
717
- if (result == null || value >= result)
718
- result = value;
719
- });
720
- return result;
721
- },
722
-
723
- min: function(iterator, context) {
724
- iterator = iterator ? iterator.bind(context) : Prototype.K;
725
- var result;
726
- this.each(function(value, index) {
727
- value = iterator(value, index);
728
- if (result == null || value < result)
729
- result = value;
730
- });
731
- return result;
732
- },
733
-
734
- partition: function(iterator, context) {
735
- iterator = iterator ? iterator.bind(context) : Prototype.K;
736
- var trues = [], falses = [];
737
- this.each(function(value, index) {
738
- (iterator(value, index) ?
739
- trues : falses).push(value);
740
- });
741
- return [trues, falses];
742
- },
743
-
744
- pluck: function(property) {
745
- var results = [];
746
- this.each(function(value) {
747
- results.push(value[property]);
748
- });
749
- return results;
750
- },
751
-
752
- reject: function(iterator, context) {
753
- iterator = iterator.bind(context);
754
- var results = [];
755
- this.each(function(value, index) {
756
- if (!iterator(value, index))
757
- results.push(value);
758
- });
759
- return results;
760
- },
761
-
762
- sortBy: function(iterator, context) {
763
- iterator = iterator.bind(context);
764
- return this.map(function(value, index) {
765
- return {value: value, criteria: iterator(value, index)};
766
- }).sort(function(left, right) {
767
- var a = left.criteria, b = right.criteria;
768
- return a < b ? -1 : a > b ? 1 : 0;
769
- }).pluck('value');
770
- },
771
-
772
- toArray: function() {
773
- return this.map();
774
- },
775
-
776
- zip: function() {
777
- var iterator = Prototype.K, args = $A(arguments);
778
- if (Object.isFunction(args.last()))
779
- iterator = args.pop();
780
-
781
- var collections = [this].concat(args).map($A);
782
- return this.map(function(value, index) {
783
- return iterator(collections.pluck(index));
784
- });
785
- },
786
-
787
- size: function() {
788
- return this.toArray().length;
789
- },
790
-
791
- inspect: function() {
792
- return '#<Enumerable:' + this.toArray().inspect() + '>';
793
- }
794
- };
795
-
796
- Object.extend(Enumerable, {
797
- map: Enumerable.collect,
798
- find: Enumerable.detect,
799
- select: Enumerable.findAll,
800
- filter: Enumerable.findAll,
801
- member: Enumerable.include,
802
- entries: Enumerable.toArray,
803
- every: Enumerable.all,
804
- some: Enumerable.any
805
- });
806
- function $A(iterable) {
807
- if (!iterable) return [];
808
- if (iterable.toArray) return iterable.toArray();
809
- var length = iterable.length, results = new Array(length);
810
- while (length--) results[length] = iterable[length];
811
- return results;
812
- }
813
-
814
- if (Prototype.Browser.WebKit) {
815
- function $A(iterable) {
816
- if (!iterable) return [];
817
- if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
818
- iterable.toArray) return iterable.toArray();
819
- var length = iterable.length, results = new Array(length);
820
- while (length--) results[length] = iterable[length];
821
- return results;
822
- }
823
- }
824
-
825
- Array.from = $A;
826
-
827
- Object.extend(Array.prototype, Enumerable);
828
-
829
- if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
830
-
831
- Object.extend(Array.prototype, {
832
- _each: function(iterator) {
833
- for (var i = 0, length = this.length; i < length; i++)
834
- iterator(this[i]);
835
- },
836
-
837
- clear: function() {
838
- this.length = 0;
839
- return this;
840
- },
841
-
842
- first: function() {
843
- return this[0];
844
- },
845
-
846
- last: function() {
847
- return this[this.length - 1];
848
- },
849
-
850
- compact: function() {
851
- return this.select(function(value) {
852
- return value != null;
853
- });
854
- },
855
-
856
- flatten: function() {
857
- return this.inject([], function(array, value) {
858
- return array.concat(Object.isArray(value) ?
859
- value.flatten() : [value]);
860
- });
861
- },
862
-
863
- without: function() {
864
- var values = $A(arguments);
865
- return this.select(function(value) {
866
- return !values.include(value);
867
- });
868
- },
869
-
870
- reverse: function(inline) {
871
- return (inline !== false ? this : this.toArray())._reverse();
872
- },
873
-
874
- reduce: function() {
875
- return this.length > 1 ? this : this[0];
876
- },
877
-
878
- uniq: function(sorted) {
879
- return this.inject([], function(array, value, index) {
880
- if (0 == index || (sorted ? array.last() != value : !array.include(value)))
881
- array.push(value);
882
- return array;
883
- });
884
- },
885
-
886
- intersect: function(array) {
887
- return this.uniq().findAll(function(item) {
888
- return array.detect(function(value) { return item === value });
889
- });
890
- },
891
-
892
- clone: function() {
893
- return [].concat(this);
894
- },
895
-
896
- size: function() {
897
- return this.length;
898
- },
899
-
900
- inspect: function() {
901
- return '[' + this.map(Object.inspect).join(', ') + ']';
902
- },
903
-
904
- toJSON: function() {
905
- var results = [];
906
- this.each(function(object) {
907
- var value = Object.toJSON(object);
908
- if (!Object.isUndefined(value)) results.push(value);
909
- });
910
- return '[' + results.join(', ') + ']';
911
- }
912
- });
913
-
914
- // use native browser JS 1.6 implementation if available
915
- if (Object.isFunction(Array.prototype.forEach))
916
- Array.prototype._each = Array.prototype.forEach;
917
-
918
- if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
919
- i || (i = 0);
920
- var length = this.length;
921
- if (i < 0) i = length + i;
922
- for (; i < length; i++)
923
- if (this[i] === item) return i;
924
- return -1;
925
- };
926
-
927
- if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
928
- i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
929
- var n = this.slice(0, i).reverse().indexOf(item);
930
- return (n < 0) ? n : i - n - 1;
931
- };
932
-
933
- Array.prototype.toArray = Array.prototype.clone;
934
-
935
- function $w(string) {
936
- if (!Object.isString(string)) return [];
937
- string = string.strip();
938
- return string ? string.split(/\s+/) : [];
939
- }
940
-
941
- if (Prototype.Browser.Opera){
942
- Array.prototype.concat = function() {
943
- var array = [];
944
- for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
945
- for (var i = 0, length = arguments.length; i < length; i++) {
946
- if (Object.isArray(arguments[i])) {
947
- for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
948
- array.push(arguments[i][j]);
949
- } else {
950
- array.push(arguments[i]);
951
- }
952
- }
953
- return array;
954
- };
955
- }
956
- Object.extend(Number.prototype, {
957
- toColorPart: function() {
958
- return this.toPaddedString(2, 16);
959
- },
960
-
961
- succ: function() {
962
- return this + 1;
963
- },
964
-
965
- times: function(iterator) {
966
- $R(0, this, true).each(iterator);
967
- return this;
968
- },
969
-
970
- toPaddedString: function(length, radix) {
971
- var string = this.toString(radix || 10);
972
- return '0'.times(length - string.length) + string;
973
- },
974
-
975
- toJSON: function() {
976
- return isFinite(this) ? this.toString() : 'null';
977
- }
978
- });
979
-
980
- $w('abs round ceil floor').each(function(method){
981
- Number.prototype[method] = Math[method].methodize();
982
- });
983
- function $H(object) {
984
- return new Hash(object);
985
- };
986
-
987
- var Hash = Class.create(Enumerable, (function() {
988
-
989
- function toQueryPair(key, value) {
990
- if (Object.isUndefined(value)) return key;
991
- return key + '=' + encodeURIComponent(String.interpret(value));
992
- }
993
-
994
- return {
995
- initialize: function(object) {
996
- this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
997
- },
998
-
999
- _each: function(iterator) {
1000
- for (var key in this._object) {
1001
- var value = this._object[key], pair = [key, value];
1002
- pair.key = key;
1003
- pair.value = value;
1004
- iterator(pair);
1005
- }
1006
- },
1007
-
1008
- set: function(key, value) {
1009
- return this._object[key] = value;
1010
- },
1011
-
1012
- get: function(key) {
1013
- return this._object[key];
1014
- },
1015
-
1016
- unset: function(key) {
1017
- var value = this._object[key];
1018
- delete this._object[key];
1019
- return value;
1020
- },
1021
-
1022
- toObject: function() {
1023
- return Object.clone(this._object);
1024
- },
1025
-
1026
- keys: function() {
1027
- return this.pluck('key');
1028
- },
1029
-
1030
- values: function() {
1031
- return this.pluck('value');
1032
- },
1033
-
1034
- index: function(value) {
1035
- var match = this.detect(function(pair) {
1036
- return pair.value === value;
1037
- });
1038
- return match && match.key;
1039
- },
1040
-
1041
- merge: function(object) {
1042
- return this.clone().update(object);
1043
- },
1044
-
1045
- update: function(object) {
1046
- return new Hash(object).inject(this, function(result, pair) {
1047
- result.set(pair.key, pair.value);
1048
- return result;
1049
- });
1050
- },
1051
-
1052
- toQueryString: function() {
1053
- return this.map(function(pair) {
1054
- var key = encodeURIComponent(pair.key), values = pair.value;
1055
-
1056
- if (values && typeof values == 'object') {
1057
- if (Object.isArray(values))
1058
- return values.map(toQueryPair.curry(key)).join('&');
1059
- }
1060
- return toQueryPair(key, values);
1061
- }).join('&');
1062
- },
1063
-
1064
- inspect: function() {
1065
- return '#<Hash:{' + this.map(function(pair) {
1066
- return pair.map(Object.inspect).join(': ');
1067
- }).join(', ') + '}>';
1068
- },
1069
-
1070
- toJSON: function() {
1071
- return Object.toJSON(this.toObject());
1072
- },
1073
-
1074
- clone: function() {
1075
- return new Hash(this);
1076
- }
1077
- }
1078
- })());
1079
-
1080
- Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
1081
- Hash.from = $H;
1082
- var ObjectRange = Class.create(Enumerable, {
1083
- initialize: function(start, end, exclusive) {
1084
- this.start = start;
1085
- this.end = end;
1086
- this.exclusive = exclusive;
1087
- },
1088
-
1089
- _each: function(iterator) {
1090
- var value = this.start;
1091
- while (this.include(value)) {
1092
- iterator(value);
1093
- value = value.succ();
1094
- }
1095
- },
1096
-
1097
- include: function(value) {
1098
- if (value < this.start)
1099
- return false;
1100
- if (this.exclusive)
1101
- return value < this.end;
1102
- return value <= this.end;
1103
- }
1104
- });
1105
-
1106
- var $R = function(start, end, exclusive) {
1107
- return new ObjectRange(start, end, exclusive);
1108
- };
1109
-
1110
- var Ajax = {
1111
- getTransport: function() {
1112
- return Try.these(
1113
- function() {return new XMLHttpRequest()},
1114
- function() {return new ActiveXObject('Msxml2.XMLHTTP')},
1115
- function() {return new ActiveXObject('Microsoft.XMLHTTP')}
1116
- ) || false;
1117
- },
1118
-
1119
- activeRequestCount: 0
1120
- };
1121
-
1122
- Ajax.Responders = {
1123
- responders: [],
1124
-
1125
- _each: function(iterator) {
1126
- this.responders._each(iterator);
1127
- },
1128
-
1129
- register: function(responder) {
1130
- if (!this.include(responder))
1131
- this.responders.push(responder);
1132
- },
1133
-
1134
- unregister: function(responder) {
1135
- this.responders = this.responders.without(responder);
1136
- },
1137
-
1138
- dispatch: function(callback, request, transport, json) {
1139
- this.each(function(responder) {
1140
- if (Object.isFunction(responder[callback])) {
1141
- try {
1142
- responder[callback].apply(responder, [request, transport, json]);
1143
- } catch (e) { }
1144
- }
1145
- });
1146
- }
1147
- };
1148
-
1149
- Object.extend(Ajax.Responders, Enumerable);
1150
-
1151
- Ajax.Responders.register({
1152
- onCreate: function() { Ajax.activeRequestCount++ },
1153
- onComplete: function() { Ajax.activeRequestCount-- }
1154
- });
1155
-
1156
- Ajax.Base = Class.create({
1157
- initialize: function(options) {
1158
- this.options = {
1159
- method: 'post',
1160
- asynchronous: true,
1161
- contentType: 'application/x-www-form-urlencoded',
1162
- encoding: 'UTF-8',
1163
- parameters: '',
1164
- evalJSON: true,
1165
- evalJS: true
1166
- };
1167
- Object.extend(this.options, options || { });
1168
-
1169
- this.options.method = this.options.method.toLowerCase();
1170
-
1171
- if (Object.isString(this.options.parameters))
1172
- this.options.parameters = this.options.parameters.toQueryParams();
1173
- else if (Object.isHash(this.options.parameters))
1174
- this.options.parameters = this.options.parameters.toObject();
1175
- }
1176
- });
1177
-
1178
- Ajax.Request = Class.create(Ajax.Base, {
1179
- _complete: false,
1180
-
1181
- initialize: function($super, url, options) {
1182
- $super(options);
1183
- this.transport = Ajax.getTransport();
1184
- this.request(url);
1185
- },
1186
-
1187
- request: function(url) {
1188
- this.url = url;
1189
- this.method = this.options.method;
1190
- var params = Object.clone(this.options.parameters);
1191
-
1192
- if (!['get', 'post'].include(this.method)) {
1193
- // simulate other verbs over post
1194
- params['_method'] = this.method;
1195
- this.method = 'post';
1196
- }
1197
-
1198
- this.parameters = params;
1199
-
1200
- if (params = Object.toQueryString(params)) {
1201
- // when GET, append parameters to URL
1202
- if (this.method == 'get')
1203
- this.url += (this.url.include('?') ? '&' : '?') + params;
1204
- else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
1205
- params += '&_=';
1206
- }
1207
-
1208
- try {
1209
- var response = new Ajax.Response(this);
1210
- if (this.options.onCreate) this.options.onCreate(response);
1211
- Ajax.Responders.dispatch('onCreate', this, response);
1212
-
1213
- this.transport.open(this.method.toUpperCase(), this.url,
1214
- this.options.asynchronous);
1215
-
1216
- if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
1217
-
1218
- this.transport.onreadystatechange = this.onStateChange.bind(this);
1219
- this.setRequestHeaders();
1220
-
1221
- this.body = this.method == 'post' ? (this.options.postBody || params) : null;
1222
- this.transport.send(this.body);
1223
-
1224
- /* Force Firefox to handle ready state 4 for synchronous requests */
1225
- if (!this.options.asynchronous && this.transport.overrideMimeType)
1226
- this.onStateChange();
1227
-
1228
- }
1229
- catch (e) {
1230
- this.dispatchException(e);
1231
- }
1232
- },
1233
-
1234
- onStateChange: function() {
1235
- var readyState = this.transport.readyState;
1236
- if (readyState > 1 && !((readyState == 4) && this._complete))
1237
- this.respondToReadyState(this.transport.readyState);
1238
- },
1239
-
1240
- setRequestHeaders: function() {
1241
- var headers = {
1242
- 'X-Requested-With': 'XMLHttpRequest',
1243
- 'X-Prototype-Version': Prototype.Version,
1244
- 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
1245
- };
1246
-
1247
- if (this.method == 'post') {
1248
- headers['Content-type'] = this.options.contentType +
1249
- (this.options.encoding ? '; charset=' + this.options.encoding : '');
1250
-
1251
- /* Force "Connection: close" for older Mozilla browsers to work
1252
- * around a bug where XMLHttpRequest sends an incorrect
1253
- * Content-length header. See Mozilla Bugzilla #246651.
1254
- */
1255
- if (this.transport.overrideMimeType &&
1256
- (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
1257
- headers['Connection'] = 'close';
1258
- }
1259
-
1260
- // user-defined headers
1261
- if (typeof this.options.requestHeaders == 'object') {
1262
- var extras = this.options.requestHeaders;
1263
-
1264
- if (Object.isFunction(extras.push))
1265
- for (var i = 0, length = extras.length; i < length; i += 2)
1266
- headers[extras[i]] = extras[i+1];
1267
- else
1268
- $H(extras).each(function(pair) { headers[pair.key] = pair.value });
1269
- }
1270
-
1271
- for (var name in headers)
1272
- this.transport.setRequestHeader(name, headers[name]);
1273
- },
1274
-
1275
- success: function() {
1276
- var status = this.getStatus();
1277
- return !status || (status >= 200 && status < 300);
1278
- },
1279
-
1280
- getStatus: function() {
1281
- try {
1282
- return this.transport.status || 0;
1283
- } catch (e) { return 0 }
1284
- },
1285
-
1286
- respondToReadyState: function(readyState) {
1287
- var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
1288
-
1289
- if (state == 'Complete') {
1290
- try {
1291
- this._complete = true;
1292
- (this.options['on' + response.status]
1293
- || this.options['on' + (this.success() ? 'Success' : 'Failure')]
1294
- || Prototype.emptyFunction)(response, response.headerJSON);
1295
- } catch (e) {
1296
- this.dispatchException(e);
1297
- }
1298
-
1299
- var contentType = response.getHeader('Content-type');
1300
- if (this.options.evalJS == 'force'
1301
- || (this.options.evalJS && contentType
1302
- && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
1303
- this.evalResponse();
1304
- }
1305
-
1306
- try {
1307
- (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
1308
- Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
1309
- } catch (e) {
1310
- this.dispatchException(e);
1311
- }
1312
-
1313
- if (state == 'Complete') {
1314
- // avoid memory leak in MSIE: clean up
1315
- this.transport.onreadystatechange = Prototype.emptyFunction;
1316
- }
1317
- },
1318
-
1319
- getHeader: function(name) {
1320
- try {
1321
- return this.transport.getResponseHeader(name);
1322
- } catch (e) { return null }
1323
- },
1324
-
1325
- evalResponse: function() {
1326
- try {
1327
- return eval((this.transport.responseText || '').unfilterJSON());
1328
- } catch (e) {
1329
- this.dispatchException(e);
1330
- }
1331
- },
1332
-
1333
- dispatchException: function(exception) {
1334
- (this.options.onException || Prototype.emptyFunction)(this, exception);
1335
- Ajax.Responders.dispatch('onException', this, exception);
1336
- }
1337
- });
1338
-
1339
- Ajax.Request.Events =
1340
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
1341
-
1342
- Ajax.Response = Class.create({
1343
- initialize: function(request){
1344
- this.request = request;
1345
- var transport = this.transport = request.transport,
1346
- readyState = this.readyState = transport.readyState;
1347
-
1348
- if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
1349
- this.status = this.getStatus();
1350
- this.statusText = this.getStatusText();
1351
- this.responseText = String.interpret(transport.responseText);
1352
- this.headerJSON = this._getHeaderJSON();
1353
- }
1354
-
1355
- if(readyState == 4) {
1356
- var xml = transport.responseXML;
1357
- this.responseXML = Object.isUndefined(xml) ? null : xml;
1358
- this.responseJSON = this._getResponseJSON();
1359
- }
1360
- },
1361
-
1362
- status: 0,
1363
- statusText: '',
1364
-
1365
- getStatus: Ajax.Request.prototype.getStatus,
1366
-
1367
- getStatusText: function() {
1368
- try {
1369
- return this.transport.statusText || '';
1370
- } catch (e) { return '' }
1371
- },
1372
-
1373
- getHeader: Ajax.Request.prototype.getHeader,
1374
-
1375
- getAllHeaders: function() {
1376
- try {
1377
- return this.getAllResponseHeaders();
1378
- } catch (e) { return null }
1379
- },
1380
-
1381
- getResponseHeader: function(name) {
1382
- return this.transport.getResponseHeader(name);
1383
- },
1384
-
1385
- getAllResponseHeaders: function() {
1386
- return this.transport.getAllResponseHeaders();
1387
- },
1388
-
1389
- _getHeaderJSON: function() {
1390
- var json = this.getHeader('X-JSON');
1391
- if (!json) return null;
1392
- json = decodeURIComponent(escape(json));
1393
- try {
1394
- return json.evalJSON(this.request.options.sanitizeJSON);
1395
- } catch (e) {
1396
- this.request.dispatchException(e);
1397
- }
1398
- },
1399
-
1400
- _getResponseJSON: function() {
1401
- var options = this.request.options;
1402
- if (!options.evalJSON || (options.evalJSON != 'force' &&
1403
- !(this.getHeader('Content-type') || '').include('application/json')) ||
1404
- this.responseText.blank())
1405
- return null;
1406
- try {
1407
- return this.responseText.evalJSON(options.sanitizeJSON);
1408
- } catch (e) {
1409
- this.request.dispatchException(e);
1410
- }
1411
- }
1412
- });
1413
-
1414
- Ajax.Updater = Class.create(Ajax.Request, {
1415
- initialize: function($super, container, url, options) {
1416
- this.container = {
1417
- success: (container.success || container),
1418
- failure: (container.failure || (container.success ? null : container))
1419
- };
1420
-
1421
- options = Object.clone(options);
1422
- var onComplete = options.onComplete;
1423
- options.onComplete = (function(response, json) {
1424
- this.updateContent(response.responseText);
1425
- if (Object.isFunction(onComplete)) onComplete(response, json);
1426
- }).bind(this);
1427
-
1428
- $super(url, options);
1429
- },
1430
-
1431
- updateContent: function(responseText) {
1432
- var receiver = this.container[this.success() ? 'success' : 'failure'],
1433
- options = this.options;
1434
-
1435
- if (!options.evalScripts) responseText = responseText.stripScripts();
1436
-
1437
- if (receiver = $(receiver)) {
1438
- if (options.insertion) {
1439
- if (Object.isString(options.insertion)) {
1440
- var insertion = { }; insertion[options.insertion] = responseText;
1441
- receiver.insert(insertion);
1442
- }
1443
- else options.insertion(receiver, responseText);
1444
- }
1445
- else receiver.update(responseText);
1446
- }
1447
- }
1448
- });
1449
-
1450
- Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
1451
- initialize: function($super, container, url, options) {
1452
- $super(options);
1453
- this.onComplete = this.options.onComplete;
1454
-
1455
- this.frequency = (this.options.frequency || 2);
1456
- this.decay = (this.options.decay || 1);
1457
-
1458
- this.updater = { };
1459
- this.container = container;
1460
- this.url = url;
1461
-
1462
- this.start();
1463
- },
1464
-
1465
- start: function() {
1466
- this.options.onComplete = this.updateComplete.bind(this);
1467
- this.onTimerEvent();
1468
- },
1469
-
1470
- stop: function() {
1471
- this.updater.options.onComplete = undefined;
1472
- clearTimeout(this.timer);
1473
- (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
1474
- },
1475
-
1476
- updateComplete: function(response) {
1477
- if (this.options.decay) {
1478
- this.decay = (response.responseText == this.lastText ?
1479
- this.decay * this.options.decay : 1);
1480
-
1481
- this.lastText = response.responseText;
1482
- }
1483
- this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
1484
- },
1485
-
1486
- onTimerEvent: function() {
1487
- this.updater = new Ajax.Updater(this.container, this.url, this.options);
1488
- }
1489
- });
1490
- function $(element) {
1491
- if (arguments.length > 1) {
1492
- for (var i = 0, elements = [], length = arguments.length; i < length; i++)
1493
- elements.push($(arguments[i]));
1494
- return elements;
1495
- }
1496
- if (Object.isString(element))
1497
- element = document.getElementById(element);
1498
- return Element.extend(element);
1499
- }
1500
-
1501
- if (Prototype.BrowserFeatures.XPath) {
1502
- document._getElementsByXPath = function(expression, parentElement) {
1503
- var results = [];
1504
- var query = document.evaluate(expression, $(parentElement) || document,
1505
- null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
1506
- for (var i = 0, length = query.snapshotLength; i < length; i++)
1507
- results.push(Element.extend(query.snapshotItem(i)));
1508
- return results;
1509
- };
1510
- }
1511
-
1512
- /*--------------------------------------------------------------------------*/
1513
-
1514
- if (!window.Node) var Node = { };
1515
-
1516
- if (!Node.ELEMENT_NODE) {
1517
- // DOM level 2 ECMAScript Language Binding
1518
- Object.extend(Node, {
1519
- ELEMENT_NODE: 1,
1520
- ATTRIBUTE_NODE: 2,
1521
- TEXT_NODE: 3,
1522
- CDATA_SECTION_NODE: 4,
1523
- ENTITY_REFERENCE_NODE: 5,
1524
- ENTITY_NODE: 6,
1525
- PROCESSING_INSTRUCTION_NODE: 7,
1526
- COMMENT_NODE: 8,
1527
- DOCUMENT_NODE: 9,
1528
- DOCUMENT_TYPE_NODE: 10,
1529
- DOCUMENT_FRAGMENT_NODE: 11,
1530
- NOTATION_NODE: 12
1531
- });
1532
- }
1533
-
1534
- (function() {
1535
- var element = this.Element;
1536
- this.Element = function(tagName, attributes) {
1537
- attributes = attributes || { };
1538
- tagName = tagName.toLowerCase();
1539
- var cache = Element.cache;
1540
- if (Prototype.Browser.IE && attributes.name) {
1541
- tagName = '<' + tagName + ' name="' + attributes.name + '">';
1542
- delete attributes.name;
1543
- return Element.writeAttribute(document.createElement(tagName), attributes);
1544
- }
1545
- if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
1546
- return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
1547
- };
1548
- Object.extend(this.Element, element || { });
1549
- }).call(window);
1550
-
1551
- Element.cache = { };
1552
-
1553
- Element.Methods = {
1554
- visible: function(element) {
1555
- return $(element).style.display != 'none';
1556
- },
1557
-
1558
- toggle: function(element) {
1559
- element = $(element);
1560
- Element[Element.visible(element) ? 'hide' : 'show'](element);
1561
- return element;
1562
- },
1563
-
1564
- hide: function(element) {
1565
- $(element).style.display = 'none';
1566
- return element;
1567
- },
1568
-
1569
- show: function(element) {
1570
- $(element).style.display = '';
1571
- return element;
1572
- },
1573
-
1574
- remove: function(element) {
1575
- element = $(element);
1576
- element.parentNode.removeChild(element);
1577
- return element;
1578
- },
1579
-
1580
- update: function(element, content) {
1581
- element = $(element);
1582
- if (content && content.toElement) content = content.toElement();
1583
- if (Object.isElement(content)) return element.update().insert(content);
1584
- content = Object.toHTML(content);
1585
- element.innerHTML = content.stripScripts();
1586
- content.evalScripts.bind(content).defer();
1587
- return element;
1588
- },
1589
-
1590
- replace: function(element, content) {
1591
- element = $(element);
1592
- if (content && content.toElement) content = content.toElement();
1593
- else if (!Object.isElement(content)) {
1594
- content = Object.toHTML(content);
1595
- var range = element.ownerDocument.createRange();
1596
- range.selectNode(element);
1597
- content.evalScripts.bind(content).defer();
1598
- content = range.createContextualFragment(content.stripScripts());
1599
- }
1600
- element.parentNode.replaceChild(content, element);
1601
- return element;
1602
- },
1603
-
1604
- insert: function(element, insertions) {
1605
- element = $(element);
1606
-
1607
- if (Object.isString(insertions) || Object.isNumber(insertions) ||
1608
- Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
1609
- insertions = {bottom:insertions};
1610
-
1611
- var content, t, range;
1612
-
1613
- for (position in insertions) {
1614
- content = insertions[position];
1615
- position = position.toLowerCase();
1616
- t = Element._insertionTranslations[position];
1617
-
1618
- if (content && content.toElement) content = content.toElement();
1619
- if (Object.isElement(content)) {
1620
- t.insert(element, content);
1621
- continue;
1622
- }
1623
-
1624
- content = Object.toHTML(content);
1625
-
1626
- range = element.ownerDocument.createRange();
1627
- t.initializeRange(element, range);
1628
- t.insert(element, range.createContextualFragment(content.stripScripts()));
1629
-
1630
- content.evalScripts.bind(content).defer();
1631
- }
1632
-
1633
- return element;
1634
- },
1635
-
1636
- wrap: function(element, wrapper, attributes) {
1637
- element = $(element);
1638
- if (Object.isElement(wrapper))
1639
- $(wrapper).writeAttribute(attributes || { });
1640
- else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
1641
- else wrapper = new Element('div', wrapper);
1642
- if (element.parentNode)
1643
- element.parentNode.replaceChild(wrapper, element);
1644
- wrapper.appendChild(element);
1645
- return wrapper;
1646
- },
1647
-
1648
- inspect: function(element) {
1649
- element = $(element);
1650
- var result = '<' + element.tagName.toLowerCase();
1651
- $H({'id': 'id', 'className': 'class'}).each(function(pair) {
1652
- var property = pair.first(), attribute = pair.last();
1653
- var value = (element[property] || '').toString();
1654
- if (value) result += ' ' + attribute + '=' + value.inspect(true);
1655
- });
1656
- return result + '>';
1657
- },
1658
-
1659
- recursivelyCollect: function(element, property) {
1660
- element = $(element);
1661
- var elements = [];
1662
- while (element = element[property])
1663
- if (element.nodeType == 1)
1664
- elements.push(Element.extend(element));
1665
- return elements;
1666
- },
1667
-
1668
- ancestors: function(element) {
1669
- return $(element).recursivelyCollect('parentNode');
1670
- },
1671
-
1672
- descendants: function(element) {
1673
- return $(element).getElementsBySelector("*");
1674
- },
1675
-
1676
- firstDescendant: function(element) {
1677
- element = $(element).firstChild;
1678
- while (element && element.nodeType != 1) element = element.nextSibling;
1679
- return $(element);
1680
- },
1681
-
1682
- immediateDescendants: function(element) {
1683
- if (!(element = $(element).firstChild)) return [];
1684
- while (element && element.nodeType != 1) element = element.nextSibling;
1685
- if (element) return [element].concat($(element).nextSiblings());
1686
- return [];
1687
- },
1688
-
1689
- previousSiblings: function(element) {
1690
- return $(element).recursivelyCollect('previousSibling');
1691
- },
1692
-
1693
- nextSiblings: function(element) {
1694
- return $(element).recursivelyCollect('nextSibling');
1695
- },
1696
-
1697
- siblings: function(element) {
1698
- element = $(element);
1699
- return element.previousSiblings().reverse().concat(element.nextSiblings());
1700
- },
1701
-
1702
- match: function(element, selector) {
1703
- if (Object.isString(selector))
1704
- selector = new Selector(selector);
1705
- return selector.match($(element));
1706
- },
1707
-
1708
- up: function(element, expression, index) {
1709
- element = $(element);
1710
- if (arguments.length == 1) return $(element.parentNode);
1711
- var ancestors = element.ancestors();
1712
- return expression ? Selector.findElement(ancestors, expression, index) :
1713
- ancestors[index || 0];
1714
- },
1715
-
1716
- down: function(element, expression, index) {
1717
- element = $(element);
1718
- if (arguments.length == 1) return element.firstDescendant();
1719
- var descendants = element.descendants();
1720
- return expression ? Selector.findElement(descendants, expression, index) :
1721
- descendants[index || 0];
1722
- },
1723
-
1724
- previous: function(element, expression, index) {
1725
- element = $(element);
1726
- if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
1727
- var previousSiblings = element.previousSiblings();
1728
- return expression ? Selector.findElement(previousSiblings, expression, index) :
1729
- previousSiblings[index || 0];
1730
- },
1731
-
1732
- next: function(element, expression, index) {
1733
- element = $(element);
1734
- if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
1735
- var nextSiblings = element.nextSiblings();
1736
- return expression ? Selector.findElement(nextSiblings, expression, index) :
1737
- nextSiblings[index || 0];
1738
- },
1739
-
1740
- select: function() {
1741
- var args = $A(arguments), element = $(args.shift());
1742
- return Selector.findChildElements(element, args);
1743
- },
1744
-
1745
- adjacent: function() {
1746
- var args = $A(arguments), element = $(args.shift());
1747
- return Selector.findChildElements(element.parentNode, args).without(element);
1748
- },
1749
-
1750
- identify: function(element) {
1751
- element = $(element);
1752
- var id = element.readAttribute('id'), self = arguments.callee;
1753
- if (id) return id;
1754
- do { id = 'anonymous_element_' + self.counter++ } while ($(id));
1755
- element.writeAttribute('id', id);
1756
- return id;
1757
- },
1758
-
1759
- readAttribute: function(element, name) {
1760
- element = $(element);
1761
- if (Prototype.Browser.IE) {
1762
- var t = Element._attributeTranslations.read;
1763
- if (t.values[name]) return t.values[name](element, name);
1764
- if (t.names[name]) name = t.names[name];
1765
- if (name.include(':')) {
1766
- return (!element.attributes || !element.attributes[name]) ? null :
1767
- element.attributes[name].value;
1768
- }
1769
- }
1770
- return element.getAttribute(name);
1771
- },
1772
-
1773
- writeAttribute: function(element, name, value) {
1774
- element = $(element);
1775
- var attributes = { }, t = Element._attributeTranslations.write;
1776
-
1777
- if (typeof name == 'object') attributes = name;
1778
- else attributes[name] = Object.isUndefined(value) ? true : value;
1779
-
1780
- for (var attr in attributes) {
1781
- name = t.names[attr] || attr;
1782
- value = attributes[attr];
1783
- if (t.values[attr]) name = t.values[attr](element, value);
1784
- if (value === false || value === null)
1785
- element.removeAttribute(name);
1786
- else if (value === true)
1787
- element.setAttribute(name, name);
1788
- else element.setAttribute(name, value);
1789
- }
1790
- return element;
1791
- },
1792
-
1793
- getHeight: function(element) {
1794
- return $(element).getDimensions().height;
1795
- },
1796
-
1797
- getWidth: function(element) {
1798
- return $(element).getDimensions().width;
1799
- },
1800
-
1801
- classNames: function(element) {
1802
- return new Element.ClassNames(element);
1803
- },
1804
-
1805
- hasClassName: function(element, className) {
1806
- if (!(element = $(element))) return;
1807
- var elementClassName = element.className;
1808
- return (elementClassName.length > 0 && (elementClassName == className ||
1809
- new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
1810
- },
1811
-
1812
- addClassName: function(element, className) {
1813
- if (!(element = $(element))) return;
1814
- if (!element.hasClassName(className))
1815
- element.className += (element.className ? ' ' : '') + className;
1816
- return element;
1817
- },
1818
-
1819
- removeClassName: function(element, className) {
1820
- if (!(element = $(element))) return;
1821
- element.className = element.className.replace(
1822
- new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
1823
- return element;
1824
- },
1825
-
1826
- toggleClassName: function(element, className) {
1827
- if (!(element = $(element))) return;
1828
- return element[element.hasClassName(className) ?
1829
- 'removeClassName' : 'addClassName'](className);
1830
- },
1831
-
1832
- // removes whitespace-only text node children
1833
- cleanWhitespace: function(element) {
1834
- element = $(element);
1835
- var node = element.firstChild;
1836
- while (node) {
1837
- var nextNode = node.nextSibling;
1838
- if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
1839
- element.removeChild(node);
1840
- node = nextNode;
1841
- }
1842
- return element;
1843
- },
1844
-
1845
- empty: function(element) {
1846
- return $(element).innerHTML.blank();
1847
- },
1848
-
1849
- descendantOf: function(element, ancestor) {
1850
- element = $(element), ancestor = $(ancestor);
1851
- var originalAncestor = ancestor;
1852
-
1853
- if (element.compareDocumentPosition)
1854
- return (element.compareDocumentPosition(ancestor) & 8) === 8;
1855
-
1856
- if (element.sourceIndex && !Prototype.Browser.Opera) {
1857
- var e = element.sourceIndex, a = ancestor.sourceIndex,
1858
- nextAncestor = ancestor.nextSibling;
1859
- if (!nextAncestor) {
1860
- do { ancestor = ancestor.parentNode; }
1861
- while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
1862
- }
1863
- if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
1864
- }
1865
-
1866
- while (element = element.parentNode)
1867
- if (element == originalAncestor) return true;
1868
- return false;
1869
- },
1870
-
1871
- scrollTo: function(element) {
1872
- element = $(element);
1873
- var pos = element.cumulativeOffset();
1874
- window.scrollTo(pos[0], pos[1]);
1875
- return element;
1876
- },
1877
-
1878
- getStyle: function(element, style) {
1879
- element = $(element);
1880
- style = style == 'float' ? 'cssFloat' : style.camelize();
1881
- var value = element.style[style];
1882
- if (!value) {
1883
- var css = document.defaultView.getComputedStyle(element, null);
1884
- value = css ? css[style] : null;
1885
- }
1886
- if (style == 'opacity') return value ? parseFloat(value) : 1.0;
1887
- return value == 'auto' ? null : value;
1888
- },
1889
-
1890
- getOpacity: function(element) {
1891
- return $(element).getStyle('opacity');
1892
- },
1893
-
1894
- setStyle: function(element, styles) {
1895
- element = $(element);
1896
- var elementStyle = element.style, match;
1897
- if (Object.isString(styles)) {
1898
- element.style.cssText += ';' + styles;
1899
- return styles.include('opacity') ?
1900
- element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
1901
- }
1902
- for (var property in styles)
1903
- if (property == 'opacity') element.setOpacity(styles[property]);
1904
- else
1905
- elementStyle[(property == 'float' || property == 'cssFloat') ?
1906
- (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
1907
- property] = styles[property];
1908
-
1909
- return element;
1910
- },
1911
-
1912
- setOpacity: function(element, value) {
1913
- element = $(element);
1914
- element.style.opacity = (value == 1 || value === '') ? '' :
1915
- (value < 0.00001) ? 0 : value;
1916
- return element;
1917
- },
1918
-
1919
- getDimensions: function(element) {
1920
- element = $(element);
1921
- var display = $(element).getStyle('display');
1922
- if (display != 'none' && display != null) // Safari bug
1923
- return {width: element.offsetWidth, height: element.offsetHeight};
1924
-
1925
- // All *Width and *Height properties give 0 on elements with display none,
1926
- // so enable the element temporarily
1927
- var els = element.style;
1928
- var originalVisibility = els.visibility;
1929
- var originalPosition = els.position;
1930
- var originalDisplay = els.display;
1931
- els.visibility = 'hidden';
1932
- els.position = 'absolute';
1933
- els.display = 'block';
1934
- var originalWidth = element.clientWidth;
1935
- var originalHeight = element.clientHeight;
1936
- els.display = originalDisplay;
1937
- els.position = originalPosition;
1938
- els.visibility = originalVisibility;
1939
- return {width: originalWidth, height: originalHeight};
1940
- },
1941
-
1942
- makePositioned: function(element) {
1943
- element = $(element);
1944
- var pos = Element.getStyle(element, 'position');
1945
- if (pos == 'static' || !pos) {
1946
- element._madePositioned = true;
1947
- element.style.position = 'relative';
1948
- // Opera returns the offset relative to the positioning context, when an
1949
- // element is position relative but top and left have not been defined
1950
- if (window.opera) {
1951
- element.style.top = 0;
1952
- element.style.left = 0;
1953
- }
1954
- }
1955
- return element;
1956
- },
1957
-
1958
- undoPositioned: function(element) {
1959
- element = $(element);
1960
- if (element._madePositioned) {
1961
- element._madePositioned = undefined;
1962
- element.style.position =
1963
- element.style.top =
1964
- element.style.left =
1965
- element.style.bottom =
1966
- element.style.right = '';
1967
- }
1968
- return element;
1969
- },
1970
-
1971
- makeClipping: function(element) {
1972
- element = $(element);
1973
- if (element._overflow) return element;
1974
- element._overflow = Element.getStyle(element, 'overflow') || 'auto';
1975
- if (element._overflow !== 'hidden')
1976
- element.style.overflow = 'hidden';
1977
- return element;
1978
- },
1979
-
1980
- undoClipping: function(element) {
1981
- element = $(element);
1982
- if (!element._overflow) return element;
1983
- element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
1984
- element._overflow = null;
1985
- return element;
1986
- },
1987
-
1988
- cumulativeOffset: function(element) {
1989
- var valueT = 0, valueL = 0;
1990
- do {
1991
- valueT += element.offsetTop || 0;
1992
- valueL += element.offsetLeft || 0;
1993
- element = element.offsetParent;
1994
- } while (element);
1995
- return Element._returnOffset(valueL, valueT);
1996
- },
1997
-
1998
- positionedOffset: function(element) {
1999
- var valueT = 0, valueL = 0;
2000
- do {
2001
- valueT += element.offsetTop || 0;
2002
- valueL += element.offsetLeft || 0;
2003
- element = element.offsetParent;
2004
- if (element) {
2005
- if (element.tagName == 'BODY') break;
2006
- var p = Element.getStyle(element, 'position');
2007
- if (p == 'relative' || p == 'absolute') break;
2008
- }
2009
- } while (element);
2010
- return Element._returnOffset(valueL, valueT);
2011
- },
2012
-
2013
- absolutize: function(element) {
2014
- element = $(element);
2015
- if (element.getStyle('position') == 'absolute') return;
2016
- // Position.prepare(); // To be done manually by Scripty when it needs it.
2017
-
2018
- var offsets = element.positionedOffset();
2019
- var top = offsets[1];
2020
- var left = offsets[0];
2021
- var width = element.clientWidth;
2022
- var height = element.clientHeight;
2023
-
2024
- element._originalLeft = left - parseFloat(element.style.left || 0);
2025
- element._originalTop = top - parseFloat(element.style.top || 0);
2026
- element._originalWidth = element.style.width;
2027
- element._originalHeight = element.style.height;
2028
-
2029
- element.style.position = 'absolute';
2030
- element.style.top = top + 'px';
2031
- element.style.left = left + 'px';
2032
- element.style.width = width + 'px';
2033
- element.style.height = height + 'px';
2034
- return element;
2035
- },
2036
-
2037
- relativize: function(element) {
2038
- element = $(element);
2039
- if (element.getStyle('position') == 'relative') return;
2040
- // Position.prepare(); // To be done manually by Scripty when it needs it.
2041
-
2042
- element.style.position = 'relative';
2043
- var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
2044
- var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
2045
-
2046
- element.style.top = top + 'px';
2047
- element.style.left = left + 'px';
2048
- element.style.height = element._originalHeight;
2049
- element.style.width = element._originalWidth;
2050
- return element;
2051
- },
2052
-
2053
- cumulativeScrollOffset: function(element) {
2054
- var valueT = 0, valueL = 0;
2055
- do {
2056
- valueT += element.scrollTop || 0;
2057
- valueL += element.scrollLeft || 0;
2058
- element = element.parentNode;
2059
- } while (element);
2060
- return Element._returnOffset(valueL, valueT);
2061
- },
2062
-
2063
- getOffsetParent: function(element) {
2064
- if (element.offsetParent) return $(element.offsetParent);
2065
- if (element == document.body) return $(element);
2066
-
2067
- while ((element = element.parentNode) && element != document.body)
2068
- if (Element.getStyle(element, 'position') != 'static')
2069
- return $(element);
2070
-
2071
- return $(document.body);
2072
- },
2073
-
2074
- viewportOffset: function(forElement) {
2075
- var valueT = 0, valueL = 0;
2076
-
2077
- var element = forElement;
2078
- do {
2079
- valueT += element.offsetTop || 0;
2080
- valueL += element.offsetLeft || 0;
2081
-
2082
- // Safari fix
2083
- if (element.offsetParent == document.body &&
2084
- Element.getStyle(element, 'position') == 'absolute') break;
2085
-
2086
- } while (element = element.offsetParent);
2087
-
2088
- element = forElement;
2089
- do {
2090
- if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
2091
- valueT -= element.scrollTop || 0;
2092
- valueL -= element.scrollLeft || 0;
2093
- }
2094
- } while (element = element.parentNode);
2095
-
2096
- return Element._returnOffset(valueL, valueT);
2097
- },
2098
-
2099
- clonePosition: function(element, source) {
2100
- var options = Object.extend({
2101
- setLeft: true,
2102
- setTop: true,
2103
- setWidth: true,
2104
- setHeight: true,
2105
- offsetTop: 0,
2106
- offsetLeft: 0
2107
- }, arguments[2] || { });
2108
-
2109
- // find page position of source
2110
- source = $(source);
2111
- var p = source.viewportOffset();
2112
-
2113
- // find coordinate system to use
2114
- element = $(element);
2115
- var delta = [0, 0];
2116
- var parent = null;
2117
- // delta [0,0] will do fine with position: fixed elements,
2118
- // position:absolute needs offsetParent deltas
2119
- if (Element.getStyle(element, 'position') == 'absolute') {
2120
- parent = element.getOffsetParent();
2121
- delta = parent.viewportOffset();
2122
- }
2123
-
2124
- // correct by body offsets (fixes Safari)
2125
- if (parent == document.body) {
2126
- delta[0] -= document.body.offsetLeft;
2127
- delta[1] -= document.body.offsetTop;
2128
- }
2129
-
2130
- // set position
2131
- if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
2132
- if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
2133
- if (options.setWidth) element.style.width = source.offsetWidth + 'px';
2134
- if (options.setHeight) element.style.height = source.offsetHeight + 'px';
2135
- return element;
2136
- }
2137
- };
2138
-
2139
- Element.Methods.identify.counter = 1;
2140
-
2141
- Object.extend(Element.Methods, {
2142
- getElementsBySelector: Element.Methods.select,
2143
- childElements: Element.Methods.immediateDescendants
2144
- });
2145
-
2146
- Element._attributeTranslations = {
2147
- write: {
2148
- names: {
2149
- className: 'class',
2150
- htmlFor: 'for'
2151
- },
2152
- values: { }
2153
- }
2154
- };
2155
-
2156
-
2157
- if (!document.createRange || Prototype.Browser.Opera) {
2158
- Element.Methods.insert = function(element, insertions) {
2159
- element = $(element);
2160
-
2161
- if (Object.isString(insertions) || Object.isNumber(insertions) ||
2162
- Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
2163
- insertions = { bottom: insertions };
2164
-
2165
- var t = Element._insertionTranslations, content, position, pos, tagName;
2166
-
2167
- for (position in insertions) {
2168
- content = insertions[position];
2169
- position = position.toLowerCase();
2170
- pos = t[position];
2171
-
2172
- if (content && content.toElement) content = content.toElement();
2173
- if (Object.isElement(content)) {
2174
- pos.insert(element, content);
2175
- continue;
2176
- }
2177
-
2178
- content = Object.toHTML(content);
2179
- tagName = ((position == 'before' || position == 'after')
2180
- ? element.parentNode : element).tagName.toUpperCase();
2181
-
2182
- if (t.tags[tagName]) {
2183
- var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
2184
- if (position == 'top' || position == 'after') fragments.reverse();
2185
- fragments.each(pos.insert.curry(element));
2186
- }
2187
- else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
2188
-
2189
- content.evalScripts.bind(content).defer();
2190
- }
2191
-
2192
- return element;
2193
- };
2194
- }
2195
-
2196
- if (Prototype.Browser.Opera) {
2197
- Element.Methods.getStyle = Element.Methods.getStyle.wrap(
2198
- function(proceed, element, style) {
2199
- switch (style) {
2200
- case 'left': case 'top': case 'right': case 'bottom':
2201
- if (proceed(element, 'position') === 'static') return null;
2202
- case 'height': case 'width':
2203
- // returns '0px' for hidden elements; we want it to return null
2204
- if (!Element.visible(element)) return null;
2205
-
2206
- // returns the border-box dimensions rather than the content-box
2207
- // dimensions, so we subtract padding and borders from the value
2208
- var dim = parseInt(proceed(element, style), 10);
2209
-
2210
- if (dim !== element['offset' + style.capitalize()])
2211
- return dim + 'px';
2212
-
2213
- var properties;
2214
- if (style === 'height') {
2215
- properties = ['border-top-width', 'padding-top',
2216
- 'padding-bottom', 'border-bottom-width'];
2217
- }
2218
- else {
2219
- properties = ['border-left-width', 'padding-left',
2220
- 'padding-right', 'border-right-width'];
2221
- }
2222
- return properties.inject(dim, function(memo, property) {
2223
- var val = proceed(element, property);
2224
- return val === null ? memo : memo - parseInt(val, 10);
2225
- }) + 'px';
2226
- default: return proceed(element, style);
2227
- }
2228
- }
2229
- );
2230
-
2231
- Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
2232
- function(proceed, element, attribute) {
2233
- if (attribute === 'title') return element.title;
2234
- return proceed(element, attribute);
2235
- }
2236
- );
2237
- }
2238
-
2239
- else if (Prototype.Browser.IE) {
2240
- $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
2241
- Element.Methods[method] = Element.Methods[method].wrap(
2242
- function(proceed, element) {
2243
- element = $(element);
2244
- var position = element.getStyle('position');
2245
- if (position != 'static') return proceed(element);
2246
- element.setStyle({ position: 'relative' });
2247
- var value = proceed(element);
2248
- element.setStyle({ position: position });
2249
- return value;
2250
- }
2251
- );
2252
- });
2253
-
2254
- Element.Methods.getStyle = function(element, style) {
2255
- element = $(element);
2256
- style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
2257
- var value = element.style[style];
2258
- if (!value && element.currentStyle) value = element.currentStyle[style];
2259
-
2260
- if (style == 'opacity') {
2261
- if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
2262
- if (value[1]) return parseFloat(value[1]) / 100;
2263
- return 1.0;
2264
- }
2265
-
2266
- if (value == 'auto') {
2267
- if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
2268
- return element['offset' + style.capitalize()] + 'px';
2269
- return null;
2270
- }
2271
- return value;
2272
- };
2273
-
2274
- Element.Methods.setOpacity = function(element, value) {
2275
- function stripAlpha(filter){
2276
- return filter.replace(/alpha\([^\)]*\)/gi,'');
2277
- }
2278
- element = $(element);
2279
- var currentStyle = element.currentStyle;
2280
- if ((currentStyle && !currentStyle.hasLayout) ||
2281
- (!currentStyle && element.style.zoom == 'normal'))
2282
- element.style.zoom = 1;
2283
-
2284
- var filter = element.getStyle('filter'), style = element.style;
2285
- if (value == 1 || value === '') {
2286
- (filter = stripAlpha(filter)) ?
2287
- style.filter = filter : style.removeAttribute('filter');
2288
- return element;
2289
- } else if (value < 0.00001) value = 0;
2290
- style.filter = stripAlpha(filter) +
2291
- 'alpha(opacity=' + (value * 100) + ')';
2292
- return element;
2293
- };
2294
-
2295
- Element._attributeTranslations = {
2296
- read: {
2297
- names: {
2298
- 'class': 'className',
2299
- 'for': 'htmlFor'
2300
- },
2301
- values: {
2302
- _getAttr: function(element, attribute) {
2303
- return element.getAttribute(attribute, 2);
2304
- },
2305
- _getAttrNode: function(element, attribute) {
2306
- var node = element.getAttributeNode(attribute);
2307
- return node ? node.value : "";
2308
- },
2309
- _getEv: function(element, attribute) {
2310
- attribute = element.getAttribute(attribute);
2311
- return attribute ? attribute.toString().slice(23, -2) : null;
2312
- },
2313
- _flag: function(element, attribute) {
2314
- return $(element).hasAttribute(attribute) ? attribute : null;
2315
- },
2316
- style: function(element) {
2317
- return element.style.cssText.toLowerCase();
2318
- },
2319
- title: function(element) {
2320
- return element.title;
2321
- }
2322
- }
2323
- }
2324
- };
2325
-
2326
- Element._attributeTranslations.write = {
2327
- names: Object.clone(Element._attributeTranslations.read.names),
2328
- values: {
2329
- checked: function(element, value) {
2330
- element.checked = !!value;
2331
- },
2332
-
2333
- style: function(element, value) {
2334
- element.style.cssText = value ? value : '';
2335
- }
2336
- }
2337
- };
2338
-
2339
- Element._attributeTranslations.has = {};
2340
-
2341
- $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
2342
- 'encType maxLength readOnly longDesc').each(function(attr) {
2343
- Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
2344
- Element._attributeTranslations.has[attr.toLowerCase()] = attr;
2345
- });
2346
-
2347
- (function(v) {
2348
- Object.extend(v, {
2349
- href: v._getAttr,
2350
- src: v._getAttr,
2351
- type: v._getAttr,
2352
- action: v._getAttrNode,
2353
- disabled: v._flag,
2354
- checked: v._flag,
2355
- readonly: v._flag,
2356
- multiple: v._flag,
2357
- onload: v._getEv,
2358
- onunload: v._getEv,
2359
- onclick: v._getEv,
2360
- ondblclick: v._getEv,
2361
- onmousedown: v._getEv,
2362
- onmouseup: v._getEv,
2363
- onmouseover: v._getEv,
2364
- onmousemove: v._getEv,
2365
- onmouseout: v._getEv,
2366
- onfocus: v._getEv,
2367
- onblur: v._getEv,
2368
- onkeypress: v._getEv,
2369
- onkeydown: v._getEv,
2370
- onkeyup: v._getEv,
2371
- onsubmit: v._getEv,
2372
- onreset: v._getEv,
2373
- onselect: v._getEv,
2374
- onchange: v._getEv
2375
- });
2376
- })(Element._attributeTranslations.read.values);
2377
- }
2378
-
2379
- else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
2380
- Element.Methods.setOpacity = function(element, value) {
2381
- element = $(element);
2382
- element.style.opacity = (value == 1) ? 0.999999 :
2383
- (value === '') ? '' : (value < 0.00001) ? 0 : value;
2384
- return element;
2385
- };
2386
- }
2387
-
2388
- else if (Prototype.Browser.WebKit) {
2389
- Element.Methods.setOpacity = function(element, value) {
2390
- element = $(element);
2391
- element.style.opacity = (value == 1 || value === '') ? '' :
2392
- (value < 0.00001) ? 0 : value;
2393
-
2394
- if (value == 1)
2395
- if(element.tagName == 'IMG' && element.width) {
2396
- element.width++; element.width--;
2397
- } else try {
2398
- var n = document.createTextNode(' ');
2399
- element.appendChild(n);
2400
- element.removeChild(n);
2401
- } catch (e) { }
2402
-
2403
- return element;
2404
- };
2405
-
2406
- // Safari returns margins on body which is incorrect if the child is absolutely
2407
- // positioned. For performance reasons, redefine Element#cumulativeOffset for
2408
- // KHTML/WebKit only.
2409
- Element.Methods.cumulativeOffset = function(element) {
2410
- var valueT = 0, valueL = 0;
2411
- do {
2412
- valueT += element.offsetTop || 0;
2413
- valueL += element.offsetLeft || 0;
2414
- if (element.offsetParent == document.body)
2415
- if (Element.getStyle(element, 'position') == 'absolute') break;
2416
-
2417
- element = element.offsetParent;
2418
- } while (element);
2419
-
2420
- return Element._returnOffset(valueL, valueT);
2421
- };
2422
- }
2423
-
2424
- if (Prototype.Browser.IE || Prototype.Browser.Opera) {
2425
- // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
2426
- Element.Methods.update = function(element, content) {
2427
- element = $(element);
2428
-
2429
- if (content && content.toElement) content = content.toElement();
2430
- if (Object.isElement(content)) return element.update().insert(content);
2431
-
2432
- content = Object.toHTML(content);
2433
- var tagName = element.tagName.toUpperCase();
2434
-
2435
- if (tagName in Element._insertionTranslations.tags) {
2436
- $A(element.childNodes).each(function(node) { element.removeChild(node) });
2437
- Element._getContentFromAnonymousElement(tagName, content.stripScripts())
2438
- .each(function(node) { element.appendChild(node) });
2439
- }
2440
- else element.innerHTML = content.stripScripts();
2441
-
2442
- content.evalScripts.bind(content).defer();
2443
- return element;
2444
- };
2445
- }
2446
-
2447
- if (document.createElement('div').outerHTML) {
2448
- Element.Methods.replace = function(element, content) {
2449
- element = $(element);
2450
-
2451
- if (content && content.toElement) content = content.toElement();
2452
- if (Object.isElement(content)) {
2453
- element.parentNode.replaceChild(content, element);
2454
- return element;
2455
- }
2456
-
2457
- content = Object.toHTML(content);
2458
- var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
2459
-
2460
- if (Element._insertionTranslations.tags[tagName]) {
2461
- var nextSibling = element.next();
2462
- var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
2463
- parent.removeChild(element);
2464
- if (nextSibling)
2465
- fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
2466
- else
2467
- fragments.each(function(node) { parent.appendChild(node) });
2468
- }
2469
- else element.outerHTML = content.stripScripts();
2470
-
2471
- content.evalScripts.bind(content).defer();
2472
- return element;
2473
- };
2474
- }
2475
-
2476
- Element._returnOffset = function(l, t) {
2477
- var result = [l, t];
2478
- result.left = l;
2479
- result.top = t;
2480
- return result;
2481
- };
2482
-
2483
- Element._getContentFromAnonymousElement = function(tagName, html) {
2484
- var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
2485
- div.innerHTML = t[0] + html + t[1];
2486
- t[2].times(function() { div = div.firstChild });
2487
- return $A(div.childNodes);
2488
- };
2489
-
2490
- Element._insertionTranslations = {
2491
- before: {
2492
- adjacency: 'beforeBegin',
2493
- insert: function(element, node) {
2494
- element.parentNode.insertBefore(node, element);
2495
- },
2496
- initializeRange: function(element, range) {
2497
- range.setStartBefore(element);
2498
- }
2499
- },
2500
- top: {
2501
- adjacency: 'afterBegin',
2502
- insert: function(element, node) {
2503
- element.insertBefore(node, element.firstChild);
2504
- },
2505
- initializeRange: function(element, range) {
2506
- range.selectNodeContents(element);
2507
- range.collapse(true);
2508
- }
2509
- },
2510
- bottom: {
2511
- adjacency: 'beforeEnd',
2512
- insert: function(element, node) {
2513
- element.appendChild(node);
2514
- }
2515
- },
2516
- after: {
2517
- adjacency: 'afterEnd',
2518
- insert: function(element, node) {
2519
- element.parentNode.insertBefore(node, element.nextSibling);
2520
- },
2521
- initializeRange: function(element, range) {
2522
- range.setStartAfter(element);
2523
- }
2524
- },
2525
- tags: {
2526
- TABLE: ['<table>', '</table>', 1],
2527
- TBODY: ['<table><tbody>', '</tbody></table>', 2],
2528
- TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
2529
- TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
2530
- SELECT: ['<select>', '</select>', 1]
2531
- }
2532
- };
2533
-
2534
- (function() {
2535
- this.bottom.initializeRange = this.top.initializeRange;
2536
- Object.extend(this.tags, {
2537
- THEAD: this.tags.TBODY,
2538
- TFOOT: this.tags.TBODY,
2539
- TH: this.tags.TD
2540
- });
2541
- }).call(Element._insertionTranslations);
2542
-
2543
- Element.Methods.Simulated = {
2544
- hasAttribute: function(element, attribute) {
2545
- attribute = Element._attributeTranslations.has[attribute] || attribute;
2546
- var node = $(element).getAttributeNode(attribute);
2547
- return node && node.specified;
2548
- }
2549
- };
2550
-
2551
- Element.Methods.ByTag = { };
2552
-
2553
- Object.extend(Element, Element.Methods);
2554
-
2555
- if (!Prototype.BrowserFeatures.ElementExtensions &&
2556
- document.createElement('div').__proto__) {
2557
- window.HTMLElement = { };
2558
- window.HTMLElement.prototype = document.createElement('div').__proto__;
2559
- Prototype.BrowserFeatures.ElementExtensions = true;
2560
- }
2561
-
2562
- Element.extend = (function() {
2563
- if (Prototype.BrowserFeatures.SpecificElementExtensions)
2564
- return Prototype.K;
2565
-
2566
- var Methods = { }, ByTag = Element.Methods.ByTag;
2567
-
2568
- var extend = Object.extend(function(element) {
2569
- if (!element || element._extendedByPrototype ||
2570
- element.nodeType != 1 || element == window) return element;
2571
-
2572
- var methods = Object.clone(Methods),
2573
- tagName = element.tagName, property, value;
2574
-
2575
- // extend methods for specific tags
2576
- if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
2577
-
2578
- for (property in methods) {
2579
- value = methods[property];
2580
- if (Object.isFunction(value) && !(property in element))
2581
- element[property] = value.methodize();
2582
- }
2583
-
2584
- element._extendedByPrototype = Prototype.emptyFunction;
2585
- return element;
2586
-
2587
- }, {
2588
- refresh: function() {
2589
- // extend methods for all tags (Safari doesn't need this)
2590
- if (!Prototype.BrowserFeatures.ElementExtensions) {
2591
- Object.extend(Methods, Element.Methods);
2592
- Object.extend(Methods, Element.Methods.Simulated);
2593
- }
2594
- }
2595
- });
2596
-
2597
- extend.refresh();
2598
- return extend;
2599
- })();
2600
-
2601
- Element.hasAttribute = function(element, attribute) {
2602
- if (element.hasAttribute) return element.hasAttribute(attribute);
2603
- return Element.Methods.Simulated.hasAttribute(element, attribute);
2604
- };
2605
-
2606
- Element.addMethods = function(methods) {
2607
- var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
2608
-
2609
- if (!methods) {
2610
- Object.extend(Form, Form.Methods);
2611
- Object.extend(Form.Element, Form.Element.Methods);
2612
- Object.extend(Element.Methods.ByTag, {
2613
- "FORM": Object.clone(Form.Methods),
2614
- "INPUT": Object.clone(Form.Element.Methods),
2615
- "SELECT": Object.clone(Form.Element.Methods),
2616
- "TEXTAREA": Object.clone(Form.Element.Methods)
2617
- });
2618
- }
2619
-
2620
- if (arguments.length == 2) {
2621
- var tagName = methods;
2622
- methods = arguments[1];
2623
- }
2624
-
2625
- if (!tagName) Object.extend(Element.Methods, methods || { });
2626
- else {
2627
- if (Object.isArray(tagName)) tagName.each(extend);
2628
- else extend(tagName);
2629
- }
2630
-
2631
- function extend(tagName) {
2632
- tagName = tagName.toUpperCase();
2633
- if (!Element.Methods.ByTag[tagName])
2634
- Element.Methods.ByTag[tagName] = { };
2635
- Object.extend(Element.Methods.ByTag[tagName], methods);
2636
- }
2637
-
2638
- function copy(methods, destination, onlyIfAbsent) {
2639
- onlyIfAbsent = onlyIfAbsent || false;
2640
- for (var property in methods) {
2641
- var value = methods[property];
2642
- if (!Object.isFunction(value)) continue;
2643
- if (!onlyIfAbsent || !(property in destination))
2644
- destination[property] = value.methodize();
2645
- }
2646
- }
2647
-
2648
- function findDOMClass(tagName) {
2649
- var klass;
2650
- var trans = {
2651
- "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
2652
- "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
2653
- "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
2654
- "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
2655
- "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
2656
- "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
2657
- "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
2658
- "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
2659
- "FrameSet", "IFRAME": "IFrame"
2660
- };
2661
- if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
2662
- if (window[klass]) return window[klass];
2663
- klass = 'HTML' + tagName + 'Element';
2664
- if (window[klass]) return window[klass];
2665
- klass = 'HTML' + tagName.capitalize() + 'Element';
2666
- if (window[klass]) return window[klass];
2667
-
2668
- window[klass] = { };
2669
- window[klass].prototype = document.createElement(tagName).__proto__;
2670
- return window[klass];
2671
- }
2672
-
2673
- if (F.ElementExtensions) {
2674
- copy(Element.Methods, HTMLElement.prototype);
2675
- copy(Element.Methods.Simulated, HTMLElement.prototype, true);
2676
- }
2677
-
2678
- if (F.SpecificElementExtensions) {
2679
- for (var tag in Element.Methods.ByTag) {
2680
- var klass = findDOMClass(tag);
2681
- if (Object.isUndefined(klass)) continue;
2682
- copy(T[tag], klass.prototype);
2683
- }
2684
- }
2685
-
2686
- Object.extend(Element, Element.Methods);
2687
- delete Element.ByTag;
2688
-
2689
- if (Element.extend.refresh) Element.extend.refresh();
2690
- Element.cache = { };
2691
- };
2692
-
2693
- document.viewport = {
2694
- getDimensions: function() {
2695
- var dimensions = { };
2696
- var B = Prototype.Browser;
2697
- $w('width height').each(function(d) {
2698
- var D = d.capitalize();
2699
- dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
2700
- (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];
2701
- });
2702
- return dimensions;
2703
- },
2704
-
2705
- getWidth: function() {
2706
- return this.getDimensions().width;
2707
- },
2708
-
2709
- getHeight: function() {
2710
- return this.getDimensions().height;
2711
- },
2712
-
2713
- getScrollOffsets: function() {
2714
- return Element._returnOffset(
2715
- window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
2716
- window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
2717
- }
2718
- };
2719
- /* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
2720
- * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
2721
- * license. Please see http://www.yui-ext.com/ for more information. */
2722
-
2723
- var Selector = Class.create({
2724
- initialize: function(expression) {
2725
- this.expression = expression.strip();
2726
- this.compileMatcher();
2727
- },
2728
-
2729
- shouldUseXPath: function() {
2730
- if (!Prototype.BrowserFeatures.XPath) return false;
2731
-
2732
- var e = this.expression;
2733
-
2734
- // Safari 3 chokes on :*-of-type and :empty
2735
- if (Prototype.Browser.WebKit &&
2736
- (e.include("-of-type") || e.include(":empty")))
2737
- return false;
2738
-
2739
- // XPath can't do namespaced attributes, nor can it read
2740
- // the "checked" property from DOM nodes
2741
- if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
2742
- return false;
2743
-
2744
- return true;
2745
- },
2746
-
2747
- compileMatcher: function() {
2748
- if (this.shouldUseXPath())
2749
- return this.compileXPathMatcher();
2750
-
2751
- var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
2752
- c = Selector.criteria, le, p, m;
2753
-
2754
- if (Selector._cache[e]) {
2755
- this.matcher = Selector._cache[e];
2756
- return;
2757
- }
2758
-
2759
- this.matcher = ["this.matcher = function(root) {",
2760
- "var r = root, h = Selector.handlers, c = false, n;"];
2761
-
2762
- while (e && le != e && (/\S/).test(e)) {
2763
- le = e;
2764
- for (var i in ps) {
2765
- p = ps[i];
2766
- if (m = e.match(p)) {
2767
- this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
2768
- new Template(c[i]).evaluate(m));
2769
- e = e.replace(m[0], '');
2770
- break;
2771
- }
2772
- }
2773
- }
2774
-
2775
- this.matcher.push("return h.unique(n);\n}");
2776
- eval(this.matcher.join('\n'));
2777
- Selector._cache[this.expression] = this.matcher;
2778
- },
2779
-
2780
- compileXPathMatcher: function() {
2781
- var e = this.expression, ps = Selector.patterns,
2782
- x = Selector.xpath, le, m;
2783
-
2784
- if (Selector._cache[e]) {
2785
- this.xpath = Selector._cache[e]; return;
2786
- }
2787
-
2788
- this.matcher = ['.//*'];
2789
- while (e && le != e && (/\S/).test(e)) {
2790
- le = e;
2791
- for (var i in ps) {
2792
- if (m = e.match(ps[i])) {
2793
- this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
2794
- new Template(x[i]).evaluate(m));
2795
- e = e.replace(m[0], '');
2796
- break;
2797
- }
2798
- }
2799
- }
2800
-
2801
- this.xpath = this.matcher.join('');
2802
- Selector._cache[this.expression] = this.xpath;
2803
- },
2804
-
2805
- findElements: function(root) {
2806
- root = root || document;
2807
- if (this.xpath) return document._getElementsByXPath(this.xpath, root);
2808
- return this.matcher(root);
2809
- },
2810
-
2811
- match: function(element) {
2812
- this.tokens = [];
2813
-
2814
- var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
2815
- var le, p, m;
2816
-
2817
- while (e && le !== e && (/\S/).test(e)) {
2818
- le = e;
2819
- for (var i in ps) {
2820
- p = ps[i];
2821
- if (m = e.match(p)) {
2822
- // use the Selector.assertions methods unless the selector
2823
- // is too complex.
2824
- if (as[i]) {
2825
- this.tokens.push([i, Object.clone(m)]);
2826
- e = e.replace(m[0], '');
2827
- } else {
2828
- // reluctantly do a document-wide search
2829
- // and look for a match in the array
2830
- return this.findElements(document).include(element);
2831
- }
2832
- }
2833
- }
2834
- }
2835
-
2836
- var match = true, name, matches;
2837
- for (var i = 0, token; token = this.tokens[i]; i++) {
2838
- name = token[0], matches = token[1];
2839
- if (!Selector.assertions[name](element, matches)) {
2840
- match = false; break;
2841
- }
2842
- }
2843
-
2844
- return match;
2845
- },
2846
-
2847
- toString: function() {
2848
- return this.expression;
2849
- },
2850
-
2851
- inspect: function() {
2852
- return "#<Selector:" + this.expression.inspect() + ">";
2853
- }
2854
- });
2855
-
2856
- Object.extend(Selector, {
2857
- _cache: { },
2858
-
2859
- xpath: {
2860
- descendant: "//*",
2861
- child: "/*",
2862
- adjacent: "/following-sibling::*[1]",
2863
- laterSibling: '/following-sibling::*',
2864
- tagName: function(m) {
2865
- if (m[1] == '*') return '';
2866
- return "[local-name()='" + m[1].toLowerCase() +
2867
- "' or local-name()='" + m[1].toUpperCase() + "']";
2868
- },
2869
- className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
2870
- id: "[@id='#{1}']",
2871
- attrPresence: function(m) {
2872
- m[1] = m[1].toLowerCase();
2873
- return new Template("[@#{1}]").evaluate(m);
2874
- },
2875
- attr: function(m) {
2876
- m[1] = m[1].toLowerCase();
2877
- m[3] = m[5] || m[6];
2878
- return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
2879
- },
2880
- pseudo: function(m) {
2881
- var h = Selector.xpath.pseudos[m[1]];
2882
- if (!h) return '';
2883
- if (Object.isFunction(h)) return h(m);
2884
- return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
2885
- },
2886
- operators: {
2887
- '=': "[@#{1}='#{3}']",
2888
- '!=': "[@#{1}!='#{3}']",
2889
- '^=': "[starts-with(@#{1}, '#{3}')]",
2890
- '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
2891
- '*=': "[contains(@#{1}, '#{3}')]",
2892
- '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
2893
- '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
2894
- },
2895
- pseudos: {
2896
- 'first-child': '[not(preceding-sibling::*)]',
2897
- 'last-child': '[not(following-sibling::*)]',
2898
- 'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
2899
- 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
2900
- 'checked': "[@checked]",
2901
- 'disabled': "[@disabled]",
2902
- 'enabled': "[not(@disabled)]",
2903
- 'not': function(m) {
2904
- var e = m[6], p = Selector.patterns,
2905
- x = Selector.xpath, le, v;
2906
-
2907
- var exclusion = [];
2908
- while (e && le != e && (/\S/).test(e)) {
2909
- le = e;
2910
- for (var i in p) {
2911
- if (m = e.match(p[i])) {
2912
- v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
2913
- exclusion.push("(" + v.substring(1, v.length - 1) + ")");
2914
- e = e.replace(m[0], '');
2915
- break;
2916
- }
2917
- }
2918
- }
2919
- return "[not(" + exclusion.join(" and ") + ")]";
2920
- },
2921
- 'nth-child': function(m) {
2922
- return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
2923
- },
2924
- 'nth-last-child': function(m) {
2925
- return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
2926
- },
2927
- 'nth-of-type': function(m) {
2928
- return Selector.xpath.pseudos.nth("position() ", m);
2929
- },
2930
- 'nth-last-of-type': function(m) {
2931
- return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
2932
- },
2933
- 'first-of-type': function(m) {
2934
- m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
2935
- },
2936
- 'last-of-type': function(m) {
2937
- m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
2938
- },
2939
- 'only-of-type': function(m) {
2940
- var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
2941
- },
2942
- nth: function(fragment, m) {
2943
- var mm, formula = m[6], predicate;
2944
- if (formula == 'even') formula = '2n+0';
2945
- if (formula == 'odd') formula = '2n+1';
2946
- if (mm = formula.match(/^(\d+)$/)) // digit only
2947
- return '[' + fragment + "= " + mm[1] + ']';
2948
- if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
2949
- if (mm[1] == "-") mm[1] = -1;
2950
- var a = mm[1] ? Number(mm[1]) : 1;
2951
- var b = mm[2] ? Number(mm[2]) : 0;
2952
- predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
2953
- "((#{fragment} - #{b}) div #{a} >= 0)]";
2954
- return new Template(predicate).evaluate({
2955
- fragment: fragment, a: a, b: b });
2956
- }
2957
- }
2958
- }
2959
- },
2960
-
2961
- criteria: {
2962
- tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
2963
- className: 'n = h.className(n, r, "#{1}", c); c = false;',
2964
- id: 'n = h.id(n, r, "#{1}", c); c = false;',
2965
- attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
2966
- attr: function(m) {
2967
- m[3] = (m[5] || m[6]);
2968
- return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
2969
- },
2970
- pseudo: function(m) {
2971
- if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
2972
- return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
2973
- },
2974
- descendant: 'c = "descendant";',
2975
- child: 'c = "child";',
2976
- adjacent: 'c = "adjacent";',
2977
- laterSibling: 'c = "laterSibling";'
2978
- },
2979
-
2980
- patterns: {
2981
- // combinators must be listed first
2982
- // (and descendant needs to be last combinator)
2983
- laterSibling: /^\s*~\s*/,
2984
- child: /^\s*>\s*/,
2985
- adjacent: /^\s*\+\s*/,
2986
- descendant: /^\s/,
2987
-
2988
- // selectors follow
2989
- tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
2990
- id: /^#([\w\-\*]+)(\b|$)/,
2991
- className: /^\.([\w\-\*]+)(\b|$)/,
2992
- pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/,
2993
- attrPresence: /^\[([\w]+)\]/,
2994
- attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
2995
- },
2996
-
2997
- // for Selector.match and Element#match
2998
- assertions: {
2999
- tagName: function(element, matches) {
3000
- return matches[1].toUpperCase() == element.tagName.toUpperCase();
3001
- },
3002
-
3003
- className: function(element, matches) {
3004
- return Element.hasClassName(element, matches[1]);
3005
- },
3006
-
3007
- id: function(element, matches) {
3008
- return element.id === matches[1];
3009
- },
3010
-
3011
- attrPresence: function(element, matches) {
3012
- return Element.hasAttribute(element, matches[1]);
3013
- },
3014
-
3015
- attr: function(element, matches) {
3016
- var nodeValue = Element.readAttribute(element, matches[1]);
3017
- return Selector.operators[matches[2]](nodeValue, matches[3]);
3018
- }
3019
- },
3020
-
3021
- handlers: {
3022
- // UTILITY FUNCTIONS
3023
- // joins two collections
3024
- concat: function(a, b) {
3025
- for (var i = 0, node; node = b[i]; i++)
3026
- a.push(node);
3027
- return a;
3028
- },
3029
-
3030
- // marks an array of nodes for counting
3031
- mark: function(nodes) {
3032
- for (var i = 0, node; node = nodes[i]; i++)
3033
- node._counted = true;
3034
- return nodes;
3035
- },
3036
-
3037
- unmark: function(nodes) {
3038
- for (var i = 0, node; node = nodes[i]; i++)
3039
- node._counted = undefined;
3040
- return nodes;
3041
- },
3042
-
3043
- // mark each child node with its position (for nth calls)
3044
- // "ofType" flag indicates whether we're indexing for nth-of-type
3045
- // rather than nth-child
3046
- index: function(parentNode, reverse, ofType) {
3047
- parentNode._counted = true;
3048
- if (reverse) {
3049
- for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
3050
- var node = nodes[i];
3051
- if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
3052
- }
3053
- } else {
3054
- for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
3055
- if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
3056
- }
3057
- },
3058
-
3059
- // filters out duplicates and extends all nodes
3060
- unique: function(nodes) {
3061
- if (nodes.length == 0) return nodes;
3062
- var results = [], n;
3063
- for (var i = 0, l = nodes.length; i < l; i++)
3064
- if (!(n = nodes[i])._counted) {
3065
- n._counted = true;
3066
- results.push(Element.extend(n));
3067
- }
3068
- return Selector.handlers.unmark(results);
3069
- },
3070
-
3071
- // COMBINATOR FUNCTIONS
3072
- descendant: function(nodes) {
3073
- var h = Selector.handlers;
3074
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3075
- h.concat(results, node.getElementsByTagName('*'));
3076
- return results;
3077
- },
3078
-
3079
- child: function(nodes) {
3080
- var h = Selector.handlers;
3081
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3082
- for (var j = 0, child; child = node.childNodes[j]; j++)
3083
- if (child.nodeType == 1 && child.tagName != '!') results.push(child);
3084
- }
3085
- return results;
3086
- },
3087
-
3088
- adjacent: function(nodes) {
3089
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3090
- var next = this.nextElementSibling(node);
3091
- if (next) results.push(next);
3092
- }
3093
- return results;
3094
- },
3095
-
3096
- laterSibling: function(nodes) {
3097
- var h = Selector.handlers;
3098
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3099
- h.concat(results, Element.nextSiblings(node));
3100
- return results;
3101
- },
3102
-
3103
- nextElementSibling: function(node) {
3104
- while (node = node.nextSibling)
3105
- if (node.nodeType == 1) return node;
3106
- return null;
3107
- },
3108
-
3109
- previousElementSibling: function(node) {
3110
- while (node = node.previousSibling)
3111
- if (node.nodeType == 1) return node;
3112
- return null;
3113
- },
3114
-
3115
- // TOKEN FUNCTIONS
3116
- tagName: function(nodes, root, tagName, combinator) {
3117
- tagName = tagName.toUpperCase();
3118
- var results = [], h = Selector.handlers;
3119
- if (nodes) {
3120
- if (combinator) {
3121
- // fastlane for ordinary descendant combinators
3122
- if (combinator == "descendant") {
3123
- for (var i = 0, node; node = nodes[i]; i++)
3124
- h.concat(results, node.getElementsByTagName(tagName));
3125
- return results;
3126
- } else nodes = this[combinator](nodes);
3127
- if (tagName == "*") return nodes;
3128
- }
3129
- for (var i = 0, node; node = nodes[i]; i++)
3130
- if (node.tagName.toUpperCase() == tagName) results.push(node);
3131
- return results;
3132
- } else return root.getElementsByTagName(tagName);
3133
- },
3134
-
3135
- id: function(nodes, root, id, combinator) {
3136
- var targetNode = $(id), h = Selector.handlers;
3137
- if (!targetNode) return [];
3138
- if (!nodes && root == document) return [targetNode];
3139
- if (nodes) {
3140
- if (combinator) {
3141
- if (combinator == 'child') {
3142
- for (var i = 0, node; node = nodes[i]; i++)
3143
- if (targetNode.parentNode == node) return [targetNode];
3144
- } else if (combinator == 'descendant') {
3145
- for (var i = 0, node; node = nodes[i]; i++)
3146
- if (Element.descendantOf(targetNode, node)) return [targetNode];
3147
- } else if (combinator == 'adjacent') {
3148
- for (var i = 0, node; node = nodes[i]; i++)
3149
- if (Selector.handlers.previousElementSibling(targetNode) == node)
3150
- return [targetNode];
3151
- } else nodes = h[combinator](nodes);
3152
- }
3153
- for (var i = 0, node; node = nodes[i]; i++)
3154
- if (node == targetNode) return [targetNode];
3155
- return [];
3156
- }
3157
- return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
3158
- },
3159
-
3160
- className: function(nodes, root, className, combinator) {
3161
- if (nodes && combinator) nodes = this[combinator](nodes);
3162
- return Selector.handlers.byClassName(nodes, root, className);
3163
- },
3164
-
3165
- byClassName: function(nodes, root, className) {
3166
- if (!nodes) nodes = Selector.handlers.descendant([root]);
3167
- var needle = ' ' + className + ' ';
3168
- for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
3169
- nodeClassName = node.className;
3170
- if (nodeClassName.length == 0) continue;
3171
- if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
3172
- results.push(node);
3173
- }
3174
- return results;
3175
- },
3176
-
3177
- attrPresence: function(nodes, root, attr) {
3178
- if (!nodes) nodes = root.getElementsByTagName("*");
3179
- var results = [];
3180
- for (var i = 0, node; node = nodes[i]; i++)
3181
- if (Element.hasAttribute(node, attr)) results.push(node);
3182
- return results;
3183
- },
3184
-
3185
- attr: function(nodes, root, attr, value, operator) {
3186
- if (!nodes) nodes = root.getElementsByTagName("*");
3187
- var handler = Selector.operators[operator], results = [];
3188
- for (var i = 0, node; node = nodes[i]; i++) {
3189
- var nodeValue = Element.readAttribute(node, attr);
3190
- if (nodeValue === null) continue;
3191
- if (handler(nodeValue, value)) results.push(node);
3192
- }
3193
- return results;
3194
- },
3195
-
3196
- pseudo: function(nodes, name, value, root, combinator) {
3197
- if (nodes && combinator) nodes = this[combinator](nodes);
3198
- if (!nodes) nodes = root.getElementsByTagName("*");
3199
- return Selector.pseudos[name](nodes, value, root);
3200
- }
3201
- },
3202
-
3203
- pseudos: {
3204
- 'first-child': function(nodes, value, root) {
3205
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3206
- if (Selector.handlers.previousElementSibling(node)) continue;
3207
- results.push(node);
3208
- }
3209
- return results;
3210
- },
3211
- 'last-child': function(nodes, value, root) {
3212
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3213
- if (Selector.handlers.nextElementSibling(node)) continue;
3214
- results.push(node);
3215
- }
3216
- return results;
3217
- },
3218
- 'only-child': function(nodes, value, root) {
3219
- var h = Selector.handlers;
3220
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3221
- if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
3222
- results.push(node);
3223
- return results;
3224
- },
3225
- 'nth-child': function(nodes, formula, root) {
3226
- return Selector.pseudos.nth(nodes, formula, root);
3227
- },
3228
- 'nth-last-child': function(nodes, formula, root) {
3229
- return Selector.pseudos.nth(nodes, formula, root, true);
3230
- },
3231
- 'nth-of-type': function(nodes, formula, root) {
3232
- return Selector.pseudos.nth(nodes, formula, root, false, true);
3233
- },
3234
- 'nth-last-of-type': function(nodes, formula, root) {
3235
- return Selector.pseudos.nth(nodes, formula, root, true, true);
3236
- },
3237
- 'first-of-type': function(nodes, formula, root) {
3238
- return Selector.pseudos.nth(nodes, "1", root, false, true);
3239
- },
3240
- 'last-of-type': function(nodes, formula, root) {
3241
- return Selector.pseudos.nth(nodes, "1", root, true, true);
3242
- },
3243
- 'only-of-type': function(nodes, formula, root) {
3244
- var p = Selector.pseudos;
3245
- return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
3246
- },
3247
-
3248
- // handles the an+b logic
3249
- getIndices: function(a, b, total) {
3250
- if (a == 0) return b > 0 ? [b] : [];
3251
- return $R(1, total).inject([], function(memo, i) {
3252
- if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
3253
- return memo;
3254
- });
3255
- },
3256
-
3257
- // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
3258
- nth: function(nodes, formula, root, reverse, ofType) {
3259
- if (nodes.length == 0) return [];
3260
- if (formula == 'even') formula = '2n+0';
3261
- if (formula == 'odd') formula = '2n+1';
3262
- var h = Selector.handlers, results = [], indexed = [], m;
3263
- h.mark(nodes);
3264
- for (var i = 0, node; node = nodes[i]; i++) {
3265
- if (!node.parentNode._counted) {
3266
- h.index(node.parentNode, reverse, ofType);
3267
- indexed.push(node.parentNode);
3268
- }
3269
- }
3270
- if (formula.match(/^\d+$/)) { // just a number
3271
- formula = Number(formula);
3272
- for (var i = 0, node; node = nodes[i]; i++)
3273
- if (node.nodeIndex == formula) results.push(node);
3274
- } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
3275
- if (m[1] == "-") m[1] = -1;
3276
- var a = m[1] ? Number(m[1]) : 1;
3277
- var b = m[2] ? Number(m[2]) : 0;
3278
- var indices = Selector.pseudos.getIndices(a, b, nodes.length);
3279
- for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
3280
- for (var j = 0; j < l; j++)
3281
- if (node.nodeIndex == indices[j]) results.push(node);
3282
- }
3283
- }
3284
- h.unmark(nodes);
3285
- h.unmark(indexed);
3286
- return results;
3287
- },
3288
-
3289
- 'empty': function(nodes, value, root) {
3290
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3291
- // IE treats comments as element nodes
3292
- if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
3293
- results.push(node);
3294
- }
3295
- return results;
3296
- },
3297
-
3298
- 'not': function(nodes, selector, root) {
3299
- var h = Selector.handlers, selectorType, m;
3300
- var exclusions = new Selector(selector).findElements(root);
3301
- h.mark(exclusions);
3302
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3303
- if (!node._counted) results.push(node);
3304
- h.unmark(exclusions);
3305
- return results;
3306
- },
3307
-
3308
- 'enabled': function(nodes, value, root) {
3309
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3310
- if (!node.disabled) results.push(node);
3311
- return results;
3312
- },
3313
-
3314
- 'disabled': function(nodes, value, root) {
3315
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3316
- if (node.disabled) results.push(node);
3317
- return results;
3318
- },
3319
-
3320
- 'checked': function(nodes, value, root) {
3321
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3322
- if (node.checked) results.push(node);
3323
- return results;
3324
- }
3325
- },
3326
-
3327
- operators: {
3328
- '=': function(nv, v) { return nv == v; },
3329
- '!=': function(nv, v) { return nv != v; },
3330
- '^=': function(nv, v) { return nv.startsWith(v); },
3331
- '$=': function(nv, v) { return nv.endsWith(v); },
3332
- '*=': function(nv, v) { return nv.include(v); },
3333
- '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
3334
- '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
3335
- },
3336
-
3337
- matchElements: function(elements, expression) {
3338
- var matches = new Selector(expression).findElements(), h = Selector.handlers;
3339
- h.mark(matches);
3340
- for (var i = 0, results = [], element; element = elements[i]; i++)
3341
- if (element._counted) results.push(element);
3342
- h.unmark(matches);
3343
- return results;
3344
- },
3345
-
3346
- findElement: function(elements, expression, index) {
3347
- if (Object.isNumber(expression)) {
3348
- index = expression; expression = false;
3349
- }
3350
- return Selector.matchElements(elements, expression || '*')[index || 0];
3351
- },
3352
-
3353
- findChildElements: function(element, expressions) {
3354
- var exprs = expressions.join(',');
3355
- expressions = [];
3356
- exprs.scan(/(([\w#:.>=+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
3357
- expressions.push(m[1].strip());
3358
- });
3359
- var results = [], h = Selector.handlers;
3360
- for (var i = 0, l = expressions.length, selector; i < l; i++) {
3361
- selector = new Selector(expressions[i].strip());
3362
- h.concat(results, selector.findElements(element));
3363
- }
3364
- return (l > 1) ? h.unique(results) : results;
3365
- }
3366
- });
3367
-
3368
- if (Prototype.Browser.IE) {
3369
- // IE returns comment nodes on getElementsByTagName("*").
3370
- // Filter them out.
3371
- Selector.handlers.concat = function(a, b) {
3372
- for (var i = 0, node; node = b[i]; i++)
3373
- if (node.tagName !== "!") a.push(node);
3374
- return a;
3375
- };
3376
- }
3377
-
3378
- function $$() {
3379
- return Selector.findChildElements(document, $A(arguments));
3380
- }
3381
- var Form = {
3382
- reset: function(form) {
3383
- $(form).reset();
3384
- return form;
3385
- },
3386
-
3387
- serializeElements: function(elements, options) {
3388
- if (typeof options != 'object') options = { hash: !!options };
3389
- else if (Object.isUndefined(options.hash)) options.hash = true;
3390
- var key, value, submitted = false, submit = options.submit;
3391
-
3392
- var data = elements.inject({ }, function(result, element) {
3393
- if (!element.disabled && element.name) {
3394
- key = element.name; value = $(element).getValue();
3395
- if (value != null && (element.type != 'submit' || (!submitted &&
3396
- submit !== false && (!submit || key == submit) && (submitted = true)))) {
3397
- if (key in result) {
3398
- // a key is already present; construct an array of values
3399
- if (!Object.isArray(result[key])) result[key] = [result[key]];
3400
- result[key].push(value);
3401
- }
3402
- else result[key] = value;
3403
- }
3404
- }
3405
- return result;
3406
- });
3407
-
3408
- return options.hash ? data : Object.toQueryString(data);
3409
- }
3410
- };
3411
-
3412
- Form.Methods = {
3413
- serialize: function(form, options) {
3414
- return Form.serializeElements(Form.getElements(form), options);
3415
- },
3416
-
3417
- getElements: function(form) {
3418
- return $A($(form).getElementsByTagName('*')).inject([],
3419
- function(elements, child) {
3420
- if (Form.Element.Serializers[child.tagName.toLowerCase()])
3421
- elements.push(Element.extend(child));
3422
- return elements;
3423
- }
3424
- );
3425
- },
3426
-
3427
- getInputs: function(form, typeName, name) {
3428
- form = $(form);
3429
- var inputs = form.getElementsByTagName('input');
3430
-
3431
- if (!typeName && !name) return $A(inputs).map(Element.extend);
3432
-
3433
- for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
3434
- var input = inputs[i];
3435
- if ((typeName && input.type != typeName) || (name && input.name != name))
3436
- continue;
3437
- matchingInputs.push(Element.extend(input));
3438
- }
3439
-
3440
- return matchingInputs;
3441
- },
3442
-
3443
- disable: function(form) {
3444
- form = $(form);
3445
- Form.getElements(form).invoke('disable');
3446
- return form;
3447
- },
3448
-
3449
- enable: function(form) {
3450
- form = $(form);
3451
- Form.getElements(form).invoke('enable');
3452
- return form;
3453
- },
3454
-
3455
- findFirstElement: function(form) {
3456
- var elements = $(form).getElements().findAll(function(element) {
3457
- return 'hidden' != element.type && !element.disabled;
3458
- });
3459
- var firstByIndex = elements.findAll(function(element) {
3460
- return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
3461
- }).sortBy(function(element) { return element.tabIndex }).first();
3462
-
3463
- return firstByIndex ? firstByIndex : elements.find(function(element) {
3464
- return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
3465
- });
3466
- },
3467
-
3468
- focusFirstElement: function(form) {
3469
- form = $(form);
3470
- form.findFirstElement().activate();
3471
- return form;
3472
- },
3473
-
3474
- request: function(form, options) {
3475
- form = $(form), options = Object.clone(options || { });
3476
-
3477
- var params = options.parameters, action = form.readAttribute('action') || '';
3478
- if (action.blank()) action = window.location.href;
3479
- options.parameters = form.serialize(true);
3480
-
3481
- if (params) {
3482
- if (Object.isString(params)) params = params.toQueryParams();
3483
- Object.extend(options.parameters, params);
3484
- }
3485
-
3486
- if (form.hasAttribute('method') && !options.method)
3487
- options.method = form.method;
3488
-
3489
- return new Ajax.Request(action, options);
3490
- }
3491
- };
3492
-
3493
- /*--------------------------------------------------------------------------*/
3494
-
3495
- Form.Element = {
3496
- focus: function(element) {
3497
- $(element).focus();
3498
- return element;
3499
- },
3500
-
3501
- select: function(element) {
3502
- $(element).select();
3503
- return element;
3504
- }
3505
- };
3506
-
3507
- Form.Element.Methods = {
3508
- serialize: function(element) {
3509
- element = $(element);
3510
- if (!element.disabled && element.name) {
3511
- var value = element.getValue();
3512
- if (value != undefined) {
3513
- var pair = { };
3514
- pair[element.name] = value;
3515
- return Object.toQueryString(pair);
3516
- }
3517
- }
3518
- return '';
3519
- },
3520
-
3521
- getValue: function(element) {
3522
- element = $(element);
3523
- var method = element.tagName.toLowerCase();
3524
- return Form.Element.Serializers[method](element);
3525
- },
3526
-
3527
- setValue: function(element, value) {
3528
- element = $(element);
3529
- var method = element.tagName.toLowerCase();
3530
- Form.Element.Serializers[method](element, value);
3531
- return element;
3532
- },
3533
-
3534
- clear: function(element) {
3535
- $(element).value = '';
3536
- return element;
3537
- },
3538
-
3539
- present: function(element) {
3540
- return $(element).value != '';
3541
- },
3542
-
3543
- activate: function(element) {
3544
- element = $(element);
3545
- try {
3546
- element.focus();
3547
- if (element.select && (element.tagName.toLowerCase() != 'input' ||
3548
- !['button', 'reset', 'submit'].include(element.type)))
3549
- element.select();
3550
- } catch (e) { }
3551
- return element;
3552
- },
3553
-
3554
- disable: function(element) {
3555
- element = $(element);
3556
- element.blur();
3557
- element.disabled = true;
3558
- return element;
3559
- },
3560
-
3561
- enable: function(element) {
3562
- element = $(element);
3563
- element.disabled = false;
3564
- return element;
3565
- }
3566
- };
3567
-
3568
- /*--------------------------------------------------------------------------*/
3569
-
3570
- var Field = Form.Element;
3571
- var $F = Form.Element.Methods.getValue;
3572
-
3573
- /*--------------------------------------------------------------------------*/
3574
-
3575
- Form.Element.Serializers = {
3576
- input: function(element, value) {
3577
- switch (element.type.toLowerCase()) {
3578
- case 'checkbox':
3579
- case 'radio':
3580
- return Form.Element.Serializers.inputSelector(element, value);
3581
- default:
3582
- return Form.Element.Serializers.textarea(element, value);
3583
- }
3584
- },
3585
-
3586
- inputSelector: function(element, value) {
3587
- if (Object.isUndefined(value)) return element.checked ? element.value : null;
3588
- else element.checked = !!value;
3589
- },
3590
-
3591
- textarea: function(element, value) {
3592
- if (Object.isUndefined(value)) return element.value;
3593
- else element.value = value;
3594
- },
3595
-
3596
- select: function(element, index) {
3597
- if (Object.isUndefined(index))
3598
- return this[element.type == 'select-one' ?
3599
- 'selectOne' : 'selectMany'](element);
3600
- else {
3601
- var opt, value, single = !Object.isArray(index);
3602
- for (var i = 0, length = element.length; i < length; i++) {
3603
- opt = element.options[i];
3604
- value = this.optionValue(opt);
3605
- if (single) {
3606
- if (value == index) {
3607
- opt.selected = true;
3608
- return;
3609
- }
3610
- }
3611
- else opt.selected = index.include(value);
3612
- }
3613
- }
3614
- },
3615
-
3616
- selectOne: function(element) {
3617
- var index = element.selectedIndex;
3618
- return index >= 0 ? this.optionValue(element.options[index]) : null;
3619
- },
3620
-
3621
- selectMany: function(element) {
3622
- var values, length = element.length;
3623
- if (!length) return null;
3624
-
3625
- for (var i = 0, values = []; i < length; i++) {
3626
- var opt = element.options[i];
3627
- if (opt.selected) values.push(this.optionValue(opt));
3628
- }
3629
- return values;
3630
- },
3631
-
3632
- optionValue: function(opt) {
3633
- // extend element because hasAttribute may not be native
3634
- return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
3635
- }
3636
- };
3637
-
3638
- /*--------------------------------------------------------------------------*/
3639
-
3640
- Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
3641
- initialize: function($super, element, frequency, callback) {
3642
- $super(callback, frequency);
3643
- this.element = $(element);
3644
- this.lastValue = this.getValue();
3645
- },
3646
-
3647
- execute: function() {
3648
- var value = this.getValue();
3649
- if (Object.isString(this.lastValue) && Object.isString(value) ?
3650
- this.lastValue != value : String(this.lastValue) != String(value)) {
3651
- this.callback(this.element, value);
3652
- this.lastValue = value;
3653
- }
3654
- }
3655
- });
3656
-
3657
- Form.Element.Observer = Class.create(Abstract.TimedObserver, {
3658
- getValue: function() {
3659
- return Form.Element.getValue(this.element);
3660
- }
3661
- });
3662
-
3663
- Form.Observer = Class.create(Abstract.TimedObserver, {
3664
- getValue: function() {
3665
- return Form.serialize(this.element);
3666
- }
3667
- });
3668
-
3669
- /*--------------------------------------------------------------------------*/
3670
-
3671
- Abstract.EventObserver = Class.create({
3672
- initialize: function(element, callback) {
3673
- this.element = $(element);
3674
- this.callback = callback;
3675
-
3676
- this.lastValue = this.getValue();
3677
- if (this.element.tagName.toLowerCase() == 'form')
3678
- this.registerFormCallbacks();
3679
- else
3680
- this.registerCallback(this.element);
3681
- },
3682
-
3683
- onElementEvent: function() {
3684
- var value = this.getValue();
3685
- if (this.lastValue != value) {
3686
- this.callback(this.element, value);
3687
- this.lastValue = value;
3688
- }
3689
- },
3690
-
3691
- registerFormCallbacks: function() {
3692
- Form.getElements(this.element).each(this.registerCallback, this);
3693
- },
3694
-
3695
- registerCallback: function(element) {
3696
- if (element.type) {
3697
- switch (element.type.toLowerCase()) {
3698
- case 'checkbox':
3699
- case 'radio':
3700
- Event.observe(element, 'click', this.onElementEvent.bind(this));
3701
- break;
3702
- default:
3703
- Event.observe(element, 'change', this.onElementEvent.bind(this));
3704
- break;
3705
- }
3706
- }
3707
- }
3708
- });
3709
-
3710
- Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
3711
- getValue: function() {
3712
- return Form.Element.getValue(this.element);
3713
- }
3714
- });
3715
-
3716
- Form.EventObserver = Class.create(Abstract.EventObserver, {
3717
- getValue: function() {
3718
- return Form.serialize(this.element);
3719
- }
3720
- });
3721
- if (!window.Event) var Event = { };
3722
-
3723
- Object.extend(Event, {
3724
- KEY_BACKSPACE: 8,
3725
- KEY_TAB: 9,
3726
- KEY_RETURN: 13,
3727
- KEY_ESC: 27,
3728
- KEY_LEFT: 37,
3729
- KEY_UP: 38,
3730
- KEY_RIGHT: 39,
3731
- KEY_DOWN: 40,
3732
- KEY_DELETE: 46,
3733
- KEY_HOME: 36,
3734
- KEY_END: 35,
3735
- KEY_PAGEUP: 33,
3736
- KEY_PAGEDOWN: 34,
3737
- KEY_INSERT: 45,
3738
-
3739
- cache: { },
3740
-
3741
- relatedTarget: function(event) {
3742
- var element;
3743
- switch(event.type) {
3744
- case 'mouseover': element = event.fromElement; break;
3745
- case 'mouseout': element = event.toElement; break;
3746
- default: return null;
3747
- }
3748
- return Element.extend(element);
3749
- }
3750
- });
3751
-
3752
- Event.Methods = (function() {
3753
- var isButton;
3754
-
3755
- if (Prototype.Browser.IE) {
3756
- var buttonMap = { 0: 1, 1: 4, 2: 2 };
3757
- isButton = function(event, code) {
3758
- return event.button == buttonMap[code];
3759
- };
3760
-
3761
- } else if (Prototype.Browser.WebKit) {
3762
- isButton = function(event, code) {
3763
- switch (code) {
3764
- case 0: return event.which == 1 && !event.metaKey;
3765
- case 1: return event.which == 1 && event.metaKey;
3766
- default: return false;
3767
- }
3768
- };
3769
-
3770
- } else {
3771
- isButton = function(event, code) {
3772
- return event.which ? (event.which === code + 1) : (event.button === code);
3773
- };
3774
- }
3775
-
3776
- return {
3777
- isLeftClick: function(event) { return isButton(event, 0) },
3778
- isMiddleClick: function(event) { return isButton(event, 1) },
3779
- isRightClick: function(event) { return isButton(event, 2) },
3780
-
3781
- element: function(event) {
3782
- var node = Event.extend(event).target;
3783
- return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
3784
- },
3785
-
3786
- findElement: function(event, expression) {
3787
- var element = Event.element(event);
3788
- if (!expression) return element;
3789
- var elements = [element].concat(element.ancestors());
3790
- return Selector.findElement(elements, expression, 0);
3791
- },
3792
-
3793
- pointer: function(event) {
3794
- return {
3795
- x: event.pageX || (event.clientX +
3796
- (document.documentElement.scrollLeft || document.body.scrollLeft)),
3797
- y: event.pageY || (event.clientY +
3798
- (document.documentElement.scrollTop || document.body.scrollTop))
3799
- };
3800
- },
3801
-
3802
- pointerX: function(event) { return Event.pointer(event).x },
3803
- pointerY: function(event) { return Event.pointer(event).y },
3804
-
3805
- stop: function(event) {
3806
- Event.extend(event);
3807
- event.preventDefault();
3808
- event.stopPropagation();
3809
- event.stopped = true;
3810
- }
3811
- };
3812
- })();
3813
-
3814
- Event.extend = (function() {
3815
- var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
3816
- m[name] = Event.Methods[name].methodize();
3817
- return m;
3818
- });
3819
-
3820
- if (Prototype.Browser.IE) {
3821
- Object.extend(methods, {
3822
- stopPropagation: function() { this.cancelBubble = true },
3823
- preventDefault: function() { this.returnValue = false },
3824
- inspect: function() { return "[object Event]" }
3825
- });
3826
-
3827
- return function(event) {
3828
- if (!event) return false;
3829
- if (event._extendedByPrototype) return event;
3830
-
3831
- event._extendedByPrototype = Prototype.emptyFunction;
3832
- var pointer = Event.pointer(event);
3833
- Object.extend(event, {
3834
- target: event.srcElement,
3835
- relatedTarget: Event.relatedTarget(event),
3836
- pageX: pointer.x,
3837
- pageY: pointer.y
3838
- });
3839
- return Object.extend(event, methods);
3840
- };
3841
-
3842
- } else {
3843
- Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
3844
- Object.extend(Event.prototype, methods);
3845
- return Prototype.K;
3846
- }
3847
- })();
3848
-
3849
- Object.extend(Event, (function() {
3850
- var cache = Event.cache;
3851
-
3852
- function getEventID(element) {
3853
- if (element._eventID) return element._eventID;
3854
- arguments.callee.id = arguments.callee.id || 1;
3855
- return element._eventID = ++arguments.callee.id;
3856
- }
3857
-
3858
- function getDOMEventName(eventName) {
3859
- if (eventName && eventName.include(':')) return "dataavailable";
3860
- return eventName;
3861
- }
3862
-
3863
- function getCacheForID(id) {
3864
- return cache[id] = cache[id] || { };
3865
- }
3866
-
3867
- function getWrappersForEventName(id, eventName) {
3868
- var c = getCacheForID(id);
3869
- return c[eventName] = c[eventName] || [];
3870
- }
3871
-
3872
- function createWrapper(element, eventName, handler) {
3873
- var id = getEventID(element);
3874
- var c = getWrappersForEventName(id, eventName);
3875
- if (c.pluck("handler").include(handler)) return false;
3876
-
3877
- var wrapper = function(event) {
3878
- if (!Event || !Event.extend ||
3879
- (event.eventName && event.eventName != eventName))
3880
- return false;
3881
-
3882
- Event.extend(event);
3883
- handler.call(element, event)
3884
- };
3885
-
3886
- wrapper.handler = handler;
3887
- c.push(wrapper);
3888
- return wrapper;
3889
- }
3890
-
3891
- function findWrapper(id, eventName, handler) {
3892
- var c = getWrappersForEventName(id, eventName);
3893
- return c.find(function(wrapper) { return wrapper.handler == handler });
3894
- }
3895
-
3896
- function destroyWrapper(id, eventName, handler) {
3897
- var c = getCacheForID(id);
3898
- if (!c[eventName]) return false;
3899
- c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
3900
- }
3901
-
3902
- function destroyCache() {
3903
- for (var id in cache)
3904
- for (var eventName in cache[id])
3905
- cache[id][eventName] = null;
3906
- }
3907
-
3908
- if (window.attachEvent) {
3909
- window.attachEvent("onunload", destroyCache);
3910
- }
3911
-
3912
- return {
3913
- observe: function(element, eventName, handler) {
3914
- element = $(element);
3915
- var name = getDOMEventName(eventName);
3916
-
3917
- var wrapper = createWrapper(element, eventName, handler);
3918
- if (!wrapper) return element;
3919
-
3920
- if (element.addEventListener) {
3921
- element.addEventListener(name, wrapper, false);
3922
- } else {
3923
- element.attachEvent("on" + name, wrapper);
3924
- }
3925
-
3926
- return element;
3927
- },
3928
-
3929
- stopObserving: function(element, eventName, handler) {
3930
- element = $(element);
3931
- var id = getEventID(element), name = getDOMEventName(eventName);
3932
-
3933
- if (!handler && eventName) {
3934
- getWrappersForEventName(id, eventName).each(function(wrapper) {
3935
- element.stopObserving(eventName, wrapper.handler);
3936
- });
3937
- return element;
3938
-
3939
- } else if (!eventName) {
3940
- Object.keys(getCacheForID(id)).each(function(eventName) {
3941
- element.stopObserving(eventName);
3942
- });
3943
- return element;
3944
- }
3945
-
3946
- var wrapper = findWrapper(id, eventName, handler);
3947
- if (!wrapper) return element;
3948
-
3949
- if (element.removeEventListener) {
3950
- element.removeEventListener(name, wrapper, false);
3951
- } else {
3952
- element.detachEvent("on" + name, wrapper);
3953
- }
3954
-
3955
- destroyWrapper(id, eventName, handler);
3956
-
3957
- return element;
3958
- },
3959
-
3960
- fire: function(element, eventName, memo) {
3961
- element = $(element);
3962
- if (element == document && document.createEvent && !element.dispatchEvent)
3963
- element = document.documentElement;
3964
-
3965
- if (document.createEvent) {
3966
- var event = document.createEvent("HTMLEvents");
3967
- event.initEvent("dataavailable", true, true);
3968
- } else {
3969
- var event = document.createEventObject();
3970
- event.eventType = "ondataavailable";
3971
- }
3972
-
3973
- event.eventName = eventName;
3974
- event.memo = memo || { };
3975
-
3976
- if (document.createEvent) {
3977
- element.dispatchEvent(event);
3978
- } else {
3979
- element.fireEvent(event.eventType, event);
3980
- }
3981
-
3982
- return Event.extend(event);
3983
- }
3984
- };
3985
- })());
3986
-
3987
- Object.extend(Event, Event.Methods);
3988
-
3989
- Element.addMethods({
3990
- fire: Event.fire,
3991
- observe: Event.observe,
3992
- stopObserving: Event.stopObserving
3993
- });
3994
-
3995
- Object.extend(document, {
3996
- fire: Element.Methods.fire.methodize(),
3997
- observe: Element.Methods.observe.methodize(),
3998
- stopObserving: Element.Methods.stopObserving.methodize()
3999
- });
4000
-
4001
- (function() {
4002
- /* Support for the DOMContentLoaded event is based on work by Dan Webb,
4003
- Matthias Miller, Dean Edwards and John Resig. */
4004
-
4005
- var timer, fired = false;
4006
-
4007
- function fireContentLoadedEvent() {
4008
- if (fired) return;
4009
- if (timer) window.clearInterval(timer);
4010
- document.fire("dom:loaded");
4011
- fired = true;
4012
- }
4013
-
4014
- if (document.addEventListener) {
4015
- if (Prototype.Browser.WebKit) {
4016
- timer = window.setInterval(function() {
4017
- if (/loaded|complete/.test(document.readyState))
4018
- fireContentLoadedEvent();
4019
- }, 0);
4020
-
4021
- Event.observe(window, "load", fireContentLoadedEvent);
4022
-
4023
- } else {
4024
- document.addEventListener("DOMContentLoaded",
4025
- fireContentLoadedEvent, false);
4026
- }
4027
-
4028
- } else {
4029
- document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
4030
- $("__onDOMContentLoaded").onreadystatechange = function() {
4031
- if (this.readyState == "complete") {
4032
- this.onreadystatechange = null;
4033
- fireContentLoadedEvent();
4034
- }
4035
- };
4036
- }
4037
- })();
4038
- /*------------------------------- DEPRECATED -------------------------------*/
4039
-
4040
- Hash.toQueryString = Object.toQueryString;
4041
-
4042
- var Toggle = { display: Element.toggle };
4043
-
4044
- Element.Methods.childOf = Element.Methods.descendantOf;
4045
-
4046
- var Insertion = {
4047
- Before: function(element, content) {
4048
- return Element.insert(element, {before:content});
4049
- },
4050
-
4051
- Top: function(element, content) {
4052
- return Element.insert(element, {top:content});
4053
- },
4054
-
4055
- Bottom: function(element, content) {
4056
- return Element.insert(element, {bottom:content});
4057
- },
4058
-
4059
- After: function(element, content) {
4060
- return Element.insert(element, {after:content});
4061
- }
4062
- };
4063
-
4064
- var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
4065
-
4066
- // This should be moved to script.aculo.us; notice the deprecated methods
4067
- // further below, that map to the newer Element methods.
4068
- var Position = {
4069
- // set to true if needed, warning: firefox performance problems
4070
- // NOT neeeded for page scrolling, only if draggable contained in
4071
- // scrollable elements
4072
- includeScrollOffsets: false,
4073
-
4074
- // must be called before calling withinIncludingScrolloffset, every time the
4075
- // page is scrolled
4076
- prepare: function() {
4077
- this.deltaX = window.pageXOffset
4078
- || document.documentElement.scrollLeft
4079
- || document.body.scrollLeft
4080
- || 0;
4081
- this.deltaY = window.pageYOffset
4082
- || document.documentElement.scrollTop
4083
- || document.body.scrollTop
4084
- || 0;
4085
- },
4086
-
4087
- // caches x/y coordinate pair to use with overlap
4088
- within: function(element, x, y) {
4089
- if (this.includeScrollOffsets)
4090
- return this.withinIncludingScrolloffsets(element, x, y);
4091
- this.xcomp = x;
4092
- this.ycomp = y;
4093
- this.offset = Element.cumulativeOffset(element);
4094
-
4095
- return (y >= this.offset[1] &&
4096
- y < this.offset[1] + element.offsetHeight &&
4097
- x >= this.offset[0] &&
4098
- x < this.offset[0] + element.offsetWidth);
4099
- },
4100
-
4101
- withinIncludingScrolloffsets: function(element, x, y) {
4102
- var offsetcache = Element.cumulativeScrollOffset(element);
4103
-
4104
- this.xcomp = x + offsetcache[0] - this.deltaX;
4105
- this.ycomp = y + offsetcache[1] - this.deltaY;
4106
- this.offset = Element.cumulativeOffset(element);
4107
-
4108
- return (this.ycomp >= this.offset[1] &&
4109
- this.ycomp < this.offset[1] + element.offsetHeight &&
4110
- this.xcomp >= this.offset[0] &&
4111
- this.xcomp < this.offset[0] + element.offsetWidth);
4112
- },
4113
-
4114
- // within must be called directly before
4115
- overlap: function(mode, element) {
4116
- if (!mode) return 0;
4117
- if (mode == 'vertical')
4118
- return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
4119
- element.offsetHeight;
4120
- if (mode == 'horizontal')
4121
- return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
4122
- element.offsetWidth;
4123
- },
4124
-
4125
- // Deprecation layer -- use newer Element methods now (1.5.2).
4126
-
4127
- cumulativeOffset: Element.Methods.cumulativeOffset,
4128
-
4129
- positionedOffset: Element.Methods.positionedOffset,
4130
-
4131
- absolutize: function(element) {
4132
- Position.prepare();
4133
- return Element.absolutize(element);
4134
- },
4135
-
4136
- relativize: function(element) {
4137
- Position.prepare();
4138
- return Element.relativize(element);
4139
- },
4140
-
4141
- realOffset: Element.Methods.cumulativeScrollOffset,
4142
-
4143
- offsetParent: Element.Methods.getOffsetParent,
4144
-
4145
- page: Element.Methods.viewportOffset,
4146
-
4147
- clone: function(source, target, options) {
4148
- options = options || { };
4149
- return Element.clonePosition(target, source, options);
4150
- }
4151
- };
4152
-
4153
- /*--------------------------------------------------------------------------*/
4154
-
4155
- if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
4156
- function iter(name) {
4157
- return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
4158
- }
4159
-
4160
- instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
4161
- function(element, className) {
4162
- className = className.toString().strip();
4163
- var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
4164
- return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
4165
- } : function(element, className) {
4166
- className = className.toString().strip();
4167
- var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
4168
- if (!classNames && !className) return elements;
4169
-
4170
- var nodes = $(element).getElementsByTagName('*');
4171
- className = ' ' + className + ' ';
4172
-
4173
- for (var i = 0, child, cn; child = nodes[i]; i++) {
4174
- if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
4175
- (classNames && classNames.all(function(name) {
4176
- return !name.toString().blank() && cn.include(' ' + name + ' ');
4177
- }))))
4178
- elements.push(Element.extend(child));
4179
- }
4180
- return elements;
4181
- };
4182
-
4183
- return function(className, parentElement) {
4184
- return $(parentElement || document.body).getElementsByClassName(className);
4185
- };
4186
- }(Element.Methods);
4187
-
4188
- /*--------------------------------------------------------------------------*/
4189
-
4190
- Element.ClassNames = Class.create();
4191
- Element.ClassNames.prototype = {
4192
- initialize: function(element) {
4193
- this.element = $(element);
4194
- },
4195
-
4196
- _each: function(iterator) {
4197
- this.element.className.split(/\s+/).select(function(name) {
4198
- return name.length > 0;
4199
- })._each(iterator);
4200
- },
4201
-
4202
- set: function(className) {
4203
- this.element.className = className;
4204
- },
4205
-
4206
- add: function(classNameToAdd) {
4207
- if (this.include(classNameToAdd)) return;
4208
- this.set($A(this).concat(classNameToAdd).join(' '));
4209
- },
4210
-
4211
- remove: function(classNameToRemove) {
4212
- if (!this.include(classNameToRemove)) return;
4213
- this.set($A(this).without(classNameToRemove).join(' '));
4214
- },
4215
-
4216
- toString: function() {
4217
- return $A(this).join(' ');
4218
- }
4219
- };
4220
-
4221
- Object.extend(Element.ClassNames.prototype, Enumerable);
4222
-
4223
- /*--------------------------------------------------------------------------*/
4224
-
4225
- Element.addMethods();
9
+ var Prototype={Version:'1.6.0.3',Browser:{IE:!!(window.attachEvent&&navigator.userAgent.indexOf('Opera')===-1),Opera:navigator.userAgent.indexOf('Opera')>-1,WebKit:navigator.userAgent.indexOf('AppleWebKit/')>-1,Gecko:navigator.userAgent.indexOf('Gecko')>-1&&navigator.userAgent.indexOf('KHTML')===-1,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,SelectorsAPI:!!document.querySelector,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement('div')['__proto__']&&document.createElement('div')['__proto__']!==document.createElement('form')['__proto__']},ScriptFragment:'<script[^>]*>([\\S\\s]*?)<\/script>',JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(x){return x}};if(Prototype.Browser.MobileSafari)
10
+ Prototype.BrowserFeatures.SpecificElementExtensions=false;var Class={create:function(){var parent=null,properties=$A(arguments);if(Object.isFunction(properties[0]))
11
+ parent=properties.shift();function klass(){this.initialize.apply(this,arguments);}
12
+ Object.extend(klass,Class.Methods);klass.superclass=parent;klass.subclasses=[];if(parent){var subclass=function(){};subclass.prototype=parent.prototype;klass.prototype=new subclass;parent.subclasses.push(klass);}
13
+ for(var i=0;i<properties.length;i++)
14
+ klass.addMethods(properties[i]);if(!klass.prototype.initialize)
15
+ klass.prototype.initialize=Prototype.emptyFunction;klass.prototype.constructor=klass;return klass;}};Class.Methods={addMethods:function(source){var ancestor=this.superclass&&this.superclass.prototype;var properties=Object.keys(source);if(!Object.keys({toString:true}).length)
16
+ properties.push("toString","valueOf");for(var i=0,length=properties.length;i<length;i++){var property=properties[i],value=source[property];if(ancestor&&Object.isFunction(value)&&value.argumentNames().first()=="$super"){var method=value;value=(function(m){return function(){return ancestor[m].apply(this,arguments)};})(property).wrap(method);value.valueOf=method.valueOf.bind(method);value.toString=method.toString.bind(method);}
17
+ this.prototype[property]=value;}
18
+ return this;}};var Abstract={};Object.extend=function(destination,source){for(var property in source)
19
+ destination[property]=source[property];return destination;};Object.extend(Object,{inspect:function(object){try{if(Object.isUndefined(object))return'undefined';if(object===null)return'null';return object.inspect?object.inspect():String(object);}catch(e){if(e instanceof RangeError)return'...';throw e;}},toJSON:function(object){var type=typeof object;switch(type){case'undefined':case'function':case'unknown':return;case'boolean':return object.toString();}
20
+ if(object===null)return'null';if(object.toJSON)return object.toJSON();if(Object.isElement(object))return;var results=[];for(var property in object){var value=Object.toJSON(object[property]);if(!Object.isUndefined(value))
21
+ results.push(property.toJSON()+': '+value);}
22
+ return'{'+results.join(', ')+'}';},toQueryString:function(object){return $H(object).toQueryString();},toHTML:function(object){return object&&object.toHTML?object.toHTML():String.interpret(object);},keys:function(object){var keys=[];for(var property in object)
23
+ keys.push(property);return keys;},values:function(object){var values=[];for(var property in object)
24
+ values.push(object[property]);return values;},clone:function(object){return Object.extend({},object);},isElement:function(object){return!!(object&&object.nodeType==1);},isArray:function(object){return object!=null&&typeof object=="object"&&'splice'in object&&'join'in object;},isHash:function(object){return object instanceof Hash;},isFunction:function(object){return typeof object=="function";},isString:function(object){return typeof object=="string";},isNumber:function(object){return typeof object=="number";},isUndefined:function(object){return typeof object=="undefined";}});Object.extend(Function.prototype,{argumentNames:function(){var names=this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1].replace(/\s+/g,'').split(',');return names.length==1&&!names[0]?[]:names;},bind:function(){if(arguments.length<2&&Object.isUndefined(arguments[0]))return this;var __method=this,args=$A(arguments),object=args.shift();return function(){return __method.apply(object,args.concat($A(arguments)));}},bindAsEventListener:function(){var __method=this,args=$A(arguments),object=args.shift();return function(event){return __method.apply(object,[event||window.event].concat(args));}},curry:function(){if(!arguments.length)return this;var __method=this,args=$A(arguments);return function(){return __method.apply(this,args.concat($A(arguments)));}},delay:function(){var __method=this,args=$A(arguments),timeout=args.shift()*1000;return window.setTimeout(function(){return __method.apply(__method,args);},timeout);},defer:function(){var args=[0.01].concat($A(arguments));return this.delay.apply(this,args);},wrap:function(wrapper){var __method=this;return function(){return wrapper.apply(this,[__method.bind(this)].concat($A(arguments)));}},methodize:function(){if(this._methodized)return this._methodized;var __method=this;return this._methodized=function(){return __method.apply(null,[this].concat($A(arguments)));};}});Date.prototype.toJSON=function(){return'"'+this.getUTCFullYear()+'-'+
25
+ (this.getUTCMonth()+1).toPaddedString(2)+'-'+
26
+ this.getUTCDate().toPaddedString(2)+'T'+
27
+ this.getUTCHours().toPaddedString(2)+':'+
28
+ this.getUTCMinutes().toPaddedString(2)+':'+
29
+ this.getUTCSeconds().toPaddedString(2)+'Z"';};var Try={these:function(){var returnValue;for(var i=0,length=arguments.length;i<length;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
30
+ return returnValue;}};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(str){return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g,'\\$1');};var PeriodicalExecuter=Class.create({initialize:function(callback,frequency){this.callback=callback;this.frequency=frequency;this.currentlyExecuting=false;this.registerCallback();},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},execute:function(){this.callback(this);},stop:function(){if(!this.timer)return;clearInterval(this.timer);this.timer=null;},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.execute();}finally{this.currentlyExecuting=false;}}}});Object.extend(String,{interpret:function(value){return value==null?'':String(value);},specialChar:{'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','\\':'\\\\'}});Object.extend(String.prototype,{gsub:function(pattern,replacement){var result='',source=this,match;replacement=arguments.callee.prepareReplacement(replacement);while(source.length>0){if(match=source.match(pattern)){result+=source.slice(0,match.index);result+=String.interpret(replacement(match));source=source.slice(match.index+match[0].length);}else{result+=source,source='';}}
31
+ return result;},sub:function(pattern,replacement,count){replacement=this.gsub.prepareReplacement(replacement);count=Object.isUndefined(count)?1:count;return this.gsub(pattern,function(match){if(--count<0)return match[0];return replacement(match);});},scan:function(pattern,iterator){this.gsub(pattern,iterator);return String(this);},truncate:function(length,truncation){length=length||30;truncation=Object.isUndefined(truncation)?'...':truncation;return this.length>length?this.slice(0,length-truncation.length)+truncation:String(this);},strip:function(){return this.replace(/^\s+/,'').replace(/\s+$/,'');},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,'');},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,'img'),'');},extractScripts:function(){var matchAll=new RegExp(Prototype.ScriptFragment,'img');var matchOne=new RegExp(Prototype.ScriptFragment,'im');return(this.match(matchAll)||[]).map(function(scriptTag){return(scriptTag.match(matchOne)||['',''])[1];});},evalScripts:function(){return this.extractScripts().map(function(script){return eval(script)});},escapeHTML:function(){var self=arguments.callee;self.text.data=this;return self.div.innerHTML;},unescapeHTML:function(){var div=new Element('div');div.innerHTML=this.stripTags();return div.childNodes[0]?(div.childNodes.length>1?$A(div.childNodes).inject('',function(memo,node){return memo+node.nodeValue}):div.childNodes[0].nodeValue):'';},toQueryParams:function(separator){var match=this.strip().match(/([^?#]*)(#.*)?$/);if(!match)return{};return match[1].split(separator||'&').inject({},function(hash,pair){if((pair=pair.split('='))[0]){var key=decodeURIComponent(pair.shift());var value=pair.length>1?pair.join('='):pair[0];if(value!=undefined)value=decodeURIComponent(value);if(key in hash){if(!Object.isArray(hash[key]))hash[key]=[hash[key]];hash[key].push(value);}
32
+ else hash[key]=value;}
33
+ return hash;});},toArray:function(){return this.split('');},succ:function(){return this.slice(0,this.length-1)+
34
+ String.fromCharCode(this.charCodeAt(this.length-1)+1);},times:function(count){return count<1?'':new Array(count+1).join(this);},camelize:function(){var parts=this.split('-'),len=parts.length;if(len==1)return parts[0];var camelized=this.charAt(0)=='-'?parts[0].charAt(0).toUpperCase()+parts[0].substring(1):parts[0];for(var i=1;i<len;i++)
35
+ camelized+=parts[i].charAt(0).toUpperCase()+parts[i].substring(1);return camelized;},capitalize:function(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase();},underscore:function(){return this.gsub(/::/,'/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();},dasherize:function(){return this.gsub(/_/,'-');},inspect:function(useDoubleQuotes){var escapedString=this.gsub(/[\x00-\x1f\\]/,function(match){var character=String.specialChar[match[0]];return character?character:'\\u00'+match[0].charCodeAt().toPaddedString(2,16);});if(useDoubleQuotes)return'"'+escapedString.replace(/"/g,'\\"')+'"';return"'"+escapedString.replace(/'/g,'\\\'')+"'";},toJSON:function(){return this.inspect(true);},unfilterJSON:function(filter){return this.sub(filter||Prototype.JSONFilter,'#{1}');},isJSON:function(){var str=this;if(str.blank())return false;str=this.replace(/\\./g,'@').replace(/"[^"\\\n\r]*"/g,'');return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);},evalJSON:function(sanitize){var json=this.unfilterJSON();try{if(!sanitize||json.isJSON())return eval('('+json+')');}catch(e){}
36
+ throw new SyntaxError('Badly formed JSON string: '+this.inspect());},include:function(pattern){return this.indexOf(pattern)>-1;},startsWith:function(pattern){return this.indexOf(pattern)===0;},endsWith:function(pattern){var d=this.length-pattern.length;return d>=0&&this.lastIndexOf(pattern)===d;},empty:function(){return this=='';},blank:function(){return/^\s*$/.test(this);},interpolate:function(object,pattern){return new Template(this,pattern).evaluate(object);}});if(Prototype.Browser.WebKit||Prototype.Browser.IE)Object.extend(String.prototype,{escapeHTML:function(){return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');},unescapeHTML:function(){return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');}});String.prototype.gsub.prepareReplacement=function(replacement){if(Object.isFunction(replacement))return replacement;var template=new Template(replacement);return function(match){return template.evaluate(match)};};String.prototype.parseQuery=String.prototype.toQueryParams;Object.extend(String.prototype.escapeHTML,{div:document.createElement('div'),text:document.createTextNode('')});String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);var Template=Class.create({initialize:function(template,pattern){this.template=template.toString();this.pattern=pattern||Template.Pattern;},evaluate:function(object){if(Object.isFunction(object.toTemplateReplacements))
37
+ object=object.toTemplateReplacements();return this.template.gsub(this.pattern,function(match){if(object==null)return'';var before=match[1]||'';if(before=='\\')return match[2];var ctx=object,expr=match[3];var pattern=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;match=pattern.exec(expr);if(match==null)return before;while(match!=null){var comp=match[1].startsWith('[')?match[2].gsub('\\\\]',']'):match[1];ctx=ctx[comp];if(null==ctx||''==match[3])break;expr=expr.substring('['==match[3]?match[1].length:match[0].length);match=pattern.exec(expr);}
38
+ return before+String.interpret(ctx);});}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable={each:function(iterator,context){var index=0;try{this._each(function(value){iterator.call(context,value,index++);});}catch(e){if(e!=$break)throw e;}
39
+ return this;},eachSlice:function(number,iterator,context){var index=-number,slices=[],array=this.toArray();if(number<1)return array;while((index+=number)<array.length)
40
+ slices.push(array.slice(index,index+number));return slices.collect(iterator,context);},all:function(iterator,context){iterator=iterator||Prototype.K;var result=true;this.each(function(value,index){result=result&&!!iterator.call(context,value,index);if(!result)throw $break;});return result;},any:function(iterator,context){iterator=iterator||Prototype.K;var result=false;this.each(function(value,index){if(result=!!iterator.call(context,value,index))
41
+ throw $break;});return result;},collect:function(iterator,context){iterator=iterator||Prototype.K;var results=[];this.each(function(value,index){results.push(iterator.call(context,value,index));});return results;},detect:function(iterator,context){var result;this.each(function(value,index){if(iterator.call(context,value,index)){result=value;throw $break;}});return result;},findAll:function(iterator,context){var results=[];this.each(function(value,index){if(iterator.call(context,value,index))
42
+ results.push(value);});return results;},grep:function(filter,iterator,context){iterator=iterator||Prototype.K;var results=[];if(Object.isString(filter))
43
+ filter=new RegExp(filter);this.each(function(value,index){if(filter.match(value))
44
+ results.push(iterator.call(context,value,index));});return results;},include:function(object){if(Object.isFunction(this.indexOf))
45
+ if(this.indexOf(object)!=-1)return true;var found=false;this.each(function(value){if(value==object){found=true;throw $break;}});return found;},inGroupsOf:function(number,fillWith){fillWith=Object.isUndefined(fillWith)?null:fillWith;return this.eachSlice(number,function(slice){while(slice.length<number)slice.push(fillWith);return slice;});},inject:function(memo,iterator,context){this.each(function(value,index){memo=iterator.call(context,memo,value,index);});return memo;},invoke:function(method){var args=$A(arguments).slice(1);return this.map(function(value){return value[method].apply(value,args);});},max:function(iterator,context){iterator=iterator||Prototype.K;var result;this.each(function(value,index){value=iterator.call(context,value,index);if(result==null||value>=result)
46
+ result=value;});return result;},min:function(iterator,context){iterator=iterator||Prototype.K;var result;this.each(function(value,index){value=iterator.call(context,value,index);if(result==null||value<result)
47
+ result=value;});return result;},partition:function(iterator,context){iterator=iterator||Prototype.K;var trues=[],falses=[];this.each(function(value,index){(iterator.call(context,value,index)?trues:falses).push(value);});return[trues,falses];},pluck:function(property){var results=[];this.each(function(value){results.push(value[property]);});return results;},reject:function(iterator,context){var results=[];this.each(function(value,index){if(!iterator.call(context,value,index))
48
+ results.push(value);});return results;},sortBy:function(iterator,context){return this.map(function(value,index){return{value:value,criteria:iterator.call(context,value,index)};}).sort(function(left,right){var a=left.criteria,b=right.criteria;return a<b?-1:a>b?1:0;}).pluck('value');},toArray:function(){return this.map();},zip:function(){var iterator=Prototype.K,args=$A(arguments);if(Object.isFunction(args.last()))
49
+ iterator=args.pop();var collections=[this].concat(args).map($A);return this.map(function(value,index){return iterator(collections.pluck(index));});},size:function(){return this.toArray().length;},inspect:function(){return'#<Enumerable:'+this.toArray().inspect()+'>';}};Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,filter:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray,every:Enumerable.all,some:Enumerable.any});function $A(iterable){if(!iterable)return[];if(iterable.toArray)return iterable.toArray();var length=iterable.length||0,results=new Array(length);while(length--)results[length]=iterable[length];return results;}
50
+ if(Prototype.Browser.WebKit){$A=function(iterable){if(!iterable)return[];if(!(typeof iterable==='function'&&typeof iterable.length==='number'&&typeof iterable.item==='function')&&iterable.toArray)
51
+ return iterable.toArray();var length=iterable.length||0,results=new Array(length);while(length--)results[length]=iterable[length];return results;};}
52
+ Array.from=$A;Object.extend(Array.prototype,Enumerable);if(!Array.prototype._reverse)Array.prototype._reverse=Array.prototype.reverse;Object.extend(Array.prototype,{_each:function(iterator){for(var i=0,length=this.length;i<length;i++)
53
+ iterator(this[i]);},clear:function(){this.length=0;return this;},first:function(){return this[0];},last:function(){return this[this.length-1];},compact:function(){return this.select(function(value){return value!=null;});},flatten:function(){return this.inject([],function(array,value){return array.concat(Object.isArray(value)?value.flatten():[value]);});},without:function(){var values=$A(arguments);return this.select(function(value){return!values.include(value);});},reverse:function(inline){return(inline!==false?this:this.toArray())._reverse();},reduce:function(){return this.length>1?this:this[0];},uniq:function(sorted){return this.inject([],function(array,value,index){if(0==index||(sorted?array.last()!=value:!array.include(value)))
54
+ array.push(value);return array;});},intersect:function(array){return this.uniq().findAll(function(item){return array.detect(function(value){return item===value});});},clone:function(){return[].concat(this);},size:function(){return this.length;},inspect:function(){return'['+this.map(Object.inspect).join(', ')+']';},toJSON:function(){var results=[];this.each(function(object){var value=Object.toJSON(object);if(!Object.isUndefined(value))results.push(value);});return'['+results.join(', ')+']';}});if(Object.isFunction(Array.prototype.forEach))
55
+ Array.prototype._each=Array.prototype.forEach;if(!Array.prototype.indexOf)Array.prototype.indexOf=function(item,i){i||(i=0);var length=this.length;if(i<0)i=length+i;for(;i<length;i++)
56
+ if(this[i]===item)return i;return-1;};if(!Array.prototype.lastIndexOf)Array.prototype.lastIndexOf=function(item,i){i=isNaN(i)?this.length:(i<0?this.length+i:i)+1;var n=this.slice(0,i).reverse().indexOf(item);return(n<0)?n:i-n-1;};Array.prototype.toArray=Array.prototype.clone;function $w(string){if(!Object.isString(string))return[];string=string.strip();return string?string.split(/\s+/):[];}
57
+ if(Prototype.Browser.Opera){Array.prototype.concat=function(){var array=[];for(var i=0,length=this.length;i<length;i++)array.push(this[i]);for(var i=0,length=arguments.length;i<length;i++){if(Object.isArray(arguments[i])){for(var j=0,arrayLength=arguments[i].length;j<arrayLength;j++)
58
+ array.push(arguments[i][j]);}else{array.push(arguments[i]);}}
59
+ return array;};}
60
+ Object.extend(Number.prototype,{toColorPart:function(){return this.toPaddedString(2,16);},succ:function(){return this+1;},times:function(iterator,context){$R(0,this,true).each(iterator,context);return this;},toPaddedString:function(length,radix){var string=this.toString(radix||10);return'0'.times(length-string.length)+string;},toJSON:function(){return isFinite(this)?this.toString():'null';}});$w('abs round ceil floor').each(function(method){Number.prototype[method]=Math[method].methodize();});function $H(object){return new Hash(object);};var Hash=Class.create(Enumerable,(function(){function toQueryPair(key,value){if(Object.isUndefined(value))return key;return key+'='+encodeURIComponent(String.interpret(value));}
61
+ return{initialize:function(object){this._object=Object.isHash(object)?object.toObject():Object.clone(object);},_each:function(iterator){for(var key in this._object){var value=this._object[key],pair=[key,value];pair.key=key;pair.value=value;iterator(pair);}},set:function(key,value){return this._object[key]=value;},get:function(key){if(this._object[key]!==Object.prototype[key])
62
+ return this._object[key];},unset:function(key){var value=this._object[key];delete this._object[key];return value;},toObject:function(){return Object.clone(this._object);},keys:function(){return this.pluck('key');},values:function(){return this.pluck('value');},index:function(value){var match=this.detect(function(pair){return pair.value===value;});return match&&match.key;},merge:function(object){return this.clone().update(object);},update:function(object){return new Hash(object).inject(this,function(result,pair){result.set(pair.key,pair.value);return result;});},toQueryString:function(){return this.inject([],function(results,pair){var key=encodeURIComponent(pair.key),values=pair.value;if(values&&typeof values=='object'){if(Object.isArray(values))
63
+ return results.concat(values.map(toQueryPair.curry(key)));}else results.push(toQueryPair(key,values));return results;}).join('&');},inspect:function(){return'#<Hash:{'+this.map(function(pair){return pair.map(Object.inspect).join(': ');}).join(', ')+'}>';},toJSON:function(){return Object.toJSON(this.toObject());},clone:function(){return new Hash(this);}}})());Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;Hash.from=$H;var ObjectRange=Class.create(Enumerable,{initialize:function(start,end,exclusive){this.start=start;this.end=end;this.exclusive=exclusive;},_each:function(iterator){var value=this.start;while(this.include(value)){iterator(value);value=value.succ();}},include:function(value){if(value<this.start)
64
+ return false;if(this.exclusive)
65
+ return value<this.end;return value<=this.end;}});var $R=function(start,end,exclusive){return new ObjectRange(start,end,exclusive);};var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject('Msxml2.XMLHTTP')},function(){return new ActiveXObject('Microsoft.XMLHTTP')})||false;},activeRequestCount:0};Ajax.Responders={responders:[],_each:function(iterator){this.responders._each(iterator);},register:function(responder){if(!this.include(responder))
66
+ this.responders.push(responder);},unregister:function(responder){this.responders=this.responders.without(responder);},dispatch:function(callback,request,transport,json){this.each(function(responder){if(Object.isFunction(responder[callback])){try{responder[callback].apply(responder,[request,transport,json]);}catch(e){}}});}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++},onComplete:function(){Ajax.activeRequestCount--}});Ajax.Base=Class.create({initialize:function(options){this.options={method:'post',asynchronous:true,contentType:'application/x-www-form-urlencoded',encoding:'UTF-8',parameters:'',evalJSON:true,evalJS:true};Object.extend(this.options,options||{});this.options.method=this.options.method.toLowerCase();if(Object.isString(this.options.parameters))
67
+ this.options.parameters=this.options.parameters.toQueryParams();else if(Object.isHash(this.options.parameters))
68
+ this.options.parameters=this.options.parameters.toObject();}});Ajax.Request=Class.create(Ajax.Base,{_complete:false,initialize:function($super,url,options){$super(options);this.transport=Ajax.getTransport();this.request(url);},request:function(url){this.url=url;this.method=this.options.method;var params=Object.clone(this.options.parameters);if(!['get','post'].include(this.method)){params['_method']=this.method;this.method='post';}
69
+ this.parameters=params;if(params=Object.toQueryString(params)){if(this.method=='get')
70
+ this.url+=(this.url.include('?')?'&':'?')+params;else if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
71
+ params+='&_=';}
72
+ try{var response=new Ajax.Response(this);if(this.options.onCreate)this.options.onCreate(response);Ajax.Responders.dispatch('onCreate',this,response);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous)this.respondToReadyState.bind(this).defer(1);this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();this.body=this.method=='post'?(this.options.postBody||params):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType)
73
+ this.onStateChange();}
74
+ catch(e){this.dispatchException(e);}},onStateChange:function(){var readyState=this.transport.readyState;if(readyState>1&&!((readyState==4)&&this._complete))
75
+ this.respondToReadyState(this.transport.readyState);},setRequestHeaders:function(){var headers={'X-Requested-With':'XMLHttpRequest','X-Prototype-Version':Prototype.Version,'Accept':'text/javascript, text/html, application/xml, text/xml, */*'};if(this.method=='post'){headers['Content-type']=this.options.contentType+
76
+ (this.options.encoding?'; charset='+this.options.encoding:'');if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005)
77
+ headers['Connection']='close';}
78
+ if(typeof this.options.requestHeaders=='object'){var extras=this.options.requestHeaders;if(Object.isFunction(extras.push))
79
+ for(var i=0,length=extras.length;i<length;i+=2)
80
+ headers[extras[i]]=extras[i+1];else
81
+ $H(extras).each(function(pair){headers[pair.key]=pair.value});}
82
+ for(var name in headers)
83
+ this.transport.setRequestHeader(name,headers[name]);},success:function(){var status=this.getStatus();return!status||(status>=200&&status<300);},getStatus:function(){try{return this.transport.status||0;}catch(e){return 0}},respondToReadyState:function(readyState){var state=Ajax.Request.Events[readyState],response=new Ajax.Response(this);if(state=='Complete'){try{this._complete=true;(this.options['on'+response.status]||this.options['on'+(this.success()?'Success':'Failure')]||Prototype.emptyFunction)(response,response.headerJSON);}catch(e){this.dispatchException(e);}
84
+ var contentType=response.getHeader('Content-type');if(this.options.evalJS=='force'||(this.options.evalJS&&this.isSameOrigin()&&contentType&&contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
85
+ this.evalResponse();}
86
+ try{(this.options['on'+state]||Prototype.emptyFunction)(response,response.headerJSON);Ajax.Responders.dispatch('on'+state,this,response,response.headerJSON);}catch(e){this.dispatchException(e);}
87
+ if(state=='Complete'){this.transport.onreadystatechange=Prototype.emptyFunction;}},isSameOrigin:function(){var m=this.url.match(/^\s*https?:\/\/[^\/]*/);return!m||(m[0]=='#{protocol}//#{domain}#{port}'.interpolate({protocol:location.protocol,domain:document.domain,port:location.port?':'+location.port:''}));},getHeader:function(name){try{return this.transport.getResponseHeader(name)||null;}catch(e){return null}},evalResponse:function(){try{return eval((this.transport.responseText||'').unfilterJSON());}catch(e){this.dispatchException(e);}},dispatchException:function(exception){(this.options.onException||Prototype.emptyFunction)(this,exception);Ajax.Responders.dispatch('onException',this,exception);}});Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];Ajax.Response=Class.create({initialize:function(request){this.request=request;var transport=this.transport=request.transport,readyState=this.readyState=transport.readyState;if((readyState>2&&!Prototype.Browser.IE)||readyState==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(transport.responseText);this.headerJSON=this._getHeaderJSON();}
88
+ if(readyState==4){var xml=transport.responseXML;this.responseXML=Object.isUndefined(xml)?null:xml;this.responseJSON=this._getResponseJSON();}},status:0,statusText:'',getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||'';}catch(e){return''}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders();}catch(e){return null}},getResponseHeader:function(name){return this.transport.getResponseHeader(name);},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders();},_getHeaderJSON:function(){var json=this.getHeader('X-JSON');if(!json)return null;json=decodeURIComponent(escape(json));try{return json.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin());}catch(e){this.request.dispatchException(e);}},_getResponseJSON:function(){var options=this.request.options;if(!options.evalJSON||(options.evalJSON!='force'&&!(this.getHeader('Content-type')||'').include('application/json'))||this.responseText.blank())
89
+ return null;try{return this.responseText.evalJSON(options.sanitizeJSON||!this.request.isSameOrigin());}catch(e){this.request.dispatchException(e);}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,container,url,options){this.container={success:(container.success||container),failure:(container.failure||(container.success?null:container))};options=Object.clone(options);var onComplete=options.onComplete;options.onComplete=(function(response,json){this.updateContent(response.responseText);if(Object.isFunction(onComplete))onComplete(response,json);}).bind(this);$super(url,options);},updateContent:function(responseText){var receiver=this.container[this.success()?'success':'failure'],options=this.options;if(!options.evalScripts)responseText=responseText.stripScripts();if(receiver=$(receiver)){if(options.insertion){if(Object.isString(options.insertion)){var insertion={};insertion[options.insertion]=responseText;receiver.insert(insertion);}
90
+ else options.insertion(receiver,responseText);}
91
+ else receiver.update(responseText);}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,container,url,options){$super(options);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=container;this.url=url;this.start();},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent();},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},updateComplete:function(response){if(this.options.decay){this.decay=(response.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=response.responseText;}
92
+ this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency);},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options);}});function $(element){if(arguments.length>1){for(var i=0,elements=[],length=arguments.length;i<length;i++)
93
+ elements.push($(arguments[i]));return elements;}
94
+ if(Object.isString(element))
95
+ element=document.getElementById(element);return Element.extend(element);}
96
+ if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(expression,parentElement){var results=[];var query=document.evaluate(expression,$(parentElement)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var i=0,length=query.snapshotLength;i<length;i++)
97
+ results.push(Element.extend(query.snapshotItem(i)));return results;};}
98
+ if(!window.Node)var Node={};if(!Node.ELEMENT_NODE){Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12});}
99
+ (function(){var element=this.Element;this.Element=function(tagName,attributes){attributes=attributes||{};tagName=tagName.toLowerCase();var cache=Element.cache;if(Prototype.Browser.IE&&attributes.name){tagName='<'+tagName+' name="'+attributes.name+'">';delete attributes.name;return Element.writeAttribute(document.createElement(tagName),attributes);}
100
+ if(!cache[tagName])cache[tagName]=Element.extend(document.createElement(tagName));return Element.writeAttribute(cache[tagName].cloneNode(false),attributes);};Object.extend(this.Element,element||{});if(element)this.Element.prototype=element.prototype;}).call(window);Element.cache={};Element.Methods={visible:function(element){return $(element).style.display!='none';},toggle:function(element){element=$(element);Element[Element.visible(element)?'hide':'show'](element);return element;},hide:function(element){element=$(element);element.style.display='none';return element;},show:function(element){element=$(element);element.style.display='';return element;},remove:function(element){element=$(element);element.parentNode.removeChild(element);return element;},update:function(element,content){element=$(element);if(content&&content.toElement)content=content.toElement();if(Object.isElement(content))return element.update().insert(content);content=Object.toHTML(content);element.innerHTML=content.stripScripts();content.evalScripts.bind(content).defer();return element;},replace:function(element,content){element=$(element);if(content&&content.toElement)content=content.toElement();else if(!Object.isElement(content)){content=Object.toHTML(content);var range=element.ownerDocument.createRange();range.selectNode(element);content.evalScripts.bind(content).defer();content=range.createContextualFragment(content.stripScripts());}
101
+ element.parentNode.replaceChild(content,element);return element;},insert:function(element,insertions){element=$(element);if(Object.isString(insertions)||Object.isNumber(insertions)||Object.isElement(insertions)||(insertions&&(insertions.toElement||insertions.toHTML)))
102
+ insertions={bottom:insertions};var content,insert,tagName,childNodes;for(var position in insertions){content=insertions[position];position=position.toLowerCase();insert=Element._insertionTranslations[position];if(content&&content.toElement)content=content.toElement();if(Object.isElement(content)){insert(element,content);continue;}
103
+ content=Object.toHTML(content);tagName=((position=='before'||position=='after')?element.parentNode:element).tagName.toUpperCase();childNodes=Element._getContentFromAnonymousElement(tagName,content.stripScripts());if(position=='top'||position=='after')childNodes.reverse();childNodes.each(insert.curry(element));content.evalScripts.bind(content).defer();}
104
+ return element;},wrap:function(element,wrapper,attributes){element=$(element);if(Object.isElement(wrapper))
105
+ $(wrapper).writeAttribute(attributes||{});else if(Object.isString(wrapper))wrapper=new Element(wrapper,attributes);else wrapper=new Element('div',wrapper);if(element.parentNode)
106
+ element.parentNode.replaceChild(wrapper,element);wrapper.appendChild(element);return wrapper;},inspect:function(element){element=$(element);var result='<'+element.tagName.toLowerCase();$H({'id':'id','className':'class'}).each(function(pair){var property=pair.first(),attribute=pair.last();var value=(element[property]||'').toString();if(value)result+=' '+attribute+'='+value.inspect(true);});return result+'>';},recursivelyCollect:function(element,property){element=$(element);var elements=[];while(element=element[property])
107
+ if(element.nodeType==1)
108
+ elements.push(Element.extend(element));return elements;},ancestors:function(element){return $(element).recursivelyCollect('parentNode');},descendants:function(element){return $(element).select("*");},firstDescendant:function(element){element=$(element).firstChild;while(element&&element.nodeType!=1)element=element.nextSibling;return $(element);},immediateDescendants:function(element){if(!(element=$(element).firstChild))return[];while(element&&element.nodeType!=1)element=element.nextSibling;if(element)return[element].concat($(element).nextSiblings());return[];},previousSiblings:function(element){return $(element).recursivelyCollect('previousSibling');},nextSiblings:function(element){return $(element).recursivelyCollect('nextSibling');},siblings:function(element){element=$(element);return element.previousSiblings().reverse().concat(element.nextSiblings());},match:function(element,selector){if(Object.isString(selector))
109
+ selector=new Selector(selector);return selector.match($(element));},up:function(element,expression,index){element=$(element);if(arguments.length==1)return $(element.parentNode);var ancestors=element.ancestors();return Object.isNumber(expression)?ancestors[expression]:Selector.findElement(ancestors,expression,index);},down:function(element,expression,index){element=$(element);if(arguments.length==1)return element.firstDescendant();return Object.isNumber(expression)?element.descendants()[expression]:Element.select(element,expression)[index||0];},previous:function(element,expression,index){element=$(element);if(arguments.length==1)return $(Selector.handlers.previousElementSibling(element));var previousSiblings=element.previousSiblings();return Object.isNumber(expression)?previousSiblings[expression]:Selector.findElement(previousSiblings,expression,index);},next:function(element,expression,index){element=$(element);if(arguments.length==1)return $(Selector.handlers.nextElementSibling(element));var nextSiblings=element.nextSiblings();return Object.isNumber(expression)?nextSiblings[expression]:Selector.findElement(nextSiblings,expression,index);},select:function(){var args=$A(arguments),element=$(args.shift());return Selector.findChildElements(element,args);},adjacent:function(){var args=$A(arguments),element=$(args.shift());return Selector.findChildElements(element.parentNode,args).without(element);},identify:function(element){element=$(element);var id=element.readAttribute('id'),self=arguments.callee;if(id)return id;do{id='anonymous_element_'+self.counter++}while($(id));element.writeAttribute('id',id);return id;},readAttribute:function(element,name){element=$(element);if(Prototype.Browser.IE){var t=Element._attributeTranslations.read;if(t.values[name])return t.values[name](element,name);if(t.names[name])name=t.names[name];if(name.include(':')){return(!element.attributes||!element.attributes[name])?null:element.attributes[name].value;}}
110
+ return element.getAttribute(name);},writeAttribute:function(element,name,value){element=$(element);var attributes={},t=Element._attributeTranslations.write;if(typeof name=='object')attributes=name;else attributes[name]=Object.isUndefined(value)?true:value;for(var attr in attributes){name=t.names[attr]||attr;value=attributes[attr];if(t.values[attr])name=t.values[attr](element,value);if(value===false||value===null)
111
+ element.removeAttribute(name);else if(value===true)
112
+ element.setAttribute(name,name);else element.setAttribute(name,value);}
113
+ return element;},getHeight:function(element){return $(element).getDimensions().height;},getWidth:function(element){return $(element).getDimensions().width;},classNames:function(element){return new Element.ClassNames(element);},hasClassName:function(element,className){if(!(element=$(element)))return;var elementClassName=element.className;return(elementClassName.length>0&&(elementClassName==className||new RegExp("(^|\\s)"+className+"(\\s|$)").test(elementClassName)));},addClassName:function(element,className){if(!(element=$(element)))return;if(!element.hasClassName(className))
114
+ element.className+=(element.className?' ':'')+className;return element;},removeClassName:function(element,className){if(!(element=$(element)))return;element.className=element.className.replace(new RegExp("(^|\\s+)"+className+"(\\s+|$)"),' ').strip();return element;},toggleClassName:function(element,className){if(!(element=$(element)))return;return element[element.hasClassName(className)?'removeClassName':'addClassName'](className);},cleanWhitespace:function(element){element=$(element);var node=element.firstChild;while(node){var nextNode=node.nextSibling;if(node.nodeType==3&&!/\S/.test(node.nodeValue))
115
+ element.removeChild(node);node=nextNode;}
116
+ return element;},empty:function(element){return $(element).innerHTML.blank();},descendantOf:function(element,ancestor){element=$(element),ancestor=$(ancestor);if(element.compareDocumentPosition)
117
+ return(element.compareDocumentPosition(ancestor)&8)===8;if(ancestor.contains)
118
+ return ancestor.contains(element)&&ancestor!==element;while(element=element.parentNode)
119
+ if(element==ancestor)return true;return false;},scrollTo:function(element){element=$(element);var pos=element.cumulativeOffset();window.scrollTo(pos[0],pos[1]);return element;},getStyle:function(element,style){element=$(element);style=style=='float'?'cssFloat':style.camelize();var value=element.style[style];if(!value||value=='auto'){var css=document.defaultView.getComputedStyle(element,null);value=css?css[style]:null;}
120
+ if(style=='opacity')return value?parseFloat(value):1.0;return value=='auto'?null:value;},getOpacity:function(element){return $(element).getStyle('opacity');},setStyle:function(element,styles){element=$(element);var elementStyle=element.style,match;if(Object.isString(styles)){element.style.cssText+=';'+styles;return styles.include('opacity')?element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]):element;}
121
+ for(var property in styles)
122
+ if(property=='opacity')element.setOpacity(styles[property]);else
123
+ elementStyle[(property=='float'||property=='cssFloat')?(Object.isUndefined(elementStyle.styleFloat)?'cssFloat':'styleFloat'):property]=styles[property];return element;},setOpacity:function(element,value){element=$(element);element.style.opacity=(value==1||value==='')?'':(value<0.00001)?0:value;return element;},getDimensions:function(element){element=$(element);var display=element.getStyle('display');if(display!='none'&&display!=null)
124
+ return{width:element.offsetWidth,height:element.offsetHeight};var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;var originalDisplay=els.display;els.visibility='hidden';els.position='absolute';els.display='block';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display=originalDisplay;els.position=originalPosition;els.visibility=originalVisibility;return{width:originalWidth,height:originalHeight};},makePositioned:function(element){element=$(element);var pos=Element.getStyle(element,'position');if(pos=='static'||!pos){element._madePositioned=true;element.style.position='relative';if(Prototype.Browser.Opera){element.style.top=0;element.style.left=0;}}
125
+ return element;},undoPositioned:function(element){element=$(element);if(element._madePositioned){element._madePositioned=undefined;element.style.position=element.style.top=element.style.left=element.style.bottom=element.style.right='';}
126
+ return element;},makeClipping:function(element){element=$(element);if(element._overflow)return element;element._overflow=Element.getStyle(element,'overflow')||'auto';if(element._overflow!=='hidden')
127
+ element.style.overflow='hidden';return element;},undoClipping:function(element){element=$(element);if(!element._overflow)return element;element.style.overflow=element._overflow=='auto'?'':element._overflow;element._overflow=null;return element;},cumulativeOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;}while(element);return Element._returnOffset(valueL,valueT);},positionedOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;if(element){if(element.tagName.toUpperCase()=='BODY')break;var p=Element.getStyle(element,'position');if(p!=='static')break;}}while(element);return Element._returnOffset(valueL,valueT);},absolutize:function(element){element=$(element);if(element.getStyle('position')=='absolute')return element;var offsets=element.positionedOffset();var top=offsets[1];var left=offsets[0];var width=element.clientWidth;var height=element.clientHeight;element._originalLeft=left-parseFloat(element.style.left||0);element._originalTop=top-parseFloat(element.style.top||0);element._originalWidth=element.style.width;element._originalHeight=element.style.height;element.style.position='absolute';element.style.top=top+'px';element.style.left=left+'px';element.style.width=width+'px';element.style.height=height+'px';return element;},relativize:function(element){element=$(element);if(element.getStyle('position')=='relative')return element;element.style.position='relative';var top=parseFloat(element.style.top||0)-(element._originalTop||0);var left=parseFloat(element.style.left||0)-(element._originalLeft||0);element.style.top=top+'px';element.style.left=left+'px';element.style.height=element._originalHeight;element.style.width=element._originalWidth;return element;},cumulativeScrollOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.scrollTop||0;valueL+=element.scrollLeft||0;element=element.parentNode;}while(element);return Element._returnOffset(valueL,valueT);},getOffsetParent:function(element){if(element.offsetParent)return $(element.offsetParent);if(element==document.body)return $(element);while((element=element.parentNode)&&element!=document.body)
128
+ if(Element.getStyle(element,'position')!='static')
129
+ return $(element);return $(document.body);},viewportOffset:function(forElement){var valueT=0,valueL=0;var element=forElement;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body&&Element.getStyle(element,'position')=='absolute')break;}while(element=element.offsetParent);element=forElement;do{if(!Prototype.Browser.Opera||(element.tagName&&(element.tagName.toUpperCase()=='BODY'))){valueT-=element.scrollTop||0;valueL-=element.scrollLeft||0;}}while(element=element.parentNode);return Element._returnOffset(valueL,valueT);},clonePosition:function(element,source){var options=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});source=$(source);var p=source.viewportOffset();element=$(element);var delta=[0,0];var parent=null;if(Element.getStyle(element,'position')=='absolute'){parent=element.getOffsetParent();delta=parent.viewportOffset();}
130
+ if(parent==document.body){delta[0]-=document.body.offsetLeft;delta[1]-=document.body.offsetTop;}
131
+ if(options.setLeft)element.style.left=(p[0]-delta[0]+options.offsetLeft)+'px';if(options.setTop)element.style.top=(p[1]-delta[1]+options.offsetTop)+'px';if(options.setWidth)element.style.width=source.offsetWidth+'px';if(options.setHeight)element.style.height=source.offsetHeight+'px';return element;}};Element.Methods.identify.counter=1;Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants});Element._attributeTranslations={write:{names:{className:'class',htmlFor:'for'},values:{}}};if(Prototype.Browser.Opera){Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(proceed,element,style){switch(style){case'left':case'top':case'right':case'bottom':if(proceed(element,'position')==='static')return null;case'height':case'width':if(!Element.visible(element))return null;var dim=parseInt(proceed(element,style),10);if(dim!==element['offset'+style.capitalize()])
132
+ return dim+'px';var properties;if(style==='height'){properties=['border-top-width','padding-top','padding-bottom','border-bottom-width'];}
133
+ else{properties=['border-left-width','padding-left','padding-right','border-right-width'];}
134
+ return properties.inject(dim,function(memo,property){var val=proceed(element,property);return val===null?memo:memo-parseInt(val,10);})+'px';default:return proceed(element,style);}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(proceed,element,attribute){if(attribute==='title')return element.title;return proceed(element,attribute);});}
135
+ else if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(proceed,element){element=$(element);try{element.offsetParent}
136
+ catch(e){return $(document.body)}
137
+ var position=element.getStyle('position');if(position!=='static')return proceed(element);element.setStyle({position:'relative'});var value=proceed(element);element.setStyle({position:position});return value;});$w('positionedOffset viewportOffset').each(function(method){Element.Methods[method]=Element.Methods[method].wrap(function(proceed,element){element=$(element);try{element.offsetParent}
138
+ catch(e){return Element._returnOffset(0,0)}
139
+ var position=element.getStyle('position');if(position!=='static')return proceed(element);var offsetParent=element.getOffsetParent();if(offsetParent&&offsetParent.getStyle('position')==='fixed')
140
+ offsetParent.setStyle({zoom:1});element.setStyle({position:'relative'});var value=proceed(element);element.setStyle({position:position});return value;});});Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap(function(proceed,element){try{element.offsetParent}
141
+ catch(e){return Element._returnOffset(0,0)}
142
+ return proceed(element);});Element.Methods.getStyle=function(element,style){element=$(element);style=(style=='float'||style=='cssFloat')?'styleFloat':style.camelize();var value=element.style[style];if(!value&&element.currentStyle)value=element.currentStyle[style];if(style=='opacity'){if(value=(element.getStyle('filter')||'').match(/alpha\(opacity=(.*)\)/))
143
+ if(value[1])return parseFloat(value[1])/100;return 1.0;}
144
+ if(value=='auto'){if((style=='width'||style=='height')&&(element.getStyle('display')!='none'))
145
+ return element['offset'+style.capitalize()]+'px';return null;}
146
+ return value;};Element.Methods.setOpacity=function(element,value){function stripAlpha(filter){return filter.replace(/alpha\([^\)]*\)/gi,'');}
147
+ element=$(element);var currentStyle=element.currentStyle;if((currentStyle&&!currentStyle.hasLayout)||(!currentStyle&&element.style.zoom=='normal'))
148
+ element.style.zoom=1;var filter=element.getStyle('filter'),style=element.style;if(value==1||value===''){(filter=stripAlpha(filter))?style.filter=filter:style.removeAttribute('filter');return element;}else if(value<0.00001)value=0;style.filter=stripAlpha(filter)+'alpha(opacity='+(value*100)+')';return element;};Element._attributeTranslations={read:{names:{'class':'className','for':'htmlFor'},values:{_getAttr:function(element,attribute){return element.getAttribute(attribute,2);},_getAttrNode:function(element,attribute){var node=element.getAttributeNode(attribute);return node?node.value:"";},_getEv:function(element,attribute){attribute=element.getAttribute(attribute);return attribute?attribute.toString().slice(23,-2):null;},_flag:function(element,attribute){return $(element).hasAttribute(attribute)?attribute:null;},style:function(element){return element.style.cssText.toLowerCase();},title:function(element){return element.title;}}}};Element._attributeTranslations.write={names:Object.extend({cellpadding:'cellPadding',cellspacing:'cellSpacing'},Element._attributeTranslations.read.names),values:{checked:function(element,value){element.checked=!!value;},style:function(element,value){element.style.cssText=value?value:'';}}};Element._attributeTranslations.has={};$w('colSpan rowSpan vAlign dateTime accessKey tabIndex '+'encType maxLength readOnly longDesc frameBorder').each(function(attr){Element._attributeTranslations.write.names[attr.toLowerCase()]=attr;Element._attributeTranslations.has[attr.toLowerCase()]=attr;});(function(v){Object.extend(v,{href:v._getAttr,src:v._getAttr,type:v._getAttr,action:v._getAttrNode,disabled:v._flag,checked:v._flag,readonly:v._flag,multiple:v._flag,onload:v._getEv,onunload:v._getEv,onclick:v._getEv,ondblclick:v._getEv,onmousedown:v._getEv,onmouseup:v._getEv,onmouseover:v._getEv,onmousemove:v._getEv,onmouseout:v._getEv,onfocus:v._getEv,onblur:v._getEv,onkeypress:v._getEv,onkeydown:v._getEv,onkeyup:v._getEv,onsubmit:v._getEv,onreset:v._getEv,onselect:v._getEv,onchange:v._getEv});})(Element._attributeTranslations.read.values);}
149
+ else if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(element,value){element=$(element);element.style.opacity=(value==1)?0.999999:(value==='')?'':(value<0.00001)?0:value;return element;};}
150
+ else if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(element,value){element=$(element);element.style.opacity=(value==1||value==='')?'':(value<0.00001)?0:value;if(value==1)
151
+ if(element.tagName.toUpperCase()=='IMG'&&element.width){element.width++;element.width--;}else try{var n=document.createTextNode(' ');element.appendChild(n);element.removeChild(n);}catch(e){}
152
+ return element;};Element.Methods.cumulativeOffset=function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
153
+ if(Element.getStyle(element,'position')=='absolute')break;element=element.offsetParent;}while(element);return Element._returnOffset(valueL,valueT);};}
154
+ if(Prototype.Browser.IE||Prototype.Browser.Opera){Element.Methods.update=function(element,content){element=$(element);if(content&&content.toElement)content=content.toElement();if(Object.isElement(content))return element.update().insert(content);content=Object.toHTML(content);var tagName=element.tagName.toUpperCase();if(tagName in Element._insertionTranslations.tags){$A(element.childNodes).each(function(node){element.removeChild(node)});Element._getContentFromAnonymousElement(tagName,content.stripScripts()).each(function(node){element.appendChild(node)});}
155
+ else element.innerHTML=content.stripScripts();content.evalScripts.bind(content).defer();return element;};}
156
+ if('outerHTML'in document.createElement('div')){Element.Methods.replace=function(element,content){element=$(element);if(content&&content.toElement)content=content.toElement();if(Object.isElement(content)){element.parentNode.replaceChild(content,element);return element;}
157
+ content=Object.toHTML(content);var parent=element.parentNode,tagName=parent.tagName.toUpperCase();if(Element._insertionTranslations.tags[tagName]){var nextSibling=element.next();var fragments=Element._getContentFromAnonymousElement(tagName,content.stripScripts());parent.removeChild(element);if(nextSibling)
158
+ fragments.each(function(node){parent.insertBefore(node,nextSibling)});else
159
+ fragments.each(function(node){parent.appendChild(node)});}
160
+ else element.outerHTML=content.stripScripts();content.evalScripts.bind(content).defer();return element;};}
161
+ Element._returnOffset=function(l,t){var result=[l,t];result.left=l;result.top=t;return result;};Element._getContentFromAnonymousElement=function(tagName,html){var div=new Element('div'),t=Element._insertionTranslations.tags[tagName];if(t){div.innerHTML=t[0]+html+t[1];t[2].times(function(){div=div.firstChild});}else div.innerHTML=html;return $A(div.childNodes);};Element._insertionTranslations={before:function(element,node){element.parentNode.insertBefore(node,element);},top:function(element,node){element.insertBefore(node,element.firstChild);},bottom:function(element,node){element.appendChild(node);},after:function(element,node){element.parentNode.insertBefore(node,element.nextSibling);},tags:{TABLE:['<table>','</table>',1],TBODY:['<table><tbody>','</tbody></table>',2],TR:['<table><tbody><tr>','</tr></tbody></table>',3],TD:['<table><tbody><tr><td>','</td></tr></tbody></table>',4],SELECT:['<select>','</select>',1]}};(function(){Object.extend(this.tags,{THEAD:this.tags.TBODY,TFOOT:this.tags.TBODY,TH:this.tags.TD});}).call(Element._insertionTranslations);Element.Methods.Simulated={hasAttribute:function(element,attribute){attribute=Element._attributeTranslations.has[attribute]||attribute;var node=$(element).getAttributeNode(attribute);return!!(node&&node.specified);}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement('div')['__proto__']){window.HTMLElement={};window.HTMLElement.prototype=document.createElement('div')['__proto__'];Prototype.BrowserFeatures.ElementExtensions=true;}
162
+ Element.extend=(function(){if(Prototype.BrowserFeatures.SpecificElementExtensions)
163
+ return Prototype.K;var Methods={},ByTag=Element.Methods.ByTag;var extend=Object.extend(function(element){if(!element||element._extendedByPrototype||element.nodeType!=1||element==window)return element;var methods=Object.clone(Methods),tagName=element.tagName.toUpperCase(),property,value;if(ByTag[tagName])Object.extend(methods,ByTag[tagName]);for(property in methods){value=methods[property];if(Object.isFunction(value)&&!(property in element))
164
+ element[property]=value.methodize();}
165
+ element._extendedByPrototype=Prototype.emptyFunction;return element;},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(Methods,Element.Methods);Object.extend(Methods,Element.Methods.Simulated);}}});extend.refresh();return extend;})();Element.hasAttribute=function(element,attribute){if(element.hasAttribute)return element.hasAttribute(attribute);return Element.Methods.Simulated.hasAttribute(element,attribute);};Element.addMethods=function(methods){var F=Prototype.BrowserFeatures,T=Element.Methods.ByTag;if(!methods){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{"FORM":Object.clone(Form.Methods),"INPUT":Object.clone(Form.Element.Methods),"SELECT":Object.clone(Form.Element.Methods),"TEXTAREA":Object.clone(Form.Element.Methods)});}
166
+ if(arguments.length==2){var tagName=methods;methods=arguments[1];}
167
+ if(!tagName)Object.extend(Element.Methods,methods||{});else{if(Object.isArray(tagName))tagName.each(extend);else extend(tagName);}
168
+ function extend(tagName){tagName=tagName.toUpperCase();if(!Element.Methods.ByTag[tagName])
169
+ Element.Methods.ByTag[tagName]={};Object.extend(Element.Methods.ByTag[tagName],methods);}
170
+ function copy(methods,destination,onlyIfAbsent){onlyIfAbsent=onlyIfAbsent||false;for(var property in methods){var value=methods[property];if(!Object.isFunction(value))continue;if(!onlyIfAbsent||!(property in destination))
171
+ destination[property]=value.methodize();}}
172
+ function findDOMClass(tagName){var klass;var trans={"OPTGROUP":"OptGroup","TEXTAREA":"TextArea","P":"Paragraph","FIELDSET":"FieldSet","UL":"UList","OL":"OList","DL":"DList","DIR":"Directory","H1":"Heading","H2":"Heading","H3":"Heading","H4":"Heading","H5":"Heading","H6":"Heading","Q":"Quote","INS":"Mod","DEL":"Mod","A":"Anchor","IMG":"Image","CAPTION":"TableCaption","COL":"TableCol","COLGROUP":"TableCol","THEAD":"TableSection","TFOOT":"TableSection","TBODY":"TableSection","TR":"TableRow","TH":"TableCell","TD":"TableCell","FRAMESET":"FrameSet","IFRAME":"IFrame"};if(trans[tagName])klass='HTML'+trans[tagName]+'Element';if(window[klass])return window[klass];klass='HTML'+tagName+'Element';if(window[klass])return window[klass];klass='HTML'+tagName.capitalize()+'Element';if(window[klass])return window[klass];window[klass]={};window[klass].prototype=document.createElement(tagName)['__proto__'];return window[klass];}
173
+ if(F.ElementExtensions){copy(Element.Methods,HTMLElement.prototype);copy(Element.Methods.Simulated,HTMLElement.prototype,true);}
174
+ if(F.SpecificElementExtensions){for(var tag in Element.Methods.ByTag){var klass=findDOMClass(tag);if(Object.isUndefined(klass))continue;copy(T[tag],klass.prototype);}}
175
+ Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh)Element.extend.refresh();Element.cache={};};document.viewport={getDimensions:function(){var dimensions={},B=Prototype.Browser;$w('width height').each(function(d){var D=d.capitalize();if(B.WebKit&&!document.evaluate){dimensions[d]=self['inner'+D];}else if(B.Opera&&parseFloat(window.opera.version())<9.5){dimensions[d]=document.body['client'+D]}else{dimensions[d]=document.documentElement['client'+D];}});return dimensions;},getWidth:function(){return this.getDimensions().width;},getHeight:function(){return this.getDimensions().height;},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop);}};var Selector=Class.create({initialize:function(expression){this.expression=expression.strip();if(this.shouldUseSelectorsAPI()){this.mode='selectorsAPI';}else if(this.shouldUseXPath()){this.mode='xpath';this.compileXPathMatcher();}else{this.mode="normal";this.compileMatcher();}},shouldUseXPath:function(){if(!Prototype.BrowserFeatures.XPath)return false;var e=this.expression;if(Prototype.Browser.WebKit&&(e.include("-of-type")||e.include(":empty")))
176
+ return false;if((/(\[[\w-]*?:|:checked)/).test(e))
177
+ return false;return true;},shouldUseSelectorsAPI:function(){if(!Prototype.BrowserFeatures.SelectorsAPI)return false;if(!Selector._div)Selector._div=new Element('div');try{Selector._div.querySelector(this.expression);}catch(e){return false;}
178
+ return true;},compileMatcher:function(){var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m;if(Selector._cache[e]){this.matcher=Selector._cache[e];return;}
179
+ this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in ps){p=ps[i];if(m=e.match(p)){this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m));e=e.replace(m[0],'');break;}}}
180
+ this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join('\n'));Selector._cache[this.expression]=this.matcher;},compileXPathMatcher:function(){var e=this.expression,ps=Selector.patterns,x=Selector.xpath,le,m;if(Selector._cache[e]){this.xpath=Selector._cache[e];return;}
181
+ this.matcher=['.//*'];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in ps){if(m=e.match(ps[i])){this.matcher.push(Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m));e=e.replace(m[0],'');break;}}}
182
+ this.xpath=this.matcher.join('');Selector._cache[this.expression]=this.xpath;},findElements:function(root){root=root||document;var e=this.expression,results;switch(this.mode){case'selectorsAPI':if(root!==document){var oldId=root.id,id=$(root).identify();e="#"+id+" "+e;}
183
+ results=$A(root.querySelectorAll(e)).map(Element.extend);root.id=oldId;return results;case'xpath':return document._getElementsByXPath(this.xpath,root);default:return this.matcher(root);}},match:function(element){this.tokens=[];var e=this.expression,ps=Selector.patterns,as=Selector.assertions;var le,p,m;while(e&&le!==e&&(/\S/).test(e)){le=e;for(var i in ps){p=ps[i];if(m=e.match(p)){if(as[i]){this.tokens.push([i,Object.clone(m)]);e=e.replace(m[0],'');}else{return this.findElements(document).include(element);}}}}
184
+ var match=true,name,matches;for(var i=0,token;token=this.tokens[i];i++){name=token[0],matches=token[1];if(!Selector.assertions[name](element,matches)){match=false;break;}}
185
+ return match;},toString:function(){return this.expression;},inspect:function(){return"#<Selector:"+this.expression.inspect()+">";}});Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:'/following-sibling::*',tagName:function(m){if(m[1]=='*')return'';return"[local-name()='"+m[1].toLowerCase()+"' or local-name()='"+m[1].toUpperCase()+"']";},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(m){m[1]=m[1].toLowerCase();return new Template("[@#{1}]").evaluate(m);},attr:function(m){m[1]=m[1].toLowerCase();m[3]=m[5]||m[6];return new Template(Selector.xpath.operators[m[2]]).evaluate(m);},pseudo:function(m){var h=Selector.xpath.pseudos[m[1]];if(!h)return'';if(Object.isFunction(h))return h(m);return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);},operators:{'=':"[@#{1}='#{3}']",'!=':"[@#{1}!='#{3}']",'^=':"[starts-with(@#{1}, '#{3}')]",'$=':"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",'*=':"[contains(@#{1}, '#{3}')]",'~=':"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",'|=':"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{'first-child':'[not(preceding-sibling::*)]','last-child':'[not(following-sibling::*)]','only-child':'[not(preceding-sibling::* or following-sibling::*)]','empty':"[count(*) = 0 and (count(text()) = 0)]",'checked':"[@checked]",'disabled':"[(@disabled) and (@type!='hidden')]",'enabled':"[not(@disabled) and (@type!='hidden')]",'not':function(m){var e=m[6],p=Selector.patterns,x=Selector.xpath,le,v;var exclusion=[];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in p){if(m=e.match(p[i])){v=Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m);exclusion.push("("+v.substring(1,v.length-1)+")");e=e.replace(m[0],'');break;}}}
186
+ return"[not("+exclusion.join(" and ")+")]";},'nth-child':function(m){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",m);},'nth-last-child':function(m){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",m);},'nth-of-type':function(m){return Selector.xpath.pseudos.nth("position() ",m);},'nth-last-of-type':function(m){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",m);},'first-of-type':function(m){m[6]="1";return Selector.xpath.pseudos['nth-of-type'](m);},'last-of-type':function(m){m[6]="1";return Selector.xpath.pseudos['nth-last-of-type'](m);},'only-of-type':function(m){var p=Selector.xpath.pseudos;return p['first-of-type'](m)+p['last-of-type'](m);},nth:function(fragment,m){var mm,formula=m[6],predicate;if(formula=='even')formula='2n+0';if(formula=='odd')formula='2n+1';if(mm=formula.match(/^(\d+)$/))
187
+ return'['+fragment+"= "+mm[1]+']';if(mm=formula.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(mm[1]=="-")mm[1]=-1;var a=mm[1]?Number(mm[1]):1;var b=mm[2]?Number(mm[2]):0;predicate="[((#{fragment} - #{b}) mod #{a} = 0) and "+"((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(predicate).evaluate({fragment:fragment,a:a,b:b});}}}},criteria:{tagName:'n = h.tagName(n, r, "#{1}", c); c = false;',className:'n = h.className(n, r, "#{1}", c); c = false;',id:'n = h.id(n, r, "#{1}", c); c = false;',attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',attr:function(m){m[3]=(m[5]||m[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);},pseudo:function(m){if(m[6])m[6]=m[6].replace(/"/g,'\\"');return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:{laterSibling:/^\s*~\s*/,child:/^\s*>\s*/,adjacent:/^\s*\+\s*/,descendant:/^\s/,tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,id:/^#([\w\-\*]+)(\b|$)/,className:/^\.([\w\-\*]+)(\b|$)/,pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,attrPresence:/^\[((?:[\w]+:)?[\w]+)\]/,attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/},assertions:{tagName:function(element,matches){return matches[1].toUpperCase()==element.tagName.toUpperCase();},className:function(element,matches){return Element.hasClassName(element,matches[1]);},id:function(element,matches){return element.id===matches[1];},attrPresence:function(element,matches){return Element.hasAttribute(element,matches[1]);},attr:function(element,matches){var nodeValue=Element.readAttribute(element,matches[1]);return nodeValue&&Selector.operators[matches[2]](nodeValue,matches[5]||matches[6]);}},handlers:{concat:function(a,b){for(var i=0,node;node=b[i];i++)
188
+ a.push(node);return a;},mark:function(nodes){var _true=Prototype.emptyFunction;for(var i=0,node;node=nodes[i];i++)
189
+ node._countedByPrototype=_true;return nodes;},unmark:function(nodes){for(var i=0,node;node=nodes[i];i++)
190
+ node._countedByPrototype=undefined;return nodes;},index:function(parentNode,reverse,ofType){parentNode._countedByPrototype=Prototype.emptyFunction;if(reverse){for(var nodes=parentNode.childNodes,i=nodes.length-1,j=1;i>=0;i--){var node=nodes[i];if(node.nodeType==1&&(!ofType||node._countedByPrototype))node.nodeIndex=j++;}}else{for(var i=0,j=1,nodes=parentNode.childNodes;node=nodes[i];i++)
191
+ if(node.nodeType==1&&(!ofType||node._countedByPrototype))node.nodeIndex=j++;}},unique:function(nodes){if(nodes.length==0)return nodes;var results=[],n;for(var i=0,l=nodes.length;i<l;i++)
192
+ if(!(n=nodes[i])._countedByPrototype){n._countedByPrototype=Prototype.emptyFunction;results.push(Element.extend(n));}
193
+ return Selector.handlers.unmark(results);},descendant:function(nodes){var h=Selector.handlers;for(var i=0,results=[],node;node=nodes[i];i++)
194
+ h.concat(results,node.getElementsByTagName('*'));return results;},child:function(nodes){var h=Selector.handlers;for(var i=0,results=[],node;node=nodes[i];i++){for(var j=0,child;child=node.childNodes[j];j++)
195
+ if(child.nodeType==1&&child.tagName!='!')results.push(child);}
196
+ return results;},adjacent:function(nodes){for(var i=0,results=[],node;node=nodes[i];i++){var next=this.nextElementSibling(node);if(next)results.push(next);}
197
+ return results;},laterSibling:function(nodes){var h=Selector.handlers;for(var i=0,results=[],node;node=nodes[i];i++)
198
+ h.concat(results,Element.nextSiblings(node));return results;},nextElementSibling:function(node){while(node=node.nextSibling)
199
+ if(node.nodeType==1)return node;return null;},previousElementSibling:function(node){while(node=node.previousSibling)
200
+ if(node.nodeType==1)return node;return null;},tagName:function(nodes,root,tagName,combinator){var uTagName=tagName.toUpperCase();var results=[],h=Selector.handlers;if(nodes){if(combinator){if(combinator=="descendant"){for(var i=0,node;node=nodes[i];i++)
201
+ h.concat(results,node.getElementsByTagName(tagName));return results;}else nodes=this[combinator](nodes);if(tagName=="*")return nodes;}
202
+ for(var i=0,node;node=nodes[i];i++)
203
+ if(node.tagName.toUpperCase()===uTagName)results.push(node);return results;}else return root.getElementsByTagName(tagName);},id:function(nodes,root,id,combinator){var targetNode=$(id),h=Selector.handlers;if(!targetNode)return[];if(!nodes&&root==document)return[targetNode];if(nodes){if(combinator){if(combinator=='child'){for(var i=0,node;node=nodes[i];i++)
204
+ if(targetNode.parentNode==node)return[targetNode];}else if(combinator=='descendant'){for(var i=0,node;node=nodes[i];i++)
205
+ if(Element.descendantOf(targetNode,node))return[targetNode];}else if(combinator=='adjacent'){for(var i=0,node;node=nodes[i];i++)
206
+ if(Selector.handlers.previousElementSibling(targetNode)==node)
207
+ return[targetNode];}else nodes=h[combinator](nodes);}
208
+ for(var i=0,node;node=nodes[i];i++)
209
+ if(node==targetNode)return[targetNode];return[];}
210
+ return(targetNode&&Element.descendantOf(targetNode,root))?[targetNode]:[];},className:function(nodes,root,className,combinator){if(nodes&&combinator)nodes=this[combinator](nodes);return Selector.handlers.byClassName(nodes,root,className);},byClassName:function(nodes,root,className){if(!nodes)nodes=Selector.handlers.descendant([root]);var needle=' '+className+' ';for(var i=0,results=[],node,nodeClassName;node=nodes[i];i++){nodeClassName=node.className;if(nodeClassName.length==0)continue;if(nodeClassName==className||(' '+nodeClassName+' ').include(needle))
211
+ results.push(node);}
212
+ return results;},attrPresence:function(nodes,root,attr,combinator){if(!nodes)nodes=root.getElementsByTagName("*");if(nodes&&combinator)nodes=this[combinator](nodes);var results=[];for(var i=0,node;node=nodes[i];i++)
213
+ if(Element.hasAttribute(node,attr))results.push(node);return results;},attr:function(nodes,root,attr,value,operator,combinator){if(!nodes)nodes=root.getElementsByTagName("*");if(nodes&&combinator)nodes=this[combinator](nodes);var handler=Selector.operators[operator],results=[];for(var i=0,node;node=nodes[i];i++){var nodeValue=Element.readAttribute(node,attr);if(nodeValue===null)continue;if(handler(nodeValue,value))results.push(node);}
214
+ return results;},pseudo:function(nodes,name,value,root,combinator){if(nodes&&combinator)nodes=this[combinator](nodes);if(!nodes)nodes=root.getElementsByTagName("*");return Selector.pseudos[name](nodes,value,root);}},pseudos:{'first-child':function(nodes,value,root){for(var i=0,results=[],node;node=nodes[i];i++){if(Selector.handlers.previousElementSibling(node))continue;results.push(node);}
215
+ return results;},'last-child':function(nodes,value,root){for(var i=0,results=[],node;node=nodes[i];i++){if(Selector.handlers.nextElementSibling(node))continue;results.push(node);}
216
+ return results;},'only-child':function(nodes,value,root){var h=Selector.handlers;for(var i=0,results=[],node;node=nodes[i];i++)
217
+ if(!h.previousElementSibling(node)&&!h.nextElementSibling(node))
218
+ results.push(node);return results;},'nth-child':function(nodes,formula,root){return Selector.pseudos.nth(nodes,formula,root);},'nth-last-child':function(nodes,formula,root){return Selector.pseudos.nth(nodes,formula,root,true);},'nth-of-type':function(nodes,formula,root){return Selector.pseudos.nth(nodes,formula,root,false,true);},'nth-last-of-type':function(nodes,formula,root){return Selector.pseudos.nth(nodes,formula,root,true,true);},'first-of-type':function(nodes,formula,root){return Selector.pseudos.nth(nodes,"1",root,false,true);},'last-of-type':function(nodes,formula,root){return Selector.pseudos.nth(nodes,"1",root,true,true);},'only-of-type':function(nodes,formula,root){var p=Selector.pseudos;return p['last-of-type'](p['first-of-type'](nodes,formula,root),formula,root);},getIndices:function(a,b,total){if(a==0)return b>0?[b]:[];return $R(1,total).inject([],function(memo,i){if(0==(i-b)%a&&(i-b)/a>=0)memo.push(i);return memo;});},nth:function(nodes,formula,root,reverse,ofType){if(nodes.length==0)return[];if(formula=='even')formula='2n+0';if(formula=='odd')formula='2n+1';var h=Selector.handlers,results=[],indexed=[],m;h.mark(nodes);for(var i=0,node;node=nodes[i];i++){if(!node.parentNode._countedByPrototype){h.index(node.parentNode,reverse,ofType);indexed.push(node.parentNode);}}
219
+ if(formula.match(/^\d+$/)){formula=Number(formula);for(var i=0,node;node=nodes[i];i++)
220
+ if(node.nodeIndex==formula)results.push(node);}else if(m=formula.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(m[1]=="-")m[1]=-1;var a=m[1]?Number(m[1]):1;var b=m[2]?Number(m[2]):0;var indices=Selector.pseudos.getIndices(a,b,nodes.length);for(var i=0,node,l=indices.length;node=nodes[i];i++){for(var j=0;j<l;j++)
221
+ if(node.nodeIndex==indices[j])results.push(node);}}
222
+ h.unmark(nodes);h.unmark(indexed);return results;},'empty':function(nodes,value,root){for(var i=0,results=[],node;node=nodes[i];i++){if(node.tagName=='!'||node.firstChild)continue;results.push(node);}
223
+ return results;},'not':function(nodes,selector,root){var h=Selector.handlers,selectorType,m;var exclusions=new Selector(selector).findElements(root);h.mark(exclusions);for(var i=0,results=[],node;node=nodes[i];i++)
224
+ if(!node._countedByPrototype)results.push(node);h.unmark(exclusions);return results;},'enabled':function(nodes,value,root){for(var i=0,results=[],node;node=nodes[i];i++)
225
+ if(!node.disabled&&(!node.type||node.type!=='hidden'))
226
+ results.push(node);return results;},'disabled':function(nodes,value,root){for(var i=0,results=[],node;node=nodes[i];i++)
227
+ if(node.disabled)results.push(node);return results;},'checked':function(nodes,value,root){for(var i=0,results=[],node;node=nodes[i];i++)
228
+ if(node.checked)results.push(node);return results;}},operators:{'=':function(nv,v){return nv==v;},'!=':function(nv,v){return nv!=v;},'^=':function(nv,v){return nv==v||nv&&nv.startsWith(v);},'$=':function(nv,v){return nv==v||nv&&nv.endsWith(v);},'*=':function(nv,v){return nv==v||nv&&nv.include(v);},'$=':function(nv,v){return nv.endsWith(v);},'*=':function(nv,v){return nv.include(v);},'~=':function(nv,v){return(' '+nv+' ').include(' '+v+' ');},'|=':function(nv,v){return('-'+(nv||"").toUpperCase()+'-').include('-'+(v||"").toUpperCase()+'-');}},split:function(expression){var expressions=[];expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(m){expressions.push(m[1].strip());});return expressions;},matchElements:function(elements,expression){var matches=$$(expression),h=Selector.handlers;h.mark(matches);for(var i=0,results=[],element;element=elements[i];i++)
229
+ if(element._countedByPrototype)results.push(element);h.unmark(matches);return results;},findElement:function(elements,expression,index){if(Object.isNumber(expression)){index=expression;expression=false;}
230
+ return Selector.matchElements(elements,expression||'*')[index||0];},findChildElements:function(element,expressions){expressions=Selector.split(expressions.join(','));var results=[],h=Selector.handlers;for(var i=0,l=expressions.length,selector;i<l;i++){selector=new Selector(expressions[i].strip());h.concat(results,selector.findElements(element));}
231
+ return(l>1)?h.unique(results):results;}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(a,b){for(var i=0,node;node=b[i];i++)
232
+ if(node.tagName!=="!")a.push(node);return a;},unmark:function(nodes){for(var i=0,node;node=nodes[i];i++)
233
+ node.removeAttribute('_countedByPrototype');return nodes;}});}
234
+ function $$(){return Selector.findChildElements(document,$A(arguments));}
235
+ var Form={reset:function(form){$(form).reset();return form;},serializeElements:function(elements,options){if(typeof options!='object')options={hash:!!options};else if(Object.isUndefined(options.hash))options.hash=true;var key,value,submitted=false,submit=options.submit;var data=elements.inject({},function(result,element){if(!element.disabled&&element.name){key=element.name;value=$(element).getValue();if(value!=null&&element.type!='file'&&(element.type!='submit'||(!submitted&&submit!==false&&(!submit||key==submit)&&(submitted=true)))){if(key in result){if(!Object.isArray(result[key]))result[key]=[result[key]];result[key].push(value);}
236
+ else result[key]=value;}}
237
+ return result;});return options.hash?data:Object.toQueryString(data);}};Form.Methods={serialize:function(form,options){return Form.serializeElements(Form.getElements(form),options);},getElements:function(form){return $A($(form).getElementsByTagName('*')).inject([],function(elements,child){if(Form.Element.Serializers[child.tagName.toLowerCase()])
238
+ elements.push(Element.extend(child));return elements;});},getInputs:function(form,typeName,name){form=$(form);var inputs=form.getElementsByTagName('input');if(!typeName&&!name)return $A(inputs).map(Element.extend);for(var i=0,matchingInputs=[],length=inputs.length;i<length;i++){var input=inputs[i];if((typeName&&input.type!=typeName)||(name&&input.name!=name))
239
+ continue;matchingInputs.push(Element.extend(input));}
240
+ return matchingInputs;},disable:function(form){form=$(form);Form.getElements(form).invoke('disable');return form;},enable:function(form){form=$(form);Form.getElements(form).invoke('enable');return form;},findFirstElement:function(form){var elements=$(form).getElements().findAll(function(element){return'hidden'!=element.type&&!element.disabled;});var firstByIndex=elements.findAll(function(element){return element.hasAttribute('tabIndex')&&element.tabIndex>=0;}).sortBy(function(element){return element.tabIndex}).first();return firstByIndex?firstByIndex:elements.find(function(element){return['input','select','textarea'].include(element.tagName.toLowerCase());});},focusFirstElement:function(form){form=$(form);form.findFirstElement().activate();return form;},request:function(form,options){form=$(form),options=Object.clone(options||{});var params=options.parameters,action=form.readAttribute('action')||'';if(action.blank())action=window.location.href;options.parameters=form.serialize(true);if(params){if(Object.isString(params))params=params.toQueryParams();Object.extend(options.parameters,params);}
241
+ if(form.hasAttribute('method')&&!options.method)
242
+ options.method=form.method;return new Ajax.Request(action,options);}};Form.Element={focus:function(element){$(element).focus();return element;},select:function(element){$(element).select();return element;}};Form.Element.Methods={serialize:function(element){element=$(element);if(!element.disabled&&element.name){var value=element.getValue();if(value!=undefined){var pair={};pair[element.name]=value;return Object.toQueryString(pair);}}
243
+ return'';},getValue:function(element){element=$(element);var method=element.tagName.toLowerCase();return Form.Element.Serializers[method](element);},setValue:function(element,value){element=$(element);var method=element.tagName.toLowerCase();Form.Element.Serializers[method](element,value);return element;},clear:function(element){$(element).value='';return element;},present:function(element){return $(element).value!='';},activate:function(element){element=$(element);try{element.focus();if(element.select&&(element.tagName.toLowerCase()!='input'||!['button','reset','submit'].include(element.type)))
244
+ element.select();}catch(e){}
245
+ return element;},disable:function(element){element=$(element);element.disabled=true;return element;},enable:function(element){element=$(element);element.disabled=false;return element;}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(element,value){switch(element.type.toLowerCase()){case'checkbox':case'radio':return Form.Element.Serializers.inputSelector(element,value);default:return Form.Element.Serializers.textarea(element,value);}},inputSelector:function(element,value){if(Object.isUndefined(value))return element.checked?element.value:null;else element.checked=!!value;},textarea:function(element,value){if(Object.isUndefined(value))return element.value;else element.value=value;},select:function(element,value){if(Object.isUndefined(value))
246
+ return this[element.type=='select-one'?'selectOne':'selectMany'](element);else{var opt,currentValue,single=!Object.isArray(value);for(var i=0,length=element.length;i<length;i++){opt=element.options[i];currentValue=this.optionValue(opt);if(single){if(currentValue==value){opt.selected=true;return;}}
247
+ else opt.selected=value.include(currentValue);}}},selectOne:function(element){var index=element.selectedIndex;return index>=0?this.optionValue(element.options[index]):null;},selectMany:function(element){var values,length=element.length;if(!length)return null;for(var i=0,values=[];i<length;i++){var opt=element.options[i];if(opt.selected)values.push(this.optionValue(opt));}
248
+ return values;},optionValue:function(opt){return Element.extend(opt).hasAttribute('value')?opt.value:opt.text;}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,element,frequency,callback){$super(callback,frequency);this.element=$(element);this.lastValue=this.getValue();},execute:function(){var value=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(value)?this.lastValue!=value:String(this.lastValue)!=String(value)){this.callback(this.element,value);this.lastValue=value;}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element);}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element);}});Abstract.EventObserver=Class.create({initialize:function(element,callback){this.element=$(element);this.callback=callback;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=='form')
249
+ this.registerFormCallbacks();else
250
+ this.registerCallback(this.element);},onElementEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this);},registerCallback:function(element){if(element.type){switch(element.type.toLowerCase()){case'checkbox':case'radio':Event.observe(element,'click',this.onElementEvent.bind(this));break;default:Event.observe(element,'change',this.onElementEvent.bind(this));break;}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element);}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element);}});if(!window.Event)var Event={};Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{},relatedTarget:function(event){var element;switch(event.type){case'mouseover':element=event.fromElement;break;case'mouseout':element=event.toElement;break;default:return null;}
251
+ return Element.extend(element);}});Event.Methods=(function(){var isButton;if(Prototype.Browser.IE){var buttonMap={0:1,1:4,2:2};isButton=function(event,code){return event.button==buttonMap[code];};}else if(Prototype.Browser.WebKit){isButton=function(event,code){switch(code){case 0:return event.which==1&&!event.metaKey;case 1:return event.which==1&&event.metaKey;default:return false;}};}else{isButton=function(event,code){return event.which?(event.which===code+1):(event.button===code);};}
252
+ return{isLeftClick:function(event){return isButton(event,0)},isMiddleClick:function(event){return isButton(event,1)},isRightClick:function(event){return isButton(event,2)},element:function(event){event=Event.extend(event);var node=event.target,type=event.type,currentTarget=event.currentTarget;if(currentTarget&&currentTarget.tagName){if(type==='load'||type==='error'||(type==='click'&&currentTarget.tagName.toLowerCase()==='input'&&currentTarget.type==='radio'))
253
+ node=currentTarget;}
254
+ if(node.nodeType==Node.TEXT_NODE)node=node.parentNode;return Element.extend(node);},findElement:function(event,expression){var element=Event.element(event);if(!expression)return element;var elements=[element].concat(element.ancestors());return Selector.findElement(elements,expression,0);},pointer:function(event){var docElement=document.documentElement,body=document.body||{scrollLeft:0,scrollTop:0};return{x:event.pageX||(event.clientX+
255
+ (docElement.scrollLeft||body.scrollLeft)-
256
+ (docElement.clientLeft||0)),y:event.pageY||(event.clientY+
257
+ (docElement.scrollTop||body.scrollTop)-
258
+ (docElement.clientTop||0))};},pointerX:function(event){return Event.pointer(event).x},pointerY:function(event){return Event.pointer(event).y},stop:function(event){Event.extend(event);event.preventDefault();event.stopPropagation();event.stopped=true;}};})();Event.extend=(function(){var methods=Object.keys(Event.Methods).inject({},function(m,name){m[name]=Event.Methods[name].methodize();return m;});if(Prototype.Browser.IE){Object.extend(methods,{stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}});return function(event){if(!event)return false;if(event._extendedByPrototype)return event;event._extendedByPrototype=Prototype.emptyFunction;var pointer=Event.pointer(event);Object.extend(event,{target:event.srcElement,relatedTarget:Event.relatedTarget(event),pageX:pointer.x,pageY:pointer.y});return Object.extend(event,methods);};}else{Event.prototype=Event.prototype||document.createEvent("HTMLEvents")['__proto__'];Object.extend(Event.prototype,methods);return Prototype.K;}})();Object.extend(Event,(function(){var cache=Event.cache;function getEventID(element){if(element._prototypeEventID)return element._prototypeEventID[0];arguments.callee.id=arguments.callee.id||1;return element._prototypeEventID=[++arguments.callee.id];}
259
+ function getDOMEventName(eventName){if(eventName&&eventName.include(':'))return"dataavailable";return eventName;}
260
+ function getCacheForID(id){return cache[id]=cache[id]||{};}
261
+ function getWrappersForEventName(id,eventName){var c=getCacheForID(id);return c[eventName]=c[eventName]||[];}
262
+ function createWrapper(element,eventName,handler){var id=getEventID(element);var c=getWrappersForEventName(id,eventName);if(c.pluck("handler").include(handler))return false;var wrapper=function(event){if(!Event||!Event.extend||(event.eventName&&event.eventName!=eventName))
263
+ return false;Event.extend(event);handler.call(element,event);};wrapper.handler=handler;c.push(wrapper);return wrapper;}
264
+ function findWrapper(id,eventName,handler){var c=getWrappersForEventName(id,eventName);return c.find(function(wrapper){return wrapper.handler==handler});}
265
+ function destroyWrapper(id,eventName,handler){var c=getCacheForID(id);if(!c[eventName])return false;c[eventName]=c[eventName].without(findWrapper(id,eventName,handler));}
266
+ function destroyCache(){for(var id in cache)
267
+ for(var eventName in cache[id])
268
+ cache[id][eventName]=null;}
269
+ if(window.attachEvent){window.attachEvent("onunload",destroyCache);}
270
+ if(Prototype.Browser.WebKit){window.addEventListener('unload',Prototype.emptyFunction,false);}
271
+ return{observe:function(element,eventName,handler){element=$(element);var name=getDOMEventName(eventName);var wrapper=createWrapper(element,eventName,handler);if(!wrapper)return element;if(element.addEventListener){element.addEventListener(name,wrapper,false);}else{element.attachEvent("on"+name,wrapper);}
272
+ return element;},stopObserving:function(element,eventName,handler){element=$(element);var id=getEventID(element),name=getDOMEventName(eventName);if(!handler&&eventName){getWrappersForEventName(id,eventName).each(function(wrapper){element.stopObserving(eventName,wrapper.handler);});return element;}else if(!eventName){Object.keys(getCacheForID(id)).each(function(eventName){element.stopObserving(eventName);});return element;}
273
+ var wrapper=findWrapper(id,eventName,handler);if(!wrapper)return element;if(element.removeEventListener){element.removeEventListener(name,wrapper,false);}else{element.detachEvent("on"+name,wrapper);}
274
+ destroyWrapper(id,eventName,handler);return element;},fire:function(element,eventName,memo){element=$(element);if(element==document&&document.createEvent&&!element.dispatchEvent)
275
+ element=document.documentElement;var event;if(document.createEvent){event=document.createEvent("HTMLEvents");event.initEvent("dataavailable",true,true);}else{event=document.createEventObject();event.eventType="ondataavailable";}
276
+ event.eventName=eventName;event.memo=memo||{};if(document.createEvent){element.dispatchEvent(event);}else{element.fireEvent(event.eventType,event);}
277
+ return Event.extend(event);}};})());Object.extend(Event,Event.Methods);Element.addMethods({fire:Event.fire,observe:Event.observe,stopObserving:Event.stopObserving});Object.extend(document,{fire:Element.Methods.fire.methodize(),observe:Element.Methods.observe.methodize(),stopObserving:Element.Methods.stopObserving.methodize(),loaded:false});(function(){var timer;function fireContentLoadedEvent(){if(document.loaded)return;if(timer)window.clearInterval(timer);document.fire("dom:loaded");document.loaded=true;}
278
+ if(document.addEventListener){if(Prototype.Browser.WebKit){timer=window.setInterval(function(){if(/loaded|complete/.test(document.readyState))
279
+ fireContentLoadedEvent();},0);Event.observe(window,"load",fireContentLoadedEvent);}else{document.addEventListener("DOMContentLoaded",fireContentLoadedEvent,false);}}else{document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");$("__onDOMContentLoaded").onreadystatechange=function(){if(this.readyState=="complete"){this.onreadystatechange=null;fireContentLoadedEvent();}};}})();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(element,content){return Element.insert(element,{before:content});},Top:function(element,content){return Element.insert(element,{top:content});},Bottom:function(element,content){return Element.insert(element,{bottom:content});},After:function(element,content){return Element.insert(element,{after:content});}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;},within:function(element,x,y){if(this.includeScrollOffsets)
280
+ return this.withinIncludingScrolloffsets(element,x,y);this.xcomp=x;this.ycomp=y;this.offset=Element.cumulativeOffset(element);return(y>=this.offset[1]&&y<this.offset[1]+element.offsetHeight&&x>=this.offset[0]&&x<this.offset[0]+element.offsetWidth);},withinIncludingScrolloffsets:function(element,x,y){var offsetcache=Element.cumulativeScrollOffset(element);this.xcomp=x+offsetcache[0]-this.deltaX;this.ycomp=y+offsetcache[1]-this.deltaY;this.offset=Element.cumulativeOffset(element);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+element.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+element.offsetWidth);},overlap:function(mode,element){if(!mode)return 0;if(mode=='vertical')
281
+ return((this.offset[1]+element.offsetHeight)-this.ycomp)/element.offsetHeight;if(mode=='horizontal')
282
+ return((this.offset[0]+element.offsetWidth)-this.xcomp)/element.offsetWidth;},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(element){Position.prepare();return Element.absolutize(element);},relativize:function(element){Position.prepare();return Element.relativize(element);},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(source,target,options){options=options||{};return Element.clonePosition(target,source,options);}};if(!document.getElementsByClassName)document.getElementsByClassName=function(instanceMethods){function iter(name){return name.blank()?null:"[contains(concat(' ', @class, ' '), ' "+name+" ')]";}
283
+ instanceMethods.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(element,className){className=className.toString().strip();var cond=/\s/.test(className)?$w(className).map(iter).join(''):iter(className);return cond?document._getElementsByXPath('.//*'+cond,element):[];}:function(element,className){className=className.toString().strip();var elements=[],classNames=(/\s/.test(className)?$w(className):null);if(!classNames&&!className)return elements;var nodes=$(element).getElementsByTagName('*');className=' '+className+' ';for(var i=0,child,cn;child=nodes[i];i++){if(child.className&&(cn=' '+child.className+' ')&&(cn.include(className)||(classNames&&classNames.all(function(name){return!name.toString().blank()&&cn.include(' '+name+' ');}))))
284
+ elements.push(Element.extend(child));}
285
+ return elements;};return function(className,parentElement){return $(parentElement||document.body).getElementsByClassName(className);};}(Element.Methods);Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(element){this.element=$(element);},_each:function(iterator){this.element.className.split(/\s+/).select(function(name){return name.length>0;})._each(iterator);},set:function(className){this.element.className=className;},add:function(classNameToAdd){if(this.include(classNameToAdd))return;this.set($A(this).concat(classNameToAdd).join(' '));},remove:function(classNameToRemove){if(!this.include(classNameToRemove))return;this.set($A(this).without(classNameToRemove).join(' '));},toString:function(){return $A(this).join(' ');}};Object.extend(Element.ClassNames.prototype,Enumerable);Element.addMethods();
286
+
287
+ // script.aculo.us scriptaculous.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008
288
+
289
+ // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
290
+ //
291
+ // Permission is hereby granted, free of charge, to any person obtaining
292
+ // a copy of this software and associated documentation files (the
293
+ // "Software"), to deal in the Software without restriction, including
294
+ // without limitation the rights to use, copy, modify, merge, publish,
295
+ // distribute, sublicense, and/or sell copies of the Software, and to
296
+ // permit persons to whom the Software is furnished to do so, subject to
297
+ // the following conditions:
298
+ //
299
+ // The above copyright notice and this permission notice shall be
300
+ // included in all copies or substantial portions of the Software.
301
+ //
302
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
303
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
304
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
305
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
306
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
307
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
308
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
309
+ //
310
+ // For details, see the script.aculo.us web site: http://script.aculo.us/
311
+ var Scriptaculous={Version:'1.8.2',require:function(libraryName){document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');},REQUIRED_PROTOTYPE:'1.6.0.3',load:function(){function convertVersionString(versionString){var v=versionString.replace(/_.*|\./g,'');v=parseInt(v+'0'.times(4-v.length));return versionString.indexOf('_')>-1?v-1:v;}
312
+ if((typeof Prototype=='undefined')||(typeof Element=='undefined')||(typeof Element.Methods=='undefined')||(convertVersionString(Prototype.Version)<convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
313
+ throw("script.aculo.us requires the Prototype JavaScript framework >= "+
314
+ Scriptaculous.REQUIRED_PROTOTYPE);var js=/scriptaculous\.js(\?.*)?$/;$$('head script[src]').findAll(function(s){return s.src.match(js);}).each(function(s){var path=s.src.replace(js,''),includes=s.src.match(/\?.*load=([a-z,]*)/);(includes?includes[1]:'builder,effects,dragdrop,controls,slider,sound').split(',').each(function(include){Scriptaculous.require(path+include+'.js')});});}};Scriptaculous.load();
315
+ // script.aculo.us effects.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008
316
+
317
+ // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
318
+ // Contributors:
319
+ // Justin Palmer (http://encytemedia.com/)
320
+ // Mark Pilgrim (http://diveintomark.org/)
321
+ // Martin Bialasinki
322
+ //
323
+ String.prototype.parseColor=function(){var color='#';if(this.slice(0,4)=='rgb('){var cols=this.slice(4,this.length-1).split(',');var i=0;do{color+=parseInt(cols[i]).toColorPart()}while(++i<3);}else{if(this.slice(0,1)=='#'){if(this.length==4)for(var i=1;i<4;i++)color+=(this.charAt(i)+this.charAt(i)).toLowerCase();if(this.length==7)color=this.toLowerCase();}}
324
+ return(color.length==7?color:(arguments[0]||this));};Element.collectTextNodes=function(element){return $A($(element).childNodes).collect(function(node){return(node.nodeType==3?node.nodeValue:(node.hasChildNodes()?Element.collectTextNodes(node):''));}).flatten().join('');};Element.collectTextNodesIgnoreClass=function(element,className){return $A($(element).childNodes).collect(function(node){return(node.nodeType==3?node.nodeValue:((node.hasChildNodes()&&!Element.hasClassName(node,className))?Element.collectTextNodesIgnoreClass(node,className):''));}).flatten().join('');};Element.setContentZoom=function(element,percent){element=$(element);element.setStyle({fontSize:(percent/100)+'em'});if(Prototype.Browser.WebKit)window.scrollBy(0,0);return element;};Element.getInlineOpacity=function(element){return $(element).style.opacity||'';};Element.forceRerendering=function(element){try{element=$(element);var n=document.createTextNode(' ');element.appendChild(n);element.removeChild(n);}catch(e){}};var Effect={_elementDoesNotExistError:{name:'ElementDoesNotExistError',message:'The specified DOM element does not exist, but is required for this effect to operate'},Transitions:{linear:Prototype.K,sinoidal:function(pos){return(-Math.cos(pos*Math.PI)/2)+.5;},reverse:function(pos){return 1-pos;},flicker:function(pos){var pos=((-Math.cos(pos*Math.PI)/4)+.75)+Math.random()/4;return pos>1?1:pos;},wobble:function(pos){return(-Math.cos(pos*Math.PI*(9*pos))/2)+.5;},pulse:function(pos,pulses){return(-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2)+.5;},spring:function(pos){return 1-(Math.cos(pos*4.5*Math.PI)*Math.exp(-pos*6));},none:function(pos){return 0;},full:function(pos){return 1;}},DefaultOptions:{duration:1.0,fps:100,sync:false,from:0.0,to:1.0,delay:0.0,queue:'parallel'},tagifyText:function(element){var tagifyStyle='position:relative';if(Prototype.Browser.IE)tagifyStyle+=';zoom:1';element=$(element);$A(element.childNodes).each(function(child){if(child.nodeType==3){child.nodeValue.toArray().each(function(character){element.insertBefore(new Element('span',{style:tagifyStyle}).update(character==' '?String.fromCharCode(160):character),child);});Element.remove(child);}});},multiple:function(element,effect){var elements;if(((typeof element=='object')||Object.isFunction(element))&&(element.length))
325
+ elements=element;else
326
+ elements=$(element).childNodes;var options=Object.extend({speed:0.1,delay:0.0},arguments[2]||{});var masterDelay=options.delay;$A(elements).each(function(element,index){new effect(element,Object.extend(options,{delay:index*options.speed+masterDelay}));});},PAIRS:{'slide':['SlideDown','SlideUp'],'blind':['BlindDown','BlindUp'],'appear':['Appear','Fade']},toggle:function(element,effect){element=$(element);effect=(effect||'appear').toLowerCase();var options=Object.extend({queue:{position:'end',scope:(element.id||'global'),limit:1}},arguments[2]||{});Effect[element.visible()?Effect.PAIRS[effect][1]:Effect.PAIRS[effect][0]](element,options);}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize:function(){this.effects=[];this.interval=null;},_each:function(iterator){this.effects._each(iterator);},add:function(effect){var timestamp=new Date().getTime();var position=Object.isString(effect.options.queue)?effect.options.queue:effect.options.queue.position;switch(position){case'front':this.effects.findAll(function(e){return e.state=='idle'}).each(function(e){e.startOn+=effect.finishOn;e.finishOn+=effect.finishOn;});break;case'with-last':timestamp=this.effects.pluck('startOn').max()||timestamp;break;case'end':timestamp=this.effects.pluck('finishOn').max()||timestamp;break;}
327
+ effect.startOn+=timestamp;effect.finishOn+=timestamp;if(!effect.options.queue.limit||(this.effects.length<effect.options.queue.limit))
328
+ this.effects.push(effect);if(!this.interval)
329
+ this.interval=setInterval(this.loop.bind(this),15);},remove:function(effect){this.effects=this.effects.reject(function(e){return e==effect});if(this.effects.length==0){clearInterval(this.interval);this.interval=null;}},loop:function(){var timePos=new Date().getTime();for(var i=0,len=this.effects.length;i<len;i++)
330
+ this.effects[i]&&this.effects[i].loop(timePos);}});Effect.Queues={instances:$H(),get:function(queueName){if(!Object.isString(queueName))return queueName;return this.instances.get(queueName)||this.instances.set(queueName,new Effect.ScopedQueue());}};Effect.Queue=Effect.Queues.get('global');Effect.Base=Class.create({position:null,start:function(options){function codeForEvent(options,eventName){return((options[eventName+'Internal']?'this.options.'+eventName+'Internal(this);':'')+
331
+ (options[eventName]?'this.options.'+eventName+'(this);':''));}
332
+ if(options&&options.transition===false)options.transition=Effect.Transitions.linear;this.options=Object.extend(Object.extend({},Effect.DefaultOptions),options||{});this.currentFrame=0;this.state='idle';this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.fromToDelta=this.options.to-this.options.from;this.totalTime=this.finishOn-this.startOn;this.totalFrames=this.options.fps*this.options.duration;this.render=(function(){function dispatch(effect,eventName){if(effect.options[eventName+'Internal'])
333
+ effect.options[eventName+'Internal'](effect);if(effect.options[eventName])
334
+ effect.options[eventName](effect);}
335
+ return function(pos){if(this.state==="idle"){this.state="running";dispatch(this,'beforeSetup');if(this.setup)this.setup();dispatch(this,'afterSetup');}
336
+ if(this.state==="running"){pos=(this.options.transition(pos)*this.fromToDelta)+this.options.from;this.position=pos;dispatch(this,'beforeUpdate');if(this.update)this.update(pos);dispatch(this,'afterUpdate');}};})();this.event('beforeStart');if(!this.options.sync)
337
+ Effect.Queues.get(Object.isString(this.options.queue)?'global':this.options.queue.scope).add(this);},loop:function(timePos){if(timePos>=this.startOn){if(timePos>=this.finishOn){this.render(1.0);this.cancel();this.event('beforeFinish');if(this.finish)this.finish();this.event('afterFinish');return;}
338
+ var pos=(timePos-this.startOn)/this.totalTime,frame=(pos*this.totalFrames).round();if(frame>this.currentFrame){this.render(pos);this.currentFrame=frame;}}},cancel:function(){if(!this.options.sync)
339
+ Effect.Queues.get(Object.isString(this.options.queue)?'global':this.options.queue.scope).remove(this);this.state='finished';},event:function(eventName){if(this.options[eventName+'Internal'])this.options[eventName+'Internal'](this);if(this.options[eventName])this.options[eventName](this);},inspect:function(){var data=$H();for(property in this)
340
+ if(!Object.isFunction(this[property]))data.set(property,this[property]);return'#<Effect:'+data.inspect()+',options:'+$H(this.options).inspect()+'>';}});Effect.Parallel=Class.create(Effect.Base,{initialize:function(effects){this.effects=effects||[];this.start(arguments[1]);},update:function(position){this.effects.invoke('render',position);},finish:function(position){this.effects.each(function(effect){effect.render(1.0);effect.cancel();effect.event('beforeFinish');if(effect.finish)effect.finish(position);effect.event('afterFinish');});}});Effect.Tween=Class.create(Effect.Base,{initialize:function(object,from,to){object=Object.isString(object)?$(object):object;var args=$A(arguments),method=args.last(),options=args.length==5?args[3]:null;this.method=Object.isFunction(method)?method.bind(object):Object.isFunction(object[method])?object[method].bind(object):function(value){object[method]=value};this.start(Object.extend({from:from,to:to},options||{}));},update:function(position){this.method(position);}});Effect.Event=Class.create(Effect.Base,{initialize:function(){this.start(Object.extend({duration:0},arguments[0]||{}));},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize:function(element){this.element=$(element);if(!this.element)throw(Effect._elementDoesNotExistError);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout))
341
+ this.element.setStyle({zoom:1});var options=Object.extend({from:this.element.getOpacity()||0.0,to:1.0},arguments[1]||{});this.start(options);},update:function(position){this.element.setOpacity(position);}});Effect.Move=Class.create(Effect.Base,{initialize:function(element){this.element=$(element);if(!this.element)throw(Effect._elementDoesNotExistError);var options=Object.extend({x:0,y:0,mode:'relative'},arguments[1]||{});this.start(options);},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle('left')||'0');this.originalTop=parseFloat(this.element.getStyle('top')||'0');if(this.options.mode=='absolute'){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop;}},update:function(position){this.element.setStyle({left:(this.options.x*position+this.originalLeft).round()+'px',top:(this.options.y*position+this.originalTop).round()+'px'});}});Effect.MoveBy=function(element,toTop,toLeft){return new Effect.Move(element,Object.extend({x:toLeft,y:toTop},arguments[3]||{}));};Effect.Scale=Class.create(Effect.Base,{initialize:function(element,percent){this.element=$(element);if(!this.element)throw(Effect._elementDoesNotExistError);var options=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:'box',scaleFrom:100.0,scaleTo:percent},arguments[2]||{});this.start(options);},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle('position');this.originalStyle={};['top','left','width','height','fontSize'].each(function(k){this.originalStyle[k]=this.element.style[k];}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var fontSize=this.element.getStyle('font-size')||'100%';['em','px','%','pt'].each(function(fontSizeType){if(fontSize.indexOf(fontSizeType)>0){this.fontSize=parseFloat(fontSize);this.fontSizeType=fontSizeType;}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=='box')
342
+ this.dims=[this.element.offsetHeight,this.element.offsetWidth];if(/^content/.test(this.options.scaleMode))
343
+ this.dims=[this.element.scrollHeight,this.element.scrollWidth];if(!this.dims)
344
+ this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth];},update:function(position){var currentScale=(this.options.scaleFrom/100.0)+(this.factor*position);if(this.options.scaleContent&&this.fontSize)
345
+ this.element.setStyle({fontSize:this.fontSize*currentScale+this.fontSizeType});this.setDimensions(this.dims[0]*currentScale,this.dims[1]*currentScale);},finish:function(position){if(this.restoreAfterFinish)this.element.setStyle(this.originalStyle);},setDimensions:function(height,width){var d={};if(this.options.scaleX)d.width=width.round()+'px';if(this.options.scaleY)d.height=height.round()+'px';if(this.options.scaleFromCenter){var topd=(height-this.dims[0])/2;var leftd=(width-this.dims[1])/2;if(this.elementPositioning=='absolute'){if(this.options.scaleY)d.top=this.originalTop-topd+'px';if(this.options.scaleX)d.left=this.originalLeft-leftd+'px';}else{if(this.options.scaleY)d.top=-topd+'px';if(this.options.scaleX)d.left=-leftd+'px';}}
346
+ this.element.setStyle(d);}});Effect.Highlight=Class.create(Effect.Base,{initialize:function(element){this.element=$(element);if(!this.element)throw(Effect._elementDoesNotExistError);var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{});this.start(options);},setup:function(){if(this.element.getStyle('display')=='none'){this.cancel();return;}
347
+ this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle('background-image');this.element.setStyle({backgroundImage:'none'});}
348
+ if(!this.options.endcolor)
349
+ this.options.endcolor=this.element.getStyle('background-color').parseColor('#ffffff');if(!this.options.restorecolor)
350
+ this.options.restorecolor=this.element.getStyle('background-color');this._base=$R(0,2).map(function(i){return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(i){return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]}.bind(this));},update:function(position){this.element.setStyle({backgroundColor:$R(0,2).inject('#',function(m,v,i){return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart());}.bind(this))});},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}));}});Effect.ScrollTo=function(element){var options=arguments[1]||{},scrollOffsets=document.viewport.getScrollOffsets(),elementOffsets=$(element).cumulativeOffset();if(options.offset)elementOffsets[1]+=options.offset;return new Effect.Tween(null,scrollOffsets.top,elementOffsets[1],options,function(p){scrollTo(scrollOffsets.left,p.round());});};Effect.Fade=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();var options=Object.extend({from:element.getOpacity()||1.0,to:0.0,afterFinishInternal:function(effect){if(effect.options.to!=0)return;effect.element.hide().setStyle({opacity:oldOpacity});}},arguments[1]||{});return new Effect.Opacity(element,options);};Effect.Appear=function(element){element=$(element);var options=Object.extend({from:(element.getStyle('display')=='none'?0.0:element.getOpacity()||0.0),to:1.0,afterFinishInternal:function(effect){effect.element.forceRerendering();},beforeSetup:function(effect){effect.element.setOpacity(effect.options.from).show();}},arguments[1]||{});return new Effect.Opacity(element,options);};Effect.Puff=function(element){element=$(element);var oldStyle={opacity:element.getInlineOpacity(),position:element.getStyle('position'),top:element.style.top,left:element.style.left,width:element.style.width,height:element.style.height};return new Effect.Parallel([new Effect.Scale(element,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:1.0,beforeSetupInternal:function(effect){Position.absolutize(effect.effects[0].element);},afterFinishInternal:function(effect){effect.effects[0].element.hide().setStyle(oldStyle);}},arguments[1]||{}));};Effect.BlindUp=function(element){element=$(element);element.makeClipping();return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(effect){effect.element.hide().undoClipping();}},arguments[1]||{}));};Effect.BlindDown=function(element){element=$(element);var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makeClipping().setStyle({height:'0px'}).show();},afterFinishInternal:function(effect){effect.element.undoClipping();}},arguments[1]||{}));};Effect.SwitchOff=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();return new Effect.Appear(element,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(effect){new Effect.Scale(effect.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(effect){effect.element.makePositioned().makeClipping();},afterFinishInternal:function(effect){effect.element.hide().undoClipping().undoPositioned().setStyle({opacity:oldOpacity});}});}},arguments[1]||{}));};Effect.DropOut=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left'),opacity:element.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(element,{x:0,y:100,sync:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:0.5,beforeSetup:function(effect){effect.effects[0].element.makePositioned();},afterFinishInternal:function(effect){effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);}},arguments[1]||{}));};Effect.Shake=function(element){element=$(element);var options=Object.extend({distance:20,duration:0.5},arguments[1]||{});var distance=parseFloat(options.distance);var split=parseFloat(options.duration)/10.0;var oldStyle={top:element.getStyle('top'),left:element.getStyle('left')};return new Effect.Move(element,{x:distance,y:0,duration:split,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:distance*2,y:0,duration:split*2,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-distance,y:0,duration:split,afterFinishInternal:function(effect){effect.element.undoPositioned().setStyle(oldStyle);}});}});}});}});}});}});};Effect.SlideDown=function(element){element=$(element).cleanWhitespace();var oldInnerBottom=element.down().getStyle('bottom');var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makePositioned();effect.element.down().makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping().setStyle({height:'0px'}).show();},afterUpdateInternal:function(effect){effect.element.down().setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));};Effect.SlideUp=function(element){element=$(element).cleanWhitespace();var oldInnerBottom=element.down().getStyle('bottom');var elementDimensions=element.getDimensions();return new Effect.Scale(element,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:'box',scaleFrom:100,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makePositioned();effect.element.down().makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping().show();},afterUpdateInternal:function(effect){effect.element.down().setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.hide().undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));};Effect.Squish=function(element){return new Effect.Scale(element,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(effect){effect.element.makeClipping();},afterFinishInternal:function(effect){effect.element.hide().undoClipping();}});};Effect.Grow=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var initialMoveX,initialMoveY;var moveX,moveY;switch(options.direction){case'top-left':initialMoveX=initialMoveY=moveX=moveY=0;break;case'top-right':initialMoveX=dims.width;initialMoveY=moveY=0;moveX=-dims.width;break;case'bottom-left':initialMoveX=moveX=0;initialMoveY=dims.height;moveY=-dims.height;break;case'bottom-right':initialMoveX=dims.width;initialMoveY=dims.height;moveX=-dims.width;moveY=-dims.height;break;case'center':initialMoveX=dims.width/2;initialMoveY=dims.height/2;moveX=-dims.width/2;moveY=-dims.height/2;break;}
351
+ return new Effect.Move(element,{x:initialMoveX,y:initialMoveY,duration:0.01,beforeSetup:function(effect){effect.element.hide().makeClipping().makePositioned();},afterFinishInternal:function(effect){new Effect.Parallel([new Effect.Opacity(effect.element,{sync:true,to:1.0,from:0.0,transition:options.opacityTransition}),new Effect.Move(effect.element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition}),new Effect.Scale(effect.element,100,{scaleMode:{originalHeight:dims.height,originalWidth:dims.width},sync:true,scaleFrom:window.opera?1:0,transition:options.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(effect){effect.effects[0].element.setStyle({height:'0px'}).show();},afterFinishInternal:function(effect){effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);}},options));}});};Effect.Shrink=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var moveX,moveY;switch(options.direction){case'top-left':moveX=moveY=0;break;case'top-right':moveX=dims.width;moveY=0;break;case'bottom-left':moveX=0;moveY=dims.height;break;case'bottom-right':moveX=dims.width;moveY=dims.height;break;case'center':moveX=dims.width/2;moveY=dims.height/2;break;}
352
+ return new Effect.Parallel([new Effect.Opacity(element,{sync:true,to:0.0,from:1.0,transition:options.opacityTransition}),new Effect.Scale(element,window.opera?1:0,{sync:true,transition:options.scaleTransition,restoreAfterFinish:true}),new Effect.Move(element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition})],Object.extend({beforeStartInternal:function(effect){effect.effects[0].element.makePositioned().makeClipping();},afterFinishInternal:function(effect){effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle);}},options));};Effect.Pulsate=function(element){element=$(element);var options=arguments[1]||{},oldOpacity=element.getInlineOpacity(),transition=options.transition||Effect.Transitions.linear,reverser=function(pos){return 1-transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2)+.5);};return new Effect.Opacity(element,Object.extend(Object.extend({duration:2.0,from:0,afterFinishInternal:function(effect){effect.element.setStyle({opacity:oldOpacity});}},options),{transition:reverser}));};Effect.Fold=function(element){element=$(element);var oldStyle={top:element.style.top,left:element.style.left,width:element.style.width,height:element.style.height};element.makeClipping();return new Effect.Scale(element,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(effect){new Effect.Scale(element,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(effect){effect.element.hide().undoClipping().setStyle(oldStyle);}});}},arguments[1]||{}));};Effect.Morph=Class.create(Effect.Base,{initialize:function(element){this.element=$(element);if(!this.element)throw(Effect._elementDoesNotExistError);var options=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(options.style))this.style=$H(options.style);else{if(options.style.include(':'))
353
+ this.style=options.style.parseStyle();else{this.element.addClassName(options.style);this.style=$H(this.element.getStyles());this.element.removeClassName(options.style);var css=this.element.getStyles();this.style=this.style.reject(function(style){return style.value==css[style.key];});options.afterFinishInternal=function(effect){effect.element.addClassName(effect.options.style);effect.transforms.each(function(transform){effect.element.style[transform.style]='';});};}}
354
+ this.start(options);},setup:function(){function parseColor(color){if(!color||['rgba(0, 0, 0, 0)','transparent'].include(color))color='#ffffff';color=color.parseColor();return $R(0,2).map(function(i){return parseInt(color.slice(i*2+1,i*2+3),16);});}
355
+ this.transforms=this.style.map(function(pair){var property=pair[0],value=pair[1],unit=null;if(value.parseColor('#zzzzzz')!='#zzzzzz'){value=value.parseColor();unit='color';}else if(property=='opacity'){value=parseFloat(value);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout))
356
+ this.element.setStyle({zoom:1});}else if(Element.CSS_LENGTH.test(value)){var components=value.match(/^([\+\-]?[0-9\.]+)(.*)$/);value=parseFloat(components[1]);unit=(components.length==3)?components[2]:null;}
357
+ var originalValue=this.element.getStyle(property);return{style:property.camelize(),originalValue:unit=='color'?parseColor(originalValue):parseFloat(originalValue||0),targetValue:unit=='color'?parseColor(value):value,unit:unit};}.bind(this)).reject(function(transform){return((transform.originalValue==transform.targetValue)||(transform.unit!='color'&&(isNaN(transform.originalValue)||isNaN(transform.targetValue))));});},update:function(position){var style={},transform,i=this.transforms.length;while(i--)
358
+ style[(transform=this.transforms[i]).style]=transform.unit=='color'?'#'+
359
+ (Math.round(transform.originalValue[0]+
360
+ (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart()+
361
+ (Math.round(transform.originalValue[1]+
362
+ (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart()+
363
+ (Math.round(transform.originalValue[2]+
364
+ (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart():(transform.originalValue+
365
+ (transform.targetValue-transform.originalValue)*position).toFixed(3)+
366
+ (transform.unit===null?'':transform.unit);this.element.setStyle(style,true);}});Effect.Transform=Class.create({initialize:function(tracks){this.tracks=[];this.options=arguments[1]||{};this.addTracks(tracks);},addTracks:function(tracks){tracks.each(function(track){track=$H(track);var data=track.values().first();this.tracks.push($H({ids:track.keys().first(),effect:Effect.Morph,options:{style:data}}));}.bind(this));return this;},play:function(){return new Effect.Parallel(this.tracks.map(function(track){var ids=track.get('ids'),effect=track.get('effect'),options=track.get('options');var elements=[$(ids)||$$(ids)].flatten();return elements.map(function(e){return new effect(e,Object.extend({sync:true},options))});}).flatten(),this.options);}});Element.CSS_PROPERTIES=$w('backgroundColor backgroundPosition borderBottomColor borderBottomStyle '+'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth '+'borderRightColor borderRightStyle borderRightWidth borderSpacing '+'borderTopColor borderTopStyle borderTopWidth bottom clip color '+'fontSize fontWeight height left letterSpacing lineHeight '+'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+'maxWidth minHeight minWidth opacity outlineColor outlineOffset '+'outlineWidth paddingBottom paddingLeft paddingRight paddingTop '+'right textIndent top width wordSpacing zIndex');Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement=document.createElement('div');String.prototype.parseStyle=function(){var style,styleRules=$H();if(Prototype.Browser.WebKit)
367
+ style=new Element('div',{style:this}).style;else{String.__parseStyleElement.innerHTML='<div style="'+this+'"></div>';style=String.__parseStyleElement.childNodes[0].style;}
368
+ Element.CSS_PROPERTIES.each(function(property){if(style[property])styleRules.set(property,style[property]);});if(Prototype.Browser.IE&&this.include('opacity'))
369
+ styleRules.set('opacity',this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);return styleRules;};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(element){var css=document.defaultView.getComputedStyle($(element),null);return Element.CSS_PROPERTIES.inject({},function(styles,property){styles[property]=css[property];return styles;});};}else{Element.getStyles=function(element){element=$(element);var css=element.currentStyle,styles;styles=Element.CSS_PROPERTIES.inject({},function(results,property){results[property]=css[property];return results;});if(!styles.opacity)styles.opacity=element.getOpacity();return styles;};}
370
+ Effect.Methods={morph:function(element,style){element=$(element);new Effect.Morph(element,Object.extend({style:style},arguments[2]||{}));return element;},visualEffect:function(element,effect,options){element=$(element);var s=effect.dasherize().camelize(),klass=s.charAt(0).toUpperCase()+s.substring(1);new Effect[klass](element,options);return element;},highlight:function(element,options){element=$(element);new Effect.Highlight(element,options);return element;}};$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+'pulsate shake puff squish switchOff dropOut').each(function(effect){Effect.Methods[effect]=function(element,options){element=$(element);Effect[effect.charAt(0).toUpperCase()+effect.substring(1)](element,options);return element;};});$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(function(f){Effect.Methods[f]=Element[f];});Element.addMethods(Effect.Methods);
371
+ // script.aculo.us dragdrop.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008
372
+
373
+ // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
374
+ // (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
375
+ //
376
+ // script.aculo.us is freely distributable under the terms of an MIT-style license.
377
+ // For details, see the script.aculo.us web site: http://script.aculo.us/
378
+ if(Object.isUndefined(Effect))
379
+ throw("dragdrop.js requires including script.aculo.us' effects.js library");var Droppables={drops:[],remove:function(element){this.drops=this.drops.reject(function(d){return d.element==$(element)});},add:function(element){element=$(element);var options=Object.extend({greedy:true,hoverclass:null,tree:false},arguments[1]||{});if(options.containment){options._containers=[];var containment=options.containment;if(Object.isArray(containment)){containment.each(function(c){options._containers.push($(c))});}else{options._containers.push($(containment));}}
380
+ if(options.accept)options.accept=[options.accept].flatten();Element.makePositioned(element);options.element=element;this.drops.push(options);},findDeepestChild:function(drops){deepest=drops[0];for(i=1;i<drops.length;++i)
381
+ if(Element.isParent(drops[i].element,deepest.element))
382
+ deepest=drops[i];return deepest;},isContained:function(element,drop){var containmentNode;if(drop.tree){containmentNode=element.treeNode;}else{containmentNode=element.parentNode;}
383
+ return drop._containers.detect(function(c){return containmentNode==c});},isAffected:function(point,element,drop){return((drop.element!=element)&&((!drop._containers)||this.isContained(element,drop))&&((!drop.accept)||(Element.classNames(element).detect(function(v){return drop.accept.include(v)})))&&Position.within(drop.element,point[0],point[1]));},deactivate:function(drop){if(drop.hoverclass)
384
+ Element.removeClassName(drop.element,drop.hoverclass);this.last_active=null;},activate:function(drop){if(drop.hoverclass)
385
+ Element.addClassName(drop.element,drop.hoverclass);this.last_active=drop;},show:function(point,element){if(!this.drops.length)return;var drop,affected=[];this.drops.each(function(drop){if(Droppables.isAffected(point,element,drop))
386
+ affected.push(drop);});if(affected.length>0)
387
+ drop=Droppables.findDeepestChild(affected);if(this.last_active&&this.last_active!=drop)this.deactivate(this.last_active);if(drop){Position.within(drop.element,point[0],point[1]);if(drop.onHover)
388
+ drop.onHover(element,drop.element,Position.overlap(drop.overlap,drop.element));if(drop!=this.last_active)Droppables.activate(drop);}},fire:function(event,element){if(!this.last_active)return;Position.prepare();if(this.isAffected([Event.pointerX(event),Event.pointerY(event)],element,this.last_active))
389
+ if(this.last_active.onDrop){this.last_active.onDrop(element,this.last_active.element,event);return true;}},reset:function(){if(this.last_active)
390
+ this.deactivate(this.last_active);}};var Draggables={drags:[],observers:[],register:function(draggable){if(this.drags.length==0){this.eventMouseUp=this.endDrag.bindAsEventListener(this);this.eventMouseMove=this.updateDrag.bindAsEventListener(this);this.eventKeypress=this.keyPress.bindAsEventListener(this);Event.observe(document,"mouseup",this.eventMouseUp);Event.observe(document,"mousemove",this.eventMouseMove);Event.observe(document,"keypress",this.eventKeypress);}
391
+ this.drags.push(draggable);},unregister:function(draggable){this.drags=this.drags.reject(function(d){return d==draggable});if(this.drags.length==0){Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);Event.stopObserving(document,"keypress",this.eventKeypress);}},activate:function(draggable){if(draggable.options.delay){this._timeout=setTimeout(function(){Draggables._timeout=null;window.focus();Draggables.activeDraggable=draggable;}.bind(this),draggable.options.delay);}else{window.focus();this.activeDraggable=draggable;}},deactivate:function(){this.activeDraggable=null;},updateDrag:function(event){if(!this.activeDraggable)return;var pointer=[Event.pointerX(event),Event.pointerY(event)];if(this._lastPointer&&(this._lastPointer.inspect()==pointer.inspect()))return;this._lastPointer=pointer;this.activeDraggable.updateDrag(event,pointer);},endDrag:function(event){if(this._timeout){clearTimeout(this._timeout);this._timeout=null;}
392
+ if(!this.activeDraggable)return;this._lastPointer=null;this.activeDraggable.endDrag(event);this.activeDraggable=null;},keyPress:function(event){if(this.activeDraggable)
393
+ this.activeDraggable.keyPress(event);},addObserver:function(observer){this.observers.push(observer);this._cacheObserverCallbacks();},removeObserver:function(element){this.observers=this.observers.reject(function(o){return o.element==element});this._cacheObserverCallbacks();},notify:function(eventName,draggable,event){if(this[eventName+'Count']>0)
394
+ this.observers.each(function(o){if(o[eventName])o[eventName](eventName,draggable,event);});if(draggable.options[eventName])draggable.options[eventName](draggable,event);},_cacheObserverCallbacks:function(){['onStart','onEnd','onDrag'].each(function(eventName){Draggables[eventName+'Count']=Draggables.observers.select(function(o){return o[eventName];}).length;});}};var Draggable=Class.create({initialize:function(element){var defaults={handle:false,reverteffect:function(element,top_offset,left_offset){var dur=Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;new Effect.Move(element,{x:-left_offset,y:-top_offset,duration:dur,queue:{scope:'_draggable',position:'end'}});},endeffect:function(element){var toOpacity=Object.isNumber(element._opacity)?element._opacity:1.0;new Effect.Opacity(element,{duration:0.2,from:0.7,to:toOpacity,queue:{scope:'_draggable',position:'end'},afterFinish:function(){Draggable._dragging[element]=false}});},zindex:1000,revert:false,quiet:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,snap:false,delay:0};if(!arguments[1]||Object.isUndefined(arguments[1].endeffect))
395
+ Object.extend(defaults,{starteffect:function(element){element._opacity=Element.getOpacity(element);Draggable._dragging[element]=true;new Effect.Opacity(element,{duration:0.2,from:element._opacity,to:0.7});}});var options=Object.extend(defaults,arguments[1]||{});this.element=$(element);if(options.handle&&Object.isString(options.handle))
396
+ this.handle=this.element.down('.'+options.handle,0);if(!this.handle)this.handle=$(options.handle);if(!this.handle)this.handle=this.element;if(options.scroll&&!options.scroll.scrollTo&&!options.scroll.outerHTML){options.scroll=$(options.scroll);this._isScrollChild=Element.childOf(this.element,options.scroll);}
397
+ Element.makePositioned(this.element);this.options=options;this.dragging=false;this.eventMouseDown=this.initDrag.bindAsEventListener(this);Event.observe(this.handle,"mousedown",this.eventMouseDown);Draggables.register(this);},destroy:function(){Event.stopObserving(this.handle,"mousedown",this.eventMouseDown);Draggables.unregister(this);},currentDelta:function(){return([parseInt(Element.getStyle(this.element,'left')||'0'),parseInt(Element.getStyle(this.element,'top')||'0')]);},initDrag:function(event){if(!Object.isUndefined(Draggable._dragging[this.element])&&Draggable._dragging[this.element])return;if(Event.isLeftClick(event)){var src=Event.element(event);if((tag_name=src.tagName.toUpperCase())&&(tag_name=='INPUT'||tag_name=='SELECT'||tag_name=='OPTION'||tag_name=='BUTTON'||tag_name=='TEXTAREA'))return;var pointer=[Event.pointerX(event),Event.pointerY(event)];var pos=Position.cumulativeOffset(this.element);this.offset=[0,1].map(function(i){return(pointer[i]-pos[i])});Draggables.activate(this);Event.stop(event);}},startDrag:function(event){this.dragging=true;if(!this.delta)
398
+ this.delta=this.currentDelta();if(this.options.zindex){this.originalZ=parseInt(Element.getStyle(this.element,'z-index')||0);this.element.style.zIndex=this.options.zindex;}
399
+ if(this.options.ghosting){this._clone=this.element.cloneNode(true);this._originallyAbsolute=(this.element.getStyle('position')=='absolute');if(!this._originallyAbsolute)
400
+ Position.absolutize(this.element);this.element.parentNode.insertBefore(this._clone,this.element);}
401
+ if(this.options.scroll){if(this.options.scroll==window){var where=this._getWindowScroll(this.options.scroll);this.originalScrollLeft=where.left;this.originalScrollTop=where.top;}else{this.originalScrollLeft=this.options.scroll.scrollLeft;this.originalScrollTop=this.options.scroll.scrollTop;}}
402
+ Draggables.notify('onStart',this,event);if(this.options.starteffect)this.options.starteffect(this.element);},updateDrag:function(event,pointer){if(!this.dragging)this.startDrag(event);if(!this.options.quiet){Position.prepare();Droppables.show(pointer,this.element);}
403
+ Draggables.notify('onDrag',this,event);this.draw(pointer);if(this.options.change)this.options.change(this);if(this.options.scroll){this.stopScrolling();var p;if(this.options.scroll==window){with(this._getWindowScroll(this.options.scroll)){p=[left,top,left+width,top+height];}}else{p=Position.page(this.options.scroll);p[0]+=this.options.scroll.scrollLeft+Position.deltaX;p[1]+=this.options.scroll.scrollTop+Position.deltaY;p.push(p[0]+this.options.scroll.offsetWidth);p.push(p[1]+this.options.scroll.offsetHeight);}
404
+ var speed=[0,0];if(pointer[0]<(p[0]+this.options.scrollSensitivity))speed[0]=pointer[0]-(p[0]+this.options.scrollSensitivity);if(pointer[1]<(p[1]+this.options.scrollSensitivity))speed[1]=pointer[1]-(p[1]+this.options.scrollSensitivity);if(pointer[0]>(p[2]-this.options.scrollSensitivity))speed[0]=pointer[0]-(p[2]-this.options.scrollSensitivity);if(pointer[1]>(p[3]-this.options.scrollSensitivity))speed[1]=pointer[1]-(p[3]-this.options.scrollSensitivity);this.startScrolling(speed);}
405
+ if(Prototype.Browser.WebKit)window.scrollBy(0,0);Event.stop(event);},finishDrag:function(event,success){this.dragging=false;if(this.options.quiet){Position.prepare();var pointer=[Event.pointerX(event),Event.pointerY(event)];Droppables.show(pointer,this.element);}
406
+ if(this.options.ghosting){if(!this._originallyAbsolute)
407
+ Position.relativize(this.element);delete this._originallyAbsolute;Element.remove(this._clone);this._clone=null;}
408
+ var dropped=false;if(success){dropped=Droppables.fire(event,this.element);if(!dropped)dropped=false;}
409
+ if(dropped&&this.options.onDropped)this.options.onDropped(this.element);Draggables.notify('onEnd',this,event);var revert=this.options.revert;if(revert&&Object.isFunction(revert))revert=revert(this.element);var d=this.currentDelta();if(revert&&this.options.reverteffect){if(dropped==0||revert!='failure')
410
+ this.options.reverteffect(this.element,d[1]-this.delta[1],d[0]-this.delta[0]);}else{this.delta=d;}
411
+ if(this.options.zindex)
412
+ this.element.style.zIndex=this.originalZ;if(this.options.endeffect)
413
+ this.options.endeffect(this.element);Draggables.deactivate(this);Droppables.reset();},keyPress:function(event){if(event.keyCode!=Event.KEY_ESC)return;this.finishDrag(event,false);Event.stop(event);},endDrag:function(event){if(!this.dragging)return;this.stopScrolling();this.finishDrag(event,true);Event.stop(event);},draw:function(point){var pos=Position.cumulativeOffset(this.element);if(this.options.ghosting){var r=Position.realOffset(this.element);pos[0]+=r[0]-Position.deltaX;pos[1]+=r[1]-Position.deltaY;}
414
+ var d=this.currentDelta();pos[0]-=d[0];pos[1]-=d[1];if(this.options.scroll&&(this.options.scroll!=window&&this._isScrollChild)){pos[0]-=this.options.scroll.scrollLeft-this.originalScrollLeft;pos[1]-=this.options.scroll.scrollTop-this.originalScrollTop;}
415
+ var p=[0,1].map(function(i){return(point[i]-pos[i]-this.offset[i])}.bind(this));if(this.options.snap){if(Object.isFunction(this.options.snap)){p=this.options.snap(p[0],p[1],this);}else{if(Object.isArray(this.options.snap)){p=p.map(function(v,i){return(v/this.options.snap[i]).round()*this.options.snap[i]}.bind(this));}else{p=p.map(function(v){return(v/this.options.snap).round()*this.options.snap}.bind(this));}}}
416
+ var style=this.element.style;if((!this.options.constraint)||(this.options.constraint=='horizontal'))
417
+ style.left=p[0]+"px";if((!this.options.constraint)||(this.options.constraint=='vertical'))
418
+ style.top=p[1]+"px";if(style.visibility=="hidden")style.visibility="";},stopScrolling:function(){if(this.scrollInterval){clearInterval(this.scrollInterval);this.scrollInterval=null;Draggables._lastScrollPointer=null;}},startScrolling:function(speed){if(!(speed[0]||speed[1]))return;this.scrollSpeed=[speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];this.lastScrolled=new Date();this.scrollInterval=setInterval(this.scroll.bind(this),10);},scroll:function(){var current=new Date();var delta=current-this.lastScrolled;this.lastScrolled=current;if(this.options.scroll==window){with(this._getWindowScroll(this.options.scroll)){if(this.scrollSpeed[0]||this.scrollSpeed[1]){var d=delta/1000;this.options.scroll.scrollTo(left+d*this.scrollSpeed[0],top+d*this.scrollSpeed[1]);}}}else{this.options.scroll.scrollLeft+=this.scrollSpeed[0]*delta/1000;this.options.scroll.scrollTop+=this.scrollSpeed[1]*delta/1000;}
419
+ Position.prepare();Droppables.show(Draggables._lastPointer,this.element);Draggables.notify('onDrag',this);if(this._isScrollChild){Draggables._lastScrollPointer=Draggables._lastScrollPointer||$A(Draggables._lastPointer);Draggables._lastScrollPointer[0]+=this.scrollSpeed[0]*delta/1000;Draggables._lastScrollPointer[1]+=this.scrollSpeed[1]*delta/1000;if(Draggables._lastScrollPointer[0]<0)
420
+ Draggables._lastScrollPointer[0]=0;if(Draggables._lastScrollPointer[1]<0)
421
+ Draggables._lastScrollPointer[1]=0;this.draw(Draggables._lastScrollPointer);}
422
+ if(this.options.change)this.options.change(this);},_getWindowScroll:function(w){var T,L,W,H;with(w.document){if(w.document.documentElement&&documentElement.scrollTop){T=documentElement.scrollTop;L=documentElement.scrollLeft;}else if(w.document.body){T=body.scrollTop;L=body.scrollLeft;}
423
+ if(w.innerWidth){W=w.innerWidth;H=w.innerHeight;}else if(w.document.documentElement&&documentElement.clientWidth){W=documentElement.clientWidth;H=documentElement.clientHeight;}else{W=body.offsetWidth;H=body.offsetHeight;}}
424
+ return{top:T,left:L,width:W,height:H};}});Draggable._dragging={};var SortableObserver=Class.create({initialize:function(element,observer){this.element=$(element);this.observer=observer;this.lastValue=Sortable.serialize(this.element);},onStart:function(){this.lastValue=Sortable.serialize(this.element);},onEnd:function(){Sortable.unmark();if(this.lastValue!=Sortable.serialize(this.element))
425
+ this.observer(this.element)}});var Sortable={SERIALIZE_RULE:/^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,sortables:{},_findRootElement:function(element){while(element.tagName.toUpperCase()!="BODY"){if(element.id&&Sortable.sortables[element.id])return element;element=element.parentNode;}},options:function(element){element=Sortable._findRootElement($(element));if(!element)return;return Sortable.sortables[element.id];},destroy:function(element){element=$(element);var s=Sortable.sortables[element.id];if(s){Draggables.removeObserver(s.element);s.droppables.each(function(d){Droppables.remove(d)});s.draggables.invoke('destroy');delete Sortable.sortables[s.element.id];}},create:function(element){element=$(element);var options=Object.extend({element:element,tag:'li',dropOnEmpty:false,tree:false,treeTag:'ul',overlap:'vertical',constraint:'vertical',containment:element,handle:false,only:false,delay:0,hoverclass:null,ghosting:false,quiet:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,format:this.SERIALIZE_RULE,elements:false,handles:false,onChange:Prototype.emptyFunction,onUpdate:Prototype.emptyFunction},arguments[1]||{});this.destroy(element);var options_for_draggable={revert:true,quiet:options.quiet,scroll:options.scroll,scrollSpeed:options.scrollSpeed,scrollSensitivity:options.scrollSensitivity,delay:options.delay,ghosting:options.ghosting,constraint:options.constraint,handle:options.handle};if(options.starteffect)
426
+ options_for_draggable.starteffect=options.starteffect;if(options.reverteffect)
427
+ options_for_draggable.reverteffect=options.reverteffect;else
428
+ if(options.ghosting)options_for_draggable.reverteffect=function(element){element.style.top=0;element.style.left=0;};if(options.endeffect)
429
+ options_for_draggable.endeffect=options.endeffect;if(options.zindex)
430
+ options_for_draggable.zindex=options.zindex;var options_for_droppable={overlap:options.overlap,containment:options.containment,tree:options.tree,hoverclass:options.hoverclass,onHover:Sortable.onHover};var options_for_tree={onHover:Sortable.onEmptyHover,overlap:options.overlap,containment:options.containment,hoverclass:options.hoverclass};Element.cleanWhitespace(element);options.draggables=[];options.droppables=[];if(options.dropOnEmpty||options.tree){Droppables.add(element,options_for_tree);options.droppables.push(element);}
431
+ (options.elements||this.findElements(element,options)||[]).each(function(e,i){var handle=options.handles?$(options.handles[i]):(options.handle?$(e).select('.'+options.handle)[0]:e);options.draggables.push(new Draggable(e,Object.extend(options_for_draggable,{handle:handle})));Droppables.add(e,options_for_droppable);if(options.tree)e.treeNode=element;options.droppables.push(e);});if(options.tree){(Sortable.findTreeElements(element,options)||[]).each(function(e){Droppables.add(e,options_for_tree);e.treeNode=element;options.droppables.push(e);});}
432
+ this.sortables[element.id]=options;Draggables.addObserver(new SortableObserver(element,options.onUpdate));},findElements:function(element,options){return Element.findChildren(element,options.only,options.tree?true:false,options.tag);},findTreeElements:function(element,options){return Element.findChildren(element,options.only,options.tree?true:false,options.treeTag);},onHover:function(element,dropon,overlap){if(Element.isParent(dropon,element))return;if(overlap>.33&&overlap<.66&&Sortable.options(dropon).tree){return;}else if(overlap>0.5){Sortable.mark(dropon,'before');if(dropon.previousSibling!=element){var oldParentNode=element.parentNode;element.style.visibility="hidden";dropon.parentNode.insertBefore(element,dropon);if(dropon.parentNode!=oldParentNode)
433
+ Sortable.options(oldParentNode).onChange(element);Sortable.options(dropon.parentNode).onChange(element);}}else{Sortable.mark(dropon,'after');var nextElement=dropon.nextSibling||null;if(nextElement!=element){var oldParentNode=element.parentNode;element.style.visibility="hidden";dropon.parentNode.insertBefore(element,nextElement);if(dropon.parentNode!=oldParentNode)
434
+ Sortable.options(oldParentNode).onChange(element);Sortable.options(dropon.parentNode).onChange(element);}}},onEmptyHover:function(element,dropon,overlap){var oldParentNode=element.parentNode;var droponOptions=Sortable.options(dropon);if(!Element.isParent(dropon,element)){var index;var children=Sortable.findElements(dropon,{tag:droponOptions.tag,only:droponOptions.only});var child=null;if(children){var offset=Element.offsetSize(dropon,droponOptions.overlap)*(1.0-overlap);for(index=0;index<children.length;index+=1){if(offset-Element.offsetSize(children[index],droponOptions.overlap)>=0){offset-=Element.offsetSize(children[index],droponOptions.overlap);}else if(offset-(Element.offsetSize(children[index],droponOptions.overlap)/2)>=0){child=index+1<children.length?children[index+1]:null;break;}else{child=children[index];break;}}}
435
+ dropon.insertBefore(element,child);Sortable.options(oldParentNode).onChange(element);droponOptions.onChange(element);}},unmark:function(){if(Sortable._marker)Sortable._marker.hide();},mark:function(dropon,position){var sortable=Sortable.options(dropon.parentNode);if(sortable&&!sortable.ghosting)return;if(!Sortable._marker){Sortable._marker=($('dropmarker')||Element.extend(document.createElement('DIV'))).hide().addClassName('dropmarker').setStyle({position:'absolute'});document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);}
436
+ var offsets=Position.cumulativeOffset(dropon);Sortable._marker.setStyle({left:offsets[0]+'px',top:offsets[1]+'px'});if(position=='after')
437
+ if(sortable.overlap=='horizontal')
438
+ Sortable._marker.setStyle({left:(offsets[0]+dropon.clientWidth)+'px'});else
439
+ Sortable._marker.setStyle({top:(offsets[1]+dropon.clientHeight)+'px'});Sortable._marker.show();},_tree:function(element,options,parent){var children=Sortable.findElements(element,options)||[];for(var i=0;i<children.length;++i){var match=children[i].id.match(options.format);if(!match)continue;var child={id:encodeURIComponent(match?match[1]:null),element:element,parent:parent,children:[],position:parent.children.length,container:$(children[i]).down(options.treeTag)};if(child.container)
440
+ this._tree(child.container,options,child);parent.children.push(child);}
441
+ return parent;},tree:function(element){element=$(element);var sortableOptions=this.options(element);var options=Object.extend({tag:sortableOptions.tag,treeTag:sortableOptions.treeTag,only:sortableOptions.only,name:element.id,format:sortableOptions.format},arguments[1]||{});var root={id:null,parent:null,children:[],container:element,position:0};return Sortable._tree(element,options,root);},_constructIndex:function(node){var index='';do{if(node.id)index='['+node.position+']'+index;}while((node=node.parent)!=null);return index;},sequence:function(element){element=$(element);var options=Object.extend(this.options(element),arguments[1]||{});return $(this.findElements(element,options)||[]).map(function(item){return item.id.match(options.format)?item.id.match(options.format)[1]:'';});},setSequence:function(element,new_sequence){element=$(element);var options=Object.extend(this.options(element),arguments[2]||{});var nodeMap={};this.findElements(element,options).each(function(n){if(n.id.match(options.format))
442
+ nodeMap[n.id.match(options.format)[1]]=[n,n.parentNode];n.parentNode.removeChild(n);});new_sequence.each(function(ident){var n=nodeMap[ident];if(n){n[1].appendChild(n[0]);delete nodeMap[ident];}});},serialize:function(element){element=$(element);var options=Object.extend(Sortable.options(element),arguments[1]||{});var name=encodeURIComponent((arguments[1]&&arguments[1].name)?arguments[1].name:element.id);if(options.tree){return Sortable.tree(element,arguments[1]).children.map(function(item){return[name+Sortable._constructIndex(item)+"[id]="+
443
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));}).flatten().join('&');}else{return Sortable.sequence(element,arguments[1]).map(function(item){return name+"[]="+encodeURIComponent(item);}).join('&');}}};Element.isParent=function(child,element){if(!child.parentNode||child==element)return false;if(child.parentNode==element)return true;return Element.isParent(child.parentNode,element);};Element.findChildren=function(element,only,recursive,tagName){if(!element.hasChildNodes())return null;tagName=tagName.toUpperCase();if(only)only=[only].flatten();var elements=[];$A(element.childNodes).each(function(e){if(e.tagName&&e.tagName.toUpperCase()==tagName&&(!only||(Element.classNames(e).detect(function(v){return only.include(v)}))))
444
+ elements.push(e);if(recursive){var grandchildren=Element.findChildren(e,only,recursive,tagName);if(grandchildren)elements.push(grandchildren);}});return(elements.length>0?elements.flatten():[]);};Element.offsetSize=function(element,type){return element['offset'+((type=='vertical'||type=='height')?'Height':'Width')];};