Lib_Js_Prototype - Version 1.7.0.0

Version Notes

1.7.0.0

Download this release

Release Info

Developer Magento Core Team
Extension Lib_Js_Prototype
Version 1.7.0.0
Comparing to
See all releases


Code changes from version 1.6.0.3.4 to 1.7.0.0

Files changed (3) hide show
  1. js/prototype/prototype.js +3648 -1894
  2. js/prototype/validation.js +1 -1
  3. package.xml +5 -5
js/prototype/prototype.js CHANGED
@@ -1,5 +1,5 @@
1
- /* Prototype JavaScript framework, version 1.6.0.3
2
- * (c) 2005-2008 Sam Stephenson
3
  *
4
  * Prototype is freely distributable under the terms of an MIT-style license.
5
  * For details, see the Prototype web site: http://www.prototypejs.org/
@@ -7,32 +7,53 @@
7
  *--------------------------------------------------------------------------*/
8
 
9
  var Prototype = {
10
- Version: '1.6.0.3',
11
-
12
- Browser: {
13
- IE: !!(window.attachEvent &&
14
- navigator.userAgent.indexOf('Opera') === -1),
15
- Opera: navigator.userAgent.indexOf('Opera') > -1,
16
- WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
17
- Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
18
- navigator.userAgent.indexOf('KHTML') === -1,
19
- MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
20
- },
 
 
 
21
 
22
  BrowserFeatures: {
23
  XPath: !!document.evaluate,
 
24
  SelectorsAPI: !!document.querySelector,
25
- ElementExtensions: !!window.HTMLElement,
26
- SpecificElementExtensions:
27
- document.createElement('div')['__proto__'] &&
28
- document.createElement('div')['__proto__'] !==
29
- document.createElement('form')['__proto__']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  },
31
 
32
  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
33
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
34
 
35
  emptyFunction: function() { },
 
36
  K: function(x) { return x }
37
  };
38
 
@@ -40,9 +61,38 @@ if (Prototype.Browser.MobileSafari)
40
  Prototype.BrowserFeatures.SpecificElementExtensions = false;
41
 
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  /* Based on Alex Arnell's inheritance implementation. */
44
- var Class = {
45
- create: function() {
 
 
 
 
 
 
 
 
 
 
46
  var parent = null, properties = $A(arguments);
47
  if (Object.isFunction(properties[0]))
48
  parent = properties.shift();
@@ -56,39 +106,39 @@ var Class = {
56
  klass.subclasses = [];
57
 
58
  if (parent) {
59
- var subclass = function() { };
60
  subclass.prototype = parent.prototype;
61
  klass.prototype = new subclass;
62
  parent.subclasses.push(klass);
63
  }
64
 
65
- for (var i = 0; i < properties.length; i++)
66
  klass.addMethods(properties[i]);
67
 
68
  if (!klass.prototype.initialize)
69
  klass.prototype.initialize = Prototype.emptyFunction;
70
 
71
  klass.prototype.constructor = klass;
72
-
73
  return klass;
74
  }
75
- };
76
 
77
- Class.Methods = {
78
- addMethods: function(source) {
79
- var ancestor = this.superclass && this.superclass.prototype;
80
- var properties = Object.keys(source);
81
 
82
- if (!Object.keys({ toString: true }).length)
83
- properties.push("toString", "valueOf");
 
 
 
 
84
 
85
  for (var i = 0, length = properties.length; i < length; i++) {
86
  var property = properties[i], value = source[property];
87
  if (ancestor && Object.isFunction(value) &&
88
- value.argumentNames().first() == "$super") {
89
  var method = value;
90
  value = (function(m) {
91
- return function() { return ancestor[m].apply(this, arguments) };
92
  })(property).wrap(method);
93
 
94
  value.valueOf = method.valueOf.bind(method);
@@ -99,198 +149,338 @@ Class.Methods = {
99
 
100
  return this;
101
  }
102
- };
103
 
104
- var Abstract = { };
 
 
 
 
 
 
 
105
 
106
- Object.extend = function(destination, source) {
107
- for (var property in source)
108
- destination[property] = source[property];
109
- return destination;
110
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
- Object.extend(Object, {
113
- inspect: function(object) {
114
  try {
115
- if (Object.isUndefined(object)) return 'undefined';
116
  if (object === null) return 'null';
117
  return object.inspect ? object.inspect() : String(object);
118
  } catch (e) {
119
  if (e instanceof RangeError) return '...';
120
  throw e;
121
  }
122
- },
123
 
124
- toJSON: function(object) {
125
- var type = typeof object;
126
- switch (type) {
127
- case 'undefined':
128
- case 'function':
129
- case 'unknown': return;
130
- case 'boolean': return object.toString();
 
 
 
131
  }
132
 
133
- if (object === null) return 'null';
134
- if (object.toJSON) return object.toJSON();
135
- if (Object.isElement(object)) return;
136
 
137
- var results = [];
138
- for (var property in object) {
139
- var value = Object.toJSON(object[property]);
140
- if (!Object.isUndefined(value))
141
- results.push(property.toJSON() + ': ' + value);
142
  }
143
 
144
- return '{' + results.join(', ') + '}';
145
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
 
147
- toQueryString: function(object) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  return $H(object).toQueryString();
149
- },
150
 
151
- toHTML: function(object) {
152
  return object && object.toHTML ? object.toHTML() : String.interpret(object);
153
- },
154
 
155
- keys: function(object) {
156
- var keys = [];
157
- for (var property in object)
158
- keys.push(property);
159
- return keys;
160
- },
 
 
 
 
161
 
162
- values: function(object) {
163
- var values = [];
164
  for (var property in object)
165
- values.push(object[property]);
166
- return values;
167
- },
168
 
169
- clone: function(object) {
170
- return Object.extend({ }, object);
171
- },
172
 
173
- isElement: function(object) {
174
  return !!(object && object.nodeType == 1);
175
- },
176
 
177
- isArray: function(object) {
178
- return object != null && typeof object == "object" &&
179
- 'splice' in object && 'join' in object;
180
- },
 
 
181
 
182
- isHash: function(object) {
 
 
 
 
183
  return object instanceof Hash;
184
- },
185
 
186
- isFunction: function(object) {
187
- return typeof object == "function";
188
- },
189
 
190
- isString: function(object) {
191
- return typeof object == "string";
192
- },
193
 
194
- isNumber: function(object) {
195
- return typeof object == "number";
196
- },
197
 
198
- isUndefined: function(object) {
199
- return typeof object == "undefined";
200
  }
201
- });
202
 
203
- Object.extend(Function.prototype, {
204
- argumentNames: function() {
205
- var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  .replace(/\s+/g, '').split(',');
207
  return names.length == 1 && !names[0] ? [] : names;
208
- },
209
 
210
- bind: function() {
211
  if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
212
- var __method = this, args = $A(arguments), object = args.shift();
213
  return function() {
214
- return __method.apply(object, args.concat($A(arguments)));
 
215
  }
216
- },
217
 
218
- bindAsEventListener: function() {
219
- var __method = this, args = $A(arguments), object = args.shift();
220
  return function(event) {
221
- return __method.apply(object, [event || window.event].concat(args));
 
222
  }
223
- },
224
 
225
- curry: function() {
226
  if (!arguments.length) return this;
227
- var __method = this, args = $A(arguments);
228
  return function() {
229
- return __method.apply(this, args.concat($A(arguments)));
 
230
  }
231
- },
232
 
233
- delay: function() {
234
- var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
 
235
  return window.setTimeout(function() {
236
  return __method.apply(__method, args);
237
  }, timeout);
238
- },
239
 
240
- defer: function() {
241
- var args = [0.01].concat($A(arguments));
242
  return this.delay.apply(this, args);
243
- },
244
 
245
- wrap: function(wrapper) {
246
  var __method = this;
247
  return function() {
248
- return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
 
249
  }
250
- },
251
 
252
- methodize: function() {
253
  if (this._methodized) return this._methodized;
254
  var __method = this;
255
  return this._methodized = function() {
256
- return __method.apply(null, [this].concat($A(arguments)));
 
257
  };
258
  }
259
- });
260
 
261
- Date.prototype.toJSON = function() {
262
- return '"' + this.getUTCFullYear() + '-' +
263
- (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
264
- this.getUTCDate().toPaddedString(2) + 'T' +
265
- this.getUTCHours().toPaddedString(2) + ':' +
266
- this.getUTCMinutes().toPaddedString(2) + ':' +
267
- this.getUTCSeconds().toPaddedString(2) + 'Z"';
268
- };
 
 
 
269
 
270
- var Try = {
271
- these: function() {
272
- var returnValue;
273
 
274
- for (var i = 0, length = arguments.length; i < length; i++) {
275
- var lambda = arguments[i];
276
- try {
277
- returnValue = lambda();
278
- break;
279
- } catch (e) { }
280
- }
281
 
282
- return returnValue;
 
 
 
 
 
 
 
 
 
283
  }
284
- };
 
 
 
 
 
 
 
 
 
 
285
 
286
  RegExp.prototype.match = RegExp.prototype.test;
287
 
288
  RegExp.escape = function(str) {
289
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
290
  };
291
-
292
- /*--------------------------------------------------------------------------*/
293
-
294
  var PeriodicalExecuter = Class.create({
295
  initialize: function(callback, frequency) {
296
  this.callback = callback;
@@ -319,8 +509,10 @@ var PeriodicalExecuter = Class.create({
319
  try {
320
  this.currentlyExecuting = true;
321
  this.execute();
322
- } finally {
323
  this.currentlyExecuting = false;
 
 
 
324
  }
325
  }
326
  }
@@ -339,10 +531,28 @@ Object.extend(String, {
339
  }
340
  });
341
 
342
- Object.extend(String.prototype, {
343
- gsub: function(pattern, replacement) {
 
 
 
 
 
 
 
 
 
 
344
  var result = '', source = this, match;
345
- replacement = arguments.callee.prepareReplacement(replacement);
 
 
 
 
 
 
 
 
346
 
347
  while (source.length > 0) {
348
  if (match = source.match(pattern)) {
@@ -354,76 +564,72 @@ Object.extend(String.prototype, {
354
  }
355
  }
356
  return result;
357
- },
358
 
359
- sub: function(pattern, replacement, count) {
360
- replacement = this.gsub.prepareReplacement(replacement);
361
  count = Object.isUndefined(count) ? 1 : count;
362
 
363
  return this.gsub(pattern, function(match) {
364
  if (--count < 0) return match[0];
365
  return replacement(match);
366
  });
367
- },
368
 
369
- scan: function(pattern, iterator) {
370
  this.gsub(pattern, iterator);
371
  return String(this);
372
- },
373
 
374
- truncate: function(length, truncation) {
375
  length = length || 30;
376
  truncation = Object.isUndefined(truncation) ? '...' : truncation;
377
  return this.length > length ?
378
  this.slice(0, length - truncation.length) + truncation : String(this);
379
- },
380
 
381
- strip: function() {
382
  return this.replace(/^\s+/, '').replace(/\s+$/, '');
383
- },
384
 
385
- stripTags: function() {
386
- return this.replace(/<\/?[^>]+>/gi, '');
387
- },
388
 
389
- stripScripts: function() {
390
  return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
391
- },
392
 
393
- extractScripts: function() {
394
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
395
- var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
396
  return (this.match(matchAll) || []).map(function(scriptTag) {
397
  return (scriptTag.match(matchOne) || ['', ''])[1];
398
  });
399
- },
400
 
401
- evalScripts: function() {
402
  return this.extractScripts().map(function(script) { return eval(script) });
403
- },
404
 
405
- escapeHTML: function() {
406
- var self = arguments.callee;
407
- self.text.data = this;
408
- return self.div.innerHTML;
409
- },
 
 
410
 
411
- unescapeHTML: function() {
412
- var div = new Element('div');
413
- div.innerHTML = this.stripTags();
414
- return div.childNodes[0] ? (div.childNodes.length > 1 ?
415
- $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
416
- div.childNodes[0].nodeValue) : '';
417
- },
418
 
419
- toQueryParams: function(separator) {
420
  var match = this.strip().match(/([^?#]*)(#.*)?$/);
421
  if (!match) return { };
422
 
423
  return match[1].split(separator || '&').inject({ }, function(hash, pair) {
424
  if ((pair = pair.split('='))[0]) {
425
- var key = decodeURIComponent(pair.shift());
426
- var value = pair.length > 1 ? pair.join('=') : pair[0];
 
427
  if (value != undefined) value = decodeURIComponent(value);
428
 
429
  if (key in hash) {
@@ -434,128 +640,144 @@ Object.extend(String.prototype, {
434
  }
435
  return hash;
436
  });
437
- },
438
 
439
- toArray: function() {
440
  return this.split('');
441
- },
442
 
443
- succ: function() {
444
  return this.slice(0, this.length - 1) +
445
  String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
446
- },
447
 
448
- times: function(count) {
449
  return count < 1 ? '' : new Array(count + 1).join(this);
450
- },
451
-
452
- camelize: function() {
453
- var parts = this.split('-'), len = parts.length;
454
- if (len == 1) return parts[0];
455
-
456
- var camelized = this.charAt(0) == '-'
457
- ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
458
- : parts[0];
459
-
460
- for (var i = 1; i < len; i++)
461
- camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
462
 
463
- return camelized;
464
- },
 
 
 
465
 
466
- capitalize: function() {
467
  return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
468
- },
469
 
470
- underscore: function() {
471
- return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
472
- },
 
 
 
 
473
 
474
- dasherize: function() {
475
- return this.gsub(/_/,'-');
476
- },
477
 
478
- inspect: function(useDoubleQuotes) {
479
- var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
480
- var character = String.specialChar[match[0]];
481
- return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
 
 
482
  });
483
  if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
484
  return "'" + escapedString.replace(/'/g, '\\\'') + "'";
485
- },
486
-
487
- toJSON: function() {
488
- return this.inspect(true);
489
- },
490
 
491
- unfilterJSON: function(filter) {
492
- return this.sub(filter || Prototype.JSONFilter, '#{1}');
493
- },
494
 
495
- isJSON: function() {
496
  var str = this;
497
  if (str.blank()) return false;
498
- str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
499
- return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
500
- },
 
 
501
 
502
- evalJSON: function(sanitize) {
503
- var json = this.unfilterJSON();
 
 
 
 
 
 
504
  try {
505
  if (!sanitize || json.isJSON()) return eval('(' + json + ')');
506
  } catch (e) { }
507
  throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
508
- },
 
 
 
 
 
509
 
510
- include: function(pattern) {
511
  return this.indexOf(pattern) > -1;
512
- },
513
 
514
- startsWith: function(pattern) {
515
- return this.indexOf(pattern) === 0;
516
- },
517
 
518
- endsWith: function(pattern) {
519
  var d = this.length - pattern.length;
520
- return d >= 0 && this.lastIndexOf(pattern) === d;
521
- },
522
 
523
- empty: function() {
524
  return this == '';
525
- },
526
 
527
- blank: function() {
528
  return /^\s*$/.test(this);
529
- },
530
-
531
- interpolate: function(object, pattern) {
532
- return new Template(this, pattern).evaluate(object);
533
  }
534
- });
535
 
536
- if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
537
- escapeHTML: function() {
538
- return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
539
- },
540
- unescapeHTML: function() {
541
- return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
542
  }
543
- });
544
-
545
- String.prototype.gsub.prepareReplacement = function(replacement) {
546
- if (Object.isFunction(replacement)) return replacement;
547
- var template = new Template(replacement);
548
- return function(match) { return template.evaluate(match) };
549
- };
550
-
551
- String.prototype.parseQuery = String.prototype.toQueryParams;
552
-
553
- Object.extend(String.prototype.escapeHTML, {
554
- div: document.createElement('div'),
555
- text: document.createTextNode('')
556
- });
557
 
558
- String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
559
 
560
  var Template = Class.create({
561
  initialize: function(template, pattern) {
@@ -564,22 +786,23 @@ var Template = Class.create({
564
  },
565
 
566
  evaluate: function(object) {
567
- if (Object.isFunction(object.toTemplateReplacements))
568
  object = object.toTemplateReplacements();
569
 
570
  return this.template.gsub(this.pattern, function(match) {
571
- if (object == null) return '';
572
 
573
  var before = match[1] || '';
574
  if (before == '\\') return match[2];
575
 
576
- var ctx = object, expr = match[3];
577
- var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
 
578
  match = pattern.exec(expr);
579
  if (match == null) return before;
580
 
581
  while (match != null) {
582
- var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
583
  ctx = ctx[comp];
584
  if (null == ctx || '' == match[3]) break;
585
  expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
@@ -594,8 +817,8 @@ Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
594
 
595
  var $break = { };
596
 
597
- var Enumerable = {
598
- each: function(iterator, context) {
599
  var index = 0;
600
  try {
601
  this._each(function(value) {
@@ -605,17 +828,17 @@ var Enumerable = {
605
  if (e != $break) throw e;
606
  }
607
  return this;
608
- },
609
 
610
- eachSlice: function(number, iterator, context) {
611
  var index = -number, slices = [], array = this.toArray();
612
  if (number < 1) return array;
613
  while ((index += number) < array.length)
614
  slices.push(array.slice(index, index+number));
615
  return slices.collect(iterator, context);
616
- },
617
 
618
- all: function(iterator, context) {
619
  iterator = iterator || Prototype.K;
620
  var result = true;
621
  this.each(function(value, index) {
@@ -623,9 +846,9 @@ var Enumerable = {
623
  if (!result) throw $break;
624
  });
625
  return result;
626
- },
627
 
628
- any: function(iterator, context) {
629
  iterator = iterator || Prototype.K;
630
  var result = false;
631
  this.each(function(value, index) {
@@ -633,18 +856,18 @@ var Enumerable = {
633
  throw $break;
634
  });
635
  return result;
636
- },
637
 
638
- collect: function(iterator, context) {
639
  iterator = iterator || Prototype.K;
640
  var results = [];
641
  this.each(function(value, index) {
642
  results.push(iterator.call(context, value, index));
643
  });
644
  return results;
645
- },
646
 
647
- detect: function(iterator, context) {
648
  var result;
649
  this.each(function(value, index) {
650
  if (iterator.call(context, value, index)) {
@@ -653,32 +876,32 @@ var Enumerable = {
653
  }
654
  });
655
  return result;
656
- },
657
 
658
- findAll: function(iterator, context) {
659
  var results = [];
660
  this.each(function(value, index) {
661
  if (iterator.call(context, value, index))
662
  results.push(value);
663
  });
664
  return results;
665
- },
666
 
667
- grep: function(filter, iterator, context) {
668
  iterator = iterator || Prototype.K;
669
  var results = [];
670
 
671
  if (Object.isString(filter))
672
- filter = new RegExp(filter);
673
 
674
  this.each(function(value, index) {
675
  if (filter.match(value))
676
  results.push(iterator.call(context, value, index));
677
  });
678
  return results;
679
- },
680
 
681
- include: function(object) {
682
  if (Object.isFunction(this.indexOf))
683
  if (this.indexOf(object) != -1) return true;
684
 
@@ -690,31 +913,31 @@ var Enumerable = {
690
  }
691
  });
692
  return found;
693
- },
694
 
695
- inGroupsOf: function(number, fillWith) {
696
  fillWith = Object.isUndefined(fillWith) ? null : fillWith;
697
  return this.eachSlice(number, function(slice) {
698
  while(slice.length < number) slice.push(fillWith);
699
  return slice;
700
  });
701
- },
702
 
703
- inject: function(memo, iterator, context) {
704
  this.each(function(value, index) {
705
  memo = iterator.call(context, memo, value, index);
706
  });
707
  return memo;
708
- },
709
 
710
- invoke: function(method) {
711
  var args = $A(arguments).slice(1);
712
  return this.map(function(value) {
713
  return value[method].apply(value, args);
714
  });
715
- },
716
 
717
- max: function(iterator, context) {
718
  iterator = iterator || Prototype.K;
719
  var result;
720
  this.each(function(value, index) {
@@ -723,9 +946,9 @@ var Enumerable = {
723
  result = value;
724
  });
725
  return result;
726
- },
727
 
728
- min: function(iterator, context) {
729
  iterator = iterator || Prototype.K;
730
  var result;
731
  this.each(function(value, index) {
@@ -734,9 +957,9 @@ var Enumerable = {
734
  result = value;
735
  });
736
  return result;
737
- },
738
 
739
- partition: function(iterator, context) {
740
  iterator = iterator || Prototype.K;
741
  var trues = [], falses = [];
742
  this.each(function(value, index) {
@@ -744,26 +967,26 @@ var Enumerable = {
744
  trues : falses).push(value);
745
  });
746
  return [trues, falses];
747
- },
748
 
749
- pluck: function(property) {
750
  var results = [];
751
  this.each(function(value) {
752
  results.push(value[property]);
753
  });
754
  return results;
755
- },
756
 
757
- reject: function(iterator, context) {
758
  var results = [];
759
  this.each(function(value, index) {
760
  if (!iterator.call(context, value, index))
761
  results.push(value);
762
  });
763
  return results;
764
- },
765
 
766
- sortBy: function(iterator, context) {
767
  return this.map(function(value, index) {
768
  return {
769
  value: value,
@@ -773,13 +996,13 @@ var Enumerable = {
773
  var a = left.criteria, b = right.criteria;
774
  return a < b ? -1 : a > b ? 1 : 0;
775
  }).pluck('value');
776
- },
777
 
778
- toArray: function() {
779
  return this.map();
780
- },
781
 
782
- zip: function() {
783
  var iterator = Prototype.K, args = $A(arguments);
784
  if (Object.isFunction(args.last()))
785
  iterator = args.pop();
@@ -788,336 +1011,416 @@ var Enumerable = {
788
  return this.map(function(value, index) {
789
  return iterator(collections.pluck(index));
790
  });
791
- },
792
 
793
- size: function() {
794
  return this.toArray().length;
795
- },
796
 
797
- inspect: function() {
798
  return '#<Enumerable:' + this.toArray().inspect() + '>';
799
  }
800
- };
801
 
802
- Object.extend(Enumerable, {
803
- map: Enumerable.collect,
804
- find: Enumerable.detect,
805
- select: Enumerable.findAll,
806
- filter: Enumerable.findAll,
807
- member: Enumerable.include,
808
- entries: Enumerable.toArray,
809
- every: Enumerable.all,
810
- some: Enumerable.any
811
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
812
  function $A(iterable) {
813
  if (!iterable) return [];
814
- if (iterable.toArray) return iterable.toArray();
815
  var length = iterable.length || 0, results = new Array(length);
816
  while (length--) results[length] = iterable[length];
817
  return results;
818
  }
819
 
820
- if (Prototype.Browser.WebKit) {
821
- $A = function(iterable) {
822
- if (!iterable) return [];
823
- // In Safari, only use the `toArray` method if it's not a NodeList.
824
- // A NodeList is a function, has an function `item` property, and a numeric
825
- // `length` property. Adapted from Google Doctype.
826
- if (!(typeof iterable === 'function' && typeof iterable.length ===
827
- 'number' && typeof iterable.item === 'function') && iterable.toArray)
828
- return iterable.toArray();
829
- var length = iterable.length || 0, results = new Array(length);
830
- while (length--) results[length] = iterable[length];
831
- return results;
832
- };
833
  }
834
 
835
  Array.from = $A;
836
 
837
- Object.extend(Array.prototype, Enumerable);
838
 
839
- if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
 
 
 
840
 
841
- Object.extend(Array.prototype, {
842
- _each: function(iterator) {
843
- for (var i = 0, length = this.length; i < length; i++)
844
- iterator(this[i]);
845
- },
 
846
 
847
- clear: function() {
848
  this.length = 0;
849
  return this;
850
- },
851
 
852
- first: function() {
853
  return this[0];
854
- },
855
 
856
- last: function() {
857
  return this[this.length - 1];
858
- },
859
 
860
- compact: function() {
861
  return this.select(function(value) {
862
  return value != null;
863
  });
864
- },
865
 
866
- flatten: function() {
867
  return this.inject([], function(array, value) {
868
- return array.concat(Object.isArray(value) ?
869
- value.flatten() : [value]);
 
 
870
  });
871
- },
872
 
873
- without: function() {
874
- var values = $A(arguments);
875
  return this.select(function(value) {
876
  return !values.include(value);
877
  });
878
- },
879
-
880
- reverse: function(inline) {
881
- return (inline !== false ? this : this.toArray())._reverse();
882
- },
883
 
884
- reduce: function() {
885
- return this.length > 1 ? this : this[0];
886
- },
887
 
888
- uniq: function(sorted) {
889
  return this.inject([], function(array, value, index) {
890
  if (0 == index || (sorted ? array.last() != value : !array.include(value)))
891
  array.push(value);
892
  return array;
893
  });
894
- },
895
 
896
- intersect: function(array) {
897
  return this.uniq().findAll(function(item) {
898
  return array.detect(function(value) { return item === value });
899
  });
900
- },
901
 
902
- clone: function() {
903
- return [].concat(this);
904
- },
905
 
906
- size: function() {
 
 
 
 
907
  return this.length;
908
- },
909
 
910
- inspect: function() {
911
  return '[' + this.map(Object.inspect).join(', ') + ']';
912
- },
913
-
914
- toJSON: function() {
915
- var results = [];
916
- this.each(function(object) {
917
- var value = Object.toJSON(object);
918
- if (!Object.isUndefined(value)) results.push(value);
919
- });
920
- return '[' + results.join(', ') + ']';
921
  }
922
- });
923
 
924
- // use native browser JS 1.6 implementation if available
925
- if (Object.isFunction(Array.prototype.forEach))
926
- Array.prototype._each = Array.prototype.forEach;
927
-
928
- if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
929
- i || (i = 0);
930
- var length = this.length;
931
- if (i < 0) i = length + i;
932
- for (; i < length; i++)
933
- if (this[i] === item) return i;
934
- return -1;
935
- };
936
-
937
- if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
938
- i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
939
- var n = this.slice(0, i).reverse().indexOf(item);
940
- return (n < 0) ? n : i - n - 1;
941
- };
942
-
943
- Array.prototype.toArray = Array.prototype.clone;
944
 
945
- function $w(string) {
946
- if (!Object.isString(string)) return [];
947
- string = string.strip();
948
- return string ? string.split(/\s+/) : [];
949
- }
950
 
951
- if (Prototype.Browser.Opera){
952
- Array.prototype.concat = function() {
953
- var array = [];
954
- for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
955
  for (var i = 0, length = arguments.length; i < length; i++) {
956
- if (Object.isArray(arguments[i])) {
957
- for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
958
- array.push(arguments[i][j]);
 
959
  } else {
960
- array.push(arguments[i]);
961
  }
962
  }
963
  return array;
964
- };
965
- }
966
- Object.extend(Number.prototype, {
967
- toColorPart: function() {
968
- return this.toPaddedString(2, 16);
969
- },
970
-
971
- succ: function() {
972
- return this + 1;
973
- },
974
 
975
- times: function(iterator, context) {
976
- $R(0, this, true).each(iterator, context);
977
- return this;
978
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
979
 
980
- toPaddedString: function(length, radix) {
981
- var string = this.toString(radix || 10);
982
- return '0'.times(length - string.length) + string;
983
- },
984
 
985
- toJSON: function() {
986
- return isFinite(this) ? this.toString() : 'null';
987
- }
988
- });
989
 
990
- $w('abs round ceil floor').each(function(method){
991
- Number.prototype[method] = Math[method].methodize();
992
- });
993
  function $H(object) {
994
  return new Hash(object);
995
  };
996
 
997
  var Hash = Class.create(Enumerable, (function() {
 
 
 
998
 
999
- function toQueryPair(key, value) {
1000
- if (Object.isUndefined(value)) return key;
1001
- return key + '=' + encodeURIComponent(String.interpret(value));
 
 
 
 
 
1002
  }
1003
 
1004
- return {
1005
- initialize: function(object) {
1006
- this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
1007
- },
1008
 
1009
- _each: function(iterator) {
1010
- for (var key in this._object) {
1011
- var value = this._object[key], pair = [key, value];
1012
- pair.key = key;
1013
- pair.value = value;
1014
- iterator(pair);
1015
- }
1016
- },
1017
 
1018
- set: function(key, value) {
1019
- return this._object[key] = value;
1020
- },
 
 
1021
 
1022
- get: function(key) {
1023
- // simulating poorly supported hasOwnProperty
1024
- if (this._object[key] !== Object.prototype[key])
1025
- return this._object[key];
1026
- },
1027
 
1028
- unset: function(key) {
1029
- var value = this._object[key];
1030
- delete this._object[key];
1031
- return value;
1032
- },
1033
 
1034
- toObject: function() {
1035
- return Object.clone(this._object);
1036
- },
1037
 
1038
- keys: function() {
1039
- return this.pluck('key');
1040
- },
1041
 
1042
- values: function() {
1043
- return this.pluck('value');
1044
- },
1045
 
1046
- index: function(value) {
1047
- var match = this.detect(function(pair) {
1048
- return pair.value === value;
1049
- });
1050
- return match && match.key;
1051
- },
1052
 
1053
- merge: function(object) {
1054
- return this.clone().update(object);
1055
- },
1056
 
1057
- update: function(object) {
1058
- return new Hash(object).inject(this, function(result, pair) {
1059
- result.set(pair.key, pair.value);
1060
- return result;
1061
- });
1062
- },
1063
 
1064
- toQueryString: function() {
1065
- return this.inject([], function(results, pair) {
1066
- var key = encodeURIComponent(pair.key), values = pair.value;
 
1067
 
1068
- if (values && typeof values == 'object') {
1069
- if (Object.isArray(values))
1070
- return results.concat(values.map(toQueryPair.curry(key)));
1071
- } else results.push(toQueryPair(key, values));
1072
- return results;
1073
- }).join('&');
1074
- },
1075
 
1076
- inspect: function() {
1077
- return '#<Hash:{' + this.map(function(pair) {
1078
- return pair.map(Object.inspect).join(': ');
1079
- }).join(', ') + '}>';
1080
- },
 
 
 
 
 
 
 
 
1081
 
1082
- toJSON: function() {
1083
- return Object.toJSON(this.toObject());
1084
- },
 
 
1085
 
1086
- clone: function() {
1087
- return new Hash(this);
1088
- }
1089
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1090
  })());
1091
 
1092
- Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
1093
  Hash.from = $H;
1094
- var ObjectRange = Class.create(Enumerable, {
1095
- initialize: function(start, end, exclusive) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1096
  this.start = start;
1097
  this.end = end;
1098
  this.exclusive = exclusive;
1099
- },
1100
 
1101
- _each: function(iterator) {
1102
  var value = this.start;
1103
  while (this.include(value)) {
1104
  iterator(value);
1105
  value = value.succ();
1106
  }
1107
- },
1108
 
1109
- include: function(value) {
1110
  if (value < this.start)
1111
  return false;
1112
  if (this.exclusive)
1113
  return value < this.end;
1114
  return value <= this.end;
1115
  }
1116
- });
1117
 
1118
- var $R = function(start, end, exclusive) {
1119
- return new ObjectRange(start, end, exclusive);
1120
- };
 
 
 
 
 
1121
 
1122
  var Ajax = {
1123
  getTransport: function() {
@@ -1164,7 +1467,6 @@ Ajax.Responders.register({
1164
  onCreate: function() { Ajax.activeRequestCount++ },
1165
  onComplete: function() { Ajax.activeRequestCount-- }
1166
  });
1167
-
1168
  Ajax.Base = Class.create({
1169
  initialize: function(options) {
1170
  this.options = {
@@ -1180,13 +1482,10 @@ Ajax.Base = Class.create({
1180
 
1181
  this.options.method = this.options.method.toLowerCase();
1182
 
1183
- if (Object.isString(this.options.parameters))
1184
- this.options.parameters = this.options.parameters.toQueryParams();
1185
- else if (Object.isHash(this.options.parameters))
1186
  this.options.parameters = this.options.parameters.toObject();
1187
  }
1188
  });
1189
-
1190
  Ajax.Request = Class.create(Ajax.Base, {
1191
  _complete: false,
1192
 
@@ -1199,24 +1498,21 @@ Ajax.Request = Class.create(Ajax.Base, {
1199
  request: function(url) {
1200
  this.url = url;
1201
  this.method = this.options.method;
1202
- var params = Object.clone(this.options.parameters);
 
 
1203
 
1204
  if (!['get', 'post'].include(this.method)) {
1205
- // simulate other verbs over post
1206
- params['_method'] = this.method;
1207
  this.method = 'post';
1208
  }
1209
 
1210
- this.parameters = params;
1211
-
1212
- if (params = Object.toQueryString(params)) {
1213
- // when GET, append parameters to URL
1214
- if (this.method == 'get')
1215
- this.url += (this.url.include('?') ? '&' : '?') + params;
1216
- else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
1217
- params += '&_=';
1218
  }
1219
 
 
 
1220
  try {
1221
  var response = new Ajax.Response(this);
1222
  if (this.options.onCreate) this.options.onCreate(response);
@@ -1269,7 +1565,6 @@ Ajax.Request = Class.create(Ajax.Base, {
1269
  headers['Connection'] = 'close';
1270
  }
1271
 
1272
- // user-defined headers
1273
  if (typeof this.options.requestHeaders == 'object') {
1274
  var extras = this.options.requestHeaders;
1275
 
@@ -1286,11 +1581,12 @@ Ajax.Request = Class.create(Ajax.Base, {
1286
 
1287
  success: function() {
1288
  var status = this.getStatus();
1289
- return !status || (status >= 200 && status < 300);
1290
  },
1291
 
1292
  getStatus: function() {
1293
  try {
 
1294
  return this.transport.status || 0;
1295
  } catch (e) { return 0 }
1296
  },
@@ -1323,7 +1619,6 @@ Ajax.Request = Class.create(Ajax.Base, {
1323
  }
1324
 
1325
  if (state == 'Complete') {
1326
- // avoid memory leak in MSIE: clean up
1327
  this.transport.onreadystatechange = Prototype.emptyFunction;
1328
  }
1329
  },
@@ -1340,7 +1635,7 @@ Ajax.Request = Class.create(Ajax.Base, {
1340
  getHeader: function(name) {
1341
  try {
1342
  return this.transport.getResponseHeader(name) || null;
1343
- } catch (e) { return null }
1344
  },
1345
 
1346
  evalResponse: function() {
@@ -1360,20 +1655,27 @@ Ajax.Request = Class.create(Ajax.Base, {
1360
  Ajax.Request.Events =
1361
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
1362
 
 
 
 
 
 
 
 
1363
  Ajax.Response = Class.create({
1364
  initialize: function(request){
1365
  this.request = request;
1366
  var transport = this.transport = request.transport,
1367
  readyState = this.readyState = transport.readyState;
1368
 
1369
- if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
1370
  this.status = this.getStatus();
1371
  this.statusText = this.getStatusText();
1372
  this.responseText = String.interpret(transport.responseText);
1373
  this.headerJSON = this._getHeaderJSON();
1374
  }
1375
 
1376
- if(readyState == 4) {
1377
  var xml = transport.responseXML;
1378
  this.responseXML = Object.isUndefined(xml) ? null : xml;
1379
  this.responseJSON = this._getResponseJSON();
@@ -1381,6 +1683,7 @@ Ajax.Response = Class.create({
1381
  },
1382
 
1383
  status: 0,
 
1384
  statusText: '',
1385
 
1386
  getStatus: Ajax.Request.prototype.getStatus,
@@ -1510,6 +1813,8 @@ Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
1510
  this.updater = new Ajax.Updater(this.container, this.url, this.options);
1511
  }
1512
  });
 
 
1513
  function $(element) {
1514
  if (arguments.length > 1) {
1515
  for (var i = 0, elements = [], length = arguments.length; i < length; i++)
@@ -1534,10 +1839,9 @@ if (Prototype.BrowserFeatures.XPath) {
1534
 
1535
  /*--------------------------------------------------------------------------*/
1536
 
1537
- if (!window.Node) var Node = { };
1538
 
1539
  if (!Node.ELEMENT_NODE) {
1540
- // DOM level 2 ECMAScript Language Binding
1541
  Object.extend(Node, {
1542
  ELEMENT_NODE: 1,
1543
  ATTRIBUTE_NODE: 2,
@@ -1554,26 +1858,63 @@ if (!Node.ELEMENT_NODE) {
1554
  });
1555
  }
1556
 
1557
- (function() {
1558
- var element = this.Element;
1559
- this.Element = function(tagName, attributes) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1560
  attributes = attributes || { };
1561
  tagName = tagName.toLowerCase();
1562
  var cache = Element.cache;
1563
- if (Prototype.Browser.IE && attributes.name) {
 
1564
  tagName = '<' + tagName + ' name="' + attributes.name + '">';
1565
  delete attributes.name;
1566
  return Element.writeAttribute(document.createElement(tagName), attributes);
1567
  }
 
1568
  if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
1569
- return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
 
 
 
 
1570
  };
1571
- Object.extend(this.Element, element || { });
1572
- if (element) this.Element.prototype = element.prototype;
1573
- }).call(window);
1574
 
 
 
 
 
 
 
1575
  Element.cache = { };
1576
 
 
 
 
 
 
 
 
 
 
1577
  Element.Methods = {
1578
  visible: function(element) {
1579
  return $(element).style.display != 'none';
@@ -1603,15 +1944,116 @@ Element.Methods = {
1603
  return element;
1604
  },
1605
 
1606
- update: function(element, content) {
1607
- element = $(element);
1608
- if (content && content.toElement) content = content.toElement();
1609
- if (Object.isElement(content)) return element.update().insert(content);
1610
- content = Object.toHTML(content);
1611
- element.innerHTML = content.stripScripts();
1612
- content.evalScripts.bind(content).defer();
1613
- return element;
1614
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1615
 
1616
  replace: function(element, content) {
1617
  element = $(element);
@@ -1679,28 +2121,35 @@ Element.Methods = {
1679
  element = $(element);
1680
  var result = '<' + element.tagName.toLowerCase();
1681
  $H({'id': 'id', 'className': 'class'}).each(function(pair) {
1682
- var property = pair.first(), attribute = pair.last();
1683
- var value = (element[property] || '').toString();
 
1684
  if (value) result += ' ' + attribute + '=' + value.inspect(true);
1685
  });
1686
  return result + '>';
1687
  },
1688
 
1689
- recursivelyCollect: function(element, property) {
1690
  element = $(element);
 
1691
  var elements = [];
1692
- while (element = element[property])
 
1693
  if (element.nodeType == 1)
1694
  elements.push(Element.extend(element));
 
 
 
 
1695
  return elements;
1696
  },
1697
 
1698
  ancestors: function(element) {
1699
- return $(element).recursivelyCollect('parentNode');
1700
  },
1701
 
1702
  descendants: function(element) {
1703
- return $(element).select("*");
1704
  },
1705
 
1706
  firstDescendant: function(element) {
@@ -1710,78 +2159,96 @@ Element.Methods = {
1710
  },
1711
 
1712
  immediateDescendants: function(element) {
1713
- if (!(element = $(element).firstChild)) return [];
1714
- while (element && element.nodeType != 1) element = element.nextSibling;
1715
- if (element) return [element].concat($(element).nextSiblings());
1716
- return [];
 
 
 
 
1717
  },
1718
 
1719
- previousSiblings: function(element) {
1720
- return $(element).recursivelyCollect('previousSibling');
1721
  },
1722
 
1723
  nextSiblings: function(element) {
1724
- return $(element).recursivelyCollect('nextSibling');
1725
  },
1726
 
1727
  siblings: function(element) {
1728
  element = $(element);
1729
- return element.previousSiblings().reverse().concat(element.nextSiblings());
 
1730
  },
1731
 
1732
  match: function(element, selector) {
 
1733
  if (Object.isString(selector))
1734
- selector = new Selector(selector);
1735
- return selector.match($(element));
1736
  },
1737
 
1738
  up: function(element, expression, index) {
1739
  element = $(element);
1740
  if (arguments.length == 1) return $(element.parentNode);
1741
- var ancestors = element.ancestors();
1742
  return Object.isNumber(expression) ? ancestors[expression] :
1743
- Selector.findElement(ancestors, expression, index);
1744
  },
1745
 
1746
  down: function(element, expression, index) {
1747
  element = $(element);
1748
- if (arguments.length == 1) return element.firstDescendant();
1749
- return Object.isNumber(expression) ? element.descendants()[expression] :
1750
  Element.select(element, expression)[index || 0];
1751
  },
1752
 
1753
  previous: function(element, expression, index) {
1754
  element = $(element);
1755
- if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
1756
- var previousSiblings = element.previousSiblings();
1757
- return Object.isNumber(expression) ? previousSiblings[expression] :
1758
- Selector.findElement(previousSiblings, expression, index);
 
 
 
 
1759
  },
1760
 
1761
  next: function(element, expression, index) {
1762
  element = $(element);
1763
- if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
1764
- var nextSiblings = element.nextSiblings();
1765
- return Object.isNumber(expression) ? nextSiblings[expression] :
1766
- Selector.findElement(nextSiblings, expression, index);
 
 
 
 
 
1767
  },
1768
 
1769
- select: function() {
1770
- var args = $A(arguments), element = $(args.shift());
1771
- return Selector.findChildElements(element, args);
 
 
1772
  },
1773
 
1774
- adjacent: function() {
1775
- var args = $A(arguments), element = $(args.shift());
1776
- return Selector.findChildElements(element.parentNode, args).without(element);
 
1777
  },
1778
 
1779
  identify: function(element) {
1780
  element = $(element);
1781
- var id = element.readAttribute('id'), self = arguments.callee;
1782
  if (id) return id;
1783
- do { id = 'anonymous_element_' + self.counter++ } while ($(id));
1784
- element.writeAttribute('id', id);
1785
  return id;
1786
  },
1787
 
@@ -1820,11 +2287,11 @@ Element.Methods = {
1820
  },
1821
 
1822
  getHeight: function(element) {
1823
- return $(element).getDimensions().height;
1824
  },
1825
 
1826
  getWidth: function(element) {
1827
- return $(element).getDimensions().width;
1828
  },
1829
 
1830
  classNames: function(element) {
@@ -1840,7 +2307,7 @@ Element.Methods = {
1840
 
1841
  addClassName: function(element, className) {
1842
  if (!(element = $(element))) return;
1843
- if (!element.hasClassName(className))
1844
  element.className += (element.className ? ' ' : '') + className;
1845
  return element;
1846
  },
@@ -1854,11 +2321,10 @@ Element.Methods = {
1854
 
1855
  toggleClassName: function(element, className) {
1856
  if (!(element = $(element))) return;
1857
- return element[element.hasClassName(className) ?
1858
- 'removeClassName' : 'addClassName'](className);
1859
  },
1860
 
1861
- // removes whitespace-only text node children
1862
  cleanWhitespace: function(element) {
1863
  element = $(element);
1864
  var node = element.firstChild;
@@ -1892,7 +2358,7 @@ Element.Methods = {
1892
 
1893
  scrollTo: function(element) {
1894
  element = $(element);
1895
- var pos = element.cumulativeOffset();
1896
  window.scrollTo(pos[0], pos[1]);
1897
  return element;
1898
  },
@@ -1938,37 +2404,12 @@ Element.Methods = {
1938
  return element;
1939
  },
1940
 
1941
- getDimensions: function(element) {
1942
- element = $(element);
1943
- var display = element.getStyle('display');
1944
- if (display != 'none' && display != null) // Safari bug
1945
- return {width: element.offsetWidth, height: element.offsetHeight};
1946
-
1947
- // All *Width and *Height properties give 0 on elements with display none,
1948
- // so enable the element temporarily
1949
- var els = element.style;
1950
- var originalVisibility = els.visibility;
1951
- var originalPosition = els.position;
1952
- var originalDisplay = els.display;
1953
- els.visibility = 'hidden';
1954
- els.position = 'absolute';
1955
- els.display = 'block';
1956
- var originalWidth = element.clientWidth;
1957
- var originalHeight = element.clientHeight;
1958
- els.display = originalDisplay;
1959
- els.position = originalPosition;
1960
- els.visibility = originalVisibility;
1961
- return {width: originalWidth, height: originalHeight};
1962
- },
1963
-
1964
  makePositioned: function(element) {
1965
  element = $(element);
1966
  var pos = Element.getStyle(element, 'position');
1967
  if (pos == 'static' || !pos) {
1968
  element._madePositioned = true;
1969
  element.style.position = 'relative';
1970
- // Opera returns the offset relative to the positioning context, when an
1971
- // element is position relative but top and left have not been defined
1972
  if (Prototype.Browser.Opera) {
1973
  element.style.top = 0;
1974
  element.style.left = 0;
@@ -2007,119 +2448,6 @@ Element.Methods = {
2007
  return element;
2008
  },
2009
 
2010
- cumulativeOffset: function(element) {
2011
- var valueT = 0, valueL = 0;
2012
- do {
2013
- valueT += element.offsetTop || 0;
2014
- valueL += element.offsetLeft || 0;
2015
- element = element.offsetParent;
2016
- } while (element);
2017
- return Element._returnOffset(valueL, valueT);
2018
- },
2019
-
2020
- positionedOffset: function(element) {
2021
- var valueT = 0, valueL = 0;
2022
- do {
2023
- valueT += element.offsetTop || 0;
2024
- valueL += element.offsetLeft || 0;
2025
- element = element.offsetParent;
2026
- if (element) {
2027
- if (element.tagName.toUpperCase() == 'BODY') break;
2028
- var p = Element.getStyle(element, 'position');
2029
- if (p !== 'static') break;
2030
- }
2031
- } while (element);
2032
- return Element._returnOffset(valueL, valueT);
2033
- },
2034
-
2035
- absolutize: function(element) {
2036
- element = $(element);
2037
- if (element.getStyle('position') == 'absolute') return element;
2038
- // Position.prepare(); // To be done manually by Scripty when it needs it.
2039
-
2040
- var offsets = element.positionedOffset();
2041
- var top = offsets[1];
2042
- var left = offsets[0];
2043
- var width = element.clientWidth;
2044
- var height = element.clientHeight;
2045
-
2046
- element._originalLeft = left - parseFloat(element.style.left || 0);
2047
- element._originalTop = top - parseFloat(element.style.top || 0);
2048
- element._originalWidth = element.style.width;
2049
- element._originalHeight = element.style.height;
2050
-
2051
- element.style.position = 'absolute';
2052
- element.style.top = top + 'px';
2053
- element.style.left = left + 'px';
2054
- element.style.width = width + 'px';
2055
- element.style.height = height + 'px';
2056
- return element;
2057
- },
2058
-
2059
- relativize: function(element) {
2060
- element = $(element);
2061
- if (element.getStyle('position') == 'relative') return element;
2062
- // Position.prepare(); // To be done manually by Scripty when it needs it.
2063
-
2064
- element.style.position = 'relative';
2065
- var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
2066
- var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
2067
-
2068
- element.style.top = top + 'px';
2069
- element.style.left = left + 'px';
2070
- element.style.height = element._originalHeight;
2071
- element.style.width = element._originalWidth;
2072
- return element;
2073
- },
2074
-
2075
- cumulativeScrollOffset: function(element) {
2076
- var valueT = 0, valueL = 0;
2077
- do {
2078
- valueT += element.scrollTop || 0;
2079
- valueL += element.scrollLeft || 0;
2080
- element = element.parentNode;
2081
- } while (element);
2082
- return Element._returnOffset(valueL, valueT);
2083
- },
2084
-
2085
- getOffsetParent: function(element) {
2086
- if (element.offsetParent) return $(element.offsetParent);
2087
- if (element == document.body) return $(element);
2088
- if(element.tagName.toUpperCase()=='HTML') //for IE6,7
2089
- return $(document.body); //
2090
-
2091
- while ((element = element.parentNode) && element != document.body)
2092
- if (Element.getStyle(element, 'position') != 'static')
2093
- return $(element);
2094
-
2095
- return $(document.body);
2096
- },
2097
-
2098
- viewportOffset: function(forElement) {
2099
- var valueT = 0, valueL = 0;
2100
-
2101
- var element = forElement;
2102
- do {
2103
- valueT += element.offsetTop || 0;
2104
- valueL += element.offsetLeft || 0;
2105
-
2106
- // Safari fix
2107
- if (element.offsetParent == document.body &&
2108
- Element.getStyle(element, 'position') == 'absolute') break;
2109
-
2110
- } while (element = element.offsetParent);
2111
-
2112
- element = forElement;
2113
- do {
2114
- if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
2115
- valueT -= element.scrollTop || 0;
2116
- valueL -= element.scrollLeft || 0;
2117
- }
2118
- } while (element = element.parentNode);
2119
-
2120
- return Element._returnOffset(valueL, valueT);
2121
- },
2122
-
2123
  clonePosition: function(element, source) {
2124
  var options = Object.extend({
2125
  setLeft: true,
@@ -2130,28 +2458,21 @@ Element.Methods = {
2130
  offsetLeft: 0
2131
  }, arguments[2] || { });
2132
 
2133
- // find page position of source
2134
  source = $(source);
2135
- var p = source.viewportOffset();
2136
 
2137
- // find coordinate system to use
2138
  element = $(element);
2139
- var delta = [0, 0];
2140
- var parent = null;
2141
- // delta [0,0] will do fine with position: fixed elements,
2142
- // position:absolute needs offsetParent deltas
2143
  if (Element.getStyle(element, 'position') == 'absolute') {
2144
- parent = element.getOffsetParent();
2145
- delta = parent.viewportOffset();
2146
  }
2147
 
2148
- // correct by body offsets (fixes Safari)
2149
  if (parent == document.body) {
2150
  delta[0] -= document.body.offsetLeft;
2151
  delta[1] -= document.body.offsetTop;
2152
  }
2153
 
2154
- // set position
2155
  if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
2156
  if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
2157
  if (options.setWidth) element.style.width = source.offsetWidth + 'px';
@@ -2160,10 +2481,9 @@ Element.Methods = {
2160
  }
2161
  };
2162
 
2163
- Element.Methods.identify.counter = 1;
2164
-
2165
  Object.extend(Element.Methods, {
2166
  getElementsBySelector: Element.Methods.select,
 
2167
  childElements: Element.Methods.immediateDescendants
2168
  });
2169
 
@@ -2181,14 +2501,9 @@ if (Prototype.Browser.Opera) {
2181
  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
2182
  function(proceed, element, style) {
2183
  switch (style) {
2184
- case 'left': case 'top': case 'right': case 'bottom':
2185
- if (proceed(element, 'position') === 'static') return null;
2186
  case 'height': case 'width':
2187
- // returns '0px' for hidden elements; we want it to return null
2188
  if (!Element.visible(element)) return null;
2189
 
2190
- // returns the border-box dimensions rather than the content-box
2191
- // dimensions, so we subtract padding and borders from the value
2192
  var dim = parseInt(proceed(element, style), 10);
2193
 
2194
  if (dim !== element['offset' + style.capitalize()])
@@ -2221,52 +2536,6 @@ if (Prototype.Browser.Opera) {
2221
  }
2222
 
2223
  else if (Prototype.Browser.IE) {
2224
- // IE doesn't report offsets correctly for static elements, so we change them
2225
- // to "relative" to get the values, then change them back.
2226
- Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
2227
- function(proceed, element) {
2228
- element = $(element);
2229
- // IE throws an error if element is not in document
2230
- try { element.offsetParent }
2231
- catch(e) { return $(document.body) }
2232
- var position = element.getStyle('position');
2233
- if (position !== 'static') return proceed(element);
2234
- element.setStyle({ position: 'relative' });
2235
- var value = proceed(element);
2236
- element.setStyle({ position: position });
2237
- return value;
2238
- }
2239
- );
2240
-
2241
- $w('positionedOffset viewportOffset').each(function(method) {
2242
- Element.Methods[method] = Element.Methods[method].wrap(
2243
- function(proceed, element) {
2244
- element = $(element);
2245
- try { element.offsetParent }
2246
- catch(e) { return Element._returnOffset(0,0) }
2247
- var position = element.getStyle('position');
2248
- if (position !== 'static') return proceed(element);
2249
- // Trigger hasLayout on the offset parent so that IE6 reports
2250
- // accurate offsetTop and offsetLeft values for position: fixed.
2251
- var offsetParent = element.getOffsetParent();
2252
- if (offsetParent && offsetParent.getStyle('position') === 'fixed')
2253
- offsetParent.setStyle({ zoom: 1 });
2254
- element.setStyle({ position: 'relative' });
2255
- var value = proceed(element);
2256
- element.setStyle({ position: position });
2257
- return value;
2258
- }
2259
- );
2260
- });
2261
-
2262
- Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
2263
- function(proceed, element) {
2264
- try { element.offsetParent }
2265
- catch(e) { return Element._returnOffset(0,0) }
2266
- return proceed(element);
2267
- }
2268
- );
2269
-
2270
  Element.Methods.getStyle = function(element, style) {
2271
  element = $(element);
2272
  style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
@@ -2308,36 +2577,90 @@ else if (Prototype.Browser.IE) {
2308
  return element;
2309
  };
2310
 
2311
- Element._attributeTranslations = {
2312
- read: {
2313
- names: {
2314
- 'class': 'className',
2315
- 'for': 'htmlFor'
2316
- },
2317
- values: {
2318
- _getAttr: function(element, attribute) {
2319
- return element.getAttribute(attribute, 2);
2320
- },
2321
- _getAttrNode: function(element, attribute) {
2322
- var node = element.getAttributeNode(attribute);
2323
- return node ? node.value : "";
2324
- },
2325
- _getEv: function(element, attribute) {
2326
- attribute = element.getAttribute(attribute);
2327
- return attribute ? attribute.toString().slice(23, -2) : null;
2328
- },
2329
- _flag: function(element, attribute) {
2330
- return $(element).hasAttribute(attribute) ? attribute : null;
2331
- },
2332
- style: function(element) {
2333
- return element.style.cssText.toLowerCase();
 
 
 
 
 
 
 
 
 
 
2334
  },
2335
- title: function(element) {
2336
- return element.title;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2337
  }
2338
  }
2339
  }
2340
- };
2341
 
2342
  Element._attributeTranslations.write = {
2343
  names: Object.extend({
@@ -2365,8 +2688,8 @@ else if (Prototype.Browser.IE) {
2365
 
2366
  (function(v) {
2367
  Object.extend(v, {
2368
- href: v._getAttr,
2369
- src: v._getAttr,
2370
  type: v._getAttr,
2371
  action: v._getAttrNode,
2372
  disabled: v._flag,
@@ -2393,6 +2716,26 @@ else if (Prototype.Browser.IE) {
2393
  onchange: v._getEv
2394
  });
2395
  })(Element._attributeTranslations.read.values);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2396
  }
2397
 
2398
  else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
@@ -2411,7 +2754,7 @@ else if (Prototype.Browser.WebKit) {
2411
  (value < 0.00001) ? 0 : value;
2412
 
2413
  if (value == 1)
2414
- if(element.tagName.toUpperCase() == 'IMG' && element.width) {
2415
  element.width++; element.width--;
2416
  } else try {
2417
  var n = document.createTextNode(' ');
@@ -2421,49 +2764,9 @@ else if (Prototype.Browser.WebKit) {
2421
 
2422
  return element;
2423
  };
2424
-
2425
- // Safari returns margins on body which is incorrect if the child is absolutely
2426
- // positioned. For performance reasons, redefine Element#cumulativeOffset for
2427
- // KHTML/WebKit only.
2428
- Element.Methods.cumulativeOffset = function(element) {
2429
- var valueT = 0, valueL = 0;
2430
- do {
2431
- valueT += element.offsetTop || 0;
2432
- valueL += element.offsetLeft || 0;
2433
- if (element.offsetParent == document.body)
2434
- if (Element.getStyle(element, 'position') == 'absolute') break;
2435
-
2436
- element = element.offsetParent;
2437
- } while (element);
2438
-
2439
- return Element._returnOffset(valueL, valueT);
2440
- };
2441
- }
2442
-
2443
- if (Prototype.Browser.IE || Prototype.Browser.Opera) {
2444
- // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
2445
- Element.Methods.update = function(element, content) {
2446
- element = $(element);
2447
-
2448
- if (content && content.toElement) content = content.toElement();
2449
- if (Object.isElement(content)) return element.update().insert(content);
2450
-
2451
- content = Object.toHTML(content);
2452
- var tagName = element.tagName.toUpperCase();
2453
-
2454
- if (tagName in Element._insertionTranslations.tags) {
2455
- $A(element.childNodes).each(function(node) { element.removeChild(node) });
2456
- Element._getContentFromAnonymousElement(tagName, content.stripScripts())
2457
- .each(function(node) { element.appendChild(node) });
2458
- }
2459
- else element.innerHTML = content.stripScripts();
2460
-
2461
- content.evalScripts.bind(content).defer();
2462
- return element;
2463
- };
2464
  }
2465
 
2466
- if ('outerHTML' in document.createElement('div')) {
2467
  Element.Methods.replace = function(element, content) {
2468
  element = $(element);
2469
 
@@ -2477,8 +2780,8 @@ if ('outerHTML' in document.createElement('div')) {
2477
  var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
2478
 
2479
  if (Element._insertionTranslations.tags[tagName]) {
2480
- var nextSibling = element.next();
2481
- var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
2482
  parent.removeChild(element);
2483
  if (nextSibling)
2484
  fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
@@ -2499,12 +2802,27 @@ Element._returnOffset = function(l, t) {
2499
  return result;
2500
  };
2501
 
2502
- Element._getContentFromAnonymousElement = function(tagName, html) {
2503
- var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
2504
- if (t) {
2505
- div.innerHTML = t[0] + html + t[1];
2506
- t[2].times(function() { div = div.firstChild });
2507
- } else div.innerHTML = html;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2508
  return $A(div.childNodes);
2509
  };
2510
 
@@ -2531,12 +2849,13 @@ Element._insertionTranslations = {
2531
  };
2532
 
2533
  (function() {
2534
- Object.extend(this.tags, {
2535
- THEAD: this.tags.TBODY,
2536
- TFOOT: this.tags.TBODY,
2537
- TH: this.tags.TD
 
2538
  });
2539
- }).call(Element._insertionTranslations);
2540
 
2541
  Element.Methods.Simulated = {
2542
  hasAttribute: function(element, attribute) {
@@ -2550,41 +2869,81 @@ Element.Methods.ByTag = { };
2550
 
2551
  Object.extend(Element, Element.Methods);
2552
 
2553
- if (!Prototype.BrowserFeatures.ElementExtensions &&
2554
- document.createElement('div')['__proto__']) {
2555
- window.HTMLElement = { };
2556
- window.HTMLElement.prototype = document.createElement('div')['__proto__'];
2557
- Prototype.BrowserFeatures.ElementExtensions = true;
2558
- }
 
 
 
 
 
2559
 
2560
  Element.extend = (function() {
2561
- if (Prototype.BrowserFeatures.SpecificElementExtensions)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2562
  return Prototype.K;
 
2563
 
2564
  var Methods = { }, ByTag = Element.Methods.ByTag;
2565
 
2566
  var extend = Object.extend(function(element) {
2567
- if (!element || element._extendedByPrototype ||
2568
  element.nodeType != 1 || element == window) return element;
2569
 
2570
  var methods = Object.clone(Methods),
2571
- tagName = element.tagName.toUpperCase(), property, value;
2572
 
2573
- // extend methods for specific tags
2574
  if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
2575
 
2576
- for (property in methods) {
2577
- value = methods[property];
2578
- if (Object.isFunction(value) && !(property in element))
2579
- element[property] = value.methodize();
2580
- }
2581
 
2582
  element._extendedByPrototype = Prototype.emptyFunction;
2583
  return element;
2584
 
2585
  }, {
2586
  refresh: function() {
2587
- // extend methods for all tags (Safari doesn't need this)
2588
  if (!Prototype.BrowserFeatures.ElementExtensions) {
2589
  Object.extend(Methods, Element.Methods);
2590
  Object.extend(Methods, Element.Methods.Simulated);
@@ -2596,10 +2955,14 @@ Element.extend = (function() {
2596
  return extend;
2597
  })();
2598
 
2599
- Element.hasAttribute = function(element, attribute) {
2600
- if (element.hasAttribute) return element.hasAttribute(attribute);
2601
- return Element.Methods.Simulated.hasAttribute(element, attribute);
2602
- };
 
 
 
 
2603
 
2604
  Element.addMethods = function(methods) {
2605
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
@@ -2611,7 +2974,8 @@ Element.addMethods = function(methods) {
2611
  "FORM": Object.clone(Form.Methods),
2612
  "INPUT": Object.clone(Form.Element.Methods),
2613
  "SELECT": Object.clone(Form.Element.Methods),
2614
- "TEXTAREA": Object.clone(Form.Element.Methods)
 
2615
  });
2616
  }
2617
 
@@ -2663,14 +3027,19 @@ Element.addMethods = function(methods) {
2663
  klass = 'HTML' + tagName.capitalize() + 'Element';
2664
  if (window[klass]) return window[klass];
2665
 
2666
- window[klass] = { };
2667
- window[klass].prototype = document.createElement(tagName)['__proto__'];
2668
- return window[klass];
 
 
2669
  }
2670
 
 
 
 
2671
  if (F.ElementExtensions) {
2672
- copy(Element.Methods, HTMLElement.prototype);
2673
- copy(Element.Methods.Simulated, HTMLElement.prototype, true);
2674
  }
2675
 
2676
  if (F.SpecificElementExtensions) {
@@ -2688,791 +3057,1947 @@ Element.addMethods = function(methods) {
2688
  Element.cache = { };
2689
  };
2690
 
 
2691
  document.viewport = {
 
2692
  getDimensions: function() {
2693
- var dimensions = { }, B = Prototype.Browser;
2694
- $w('width height').each(function(d) {
2695
- var D = d.capitalize();
2696
- if (B.WebKit && !document.evaluate) {
2697
- // Safari <3.0 needs self.innerWidth/Height
2698
- dimensions[d] = self['inner' + D];
2699
- } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
2700
- // Opera <9.5 needs document.body.clientWidth/Height
2701
- dimensions[d] = document.body['client' + D]
2702
- } else {
2703
- dimensions[d] = document.documentElement['client' + D];
2704
- }
2705
- });
2706
- return dimensions;
2707
- },
2708
-
2709
- getWidth: function() {
2710
- return this.getDimensions().width;
2711
- },
2712
-
2713
- getHeight: function() {
2714
- return this.getDimensions().height;
2715
  },
2716
 
2717
  getScrollOffsets: function() {
2718
  return Element._returnOffset(
2719
  window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
2720
- window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
2721
  }
2722
  };
2723
- /* Portions of the Selector class are derived from Jack Slocum's DomQuery,
2724
- * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
2725
- * license. Please see http://www.yui-ext.com/ for more information. */
2726
-
2727
- var Selector = Class.create({
2728
- initialize: function(expression) {
2729
- this.expression = expression.strip();
2730
-
2731
- if (this.shouldUseSelectorsAPI()) {
2732
- this.mode = 'selectorsAPI';
2733
- } else if (this.shouldUseXPath()) {
2734
- this.mode = 'xpath';
2735
- this.compileXPathMatcher();
2736
- } else {
2737
- this.mode = "normal";
2738
- this.compileMatcher();
2739
- }
2740
 
2741
- },
 
2742
 
2743
- shouldUseXPath: function() {
2744
- if (!Prototype.BrowserFeatures.XPath) return false;
 
2745
 
2746
- var e = this.expression;
 
2747
 
2748
- // Safari 3 chokes on :*-of-type and :empty
2749
- if (Prototype.Browser.WebKit &&
2750
- (e.include("-of-type") || e.include(":empty")))
2751
- return false;
2752
 
2753
- // XPath can't do namespaced attributes, nor can it read
2754
- // the "checked" property from DOM nodes
2755
- if ((/(\[[\w-]*?:|:checked)/).test(e))
2756
- return false;
2757
 
2758
- return true;
2759
- },
2760
 
2761
- shouldUseSelectorsAPI: function() {
2762
- if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
 
2763
 
2764
- if (!Selector._div) Selector._div = new Element('div');
2765
 
2766
- // Make sure the browser treats the selector as valid. Test on an
2767
- // isolated element to minimize cost of this check.
2768
- try {
2769
- Selector._div.querySelector(this.expression);
2770
- } catch(e) {
2771
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
2772
  }
2773
 
2774
- return true;
 
 
 
2775
  },
2776
 
2777
- compileMatcher: function() {
2778
- var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
2779
- c = Selector.criteria, le, p, m;
 
 
 
 
 
2780
 
2781
- if (Selector._cache[e]) {
2782
- this.matcher = Selector._cache[e];
2783
- return;
 
 
 
 
 
 
 
2784
  }
2785
 
2786
- this.matcher = ["this.matcher = function(root) {",
2787
- "var r = root, h = Selector.handlers, c = false, n;"];
2788
 
2789
- while (e && le != e && (/\S/).test(e)) {
2790
- le = e;
2791
- for (var i in ps) {
2792
- p = ps[i];
2793
- if (m = e.match(p)) {
2794
- this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
2795
- new Template(c[i]).evaluate(m));
2796
- e = e.replace(m[0], '');
2797
- break;
2798
- }
2799
  }
2800
  }
2801
-
2802
- this.matcher.push("return h.unique(n);\n}");
2803
- eval(this.matcher.join('\n'));
2804
- Selector._cache[this.expression] = this.matcher;
2805
  },
2806
 
2807
- compileXPathMatcher: function() {
2808
- var e = this.expression, ps = Selector.patterns,
2809
- x = Selector.xpath, le, m;
 
 
 
 
 
 
 
 
 
 
 
 
 
2810
 
2811
- if (Selector._cache[e]) {
2812
- this.xpath = Selector._cache[e]; return;
 
 
 
 
 
 
 
 
 
2813
  }
2814
 
2815
- this.matcher = ['.//*'];
2816
- while (e && le != e && (/\S/).test(e)) {
2817
- le = e;
2818
- for (var i in ps) {
2819
- if (m = e.match(ps[i])) {
2820
- this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
2821
- new Template(x[i]).evaluate(m));
2822
- e = e.replace(m[0], '');
2823
- break;
2824
- }
2825
- }
2826
  }
2827
 
2828
- this.xpath = this.matcher.join('');
2829
- Selector._cache[this.expression] = this.xpath;
2830
- },
2831
 
2832
- findElements: function(root) {
2833
- root = root || document;
2834
- var e = this.expression, results;
2835
-
2836
- switch (this.mode) {
2837
- case 'selectorsAPI':
2838
- // querySelectorAll queries document-wide, then filters to descendants
2839
- // of the context element. That's not what we want.
2840
- // Add an explicit context to the selector if necessary.
2841
- if (root !== document) {
2842
- var oldId = root.id, id = $(root).identify();
2843
- e = "#" + id + " " + e;
2844
- }
2845
 
2846
- results = $A(root.querySelectorAll(e)).map(Element.extend);
2847
- root.id = oldId;
 
 
 
 
 
2848
 
2849
- return results;
2850
- case 'xpath':
2851
- return document._getElementsByXPath(this.xpath, root);
2852
- default:
2853
- return this.matcher(root);
2854
  }
2855
- },
2856
 
2857
- match: function(element) {
2858
- this.tokens = [];
2859
-
2860
- var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
2861
- var le, p, m;
2862
-
2863
- while (e && le !== e && (/\S/).test(e)) {
2864
- le = e;
2865
- for (var i in ps) {
2866
- p = ps[i];
2867
- if (m = e.match(p)) {
2868
- // use the Selector.assertions methods unless the selector
2869
- // is too complex.
2870
- if (as[i]) {
2871
- this.tokens.push([i, Object.clone(m)]);
2872
- e = e.replace(m[0], '');
2873
- } else {
2874
- // reluctantly do a document-wide search
2875
- // and look for a match in the array
2876
- return this.findElements(document).include(element);
2877
- }
 
 
2878
  }
2879
  }
 
 
2880
  }
2881
 
2882
- var match = true, name, matches;
2883
- for (var i = 0, token; token = this.tokens[i]; i++) {
2884
- name = token[0], matches = token[1];
2885
- if (!Selector.assertions[name](element, matches)) {
2886
- match = false; break;
2887
- }
2888
  }
 
 
2889
 
2890
- return match;
2891
- },
 
 
 
 
 
 
 
 
 
2892
 
2893
- toString: function() {
2894
- return this.expression;
2895
- },
 
 
 
 
 
 
2896
 
2897
- inspect: function() {
2898
- return "#<Selector:" + this.expression.inspect() + ">";
 
2899
  }
2900
- });
2901
 
2902
- Object.extend(Selector, {
2903
- _cache: { },
2904
-
2905
- xpath: {
2906
- descendant: "//*",
2907
- child: "/*",
2908
- adjacent: "/following-sibling::*[1]",
2909
- laterSibling: '/following-sibling::*',
2910
- tagName: function(m) {
2911
- if (m[1] == '*') return '';
2912
- return "[local-name()='" + m[1].toLowerCase() +
2913
- "' or local-name()='" + m[1].toUpperCase() + "']";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2914
  },
2915
- className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
2916
- id: "[@id='#{1}']",
2917
- attrPresence: function(m) {
2918
- m[1] = m[1].toLowerCase();
2919
- return new Template("[@#{1}]").evaluate(m);
 
 
2920
  },
2921
- attr: function(m) {
2922
- m[1] = m[1].toLowerCase();
2923
- m[3] = m[5] || m[6];
2924
- return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
 
 
 
 
2925
  },
2926
- pseudo: function(m) {
2927
- var h = Selector.xpath.pseudos[m[1]];
2928
- if (!h) return '';
2929
- if (Object.isFunction(h)) return h(m);
2930
- return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
 
 
 
 
 
 
 
2931
  },
2932
- operators: {
2933
- '=': "[@#{1}='#{3}']",
2934
- '!=': "[@#{1}!='#{3}']",
2935
- '^=': "[starts-with(@#{1}, '#{3}')]",
2936
- '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
2937
- '*=': "[contains(@#{1}, '#{3}')]",
2938
- '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
2939
- '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
2940
  },
2941
- pseudos: {
2942
- 'first-child': '[not(preceding-sibling::*)]',
2943
- 'last-child': '[not(following-sibling::*)]',
2944
- 'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
2945
- 'empty': "[count(*) = 0 and (count(text()) = 0)]",
2946
- 'checked': "[@checked]",
2947
- 'disabled': "[(@disabled) and (@type!='hidden')]",
2948
- 'enabled': "[not(@disabled) and (@type!='hidden')]",
2949
- 'not': function(m) {
2950
- var e = m[6], p = Selector.patterns,
2951
- x = Selector.xpath, le, v;
2952
-
2953
- var exclusion = [];
2954
- while (e && le != e && (/\S/).test(e)) {
2955
- le = e;
2956
- for (var i in p) {
2957
- if (m = e.match(p[i])) {
2958
- v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
2959
- exclusion.push("(" + v.substring(1, v.length - 1) + ")");
2960
- e = e.replace(m[0], '');
2961
- break;
2962
- }
2963
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2964
  }
2965
- return "[not(" + exclusion.join(" and ") + ")]";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2966
  },
2967
- 'nth-child': function(m) {
2968
- return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
 
2969
  },
2970
- 'nth-last-child': function(m) {
2971
- return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
 
2972
  },
2973
- 'nth-of-type': function(m) {
2974
- return Selector.xpath.pseudos.nth("position() ", m);
 
2975
  },
2976
- 'nth-last-of-type': function(m) {
2977
- return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
 
2978
  },
2979
- 'first-of-type': function(m) {
2980
- m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
 
2981
  },
2982
- 'last-of-type': function(m) {
2983
- m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
 
2984
  },
2985
- 'only-of-type': function(m) {
2986
- var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
 
2987
  },
2988
- nth: function(fragment, m) {
2989
- var mm, formula = m[6], predicate;
2990
- if (formula == 'even') formula = '2n+0';
2991
- if (formula == 'odd') formula = '2n+1';
2992
- if (mm = formula.match(/^(\d+)$/)) // digit only
2993
- return '[' + fragment + "= " + mm[1] + ']';
2994
- if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
2995
- if (mm[1] == "-") mm[1] = -1;
2996
- var a = mm[1] ? Number(mm[1]) : 1;
2997
- var b = mm[2] ? Number(mm[2]) : 0;
2998
- predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
2999
- "((#{fragment} - #{b}) div #{a} >= 0)]";
3000
- return new Template(predicate).evaluate({
3001
- fragment: fragment, a: a, b: b });
3002
- }
3003
  }
3004
  }
3005
- },
3006
 
3007
- criteria: {
3008
- tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
3009
- className: 'n = h.className(n, r, "#{1}", c); c = false;',
3010
- id: 'n = h.id(n, r, "#{1}", c); c = false;',
3011
- attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
3012
- attr: function(m) {
3013
- m[3] = (m[5] || m[6]);
3014
- return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
3015
- },
3016
- pseudo: function(m) {
3017
- if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
3018
- return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
3019
- },
3020
- descendant: 'c = "descendant";',
3021
- child: 'c = "child";',
3022
- adjacent: 'c = "adjacent";',
3023
- laterSibling: 'c = "laterSibling";'
3024
- },
3025
 
3026
- patterns: {
3027
- // combinators must be listed first
3028
- // (and descendant needs to be last combinator)
3029
- laterSibling: /^\s*~\s*/,
3030
- child: /^\s*>\s*/,
3031
- adjacent: /^\s*\+\s*/,
3032
- descendant: /^\s/,
3033
-
3034
- // selectors follow
3035
- tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
3036
- id: /^#([\w\-\*]+)(\b|$)/,
3037
- className: /^\.([\w\-\*]+)(\b|$)/,
3038
- pseudo:
3039
- /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
3040
- attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
3041
- attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
3042
- },
3043
 
3044
- // for Selector.match and Element#match
3045
- assertions: {
3046
- tagName: function(element, matches) {
3047
- return matches[1].toUpperCase() == element.tagName.toUpperCase();
 
 
 
3048
  },
3049
 
3050
- className: function(element, matches) {
3051
- return Element.hasClassName(element, matches[1]);
 
 
 
3052
  },
3053
 
3054
- id: function(element, matches) {
3055
- return element.id === matches[1];
3056
  },
3057
 
3058
- attrPresence: function(element, matches) {
3059
- return Element.hasAttribute(element, matches[1]);
3060
  },
3061
 
3062
- attr: function(element, matches) {
3063
- var nodeValue = Element.readAttribute(element, matches[1]);
3064
- return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
3065
  }
3066
- },
3067
 
3068
- handlers: {
3069
- // UTILITY FUNCTIONS
3070
- // joins two collections
3071
- concat: function(a, b) {
3072
- for (var i = 0, node; node = b[i]; i++)
3073
- a.push(node);
3074
- return a;
3075
- },
3076
 
3077
- // marks an array of nodes for counting
3078
- mark: function(nodes) {
3079
- var _true = Prototype.emptyFunction;
3080
- for (var i = 0, node; node = nodes[i]; i++)
3081
- node._countedByPrototype = _true;
3082
- return nodes;
3083
- },
3084
 
3085
- unmark: function(nodes) {
3086
- for (var i = 0, node; node = nodes[i]; i++)
3087
- node._countedByPrototype = undefined;
3088
- return nodes;
3089
- },
3090
 
3091
- // mark each child node with its position (for nth calls)
3092
- // "ofType" flag indicates whether we're indexing for nth-of-type
3093
- // rather than nth-child
3094
- index: function(parentNode, reverse, ofType) {
3095
- parentNode._countedByPrototype = Prototype.emptyFunction;
3096
- if (reverse) {
3097
- for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
3098
- var node = nodes[i];
3099
- if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
3100
- }
3101
- } else {
3102
- for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
3103
- if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
3104
- }
3105
- },
3106
 
3107
- // filters out duplicates and extends all nodes
3108
- unique: function(nodes) {
3109
- if (nodes.length == 0) return nodes;
3110
- var results = [], n;
3111
- for (var i = 0, l = nodes.length; i < l; i++)
3112
- if (!(n = nodes[i])._countedByPrototype) {
3113
- n._countedByPrototype = Prototype.emptyFunction;
3114
- results.push(Element.extend(n));
3115
- }
3116
- return Selector.handlers.unmark(results);
3117
- },
3118
 
3119
- // COMBINATOR FUNCTIONS
3120
- descendant: function(nodes) {
3121
- var h = Selector.handlers;
3122
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3123
- h.concat(results, node.getElementsByTagName('*'));
3124
- return results;
3125
- },
3126
 
3127
- child: function(nodes) {
3128
- var h = Selector.handlers;
3129
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3130
- for (var j = 0, child; child = node.childNodes[j]; j++)
3131
- if (child.nodeType == 1 && child.tagName != '!') results.push(child);
3132
- }
3133
- return results;
3134
- },
3135
 
3136
- adjacent: function(nodes) {
3137
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3138
- var next = this.nextElementSibling(node);
3139
- if (next) results.push(next);
3140
- }
3141
- return results;
3142
- },
3143
 
3144
- laterSibling: function(nodes) {
3145
- var h = Selector.handlers;
3146
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3147
- h.concat(results, Element.nextSiblings(node));
3148
- return results;
3149
- },
3150
 
3151
- nextElementSibling: function(node) {
3152
- while (node = node.nextSibling)
3153
- if (node.nodeType == 1) return node;
3154
- return null;
3155
- },
3156
 
3157
- previousElementSibling: function(node) {
3158
- while (node = node.previousSibling)
3159
- if (node.nodeType == 1) return node;
3160
- return null;
3161
- },
3162
 
3163
- // TOKEN FUNCTIONS
3164
- tagName: function(nodes, root, tagName, combinator) {
3165
- var uTagName = tagName.toUpperCase();
3166
- var results = [], h = Selector.handlers;
3167
- if (nodes) {
3168
- if (combinator) {
3169
- // fastlane for ordinary descendant combinators
3170
- if (combinator == "descendant") {
3171
- for (var i = 0, node; node = nodes[i]; i++)
3172
- h.concat(results, node.getElementsByTagName(tagName));
3173
- return results;
3174
- } else nodes = this[combinator](nodes);
3175
- if (tagName == "*") return nodes;
3176
- }
3177
- for (var i = 0, node; node = nodes[i]; i++)
3178
- if (node.tagName.toUpperCase() === uTagName) results.push(node);
3179
- return results;
3180
- } else return root.getElementsByTagName(tagName);
3181
- },
3182
 
3183
- id: function(nodes, root, id, combinator) {
3184
- var targetNode = $(id), h = Selector.handlers;
3185
- if (!targetNode) return [];
3186
- if (!nodes && root == document) return [targetNode];
3187
- if (nodes) {
3188
- if (combinator) {
3189
- if (combinator == 'child') {
3190
- for (var i = 0, node; node = nodes[i]; i++)
3191
- if (targetNode.parentNode == node) return [targetNode];
3192
- } else if (combinator == 'descendant') {
3193
- for (var i = 0, node; node = nodes[i]; i++)
3194
- if (Element.descendantOf(targetNode, node)) return [targetNode];
3195
- } else if (combinator == 'adjacent') {
3196
- for (var i = 0, node; node = nodes[i]; i++)
3197
- if (Selector.handlers.previousElementSibling(targetNode) == node)
3198
- return [targetNode];
3199
- } else nodes = h[combinator](nodes);
3200
- }
3201
- for (var i = 0, node; node = nodes[i]; i++)
3202
- if (node == targetNode) return [targetNode];
3203
- return [];
3204
- }
3205
- return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
3206
- },
3207
 
3208
- className: function(nodes, root, className, combinator) {
3209
- if (nodes && combinator) nodes = this[combinator](nodes);
3210
- return Selector.handlers.byClassName(nodes, root, className);
3211
- },
3212
 
3213
- byClassName: function(nodes, root, className) {
3214
- if (!nodes) nodes = Selector.handlers.descendant([root]);
3215
- var needle = ' ' + className + ' ';
3216
- for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
3217
- nodeClassName = node.className;
3218
- if (nodeClassName.length == 0) continue;
3219
- if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
3220
- results.push(node);
3221
  }
3222
- return results;
3223
- },
3224
 
3225
- attrPresence: function(nodes, root, attr, combinator) {
3226
- if (!nodes) nodes = root.getElementsByTagName("*");
3227
- if (nodes && combinator) nodes = this[combinator](nodes);
3228
- var results = [];
3229
- for (var i = 0, node; node = nodes[i]; i++)
3230
- if (Element.hasAttribute(node, attr)) results.push(node);
3231
- return results;
3232
- },
3233
 
3234
- attr: function(nodes, root, attr, value, operator, combinator) {
3235
- if (!nodes) nodes = root.getElementsByTagName("*");
3236
- if (nodes && combinator) nodes = this[combinator](nodes);
3237
- var handler = Selector.operators[operator], results = [];
3238
- for (var i = 0, node; node = nodes[i]; i++) {
3239
- var nodeValue = Element.readAttribute(node, attr);
3240
- if (nodeValue === null) continue;
3241
- if (handler(nodeValue, value)) results.push(node);
3242
- }
3243
- return results;
3244
- },
3245
 
3246
- pseudo: function(nodes, name, value, root, combinator) {
3247
- if (nodes && combinator) nodes = this[combinator](nodes);
3248
- if (!nodes) nodes = root.getElementsByTagName("*");
3249
- return Selector.pseudos[name](nodes, value, root);
 
 
 
 
 
3250
  }
3251
- },
 
3252
 
3253
- pseudos: {
3254
- 'first-child': function(nodes, value, root) {
3255
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3256
- if (Selector.handlers.previousElementSibling(node)) continue;
3257
- results.push(node);
3258
- }
3259
- return results;
3260
- },
3261
- 'last-child': function(nodes, value, root) {
3262
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3263
- if (Selector.handlers.nextElementSibling(node)) continue;
3264
- results.push(node);
3265
- }
3266
- return results;
3267
- },
3268
- 'only-child': function(nodes, value, root) {
3269
- var h = Selector.handlers;
3270
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3271
- if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
3272
- results.push(node);
3273
- return results;
3274
- },
3275
- 'nth-child': function(nodes, formula, root) {
3276
- return Selector.pseudos.nth(nodes, formula, root);
3277
- },
3278
- 'nth-last-child': function(nodes, formula, root) {
3279
- return Selector.pseudos.nth(nodes, formula, root, true);
3280
- },
3281
- 'nth-of-type': function(nodes, formula, root) {
3282
- return Selector.pseudos.nth(nodes, formula, root, false, true);
3283
- },
3284
- 'nth-last-of-type': function(nodes, formula, root) {
3285
- return Selector.pseudos.nth(nodes, formula, root, true, true);
3286
- },
3287
- 'first-of-type': function(nodes, formula, root) {
3288
- return Selector.pseudos.nth(nodes, "1", root, false, true);
3289
- },
3290
- 'last-of-type': function(nodes, formula, root) {
3291
- return Selector.pseudos.nth(nodes, "1", root, true, true);
3292
- },
3293
- 'only-of-type': function(nodes, formula, root) {
3294
- var p = Selector.pseudos;
3295
- return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
3296
- },
3297
 
3298
- // handles the an+b logic
3299
- getIndices: function(a, b, total) {
3300
- if (a == 0) return b > 0 ? [b] : [];
3301
- return $R(1, total).inject([], function(memo, i) {
3302
- if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
3303
- return memo;
3304
- });
3305
- },
3306
 
3307
- // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
3308
- nth: function(nodes, formula, root, reverse, ofType) {
3309
- if (nodes.length == 0) return [];
3310
- if (formula == 'even') formula = '2n+0';
3311
- if (formula == 'odd') formula = '2n+1';
3312
- var h = Selector.handlers, results = [], indexed = [], m;
3313
- h.mark(nodes);
3314
- for (var i = 0, node; node = nodes[i]; i++) {
3315
- if (!node.parentNode._countedByPrototype) {
3316
- h.index(node.parentNode, reverse, ofType);
3317
- indexed.push(node.parentNode);
3318
- }
3319
- }
3320
- if (formula.match(/^\d+$/)) { // just a number
3321
- formula = Number(formula);
3322
- for (var i = 0, node; node = nodes[i]; i++)
3323
- if (node.nodeIndex == formula) results.push(node);
3324
- } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
3325
- if (m[1] == "-") m[1] = -1;
3326
- var a = m[1] ? Number(m[1]) : 1;
3327
- var b = m[2] ? Number(m[2]) : 0;
3328
- var indices = Selector.pseudos.getIndices(a, b, nodes.length);
3329
- for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
3330
- for (var j = 0; j < l; j++)
3331
- if (node.nodeIndex == indices[j]) results.push(node);
3332
- }
3333
  }
3334
- h.unmark(nodes);
3335
- h.unmark(indexed);
3336
- return results;
3337
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3338
 
3339
- 'empty': function(nodes, value, root) {
3340
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
3341
- // IE treats comments as element nodes
3342
- if (node.tagName == '!' || node.firstChild) continue;
3343
- results.push(node);
3344
  }
3345
- return results;
3346
- },
 
3347
 
3348
- 'not': function(nodes, selector, root) {
3349
- var h = Selector.handlers, selectorType, m;
3350
- var exclusions = new Selector(selector).findElements(root);
3351
- h.mark(exclusions);
3352
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3353
- if (!node._countedByPrototype) results.push(node);
3354
- h.unmark(exclusions);
3355
- return results;
3356
- },
3357
 
3358
- 'enabled': function(nodes, value, root) {
3359
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3360
- if (!node.disabled && (!node.type || node.type !== 'hidden'))
3361
- results.push(node);
3362
- return results;
3363
- },
3364
 
3365
- 'disabled': function(nodes, value, root) {
3366
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3367
- if (node.disabled) results.push(node);
3368
- return results;
3369
- },
3370
 
3371
- 'checked': function(nodes, value, root) {
3372
- for (var i = 0, results = [], node; node = nodes[i]; i++)
3373
- if (node.checked) results.push(node);
3374
- return results;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3375
  }
3376
- },
3377
 
3378
- operators: {
3379
- '=': function(nv, v) { return nv == v; },
3380
- '!=': function(nv, v) { return nv != v; },
3381
- '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
3382
- '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
3383
- '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
3384
- '$=': function(nv, v) { return nv.endsWith(v); },
3385
- '*=': function(nv, v) { return nv.include(v); },
3386
- '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
3387
- '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
3388
- '-').include('-' + (v || "").toUpperCase() + '-'); }
3389
- },
3390
 
3391
- split: function(expression) {
3392
- var expressions = [];
3393
- expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
3394
- expressions.push(m[1].strip());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3395
  });
3396
- return expressions;
3397
- },
 
 
 
 
 
 
 
3398
 
3399
- matchElements: function(elements, expression) {
3400
- var matches = $$(expression), h = Selector.handlers;
3401
- h.mark(matches);
3402
- for (var i = 0, results = [], element; element = elements[i]; i++)
3403
- if (element._countedByPrototype) results.push(element);
3404
- h.unmark(matches);
3405
- return results;
3406
- },
3407
 
3408
- findElement: function(elements, expression, index) {
3409
- if (Object.isNumber(expression)) {
3410
- index = expression; expression = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3411
  }
3412
- return Selector.matchElements(elements, expression || '*')[index || 0];
3413
- },
3414
 
3415
- findChildElements: function(element, expressions) {
3416
- expressions = Selector.split(expressions.join(','));
3417
- var results = [], h = Selector.handlers;
3418
- for (var i = 0, l = expressions.length, selector; i < l; i++) {
3419
- selector = new Selector(expressions[i].strip());
3420
- h.concat(results, selector.findElements(element));
3421
  }
3422
- return (l > 1) ? h.unique(results) : results;
3423
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3424
  });
3425
 
3426
- if (Prototype.Browser.IE) {
3427
- Object.extend(Selector.handlers, {
3428
- // IE returns comment nodes on getElementsByTagName("*").
3429
- // Filter them out.
3430
- concat: function(a, b) {
3431
- for (var i = 0, node; node = b[i]; i++)
3432
- if (node.tagName !== "!") a.push(node);
3433
- return a;
3434
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3435
 
3436
- // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
3437
- unmark: function(nodes) {
3438
- for (var i = 0, node; node = nodes[i]; i++)
3439
- node.removeAttribute('_countedByPrototype');
3440
- return nodes;
3441
- }
3442
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3443
  }
3444
 
3445
- function $$() {
3446
- return Selector.findChildElements(document, $A(arguments));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3447
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3448
  var Form = {
3449
  reset: function(form) {
3450
- $(form).reset();
 
3451
  return form;
3452
  },
3453
 
3454
  serializeElements: function(elements, options) {
3455
  if (typeof options != 'object') options = { hash: !!options };
3456
  else if (Object.isUndefined(options.hash)) options.hash = true;
3457
- var key, value, submitted = false, submit = options.submit;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3458
 
3459
- var data = elements.inject({ }, function(result, element) {
3460
  if (!element.disabled && element.name) {
3461
  key = element.name; value = $(element).getValue();
3462
  if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
3463
  submit !== false && (!submit || key == submit) && (submitted = true)))) {
3464
- if (key in result) {
3465
- // a key is already present; construct an array of values
3466
- if (!Object.isArray(result[key])) result[key] = [result[key]];
3467
- result[key].push(value);
3468
- }
3469
- else result[key] = value;
3470
  }
3471
  }
3472
  return result;
3473
  });
3474
-
3475
- return options.hash ? data : Object.toQueryString(data);
3476
  }
3477
  };
3478
 
@@ -3482,13 +5007,18 @@ Form.Methods = {
3482
  },
3483
 
3484
  getElements: function(form) {
3485
- return $A($(form).getElementsByTagName('*')).inject([],
3486
- function(elements, child) {
3487
- if (Form.Element.Serializers[child.tagName.toLowerCase()])
3488
- elements.push(Element.extend(child));
3489
- return elements;
3490
- }
3491
- );
 
 
 
 
 
3492
  },
3493
 
3494
  getInputs: function(form, typeName, name) {
@@ -3528,13 +5058,14 @@ Form.Methods = {
3528
  }).sortBy(function(element) { return element.tabIndex }).first();
3529
 
3530
  return firstByIndex ? firstByIndex : elements.find(function(element) {
3531
- return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
3532
  });
3533
  },
3534
 
3535
  focusFirstElement: function(form) {
3536
  form = $(form);
3537
- form.findFirstElement().activate();
 
3538
  return form;
3539
  },
3540
 
@@ -3559,6 +5090,7 @@ Form.Methods = {
3559
 
3560
  /*--------------------------------------------------------------------------*/
3561
 
 
3562
  Form.Element = {
3563
  focus: function(element) {
3564
  $(element).focus();
@@ -3572,6 +5104,7 @@ Form.Element = {
3572
  };
3573
 
3574
  Form.Element.Methods = {
 
3575
  serialize: function(element) {
3576
  element = $(element);
3577
  if (!element.disabled && element.name) {
@@ -3612,7 +5145,7 @@ Form.Element.Methods = {
3612
  try {
3613
  element.focus();
3614
  if (element.select && (element.tagName.toLowerCase() != 'input' ||
3615
- !['button', 'reset', 'submit'].include(element.type)))
3616
  element.select();
3617
  } catch (e) { }
3618
  return element;
@@ -3634,75 +5167,86 @@ Form.Element.Methods = {
3634
  /*--------------------------------------------------------------------------*/
3635
 
3636
  var Field = Form.Element;
 
3637
  var $F = Form.Element.Methods.getValue;
3638
 
3639
  /*--------------------------------------------------------------------------*/
3640
 
3641
- Form.Element.Serializers = {
3642
- input: function(element, value) {
3643
  switch (element.type.toLowerCase()) {
3644
  case 'checkbox':
3645
  case 'radio':
3646
- return Form.Element.Serializers.inputSelector(element, value);
3647
  default:
3648
- return Form.Element.Serializers.textarea(element, value);
3649
  }
3650
- },
3651
 
3652
- inputSelector: function(element, value) {
3653
- if (Object.isUndefined(value)) return element.checked ? element.value : null;
 
3654
  else element.checked = !!value;
3655
- },
3656
 
3657
- textarea: function(element, value) {
3658
  if (Object.isUndefined(value)) return element.value;
3659
  else element.value = value;
3660
- },
3661
 
3662
- select: function(element, value) {
3663
  if (Object.isUndefined(value))
3664
- return this[element.type == 'select-one' ?
3665
- 'selectOne' : 'selectMany'](element);
3666
- else {
3667
- var opt, currentValue, single = !Object.isArray(value);
3668
- for (var i = 0, length = element.length; i < length; i++) {
3669
- opt = element.options[i];
3670
- currentValue = this.optionValue(opt);
3671
- if (single) {
3672
- if (currentValue == value) {
3673
- opt.selected = true;
3674
- return;
3675
- }
3676
  }
3677
- else opt.selected = value.include(currentValue);
3678
  }
 
3679
  }
3680
- },
3681
 
3682
- selectOne: function(element) {
3683
  var index = element.selectedIndex;
3684
- return index >= 0 ? this.optionValue(element.options[index]) : null;
3685
- },
3686
 
3687
- selectMany: function(element) {
3688
  var values, length = element.length;
3689
  if (!length) return null;
3690
 
3691
  for (var i = 0, values = []; i < length; i++) {
3692
  var opt = element.options[i];
3693
- if (opt.selected) values.push(this.optionValue(opt));
3694
  }
3695
  return values;
3696
- },
3697
 
3698
- optionValue: function(opt) {
3699
- // extend element because hasAttribute may not be native
3700
- return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
3701
  }
3702
- };
 
 
 
 
 
 
 
 
 
 
 
3703
 
3704
  /*--------------------------------------------------------------------------*/
3705
 
 
3706
  Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
3707
  initialize: function($super, element, frequency, callback) {
3708
  $super(callback, frequency);
@@ -3784,360 +5328,527 @@ Form.EventObserver = Class.create(Abstract.EventObserver, {
3784
  return Form.serialize(this.element);
3785
  }
3786
  });
3787
- if (!window.Event) var Event = { };
3788
-
3789
- Object.extend(Event, {
3790
- KEY_BACKSPACE: 8,
3791
- KEY_TAB: 9,
3792
- KEY_RETURN: 13,
3793
- KEY_ESC: 27,
3794
- KEY_LEFT: 37,
3795
- KEY_UP: 38,
3796
- KEY_RIGHT: 39,
3797
- KEY_DOWN: 40,
3798
- KEY_DELETE: 46,
3799
- KEY_HOME: 36,
3800
- KEY_END: 35,
3801
- KEY_PAGEUP: 33,
3802
- KEY_PAGEDOWN: 34,
3803
- KEY_INSERT: 45,
3804
-
3805
- cache: { },
3806
-
3807
- relatedTarget: function(event) {
3808
- var element;
3809
- switch(event.type) {
3810
- case 'mouseover': element = event.fromElement; break;
3811
- case 'mouseout': element = event.toElement; break;
3812
- default: return null;
3813
- }
3814
- return Element.extend(element);
 
 
 
 
 
 
 
 
 
3815
  }
3816
- });
3817
 
3818
- Event.Methods = (function() {
3819
- var isButton;
3820
 
3821
- if (Prototype.Browser.IE) {
3822
- var buttonMap = { 0: 1, 1: 4, 2: 2 };
3823
- isButton = function(event, code) {
3824
- return event.button == buttonMap[code];
3825
- };
3826
 
3827
- } else if (Prototype.Browser.WebKit) {
3828
- isButton = function(event, code) {
3829
- switch (code) {
3830
- case 0: return event.which == 1 && !event.metaKey;
3831
- case 1: return event.which == 1 && event.metaKey;
3832
- default: return false;
3833
- }
3834
- };
3835
 
3836
- } else {
3837
- isButton = function(event, code) {
3838
- return event.which ? (event.which === code + 1) : (event.button === code);
3839
- };
 
 
 
3840
  }
3841
 
3842
- return {
3843
- isLeftClick: function(event) { return isButton(event, 0) },
3844
- isMiddleClick: function(event) { return isButton(event, 1) },
3845
- isRightClick: function(event) { return isButton(event, 2) },
3846
-
3847
- element: function(event) {
3848
- event = Event.extend(event);
3849
-
3850
- var node = event.target,
3851
- type = event.type,
3852
- currentTarget = event.currentTarget;
3853
-
3854
- if (currentTarget && currentTarget.tagName) {
3855
- // Firefox screws up the "click" event when moving between radio buttons
3856
- // via arrow keys. It also screws up the "load" and "error" events on images,
3857
- // reporting the document as the target instead of the original image.
3858
- if (type === 'load' || type === 'error' ||
3859
- (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
3860
- && currentTarget.type === 'radio'))
3861
- node = currentTarget;
3862
  }
3863
- if (node) {
3864
- if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
3865
- return Element.extend(node);
3866
- } else return false;
3867
- },
 
3868
 
3869
- findElement: function(event, expression) {
3870
- var element = Event.element(event);
3871
- if (!expression) return element;
3872
- var elements = [element].concat(element.ancestors());
3873
- return Selector.findElement(elements, expression, 0);
3874
- },
3875
 
3876
- pointer: function(event) {
3877
- var docElement = document.documentElement,
3878
- body = document.body || { scrollLeft: 0, scrollTop: 0 };
3879
- return {
3880
- x: event.pageX || (event.clientX +
3881
- (docElement.scrollLeft || body.scrollLeft) -
3882
- (docElement.clientLeft || 0)),
3883
- y: event.pageY || (event.clientY +
3884
- (docElement.scrollTop || body.scrollTop) -
3885
- (docElement.clientTop || 0))
3886
- };
3887
- },
 
 
 
 
 
 
 
 
 
 
3888
 
3889
- pointerX: function(event) { return Event.pointer(event).x },
3890
- pointerY: function(event) { return Event.pointer(event).y },
3891
 
3892
- stop: function(event) {
3893
- Event.extend(event);
3894
- event.preventDefault();
3895
- event.stopPropagation();
3896
- event.stopped = true;
 
3897
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3898
  };
3899
- })();
3900
 
3901
- Event.extend = (function() {
3902
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
3903
  m[name] = Event.Methods[name].methodize();
3904
  return m;
3905
  });
3906
 
3907
- if (Prototype.Browser.IE) {
3908
- Object.extend(methods, {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3909
  stopPropagation: function() { this.cancelBubble = true },
3910
  preventDefault: function() { this.returnValue = false },
3911
- inspect: function() { return "[object Event]" }
3912
- });
3913
 
3914
- return function(event) {
3915
  if (!event) return false;
3916
- if (event._extendedByPrototype) return event;
3917
 
 
 
 
3918
  event._extendedByPrototype = Prototype.emptyFunction;
 
3919
  var pointer = Event.pointer(event);
 
3920
  Object.extend(event, {
3921
- target: event.srcElement,
3922
- relatedTarget: Event.relatedTarget(event),
3923
  pageX: pointer.x,
3924
  pageY: pointer.y
3925
  });
3926
- return Object.extend(event, methods);
3927
- };
3928
 
 
 
 
 
 
3929
  } else {
3930
- Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
 
 
 
 
3931
  Object.extend(Event.prototype, methods);
3932
- return Prototype.K;
3933
  }
3934
- })();
3935
 
3936
- Object.extend(Event, (function() {
3937
- var cache = Event.cache;
3938
 
3939
- function getEventID(element) {
3940
- try {
3941
- if (element._prototypeEventID) return element._prototypeEventID[0];
3942
- arguments.callee.id = arguments.callee.id || 1;
3943
- return element._prototypeEventID = [++arguments.callee.id];
3944
- } catch (error) {
3945
- return false;
3946
  }
3947
- }
3948
 
3949
- function getDOMEventName(eventName) {
3950
- if (eventName && eventName.include(':')) return "dataavailable";
3951
- return eventName;
3952
- }
3953
-
3954
- function getCacheForID(id) {
3955
- return cache[id] = cache[id] || { };
3956
- }
3957
 
3958
- function getWrappersForEventName(id, eventName) {
3959
- var c = getCacheForID(id);
3960
- return c[eventName] = c[eventName] || [];
3961
- }
3962
 
3963
- function createWrapper(element, eventName, handler) {
3964
- var id = getEventID(element);
3965
- var c = getWrappersForEventName(id, eventName);
3966
- if (c.pluck("handler").include(handler)) return false;
 
3967
 
3968
- var wrapper = function(event) {
3969
- if (!Event || !Event.extend ||
3970
- (event.eventName && event.eventName != eventName))
3971
  return false;
3972
 
3973
- Event.extend(event);
3974
- handler.call(element, event);
3975
- };
 
 
 
 
 
 
 
 
 
 
 
 
3976
 
3977
- wrapper.handler = handler;
3978
- c.push(wrapper);
3979
- return wrapper;
3980
- }
3981
 
3982
- function findWrapper(id, eventName, handler) {
3983
- var c = getWrappersForEventName(id, eventName);
3984
- return c.find(function(wrapper) { return wrapper.handler == handler });
3985
- }
 
 
 
 
 
 
3986
 
3987
- function destroyWrapper(id, eventName, handler) {
3988
- var c = getCacheForID(id);
3989
- if (!c[eventName]) return false;
3990
- c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
3991
  }
3992
 
3993
- function destroyCache() {
3994
- for (var id in cache)
3995
- for (var eventName in cache[id])
3996
- cache[id][eventName] = null;
 
3997
  }
3998
 
 
3999
 
4000
- // Internet Explorer needs to remove event handlers on page unload
4001
- // in order to avoid memory leaks.
4002
- if (window.attachEvent) {
4003
- window.attachEvent("onunload", destroyCache);
4004
- }
4005
 
4006
- // Safari has a dummy event handler on page unload so that it won't
4007
- // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
4008
- // object when page is returned to via the back button using its bfcache.
4009
- if (Prototype.Browser.WebKit) {
4010
  window.addEventListener('unload', Prototype.emptyFunction, false);
 
 
 
 
 
 
 
 
 
4011
  }
4012
 
4013
- return {
4014
- observe: function(element, eventName, handler) {
4015
- element = $(element);
4016
- var name = getDOMEventName(eventName);
4017
 
4018
- var wrapper = createWrapper(element, eventName, handler);
4019
- if (!wrapper) return element;
4020
 
4021
- if (element.addEventListener) {
4022
- element.addEventListener(name, wrapper, false);
4023
- } else {
4024
- element.attachEvent("on" + name, wrapper);
 
 
 
 
4025
  }
 
 
 
 
 
 
 
 
 
 
 
4026
 
 
 
 
 
 
 
 
 
 
 
 
4027
  return element;
4028
- },
4029
 
4030
- stopObserving: function(element, eventName, handler) {
4031
- element = $(element);
4032
- var id = getEventID(element), name = getDOMEventName(eventName);
4033
 
4034
- if (!handler && eventName) {
4035
- getWrappersForEventName(id, eventName).each(function(wrapper) {
4036
- element.stopObserving(eventName, wrapper.handler);
4037
- });
4038
- return element;
 
4039
 
4040
- } else if (!eventName) {
4041
- Object.keys(getCacheForID(id)).each(function(eventName) {
4042
- element.stopObserving(eventName);
4043
- });
4044
- return element;
 
 
 
 
 
 
 
 
 
 
4045
  }
 
 
 
 
 
 
 
4046
 
4047
- var wrapper = findWrapper(id, eventName, handler);
4048
- if (!wrapper) return element;
4049
 
4050
- if (element.removeEventListener) {
4051
- element.removeEventListener(name, wrapper, false);
4052
- } else {
4053
- element.detachEvent("on" + name, wrapper);
4054
- }
4055
 
4056
- destroyWrapper(id, eventName, handler);
 
4057
 
4058
- return element;
4059
- },
4060
 
4061
- fire: function(element, eventName, memo) {
4062
- element = $(element);
4063
- if (element == document && document.createEvent && !element.dispatchEvent)
4064
- element = document.documentElement;
4065
 
4066
- var event;
4067
- if (document.createEvent) {
4068
- event = document.createEvent("HTMLEvents");
4069
- event.initEvent("dataavailable", true, true);
4070
- } else {
4071
- event = document.createEventObject();
4072
- event.eventType = "ondataavailable";
4073
- }
4074
 
4075
- event.eventName = eventName;
4076
- event.memo = memo || { };
4077
 
4078
- if (document.createEvent) {
4079
- element.dispatchEvent(event);
4080
- } else {
4081
- element.fireEvent(event.eventType, event);
4082
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4083
 
4084
- return Event.extend(event);
 
 
4085
  }
4086
- };
4087
- })());
4088
 
4089
- Object.extend(Event, Event.Methods);
 
 
 
 
4090
 
4091
- Element.addMethods({
4092
- fire: Event.fire,
4093
- observe: Event.observe,
4094
- stopObserving: Event.stopObserving
4095
- });
4096
 
4097
- Object.extend(document, {
4098
- fire: Element.Methods.fire.methodize(),
4099
- observe: Element.Methods.observe.methodize(),
4100
- stopObserving: Element.Methods.stopObserving.methodize(),
4101
- loaded: false
4102
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4103
 
4104
  (function() {
4105
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
4106
- Matthias Miller, Dean Edwards and John Resig. */
4107
 
4108
  var timer;
4109
 
4110
  function fireContentLoadedEvent() {
4111
  if (document.loaded) return;
4112
- if (timer) window.clearInterval(timer);
4113
- document.fire("dom:loaded");
4114
  document.loaded = true;
 
4115
  }
4116
 
4117
- if (document.addEventListener) {
4118
- if (Prototype.Browser.WebKit) {
4119
- timer = window.setInterval(function() {
4120
- if (/loaded|complete/.test(document.readyState))
4121
- fireContentLoadedEvent();
4122
- }, 0);
4123
-
4124
- Event.observe(window, "load", fireContentLoadedEvent);
4125
 
4126
- } else {
4127
- document.addEventListener("DOMContentLoaded",
4128
- fireContentLoadedEvent, false);
 
 
4129
  }
 
 
4130
 
 
 
4131
  } else {
4132
- document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
4133
- $("__onDOMContentLoaded").onreadystatechange = function() {
4134
- if (this.readyState == "complete") {
4135
- this.onreadystatechange = null;
4136
- fireContentLoadedEvent();
4137
- }
4138
- };
4139
  }
 
 
4140
  })();
 
 
 
4141
  /*------------------------------- DEPRECATED -------------------------------*/
4142
 
4143
  Hash.toQueryString = Object.toQueryString;
@@ -4166,16 +5877,9 @@ var Insertion = {
4166
 
4167
  var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
4168
 
4169
- // This should be moved to script.aculo.us; notice the deprecated methods
4170
- // further below, that map to the newer Element methods.
4171
  var Position = {
4172
- // set to true if needed, warning: firefox performance problems
4173
- // NOT neeeded for page scrolling, only if draggable contained in
4174
- // scrollable elements
4175
  includeScrollOffsets: false,
4176
 
4177
- // must be called before calling withinIncludingScrolloffset, every time the
4178
- // page is scrolled
4179
  prepare: function() {
4180
  this.deltaX = window.pageXOffset
4181
  || document.documentElement.scrollLeft
@@ -4187,7 +5891,6 @@ var Position = {
4187
  || 0;
4188
  },
4189
 
4190
- // caches x/y coordinate pair to use with overlap
4191
  within: function(element, x, y) {
4192
  if (this.includeScrollOffsets)
4193
  return this.withinIncludingScrolloffsets(element, x, y);
@@ -4214,7 +5917,6 @@ var Position = {
4214
  this.xcomp < this.offset[0] + element.offsetWidth);
4215
  },
4216
 
4217
- // within must be called directly before
4218
  overlap: function(mode, element) {
4219
  if (!mode) return 0;
4220
  if (mode == 'vertical')
@@ -4225,7 +5927,6 @@ var Position = {
4225
  element.offsetWidth;
4226
  },
4227
 
4228
- // Deprecation layer -- use newer Element methods now (1.5.2).
4229
 
4230
  cumulativeOffset: Element.Methods.cumulativeOffset,
4231
 
@@ -4325,4 +6026,57 @@ Object.extend(Element.ClassNames.prototype, Enumerable);
4325
 
4326
  /*--------------------------------------------------------------------------*/
4327
 
4328
- Element.addMethods();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Prototype JavaScript framework, version 1.7
2
+ * (c) 2005-2010 Sam Stephenson
3
  *
4
  * Prototype is freely distributable under the terms of an MIT-style license.
5
  * For details, see the Prototype web site: http://www.prototypejs.org/
7
  *--------------------------------------------------------------------------*/
8
 
9
  var Prototype = {
10
+
11
+ Version: '1.7',
12
+
13
+ Browser: (function(){
14
+ var ua = navigator.userAgent;
15
+ var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
16
+ return {
17
+ IE: !!window.attachEvent && !isOpera,
18
+ Opera: isOpera,
19
+ WebKit: ua.indexOf('AppleWebKit/') > -1,
20
+ Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
21
+ MobileSafari: /Apple.*Mobile/.test(ua)
22
+ }
23
+ })(),
24
 
25
  BrowserFeatures: {
26
  XPath: !!document.evaluate,
27
+
28
  SelectorsAPI: !!document.querySelector,
29
+
30
+ ElementExtensions: (function() {
31
+ var constructor = window.Element || window.HTMLElement;
32
+ return !!(constructor && constructor.prototype);
33
+ })(),
34
+ SpecificElementExtensions: (function() {
35
+ if (typeof window.HTMLDivElement !== 'undefined')
36
+ return true;
37
+
38
+ var div = document.createElement('div'),
39
+ form = document.createElement('form'),
40
+ isSupported = false;
41
+
42
+ if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
43
+ isSupported = true;
44
+ }
45
+
46
+ div = form = null;
47
+
48
+ return isSupported;
49
+ })()
50
  },
51
 
52
  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
53
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
54
 
55
  emptyFunction: function() { },
56
+
57
  K: function(x) { return x }
58
  };
59
 
61
  Prototype.BrowserFeatures.SpecificElementExtensions = false;
62
 
63
 
64
+ var Abstract = { };
65
+
66
+
67
+ var Try = {
68
+ these: function() {
69
+ var returnValue;
70
+
71
+ for (var i = 0, length = arguments.length; i < length; i++) {
72
+ var lambda = arguments[i];
73
+ try {
74
+ returnValue = lambda();
75
+ break;
76
+ } catch (e) { }
77
+ }
78
+
79
+ return returnValue;
80
+ }
81
+ };
82
+
83
  /* Based on Alex Arnell's inheritance implementation. */
84
+
85
+ var Class = (function() {
86
+
87
+ var IS_DONTENUM_BUGGY = (function(){
88
+ for (var p in { toString: 1 }) {
89
+ if (p === 'toString') return false;
90
+ }
91
+ return true;
92
+ })();
93
+
94
+ function subclass() {};
95
+ function create() {
96
  var parent = null, properties = $A(arguments);
97
  if (Object.isFunction(properties[0]))
98
  parent = properties.shift();
106
  klass.subclasses = [];
107
 
108
  if (parent) {
 
109
  subclass.prototype = parent.prototype;
110
  klass.prototype = new subclass;
111
  parent.subclasses.push(klass);
112
  }
113
 
114
+ for (var i = 0, length = properties.length; i < length; i++)
115
  klass.addMethods(properties[i]);
116
 
117
  if (!klass.prototype.initialize)
118
  klass.prototype.initialize = Prototype.emptyFunction;
119
 
120
  klass.prototype.constructor = klass;
 
121
  return klass;
122
  }
 
123
 
124
+ function addMethods(source) {
125
+ var ancestor = this.superclass && this.superclass.prototype,
126
+ properties = Object.keys(source);
 
127
 
128
+ if (IS_DONTENUM_BUGGY) {
129
+ if (source.toString != Object.prototype.toString)
130
+ properties.push("toString");
131
+ if (source.valueOf != Object.prototype.valueOf)
132
+ properties.push("valueOf");
133
+ }
134
 
135
  for (var i = 0, length = properties.length; i < length; i++) {
136
  var property = properties[i], value = source[property];
137
  if (ancestor && Object.isFunction(value) &&
138
+ value.argumentNames()[0] == "$super") {
139
  var method = value;
140
  value = (function(m) {
141
+ return function() { return ancestor[m].apply(this, arguments); };
142
  })(property).wrap(method);
143
 
144
  value.valueOf = method.valueOf.bind(method);
149
 
150
  return this;
151
  }
 
152
 
153
+ return {
154
+ create: create,
155
+ Methods: {
156
+ addMethods: addMethods
157
+ }
158
+ };
159
+ })();
160
+ (function() {
161
 
162
+ var _toString = Object.prototype.toString,
163
+ NULL_TYPE = 'Null',
164
+ UNDEFINED_TYPE = 'Undefined',
165
+ BOOLEAN_TYPE = 'Boolean',
166
+ NUMBER_TYPE = 'Number',
167
+ STRING_TYPE = 'String',
168
+ OBJECT_TYPE = 'Object',
169
+ FUNCTION_CLASS = '[object Function]',
170
+ BOOLEAN_CLASS = '[object Boolean]',
171
+ NUMBER_CLASS = '[object Number]',
172
+ STRING_CLASS = '[object String]',
173
+ ARRAY_CLASS = '[object Array]',
174
+ DATE_CLASS = '[object Date]',
175
+ NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON &&
176
+ typeof JSON.stringify === 'function' &&
177
+ JSON.stringify(0) === '0' &&
178
+ typeof JSON.stringify(Prototype.K) === 'undefined';
179
+
180
+ function Type(o) {
181
+ switch(o) {
182
+ case null: return NULL_TYPE;
183
+ case (void 0): return UNDEFINED_TYPE;
184
+ }
185
+ var type = typeof o;
186
+ switch(type) {
187
+ case 'boolean': return BOOLEAN_TYPE;
188
+ case 'number': return NUMBER_TYPE;
189
+ case 'string': return STRING_TYPE;
190
+ }
191
+ return OBJECT_TYPE;
192
+ }
193
+
194
+ function extend(destination, source) {
195
+ for (var property in source)
196
+ destination[property] = source[property];
197
+ return destination;
198
+ }
199
 
200
+ function inspect(object) {
 
201
  try {
202
+ if (isUndefined(object)) return 'undefined';
203
  if (object === null) return 'null';
204
  return object.inspect ? object.inspect() : String(object);
205
  } catch (e) {
206
  if (e instanceof RangeError) return '...';
207
  throw e;
208
  }
209
+ }
210
 
211
+ function toJSON(value) {
212
+ return Str('', { '': value }, []);
213
+ }
214
+
215
+ function Str(key, holder, stack) {
216
+ var value = holder[key],
217
+ type = typeof value;
218
+
219
+ if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') {
220
+ value = value.toJSON(key);
221
  }
222
 
223
+ var _class = _toString.call(value);
 
 
224
 
225
+ switch (_class) {
226
+ case NUMBER_CLASS:
227
+ case BOOLEAN_CLASS:
228
+ case STRING_CLASS:
229
+ value = value.valueOf();
230
  }
231
 
232
+ switch (value) {
233
+ case null: return 'null';
234
+ case true: return 'true';
235
+ case false: return 'false';
236
+ }
237
+
238
+ type = typeof value;
239
+ switch (type) {
240
+ case 'string':
241
+ return value.inspect(true);
242
+ case 'number':
243
+ return isFinite(value) ? String(value) : 'null';
244
+ case 'object':
245
+
246
+ for (var i = 0, length = stack.length; i < length; i++) {
247
+ if (stack[i] === value) { throw new TypeError(); }
248
+ }
249
+ stack.push(value);
250
 
251
+ var partial = [];
252
+ if (_class === ARRAY_CLASS) {
253
+ for (var i = 0, length = value.length; i < length; i++) {
254
+ var str = Str(i, value, stack);
255
+ partial.push(typeof str === 'undefined' ? 'null' : str);
256
+ }
257
+ partial = '[' + partial.join(',') + ']';
258
+ } else {
259
+ var keys = Object.keys(value);
260
+ for (var i = 0, length = keys.length; i < length; i++) {
261
+ var key = keys[i], str = Str(key, value, stack);
262
+ if (typeof str !== "undefined") {
263
+ partial.push(key.inspect(true)+ ':' + str);
264
+ }
265
+ }
266
+ partial = '{' + partial.join(',') + '}';
267
+ }
268
+ stack.pop();
269
+ return partial;
270
+ }
271
+ }
272
+
273
+ function stringify(object) {
274
+ return JSON.stringify(object);
275
+ }
276
+
277
+ function toQueryString(object) {
278
  return $H(object).toQueryString();
279
+ }
280
 
281
+ function toHTML(object) {
282
  return object && object.toHTML ? object.toHTML() : String.interpret(object);
283
+ }
284
 
285
+ function keys(object) {
286
+ if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }
287
+ var results = [];
288
+ for (var property in object) {
289
+ if (object.hasOwnProperty(property)) {
290
+ results.push(property);
291
+ }
292
+ }
293
+ return results;
294
+ }
295
 
296
+ function values(object) {
297
+ var results = [];
298
  for (var property in object)
299
+ results.push(object[property]);
300
+ return results;
301
+ }
302
 
303
+ function clone(object) {
304
+ return extend({ }, object);
305
+ }
306
 
307
+ function isElement(object) {
308
  return !!(object && object.nodeType == 1);
309
+ }
310
 
311
+ function isArray(object) {
312
+ return _toString.call(object) === ARRAY_CLASS;
313
+ }
314
+
315
+ var hasNativeIsArray = (typeof Array.isArray == 'function')
316
+ && Array.isArray([]) && !Array.isArray({});
317
 
318
+ if (hasNativeIsArray) {
319
+ isArray = Array.isArray;
320
+ }
321
+
322
+ function isHash(object) {
323
  return object instanceof Hash;
324
+ }
325
 
326
+ function isFunction(object) {
327
+ return _toString.call(object) === FUNCTION_CLASS;
328
+ }
329
 
330
+ function isString(object) {
331
+ return _toString.call(object) === STRING_CLASS;
332
+ }
333
 
334
+ function isNumber(object) {
335
+ return _toString.call(object) === NUMBER_CLASS;
336
+ }
337
 
338
+ function isDate(object) {
339
+ return _toString.call(object) === DATE_CLASS;
340
  }
 
341
 
342
+ function isUndefined(object) {
343
+ return typeof object === "undefined";
344
+ }
345
+
346
+ extend(Object, {
347
+ extend: extend,
348
+ inspect: inspect,
349
+ toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,
350
+ toQueryString: toQueryString,
351
+ toHTML: toHTML,
352
+ keys: Object.keys || keys,
353
+ values: values,
354
+ clone: clone,
355
+ isElement: isElement,
356
+ isArray: isArray,
357
+ isHash: isHash,
358
+ isFunction: isFunction,
359
+ isString: isString,
360
+ isNumber: isNumber,
361
+ isDate: isDate,
362
+ isUndefined: isUndefined
363
+ });
364
+ })();
365
+ Object.extend(Function.prototype, (function() {
366
+ var slice = Array.prototype.slice;
367
+
368
+ function update(array, args) {
369
+ var arrayLength = array.length, length = args.length;
370
+ while (length--) array[arrayLength + length] = args[length];
371
+ return array;
372
+ }
373
+
374
+ function merge(array, args) {
375
+ array = slice.call(array, 0);
376
+ return update(array, args);
377
+ }
378
+
379
+ function argumentNames() {
380
+ var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
381
+ .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
382
  .replace(/\s+/g, '').split(',');
383
  return names.length == 1 && !names[0] ? [] : names;
384
+ }
385
 
386
+ function bind(context) {
387
  if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
388
+ var __method = this, args = slice.call(arguments, 1);
389
  return function() {
390
+ var a = merge(args, arguments);
391
+ return __method.apply(context, a);
392
  }
393
+ }
394
 
395
+ function bindAsEventListener(context) {
396
+ var __method = this, args = slice.call(arguments, 1);
397
  return function(event) {
398
+ var a = update([event || window.event], args);
399
+ return __method.apply(context, a);
400
  }
401
+ }
402
 
403
+ function curry() {
404
  if (!arguments.length) return this;
405
+ var __method = this, args = slice.call(arguments, 0);
406
  return function() {
407
+ var a = merge(args, arguments);
408
+ return __method.apply(this, a);
409
  }
410
+ }
411
 
412
+ function delay(timeout) {
413
+ var __method = this, args = slice.call(arguments, 1);
414
+ timeout = timeout * 1000;
415
  return window.setTimeout(function() {
416
  return __method.apply(__method, args);
417
  }, timeout);
418
+ }
419
 
420
+ function defer() {
421
+ var args = update([0.01], arguments);
422
  return this.delay.apply(this, args);
423
+ }
424
 
425
+ function wrap(wrapper) {
426
  var __method = this;
427
  return function() {
428
+ var a = update([__method.bind(this)], arguments);
429
+ return wrapper.apply(this, a);
430
  }
431
+ }
432
 
433
+ function methodize() {
434
  if (this._methodized) return this._methodized;
435
  var __method = this;
436
  return this._methodized = function() {
437
+ var a = update([this], arguments);
438
+ return __method.apply(null, a);
439
  };
440
  }
 
441
 
442
+ return {
443
+ argumentNames: argumentNames,
444
+ bind: bind,
445
+ bindAsEventListener: bindAsEventListener,
446
+ curry: curry,
447
+ delay: delay,
448
+ defer: defer,
449
+ wrap: wrap,
450
+ methodize: methodize
451
+ }
452
+ })());
453
 
 
 
 
454
 
 
 
 
 
 
 
 
455
 
456
+ (function(proto) {
457
+
458
+
459
+ function toISOString() {
460
+ return this.getUTCFullYear() + '-' +
461
+ (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
462
+ this.getUTCDate().toPaddedString(2) + 'T' +
463
+ this.getUTCHours().toPaddedString(2) + ':' +
464
+ this.getUTCMinutes().toPaddedString(2) + ':' +
465
+ this.getUTCSeconds().toPaddedString(2) + 'Z';
466
  }
467
+
468
+
469
+ function toJSON() {
470
+ return this.toISOString();
471
+ }
472
+
473
+ if (!proto.toISOString) proto.toISOString = toISOString;
474
+ if (!proto.toJSON) proto.toJSON = toJSON;
475
+
476
+ })(Date.prototype);
477
+
478
 
479
  RegExp.prototype.match = RegExp.prototype.test;
480
 
481
  RegExp.escape = function(str) {
482
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
483
  };
 
 
 
484
  var PeriodicalExecuter = Class.create({
485
  initialize: function(callback, frequency) {
486
  this.callback = callback;
509
  try {
510
  this.currentlyExecuting = true;
511
  this.execute();
 
512
  this.currentlyExecuting = false;
513
+ } catch(e) {
514
+ this.currentlyExecuting = false;
515
+ throw e;
516
  }
517
  }
518
  }
531
  }
532
  });
533
 
534
+ Object.extend(String.prototype, (function() {
535
+ var NATIVE_JSON_PARSE_SUPPORT = window.JSON &&
536
+ typeof JSON.parse === 'function' &&
537
+ JSON.parse('{"test": true}').test;
538
+
539
+ function prepareReplacement(replacement) {
540
+ if (Object.isFunction(replacement)) return replacement;
541
+ var template = new Template(replacement);
542
+ return function(match) { return template.evaluate(match) };
543
+ }
544
+
545
+ function gsub(pattern, replacement) {
546
  var result = '', source = this, match;
547
+ replacement = prepareReplacement(replacement);
548
+
549
+ if (Object.isString(pattern))
550
+ pattern = RegExp.escape(pattern);
551
+
552
+ if (!(pattern.length || pattern.source)) {
553
+ replacement = replacement('');
554
+ return replacement + source.split('').join(replacement) + replacement;
555
+ }
556
 
557
  while (source.length > 0) {
558
  if (match = source.match(pattern)) {
564
  }
565
  }
566
  return result;
567
+ }
568
 
569
+ function sub(pattern, replacement, count) {
570
+ replacement = prepareReplacement(replacement);
571
  count = Object.isUndefined(count) ? 1 : count;
572
 
573
  return this.gsub(pattern, function(match) {
574
  if (--count < 0) return match[0];
575
  return replacement(match);
576
  });
577
+ }
578
 
579
+ function scan(pattern, iterator) {
580
  this.gsub(pattern, iterator);
581
  return String(this);
582
+ }
583
 
584
+ function truncate(length, truncation) {
585
  length = length || 30;
586
  truncation = Object.isUndefined(truncation) ? '...' : truncation;
587
  return this.length > length ?
588
  this.slice(0, length - truncation.length) + truncation : String(this);
589
+ }
590
 
591
+ function strip() {
592
  return this.replace(/^\s+/, '').replace(/\s+$/, '');
593
+ }
594
 
595
+ function stripTags() {
596
+ return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
597
+ }
598
 
599
+ function stripScripts() {
600
  return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
601
+ }
602
 
603
+ function extractScripts() {
604
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img'),
605
+ matchOne = new RegExp(Prototype.ScriptFragment, 'im');
606
  return (this.match(matchAll) || []).map(function(scriptTag) {
607
  return (scriptTag.match(matchOne) || ['', ''])[1];
608
  });
609
+ }
610
 
611
+ function evalScripts() {
612
  return this.extractScripts().map(function(script) { return eval(script) });
613
+ }
614
 
615
+ function escapeHTML() {
616
+ return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
617
+ }
618
+
619
+ function unescapeHTML() {
620
+ return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
621
+ }
622
 
 
 
 
 
 
 
 
623
 
624
+ function toQueryParams(separator) {
625
  var match = this.strip().match(/([^?#]*)(#.*)?$/);
626
  if (!match) return { };
627
 
628
  return match[1].split(separator || '&').inject({ }, function(hash, pair) {
629
  if ((pair = pair.split('='))[0]) {
630
+ var key = decodeURIComponent(pair.shift()),
631
+ value = pair.length > 1 ? pair.join('=') : pair[0];
632
+
633
  if (value != undefined) value = decodeURIComponent(value);
634
 
635
  if (key in hash) {
640
  }
641
  return hash;
642
  });
643
+ }
644
 
645
+ function toArray() {
646
  return this.split('');
647
+ }
648
 
649
+ function succ() {
650
  return this.slice(0, this.length - 1) +
651
  String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
652
+ }
653
 
654
+ function times(count) {
655
  return count < 1 ? '' : new Array(count + 1).join(this);
656
+ }
 
 
 
 
 
 
 
 
 
 
 
657
 
658
+ function camelize() {
659
+ return this.replace(/-+(.)?/g, function(match, chr) {
660
+ return chr ? chr.toUpperCase() : '';
661
+ });
662
+ }
663
 
664
+ function capitalize() {
665
  return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
666
+ }
667
 
668
+ function underscore() {
669
+ return this.replace(/::/g, '/')
670
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
671
+ .replace(/([a-z\d])([A-Z])/g, '$1_$2')
672
+ .replace(/-/g, '_')
673
+ .toLowerCase();
674
+ }
675
 
676
+ function dasherize() {
677
+ return this.replace(/_/g, '-');
678
+ }
679
 
680
+ function inspect(useDoubleQuotes) {
681
+ var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
682
+ if (character in String.specialChar) {
683
+ return String.specialChar[character];
684
+ }
685
+ return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
686
  });
687
  if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
688
  return "'" + escapedString.replace(/'/g, '\\\'') + "'";
689
+ }
 
 
 
 
690
 
691
+ function unfilterJSON(filter) {
692
+ return this.replace(filter || Prototype.JSONFilter, '$1');
693
+ }
694
 
695
+ function isJSON() {
696
  var str = this;
697
  if (str.blank()) return false;
698
+ str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
699
+ str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
700
+ str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
701
+ return (/^[\],:{}\s]*$/).test(str);
702
+ }
703
 
704
+ function evalJSON(sanitize) {
705
+ var json = this.unfilterJSON(),
706
+ cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
707
+ if (cx.test(json)) {
708
+ json = json.replace(cx, function (a) {
709
+ return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
710
+ });
711
+ }
712
  try {
713
  if (!sanitize || json.isJSON()) return eval('(' + json + ')');
714
  } catch (e) { }
715
  throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
716
+ }
717
+
718
+ function parseJSON() {
719
+ var json = this.unfilterJSON();
720
+ return JSON.parse(json);
721
+ }
722
 
723
+ function include(pattern) {
724
  return this.indexOf(pattern) > -1;
725
+ }
726
 
727
+ function startsWith(pattern) {
728
+ return this.lastIndexOf(pattern, 0) === 0;
729
+ }
730
 
731
+ function endsWith(pattern) {
732
  var d = this.length - pattern.length;
733
+ return d >= 0 && this.indexOf(pattern, d) === d;
734
+ }
735
 
736
+ function empty() {
737
  return this == '';
738
+ }
739
 
740
+ function blank() {
741
  return /^\s*$/.test(this);
 
 
 
 
742
  }
 
743
 
744
+ function interpolate(object, pattern) {
745
+ return new Template(this, pattern).evaluate(object);
 
 
 
 
746
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
747
 
748
+ return {
749
+ gsub: gsub,
750
+ sub: sub,
751
+ scan: scan,
752
+ truncate: truncate,
753
+ strip: String.prototype.trim || strip,
754
+ stripTags: stripTags,
755
+ stripScripts: stripScripts,
756
+ extractScripts: extractScripts,
757
+ evalScripts: evalScripts,
758
+ escapeHTML: escapeHTML,
759
+ unescapeHTML: unescapeHTML,
760
+ toQueryParams: toQueryParams,
761
+ parseQuery: toQueryParams,
762
+ toArray: toArray,
763
+ succ: succ,
764
+ times: times,
765
+ camelize: camelize,
766
+ capitalize: capitalize,
767
+ underscore: underscore,
768
+ dasherize: dasherize,
769
+ inspect: inspect,
770
+ unfilterJSON: unfilterJSON,
771
+ isJSON: isJSON,
772
+ evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,
773
+ include: include,
774
+ startsWith: startsWith,
775
+ endsWith: endsWith,
776
+ empty: empty,
777
+ blank: blank,
778
+ interpolate: interpolate
779
+ };
780
+ })());
781
 
782
  var Template = Class.create({
783
  initialize: function(template, pattern) {
786
  },
787
 
788
  evaluate: function(object) {
789
+ if (object && Object.isFunction(object.toTemplateReplacements))
790
  object = object.toTemplateReplacements();
791
 
792
  return this.template.gsub(this.pattern, function(match) {
793
+ if (object == null) return (match[1] + '');
794
 
795
  var before = match[1] || '';
796
  if (before == '\\') return match[2];
797
 
798
+ var ctx = object, expr = match[3],
799
+ pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
800
+
801
  match = pattern.exec(expr);
802
  if (match == null) return before;
803
 
804
  while (match != null) {
805
+ var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
806
  ctx = ctx[comp];
807
  if (null == ctx || '' == match[3]) break;
808
  expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
817
 
818
  var $break = { };
819
 
820
+ var Enumerable = (function() {
821
+ function each(iterator, context) {
822
  var index = 0;
823
  try {
824
  this._each(function(value) {
828
  if (e != $break) throw e;
829
  }
830
  return this;
831
+ }
832
 
833
+ function eachSlice(number, iterator, context) {
834
  var index = -number, slices = [], array = this.toArray();
835
  if (number < 1) return array;
836
  while ((index += number) < array.length)
837
  slices.push(array.slice(index, index+number));
838
  return slices.collect(iterator, context);
839
+ }
840
 
841
+ function all(iterator, context) {
842
  iterator = iterator || Prototype.K;
843
  var result = true;
844
  this.each(function(value, index) {
846
  if (!result) throw $break;
847
  });
848
  return result;
849
+ }
850
 
851
+ function any(iterator, context) {
852
  iterator = iterator || Prototype.K;
853
  var result = false;
854
  this.each(function(value, index) {
856
  throw $break;
857
  });
858
  return result;
859
+ }
860
 
861
+ function collect(iterator, context) {
862
  iterator = iterator || Prototype.K;
863
  var results = [];
864
  this.each(function(value, index) {
865
  results.push(iterator.call(context, value, index));
866
  });
867
  return results;
868
+ }
869
 
870
+ function detect(iterator, context) {
871
  var result;
872
  this.each(function(value, index) {
873
  if (iterator.call(context, value, index)) {
876
  }
877
  });
878
  return result;
879
+ }
880
 
881
+ function findAll(iterator, context) {
882
  var results = [];
883
  this.each(function(value, index) {
884
  if (iterator.call(context, value, index))
885
  results.push(value);
886
  });
887
  return results;
888
+ }
889
 
890
+ function grep(filter, iterator, context) {
891
  iterator = iterator || Prototype.K;
892
  var results = [];
893
 
894
  if (Object.isString(filter))
895
+ filter = new RegExp(RegExp.escape(filter));
896
 
897
  this.each(function(value, index) {
898
  if (filter.match(value))
899
  results.push(iterator.call(context, value, index));
900
  });
901
  return results;
902
+ }
903
 
904
+ function include(object) {
905
  if (Object.isFunction(this.indexOf))
906
  if (this.indexOf(object) != -1) return true;
907
 
913
  }
914
  });
915
  return found;
916
+ }
917
 
918
+ function inGroupsOf(number, fillWith) {
919
  fillWith = Object.isUndefined(fillWith) ? null : fillWith;
920
  return this.eachSlice(number, function(slice) {
921
  while(slice.length < number) slice.push(fillWith);
922
  return slice;
923
  });
924
+ }
925
 
926
+ function inject(memo, iterator, context) {
927
  this.each(function(value, index) {
928
  memo = iterator.call(context, memo, value, index);
929
  });
930
  return memo;
931
+ }
932
 
933
+ function invoke(method) {
934
  var args = $A(arguments).slice(1);
935
  return this.map(function(value) {
936
  return value[method].apply(value, args);
937
  });
938
+ }
939
 
940
+ function max(iterator, context) {
941
  iterator = iterator || Prototype.K;
942
  var result;
943
  this.each(function(value, index) {
946
  result = value;
947
  });
948
  return result;
949
+ }
950
 
951
+ function min(iterator, context) {
952
  iterator = iterator || Prototype.K;
953
  var result;
954
  this.each(function(value, index) {
957
  result = value;
958
  });
959
  return result;
960
+ }
961
 
962
+ function partition(iterator, context) {
963
  iterator = iterator || Prototype.K;
964
  var trues = [], falses = [];
965
  this.each(function(value, index) {
967
  trues : falses).push(value);
968
  });
969
  return [trues, falses];
970
+ }
971
 
972
+ function pluck(property) {
973
  var results = [];
974
  this.each(function(value) {
975
  results.push(value[property]);
976
  });
977
  return results;
978
+ }
979
 
980
+ function reject(iterator, context) {
981
  var results = [];
982
  this.each(function(value, index) {
983
  if (!iterator.call(context, value, index))
984
  results.push(value);
985
  });
986
  return results;
987
+ }
988
 
989
+ function sortBy(iterator, context) {
990
  return this.map(function(value, index) {
991
  return {
992
  value: value,
996
  var a = left.criteria, b = right.criteria;
997
  return a < b ? -1 : a > b ? 1 : 0;
998
  }).pluck('value');
999
+ }
1000
 
1001
+ function toArray() {
1002
  return this.map();
1003
+ }
1004
 
1005
+ function zip() {
1006
  var iterator = Prototype.K, args = $A(arguments);
1007
  if (Object.isFunction(args.last()))
1008
  iterator = args.pop();
1011
  return this.map(function(value, index) {
1012
  return iterator(collections.pluck(index));
1013
  });
1014
+ }
1015
 
1016
+ function size() {
1017
  return this.toArray().length;
1018
+ }
1019
 
1020
+ function inspect() {
1021
  return '#<Enumerable:' + this.toArray().inspect() + '>';
1022
  }
 
1023
 
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+
1032
+ return {
1033
+ each: each,
1034
+ eachSlice: eachSlice,
1035
+ all: all,
1036
+ every: all,
1037
+ any: any,
1038
+ some: any,
1039
+ collect: collect,
1040
+ map: collect,
1041
+ detect: detect,
1042
+ findAll: findAll,
1043
+ select: findAll,
1044
+ filter: findAll,
1045
+ grep: grep,
1046
+ include: include,
1047
+ member: include,
1048
+ inGroupsOf: inGroupsOf,
1049
+ inject: inject,
1050
+ invoke: invoke,
1051
+ max: max,
1052
+ min: min,
1053
+ partition: partition,
1054
+ pluck: pluck,
1055
+ reject: reject,
1056
+ sortBy: sortBy,
1057
+ toArray: toArray,
1058
+ entries: toArray,
1059
+ zip: zip,
1060
+ size: size,
1061
+ inspect: inspect,
1062
+ find: detect
1063
+ };
1064
+ })();
1065
+
1066
  function $A(iterable) {
1067
  if (!iterable) return [];
1068
+ if ('toArray' in Object(iterable)) return iterable.toArray();
1069
  var length = iterable.length || 0, results = new Array(length);
1070
  while (length--) results[length] = iterable[length];
1071
  return results;
1072
  }
1073
 
1074
+
1075
+ function $w(string) {
1076
+ if (!Object.isString(string)) return [];
1077
+ string = string.strip();
1078
+ return string ? string.split(/\s+/) : [];
 
 
 
 
 
 
 
 
1079
  }
1080
 
1081
  Array.from = $A;
1082
 
 
1083
 
1084
+ (function() {
1085
+ var arrayProto = Array.prototype,
1086
+ slice = arrayProto.slice,
1087
+ _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
1088
 
1089
+ function each(iterator, context) {
1090
+ for (var i = 0, length = this.length >>> 0; i < length; i++) {
1091
+ if (i in this) iterator.call(context, this[i], i, this);
1092
+ }
1093
+ }
1094
+ if (!_each) _each = each;
1095
 
1096
+ function clear() {
1097
  this.length = 0;
1098
  return this;
1099
+ }
1100
 
1101
+ function first() {
1102
  return this[0];
1103
+ }
1104
 
1105
+ function last() {
1106
  return this[this.length - 1];
1107
+ }
1108
 
1109
+ function compact() {
1110
  return this.select(function(value) {
1111
  return value != null;
1112
  });
1113
+ }
1114
 
1115
+ function flatten() {
1116
  return this.inject([], function(array, value) {
1117
+ if (Object.isArray(value))
1118
+ return array.concat(value.flatten());
1119
+ array.push(value);
1120
+ return array;
1121
  });
1122
+ }
1123
 
1124
+ function without() {
1125
+ var values = slice.call(arguments, 0);
1126
  return this.select(function(value) {
1127
  return !values.include(value);
1128
  });
1129
+ }
 
 
 
 
1130
 
1131
+ function reverse(inline) {
1132
+ return (inline === false ? this.toArray() : this)._reverse();
1133
+ }
1134
 
1135
+ function uniq(sorted) {
1136
  return this.inject([], function(array, value, index) {
1137
  if (0 == index || (sorted ? array.last() != value : !array.include(value)))
1138
  array.push(value);
1139
  return array;
1140
  });
1141
+ }
1142
 
1143
+ function intersect(array) {
1144
  return this.uniq().findAll(function(item) {
1145
  return array.detect(function(value) { return item === value });
1146
  });
1147
+ }
1148
 
 
 
 
1149
 
1150
+ function clone() {
1151
+ return slice.call(this, 0);
1152
+ }
1153
+
1154
+ function size() {
1155
  return this.length;
1156
+ }
1157
 
1158
+ function inspect() {
1159
  return '[' + this.map(Object.inspect).join(', ') + ']';
 
 
 
 
 
 
 
 
 
1160
  }
 
1161
 
1162
+ function indexOf(item, i) {
1163
+ i || (i = 0);
1164
+ var length = this.length;
1165
+ if (i < 0) i = length + i;
1166
+ for (; i < length; i++)
1167
+ if (this[i] === item) return i;
1168
+ return -1;
1169
+ }
 
 
 
 
 
 
 
 
 
 
 
 
1170
 
1171
+ function lastIndexOf(item, i) {
1172
+ i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
1173
+ var n = this.slice(0, i).reverse().indexOf(item);
1174
+ return (n < 0) ? n : i - n - 1;
1175
+ }
1176
 
1177
+ function concat() {
1178
+ var array = slice.call(this, 0), item;
 
 
1179
  for (var i = 0, length = arguments.length; i < length; i++) {
1180
+ item = arguments[i];
1181
+ if (Object.isArray(item) && !('callee' in item)) {
1182
+ for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
1183
+ array.push(item[j]);
1184
  } else {
1185
+ array.push(item);
1186
  }
1187
  }
1188
  return array;
1189
+ }
 
 
 
 
 
 
 
 
 
1190
 
1191
+ Object.extend(arrayProto, Enumerable);
1192
+
1193
+ if (!arrayProto._reverse)
1194
+ arrayProto._reverse = arrayProto.reverse;
1195
+
1196
+ Object.extend(arrayProto, {
1197
+ _each: _each,
1198
+ clear: clear,
1199
+ first: first,
1200
+ last: last,
1201
+ compact: compact,
1202
+ flatten: flatten,
1203
+ without: without,
1204
+ reverse: reverse,
1205
+ uniq: uniq,
1206
+ intersect: intersect,
1207
+ clone: clone,
1208
+ toArray: clone,
1209
+ size: size,
1210
+ inspect: inspect
1211
+ });
1212
 
1213
+ var CONCAT_ARGUMENTS_BUGGY = (function() {
1214
+ return [].concat(arguments)[0][0] !== 1;
1215
+ })(1,2)
 
1216
 
1217
+ if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
 
 
 
1218
 
1219
+ if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
1220
+ if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
1221
+ })();
1222
  function $H(object) {
1223
  return new Hash(object);
1224
  };
1225
 
1226
  var Hash = Class.create(Enumerable, (function() {
1227
+ function initialize(object) {
1228
+ this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
1229
+ }
1230
 
1231
+
1232
+ function _each(iterator) {
1233
+ for (var key in this._object) {
1234
+ var value = this._object[key], pair = [key, value];
1235
+ pair.key = key;
1236
+ pair.value = value;
1237
+ iterator(pair);
1238
+ }
1239
  }
1240
 
1241
+ function set(key, value) {
1242
+ return this._object[key] = value;
1243
+ }
 
1244
 
1245
+ function get(key) {
1246
+ if (this._object[key] !== Object.prototype[key])
1247
+ return this._object[key];
1248
+ }
 
 
 
 
1249
 
1250
+ function unset(key) {
1251
+ var value = this._object[key];
1252
+ delete this._object[key];
1253
+ return value;
1254
+ }
1255
 
1256
+ function toObject() {
1257
+ return Object.clone(this._object);
1258
+ }
 
 
1259
 
 
 
 
 
 
1260
 
 
 
 
1261
 
1262
+ function keys() {
1263
+ return this.pluck('key');
1264
+ }
1265
 
1266
+ function values() {
1267
+ return this.pluck('value');
1268
+ }
1269
 
1270
+ function index(value) {
1271
+ var match = this.detect(function(pair) {
1272
+ return pair.value === value;
1273
+ });
1274
+ return match && match.key;
1275
+ }
1276
 
1277
+ function merge(object) {
1278
+ return this.clone().update(object);
1279
+ }
1280
 
1281
+ function update(object) {
1282
+ return new Hash(object).inject(this, function(result, pair) {
1283
+ result.set(pair.key, pair.value);
1284
+ return result;
1285
+ });
1286
+ }
1287
 
1288
+ function toQueryPair(key, value) {
1289
+ if (Object.isUndefined(value)) return key;
1290
+ return key + '=' + encodeURIComponent(String.interpret(value));
1291
+ }
1292
 
1293
+ function toQueryString() {
1294
+ return this.inject([], function(results, pair) {
1295
+ var key = encodeURIComponent(pair.key), values = pair.value;
 
 
 
 
1296
 
1297
+ if (values && typeof values == 'object') {
1298
+ if (Object.isArray(values)) {
1299
+ var queryValues = [];
1300
+ for (var i = 0, len = values.length, value; i < len; i++) {
1301
+ value = values[i];
1302
+ queryValues.push(toQueryPair(key, value));
1303
+ }
1304
+ return results.concat(queryValues);
1305
+ }
1306
+ } else results.push(toQueryPair(key, values));
1307
+ return results;
1308
+ }).join('&');
1309
+ }
1310
 
1311
+ function inspect() {
1312
+ return '#<Hash:{' + this.map(function(pair) {
1313
+ return pair.map(Object.inspect).join(': ');
1314
+ }).join(', ') + '}>';
1315
+ }
1316
 
1317
+ function clone() {
1318
+ return new Hash(this);
 
1319
  }
1320
+
1321
+ return {
1322
+ initialize: initialize,
1323
+ _each: _each,
1324
+ set: set,
1325
+ get: get,
1326
+ unset: unset,
1327
+ toObject: toObject,
1328
+ toTemplateReplacements: toObject,
1329
+ keys: keys,
1330
+ values: values,
1331
+ index: index,
1332
+ merge: merge,
1333
+ update: update,
1334
+ toQueryString: toQueryString,
1335
+ inspect: inspect,
1336
+ toJSON: toObject,
1337
+ clone: clone
1338
+ };
1339
  })());
1340
 
 
1341
  Hash.from = $H;
1342
+ Object.extend(Number.prototype, (function() {
1343
+ function toColorPart() {
1344
+ return this.toPaddedString(2, 16);
1345
+ }
1346
+
1347
+ function succ() {
1348
+ return this + 1;
1349
+ }
1350
+
1351
+ function times(iterator, context) {
1352
+ $R(0, this, true).each(iterator, context);
1353
+ return this;
1354
+ }
1355
+
1356
+ function toPaddedString(length, radix) {
1357
+ var string = this.toString(radix || 10);
1358
+ return '0'.times(length - string.length) + string;
1359
+ }
1360
+
1361
+ function abs() {
1362
+ return Math.abs(this);
1363
+ }
1364
+
1365
+ function round() {
1366
+ return Math.round(this);
1367
+ }
1368
+
1369
+ function ceil() {
1370
+ return Math.ceil(this);
1371
+ }
1372
+
1373
+ function floor() {
1374
+ return Math.floor(this);
1375
+ }
1376
+
1377
+ return {
1378
+ toColorPart: toColorPart,
1379
+ succ: succ,
1380
+ times: times,
1381
+ toPaddedString: toPaddedString,
1382
+ abs: abs,
1383
+ round: round,
1384
+ ceil: ceil,
1385
+ floor: floor
1386
+ };
1387
+ })());
1388
+
1389
+ function $R(start, end, exclusive) {
1390
+ return new ObjectRange(start, end, exclusive);
1391
+ }
1392
+
1393
+ var ObjectRange = Class.create(Enumerable, (function() {
1394
+ function initialize(start, end, exclusive) {
1395
  this.start = start;
1396
  this.end = end;
1397
  this.exclusive = exclusive;
1398
+ }
1399
 
1400
+ function _each(iterator) {
1401
  var value = this.start;
1402
  while (this.include(value)) {
1403
  iterator(value);
1404
  value = value.succ();
1405
  }
1406
+ }
1407
 
1408
+ function include(value) {
1409
  if (value < this.start)
1410
  return false;
1411
  if (this.exclusive)
1412
  return value < this.end;
1413
  return value <= this.end;
1414
  }
 
1415
 
1416
+ return {
1417
+ initialize: initialize,
1418
+ _each: _each,
1419
+ include: include
1420
+ };
1421
+ })());
1422
+
1423
+
1424
 
1425
  var Ajax = {
1426
  getTransport: function() {
1467
  onCreate: function() { Ajax.activeRequestCount++ },
1468
  onComplete: function() { Ajax.activeRequestCount-- }
1469
  });
 
1470
  Ajax.Base = Class.create({
1471
  initialize: function(options) {
1472
  this.options = {
1482
 
1483
  this.options.method = this.options.method.toLowerCase();
1484
 
1485
+ if (Object.isHash(this.options.parameters))
 
 
1486
  this.options.parameters = this.options.parameters.toObject();
1487
  }
1488
  });
 
1489
  Ajax.Request = Class.create(Ajax.Base, {
1490
  _complete: false,
1491
 
1498
  request: function(url) {
1499
  this.url = url;
1500
  this.method = this.options.method;
1501
+ var params = Object.isString(this.options.parameters) ?
1502
+ this.options.parameters :
1503
+ Object.toQueryString(this.options.parameters);
1504
 
1505
  if (!['get', 'post'].include(this.method)) {
1506
+ params += (params ? '&' : '') + "_method=" + this.method;
 
1507
  this.method = 'post';
1508
  }
1509
 
1510
+ if (params && this.method === 'get') {
1511
+ this.url += (this.url.include('?') ? '&' : '?') + params;
 
 
 
 
 
 
1512
  }
1513
 
1514
+ this.parameters = params.toQueryParams();
1515
+
1516
  try {
1517
  var response = new Ajax.Response(this);
1518
  if (this.options.onCreate) this.options.onCreate(response);
1565
  headers['Connection'] = 'close';
1566
  }
1567
 
 
1568
  if (typeof this.options.requestHeaders == 'object') {
1569
  var extras = this.options.requestHeaders;
1570
 
1581
 
1582
  success: function() {
1583
  var status = this.getStatus();
1584
+ return !status || (status >= 200 && status < 300) || status == 304;
1585
  },
1586
 
1587
  getStatus: function() {
1588
  try {
1589
+ if (this.transport.status === 1223) return 204;
1590
  return this.transport.status || 0;
1591
  } catch (e) { return 0 }
1592
  },
1619
  }
1620
 
1621
  if (state == 'Complete') {
 
1622
  this.transport.onreadystatechange = Prototype.emptyFunction;
1623
  }
1624
  },
1635
  getHeader: function(name) {
1636
  try {
1637
  return this.transport.getResponseHeader(name) || null;
1638
+ } catch (e) { return null; }
1639
  },
1640
 
1641
  evalResponse: function() {
1655
  Ajax.Request.Events =
1656
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
1657
 
1658
+
1659
+
1660
+
1661
+
1662
+
1663
+
1664
+
1665
  Ajax.Response = Class.create({
1666
  initialize: function(request){
1667
  this.request = request;
1668
  var transport = this.transport = request.transport,
1669
  readyState = this.readyState = transport.readyState;
1670
 
1671
+ if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
1672
  this.status = this.getStatus();
1673
  this.statusText = this.getStatusText();
1674
  this.responseText = String.interpret(transport.responseText);
1675
  this.headerJSON = this._getHeaderJSON();
1676
  }
1677
 
1678
+ if (readyState == 4) {
1679
  var xml = transport.responseXML;
1680
  this.responseXML = Object.isUndefined(xml) ? null : xml;
1681
  this.responseJSON = this._getResponseJSON();
1683
  },
1684
 
1685
  status: 0,
1686
+
1687
  statusText: '',
1688
 
1689
  getStatus: Ajax.Request.prototype.getStatus,
1813
  this.updater = new Ajax.Updater(this.container, this.url, this.options);
1814
  }
1815
  });
1816
+
1817
+
1818
  function $(element) {
1819
  if (arguments.length > 1) {
1820
  for (var i = 0, elements = [], length = arguments.length; i < length; i++)
1839
 
1840
  /*--------------------------------------------------------------------------*/
1841
 
1842
+ if (!Node) var Node = { };
1843
 
1844
  if (!Node.ELEMENT_NODE) {
 
1845
  Object.extend(Node, {
1846
  ELEMENT_NODE: 1,
1847
  ATTRIBUTE_NODE: 2,
1858
  });
1859
  }
1860
 
1861
+
1862
+
1863
+ (function(global) {
1864
+ function shouldUseCache(tagName, attributes) {
1865
+ if (tagName === 'select') return false;
1866
+ if ('type' in attributes) return false;
1867
+ return true;
1868
+ }
1869
+
1870
+ var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){
1871
+ try {
1872
+ var el = document.createElement('<input name="x">');
1873
+ return el.tagName.toLowerCase() === 'input' && el.name === 'x';
1874
+ }
1875
+ catch(err) {
1876
+ return false;
1877
+ }
1878
+ })();
1879
+
1880
+ var element = global.Element;
1881
+
1882
+ global.Element = function(tagName, attributes) {
1883
  attributes = attributes || { };
1884
  tagName = tagName.toLowerCase();
1885
  var cache = Element.cache;
1886
+
1887
+ if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {
1888
  tagName = '<' + tagName + ' name="' + attributes.name + '">';
1889
  delete attributes.name;
1890
  return Element.writeAttribute(document.createElement(tagName), attributes);
1891
  }
1892
+
1893
  if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
1894
+
1895
+ var node = shouldUseCache(tagName, attributes) ?
1896
+ cache[tagName].cloneNode(false) : document.createElement(tagName);
1897
+
1898
+ return Element.writeAttribute(node, attributes);
1899
  };
 
 
 
1900
 
1901
+ Object.extend(global.Element, element || { });
1902
+ if (element) global.Element.prototype = element.prototype;
1903
+
1904
+ })(this);
1905
+
1906
+ Element.idCounter = 1;
1907
  Element.cache = { };
1908
 
1909
+ Element._purgeElement = function(element) {
1910
+ var uid = element._prototypeUID;
1911
+ if (uid) {
1912
+ Element.stopObserving(element);
1913
+ element._prototypeUID = void 0;
1914
+ delete Element.Storage[uid];
1915
+ }
1916
+ }
1917
+
1918
  Element.Methods = {
1919
  visible: function(element) {
1920
  return $(element).style.display != 'none';
1944
  return element;
1945
  },
1946
 
1947
+ update: (function(){
1948
+
1949
+ var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
1950
+ var el = document.createElement("select"),
1951
+ isBuggy = true;
1952
+ el.innerHTML = "<option value=\"test\">test</option>";
1953
+ if (el.options && el.options[0]) {
1954
+ isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
1955
+ }
1956
+ el = null;
1957
+ return isBuggy;
1958
+ })();
1959
+
1960
+ var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
1961
+ try {
1962
+ var el = document.createElement("table");
1963
+ if (el && el.tBodies) {
1964
+ el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
1965
+ var isBuggy = typeof el.tBodies[0] == "undefined";
1966
+ el = null;
1967
+ return isBuggy;
1968
+ }
1969
+ } catch (e) {
1970
+ return true;
1971
+ }
1972
+ })();
1973
+
1974
+ var LINK_ELEMENT_INNERHTML_BUGGY = (function() {
1975
+ try {
1976
+ var el = document.createElement('div');
1977
+ el.innerHTML = "<link>";
1978
+ var isBuggy = (el.childNodes.length === 0);
1979
+ el = null;
1980
+ return isBuggy;
1981
+ } catch(e) {
1982
+ return true;
1983
+ }
1984
+ })();
1985
+
1986
+ var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY ||
1987
+ TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY;
1988
+
1989
+ var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
1990
+ var s = document.createElement("script"),
1991
+ isBuggy = false;
1992
+ try {
1993
+ s.appendChild(document.createTextNode(""));
1994
+ isBuggy = !s.firstChild ||
1995
+ s.firstChild && s.firstChild.nodeType !== 3;
1996
+ } catch (e) {
1997
+ isBuggy = true;
1998
+ }
1999
+ s = null;
2000
+ return isBuggy;
2001
+ })();
2002
+
2003
+
2004
+ function update(element, content) {
2005
+ element = $(element);
2006
+ var purgeElement = Element._purgeElement;
2007
+
2008
+ var descendants = element.getElementsByTagName('*'),
2009
+ i = descendants.length;
2010
+ while (i--) purgeElement(descendants[i]);
2011
+
2012
+ if (content && content.toElement)
2013
+ content = content.toElement();
2014
+
2015
+ if (Object.isElement(content))
2016
+ return element.update().insert(content);
2017
+
2018
+ content = Object.toHTML(content);
2019
+
2020
+ var tagName = element.tagName.toUpperCase();
2021
+
2022
+ if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
2023
+ element.text = content;
2024
+ return element;
2025
+ }
2026
+
2027
+ if (ANY_INNERHTML_BUGGY) {
2028
+ if (tagName in Element._insertionTranslations.tags) {
2029
+ while (element.firstChild) {
2030
+ element.removeChild(element.firstChild);
2031
+ }
2032
+ Element._getContentFromAnonymousElement(tagName, content.stripScripts())
2033
+ .each(function(node) {
2034
+ element.appendChild(node)
2035
+ });
2036
+ } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) {
2037
+ while (element.firstChild) {
2038
+ element.removeChild(element.firstChild);
2039
+ }
2040
+ var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true);
2041
+ nodes.each(function(node) { element.appendChild(node) });
2042
+ }
2043
+ else {
2044
+ element.innerHTML = content.stripScripts();
2045
+ }
2046
+ }
2047
+ else {
2048
+ element.innerHTML = content.stripScripts();
2049
+ }
2050
+
2051
+ content.evalScripts.bind(content).defer();
2052
+ return element;
2053
+ }
2054
+
2055
+ return update;
2056
+ })(),
2057
 
2058
  replace: function(element, content) {
2059
  element = $(element);
2121
  element = $(element);
2122
  var result = '<' + element.tagName.toLowerCase();
2123
  $H({'id': 'id', 'className': 'class'}).each(function(pair) {
2124
+ var property = pair.first(),
2125
+ attribute = pair.last(),
2126
+ value = (element[property] || '').toString();
2127
  if (value) result += ' ' + attribute + '=' + value.inspect(true);
2128
  });
2129
  return result + '>';
2130
  },
2131
 
2132
+ recursivelyCollect: function(element, property, maximumLength) {
2133
  element = $(element);
2134
+ maximumLength = maximumLength || -1;
2135
  var elements = [];
2136
+
2137
+ while (element = element[property]) {
2138
  if (element.nodeType == 1)
2139
  elements.push(Element.extend(element));
2140
+ if (elements.length == maximumLength)
2141
+ break;
2142
+ }
2143
+
2144
  return elements;
2145
  },
2146
 
2147
  ancestors: function(element) {
2148
+ return Element.recursivelyCollect(element, 'parentNode');
2149
  },
2150
 
2151
  descendants: function(element) {
2152
+ return Element.select(element, "*");
2153
  },
2154
 
2155
  firstDescendant: function(element) {
2159
  },
2160
 
2161
  immediateDescendants: function(element) {
2162
+ var results = [], child = $(element).firstChild;
2163
+ while (child) {
2164
+ if (child.nodeType === 1) {
2165
+ results.push(Element.extend(child));
2166
+ }
2167
+ child = child.nextSibling;
2168
+ }
2169
+ return results;
2170
  },
2171
 
2172
+ previousSiblings: function(element, maximumLength) {
2173
+ return Element.recursivelyCollect(element, 'previousSibling');
2174
  },
2175
 
2176
  nextSiblings: function(element) {
2177
+ return Element.recursivelyCollect(element, 'nextSibling');
2178
  },
2179
 
2180
  siblings: function(element) {
2181
  element = $(element);
2182
+ return Element.previousSiblings(element).reverse()
2183
+ .concat(Element.nextSiblings(element));
2184
  },
2185
 
2186
  match: function(element, selector) {
2187
+ element = $(element);
2188
  if (Object.isString(selector))
2189
+ return Prototype.Selector.match(element, selector);
2190
+ return selector.match(element);
2191
  },
2192
 
2193
  up: function(element, expression, index) {
2194
  element = $(element);
2195
  if (arguments.length == 1) return $(element.parentNode);
2196
+ var ancestors = Element.ancestors(element);
2197
  return Object.isNumber(expression) ? ancestors[expression] :
2198
+ Prototype.Selector.find(ancestors, expression, index);
2199
  },
2200
 
2201
  down: function(element, expression, index) {
2202
  element = $(element);
2203
+ if (arguments.length == 1) return Element.firstDescendant(element);
2204
+ return Object.isNumber(expression) ? Element.descendants(element)[expression] :
2205
  Element.select(element, expression)[index || 0];
2206
  },
2207
 
2208
  previous: function(element, expression, index) {
2209
  element = $(element);
2210
+ if (Object.isNumber(expression)) index = expression, expression = false;
2211
+ if (!Object.isNumber(index)) index = 0;
2212
+
2213
+ if (expression) {
2214
+ return Prototype.Selector.find(element.previousSiblings(), expression, index);
2215
+ } else {
2216
+ return element.recursivelyCollect("previousSibling", index + 1)[index];
2217
+ }
2218
  },
2219
 
2220
  next: function(element, expression, index) {
2221
  element = $(element);
2222
+ if (Object.isNumber(expression)) index = expression, expression = false;
2223
+ if (!Object.isNumber(index)) index = 0;
2224
+
2225
+ if (expression) {
2226
+ return Prototype.Selector.find(element.nextSiblings(), expression, index);
2227
+ } else {
2228
+ var maximumLength = Object.isNumber(index) ? index + 1 : 1;
2229
+ return element.recursivelyCollect("nextSibling", index + 1)[index];
2230
+ }
2231
  },
2232
 
2233
+
2234
+ select: function(element) {
2235
+ element = $(element);
2236
+ var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
2237
+ return Prototype.Selector.select(expressions, element);
2238
  },
2239
 
2240
+ adjacent: function(element) {
2241
+ element = $(element);
2242
+ var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
2243
+ return Prototype.Selector.select(expressions, element.parentNode).without(element);
2244
  },
2245
 
2246
  identify: function(element) {
2247
  element = $(element);
2248
+ var id = Element.readAttribute(element, 'id');
2249
  if (id) return id;
2250
+ do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id));
2251
+ Element.writeAttribute(element, 'id', id);
2252
  return id;
2253
  },
2254
 
2287
  },
2288
 
2289
  getHeight: function(element) {
2290
+ return Element.getDimensions(element).height;
2291
  },
2292
 
2293
  getWidth: function(element) {
2294
+ return Element.getDimensions(element).width;
2295
  },
2296
 
2297
  classNames: function(element) {
2307
 
2308
  addClassName: function(element, className) {
2309
  if (!(element = $(element))) return;
2310
+ if (!Element.hasClassName(element, className))
2311
  element.className += (element.className ? ' ' : '') + className;
2312
  return element;
2313
  },
2321
 
2322
  toggleClassName: function(element, className) {
2323
  if (!(element = $(element))) return;
2324
+ return Element[Element.hasClassName(element, className) ?
2325
+ 'removeClassName' : 'addClassName'](element, className);
2326
  },
2327
 
 
2328
  cleanWhitespace: function(element) {
2329
  element = $(element);
2330
  var node = element.firstChild;
2358
 
2359
  scrollTo: function(element) {
2360
  element = $(element);
2361
+ var pos = Element.cumulativeOffset(element);
2362
  window.scrollTo(pos[0], pos[1]);
2363
  return element;
2364
  },
2404
  return element;
2405
  },
2406
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2407
  makePositioned: function(element) {
2408
  element = $(element);
2409
  var pos = Element.getStyle(element, 'position');
2410
  if (pos == 'static' || !pos) {
2411
  element._madePositioned = true;
2412
  element.style.position = 'relative';
 
 
2413
  if (Prototype.Browser.Opera) {
2414
  element.style.top = 0;
2415
  element.style.left = 0;
2448
  return element;
2449
  },
2450
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2451
  clonePosition: function(element, source) {
2452
  var options = Object.extend({
2453
  setLeft: true,
2458
  offsetLeft: 0
2459
  }, arguments[2] || { });
2460
 
 
2461
  source = $(source);
2462
+ var p = Element.viewportOffset(source), delta = [0, 0], parent = null;
2463
 
 
2464
  element = $(element);
2465
+
 
 
 
2466
  if (Element.getStyle(element, 'position') == 'absolute') {
2467
+ parent = Element.getOffsetParent(element);
2468
+ delta = Element.viewportOffset(parent);
2469
  }
2470
 
 
2471
  if (parent == document.body) {
2472
  delta[0] -= document.body.offsetLeft;
2473
  delta[1] -= document.body.offsetTop;
2474
  }
2475
 
 
2476
  if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
2477
  if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
2478
  if (options.setWidth) element.style.width = source.offsetWidth + 'px';
2481
  }
2482
  };
2483
 
 
 
2484
  Object.extend(Element.Methods, {
2485
  getElementsBySelector: Element.Methods.select,
2486
+
2487
  childElements: Element.Methods.immediateDescendants
2488
  });
2489
 
2501
  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
2502
  function(proceed, element, style) {
2503
  switch (style) {
 
 
2504
  case 'height': case 'width':
 
2505
  if (!Element.visible(element)) return null;
2506
 
 
 
2507
  var dim = parseInt(proceed(element, style), 10);
2508
 
2509
  if (dim !== element['offset' + style.capitalize()])
2536
  }
2537
 
2538
  else if (Prototype.Browser.IE) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2539
  Element.Methods.getStyle = function(element, style) {
2540
  element = $(element);
2541
  style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
2577
  return element;
2578
  };
2579
 
2580
+ Element._attributeTranslations = (function(){
2581
+
2582
+ var classProp = 'className',
2583
+ forProp = 'for',
2584
+ el = document.createElement('div');
2585
+
2586
+ el.setAttribute(classProp, 'x');
2587
+
2588
+ if (el.className !== 'x') {
2589
+ el.setAttribute('class', 'x');
2590
+ if (el.className === 'x') {
2591
+ classProp = 'class';
2592
+ }
2593
+ }
2594
+ el = null;
2595
+
2596
+ el = document.createElement('label');
2597
+ el.setAttribute(forProp, 'x');
2598
+ if (el.htmlFor !== 'x') {
2599
+ el.setAttribute('htmlFor', 'x');
2600
+ if (el.htmlFor === 'x') {
2601
+ forProp = 'htmlFor';
2602
+ }
2603
+ }
2604
+ el = null;
2605
+
2606
+ return {
2607
+ read: {
2608
+ names: {
2609
+ 'class': classProp,
2610
+ 'className': classProp,
2611
+ 'for': forProp,
2612
+ 'htmlFor': forProp
2613
  },
2614
+ values: {
2615
+ _getAttr: function(element, attribute) {
2616
+ return element.getAttribute(attribute);
2617
+ },
2618
+ _getAttr2: function(element, attribute) {
2619
+ return element.getAttribute(attribute, 2);
2620
+ },
2621
+ _getAttrNode: function(element, attribute) {
2622
+ var node = element.getAttributeNode(attribute);
2623
+ return node ? node.value : "";
2624
+ },
2625
+ _getEv: (function(){
2626
+
2627
+ var el = document.createElement('div'), f;
2628
+ el.onclick = Prototype.emptyFunction;
2629
+ var value = el.getAttribute('onclick');
2630
+
2631
+ if (String(value).indexOf('{') > -1) {
2632
+ f = function(element, attribute) {
2633
+ attribute = element.getAttribute(attribute);
2634
+ if (!attribute) return null;
2635
+ attribute = attribute.toString();
2636
+ attribute = attribute.split('{')[1];
2637
+ attribute = attribute.split('}')[0];
2638
+ return attribute.strip();
2639
+ };
2640
+ }
2641
+ else if (value === '') {
2642
+ f = function(element, attribute) {
2643
+ attribute = element.getAttribute(attribute);
2644
+ if (!attribute) return null;
2645
+ return attribute.strip();
2646
+ };
2647
+ }
2648
+ el = null;
2649
+ return f;
2650
+ })(),
2651
+ _flag: function(element, attribute) {
2652
+ return $(element).hasAttribute(attribute) ? attribute : null;
2653
+ },
2654
+ style: function(element) {
2655
+ return element.style.cssText.toLowerCase();
2656
+ },
2657
+ title: function(element) {
2658
+ return element.title;
2659
+ }
2660
  }
2661
  }
2662
  }
2663
+ })();
2664
 
2665
  Element._attributeTranslations.write = {
2666
  names: Object.extend({
2688
 
2689
  (function(v) {
2690
  Object.extend(v, {
2691
+ href: v._getAttr2,
2692
+ src: v._getAttr2,
2693
  type: v._getAttr,
2694
  action: v._getAttrNode,
2695
  disabled: v._flag,
2716
  onchange: v._getEv
2717
  });
2718
  })(Element._attributeTranslations.read.values);
2719
+
2720
+ if (Prototype.BrowserFeatures.ElementExtensions) {
2721
+ (function() {
2722
+ function _descendants(element) {
2723
+ var nodes = element.getElementsByTagName('*'), results = [];
2724
+ for (var i = 0, node; node = nodes[i]; i++)
2725
+ if (node.tagName !== "!") // Filter out comment nodes.
2726
+ results.push(node);
2727
+ return results;
2728
+ }
2729
+
2730
+ Element.Methods.down = function(element, expression, index) {
2731
+ element = $(element);
2732
+ if (arguments.length == 1) return element.firstDescendant();
2733
+ return Object.isNumber(expression) ? _descendants(element)[expression] :
2734
+ Element.select(element, expression)[index || 0];
2735
+ }
2736
+ })();
2737
+ }
2738
+
2739
  }
2740
 
2741
  else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
2754
  (value < 0.00001) ? 0 : value;
2755
 
2756
  if (value == 1)
2757
+ if (element.tagName.toUpperCase() == 'IMG' && element.width) {
2758
  element.width++; element.width--;
2759
  } else try {
2760
  var n = document.createTextNode(' ');
2764
 
2765
  return element;
2766
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2767
  }
2768
 
2769
+ if ('outerHTML' in document.documentElement) {
2770
  Element.Methods.replace = function(element, content) {
2771
  element = $(element);
2772
 
2780
  var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
2781
 
2782
  if (Element._insertionTranslations.tags[tagName]) {
2783
+ var nextSibling = element.next(),
2784
+ fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
2785
  parent.removeChild(element);
2786
  if (nextSibling)
2787
  fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
2802
  return result;
2803
  };
2804
 
2805
+ Element._getContentFromAnonymousElement = function(tagName, html, force) {
2806
+ var div = new Element('div'),
2807
+ t = Element._insertionTranslations.tags[tagName];
2808
+
2809
+ var workaround = false;
2810
+ if (t) workaround = true;
2811
+ else if (force) {
2812
+ workaround = true;
2813
+ t = ['', '', 0];
2814
+ }
2815
+
2816
+ if (workaround) {
2817
+ div.innerHTML = '&nbsp;' + t[0] + html + t[1];
2818
+ div.removeChild(div.firstChild);
2819
+ for (var i = t[2]; i--; ) {
2820
+ div = div.firstChild;
2821
+ }
2822
+ }
2823
+ else {
2824
+ div.innerHTML = html;
2825
+ }
2826
  return $A(div.childNodes);
2827
  };
2828
 
2849
  };
2850
 
2851
  (function() {
2852
+ var tags = Element._insertionTranslations.tags;
2853
+ Object.extend(tags, {
2854
+ THEAD: tags.TBODY,
2855
+ TFOOT: tags.TBODY,
2856
+ TH: tags.TD
2857
  });
2858
+ })();
2859
 
2860
  Element.Methods.Simulated = {
2861
  hasAttribute: function(element, attribute) {
2869
 
2870
  Object.extend(Element, Element.Methods);
2871
 
2872
+ (function(div) {
2873
+
2874
+ if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
2875
+ window.HTMLElement = { };
2876
+ window.HTMLElement.prototype = div['__proto__'];
2877
+ Prototype.BrowserFeatures.ElementExtensions = true;
2878
+ }
2879
+
2880
+ div = null;
2881
+
2882
+ })(document.createElement('div'));
2883
 
2884
  Element.extend = (function() {
2885
+
2886
+ function checkDeficiency(tagName) {
2887
+ if (typeof window.Element != 'undefined') {
2888
+ var proto = window.Element.prototype;
2889
+ if (proto) {
2890
+ var id = '_' + (Math.random()+'').slice(2),
2891
+ el = document.createElement(tagName);
2892
+ proto[id] = 'x';
2893
+ var isBuggy = (el[id] !== 'x');
2894
+ delete proto[id];
2895
+ el = null;
2896
+ return isBuggy;
2897
+ }
2898
+ }
2899
+ return false;
2900
+ }
2901
+
2902
+ function extendElementWith(element, methods) {
2903
+ for (var property in methods) {
2904
+ var value = methods[property];
2905
+ if (Object.isFunction(value) && !(property in element))
2906
+ element[property] = value.methodize();
2907
+ }
2908
+ }
2909
+
2910
+ var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
2911
+
2912
+ if (Prototype.BrowserFeatures.SpecificElementExtensions) {
2913
+ if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
2914
+ return function(element) {
2915
+ if (element && typeof element._extendedByPrototype == 'undefined') {
2916
+ var t = element.tagName;
2917
+ if (t && (/^(?:object|applet|embed)$/i.test(t))) {
2918
+ extendElementWith(element, Element.Methods);
2919
+ extendElementWith(element, Element.Methods.Simulated);
2920
+ extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
2921
+ }
2922
+ }
2923
+ return element;
2924
+ }
2925
+ }
2926
  return Prototype.K;
2927
+ }
2928
 
2929
  var Methods = { }, ByTag = Element.Methods.ByTag;
2930
 
2931
  var extend = Object.extend(function(element) {
2932
+ if (!element || typeof element._extendedByPrototype != 'undefined' ||
2933
  element.nodeType != 1 || element == window) return element;
2934
 
2935
  var methods = Object.clone(Methods),
2936
+ tagName = element.tagName.toUpperCase();
2937
 
 
2938
  if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
2939
 
2940
+ extendElementWith(element, methods);
 
 
 
 
2941
 
2942
  element._extendedByPrototype = Prototype.emptyFunction;
2943
  return element;
2944
 
2945
  }, {
2946
  refresh: function() {
 
2947
  if (!Prototype.BrowserFeatures.ElementExtensions) {
2948
  Object.extend(Methods, Element.Methods);
2949
  Object.extend(Methods, Element.Methods.Simulated);
2955
  return extend;
2956
  })();
2957
 
2958
+ if (document.documentElement.hasAttribute) {
2959
+ Element.hasAttribute = function(element, attribute) {
2960
+ return element.hasAttribute(attribute);
2961
+ };
2962
+ }
2963
+ else {
2964
+ Element.hasAttribute = Element.Methods.Simulated.hasAttribute;
2965
+ }
2966
 
2967
  Element.addMethods = function(methods) {
2968
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
2974
  "FORM": Object.clone(Form.Methods),
2975
  "INPUT": Object.clone(Form.Element.Methods),
2976
  "SELECT": Object.clone(Form.Element.Methods),
2977
+ "TEXTAREA": Object.clone(Form.Element.Methods),
2978
+ "BUTTON": Object.clone(Form.Element.Methods)
2979
  });
2980
  }
2981
 
3027
  klass = 'HTML' + tagName.capitalize() + 'Element';
3028
  if (window[klass]) return window[klass];
3029
 
3030
+ var element = document.createElement(tagName),
3031
+ proto = element['__proto__'] || element.constructor.prototype;
3032
+
3033
+ element = null;
3034
+ return proto;
3035
  }
3036
 
3037
+ var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
3038
+ Element.prototype;
3039
+
3040
  if (F.ElementExtensions) {
3041
+ copy(Element.Methods, elementPrototype);
3042
+ copy(Element.Methods.Simulated, elementPrototype, true);
3043
  }
3044
 
3045
  if (F.SpecificElementExtensions) {
3057
  Element.cache = { };
3058
  };
3059
 
3060
+
3061
  document.viewport = {
3062
+
3063
  getDimensions: function() {
3064
+ return { width: this.getWidth(), height: this.getHeight() };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3065
  },
3066
 
3067
  getScrollOffsets: function() {
3068
  return Element._returnOffset(
3069
  window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
3070
+ window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
3071
  }
3072
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3073
 
3074
+ (function(viewport) {
3075
+ var B = Prototype.Browser, doc = document, element, property = {};
3076
 
3077
+ function getRootElement() {
3078
+ if (B.WebKit && !doc.evaluate)
3079
+ return document;
3080
 
3081
+ if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
3082
+ return document.body;
3083
 
3084
+ return document.documentElement;
3085
+ }
 
 
3086
 
3087
+ function define(D) {
3088
+ if (!element) element = getRootElement();
 
 
3089
 
3090
+ property[D] = 'client' + D;
 
3091
 
3092
+ viewport['get' + D] = function() { return element[property[D]] };
3093
+ return viewport['get' + D]();
3094
+ }
3095
 
3096
+ viewport.getWidth = define.curry('Width');
3097
 
3098
+ viewport.getHeight = define.curry('Height');
3099
+ })(document.viewport);
3100
+
3101
+
3102
+ Element.Storage = {
3103
+ UID: 1
3104
+ };
3105
+
3106
+ Element.addMethods({
3107
+ getStorage: function(element) {
3108
+ if (!(element = $(element))) return;
3109
+
3110
+ var uid;
3111
+ if (element === window) {
3112
+ uid = 0;
3113
+ } else {
3114
+ if (typeof element._prototypeUID === "undefined")
3115
+ element._prototypeUID = Element.Storage.UID++;
3116
+ uid = element._prototypeUID;
3117
  }
3118
 
3119
+ if (!Element.Storage[uid])
3120
+ Element.Storage[uid] = $H();
3121
+
3122
+ return Element.Storage[uid];
3123
  },
3124
 
3125
+ store: function(element, key, value) {
3126
+ if (!(element = $(element))) return;
3127
+
3128
+ if (arguments.length === 2) {
3129
+ Element.getStorage(element).update(key);
3130
+ } else {
3131
+ Element.getStorage(element).set(key, value);
3132
+ }
3133
 
3134
+ return element;
3135
+ },
3136
+
3137
+ retrieve: function(element, key, defaultValue) {
3138
+ if (!(element = $(element))) return;
3139
+ var hash = Element.getStorage(element), value = hash.get(key);
3140
+
3141
+ if (Object.isUndefined(value)) {
3142
+ hash.set(key, defaultValue);
3143
+ value = defaultValue;
3144
  }
3145
 
3146
+ return value;
3147
+ },
3148
 
3149
+ clone: function(element, deep) {
3150
+ if (!(element = $(element))) return;
3151
+ var clone = element.cloneNode(deep);
3152
+ clone._prototypeUID = void 0;
3153
+ if (deep) {
3154
+ var descendants = Element.select(clone, '*'),
3155
+ i = descendants.length;
3156
+ while (i--) {
3157
+ descendants[i]._prototypeUID = void 0;
 
3158
  }
3159
  }
3160
+ return Element.extend(clone);
 
 
 
3161
  },
3162
 
3163
+ purge: function(element) {
3164
+ if (!(element = $(element))) return;
3165
+ var purgeElement = Element._purgeElement;
3166
+
3167
+ purgeElement(element);
3168
+
3169
+ var descendants = element.getElementsByTagName('*'),
3170
+ i = descendants.length;
3171
+
3172
+ while (i--) purgeElement(descendants[i]);
3173
+
3174
+ return null;
3175
+ }
3176
+ });
3177
+
3178
+ (function() {
3179
 
3180
+ function toDecimal(pctString) {
3181
+ var match = pctString.match(/^(\d+)%?$/i);
3182
+ if (!match) return null;
3183
+ return (Number(match[1]) / 100);
3184
+ }
3185
+
3186
+ function getPixelValue(value, property, context) {
3187
+ var element = null;
3188
+ if (Object.isElement(value)) {
3189
+ element = value;
3190
+ value = element.getStyle(property);
3191
  }
3192
 
3193
+ if (value === null) {
3194
+ return null;
 
 
 
 
 
 
 
 
 
3195
  }
3196
 
3197
+ if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {
3198
+ return window.parseFloat(value);
3199
+ }
3200
 
3201
+ var isPercentage = value.include('%'), isViewport = (context === document.viewport);
 
 
 
 
 
 
 
 
 
 
 
 
3202
 
3203
+ if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) {
3204
+ var style = element.style.left, rStyle = element.runtimeStyle.left;
3205
+ element.runtimeStyle.left = element.currentStyle.left;
3206
+ element.style.left = value || 0;
3207
+ value = element.style.pixelLeft;
3208
+ element.style.left = style;
3209
+ element.runtimeStyle.left = rStyle;
3210
 
3211
+ return value;
 
 
 
 
3212
  }
 
3213
 
3214
+ if (element && isPercentage) {
3215
+ context = context || element.parentNode;
3216
+ var decimal = toDecimal(value);
3217
+ var whole = null;
3218
+ var position = element.getStyle('position');
3219
+
3220
+ var isHorizontal = property.include('left') || property.include('right') ||
3221
+ property.include('width');
3222
+
3223
+ var isVertical = property.include('top') || property.include('bottom') ||
3224
+ property.include('height');
3225
+
3226
+ if (context === document.viewport) {
3227
+ if (isHorizontal) {
3228
+ whole = document.viewport.getWidth();
3229
+ } else if (isVertical) {
3230
+ whole = document.viewport.getHeight();
3231
+ }
3232
+ } else {
3233
+ if (isHorizontal) {
3234
+ whole = $(context).measure('width');
3235
+ } else if (isVertical) {
3236
+ whole = $(context).measure('height');
3237
  }
3238
  }
3239
+
3240
+ return (whole === null) ? 0 : whole * decimal;
3241
  }
3242
 
3243
+ return 0;
3244
+ }
3245
+
3246
+ function toCSSPixels(number) {
3247
+ if (Object.isString(number) && number.endsWith('px')) {
3248
+ return number;
3249
  }
3250
+ return number + 'px';
3251
+ }
3252
 
3253
+ function isDisplayed(element) {
3254
+ var originalElement = element;
3255
+ while (element && element.parentNode) {
3256
+ var display = element.getStyle('display');
3257
+ if (display === 'none') {
3258
+ return false;
3259
+ }
3260
+ element = $(element.parentNode);
3261
+ }
3262
+ return true;
3263
+ }
3264
 
3265
+ var hasLayout = Prototype.K;
3266
+ if ('currentStyle' in document.documentElement) {
3267
+ hasLayout = function(element) {
3268
+ if (!element.currentStyle.hasLayout) {
3269
+ element.style.zoom = 1;
3270
+ }
3271
+ return element;
3272
+ };
3273
+ }
3274
 
3275
+ function cssNameFor(key) {
3276
+ if (key.include('border')) key = key + '-width';
3277
+ return key.camelize();
3278
  }
 
3279
 
3280
+ Element.Layout = Class.create(Hash, {
3281
+ initialize: function($super, element, preCompute) {
3282
+ $super();
3283
+ this.element = $(element);
3284
+
3285
+ Element.Layout.PROPERTIES.each( function(property) {
3286
+ this._set(property, null);
3287
+ }, this);
3288
+
3289
+ if (preCompute) {
3290
+ this._preComputing = true;
3291
+ this._begin();
3292
+ Element.Layout.PROPERTIES.each( this._compute, this );
3293
+ this._end();
3294
+ this._preComputing = false;
3295
+ }
3296
+ },
3297
+
3298
+ _set: function(property, value) {
3299
+ return Hash.prototype.set.call(this, property, value);
3300
+ },
3301
+
3302
+ set: function(property, value) {
3303
+ throw "Properties of Element.Layout are read-only.";
3304
+ },
3305
+
3306
+ get: function($super, property) {
3307
+ var value = $super(property);
3308
+ return value === null ? this._compute(property) : value;
3309
+ },
3310
+
3311
+ _begin: function() {
3312
+ if (this._prepared) return;
3313
+
3314
+ var element = this.element;
3315
+ if (isDisplayed(element)) {
3316
+ this._prepared = true;
3317
+ return;
3318
+ }
3319
+
3320
+ var originalStyles = {
3321
+ position: element.style.position || '',
3322
+ width: element.style.width || '',
3323
+ visibility: element.style.visibility || '',
3324
+ display: element.style.display || ''
3325
+ };
3326
+
3327
+ element.store('prototype_original_styles', originalStyles);
3328
+
3329
+ var position = element.getStyle('position'),
3330
+ width = element.getStyle('width');
3331
+
3332
+ if (width === "0px" || width === null) {
3333
+ element.style.display = 'block';
3334
+ width = element.getStyle('width');
3335
+ }
3336
+
3337
+ var context = (position === 'fixed') ? document.viewport :
3338
+ element.parentNode;
3339
+
3340
+ element.setStyle({
3341
+ position: 'absolute',
3342
+ visibility: 'hidden',
3343
+ display: 'block'
3344
+ });
3345
+
3346
+ var positionedWidth = element.getStyle('width');
3347
+
3348
+ var newWidth;
3349
+ if (width && (positionedWidth === width)) {
3350
+ newWidth = getPixelValue(element, 'width', context);
3351
+ } else if (position === 'absolute' || position === 'fixed') {
3352
+ newWidth = getPixelValue(element, 'width', context);
3353
+ } else {
3354
+ var parent = element.parentNode, pLayout = $(parent).getLayout();
3355
+
3356
+ newWidth = pLayout.get('width') -
3357
+ this.get('margin-left') -
3358
+ this.get('border-left') -
3359
+ this.get('padding-left') -
3360
+ this.get('padding-right') -
3361
+ this.get('border-right') -
3362
+ this.get('margin-right');
3363
+ }
3364
+
3365
+ element.setStyle({ width: newWidth + 'px' });
3366
+
3367
+ this._prepared = true;
3368
  },
3369
+
3370
+ _end: function() {
3371
+ var element = this.element;
3372
+ var originalStyles = element.retrieve('prototype_original_styles');
3373
+ element.store('prototype_original_styles', null);
3374
+ element.setStyle(originalStyles);
3375
+ this._prepared = false;
3376
  },
3377
+
3378
+ _compute: function(property) {
3379
+ var COMPUTATIONS = Element.Layout.COMPUTATIONS;
3380
+ if (!(property in COMPUTATIONS)) {
3381
+ throw "Property not found.";
3382
+ }
3383
+
3384
+ return this._set(property, COMPUTATIONS[property].call(this, this.element));
3385
  },
3386
+
3387
+ toObject: function() {
3388
+ var args = $A(arguments);
3389
+ var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
3390
+ args.join(' ').split(' ');
3391
+ var obj = {};
3392
+ keys.each( function(key) {
3393
+ if (!Element.Layout.PROPERTIES.include(key)) return;
3394
+ var value = this.get(key);
3395
+ if (value != null) obj[key] = value;
3396
+ }, this);
3397
+ return obj;
3398
  },
3399
+
3400
+ toHash: function() {
3401
+ var obj = this.toObject.apply(this, arguments);
3402
+ return new Hash(obj);
 
 
 
 
3403
  },
3404
+
3405
+ toCSS: function() {
3406
+ var args = $A(arguments);
3407
+ var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
3408
+ args.join(' ').split(' ');
3409
+ var css = {};
3410
+
3411
+ keys.each( function(key) {
3412
+ if (!Element.Layout.PROPERTIES.include(key)) return;
3413
+ if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;
3414
+
3415
+ var value = this.get(key);
3416
+ if (value != null) css[cssNameFor(key)] = value + 'px';
3417
+ }, this);
3418
+ return css;
3419
+ },
3420
+
3421
+ inspect: function() {
3422
+ return "#<Element.Layout>";
3423
+ }
3424
+ });
3425
+
3426
+ Object.extend(Element.Layout, {
3427
+ PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'),
3428
+
3429
+ COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'),
3430
+
3431
+ COMPUTATIONS: {
3432
+ 'height': function(element) {
3433
+ if (!this._preComputing) this._begin();
3434
+
3435
+ var bHeight = this.get('border-box-height');
3436
+ if (bHeight <= 0) {
3437
+ if (!this._preComputing) this._end();
3438
+ return 0;
3439
+ }
3440
+
3441
+ var bTop = this.get('border-top'),
3442
+ bBottom = this.get('border-bottom');
3443
+
3444
+ var pTop = this.get('padding-top'),
3445
+ pBottom = this.get('padding-bottom');
3446
+
3447
+ if (!this._preComputing) this._end();
3448
+
3449
+ return bHeight - bTop - bBottom - pTop - pBottom;
3450
+ },
3451
+
3452
+ 'width': function(element) {
3453
+ if (!this._preComputing) this._begin();
3454
+
3455
+ var bWidth = this.get('border-box-width');
3456
+ if (bWidth <= 0) {
3457
+ if (!this._preComputing) this._end();
3458
+ return 0;
3459
  }
3460
+
3461
+ var bLeft = this.get('border-left'),
3462
+ bRight = this.get('border-right');
3463
+
3464
+ var pLeft = this.get('padding-left'),
3465
+ pRight = this.get('padding-right');
3466
+
3467
+ if (!this._preComputing) this._end();
3468
+
3469
+ return bWidth - bLeft - bRight - pLeft - pRight;
3470
+ },
3471
+
3472
+ 'padding-box-height': function(element) {
3473
+ var height = this.get('height'),
3474
+ pTop = this.get('padding-top'),
3475
+ pBottom = this.get('padding-bottom');
3476
+
3477
+ return height + pTop + pBottom;
3478
+ },
3479
+
3480
+ 'padding-box-width': function(element) {
3481
+ var width = this.get('width'),
3482
+ pLeft = this.get('padding-left'),
3483
+ pRight = this.get('padding-right');
3484
+
3485
+ return width + pLeft + pRight;
3486
+ },
3487
+
3488
+ 'border-box-height': function(element) {
3489
+ if (!this._preComputing) this._begin();
3490
+ var height = element.offsetHeight;
3491
+ if (!this._preComputing) this._end();
3492
+ return height;
3493
+ },
3494
+
3495
+ 'border-box-width': function(element) {
3496
+ if (!this._preComputing) this._begin();
3497
+ var width = element.offsetWidth;
3498
+ if (!this._preComputing) this._end();
3499
+ return width;
3500
+ },
3501
+
3502
+ 'margin-box-height': function(element) {
3503
+ var bHeight = this.get('border-box-height'),
3504
+ mTop = this.get('margin-top'),
3505
+ mBottom = this.get('margin-bottom');
3506
+
3507
+ if (bHeight <= 0) return 0;
3508
+
3509
+ return bHeight + mTop + mBottom;
3510
+ },
3511
+
3512
+ 'margin-box-width': function(element) {
3513
+ var bWidth = this.get('border-box-width'),
3514
+ mLeft = this.get('margin-left'),
3515
+ mRight = this.get('margin-right');
3516
+
3517
+ if (bWidth <= 0) return 0;
3518
+
3519
+ return bWidth + mLeft + mRight;
3520
+ },
3521
+
3522
+ 'top': function(element) {
3523
+ var offset = element.positionedOffset();
3524
+ return offset.top;
3525
+ },
3526
+
3527
+ 'bottom': function(element) {
3528
+ var offset = element.positionedOffset(),
3529
+ parent = element.getOffsetParent(),
3530
+ pHeight = parent.measure('height');
3531
+
3532
+ var mHeight = this.get('border-box-height');
3533
+
3534
+ return pHeight - mHeight - offset.top;
3535
+ },
3536
+
3537
+ 'left': function(element) {
3538
+ var offset = element.positionedOffset();
3539
+ return offset.left;
3540
+ },
3541
+
3542
+ 'right': function(element) {
3543
+ var offset = element.positionedOffset(),
3544
+ parent = element.getOffsetParent(),
3545
+ pWidth = parent.measure('width');
3546
+
3547
+ var mWidth = this.get('border-box-width');
3548
+
3549
+ return pWidth - mWidth - offset.left;
3550
+ },
3551
+
3552
+ 'padding-top': function(element) {
3553
+ return getPixelValue(element, 'paddingTop');
3554
+ },
3555
+
3556
+ 'padding-bottom': function(element) {
3557
+ return getPixelValue(element, 'paddingBottom');
3558
  },
3559
+
3560
+ 'padding-left': function(element) {
3561
+ return getPixelValue(element, 'paddingLeft');
3562
  },
3563
+
3564
+ 'padding-right': function(element) {
3565
+ return getPixelValue(element, 'paddingRight');
3566
  },
3567
+
3568
+ 'border-top': function(element) {
3569
+ return getPixelValue(element, 'borderTopWidth');
3570
  },
3571
+
3572
+ 'border-bottom': function(element) {
3573
+ return getPixelValue(element, 'borderBottomWidth');
3574
  },
3575
+
3576
+ 'border-left': function(element) {
3577
+ return getPixelValue(element, 'borderLeftWidth');
3578
  },
3579
+
3580
+ 'border-right': function(element) {
3581
+ return getPixelValue(element, 'borderRightWidth');
3582
  },
3583
+
3584
+ 'margin-top': function(element) {
3585
+ return getPixelValue(element, 'marginTop');
3586
  },
3587
+
3588
+ 'margin-bottom': function(element) {
3589
+ return getPixelValue(element, 'marginBottom');
3590
+ },
3591
+
3592
+ 'margin-left': function(element) {
3593
+ return getPixelValue(element, 'marginLeft');
3594
+ },
3595
+
3596
+ 'margin-right': function(element) {
3597
+ return getPixelValue(element, 'marginRight');
 
 
 
 
3598
  }
3599
  }
3600
+ });
3601
 
3602
+ if ('getBoundingClientRect' in document.documentElement) {
3603
+ Object.extend(Element.Layout.COMPUTATIONS, {
3604
+ 'right': function(element) {
3605
+ var parent = hasLayout(element.getOffsetParent());
3606
+ var rect = element.getBoundingClientRect(),
3607
+ pRect = parent.getBoundingClientRect();
 
 
 
 
 
 
 
 
 
 
 
 
3608
 
3609
+ return (pRect.right - rect.right).round();
3610
+ },
3611
+
3612
+ 'bottom': function(element) {
3613
+ var parent = hasLayout(element.getOffsetParent());
3614
+ var rect = element.getBoundingClientRect(),
3615
+ pRect = parent.getBoundingClientRect();
3616
+
3617
+ return (pRect.bottom - rect.bottom).round();
3618
+ }
3619
+ });
3620
+ }
 
 
 
 
 
3621
 
3622
+ Element.Offset = Class.create({
3623
+ initialize: function(left, top) {
3624
+ this.left = left.round();
3625
+ this.top = top.round();
3626
+
3627
+ this[0] = this.left;
3628
+ this[1] = this.top;
3629
  },
3630
 
3631
+ relativeTo: function(offset) {
3632
+ return new Element.Offset(
3633
+ this.left - offset.left,
3634
+ this.top - offset.top
3635
+ );
3636
  },
3637
 
3638
+ inspect: function() {
3639
+ return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this);
3640
  },
3641
 
3642
+ toString: function() {
3643
+ return "[#{left}, #{top}]".interpolate(this);
3644
  },
3645
 
3646
+ toArray: function() {
3647
+ return [this.left, this.top];
 
3648
  }
3649
+ });
3650
 
3651
+ function getLayout(element, preCompute) {
3652
+ return new Element.Layout(element, preCompute);
3653
+ }
 
 
 
 
 
3654
 
3655
+ function measure(element, property) {
3656
+ return $(element).getLayout().get(property);
3657
+ }
 
 
 
 
3658
 
3659
+ function getDimensions(element) {
3660
+ element = $(element);
3661
+ var display = Element.getStyle(element, 'display');
 
 
3662
 
3663
+ if (display && display !== 'none') {
3664
+ return { width: element.offsetWidth, height: element.offsetHeight };
3665
+ }
 
 
 
 
 
 
 
 
 
 
 
 
3666
 
3667
+ var style = element.style;
3668
+ var originalStyles = {
3669
+ visibility: style.visibility,
3670
+ position: style.position,
3671
+ display: style.display
3672
+ };
 
 
 
 
 
3673
 
3674
+ var newStyles = {
3675
+ visibility: 'hidden',
3676
+ display: 'block'
3677
+ };
 
 
 
3678
 
3679
+ if (originalStyles.position !== 'fixed')
3680
+ newStyles.position = 'absolute';
 
 
 
 
 
 
3681
 
3682
+ Element.setStyle(element, newStyles);
 
 
 
 
 
 
3683
 
3684
+ var dimensions = {
3685
+ width: element.offsetWidth,
3686
+ height: element.offsetHeight
3687
+ };
 
 
3688
 
3689
+ Element.setStyle(element, originalStyles);
 
 
 
 
3690
 
3691
+ return dimensions;
3692
+ }
 
 
 
3693
 
3694
+ function getOffsetParent(element) {
3695
+ element = $(element);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3696
 
3697
+ if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
3698
+ return $(document.body);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3699
 
3700
+ var isInline = (Element.getStyle(element, 'display') === 'inline');
3701
+ if (!isInline && element.offsetParent) return $(element.offsetParent);
 
 
3702
 
3703
+ while ((element = element.parentNode) && element !== document.body) {
3704
+ if (Element.getStyle(element, 'position') !== 'static') {
3705
+ return isHtml(element) ? $(document.body) : $(element);
 
 
 
 
 
3706
  }
3707
+ }
 
3708
 
3709
+ return $(document.body);
3710
+ }
 
 
 
 
 
 
3711
 
 
 
 
 
 
 
 
 
 
 
 
3712
 
3713
+ function cumulativeOffset(element) {
3714
+ element = $(element);
3715
+ var valueT = 0, valueL = 0;
3716
+ if (element.parentNode) {
3717
+ do {
3718
+ valueT += element.offsetTop || 0;
3719
+ valueL += element.offsetLeft || 0;
3720
+ element = element.offsetParent;
3721
+ } while (element);
3722
  }
3723
+ return new Element.Offset(valueL, valueT);
3724
+ }
3725
 
3726
+ function positionedOffset(element) {
3727
+ element = $(element);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3728
 
3729
+ var layout = element.getLayout();
 
 
 
 
 
 
 
3730
 
3731
+ var valueT = 0, valueL = 0;
3732
+ do {
3733
+ valueT += element.offsetTop || 0;
3734
+ valueL += element.offsetLeft || 0;
3735
+ element = element.offsetParent;
3736
+ if (element) {
3737
+ if (isBody(element)) break;
3738
+ var p = Element.getStyle(element, 'position');
3739
+ if (p !== 'static') break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3740
  }
3741
+ } while (element);
3742
+
3743
+ valueL -= layout.get('margin-top');
3744
+ valueT -= layout.get('margin-left');
3745
+
3746
+ return new Element.Offset(valueL, valueT);
3747
+ }
3748
+
3749
+ function cumulativeScrollOffset(element) {
3750
+ var valueT = 0, valueL = 0;
3751
+ do {
3752
+ valueT += element.scrollTop || 0;
3753
+ valueL += element.scrollLeft || 0;
3754
+ element = element.parentNode;
3755
+ } while (element);
3756
+ return new Element.Offset(valueL, valueT);
3757
+ }
3758
+
3759
+ function viewportOffset(forElement) {
3760
+ element = $(element);
3761
+ var valueT = 0, valueL = 0, docBody = document.body;
3762
+
3763
+ var element = forElement;
3764
+ do {
3765
+ valueT += element.offsetTop || 0;
3766
+ valueL += element.offsetLeft || 0;
3767
+ if (element.offsetParent == docBody &&
3768
+ Element.getStyle(element, 'position') == 'absolute') break;
3769
+ } while (element = element.offsetParent);
3770
 
3771
+ element = forElement;
3772
+ do {
3773
+ if (element != docBody) {
3774
+ valueT -= element.scrollTop || 0;
3775
+ valueL -= element.scrollLeft || 0;
3776
  }
3777
+ } while (element = element.parentNode);
3778
+ return new Element.Offset(valueL, valueT);
3779
+ }
3780
 
3781
+ function absolutize(element) {
3782
+ element = $(element);
 
 
 
 
 
 
 
3783
 
3784
+ if (Element.getStyle(element, 'position') === 'absolute') {
3785
+ return element;
3786
+ }
 
 
 
3787
 
3788
+ var offsetParent = getOffsetParent(element);
3789
+ var eOffset = element.viewportOffset(),
3790
+ pOffset = offsetParent.viewportOffset();
 
 
3791
 
3792
+ var offset = eOffset.relativeTo(pOffset);
3793
+ var layout = element.getLayout();
3794
+
3795
+ element.store('prototype_absolutize_original_styles', {
3796
+ left: element.getStyle('left'),
3797
+ top: element.getStyle('top'),
3798
+ width: element.getStyle('width'),
3799
+ height: element.getStyle('height')
3800
+ });
3801
+
3802
+ element.setStyle({
3803
+ position: 'absolute',
3804
+ top: offset.top + 'px',
3805
+ left: offset.left + 'px',
3806
+ width: layout.get('width') + 'px',
3807
+ height: layout.get('height') + 'px'
3808
+ });
3809
+
3810
+ return element;
3811
+ }
3812
+
3813
+ function relativize(element) {
3814
+ element = $(element);
3815
+ if (Element.getStyle(element, 'position') === 'relative') {
3816
+ return element;
3817
  }
 
3818
 
3819
+ var originalStyles =
3820
+ element.retrieve('prototype_absolutize_original_styles');
 
 
 
 
 
 
 
 
 
 
3821
 
3822
+ if (originalStyles) element.setStyle(originalStyles);
3823
+ return element;
3824
+ }
3825
+
3826
+ if (Prototype.Browser.IE) {
3827
+ getOffsetParent = getOffsetParent.wrap(
3828
+ function(proceed, element) {
3829
+ element = $(element);
3830
+
3831
+ if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
3832
+ return $(document.body);
3833
+
3834
+ var position = element.getStyle('position');
3835
+ if (position !== 'static') return proceed(element);
3836
+
3837
+ element.setStyle({ position: 'relative' });
3838
+ var value = proceed(element);
3839
+ element.setStyle({ position: position });
3840
+ return value;
3841
+ }
3842
+ );
3843
+
3844
+ positionedOffset = positionedOffset.wrap(function(proceed, element) {
3845
+ element = $(element);
3846
+ if (!element.parentNode) return new Element.Offset(0, 0);
3847
+ var position = element.getStyle('position');
3848
+ if (position !== 'static') return proceed(element);
3849
+
3850
+ var offsetParent = element.getOffsetParent();
3851
+ if (offsetParent && offsetParent.getStyle('position') === 'fixed')
3852
+ hasLayout(offsetParent);
3853
+
3854
+ element.setStyle({ position: 'relative' });
3855
+ var value = proceed(element);
3856
+ element.setStyle({ position: position });
3857
+ return value;
3858
  });
3859
+ } else if (Prototype.Browser.Webkit) {
3860
+ cumulativeOffset = function(element) {
3861
+ element = $(element);
3862
+ var valueT = 0, valueL = 0;
3863
+ do {
3864
+ valueT += element.offsetTop || 0;
3865
+ valueL += element.offsetLeft || 0;
3866
+ if (element.offsetParent == document.body)
3867
+ if (Element.getStyle(element, 'position') == 'absolute') break;
3868
 
3869
+ element = element.offsetParent;
3870
+ } while (element);
 
 
 
 
 
 
3871
 
3872
+ return new Element.Offset(valueL, valueT);
3873
+ };
3874
+ }
3875
+
3876
+
3877
+ Element.addMethods({
3878
+ getLayout: getLayout,
3879
+ measure: measure,
3880
+ getDimensions: getDimensions,
3881
+ getOffsetParent: getOffsetParent,
3882
+ cumulativeOffset: cumulativeOffset,
3883
+ positionedOffset: positionedOffset,
3884
+ cumulativeScrollOffset: cumulativeScrollOffset,
3885
+ viewportOffset: viewportOffset,
3886
+ absolutize: absolutize,
3887
+ relativize: relativize
3888
+ });
3889
+
3890
+ function isBody(element) {
3891
+ return element.nodeName.toUpperCase() === 'BODY';
3892
+ }
3893
+
3894
+ function isHtml(element) {
3895
+ return element.nodeName.toUpperCase() === 'HTML';
3896
+ }
3897
+
3898
+ function isDocument(element) {
3899
+ return element.nodeType === Node.DOCUMENT_NODE;
3900
+ }
3901
+
3902
+ function isDetached(element) {
3903
+ return element !== document.body &&
3904
+ !Element.descendantOf(element, document.body);
3905
+ }
3906
+
3907
+ if ('getBoundingClientRect' in document.documentElement) {
3908
+ Element.addMethods({
3909
+ viewportOffset: function(element) {
3910
+ element = $(element);
3911
+ if (isDetached(element)) return new Element.Offset(0, 0);
3912
+
3913
+ var rect = element.getBoundingClientRect(),
3914
+ docEl = document.documentElement;
3915
+ return new Element.Offset(rect.left - docEl.clientLeft,
3916
+ rect.top - docEl.clientTop);
3917
+ }
3918
+ });
3919
+ }
3920
+ })();
3921
+ window.$$ = function() {
3922
+ var expression = $A(arguments).join(', ');
3923
+ return Prototype.Selector.select(expression, document);
3924
+ };
3925
+
3926
+ Prototype.Selector = (function() {
3927
+
3928
+ function select() {
3929
+ throw new Error('Method "Prototype.Selector.select" must be defined.');
3930
+ }
3931
+
3932
+ function match() {
3933
+ throw new Error('Method "Prototype.Selector.match" must be defined.');
3934
+ }
3935
+
3936
+ function find(elements, expression, index) {
3937
+ index = index || 0;
3938
+ var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i;
3939
+
3940
+ for (i = 0; i < length; i++) {
3941
+ if (match(elements[i], expression) && index == matchIndex++) {
3942
+ return Element.extend(elements[i]);
3943
+ }
3944
  }
3945
+ }
 
3946
 
3947
+ function extendElements(elements) {
3948
+ for (var i = 0, length = elements.length; i < length; i++) {
3949
+ Element.extend(elements[i]);
 
 
 
3950
  }
3951
+ return elements;
3952
  }
3953
+
3954
+
3955
+ var K = Prototype.K;
3956
+
3957
+ return {
3958
+ select: select,
3959
+ match: match,
3960
+ find: find,
3961
+ extendElements: (Element.extend === K) ? K : extendElements,
3962
+ extendElement: Element.extend
3963
+ };
3964
+ })();
3965
+ Prototype._original_property = window.Sizzle;
3966
+ /*!
3967
+ * Sizzle CSS Selector Engine - v1.0
3968
+ * Copyright 2009, The Dojo Foundation
3969
+ * Released under the MIT, BSD, and GPL Licenses.
3970
+ * More information: http://sizzlejs.com/
3971
+ */
3972
+ (function(){
3973
+
3974
+ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3975
+ done = 0,
3976
+ toString = Object.prototype.toString,
3977
+ hasDuplicate = false,
3978
+ baseHasDuplicate = true;
3979
+
3980
+ [0, 0].sort(function(){
3981
+ baseHasDuplicate = false;
3982
+ return 0;
3983
  });
3984
 
3985
+ var Sizzle = function(selector, context, results, seed) {
3986
+ results = results || [];
3987
+ var origContext = context = context || document;
3988
+
3989
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3990
+ return [];
3991
+ }
3992
+
3993
+ if ( !selector || typeof selector !== "string" ) {
3994
+ return results;
3995
+ }
3996
+
3997
+ var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context),
3998
+ soFar = selector;
3999
+
4000
+ while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
4001
+ soFar = m[3];
4002
+
4003
+ parts.push( m[1] );
4004
+
4005
+ if ( m[2] ) {
4006
+ extra = m[3];
4007
+ break;
4008
+ }
4009
+ }
4010
+
4011
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
4012
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
4013
+ set = posProcess( parts[0] + parts[1], context );
4014
+ } else {
4015
+ set = Expr.relative[ parts[0] ] ?
4016
+ [ context ] :
4017
+ Sizzle( parts.shift(), context );
4018
+
4019
+ while ( parts.length ) {
4020
+ selector = parts.shift();
4021
+
4022
+ if ( Expr.relative[ selector ] )
4023
+ selector += parts.shift();
4024
+
4025
+ set = posProcess( selector, set );
4026
+ }
4027
+ }
4028
+ } else {
4029
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
4030
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
4031
+ var ret = Sizzle.find( parts.shift(), context, contextXML );
4032
+ context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
4033
+ }
4034
+
4035
+ if ( context ) {
4036
+ var ret = seed ?
4037
+ { expr: parts.pop(), set: makeArray(seed) } :
4038
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
4039
+ set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
4040
+
4041
+ if ( parts.length > 0 ) {
4042
+ checkSet = makeArray(set);
4043
+ } else {
4044
+ prune = false;
4045
+ }
4046
+
4047
+ while ( parts.length ) {
4048
+ var cur = parts.pop(), pop = cur;
4049
+
4050
+ if ( !Expr.relative[ cur ] ) {
4051
+ cur = "";
4052
+ } else {
4053
+ pop = parts.pop();
4054
+ }
4055
+
4056
+ if ( pop == null ) {
4057
+ pop = context;
4058
+ }
4059
+
4060
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
4061
+ }
4062
+ } else {
4063
+ checkSet = parts = [];
4064
+ }
4065
+ }
4066
+
4067
+ if ( !checkSet ) {
4068
+ checkSet = set;
4069
+ }
4070
+
4071
+ if ( !checkSet ) {
4072
+ throw "Syntax error, unrecognized expression: " + (cur || selector);
4073
+ }
4074
+
4075
+ if ( toString.call(checkSet) === "[object Array]" ) {
4076
+ if ( !prune ) {
4077
+ results.push.apply( results, checkSet );
4078
+ } else if ( context && context.nodeType === 1 ) {
4079
+ for ( var i = 0; checkSet[i] != null; i++ ) {
4080
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
4081
+ results.push( set[i] );
4082
+ }
4083
+ }
4084
+ } else {
4085
+ for ( var i = 0; checkSet[i] != null; i++ ) {
4086
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
4087
+ results.push( set[i] );
4088
+ }
4089
+ }
4090
+ }
4091
+ } else {
4092
+ makeArray( checkSet, results );
4093
+ }
4094
+
4095
+ if ( extra ) {
4096
+ Sizzle( extra, origContext, results, seed );
4097
+ Sizzle.uniqueSort( results );
4098
+ }
4099
+
4100
+ return results;
4101
+ };
4102
 
4103
+ Sizzle.uniqueSort = function(results){
4104
+ if ( sortOrder ) {
4105
+ hasDuplicate = baseHasDuplicate;
4106
+ results.sort(sortOrder);
4107
+
4108
+ if ( hasDuplicate ) {
4109
+ for ( var i = 1; i < results.length; i++ ) {
4110
+ if ( results[i] === results[i-1] ) {
4111
+ results.splice(i--, 1);
4112
+ }
4113
+ }
4114
+ }
4115
+ }
4116
+
4117
+ return results;
4118
+ };
4119
+
4120
+ Sizzle.matches = function(expr, set){
4121
+ return Sizzle(expr, null, null, set);
4122
+ };
4123
+
4124
+ Sizzle.find = function(expr, context, isXML){
4125
+ var set, match;
4126
+
4127
+ if ( !expr ) {
4128
+ return [];
4129
+ }
4130
+
4131
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
4132
+ var type = Expr.order[i], match;
4133
+
4134
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4135
+ var left = match[1];
4136
+ match.splice(1,1);
4137
+
4138
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
4139
+ match[1] = (match[1] || "").replace(/\\/g, "");
4140
+ set = Expr.find[ type ]( match, context, isXML );
4141
+ if ( set != null ) {
4142
+ expr = expr.replace( Expr.match[ type ], "" );
4143
+ break;
4144
+ }
4145
+ }
4146
+ }
4147
+ }
4148
+
4149
+ if ( !set ) {
4150
+ set = context.getElementsByTagName("*");
4151
+ }
4152
+
4153
+ return {set: set, expr: expr};
4154
+ };
4155
+
4156
+ Sizzle.filter = function(expr, set, inplace, not){
4157
+ var old = expr, result = [], curLoop = set, match, anyFound,
4158
+ isXMLFilter = set && set[0] && isXML(set[0]);
4159
+
4160
+ while ( expr && set.length ) {
4161
+ for ( var type in Expr.filter ) {
4162
+ if ( (match = Expr.match[ type ].exec( expr )) != null ) {
4163
+ var filter = Expr.filter[ type ], found, item;
4164
+ anyFound = false;
4165
+
4166
+ if ( curLoop == result ) {
4167
+ result = [];
4168
+ }
4169
+
4170
+ if ( Expr.preFilter[ type ] ) {
4171
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4172
+
4173
+ if ( !match ) {
4174
+ anyFound = found = true;
4175
+ } else if ( match === true ) {
4176
+ continue;
4177
+ }
4178
+ }
4179
+
4180
+ if ( match ) {
4181
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
4182
+ if ( item ) {
4183
+ found = filter( item, match, i, curLoop );
4184
+ var pass = not ^ !!found;
4185
+
4186
+ if ( inplace && found != null ) {
4187
+ if ( pass ) {
4188
+ anyFound = true;
4189
+ } else {
4190
+ curLoop[i] = false;
4191
+ }
4192
+ } else if ( pass ) {
4193
+ result.push( item );
4194
+ anyFound = true;
4195
+ }
4196
+ }
4197
+ }
4198
+ }
4199
+
4200
+ if ( found !== undefined ) {
4201
+ if ( !inplace ) {
4202
+ curLoop = result;
4203
+ }
4204
+
4205
+ expr = expr.replace( Expr.match[ type ], "" );
4206
+
4207
+ if ( !anyFound ) {
4208
+ return [];
4209
+ }
4210
+
4211
+ break;
4212
+ }
4213
+ }
4214
+ }
4215
+
4216
+ if ( expr == old ) {
4217
+ if ( anyFound == null ) {
4218
+ throw "Syntax error, unrecognized expression: " + expr;
4219
+ } else {
4220
+ break;
4221
+ }
4222
+ }
4223
+
4224
+ old = expr;
4225
+ }
4226
+
4227
+ return curLoop;
4228
+ };
4229
+
4230
+ var Expr = Sizzle.selectors = {
4231
+ order: [ "ID", "NAME", "TAG" ],
4232
+ match: {
4233
+ ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
4234
+ CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
4235
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
4236
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
4237
+ TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
4238
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
4239
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
4240
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
4241
+ },
4242
+ leftMatch: {},
4243
+ attrMap: {
4244
+ "class": "className",
4245
+ "for": "htmlFor"
4246
+ },
4247
+ attrHandle: {
4248
+ href: function(elem){
4249
+ return elem.getAttribute("href");
4250
+ }
4251
+ },
4252
+ relative: {
4253
+ "+": function(checkSet, part, isXML){
4254
+ var isPartStr = typeof part === "string",
4255
+ isTag = isPartStr && !/\W/.test(part),
4256
+ isPartStrNotTag = isPartStr && !isTag;
4257
+
4258
+ if ( isTag && !isXML ) {
4259
+ part = part.toUpperCase();
4260
+ }
4261
+
4262
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4263
+ if ( (elem = checkSet[i]) ) {
4264
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4265
+
4266
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
4267
+ elem || false :
4268
+ elem === part;
4269
+ }
4270
+ }
4271
+
4272
+ if ( isPartStrNotTag ) {
4273
+ Sizzle.filter( part, checkSet, true );
4274
+ }
4275
+ },
4276
+ ">": function(checkSet, part, isXML){
4277
+ var isPartStr = typeof part === "string";
4278
+
4279
+ if ( isPartStr && !/\W/.test(part) ) {
4280
+ part = isXML ? part : part.toUpperCase();
4281
+
4282
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4283
+ var elem = checkSet[i];
4284
+ if ( elem ) {
4285
+ var parent = elem.parentNode;
4286
+ checkSet[i] = parent.nodeName === part ? parent : false;
4287
+ }
4288
+ }
4289
+ } else {
4290
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4291
+ var elem = checkSet[i];
4292
+ if ( elem ) {
4293
+ checkSet[i] = isPartStr ?
4294
+ elem.parentNode :
4295
+ elem.parentNode === part;
4296
+ }
4297
+ }
4298
+
4299
+ if ( isPartStr ) {
4300
+ Sizzle.filter( part, checkSet, true );
4301
+ }
4302
+ }
4303
+ },
4304
+ "": function(checkSet, part, isXML){
4305
+ var doneName = done++, checkFn = dirCheck;
4306
+
4307
+ if ( !/\W/.test(part) ) {
4308
+ var nodeCheck = part = isXML ? part : part.toUpperCase();
4309
+ checkFn = dirNodeCheck;
4310
+ }
4311
+
4312
+ checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
4313
+ },
4314
+ "~": function(checkSet, part, isXML){
4315
+ var doneName = done++, checkFn = dirCheck;
4316
+
4317
+ if ( typeof part === "string" && !/\W/.test(part) ) {
4318
+ var nodeCheck = part = isXML ? part : part.toUpperCase();
4319
+ checkFn = dirNodeCheck;
4320
+ }
4321
+
4322
+ checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
4323
+ }
4324
+ },
4325
+ find: {
4326
+ ID: function(match, context, isXML){
4327
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
4328
+ var m = context.getElementById(match[1]);
4329
+ return m ? [m] : [];
4330
+ }
4331
+ },
4332
+ NAME: function(match, context, isXML){
4333
+ if ( typeof context.getElementsByName !== "undefined" ) {
4334
+ var ret = [], results = context.getElementsByName(match[1]);
4335
+
4336
+ for ( var i = 0, l = results.length; i < l; i++ ) {
4337
+ if ( results[i].getAttribute("name") === match[1] ) {
4338
+ ret.push( results[i] );
4339
+ }
4340
+ }
4341
+
4342
+ return ret.length === 0 ? null : ret;
4343
+ }
4344
+ },
4345
+ TAG: function(match, context){
4346
+ return context.getElementsByTagName(match[1]);
4347
+ }
4348
+ },
4349
+ preFilter: {
4350
+ CLASS: function(match, curLoop, inplace, result, not, isXML){
4351
+ match = " " + match[1].replace(/\\/g, "") + " ";
4352
+
4353
+ if ( isXML ) {
4354
+ return match;
4355
+ }
4356
+
4357
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4358
+ if ( elem ) {
4359
+ if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
4360
+ if ( !inplace )
4361
+ result.push( elem );
4362
+ } else if ( inplace ) {
4363
+ curLoop[i] = false;
4364
+ }
4365
+ }
4366
+ }
4367
+
4368
+ return false;
4369
+ },
4370
+ ID: function(match){
4371
+ return match[1].replace(/\\/g, "");
4372
+ },
4373
+ TAG: function(match, curLoop){
4374
+ for ( var i = 0; curLoop[i] === false; i++ ){}
4375
+ return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
4376
+ },
4377
+ CHILD: function(match){
4378
+ if ( match[1] == "nth" ) {
4379
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
4380
+ match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
4381
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4382
+
4383
+ match[2] = (test[1] + (test[2] || 1)) - 0;
4384
+ match[3] = test[3] - 0;
4385
+ }
4386
+
4387
+ match[0] = done++;
4388
+
4389
+ return match;
4390
+ },
4391
+ ATTR: function(match, curLoop, inplace, result, not, isXML){
4392
+ var name = match[1].replace(/\\/g, "");
4393
+
4394
+ if ( !isXML && Expr.attrMap[name] ) {
4395
+ match[1] = Expr.attrMap[name];
4396
+ }
4397
+
4398
+ if ( match[2] === "~=" ) {
4399
+ match[4] = " " + match[4] + " ";
4400
+ }
4401
+
4402
+ return match;
4403
+ },
4404
+ PSEUDO: function(match, curLoop, inplace, result, not){
4405
+ if ( match[1] === "not" ) {
4406
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4407
+ match[3] = Sizzle(match[3], null, null, curLoop);
4408
+ } else {
4409
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4410
+ if ( !inplace ) {
4411
+ result.push.apply( result, ret );
4412
+ }
4413
+ return false;
4414
+ }
4415
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4416
+ return true;
4417
+ }
4418
+
4419
+ return match;
4420
+ },
4421
+ POS: function(match){
4422
+ match.unshift( true );
4423
+ return match;
4424
+ }
4425
+ },
4426
+ filters: {
4427
+ enabled: function(elem){
4428
+ return elem.disabled === false && elem.type !== "hidden";
4429
+ },
4430
+ disabled: function(elem){
4431
+ return elem.disabled === true;
4432
+ },
4433
+ checked: function(elem){
4434
+ return elem.checked === true;
4435
+ },
4436
+ selected: function(elem){
4437
+ elem.parentNode.selectedIndex;
4438
+ return elem.selected === true;
4439
+ },
4440
+ parent: function(elem){
4441
+ return !!elem.firstChild;
4442
+ },
4443
+ empty: function(elem){
4444
+ return !elem.firstChild;
4445
+ },
4446
+ has: function(elem, i, match){
4447
+ return !!Sizzle( match[3], elem ).length;
4448
+ },
4449
+ header: function(elem){
4450
+ return /h\d/i.test( elem.nodeName );
4451
+ },
4452
+ text: function(elem){
4453
+ return "text" === elem.type;
4454
+ },
4455
+ radio: function(elem){
4456
+ return "radio" === elem.type;
4457
+ },
4458
+ checkbox: function(elem){
4459
+ return "checkbox" === elem.type;
4460
+ },
4461
+ file: function(elem){
4462
+ return "file" === elem.type;
4463
+ },
4464
+ password: function(elem){
4465
+ return "password" === elem.type;
4466
+ },
4467
+ submit: function(elem){
4468
+ return "submit" === elem.type;
4469
+ },
4470
+ image: function(elem){
4471
+ return "image" === elem.type;
4472
+ },
4473
+ reset: function(elem){
4474
+ return "reset" === elem.type;
4475
+ },
4476
+ button: function(elem){
4477
+ return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
4478
+ },
4479
+ input: function(elem){
4480
+ return /input|select|textarea|button/i.test(elem.nodeName);
4481
+ }
4482
+ },
4483
+ setFilters: {
4484
+ first: function(elem, i){
4485
+ return i === 0;
4486
+ },
4487
+ last: function(elem, i, match, array){
4488
+ return i === array.length - 1;
4489
+ },
4490
+ even: function(elem, i){
4491
+ return i % 2 === 0;
4492
+ },
4493
+ odd: function(elem, i){
4494
+ return i % 2 === 1;
4495
+ },
4496
+ lt: function(elem, i, match){
4497
+ return i < match[3] - 0;
4498
+ },
4499
+ gt: function(elem, i, match){
4500
+ return i > match[3] - 0;
4501
+ },
4502
+ nth: function(elem, i, match){
4503
+ return match[3] - 0 == i;
4504
+ },
4505
+ eq: function(elem, i, match){
4506
+ return match[3] - 0 == i;
4507
+ }
4508
+ },
4509
+ filter: {
4510
+ PSEUDO: function(elem, match, i, array){
4511
+ var name = match[1], filter = Expr.filters[ name ];
4512
+
4513
+ if ( filter ) {
4514
+ return filter( elem, i, match, array );
4515
+ } else if ( name === "contains" ) {
4516
+ return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
4517
+ } else if ( name === "not" ) {
4518
+ var not = match[3];
4519
+
4520
+ for ( var i = 0, l = not.length; i < l; i++ ) {
4521
+ if ( not[i] === elem ) {
4522
+ return false;
4523
+ }
4524
+ }
4525
+
4526
+ return true;
4527
+ }
4528
+ },
4529
+ CHILD: function(elem, match){
4530
+ var type = match[1], node = elem;
4531
+ switch (type) {
4532
+ case 'only':
4533
+ case 'first':
4534
+ while ( (node = node.previousSibling) ) {
4535
+ if ( node.nodeType === 1 ) return false;
4536
+ }
4537
+ if ( type == 'first') return true;
4538
+ node = elem;
4539
+ case 'last':
4540
+ while ( (node = node.nextSibling) ) {
4541
+ if ( node.nodeType === 1 ) return false;
4542
+ }
4543
+ return true;
4544
+ case 'nth':
4545
+ var first = match[2], last = match[3];
4546
+
4547
+ if ( first == 1 && last == 0 ) {
4548
+ return true;
4549
+ }
4550
+
4551
+ var doneName = match[0],
4552
+ parent = elem.parentNode;
4553
+
4554
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
4555
+ var count = 0;
4556
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
4557
+ if ( node.nodeType === 1 ) {
4558
+ node.nodeIndex = ++count;
4559
+ }
4560
+ }
4561
+ parent.sizcache = doneName;
4562
+ }
4563
+
4564
+ var diff = elem.nodeIndex - last;
4565
+ if ( first == 0 ) {
4566
+ return diff == 0;
4567
+ } else {
4568
+ return ( diff % first == 0 && diff / first >= 0 );
4569
+ }
4570
+ }
4571
+ },
4572
+ ID: function(elem, match){
4573
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
4574
+ },
4575
+ TAG: function(elem, match){
4576
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
4577
+ },
4578
+ CLASS: function(elem, match){
4579
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
4580
+ .indexOf( match ) > -1;
4581
+ },
4582
+ ATTR: function(elem, match){
4583
+ var name = match[1],
4584
+ result = Expr.attrHandle[ name ] ?
4585
+ Expr.attrHandle[ name ]( elem ) :
4586
+ elem[ name ] != null ?
4587
+ elem[ name ] :
4588
+ elem.getAttribute( name ),
4589
+ value = result + "",
4590
+ type = match[2],
4591
+ check = match[4];
4592
+
4593
+ return result == null ?
4594
+ type === "!=" :
4595
+ type === "=" ?
4596
+ value === check :
4597
+ type === "*=" ?
4598
+ value.indexOf(check) >= 0 :
4599
+ type === "~=" ?
4600
+ (" " + value + " ").indexOf(check) >= 0 :
4601
+ !check ?
4602
+ value && result !== false :
4603
+ type === "!=" ?
4604
+ value != check :
4605
+ type === "^=" ?
4606
+ value.indexOf(check) === 0 :
4607
+ type === "$=" ?
4608
+ value.substr(value.length - check.length) === check :
4609
+ type === "|=" ?
4610
+ value === check || value.substr(0, check.length + 1) === check + "-" :
4611
+ false;
4612
+ },
4613
+ POS: function(elem, match, i, array){
4614
+ var name = match[2], filter = Expr.setFilters[ name ];
4615
+
4616
+ if ( filter ) {
4617
+ return filter( elem, i, match, array );
4618
+ }
4619
+ }
4620
+ }
4621
+ };
4622
+
4623
+ var origPOS = Expr.match.POS;
4624
+
4625
+ for ( var type in Expr.match ) {
4626
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
4627
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source );
4628
+ }
4629
+
4630
+ var makeArray = function(array, results) {
4631
+ array = Array.prototype.slice.call( array, 0 );
4632
+
4633
+ if ( results ) {
4634
+ results.push.apply( results, array );
4635
+ return results;
4636
+ }
4637
+
4638
+ return array;
4639
+ };
4640
+
4641
+ try {
4642
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 );
4643
+
4644
+ } catch(e){
4645
+ makeArray = function(array, results) {
4646
+ var ret = results || [];
4647
+
4648
+ if ( toString.call(array) === "[object Array]" ) {
4649
+ Array.prototype.push.apply( ret, array );
4650
+ } else {
4651
+ if ( typeof array.length === "number" ) {
4652
+ for ( var i = 0, l = array.length; i < l; i++ ) {
4653
+ ret.push( array[i] );
4654
+ }
4655
+ } else {
4656
+ for ( var i = 0; array[i]; i++ ) {
4657
+ ret.push( array[i] );
4658
+ }
4659
+ }
4660
+ }
4661
+
4662
+ return ret;
4663
+ };
4664
  }
4665
 
4666
+ var sortOrder;
4667
+
4668
+ if ( document.documentElement.compareDocumentPosition ) {
4669
+ sortOrder = function( a, b ) {
4670
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4671
+ if ( a == b ) {
4672
+ hasDuplicate = true;
4673
+ }
4674
+ return 0;
4675
+ }
4676
+
4677
+ var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
4678
+ if ( ret === 0 ) {
4679
+ hasDuplicate = true;
4680
+ }
4681
+ return ret;
4682
+ };
4683
+ } else if ( "sourceIndex" in document.documentElement ) {
4684
+ sortOrder = function( a, b ) {
4685
+ if ( !a.sourceIndex || !b.sourceIndex ) {
4686
+ if ( a == b ) {
4687
+ hasDuplicate = true;
4688
+ }
4689
+ return 0;
4690
+ }
4691
+
4692
+ var ret = a.sourceIndex - b.sourceIndex;
4693
+ if ( ret === 0 ) {
4694
+ hasDuplicate = true;
4695
+ }
4696
+ return ret;
4697
+ };
4698
+ } else if ( document.createRange ) {
4699
+ sortOrder = function( a, b ) {
4700
+ if ( !a.ownerDocument || !b.ownerDocument ) {
4701
+ if ( a == b ) {
4702
+ hasDuplicate = true;
4703
+ }
4704
+ return 0;
4705
+ }
4706
+
4707
+ var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
4708
+ aRange.setStart(a, 0);
4709
+ aRange.setEnd(a, 0);
4710
+ bRange.setStart(b, 0);
4711
+ bRange.setEnd(b, 0);
4712
+ var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
4713
+ if ( ret === 0 ) {
4714
+ hasDuplicate = true;
4715
+ }
4716
+ return ret;
4717
+ };
4718
  }
4719
+
4720
+ (function(){
4721
+ var form = document.createElement("div"),
4722
+ id = "script" + (new Date).getTime();
4723
+ form.innerHTML = "<a name='" + id + "'/>";
4724
+
4725
+ var root = document.documentElement;
4726
+ root.insertBefore( form, root.firstChild );
4727
+
4728
+ if ( !!document.getElementById( id ) ) {
4729
+ Expr.find.ID = function(match, context, isXML){
4730
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
4731
+ var m = context.getElementById(match[1]);
4732
+ return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
4733
+ }
4734
+ };
4735
+
4736
+ Expr.filter.ID = function(elem, match){
4737
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4738
+ return elem.nodeType === 1 && node && node.nodeValue === match;
4739
+ };
4740
+ }
4741
+
4742
+ root.removeChild( form );
4743
+ root = form = null; // release memory in IE
4744
+ })();
4745
+
4746
+ (function(){
4747
+
4748
+ var div = document.createElement("div");
4749
+ div.appendChild( document.createComment("") );
4750
+
4751
+ if ( div.getElementsByTagName("*").length > 0 ) {
4752
+ Expr.find.TAG = function(match, context){
4753
+ var results = context.getElementsByTagName(match[1]);
4754
+
4755
+ if ( match[1] === "*" ) {
4756
+ var tmp = [];
4757
+
4758
+ for ( var i = 0; results[i]; i++ ) {
4759
+ if ( results[i].nodeType === 1 ) {
4760
+ tmp.push( results[i] );
4761
+ }
4762
+ }
4763
+
4764
+ results = tmp;
4765
+ }
4766
+
4767
+ return results;
4768
+ };
4769
+ }
4770
+
4771
+ div.innerHTML = "<a href='#'></a>";
4772
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4773
+ div.firstChild.getAttribute("href") !== "#" ) {
4774
+ Expr.attrHandle.href = function(elem){
4775
+ return elem.getAttribute("href", 2);
4776
+ };
4777
+ }
4778
+
4779
+ div = null; // release memory in IE
4780
+ })();
4781
+
4782
+ if ( document.querySelectorAll ) (function(){
4783
+ var oldSizzle = Sizzle, div = document.createElement("div");
4784
+ div.innerHTML = "<p class='TEST'></p>";
4785
+
4786
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4787
+ return;
4788
+ }
4789
+
4790
+ Sizzle = function(query, context, extra, seed){
4791
+ context = context || document;
4792
+
4793
+ if ( !seed && context.nodeType === 9 && !isXML(context) ) {
4794
+ try {
4795
+ return makeArray( context.querySelectorAll(query), extra );
4796
+ } catch(e){}
4797
+ }
4798
+
4799
+ return oldSizzle(query, context, extra, seed);
4800
+ };
4801
+
4802
+ for ( var prop in oldSizzle ) {
4803
+ Sizzle[ prop ] = oldSizzle[ prop ];
4804
+ }
4805
+
4806
+ div = null; // release memory in IE
4807
+ })();
4808
+
4809
+ if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
4810
+ var div = document.createElement("div");
4811
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
4812
+
4813
+ if ( div.getElementsByClassName("e").length === 0 )
4814
+ return;
4815
+
4816
+ div.lastChild.className = "e";
4817
+
4818
+ if ( div.getElementsByClassName("e").length === 1 )
4819
+ return;
4820
+
4821
+ Expr.order.splice(1, 0, "CLASS");
4822
+ Expr.find.CLASS = function(match, context, isXML) {
4823
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
4824
+ return context.getElementsByClassName(match[1]);
4825
+ }
4826
+ };
4827
+
4828
+ div = null; // release memory in IE
4829
+ })();
4830
+
4831
+ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4832
+ var sibDir = dir == "previousSibling" && !isXML;
4833
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4834
+ var elem = checkSet[i];
4835
+ if ( elem ) {
4836
+ if ( sibDir && elem.nodeType === 1 ){
4837
+ elem.sizcache = doneName;
4838
+ elem.sizset = i;
4839
+ }
4840
+ elem = elem[dir];
4841
+ var match = false;
4842
+
4843
+ while ( elem ) {
4844
+ if ( elem.sizcache === doneName ) {
4845
+ match = checkSet[elem.sizset];
4846
+ break;
4847
+ }
4848
+
4849
+ if ( elem.nodeType === 1 && !isXML ){
4850
+ elem.sizcache = doneName;
4851
+ elem.sizset = i;
4852
+ }
4853
+
4854
+ if ( elem.nodeName === cur ) {
4855
+ match = elem;
4856
+ break;
4857
+ }
4858
+
4859
+ elem = elem[dir];
4860
+ }
4861
+
4862
+ checkSet[i] = match;
4863
+ }
4864
+ }
4865
+ }
4866
+
4867
+ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4868
+ var sibDir = dir == "previousSibling" && !isXML;
4869
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4870
+ var elem = checkSet[i];
4871
+ if ( elem ) {
4872
+ if ( sibDir && elem.nodeType === 1 ) {
4873
+ elem.sizcache = doneName;
4874
+ elem.sizset = i;
4875
+ }
4876
+ elem = elem[dir];
4877
+ var match = false;
4878
+
4879
+ while ( elem ) {
4880
+ if ( elem.sizcache === doneName ) {
4881
+ match = checkSet[elem.sizset];
4882
+ break;
4883
+ }
4884
+
4885
+ if ( elem.nodeType === 1 ) {
4886
+ if ( !isXML ) {
4887
+ elem.sizcache = doneName;
4888
+ elem.sizset = i;
4889
+ }
4890
+ if ( typeof cur !== "string" ) {
4891
+ if ( elem === cur ) {
4892
+ match = true;
4893
+ break;
4894
+ }
4895
+
4896
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
4897
+ match = elem;
4898
+ break;
4899
+ }
4900
+ }
4901
+
4902
+ elem = elem[dir];
4903
+ }
4904
+
4905
+ checkSet[i] = match;
4906
+ }
4907
+ }
4908
+ }
4909
+
4910
+ var contains = document.compareDocumentPosition ? function(a, b){
4911
+ return a.compareDocumentPosition(b) & 16;
4912
+ } : function(a, b){
4913
+ return a !== b && (a.contains ? a.contains(b) : true);
4914
+ };
4915
+
4916
+ var isXML = function(elem){
4917
+ return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
4918
+ !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
4919
+ };
4920
+
4921
+ var posProcess = function(selector, context){
4922
+ var tmpSet = [], later = "", match,
4923
+ root = context.nodeType ? [context] : context;
4924
+
4925
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
4926
+ later += match[0];
4927
+ selector = selector.replace( Expr.match.PSEUDO, "" );
4928
+ }
4929
+
4930
+ selector = Expr.relative[selector] ? selector + "*" : selector;
4931
+
4932
+ for ( var i = 0, l = root.length; i < l; i++ ) {
4933
+ Sizzle( selector, root[i], tmpSet );
4934
+ }
4935
+
4936
+ return Sizzle.filter( later, tmpSet );
4937
+ };
4938
+
4939
+
4940
+ window.Sizzle = Sizzle;
4941
+
4942
+ })();
4943
+
4944
+ ;(function(engine) {
4945
+ var extendElements = Prototype.Selector.extendElements;
4946
+
4947
+ function select(selector, scope) {
4948
+ return extendElements(engine(selector, scope || document));
4949
+ }
4950
+
4951
+ function match(element, selector) {
4952
+ return engine.matches(selector, [element]).length == 1;
4953
+ }
4954
+
4955
+ Prototype.Selector.engine = engine;
4956
+ Prototype.Selector.select = select;
4957
+ Prototype.Selector.match = match;
4958
+ })(Sizzle);
4959
+
4960
+ window.Sizzle = Prototype._original_property;
4961
+ delete Prototype._original_property;
4962
+
4963
  var Form = {
4964
  reset: function(form) {
4965
+ form = $(form);
4966
+ form.reset();
4967
  return form;
4968
  },
4969
 
4970
  serializeElements: function(elements, options) {
4971
  if (typeof options != 'object') options = { hash: !!options };
4972
  else if (Object.isUndefined(options.hash)) options.hash = true;
4973
+ var key, value, submitted = false, submit = options.submit, accumulator, initial;
4974
+
4975
+ if (options.hash) {
4976
+ initial = {};
4977
+ accumulator = function(result, key, value) {
4978
+ if (key in result) {
4979
+ if (!Object.isArray(result[key])) result[key] = [result[key]];
4980
+ result[key].push(value);
4981
+ } else result[key] = value;
4982
+ return result;
4983
+ };
4984
+ } else {
4985
+ initial = '';
4986
+ accumulator = function(result, key, value) {
4987
+ return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value);
4988
+ }
4989
+ }
4990
 
4991
+ return elements.inject(initial, function(result, element) {
4992
  if (!element.disabled && element.name) {
4993
  key = element.name; value = $(element).getValue();
4994
  if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
4995
  submit !== false && (!submit || key == submit) && (submitted = true)))) {
4996
+ result = accumulator(result, key, value);
 
 
 
 
 
4997
  }
4998
  }
4999
  return result;
5000
  });
 
 
5001
  }
5002
  };
5003
 
5007
  },
5008
 
5009
  getElements: function(form) {
5010
+ var elements = $(form).getElementsByTagName('*'),
5011
+ element,
5012
+ arr = [ ],
5013
+ serializers = Form.Element.Serializers;
5014
+ for (var i = 0; element = elements[i]; i++) {
5015
+ arr.push(element);
5016
+ }
5017
+ return arr.inject([], function(elements, child) {
5018
+ if (serializers[child.tagName.toLowerCase()])
5019
+ elements.push(Element.extend(child));
5020
+ return elements;
5021
+ })
5022
  },
5023
 
5024
  getInputs: function(form, typeName, name) {
5058
  }).sortBy(function(element) { return element.tabIndex }).first();
5059
 
5060
  return firstByIndex ? firstByIndex : elements.find(function(element) {
5061
+ return /^(?:input|select|textarea)$/i.test(element.tagName);
5062
  });
5063
  },
5064
 
5065
  focusFirstElement: function(form) {
5066
  form = $(form);
5067
+ var element = form.findFirstElement();
5068
+ if (element) element.activate();
5069
  return form;
5070
  },
5071
 
5090
 
5091
  /*--------------------------------------------------------------------------*/
5092
 
5093
+
5094
  Form.Element = {
5095
  focus: function(element) {
5096
  $(element).focus();
5104
  };
5105
 
5106
  Form.Element.Methods = {
5107
+
5108
  serialize: function(element) {
5109
  element = $(element);
5110
  if (!element.disabled && element.name) {
5145
  try {
5146
  element.focus();
5147
  if (element.select && (element.tagName.toLowerCase() != 'input' ||
5148
+ !(/^(?:button|reset|submit)$/i.test(element.type))))
5149
  element.select();
5150
  } catch (e) { }
5151
  return element;
5167
  /*--------------------------------------------------------------------------*/
5168
 
5169
  var Field = Form.Element;
5170
+
5171
  var $F = Form.Element.Methods.getValue;
5172
 
5173
  /*--------------------------------------------------------------------------*/
5174
 
5175
+ Form.Element.Serializers = (function() {
5176
+ function input(element, value) {
5177
  switch (element.type.toLowerCase()) {
5178
  case 'checkbox':
5179
  case 'radio':
5180
+ return inputSelector(element, value);
5181
  default:
5182
+ return valueSelector(element, value);
5183
  }
5184
+ }
5185
 
5186
+ function inputSelector(element, value) {
5187
+ if (Object.isUndefined(value))
5188
+ return element.checked ? element.value : null;
5189
  else element.checked = !!value;
5190
+ }
5191
 
5192
+ function valueSelector(element, value) {
5193
  if (Object.isUndefined(value)) return element.value;
5194
  else element.value = value;
5195
+ }
5196
 
5197
+ function select(element, value) {
5198
  if (Object.isUndefined(value))
5199
+ return (element.type === 'select-one' ? selectOne : selectMany)(element);
5200
+
5201
+ var opt, currentValue, single = !Object.isArray(value);
5202
+ for (var i = 0, length = element.length; i < length; i++) {
5203
+ opt = element.options[i];
5204
+ currentValue = this.optionValue(opt);
5205
+ if (single) {
5206
+ if (currentValue == value) {
5207
+ opt.selected = true;
5208
+ return;
 
 
5209
  }
 
5210
  }
5211
+ else opt.selected = value.include(currentValue);
5212
  }
5213
+ }
5214
 
5215
+ function selectOne(element) {
5216
  var index = element.selectedIndex;
5217
+ return index >= 0 ? optionValue(element.options[index]) : null;
5218
+ }
5219
 
5220
+ function selectMany(element) {
5221
  var values, length = element.length;
5222
  if (!length) return null;
5223
 
5224
  for (var i = 0, values = []; i < length; i++) {
5225
  var opt = element.options[i];
5226
+ if (opt.selected) values.push(optionValue(opt));
5227
  }
5228
  return values;
5229
+ }
5230
 
5231
+ function optionValue(opt) {
5232
+ return Element.hasAttribute(opt, 'value') ? opt.value : opt.text;
 
5233
  }
5234
+
5235
+ return {
5236
+ input: input,
5237
+ inputSelector: inputSelector,
5238
+ textarea: valueSelector,
5239
+ select: select,
5240
+ selectOne: selectOne,
5241
+ selectMany: selectMany,
5242
+ optionValue: optionValue,
5243
+ button: valueSelector
5244
+ };
5245
+ })();
5246
 
5247
  /*--------------------------------------------------------------------------*/
5248
 
5249
+
5250
  Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
5251
  initialize: function($super, element, frequency, callback) {
5252
  $super(callback, frequency);
5328
  return Form.serialize(this.element);
5329
  }
5330
  });
5331
+ (function() {
5332
+
5333
+ var Event = {
5334
+ KEY_BACKSPACE: 8,
5335
+ KEY_TAB: 9,
5336
+ KEY_RETURN: 13,
5337
+ KEY_ESC: 27,
5338
+ KEY_LEFT: 37,
5339
+ KEY_UP: 38,
5340
+ KEY_RIGHT: 39,
5341
+ KEY_DOWN: 40,
5342
+ KEY_DELETE: 46,
5343
+ KEY_HOME: 36,
5344
+ KEY_END: 35,
5345
+ KEY_PAGEUP: 33,
5346
+ KEY_PAGEDOWN: 34,
5347
+ KEY_INSERT: 45,
5348
+
5349
+ cache: {}
5350
+ };
5351
+
5352
+ var docEl = document.documentElement;
5353
+ var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
5354
+ && 'onmouseleave' in docEl;
5355
+
5356
+
5357
+
5358
+ var isIELegacyEvent = function(event) { return false; };
5359
+
5360
+ if (window.attachEvent) {
5361
+ if (window.addEventListener) {
5362
+ isIELegacyEvent = function(event) {
5363
+ return !(event instanceof window.Event);
5364
+ };
5365
+ } else {
5366
+ isIELegacyEvent = function(event) { return true; };
5367
+ }
5368
  }
 
5369
 
5370
+ var _isButton;
 
5371
 
5372
+ function _isButtonForDOMEvents(event, code) {
5373
+ return event.which ? (event.which === code + 1) : (event.button === code);
5374
+ }
 
 
5375
 
5376
+ var legacyButtonMap = { 0: 1, 1: 4, 2: 2 };
5377
+ function _isButtonForLegacyEvents(event, code) {
5378
+ return event.button === legacyButtonMap[code];
5379
+ }
 
 
 
 
5380
 
5381
+ function _isButtonForWebKit(event, code) {
5382
+ switch (code) {
5383
+ case 0: return event.which == 1 && !event.metaKey;
5384
+ case 1: return event.which == 2 || (event.which == 1 && event.metaKey);
5385
+ case 2: return event.which == 3;
5386
+ default: return false;
5387
+ }
5388
  }
5389
 
5390
+ if (window.attachEvent) {
5391
+ if (!window.addEventListener) {
5392
+ _isButton = _isButtonForLegacyEvents;
5393
+ } else {
5394
+ _isButton = function(event, code) {
5395
+ return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) :
5396
+ _isButtonForDOMEvents(event, code);
 
 
 
 
 
 
 
 
 
 
 
 
 
5397
  }
5398
+ }
5399
+ } else if (Prototype.Browser.WebKit) {
5400
+ _isButton = _isButtonForWebKit;
5401
+ } else {
5402
+ _isButton = _isButtonForDOMEvents;
5403
+ }
5404
 
5405
+ function isLeftClick(event) { return _isButton(event, 0) }
 
 
 
 
 
5406
 
5407
+ function isMiddleClick(event) { return _isButton(event, 1) }
5408
+
5409
+ function isRightClick(event) { return _isButton(event, 2) }
5410
+
5411
+ function element(event) {
5412
+ event = Event.extend(event);
5413
+
5414
+ var node = event.target, type = event.type,
5415
+ currentTarget = event.currentTarget;
5416
+
5417
+ if (currentTarget && currentTarget.tagName) {
5418
+ if (type === 'load' || type === 'error' ||
5419
+ (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
5420
+ && currentTarget.type === 'radio'))
5421
+ node = currentTarget;
5422
+ }
5423
+
5424
+ if (node.nodeType == Node.TEXT_NODE)
5425
+ node = node.parentNode;
5426
+
5427
+ return Element.extend(node);
5428
+ }
5429
 
5430
+ function findElement(event, expression) {
5431
+ var element = Event.element(event);
5432
 
5433
+ if (!expression) return element;
5434
+ while (element) {
5435
+ if (Object.isElement(element) && Prototype.Selector.match(element, expression)) {
5436
+ return Element.extend(element);
5437
+ }
5438
+ element = element.parentNode;
5439
  }
5440
+ }
5441
+
5442
+ function pointer(event) {
5443
+ return { x: pointerX(event), y: pointerY(event) };
5444
+ }
5445
+
5446
+ function pointerX(event) {
5447
+ var docElement = document.documentElement,
5448
+ body = document.body || { scrollLeft: 0 };
5449
+
5450
+ return event.pageX || (event.clientX +
5451
+ (docElement.scrollLeft || body.scrollLeft) -
5452
+ (docElement.clientLeft || 0));
5453
+ }
5454
+
5455
+ function pointerY(event) {
5456
+ var docElement = document.documentElement,
5457
+ body = document.body || { scrollTop: 0 };
5458
+
5459
+ return event.pageY || (event.clientY +
5460
+ (docElement.scrollTop || body.scrollTop) -
5461
+ (docElement.clientTop || 0));
5462
+ }
5463
+
5464
+
5465
+ function stop(event) {
5466
+ Event.extend(event);
5467
+ event.preventDefault();
5468
+ event.stopPropagation();
5469
+
5470
+ event.stopped = true;
5471
+ }
5472
+
5473
+
5474
+ Event.Methods = {
5475
+ isLeftClick: isLeftClick,
5476
+ isMiddleClick: isMiddleClick,
5477
+ isRightClick: isRightClick,
5478
+
5479
+ element: element,
5480
+ findElement: findElement,
5481
+
5482
+ pointer: pointer,
5483
+ pointerX: pointerX,
5484
+ pointerY: pointerY,
5485
+
5486
+ stop: stop
5487
  };
 
5488
 
 
5489
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
5490
  m[name] = Event.Methods[name].methodize();
5491
  return m;
5492
  });
5493
 
5494
+ if (window.attachEvent) {
5495
+ function _relatedTarget(event) {
5496
+ var element;
5497
+ switch (event.type) {
5498
+ case 'mouseover':
5499
+ case 'mouseenter':
5500
+ element = event.fromElement;
5501
+ break;
5502
+ case 'mouseout':
5503
+ case 'mouseleave':
5504
+ element = event.toElement;
5505
+ break;
5506
+ default:
5507
+ return null;
5508
+ }
5509
+ return Element.extend(element);
5510
+ }
5511
+
5512
+ var additionalMethods = {
5513
  stopPropagation: function() { this.cancelBubble = true },
5514
  preventDefault: function() { this.returnValue = false },
5515
+ inspect: function() { return '[object Event]' }
5516
+ };
5517
 
5518
+ Event.extend = function(event, element) {
5519
  if (!event) return false;
 
5520
 
5521
+ if (!isIELegacyEvent(event)) return event;
5522
+
5523
+ if (event._extendedByPrototype) return event;
5524
  event._extendedByPrototype = Prototype.emptyFunction;
5525
+
5526
  var pointer = Event.pointer(event);
5527
+
5528
  Object.extend(event, {
5529
+ target: event.srcElement || element,
5530
+ relatedTarget: _relatedTarget(event),
5531
  pageX: pointer.x,
5532
  pageY: pointer.y
5533
  });
 
 
5534
 
5535
+ Object.extend(event, methods);
5536
+ Object.extend(event, additionalMethods);
5537
+
5538
+ return event;
5539
+ };
5540
  } else {
5541
+ Event.extend = Prototype.K;
5542
+ }
5543
+
5544
+ if (window.addEventListener) {
5545
+ Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
5546
  Object.extend(Event.prototype, methods);
 
5547
  }
 
5548
 
5549
+ function _createResponder(element, eventName, handler) {
5550
+ var registry = Element.retrieve(element, 'prototype_event_registry');
5551
 
5552
+ if (Object.isUndefined(registry)) {
5553
+ CACHE.push(element);
5554
+ registry = Element.retrieve(element, 'prototype_event_registry', $H());
 
 
 
 
5555
  }
 
5556
 
5557
+ var respondersForEvent = registry.get(eventName);
5558
+ if (Object.isUndefined(respondersForEvent)) {
5559
+ respondersForEvent = [];
5560
+ registry.set(eventName, respondersForEvent);
5561
+ }
 
 
 
5562
 
5563
+ if (respondersForEvent.pluck('handler').include(handler)) return false;
 
 
 
5564
 
5565
+ var responder;
5566
+ if (eventName.include(":")) {
5567
+ responder = function(event) {
5568
+ if (Object.isUndefined(event.eventName))
5569
+ return false;
5570
 
5571
+ if (event.eventName !== eventName)
 
 
5572
  return false;
5573
 
5574
+ Event.extend(event, element);
5575
+ handler.call(element, event);
5576
+ };
5577
+ } else {
5578
+ if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
5579
+ (eventName === "mouseenter" || eventName === "mouseleave")) {
5580
+ if (eventName === "mouseenter" || eventName === "mouseleave") {
5581
+ responder = function(event) {
5582
+ Event.extend(event, element);
5583
+
5584
+ var parent = event.relatedTarget;
5585
+ while (parent && parent !== element) {
5586
+ try { parent = parent.parentNode; }
5587
+ catch(e) { parent = element; }
5588
+ }
5589
 
5590
+ if (parent === element) return;
 
 
 
5591
 
5592
+ handler.call(element, event);
5593
+ };
5594
+ }
5595
+ } else {
5596
+ responder = function(event) {
5597
+ Event.extend(event, element);
5598
+ handler.call(element, event);
5599
+ };
5600
+ }
5601
+ }
5602
 
5603
+ responder.handler = handler;
5604
+ respondersForEvent.push(responder);
5605
+ return responder;
 
5606
  }
5607
 
5608
+ function _destroyCache() {
5609
+ for (var i = 0, length = CACHE.length; i < length; i++) {
5610
+ Event.stopObserving(CACHE[i]);
5611
+ CACHE[i] = null;
5612
+ }
5613
  }
5614
 
5615
+ var CACHE = [];
5616
 
5617
+ if (Prototype.Browser.IE)
5618
+ window.attachEvent('onunload', _destroyCache);
 
 
 
5619
 
5620
+ if (Prototype.Browser.WebKit)
 
 
 
5621
  window.addEventListener('unload', Prototype.emptyFunction, false);
5622
+
5623
+
5624
+ var _getDOMEventName = Prototype.K,
5625
+ translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
5626
+
5627
+ if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
5628
+ _getDOMEventName = function(eventName) {
5629
+ return (translations[eventName] || eventName);
5630
+ };
5631
  }
5632
 
5633
+ function observe(element, eventName, handler) {
5634
+ element = $(element);
 
 
5635
 
5636
+ var responder = _createResponder(element, eventName, handler);
 
5637
 
5638
+ if (!responder) return element;
5639
+
5640
+ if (eventName.include(':')) {
5641
+ if (element.addEventListener)
5642
+ element.addEventListener("dataavailable", responder, false);
5643
+ else {
5644
+ element.attachEvent("ondataavailable", responder);
5645
+ element.attachEvent("onlosecapture", responder);
5646
  }
5647
+ } else {
5648
+ var actualEventName = _getDOMEventName(eventName);
5649
+
5650
+ if (element.addEventListener)
5651
+ element.addEventListener(actualEventName, responder, false);
5652
+ else
5653
+ element.attachEvent("on" + actualEventName, responder);
5654
+ }
5655
+
5656
+ return element;
5657
+ }
5658
 
5659
+ function stopObserving(element, eventName, handler) {
5660
+ element = $(element);
5661
+
5662
+ var registry = Element.retrieve(element, 'prototype_event_registry');
5663
+ if (!registry) return element;
5664
+
5665
+ if (!eventName) {
5666
+ registry.each( function(pair) {
5667
+ var eventName = pair.key;
5668
+ stopObserving(element, eventName);
5669
+ });
5670
  return element;
5671
+ }
5672
 
5673
+ var responders = registry.get(eventName);
5674
+ if (!responders) return element;
 
5675
 
5676
+ if (!handler) {
5677
+ responders.each(function(r) {
5678
+ stopObserving(element, eventName, r.handler);
5679
+ });
5680
+ return element;
5681
+ }
5682
 
5683
+ var i = responders.length, responder;
5684
+ while (i--) {
5685
+ if (responders[i].handler === handler) {
5686
+ responder = responders[i];
5687
+ break;
5688
+ }
5689
+ }
5690
+ if (!responder) return element;
5691
+
5692
+ if (eventName.include(':')) {
5693
+ if (element.removeEventListener)
5694
+ element.removeEventListener("dataavailable", responder, false);
5695
+ else {
5696
+ element.detachEvent("ondataavailable", responder);
5697
+ element.detachEvent("onlosecapture", responder);
5698
  }
5699
+ } else {
5700
+ var actualEventName = _getDOMEventName(eventName);
5701
+ if (element.removeEventListener)
5702
+ element.removeEventListener(actualEventName, responder, false);
5703
+ else
5704
+ element.detachEvent('on' + actualEventName, responder);
5705
+ }
5706
 
5707
+ registry.set(eventName, responders.without(responder));
 
5708
 
5709
+ return element;
5710
+ }
 
 
 
5711
 
5712
+ function fire(element, eventName, memo, bubble) {
5713
+ element = $(element);
5714
 
5715
+ if (Object.isUndefined(bubble))
5716
+ bubble = true;
5717
 
5718
+ if (element == document && document.createEvent && !element.dispatchEvent)
5719
+ element = document.documentElement;
 
 
5720
 
5721
+ var event;
5722
+ if (document.createEvent) {
5723
+ event = document.createEvent('HTMLEvents');
5724
+ event.initEvent('dataavailable', bubble, true);
5725
+ } else {
5726
+ event = document.createEventObject();
5727
+ event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
5728
+ }
5729
 
5730
+ event.eventName = eventName;
5731
+ event.memo = memo || { };
5732
 
5733
+ if (document.createEvent)
5734
+ element.dispatchEvent(event);
5735
+ else
5736
+ element.fireEvent(event.eventType, event);
5737
+
5738
+ return Event.extend(event);
5739
+ }
5740
+
5741
+ Event.Handler = Class.create({
5742
+ initialize: function(element, eventName, selector, callback) {
5743
+ this.element = $(element);
5744
+ this.eventName = eventName;
5745
+ this.selector = selector;
5746
+ this.callback = callback;
5747
+ this.handler = this.handleEvent.bind(this);
5748
+ },
5749
+
5750
+ start: function() {
5751
+ Event.observe(this.element, this.eventName, this.handler);
5752
+ return this;
5753
+ },
5754
+
5755
+ stop: function() {
5756
+ Event.stopObserving(this.element, this.eventName, this.handler);
5757
+ return this;
5758
+ },
5759
 
5760
+ handleEvent: function(event) {
5761
+ var element = Event.findElement(event, this.selector);
5762
+ if (element) this.callback.call(this.element, event, element);
5763
  }
5764
+ });
 
5765
 
5766
+ function on(element, eventName, selector, callback) {
5767
+ element = $(element);
5768
+ if (Object.isFunction(selector) && Object.isUndefined(callback)) {
5769
+ callback = selector, selector = null;
5770
+ }
5771
 
5772
+ return new Event.Handler(element, eventName, selector, callback).start();
5773
+ }
 
 
 
5774
 
5775
+ Object.extend(Event, Event.Methods);
5776
+
5777
+ Object.extend(Event, {
5778
+ fire: fire,
5779
+ observe: observe,
5780
+ stopObserving: stopObserving,
5781
+ on: on
5782
+ });
5783
+
5784
+ Element.addMethods({
5785
+ fire: fire,
5786
+
5787
+ observe: observe,
5788
+
5789
+ stopObserving: stopObserving,
5790
+
5791
+ on: on
5792
+ });
5793
+
5794
+ Object.extend(document, {
5795
+ fire: fire.methodize(),
5796
+
5797
+ observe: observe.methodize(),
5798
+
5799
+ stopObserving: stopObserving.methodize(),
5800
+
5801
+ on: on.methodize(),
5802
+
5803
+ loaded: false
5804
+ });
5805
+
5806
+ if (window.Event) Object.extend(window.Event, Event);
5807
+ else window.Event = Event;
5808
+ })();
5809
 
5810
  (function() {
5811
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
5812
+ Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
5813
 
5814
  var timer;
5815
 
5816
  function fireContentLoadedEvent() {
5817
  if (document.loaded) return;
5818
+ if (timer) window.clearTimeout(timer);
 
5819
  document.loaded = true;
5820
+ document.fire('dom:loaded');
5821
  }
5822
 
5823
+ function checkReadyState() {
5824
+ if (document.readyState === 'complete') {
5825
+ document.stopObserving('readystatechange', checkReadyState);
5826
+ fireContentLoadedEvent();
5827
+ }
5828
+ }
 
 
5829
 
5830
+ function pollDoScroll() {
5831
+ try { document.documentElement.doScroll('left'); }
5832
+ catch(e) {
5833
+ timer = pollDoScroll.defer();
5834
+ return;
5835
  }
5836
+ fireContentLoadedEvent();
5837
+ }
5838
 
5839
+ if (document.addEventListener) {
5840
+ document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
5841
  } else {
5842
+ document.observe('readystatechange', checkReadyState);
5843
+ if (window == top)
5844
+ timer = pollDoScroll.defer();
 
 
 
 
5845
  }
5846
+
5847
+ Event.observe(window, 'load', fireContentLoadedEvent);
5848
  })();
5849
+
5850
+ Element.addMethods();
5851
+
5852
  /*------------------------------- DEPRECATED -------------------------------*/
5853
 
5854
  Hash.toQueryString = Object.toQueryString;
5877
 
5878
  var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
5879
 
 
 
5880
  var Position = {
 
 
 
5881
  includeScrollOffsets: false,
5882
 
 
 
5883
  prepare: function() {
5884
  this.deltaX = window.pageXOffset
5885
  || document.documentElement.scrollLeft
5891
  || 0;
5892
  },
5893
 
 
5894
  within: function(element, x, y) {
5895
  if (this.includeScrollOffsets)
5896
  return this.withinIncludingScrolloffsets(element, x, y);
5917
  this.xcomp < this.offset[0] + element.offsetWidth);
5918
  },
5919
 
 
5920
  overlap: function(mode, element) {
5921
  if (!mode) return 0;
5922
  if (mode == 'vertical')
5927
  element.offsetWidth;
5928
  },
5929
 
 
5930
 
5931
  cumulativeOffset: Element.Methods.cumulativeOffset,
5932
 
6026
 
6027
  /*--------------------------------------------------------------------------*/
6028
 
6029
+ (function() {
6030
+ window.Selector = Class.create({
6031
+ initialize: function(expression) {
6032
+ this.expression = expression.strip();
6033
+ },
6034
+
6035
+ findElements: function(rootElement) {
6036
+ return Prototype.Selector.select(this.expression, rootElement);
6037
+ },
6038
+
6039
+ match: function(element) {
6040
+ return Prototype.Selector.match(element, this.expression);
6041
+ },
6042
+
6043
+ toString: function() {
6044
+ return this.expression;
6045
+ },
6046
+
6047
+ inspect: function() {
6048
+ return "#<Selector: " + this.expression + ">";
6049
+ }
6050
+ });
6051
+
6052
+ Object.extend(Selector, {
6053
+ matchElements: function(elements, expression) {
6054
+ var match = Prototype.Selector.match,
6055
+ results = [];
6056
+
6057
+ for (var i = 0, length = elements.length; i < length; i++) {
6058
+ var element = elements[i];
6059
+ if (match(element, expression)) {
6060
+ results.push(Element.extend(element));
6061
+ }
6062
+ }
6063
+ return results;
6064
+ },
6065
+
6066
+ findElement: function(elements, expression, index) {
6067
+ index = index || 0;
6068
+ var matchIndex = 0, element;
6069
+ for (var i = 0, length = elements.length; i < length; i++) {
6070
+ element = elements[i];
6071
+ if (Prototype.Selector.match(element, expression) && index === matchIndex++) {
6072
+ return Element.extend(element);
6073
+ }
6074
+ }
6075
+ },
6076
+
6077
+ findChildElements: function(element, expressions) {
6078
+ var selector = expressions.toArray().join(', ');
6079
+ return Prototype.Selector.select(selector, element || document);
6080
+ }
6081
+ });
6082
+ })();
js/prototype/validation.js CHANGED
@@ -503,7 +503,7 @@ Validation.addAllThese([
503
  return (pass.value == conf.value);
504
  }],
505
  ['validate-url', 'Please enter a valid URL. Protocol is required (http://, https:// or ftp://)', function (v) {
506
- return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
507
  }],
508
  ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) {
509
  return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
503
  return (pass.value == conf.value);
504
  }],
505
  ['validate-url', 'Please enter a valid URL. Protocol is required (http://, https:// or ftp://)', function (v) {
506
+ return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))(\.[A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))*)(:(\d+))?(\/[A-Z0-9]([A-Z0-9_-]*[A-Z0-9]|))*\/?$/i.test(v)
507
  }],
508
  ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) {
509
  return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
package.xml CHANGED
@@ -1,18 +1,18 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Lib_Js_Prototype</name>
4
- <version>1.6.0.3.4</version>
5
  <stability>stable</stability>
6
  <license>Mixed</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Prototype and Scriptaculous Javascript Libraries for Magento</summary>
10
  <description>Prototype and Scriptaculous Javascript Libraries for Magento</description>
11
- <notes>1.6.0.3.4</notes>
12
  <authors><author><name>Magento Core Team</name><user>core</user><email>core@magentocommerce.com</email></author></authors>
13
- <date>2011-02-08</date>
14
- <time>18:01:01</time>
15
- <contents><target name="mageweb"><dir name="js"><dir name="prototype"><file name="debug.js" hash="d5990eabf728ade1f34496737455c8ff"/><file name="deprecation.js" hash="4dfe41a2d0ef43c8fe7726bd2b80b18d"/><file name="effects.js" hash="91e1b7d8c6043dff4eadbe054a90e3a7"/><file name="extended_debug.js" hash="cc706bc76bb1c5a2610fc296cd85e053"/><file name="prototype.js" hash="d23187d61f796d39487acbe34af031bc"/><file name="tooltip.js" hash="8509b04b1594b7e6382d7cfdf4ee1236"/><file name="tooltip_manager.js" hash="6b9759cbad296fda3c18d7669d6b5af0"/><file name="validation.js" hash="7d7c62bea91711414bff97046f56e3e9"/><file name="window.js" hash="1c6a9c7208335dc5104c2243a6d38ae6"/><file name="window_effects.js" hash="3c0b47a0f3cd41753a3992d01c118c3d"/><file name="window_ext.js" hash="5ab45fe5f734927890c95b9d5547f47f"/><file name="window_readme.txt" hash="97306d2a8c4be2ec65f66d2ec233289c"/><dir name="windows"><file name="MIT-LICENSE" hash="a839f717f1675b571481268a4e4a4ee2"/><file name="README" hash="75b8b2e714cbcb48337540a451655967"/><dir name="themes"><dir name="alert"><file name="bottom.gif" hash="e859e3bc00c4f10360fa81a659aa673f"/><file name="bottom_left.gif" hash="53585b1a0351d599e76a85ccc26f7980"/><file name="bottom_right.gif" hash="8170abe3fec71fd17612869a2f036cd6"/><file name="left.gif" hash="4f235c4e6afb0d386d220638c49e4545"/><file name="overlay.png" hash="f4ddcee6f819975bc9c5643b570de6dc"/><file name="progress.gif" hash="86b1ac6d1c485d54efa3a53643e91ceb"/><file name="right.gif" hash="838ade41815529e7a63f99c93b3a01f7"/><file name="top.gif" hash="8702ca9b81c19f6220ce81c4ea215878"/><file name="top_left.gif" hash="a8c097bcb67bddf640c2bd9161b79476"/><file name="top_right.gif" hash="05ef4e1a417a5a2c81fc816406a4842a"/></dir><file name="alert.css" hash="27df86baae5a6fa2e3556bdf1b85ccc6"/><file name="alert_lite.css" hash="fbeaff8f185cd3b302f1a8db5efa0110"/><dir name="alphacube"><file name="bottom-left-c.gif" hash="434cdfc5298f33efb108264cf3370e1c"/><file name="bottom-middle.gif" hash="3f882dd32d57a29a785f448bbba5ed26"/><file name="bottom-right-c.gif" hash="4c37ad7b94fc901a1cfaf54a1742d5fd"/><file name="button-close-focus.gif" hash="99c44a6df2733b58083af7a4d9522116"/><file name="button-max-focus.gif" hash="408cd33fa89269b8395bf10afe69d456"/><file name="button-min-focus.gif" hash="ae06210658bad8bcc88dea377c4dc908"/><file name="frame-left.gif" hash="1bb1207b43425d214d4dc0da108f5449"/><file name="frame-right.gif" hash="8b9c36079881aa15c27a137666c56a38"/><file name="left-top.gif" hash="1ea936a090b4dfe8160fcb3a90ddb145"/><file name="right-top.gif" hash="e1b641feab640cb4207fa52160715e32"/><file name="top-middle.gif" hash="7f94c1018d023832c7c9e1fa468a9555"/></dir><file name="alphacube.css" hash="27c968911eaef53df158c55083ef0c84"/><file name="behavior.htc" hash="5588dff36ad5595f8353730e853044e5"/><dir name="darkX"><file name="button-close-focused.png" hash="5090b529a86a79679e0a26ccb0e1b0c6"/><file name="button-maximize-focused.png" hash="0f84bfcc9626d2cb1826291268b29f20"/><file name="button-minimize-focused.png" hash="630cd8cdd7124d412c6253e5c7cfc32a"/><file name="frame-bottom-left-focused.png" hash="8a34a3be2f349315dfd287ec15148332"/><file name="frame-bottom-mid-focused.png" hash="f1dbacdb64a19e00a485d426126f26db"/><file name="frame-bottom-right-focused.png" hash="17acb7874856dc68c3c017238d42054a"/><file name="frame-left-focused.png" hash="f30ab13888b2e48d0637991164a8f748"/><file name="frame-right-focused.png" hash="1115115c62507971b2f5eed3c2c5c2d0"/><file name="titlebar-left-focused.png" hash="491130dedbdbb3b2682f37424347b14c"/><file name="titlebar-mid-focused.png" hash="ae46975fc8a5e5a9f73f810d0c88809a"/><file name="titlebar-right-focused.png" hash="9560eb10dee94985f3ebe935833e2ae4"/></dir><file name="darkX.css" hash="16a964cfe57a2c979ad3d97831673b79"/><file name="debug.css" hash="63ee9aa7b7d80e0bb5e311407746ccd3"/><dir name="default"><file name="bottom_left.gif" hash="fb99ffa815a8648f95f42698fe5dfaa1"/><file name="bottom_mid.gif" hash="49b9ca7025562ea7f070a9111282364b"/><file name="bottom_right.gif" hash="e46768f632765cd86c5fe5d0166dcf2c"/><file name="bottom_right_resize.gif" hash="1b35a4ec3b734dfe37e31ba87bcc7d99"/><file name="center_left.gif" hash="bd567580b4ee16a7a2734057cfbbe219"/><file name="center_right.gif" hash="eef184d5d89d1710313581a2ccf408e8"/><file name="clear.gif" hash="7af1206eeb0e7834a75e69d70676060d"/><file name="close.gif" hash="8a08f243c37a8e25a88d4ac135b2f07d"/><file name="inspect.gif" hash="aa2a0961067aad5c54b8634919af863b"/><file name="maximize.gif" hash="e73cd71c4979ebeadeb9e27d40a9e8fb"/><file name="minimize.gif" hash="2d2f4b1bd0506f342425f80ab76c49a3"/><file name="overlay.png" hash="536d40e87cda0c7ae7b11f1721aa52d0"/><file name="resize.gif" hash="320f534b5d444b39701e0b679529e779"/><file name="sizer.gif" hash="1b35a4ec3b734dfe37e31ba87bcc7d99"/><file name="top_left.gif" hash="9c5e5920bfc189a45cc618099af93aa8"/><file name="top_mid.gif" hash="a12ff2b944025ad2d127d033dae5e9e1"/><file name="top_right.gif" hash="0cf1ec5b93f8ac8fcce0e2f72cf7f45e"/></dir><file name="default.css" hash="16014098f441d12d06c088135e2fde28"/><dir name="iefix"><file name="blank.gif" hash="56398e76be6355ad5999b262208a17c9"/><file name="iepngfix.css" hash="da3154c9a817850376f73a7976bfcb13"/><file name="iepngfix.htc" hash="b50c4e352a64254c5ceb6c63bcd0b176"/></dir><dir name="lighting"><file name="background_buttons.gif" hash="e66e67aaaf08a7b24f3cd1ba22584b42"/><file name="bottom-left-blue.png" hash="7c9e91d421945141315fc105d464a99f"/><file name="bottom-left-darkblue.png" hash="e88c2380acf403ee28597c6045988cc6"/><file name="bottom-left-green.png" hash="ee25ce8a12229b009fbfd91f7ba51e26"/><file name="bottom-left-grey.png" hash="5fdb3eae397ac7279aa5a7fdaad3dcc2"/><file name="bottom-middle-blue.png" hash="e93cc9d31d88f45c047a98a66be04354"/><file name="bottom-middle-darkblue.png" hash="763c88c424e0900e675042d3f0958bd4"/><file name="bottom-middle-green.png" hash="77e0a22afd2c55a83b5c7fa98a12ef25"/><file name="bottom-middle-grey.png" hash="3a2ebdeff74e2ff63c4471575568dd01"/><file name="bottom-right-blue.png" hash="0bc11a61047e8716451a283ebff897e5"/><file name="bottom-right-darkblue.png" hash="88e33ea702a304ae237edd57bc8447d6"/><file name="bottom-right-green.png" hash="7bce162df013eba43a659ae6e780ae4b"/><file name="bottom-right-grey.png" hash="86eb476492d911aac5688c9747fe7a1d"/><file name="button-close-blue.png" hash="42ae1a35caf8a9a275d6e748c27769fb"/><file name="button-close-darkblue.png" hash="50dbcd898dc519c1e6ac0d3a478978cd"/><file name="button-close-green.png" hash="b4273572fa91cba909a0a3e15b994d19"/><file name="button-close-grey.png" hash="124964b634ba67f2bb6dd08cf8cafd5a"/><file name="button-maximize-blue.png" hash="85b79237d85b09c205e09166dd8f4af0"/><file name="button-maximize-darkblue.png" hash="108d10619214e3365820aa4ab008aed5"/><file name="button-maximize-green.png" hash="90f5527705e4fd81997564e81c6ac2a3"/><file name="button-maximize-grey.png" hash="c46a8c014bd14be167f4c6a2f2dd52ed"/><file name="button-minimize-blue.png" hash="1fd738b99877a4dfa5656491cc3d8e6b"/><file name="button-minimize-darkblue.png" hash="b6d9da1cdf51ab54682fa75a6df2c40d"/><file name="button-minimize-green.png" hash="9e7d26298a0a49ffee3fbab6ea838e01"/><file name="button-minimize-grey.png" hash="0432701c2425cb3a5143d8a04bda0d87"/><file name="left-blue.png" hash="0a6acf0a863c04845a93b681769527cd"/><file name="left-darkblue.png" hash="44cdce8a75de4425d7eb7763092cc38d"/><file name="left-green.png" hash="d83116c49d62dc46bff0b7b4200b4ecf"/><file name="left-grey.png" hash="f3486d3293ae98b5edb8889c4b4082ef"/><file name="pngbehavior.htc" hash="b94c44e30423fd18a8b82bda5a139db3"/><file name="right-blue.png" hash="2c9b6b80d4a6b190b8e38a1c101e828c"/><file name="right-darkblue.png" hash="9b3267c5d36bb3f4588167cc3e78e569"/><file name="right-green.png" hash="4436968c2adbe6ed7c475c225631bc7c"/><file name="right-grey.png" hash="36b3de47bcbbd6b53e2f6e06843ee6e8"/><file name="spinner.gif" hash="c7b3cbb3ec8249a7121b722cdd76b870"/><file name="top-left-blue.png" hash="a5cb9eaa82f67df223d6784a52b26f1f"/><file name="top-left-darkblue.png" hash="e4a3af23d2cae7909331eb1995963c82"/><file name="top-left-green.png" hash="eb4cb604177c342998023d3dcd3aa5b0"/><file name="top-left-grey.png" hash="9f6f39abc4ae9539a0f54567a4a5d4f8"/><file name="top-middle-blue.png" hash="6d01df8637385bbe592b8df369294c8d"/><file name="top-middle-darkblue.png" hash="2c91ea6462e72a29cd07300d4102b88a"/><file name="top-middle-green.png" hash="e0f56311091bfb370fc6783fc7e71068"/><file name="top-middle-grey.png" hash="8c02881b730d602589fe9ed4bcaeb689"/><file name="top-right-blue.png" hash="4afefb06dc63c864211724a6348f25ad"/><file name="top-right-darkblue.png" hash="d8a9031987f648f170af67023179618d"/><file name="top-right-green.png" hash="b38813f9200440051273bdd622f5e545"/><file name="top-right-grey.png" hash="d7f7332ddf8686fb9810e4170767bf52"/></dir><file name="lighting.css" hash="d13de730c8ee7ef04167d361bdf8eebd"/><file name="mac_os_x.css" hash="65204ef34c1eeff0be29c53b0614076a"/><file name="mac_os_x_dialog.css" hash="0b7cd9d6a9e8f940f50bc4a080f54b1b"/><dir name="magento"><file name="btn_bg.gif" hash="37c51a4d48a92da9648dcd3ca011039f"/><file name="content_bg.gif" hash="21278ea0da2d4256f4ced96b6080ba2e"/><file name="top_bg.gif" hash="26f28090de87d64f9b01bf624f89bfe2"/><file name="window_close.png" hash="3af14f053f360bf31f8ba2df73ec7f1e"/></dir><file name="magento.css" hash="a0b153cee7655dad31ee2923657cc08a"/><dir name="nuncio"><file name="bottom_left.png" hash="d9be5c7b432a342c6da5ef9b10148267"/><file name="bottom_mid.png" hash="facee2e7ee7c572a8f412750b0ce5387"/><file name="bottom_right.png" hash="6f3c124a066a11ff225897112de8e9d7"/><file name="center_left.png" hash="a11bee83f99addccc0d5eff3d2e82b8f"/><file name="center_right.png" hash="bf6b023ad1751d5f60f9820eea72ac28"/><file name="close.png" hash="46744062a7b54416c8767f8e0ccf1c41"/><file name="minimize.png" hash="bc911a3e90fc0640e0899856759a5e01"/><file name="overlay.png" hash="5ccd88855e923eb8a1bd9da1dec9d7fe"/><file name="top_left.png" hash="d3105aacc2c69954df11af953875a12e"/><file name="top_mid.png" hash="cb679a8c77e9b7485b5f0eca547eb103"/><file name="top_right.png" hash="e65d6fc6bf53891c487e414db16f1038"/></dir><file name="nuncio.css" hash="e30e31b94d96b0b27c80ad6d943d7010"/><dir name="spread"><file name="bottom-left-c.gif" hash="84641d08576f68a11f717103365dfb83"/><file name="bottom-middle.gif" hash="20ab265c67355c5b72cdcdc8739af555"/><file name="bottom-right-c.gif" hash="cb27b72623e997badc599e76024a6e44"/><file name="button-close-focus.gif" hash="99c44a6df2733b58083af7a4d9522116"/><file name="button-max-focus.gif" hash="408cd33fa89269b8395bf10afe69d456"/><file name="button-min-focus.gif" hash="ae06210658bad8bcc88dea377c4dc908"/><file name="frame-left.gif" hash="63dc99b0c4ba0518688f7eca1f1628ca"/><file name="frame-right.gif" hash="a03585eec830f37898c7041d557dafc5"/><file name="left-top.gif" hash="7c78b8b59976d19191acf940cbfc04fb"/><file name="right-top.gif" hash="597530287fe1dc491278f855749f7e01"/><file name="top-middle.gif" hash="fa6fd6b90945c47f8d1718d9139d0a75"/><file name=".gif" hash="9dd39829e7cfdd06f3317a931bdc177e"/></dir><file name="spread.css" hash="a804413d7f1f9550c134477f6f9219ee"/></dir></dir></dir><dir name="scriptaculous"><file name="builder.js" hash="1174f6fc34ca5d54ba10b0c719386e7c"/><file name="controls.js" hash="8c414e1787c0ac9f10b16b252361c8b2"/><file name="dragdrop.js" hash="c824212f4d19277be0fd11a87a9cd0fd"/><file name="effects.js" hash="d795089f95a22306cca9b337c439c65a"/><file name="scriptaculous.js" hash="d59eba4e0b14b672208b0862ae1c2196"/><file name="slider.js" hash="6043f96a71d2685fecd02e2ab99e84d9"/><file name="sound.js" hash="0f0fab23fa2cb1bc7717fd2bdf45402e"/><file name="unittest.js" hash="99969698b22272f77bdf4c64586862b3"/></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Lib_Js_Prototype</name>
4
+ <version>1.7.0.0</version>
5
  <stability>stable</stability>
6
  <license>Mixed</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Prototype and Scriptaculous Javascript Libraries for Magento</summary>
10
  <description>Prototype and Scriptaculous Javascript Libraries for Magento</description>
11
+ <notes>1.7.0.0</notes>
12
  <authors><author><name>Magento Core Team</name><user>core</user><email>core@magentocommerce.com</email></author></authors>
13
+ <date>2011-05-26</date>
14
+ <time>17:40:16</time>
15
+ <contents><target name="mageweb"><dir name="js"><dir name="prototype"><file name="debug.js" hash="d5990eabf728ade1f34496737455c8ff"/><file name="deprecation.js" hash="4dfe41a2d0ef43c8fe7726bd2b80b18d"/><file name="effects.js" hash="91e1b7d8c6043dff4eadbe054a90e3a7"/><file name="extended_debug.js" hash="cc706bc76bb1c5a2610fc296cd85e053"/><file name="prototype.js" hash="3b4b13dad33b475e11feb26fd3468ecc"/><file name="tooltip.js" hash="8509b04b1594b7e6382d7cfdf4ee1236"/><file name="tooltip_manager.js" hash="6b9759cbad296fda3c18d7669d6b5af0"/><file name="validation.js" hash="ef63930673a64d3a633924b03ff09356"/><file name="window.js" hash="1c6a9c7208335dc5104c2243a6d38ae6"/><file name="window_effects.js" hash="3c0b47a0f3cd41753a3992d01c118c3d"/><file name="window_ext.js" hash="5ab45fe5f734927890c95b9d5547f47f"/><file name="window_readme.txt" hash="97306d2a8c4be2ec65f66d2ec233289c"/><dir name="windows"><file name="MIT-LICENSE" hash="a839f717f1675b571481268a4e4a4ee2"/><file name="README" hash="75b8b2e714cbcb48337540a451655967"/><dir name="themes"><dir name="alert"><file name="bottom.gif" hash="e859e3bc00c4f10360fa81a659aa673f"/><file name="bottom_left.gif" hash="53585b1a0351d599e76a85ccc26f7980"/><file name="bottom_right.gif" hash="8170abe3fec71fd17612869a2f036cd6"/><file name="left.gif" hash="4f235c4e6afb0d386d220638c49e4545"/><file name="overlay.png" hash="f4ddcee6f819975bc9c5643b570de6dc"/><file name="progress.gif" hash="86b1ac6d1c485d54efa3a53643e91ceb"/><file name="right.gif" hash="838ade41815529e7a63f99c93b3a01f7"/><file name="top.gif" hash="8702ca9b81c19f6220ce81c4ea215878"/><file name="top_left.gif" hash="a8c097bcb67bddf640c2bd9161b79476"/><file name="top_right.gif" hash="05ef4e1a417a5a2c81fc816406a4842a"/></dir><file name="alert.css" hash="27df86baae5a6fa2e3556bdf1b85ccc6"/><file name="alert_lite.css" hash="fbeaff8f185cd3b302f1a8db5efa0110"/><dir name="alphacube"><file name="bottom-left-c.gif" hash="434cdfc5298f33efb108264cf3370e1c"/><file name="bottom-middle.gif" hash="3f882dd32d57a29a785f448bbba5ed26"/><file name="bottom-right-c.gif" hash="4c37ad7b94fc901a1cfaf54a1742d5fd"/><file name="button-close-focus.gif" hash="99c44a6df2733b58083af7a4d9522116"/><file name="button-max-focus.gif" hash="408cd33fa89269b8395bf10afe69d456"/><file name="button-min-focus.gif" hash="ae06210658bad8bcc88dea377c4dc908"/><file name="frame-left.gif" hash="1bb1207b43425d214d4dc0da108f5449"/><file name="frame-right.gif" hash="8b9c36079881aa15c27a137666c56a38"/><file name="left-top.gif" hash="1ea936a090b4dfe8160fcb3a90ddb145"/><file name="right-top.gif" hash="e1b641feab640cb4207fa52160715e32"/><file name="top-middle.gif" hash="7f94c1018d023832c7c9e1fa468a9555"/></dir><file name="alphacube.css" hash="27c968911eaef53df158c55083ef0c84"/><file name="behavior.htc" hash="5588dff36ad5595f8353730e853044e5"/><dir name="darkX"><file name="button-close-focused.png" hash="5090b529a86a79679e0a26ccb0e1b0c6"/><file name="button-maximize-focused.png" hash="0f84bfcc9626d2cb1826291268b29f20"/><file name="button-minimize-focused.png" hash="630cd8cdd7124d412c6253e5c7cfc32a"/><file name="frame-bottom-left-focused.png" hash="8a34a3be2f349315dfd287ec15148332"/><file name="frame-bottom-mid-focused.png" hash="f1dbacdb64a19e00a485d426126f26db"/><file name="frame-bottom-right-focused.png" hash="17acb7874856dc68c3c017238d42054a"/><file name="frame-left-focused.png" hash="f30ab13888b2e48d0637991164a8f748"/><file name="frame-right-focused.png" hash="1115115c62507971b2f5eed3c2c5c2d0"/><file name="titlebar-left-focused.png" hash="491130dedbdbb3b2682f37424347b14c"/><file name="titlebar-mid-focused.png" hash="ae46975fc8a5e5a9f73f810d0c88809a"/><file name="titlebar-right-focused.png" hash="9560eb10dee94985f3ebe935833e2ae4"/></dir><file name="darkX.css" hash="16a964cfe57a2c979ad3d97831673b79"/><file name="debug.css" hash="63ee9aa7b7d80e0bb5e311407746ccd3"/><dir name="default"><file name="bottom_left.gif" hash="fb99ffa815a8648f95f42698fe5dfaa1"/><file name="bottom_mid.gif" hash="49b9ca7025562ea7f070a9111282364b"/><file name="bottom_right.gif" hash="e46768f632765cd86c5fe5d0166dcf2c"/><file name="bottom_right_resize.gif" hash="1b35a4ec3b734dfe37e31ba87bcc7d99"/><file name="center_left.gif" hash="bd567580b4ee16a7a2734057cfbbe219"/><file name="center_right.gif" hash="eef184d5d89d1710313581a2ccf408e8"/><file name="clear.gif" hash="7af1206eeb0e7834a75e69d70676060d"/><file name="close.gif" hash="8a08f243c37a8e25a88d4ac135b2f07d"/><file name="inspect.gif" hash="aa2a0961067aad5c54b8634919af863b"/><file name="maximize.gif" hash="e73cd71c4979ebeadeb9e27d40a9e8fb"/><file name="minimize.gif" hash="2d2f4b1bd0506f342425f80ab76c49a3"/><file name="overlay.png" hash="536d40e87cda0c7ae7b11f1721aa52d0"/><file name="resize.gif" hash="320f534b5d444b39701e0b679529e779"/><file name="sizer.gif" hash="1b35a4ec3b734dfe37e31ba87bcc7d99"/><file name="top_left.gif" hash="9c5e5920bfc189a45cc618099af93aa8"/><file name="top_mid.gif" hash="a12ff2b944025ad2d127d033dae5e9e1"/><file name="top_right.gif" hash="0cf1ec5b93f8ac8fcce0e2f72cf7f45e"/></dir><file name="default.css" hash="16014098f441d12d06c088135e2fde28"/><dir name="iefix"><file name="blank.gif" hash="56398e76be6355ad5999b262208a17c9"/><file name="iepngfix.css" hash="da3154c9a817850376f73a7976bfcb13"/><file name="iepngfix.htc" hash="b50c4e352a64254c5ceb6c63bcd0b176"/></dir><dir name="lighting"><file name="background_buttons.gif" hash="e66e67aaaf08a7b24f3cd1ba22584b42"/><file name="bottom-left-blue.png" hash="7c9e91d421945141315fc105d464a99f"/><file name="bottom-left-darkblue.png" hash="e88c2380acf403ee28597c6045988cc6"/><file name="bottom-left-green.png" hash="ee25ce8a12229b009fbfd91f7ba51e26"/><file name="bottom-left-grey.png" hash="5fdb3eae397ac7279aa5a7fdaad3dcc2"/><file name="bottom-middle-blue.png" hash="e93cc9d31d88f45c047a98a66be04354"/><file name="bottom-middle-darkblue.png" hash="763c88c424e0900e675042d3f0958bd4"/><file name="bottom-middle-green.png" hash="77e0a22afd2c55a83b5c7fa98a12ef25"/><file name="bottom-middle-grey.png" hash="3a2ebdeff74e2ff63c4471575568dd01"/><file name="bottom-right-blue.png" hash="0bc11a61047e8716451a283ebff897e5"/><file name="bottom-right-darkblue.png" hash="88e33ea702a304ae237edd57bc8447d6"/><file name="bottom-right-green.png" hash="7bce162df013eba43a659ae6e780ae4b"/><file name="bottom-right-grey.png" hash="86eb476492d911aac5688c9747fe7a1d"/><file name="button-close-blue.png" hash="42ae1a35caf8a9a275d6e748c27769fb"/><file name="button-close-darkblue.png" hash="50dbcd898dc519c1e6ac0d3a478978cd"/><file name="button-close-green.png" hash="b4273572fa91cba909a0a3e15b994d19"/><file name="button-close-grey.png" hash="124964b634ba67f2bb6dd08cf8cafd5a"/><file name="button-maximize-blue.png" hash="85b79237d85b09c205e09166dd8f4af0"/><file name="button-maximize-darkblue.png" hash="108d10619214e3365820aa4ab008aed5"/><file name="button-maximize-green.png" hash="90f5527705e4fd81997564e81c6ac2a3"/><file name="button-maximize-grey.png" hash="c46a8c014bd14be167f4c6a2f2dd52ed"/><file name="button-minimize-blue.png" hash="1fd738b99877a4dfa5656491cc3d8e6b"/><file name="button-minimize-darkblue.png" hash="b6d9da1cdf51ab54682fa75a6df2c40d"/><file name="button-minimize-green.png" hash="9e7d26298a0a49ffee3fbab6ea838e01"/><file name="button-minimize-grey.png" hash="0432701c2425cb3a5143d8a04bda0d87"/><file name="left-blue.png" hash="0a6acf0a863c04845a93b681769527cd"/><file name="left-darkblue.png" hash="44cdce8a75de4425d7eb7763092cc38d"/><file name="left-green.png" hash="d83116c49d62dc46bff0b7b4200b4ecf"/><file name="left-grey.png" hash="f3486d3293ae98b5edb8889c4b4082ef"/><file name="pngbehavior.htc" hash="b94c44e30423fd18a8b82bda5a139db3"/><file name="right-blue.png" hash="2c9b6b80d4a6b190b8e38a1c101e828c"/><file name="right-darkblue.png" hash="9b3267c5d36bb3f4588167cc3e78e569"/><file name="right-green.png" hash="4436968c2adbe6ed7c475c225631bc7c"/><file name="right-grey.png" hash="36b3de47bcbbd6b53e2f6e06843ee6e8"/><file name="spinner.gif" hash="c7b3cbb3ec8249a7121b722cdd76b870"/><file name="top-left-blue.png" hash="a5cb9eaa82f67df223d6784a52b26f1f"/><file name="top-left-darkblue.png" hash="e4a3af23d2cae7909331eb1995963c82"/><file name="top-left-green.png" hash="eb4cb604177c342998023d3dcd3aa5b0"/><file name="top-left-grey.png" hash="9f6f39abc4ae9539a0f54567a4a5d4f8"/><file name="top-middle-blue.png" hash="6d01df8637385bbe592b8df369294c8d"/><file name="top-middle-darkblue.png" hash="2c91ea6462e72a29cd07300d4102b88a"/><file name="top-middle-green.png" hash="e0f56311091bfb370fc6783fc7e71068"/><file name="top-middle-grey.png" hash="8c02881b730d602589fe9ed4bcaeb689"/><file name="top-right-blue.png" hash="4afefb06dc63c864211724a6348f25ad"/><file name="top-right-darkblue.png" hash="d8a9031987f648f170af67023179618d"/><file name="top-right-green.png" hash="b38813f9200440051273bdd622f5e545"/><file name="top-right-grey.png" hash="d7f7332ddf8686fb9810e4170767bf52"/></dir><file name="lighting.css" hash="d13de730c8ee7ef04167d361bdf8eebd"/><file name="mac_os_x.css" hash="65204ef34c1eeff0be29c53b0614076a"/><file name="mac_os_x_dialog.css" hash="0b7cd9d6a9e8f940f50bc4a080f54b1b"/><dir name="magento"><file name="btn_bg.gif" hash="37c51a4d48a92da9648dcd3ca011039f"/><file name="content_bg.gif" hash="21278ea0da2d4256f4ced96b6080ba2e"/><file name="top_bg.gif" hash="26f28090de87d64f9b01bf624f89bfe2"/><file name="window_close.png" hash="3af14f053f360bf31f8ba2df73ec7f1e"/></dir><file name="magento.css" hash="a0b153cee7655dad31ee2923657cc08a"/><dir name="nuncio"><file name="bottom_left.png" hash="d9be5c7b432a342c6da5ef9b10148267"/><file name="bottom_mid.png" hash="facee2e7ee7c572a8f412750b0ce5387"/><file name="bottom_right.png" hash="6f3c124a066a11ff225897112de8e9d7"/><file name="center_left.png" hash="a11bee83f99addccc0d5eff3d2e82b8f"/><file name="center_right.png" hash="bf6b023ad1751d5f60f9820eea72ac28"/><file name="close.png" hash="46744062a7b54416c8767f8e0ccf1c41"/><file name="minimize.png" hash="bc911a3e90fc0640e0899856759a5e01"/><file name="overlay.png" hash="5ccd88855e923eb8a1bd9da1dec9d7fe"/><file name="top_left.png" hash="d3105aacc2c69954df11af953875a12e"/><file name="top_mid.png" hash="cb679a8c77e9b7485b5f0eca547eb103"/><file name="top_right.png" hash="e65d6fc6bf53891c487e414db16f1038"/></dir><file name="nuncio.css" hash="e30e31b94d96b0b27c80ad6d943d7010"/><dir name="spread"><file name="bottom-left-c.gif" hash="84641d08576f68a11f717103365dfb83"/><file name="bottom-middle.gif" hash="20ab265c67355c5b72cdcdc8739af555"/><file name="bottom-right-c.gif" hash="cb27b72623e997badc599e76024a6e44"/><file name="button-close-focus.gif" hash="99c44a6df2733b58083af7a4d9522116"/><file name="button-max-focus.gif" hash="408cd33fa89269b8395bf10afe69d456"/><file name="button-min-focus.gif" hash="ae06210658bad8bcc88dea377c4dc908"/><file name="frame-left.gif" hash="63dc99b0c4ba0518688f7eca1f1628ca"/><file name="frame-right.gif" hash="a03585eec830f37898c7041d557dafc5"/><file name="left-top.gif" hash="7c78b8b59976d19191acf940cbfc04fb"/><file name="right-top.gif" hash="597530287fe1dc491278f855749f7e01"/><file name="top-middle.gif" hash="fa6fd6b90945c47f8d1718d9139d0a75"/><file name=".gif" hash="9dd39829e7cfdd06f3317a931bdc177e"/></dir><file name="spread.css" hash="a804413d7f1f9550c134477f6f9219ee"/></dir></dir></dir><dir name="scriptaculous"><file name="builder.js" hash="1174f6fc34ca5d54ba10b0c719386e7c"/><file name="controls.js" hash="8c414e1787c0ac9f10b16b252361c8b2"/><file name="dragdrop.js" hash="c824212f4d19277be0fd11a87a9cd0fd"/><file name="effects.js" hash="d795089f95a22306cca9b337c439c65a"/><file name="scriptaculous.js" hash="d59eba4e0b14b672208b0862ae1c2196"/><file name="slider.js" hash="6043f96a71d2685fecd02e2ab99e84d9"/><file name="sound.js" hash="0f0fab23fa2cb1bc7717fd2bdf45402e"/><file name="unittest.js" hash="99969698b22272f77bdf4c64586862b3"/></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
18
  </package>