15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*  Prototype JavaScript framework, version 1.7
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  (c) 2005-2010 Sam Stephenson
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Prototype is freely distributable under the terms of an MIT-style license.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  For details, see the Prototype web site: http://www.prototypejs.org/
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *--------------------------------------------------------------------------*/
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Prototype = {
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Version: '1.7',
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Browser: (function(){
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var ua = navigator.userAgent;
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return {
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      IE:             !!window.attachEvent && !isOpera,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Opera:          isOpera,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      WebKit:         ua.indexOf('AppleWebKit/') > -1,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      MobileSafari:   /Apple.*Mobile/.test(ua)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })(),
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  BrowserFeatures: {
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    XPath: !!document.evaluate,
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SelectorsAPI: !!document.querySelector,
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ElementExtensions: (function() {
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var constructor = window.Element || window.HTMLElement;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return !!(constructor && constructor.prototype);
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })(),
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SpecificElementExtensions: (function() {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (typeof window.HTMLDivElement !== 'undefined')
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var div = document.createElement('div'),
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          form = document.createElement('form'),
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          isSupported = false;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isSupported = true;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      div = form = null;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return isSupported;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })()
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  emptyFunction: function() { },
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  K: function(x) { return x }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (Prototype.Browser.MobileSafari)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Prototype.BrowserFeatures.SpecificElementExtensions = false;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Abstract = { };
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Try = {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  these: function() {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var returnValue;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = arguments.length; i < length; i++) {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var lambda = arguments[i];
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      try {
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        returnValue = lambda();
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch (e) { }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnValue;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* Based on Alex Arnell's inheritance implementation. */
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Class = (function() {
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var IS_DONTENUM_BUGGY = (function(){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var p in { toString: 1 }) {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (p === 'toString') return false;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })();
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function subclass() {};
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function create() {
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var parent = null, properties = $A(arguments);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isFunction(properties[0]))
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      parent = properties.shift();
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function klass() {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.initialize.apply(this, arguments);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(klass, Class.Methods);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    klass.superclass = parent;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    klass.subclasses = [];
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parent) {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      subclass.prototype = parent.prototype;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      klass.prototype = new subclass;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      parent.subclasses.push(klass);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = properties.length; i < length; i++)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      klass.addMethods(properties[i]);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!klass.prototype.initialize)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      klass.prototype.initialize = Prototype.emptyFunction;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    klass.prototype.constructor = klass;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return klass;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function addMethods(source) {
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var ancestor   = this.superclass && this.superclass.prototype,
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        properties = Object.keys(source);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (IS_DONTENUM_BUGGY) {
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (source.toString != Object.prototype.toString)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        properties.push("toString");
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (source.valueOf != Object.prototype.valueOf)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        properties.push("valueOf");
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = properties.length; i < length; i++) {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var property = properties[i], value = source[property];
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (ancestor && Object.isFunction(value) &&
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          value.argumentNames()[0] == "$super") {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var method = value;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value = (function(m) {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return function() { return ancestor[m].apply(this, arguments); };
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        })(property).wrap(method);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value.valueOf = method.valueOf.bind(method);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value.toString = method.toString.bind(method);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.prototype[property] = value;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    create: create,
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Methods: {
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      addMethods: addMethods
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var _toString = Object.prototype.toString,
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      NULL_TYPE = 'Null',
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      UNDEFINED_TYPE = 'Undefined',
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      BOOLEAN_TYPE = 'Boolean',
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      NUMBER_TYPE = 'Number',
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      STRING_TYPE = 'String',
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      OBJECT_TYPE = 'Object',
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      FUNCTION_CLASS = '[object Function]',
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      BOOLEAN_CLASS = '[object Boolean]',
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      NUMBER_CLASS = '[object Number]',
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      STRING_CLASS = '[object String]',
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ARRAY_CLASS = '[object Array]',
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DATE_CLASS = '[object Date]',
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON &&
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typeof JSON.stringify === 'function' &&
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        JSON.stringify(0) === '0' &&
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typeof JSON.stringify(Prototype.K) === 'undefined';
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function Type(o) {
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch(o) {
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case null: return NULL_TYPE;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case (void 0): return UNDEFINED_TYPE;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var type = typeof o;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch(type) {
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'boolean': return BOOLEAN_TYPE;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'number':  return NUMBER_TYPE;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'string':  return STRING_TYPE;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return OBJECT_TYPE;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function extend(destination, source) {
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var property in source)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      destination[property] = source[property];
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return destination;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inspect(object) {
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (isUndefined(object)) return 'undefined';
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (object === null) return 'null';
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return object.inspect ? object.inspect() : String(object);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (e instanceof RangeError) return '...';
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      throw e;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toJSON(value) {
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Str('', { '': value }, []);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function Str(key, holder, stack) {
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = holder[key],
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        type = typeof value;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') {
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = value.toJSON(key);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var _class = _toString.call(value);
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (_class) {
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case NUMBER_CLASS:
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case BOOLEAN_CLASS:
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case STRING_CLASS:
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value = value.valueOf();
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (value) {
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case null: return 'null';
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case true: return 'true';
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case false: return 'false';
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    type = typeof value;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'string':
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value.inspect(true);
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'number':
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isFinite(value) ? String(value) : 'null';
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'object':
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0, length = stack.length; i < length; i++) {
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (stack[i] === value) { throw new TypeError(); }
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        stack.push(value);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var partial = [];
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (_class === ARRAY_CLASS) {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          for (var i = 0, length = value.length; i < length; i++) {
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var str = Str(i, value, stack);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            partial.push(typeof str === 'undefined' ? 'null' : str);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          partial = '[' + partial.join(',') + ']';
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var keys = Object.keys(value);
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          for (var i = 0, length = keys.length; i < length; i++) {
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var key = keys[i], str = Str(key, value, stack);
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (typeof str !== "undefined") {
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               partial.push(key.inspect(true)+ ':' + str);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             }
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          partial = '{' + partial.join(',') + '}';
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        stack.pop();
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return partial;
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function stringify(object) {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return JSON.stringify(object);
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toQueryString(object) {
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $H(object).toQueryString();
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toHTML(object) {
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return object && object.toHTML ? object.toHTML() : String.interpret(object);
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function keys(object) {
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var property in object) {
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (object.hasOwnProperty(property)) {
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results.push(property);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function values(object) {
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var property in object)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      results.push(object[property]);
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function clone(object) {
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return extend({ }, object);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isElement(object) {
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!(object && object.nodeType == 1);
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isArray(object) {
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return _toString.call(object) === ARRAY_CLASS;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var hasNativeIsArray = (typeof Array.isArray == 'function')
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    && Array.isArray([]) && !Array.isArray({});
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (hasNativeIsArray) {
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isArray = Array.isArray;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isHash(object) {
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return object instanceof Hash;
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isFunction(object) {
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return _toString.call(object) === FUNCTION_CLASS;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isString(object) {
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return _toString.call(object) === STRING_CLASS;
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isNumber(object) {
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return _toString.call(object) === NUMBER_CLASS;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isDate(object) {
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return _toString.call(object) === DATE_CLASS;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isUndefined(object) {
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return typeof object === "undefined";
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  extend(Object, {
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extend:        extend,
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect:       inspect,
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toJSON:        NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toQueryString: toQueryString,
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toHTML:        toHTML,
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    keys:          Object.keys || keys,
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    values:        values,
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clone:         clone,
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isElement:     isElement,
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isArray:       isArray,
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isHash:        isHash,
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isFunction:    isFunction,
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isString:      isString,
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isNumber:      isNumber,
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isDate:        isDate,
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isUndefined:   isUndefined
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(Function.prototype, (function() {
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var slice = Array.prototype.slice;
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function update(array, args) {
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var arrayLength = array.length, length = args.length;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (length--) array[arrayLength + length] = args[length];
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return array;
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function merge(array, args) {
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    array = slice.call(array, 0);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return update(array, args);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function argumentNames() {
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      .replace(/\s+/g, '').split(',');
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return names.length == 1 && !names[0] ? [] : names;
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function bind(context) {
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var __method = this, args = slice.call(arguments, 1);
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return function() {
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var a = merge(args, arguments);
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return __method.apply(context, a);
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function bindAsEventListener(context) {
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var __method = this, args = slice.call(arguments, 1);
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return function(event) {
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var a = update([event || window.event], args);
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return __method.apply(context, a);
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function curry() {
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!arguments.length) return this;
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var __method = this, args = slice.call(arguments, 0);
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return function() {
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var a = merge(args, arguments);
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return __method.apply(this, a);
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function delay(timeout) {
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var __method = this, args = slice.call(arguments, 1);
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    timeout = timeout * 1000;
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return window.setTimeout(function() {
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return __method.apply(__method, args);
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }, timeout);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function defer() {
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var args = update([0.01], arguments);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.delay.apply(this, args);
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function wrap(wrapper) {
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var __method = this;
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return function() {
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var a = update([__method.bind(this)], arguments);
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return wrapper.apply(this, a);
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function methodize() {
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this._methodized) return this._methodized;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var __method = this;
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this._methodized = function() {
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var a = update([this], arguments);
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return __method.apply(null, a);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    argumentNames:       argumentNames,
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bind:                bind,
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bindAsEventListener: bindAsEventListener,
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    curry:               curry,
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delay:               delay,
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    defer:               defer,
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wrap:                wrap,
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    methodize:           methodize
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})());
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(proto) {
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toISOString() {
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.getUTCFullYear() + '-' +
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.getUTCDate().toPaddedString(2) + 'T' +
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.getUTCHours().toPaddedString(2) + ':' +
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.getUTCMinutes().toPaddedString(2) + ':' +
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.getUTCSeconds().toPaddedString(2) + 'Z';
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toJSON() {
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.toISOString();
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!proto.toISOString) proto.toISOString = toISOString;
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!proto.toJSON) proto.toJSON = toJSON;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(Date.prototype);
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RegExp.prototype.match = RegExp.prototype.test;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RegExp.escape = function(str) {
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var PeriodicalExecuter = Class.create({
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function(callback, frequency) {
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.callback = callback;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.frequency = frequency;
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.currentlyExecuting = false;
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.registerCallback();
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  registerCallback: function() {
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  execute: function() {
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.callback(this);
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  stop: function() {
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!this.timer) return;
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearInterval(this.timer);
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.timer = null;
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  onTimerEvent: function() {
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!this.currentlyExecuting) {
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      try {
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.currentlyExecuting = true;
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.execute();
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.currentlyExecuting = false;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch(e) {
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.currentlyExecuting = false;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        throw e;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(String, {
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  interpret: function(value) {
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value == null ? '' : String(value);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  specialChar: {
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '\b': '\\b',
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '\t': '\\t',
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '\n': '\\n',
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '\f': '\\f',
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '\r': '\\r',
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '\\': '\\\\'
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(String.prototype, (function() {
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var NATIVE_JSON_PARSE_SUPPORT = window.JSON &&
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typeof JSON.parse === 'function' &&
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    JSON.parse('{"test": true}').test;
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function prepareReplacement(replacement) {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isFunction(replacement)) return replacement;
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var template = new Template(replacement);
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return function(match) { return template.evaluate(match) };
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function gsub(pattern, replacement) {
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result = '', source = this, match;
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replacement = prepareReplacement(replacement);
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(pattern))
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pattern = RegExp.escape(pattern);
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(pattern.length || pattern.source)) {
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      replacement = replacement('');
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return replacement + source.split('').join(replacement) + replacement;
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (source.length > 0) {
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (match = source.match(pattern)) {
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += source.slice(0, match.index);
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += String.interpret(replacement(match));
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        source  = source.slice(match.index + match[0].length);
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else {
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += source, source = '';
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function sub(pattern, replacement, count) {
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replacement = prepareReplacement(replacement);
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    count = Object.isUndefined(count) ? 1 : count;
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.gsub(pattern, function(match) {
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (--count < 0) return match[0];
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return replacement(match);
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function scan(pattern, iterator) {
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.gsub(pattern, iterator);
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String(this);
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function truncate(length, truncation) {
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    length = length || 30;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    truncation = Object.isUndefined(truncation) ? '...' : truncation;
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.length > length ?
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.slice(0, length - truncation.length) + truncation : String(this);
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function strip() {
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(/^\s+/, '').replace(/\s+$/, '');
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function stripTags() {
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function stripScripts() {
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function extractScripts() {
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var matchAll = new RegExp(Prototype.ScriptFragment, 'img'),
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        matchOne = new RegExp(Prototype.ScriptFragment, 'im');
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (this.match(matchAll) || []).map(function(scriptTag) {
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return (scriptTag.match(matchOne) || ['', ''])[1];
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function evalScripts() {
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.extractScripts().map(function(script) { return eval(script) });
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function escapeHTML() {
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function unescapeHTML() {
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toQueryParams(separator) {
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var match = this.strip().match(/([^?#]*)(#.*)?$/);
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!match) return { };
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if ((pair = pair.split('='))[0]) {
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var key = decodeURIComponent(pair.shift()),
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            value = pair.length > 1 ? pair.join('=') : pair[0];
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value != undefined) value = decodeURIComponent(value);
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (key in hash) {
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          hash[key].push(value);
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else hash[key] = value;
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return hash;
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toArray() {
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.split('');
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function succ() {
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.slice(0, this.length - 1) +
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function times(count) {
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return count < 1 ? '' : new Array(count + 1).join(this);
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function camelize() {
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(/-+(.)?/g, function(match, chr) {
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return chr ? chr.toUpperCase() : '';
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function capitalize() {
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function underscore() {
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(/::/g, '/')
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               .replace(/([a-z\d])([A-Z])/g, '$1_$2')
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               .replace(/-/g, '_')
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               .toLowerCase();
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function dasherize() {
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(/_/g, '-');
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inspect(useDoubleQuotes) {
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (character in String.specialChar) {
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String.specialChar[character];
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function unfilterJSON(filter) {
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.replace(filter || Prototype.JSONFilter, '$1');
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isJSON() {
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var str = this;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (str.blank()) return false;
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (/^[\],:{}\s]*$/).test(str);
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function evalJSON(sanitize) {
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var json = this.unfilterJSON(),
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (cx.test(json)) {
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      json = json.replace(cx, function (a) {
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      });
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) { }
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function parseJSON() {
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var json = this.unfilterJSON();
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return JSON.parse(json);
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function include(pattern) {
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.indexOf(pattern) > -1;
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function startsWith(pattern) {
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.lastIndexOf(pattern, 0) === 0;
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function endsWith(pattern) {
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var d = this.length - pattern.length;
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return d >= 0 && this.indexOf(pattern, d) === d;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function empty() {
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this == '';
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function blank() {
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return /^\s*$/.test(this);
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function interpolate(object, pattern) {
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Template(this, pattern).evaluate(object);
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gsub:           gsub,
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sub:            sub,
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scan:           scan,
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    truncate:       truncate,
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    strip:          String.prototype.trim || strip,
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stripTags:      stripTags,
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stripScripts:   stripScripts,
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extractScripts: extractScripts,
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    evalScripts:    evalScripts,
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    escapeHTML:     escapeHTML,
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unescapeHTML:   unescapeHTML,
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toQueryParams:  toQueryParams,
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parseQuery:     toQueryParams,
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toArray:        toArray,
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    succ:           succ,
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    times:          times,
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    camelize:       camelize,
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    capitalize:     capitalize,
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    underscore:     underscore,
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dasherize:      dasherize,
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect:        inspect,
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unfilterJSON:   unfilterJSON,
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isJSON:         isJSON,
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    evalJSON:       NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    include:        include,
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    startsWith:     startsWith,
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    endsWith:       endsWith,
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    empty:          empty,
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    blank:          blank,
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    interpolate:    interpolate
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})());
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Template = Class.create({
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function(template, pattern) {
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.template = template.toString();
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.pattern = pattern || Template.Pattern;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  evaluate: function(object) {
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (object && Object.isFunction(object.toTemplateReplacements))
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      object = object.toTemplateReplacements();
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.template.gsub(this.pattern, function(match) {
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (object == null) return (match[1] + '');
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var before = match[1] || '';
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (before == '\\') return match[2];
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var ctx = object, expr = match[3],
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      match = pattern.exec(expr);
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (match == null) return before;
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      while (match != null) {
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ctx = ctx[comp];
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (null == ctx || '' == match[3]) break;
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        match = pattern.exec(expr);
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return before + String.interpret(ctx);
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var $break = { };
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Enumerable = (function() {
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function each(iterator, context) {
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var index = 0;
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this._each(function(value) {
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        iterator.call(context, value, index++);
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      });
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (e != $break) throw e;
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function eachSlice(number, iterator, context) {
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var index = -number, slices = [], array = this.toArray();
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (number < 1) return array;
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while ((index += number) < array.length)
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      slices.push(array.slice(index, index+number));
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return slices.collect(iterator, context);
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function all(iterator, context) {
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result = true;
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result = result && !!iterator.call(context, value, index);
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!result) throw $break;
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function any(iterator, context) {
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result = false;
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (result = !!iterator.call(context, value, index))
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        throw $break;
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function collect(iterator, context) {
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      results.push(iterator.call(context, value, index));
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function detect(iterator, context) {
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result;
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (iterator.call(context, value, index)) {
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = value;
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        throw $break;
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function findAll(iterator, context) {
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (iterator.call(context, value, index))
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results.push(value);
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function grep(filter, iterator, context) {
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(filter))
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      filter = new RegExp(RegExp.escape(filter));
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (filter.match(value))
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results.push(iterator.call(context, value, index));
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function include(object) {
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isFunction(this.indexOf))
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this.indexOf(object) != -1) return true;
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var found = false;
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value) {
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (value == object) {
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        found = true;
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        throw $break;
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return found;
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inGroupsOf(number, fillWith) {
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.eachSlice(number, function(slice) {
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      while(slice.length < number) slice.push(fillWith);
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return slice;
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inject(memo, iterator, context) {
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      memo = iterator.call(context, memo, value, index);
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return memo;
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function invoke(method) {
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var args = $A(arguments).slice(1);
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.map(function(value) {
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return value[method].apply(value, args);
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function max(iterator, context) {
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result;
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = iterator.call(context, value, index);
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (result == null || value >= result)
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = value;
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function min(iterator, context) {
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result;
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = iterator.call(context, value, index);
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (result == null || value < result)
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = value;
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function partition(iterator, context) {
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    iterator = iterator || Prototype.K;
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var trues = [], falses = [];
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (iterator.call(context, value, index) ?
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        trues : falses).push(value);
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return [trues, falses];
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function pluck(property) {
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value) {
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      results.push(value[property]);
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function reject(iterator, context) {
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(value, index) {
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!iterator.call(context, value, index))
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results.push(value);
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function sortBy(iterator, context) {
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.map(function(value, index) {
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return {
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value: value,
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        criteria: iterator.call(context, value, index)
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      };
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }).sort(function(left, right) {
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var a = left.criteria, b = right.criteria;
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return a < b ? -1 : a > b ? 1 : 0;
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }).pluck('value');
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toArray() {
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.map();
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function zip() {
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var iterator = Prototype.K, args = $A(arguments);
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isFunction(args.last()))
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      iterator = args.pop();
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var collections = [this].concat(args).map($A);
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.map(function(value, index) {
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return iterator(collections.pluck(index));
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function size() {
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.toArray().length;
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inspect() {
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return '#<Enumerable:' + this.toArray().inspect() + '>';
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    each:       each,
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eachSlice:  eachSlice,
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    all:        all,
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    every:      all,
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    any:        any,
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    some:       any,
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collect:    collect,
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    map:        collect,
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    detect:     detect,
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    findAll:    findAll,
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    select:     findAll,
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filter:     findAll,
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    grep:       grep,
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    include:    include,
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    member:     include,
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inGroupsOf: inGroupsOf,
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inject:     inject,
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    invoke:     invoke,
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    max:        max,
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    min:        min,
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    partition:  partition,
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pluck:      pluck,
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reject:     reject,
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sortBy:     sortBy,
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toArray:    toArray,
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    entries:    toArray,
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    zip:        zip,
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size:       size,
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect:    inspect,
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    find:       detect
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $A(iterable) {
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!iterable) return [];
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if ('toArray' in Object(iterable)) return iterable.toArray();
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var length = iterable.length || 0, results = new Array(length);
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while (length--) results[length] = iterable[length];
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return results;
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $w(string) {
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!Object.isString(string)) return [];
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  string = string.strip();
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return string ? string.split(/\s+/) : [];
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Array.from = $A;
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var arrayProto = Array.prototype,
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      slice = arrayProto.slice,
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function each(iterator, context) {
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = this.length >>> 0; i < length; i++) {
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (i in this) iterator.call(context, this[i], i, this);
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!_each) _each = each;
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function clear() {
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.length = 0;
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function first() {
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this[0];
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function last() {
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this[this.length - 1];
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function compact() {
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.select(function(value) {
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return value != null;
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function flatten() {
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.inject([], function(array, value) {
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isArray(value))
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return array.concat(value.flatten());
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      array.push(value);
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return array;
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function without() {
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var values = slice.call(arguments, 0);
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.select(function(value) {
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return !values.include(value);
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function reverse(inline) {
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (inline === false ? this.toArray() : this)._reverse();
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function uniq(sorted) {
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.inject([], function(array, value, index) {
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        array.push(value);
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return array;
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function intersect(array) {
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.uniq().findAll(function(item) {
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return array.detect(function(value) { return item === value });
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function clone() {
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return slice.call(this, 0);
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function size() {
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.length;
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inspect() {
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return '[' + this.map(Object.inspect).join(', ') + ']';
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function indexOf(item, i) {
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    i || (i = 0);
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var length = this.length;
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (i < 0) i = length + i;
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (; i < length; i++)
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this[i] === item) return i;
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return -1;
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function lastIndexOf(item, i) {
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var n = this.slice(0, i).reverse().indexOf(item);
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (n < 0) ? n : i - n - 1;
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function concat() {
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var array = slice.call(this, 0), item;
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = arguments.length; i < length; i++) {
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      item = arguments[i];
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isArray(item) && !('callee' in item)) {
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          array.push(item[j]);
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else {
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        array.push(item);
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return array;
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(arrayProto, Enumerable);
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!arrayProto._reverse)
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    arrayProto._reverse = arrayProto.reverse;
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(arrayProto, {
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _each:     _each,
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clear:     clear,
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    first:     first,
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    last:      last,
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    compact:   compact,
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    flatten:   flatten,
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    without:   without,
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reverse:   reverse,
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uniq:      uniq,
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    intersect: intersect,
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clone:     clone,
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toArray:   clone,
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size:      size,
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect:   inspect
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var CONCAT_ARGUMENTS_BUGGY = (function() {
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return [].concat(arguments)[0][0] !== 1;
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })(1,2)
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $H(object) {
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return new Hash(object);
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Hash = Class.create(Enumerable, (function() {
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function initialize(object) {
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _each(iterator) {
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var key in this._object) {
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var value = this._object[key], pair = [key, value];
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pair.key = key;
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pair.value = value;
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      iterator(pair);
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function set(key, value) {
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this._object[key] = value;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function get(key) {
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this._object[key] !== Object.prototype[key])
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this._object[key];
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function unset(key) {
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = this._object[key];
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete this._object[key];
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value;
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toObject() {
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Object.clone(this._object);
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function keys() {
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.pluck('key');
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function values() {
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.pluck('value');
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function index(value) {
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var match = this.detect(function(pair) {
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return pair.value === value;
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return match && match.key;
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function merge(object) {
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.clone().update(object);
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function update(object) {
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Hash(object).inject(this, function(result, pair) {
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      result.set(pair.key, pair.value);
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return result;
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toQueryPair(key, value) {
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(value)) return key;
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return key + '=' + encodeURIComponent(String.interpret(value));
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toQueryString() {
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.inject([], function(results, pair) {
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var key = encodeURIComponent(pair.key), values = pair.value;
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (values && typeof values == 'object') {
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Object.isArray(values)) {
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var queryValues = [];
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          for (var i = 0, len = values.length, value; i < len; i++) {
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            value = values[i];
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            queryValues.push(toQueryPair(key, value));
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return results.concat(queryValues);
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else results.push(toQueryPair(key, values));
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return results;
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }).join('&');
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inspect() {
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return '#<Hash:{' + this.map(function(pair) {
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return pair.map(Object.inspect).join(': ');
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }).join(', ') + '}>';
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function clone() {
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Hash(this);
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    initialize:             initialize,
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _each:                  _each,
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set:                    set,
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get:                    get,
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unset:                  unset,
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toObject:               toObject,
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toTemplateReplacements: toObject,
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    keys:                   keys,
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    values:                 values,
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    index:                  index,
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    merge:                  merge,
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    update:                 update,
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toQueryString:          toQueryString,
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect:                inspect,
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toJSON:                 toObject,
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clone:                  clone
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})());
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.from = $H;
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(Number.prototype, (function() {
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toColorPart() {
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.toPaddedString(2, 16);
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function succ() {
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this + 1;
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function times(iterator, context) {
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $R(0, this, true).each(iterator, context);
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toPaddedString(length, radix) {
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var string = this.toString(radix || 10);
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return '0'.times(length - string.length) + string;
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function abs() {
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Math.abs(this);
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function round() {
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Math.round(this);
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function ceil() {
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Math.ceil(this);
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function floor() {
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Math.floor(this);
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toColorPart:    toColorPart,
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    succ:           succ,
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    times:          times,
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toPaddedString: toPaddedString,
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    abs:            abs,
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    round:          round,
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ceil:           ceil,
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    floor:          floor
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})());
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $R(start, end, exclusive) {
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return new ObjectRange(start, end, exclusive);
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var ObjectRange = Class.create(Enumerable, (function() {
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function initialize(start, end, exclusive) {
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.start = start;
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.end = end;
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.exclusive = exclusive;
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _each(iterator) {
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = this.start;
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (this.include(value)) {
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      iterator(value);
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = value.succ();
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function include(value) {
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value < this.start)
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return false;
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.exclusive)
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return value < this.end;
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value <= this.end;
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    initialize: initialize,
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _each:      _each,
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    include:    include
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})());
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Ajax = {
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getTransport: function() {
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Try.these(
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      function() {return new XMLHttpRequest()},
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ) || false;
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  activeRequestCount: 0
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Responders = {
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  responders: [],
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  _each: function(iterator) {
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.responders._each(iterator);
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  register: function(responder) {
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!this.include(responder))
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.responders.push(responder);
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unregister: function(responder) {
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.responders = this.responders.without(responder);
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  dispatch: function(callback, request, transport, json) {
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.each(function(responder) {
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isFunction(responder[callback])) {
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        try {
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          responder[callback].apply(responder, [request, transport, json]);
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } catch (e) { }
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(Ajax.Responders, Enumerable);
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Responders.register({
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  onCreate:   function() { Ajax.activeRequestCount++ },
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  onComplete: function() { Ajax.activeRequestCount-- }
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Base = Class.create({
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function(options) {
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.options = {
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      method:       'post',
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      asynchronous: true,
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      contentType:  'application/x-www-form-urlencoded',
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      encoding:     'UTF-8',
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      parameters:   '',
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      evalJSON:     true,
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      evalJS:       true
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(this.options, options || { });
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.options.method = this.options.method.toLowerCase();
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isHash(this.options.parameters))
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.options.parameters = this.options.parameters.toObject();
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Request = Class.create(Ajax.Base, {
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  _complete: false,
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function($super, url, options) {
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $super(options);
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.transport = Ajax.getTransport();
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.request(url);
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  request: function(url) {
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.url = url;
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.method = this.options.method;
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var params = Object.isString(this.options.parameters) ?
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          this.options.parameters :
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Object.toQueryString(this.options.parameters);
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!['get', 'post'].include(this.method)) {
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      params += (params ? '&' : '') + "_method=" + this.method;
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.method = 'post';
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (params && this.method === 'get') {
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.url += (this.url.include('?') ? '&' : '?') + params;
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.parameters = params.toQueryParams();
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var response = new Ajax.Response(this);
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this.options.onCreate) this.options.onCreate(response);
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Ajax.Responders.dispatch('onCreate', this, response);
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.transport.open(this.method.toUpperCase(), this.url,
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.options.asynchronous);
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.transport.onreadystatechange = this.onStateChange.bind(this);
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.setRequestHeaders();
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.transport.send(this.body);
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      /* Force Firefox to handle ready state 4 for synchronous requests */
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!this.options.asynchronous && this.transport.overrideMimeType)
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.onStateChange();
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    catch (e) {
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.dispatchException(e);
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  onStateChange: function() {
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var readyState = this.transport.readyState;
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (readyState > 1 && !((readyState == 4) && this._complete))
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.respondToReadyState(this.transport.readyState);
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  setRequestHeaders: function() {
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var headers = {
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'X-Requested-With': 'XMLHttpRequest',
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'X-Prototype-Version': Prototype.Version,
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.method == 'post') {
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      headers['Content-type'] = this.options.contentType +
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (this.options.encoding ? '; charset=' + this.options.encoding : '');
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      /* Force "Connection: close" for older Mozilla browsers to work
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       * around a bug where XMLHttpRequest sends an incorrect
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       * Content-length header. See Mozilla Bugzilla #246651.
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       */
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this.transport.overrideMimeType &&
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            headers['Connection'] = 'close';
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (typeof this.options.requestHeaders == 'object') {
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var extras = this.options.requestHeaders;
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isFunction(extras.push))
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0, length = extras.length; i < length; i += 2)
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          headers[extras[i]] = extras[i+1];
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var name in headers)
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.transport.setRequestHeader(name, headers[name]);
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  success: function() {
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var status = this.getStatus();
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !status || (status >= 200 && status < 300) || status == 304;
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getStatus: function() {
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this.transport.status === 1223) return 204;
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.transport.status || 0;
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) { return 0 }
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  respondToReadyState: function(readyState) {
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (state == 'Complete') {
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      try {
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._complete = true;
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (this.options['on' + response.status]
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         || Prototype.emptyFunction)(response, response.headerJSON);
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch (e) {
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchException(e);
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var contentType = response.getHeader('Content-type');
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this.options.evalJS == 'force'
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          || (this.options.evalJS && this.isSameOrigin() && contentType
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.evalResponse();
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.dispatchException(e);
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (state == 'Complete') {
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.transport.onreadystatechange = Prototype.emptyFunction;
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  isSameOrigin: function() {
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      protocol: location.protocol,
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      domain: document.domain,
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      port: location.port ? ':' + location.port : ''
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }));
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getHeader: function(name) {
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.transport.getResponseHeader(name) || null;
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) { return null; }
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  evalResponse: function() {
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return eval((this.transport.responseText || '').unfilterJSON());
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.dispatchException(e);
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  dispatchException: function(exception) {
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    (this.options.onException || Prototype.emptyFunction)(this, exception);
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Ajax.Responders.dispatch('onException', this, exception);
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Request.Events =
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Response = Class.create({
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function(request){
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.request = request;
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var transport  = this.transport  = request.transport,
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        readyState = this.readyState = transport.readyState;
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.status       = this.getStatus();
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.statusText   = this.getStatusText();
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.responseText = String.interpret(transport.responseText);
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.headerJSON   = this._getHeaderJSON();
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (readyState == 4) {
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var xml = transport.responseXML;
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.responseXML  = Object.isUndefined(xml) ? null : xml;
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.responseJSON = this._getResponseJSON();
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  status:      0,
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  statusText: '',
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getStatus: Ajax.Request.prototype.getStatus,
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getStatusText: function() {
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.transport.statusText || '';
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) { return '' }
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getHeader: Ajax.Request.prototype.getHeader,
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getAllHeaders: function() {
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.getAllResponseHeaders();
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) { return null }
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getResponseHeader: function(name) {
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.transport.getResponseHeader(name);
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getAllResponseHeaders: function() {
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.transport.getAllResponseHeaders();
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  _getHeaderJSON: function() {
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var json = this.getHeader('X-JSON');
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!json) return null;
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    json = decodeURIComponent(escape(json));
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return json.evalJSON(this.request.options.sanitizeJSON ||
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        !this.request.isSameOrigin());
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.request.dispatchException(e);
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  _getResponseJSON: function() {
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var options = this.request.options;
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!options.evalJSON || (options.evalJSON != 'force' &&
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      !(this.getHeader('Content-type') || '').include('application/json')) ||
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.responseText.blank())
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return null;
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.responseText.evalJSON(options.sanitizeJSON ||
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        !this.request.isSameOrigin());
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.request.dispatchException(e);
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.Updater = Class.create(Ajax.Request, {
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function($super, container, url, options) {
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.container = {
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      success: (container.success || container),
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      failure: (container.failure || (container.success ? null : container))
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    options = Object.clone(options);
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var onComplete = options.onComplete;
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    options.onComplete = (function(response, json) {
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.updateContent(response.responseText);
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isFunction(onComplete)) onComplete(response, json);
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }).bind(this);
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $super(url, options);
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  updateContent: function(responseText) {
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var receiver = this.container[this.success() ? 'success' : 'failure'],
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        options = this.options;
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!options.evalScripts) responseText = responseText.stripScripts();
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (receiver = $(receiver)) {
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (options.insertion) {
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Object.isString(options.insertion)) {
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var insertion = { }; insertion[options.insertion] = responseText;
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          receiver.insert(insertion);
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else options.insertion(receiver, responseText);
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else receiver.update(responseText);
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function($super, container, url, options) {
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $super(options);
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.onComplete = this.options.onComplete;
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.frequency = (this.options.frequency || 2);
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.decay = (this.options.decay || 1);
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.updater = { };
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.container = container;
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.url = url;
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.start();
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  start: function() {
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.options.onComplete = this.updateComplete.bind(this);
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.onTimerEvent();
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  stop: function() {
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.updater.options.onComplete = undefined;
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearTimeout(this.timer);
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  updateComplete: function(response) {
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.options.decay) {
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.decay = (response.responseText == this.lastText ?
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.decay * this.options.decay : 1);
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.lastText = response.responseText;
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  onTimerEvent: function() {
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.updater = new Ajax.Updater(this.container, this.url, this.options);
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $(element) {
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (arguments.length > 1) {
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      elements.push($(arguments[i]));
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return elements;
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Object.isString(element))
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = document.getElementById(element);
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return Element.extend(element);
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (Prototype.BrowserFeatures.XPath) {
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  document._getElementsByXPath = function(expression, parentElement) {
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [];
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var query = document.evaluate(expression, $(parentElement) || document,
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = query.snapshotLength; i < length; i++)
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      results.push(Element.extend(query.snapshotItem(i)));
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (!Node) var Node = { };
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (!Node.ELEMENT_NODE) {
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(Node, {
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ELEMENT_NODE: 1,
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ATTRIBUTE_NODE: 2,
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TEXT_NODE: 3,
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CDATA_SECTION_NODE: 4,
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ENTITY_REFERENCE_NODE: 5,
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ENTITY_NODE: 6,
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PROCESSING_INSTRUCTION_NODE: 7,
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COMMENT_NODE: 8,
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOCUMENT_NODE: 9,
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOCUMENT_TYPE_NODE: 10,
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOCUMENT_FRAGMENT_NODE: 11,
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NOTATION_NODE: 12
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(global) {
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function shouldUseCache(tagName, attributes) {
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (tagName === 'select') return false;
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ('type' in attributes) return false;
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var el = document.createElement('<input name="x">');
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return el.tagName.toLowerCase() === 'input' && el.name === 'x';
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    catch(err) {
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return false;
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })();
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var element = global.Element;
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  global.Element = function(tagName, attributes) {
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    attributes = attributes || { };
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tagName = tagName.toLowerCase();
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var cache = Element.cache;
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {
18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      tagName = '<' + tagName + ' name="' + attributes.name + '">';
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      delete attributes.name;
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Element.writeAttribute(document.createElement(tagName), attributes);
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var node = shouldUseCache(tagName, attributes) ?
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     cache[tagName].cloneNode(false) : document.createElement(tagName);
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.writeAttribute(node, attributes);
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(global.Element, element || { });
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (element) global.Element.prototype = element.prototype;
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(this);
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.idCounter = 1;
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.cache = { };
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element._purgeElement = function(element) {
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var uid = element._prototypeUID;
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (uid) {
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element.stopObserving(element);
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element._prototypeUID = void 0;
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete Element.Storage[uid];
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Methods = {
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  visible: function(element) {
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(element).style.display != 'none';
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  toggle: function(element) {
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element[Element.visible(element) ? 'hide' : 'show'](element);
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  hide: function(element) {
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.style.display = 'none';
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  show: function(element) {
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.style.display = '';
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  remove: function(element) {
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.parentNode.removeChild(element);
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  update: (function(){
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var el = document.createElement("select"),
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          isBuggy = true;
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      el.innerHTML = "<option value=\"test\">test</option>";
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (el.options && el.options[0]) {
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      el = null;
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return isBuggy;
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })();
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      try {
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var el = document.createElement("table");
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (el && el.tBodies) {
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var isBuggy = typeof el.tBodies[0] == "undefined";
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          el = null;
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return isBuggy;
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch (e) {
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })();
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var LINK_ELEMENT_INNERHTML_BUGGY = (function() {
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      try {
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var el = document.createElement('div');
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        el.innerHTML = "<link>";
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var isBuggy = (el.childNodes.length === 0);
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        el = null;
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isBuggy;
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch(e) {
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })();
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY ||
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY;
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var s = document.createElement("script"),
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          isBuggy = false;
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      try {
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s.appendChild(document.createTextNode(""));
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isBuggy = !s.firstChild ||
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          s.firstChild && s.firstChild.nodeType !== 3;
19965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch (e) {
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isBuggy = true;
19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      s = null;
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return isBuggy;
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })();
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function update(element, content) {
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = $(element);
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var purgeElement = Element._purgeElement;
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var descendants = element.getElementsByTagName('*'),
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       i = descendants.length;
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      while (i--) purgeElement(descendants[i]);
20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (content && content.toElement)
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        content = content.toElement();
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isElement(content))
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return element.update().insert(content);
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content = Object.toHTML(content);
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var tagName = element.tagName.toUpperCase();
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.text = content;
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return element;
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (ANY_INNERHTML_BUGGY) {
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (tagName in Element._insertionTranslations.tags) {
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          while (element.firstChild) {
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            element.removeChild(element.firstChild);
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Element._getContentFromAnonymousElement(tagName, content.stripScripts())
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            .each(function(node) {
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              element.appendChild(node)
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            });
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) {
20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          while (element.firstChild) {
20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            element.removeChild(element.firstChild);
20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true);
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          nodes.each(function(node) { element.appendChild(node) });
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          element.innerHTML = content.stripScripts();
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else {
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.innerHTML = content.stripScripts();
20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content.evalScripts.bind(content).defer();
20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return update;
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })(),
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  replace: function(element, content) {
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (content && content.toElement) content = content.toElement();
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (!Object.isElement(content)) {
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content = Object.toHTML(content);
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var range = element.ownerDocument.createRange();
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      range.selectNode(element);
20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content.evalScripts.bind(content).defer();
20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content = range.createContextualFragment(content.stripScripts());
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.parentNode.replaceChild(content, element);
20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  insert: function(element, insertions) {
20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(insertions) || Object.isNumber(insertions) ||
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          insertions = {bottom:insertions};
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var content, insert, tagName, childNodes;
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var position in insertions) {
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content  = insertions[position];
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      position = position.toLowerCase();
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      insert = Element._insertionTranslations[position];
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (content && content.toElement) content = content.toElement();
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isElement(content)) {
20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        insert(element, content);
20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        continue;
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content = Object.toHTML(content);
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      tagName = ((position == 'before' || position == 'after')
20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ? element.parentNode : element).tagName.toUpperCase();
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (position == 'top' || position == 'after') childNodes.reverse();
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      childNodes.each(insert.curry(element));
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      content.evalScripts.bind(content).defer();
21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  wrap: function(element, wrapper, attributes) {
21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isElement(wrapper))
21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $(wrapper).writeAttribute(attributes || { });
21125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else wrapper = new Element('div', wrapper);
21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element.parentNode)
21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.parentNode.replaceChild(wrapper, element);
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wrapper.appendChild(element);
21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return wrapper;
21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  inspect: function(element) {
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result = '<' + element.tagName.toLowerCase();
21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var property = pair.first(),
21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          attribute = pair.last(),
21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          value = (element[property] || '').toString();
21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (value) result += ' ' + attribute + '=' + value.inspect(true);
21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result + '>';
21305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  recursivelyCollect: function(element, property, maximumLength) {
21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    maximumLength = maximumLength || -1;
21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var elements = [];
21365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (element = element[property]) {
21385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.nodeType == 1)
21395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        elements.push(Element.extend(element));
21405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (elements.length == maximumLength)
21415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return elements;
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ancestors: function(element) {
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.recursivelyCollect(element, 'parentNode');
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  descendants: function(element) {
21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.select(element, "*");
21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  firstDescendant: function(element) {
21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element).firstChild;
21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (element && element.nodeType != 1) element = element.nextSibling;
21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(element);
21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  immediateDescendants: function(element) {
21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var results = [], child = $(element).firstChild;
21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (child) {
21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (child.nodeType === 1) {
21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results.push(Element.extend(child));
21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      child = child.nextSibling;
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return results;
21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  previousSiblings: function(element, maximumLength) {
21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.recursivelyCollect(element, 'previousSibling');
21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  nextSiblings: function(element) {
21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.recursivelyCollect(element, 'nextSibling');
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  siblings: function(element) {
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.previousSiblings(element).reverse()
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      .concat(Element.nextSiblings(element));
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  match: function(element, selector) {
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(selector))
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Prototype.Selector.match(element, selector);
21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return selector.match(element);
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  up: function(element, expression, index) {
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (arguments.length == 1) return $(element.parentNode);
21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var ancestors = Element.ancestors(element);
21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Object.isNumber(expression) ? ancestors[expression] :
21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Prototype.Selector.find(ancestors, expression, index);
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  down: function(element, expression, index) {
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (arguments.length == 1) return Element.firstDescendant(element);
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Object.isNumber(expression) ? Element.descendants(element)[expression] :
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.select(element, expression)[index || 0];
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  previous: function(element, expression, index) {
22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isNumber(expression)) index = expression, expression = false;
22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!Object.isNumber(index)) index = 0;
22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (expression) {
22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Prototype.Selector.find(element.previousSiblings(), expression, index);
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element.recursivelyCollect("previousSibling", index + 1)[index];
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  next: function(element, expression, index) {
22215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isNumber(expression)) index = expression, expression = false;
22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!Object.isNumber(index)) index = 0;
22245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (expression) {
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Prototype.Selector.find(element.nextSiblings(), expression, index);
22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
22285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var maximumLength = Object.isNumber(index) ? index + 1 : 1;
22295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element.recursivelyCollect("nextSibling", index + 1)[index];
22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  select: function(element) {
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Prototype.Selector.select(expressions, element);
22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  adjacent: function(element) {
22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Prototype.Selector.select(expressions, element.parentNode).without(element);
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  identify: function(element) {
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var id = Element.readAttribute(element, 'id');
22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (id) return id;
22505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id));
22515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element.writeAttribute(element, 'id', id);
22525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return id;
22535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  readAttribute: function(element, name) {
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Prototype.Browser.IE) {
22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var t = Element._attributeTranslations.read;
22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (t.values[name]) return t.values[name](element, name);
22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (t.names[name]) name = t.names[name];
22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (name.include(':')) {
22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (!element.attributes || !element.attributes[name]) ? null :
22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         element.attributes[name].value;
22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.getAttribute(name);
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  writeAttribute: function(element, name, value) {
22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var attributes = { }, t = Element._attributeTranslations.write;
22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (typeof name == 'object') attributes = name;
22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else attributes[name] = Object.isUndefined(value) ? true : value;
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var attr in attributes) {
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      name = t.names[attr] || attr;
22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = attributes[attr];
22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (t.values[attr]) name = t.values[attr](element, value);
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (value === false || value === null)
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.removeAttribute(name);
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else if (value === true)
22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.setAttribute(name, name);
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else element.setAttribute(name, value);
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getHeight: function(element) {
22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.getDimensions(element).height;
22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getWidth: function(element) {
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.getDimensions(element).width;
22955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
22965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  classNames: function(element) {
22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Element.ClassNames(element);
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  hasClassName: function(element, className) {
23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var elementClassName = element.className;
23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (elementClassName.length > 0 && (elementClassName == className ||
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  addClassName: function(element, className) {
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!Element.hasClassName(element, className))
23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.className += (element.className ? ' ' : '') + className;
23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  removeClassName: function(element, className) {
23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.className = element.className.replace(
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  toggleClassName: function(element, className) {
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element[Element.hasClassName(element, className) ?
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'removeClassName' : 'addClassName'](element, className);
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  cleanWhitespace: function(element) {
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var node = element.firstChild;
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (node) {
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var nextNode = node.nextSibling;
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.removeChild(node);
23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      node = nextNode;
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  empty: function(element) {
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(element).innerHTML.blank();
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  descendantOf: function(element, ancestor) {
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element), ancestor = $(ancestor);
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element.compareDocumentPosition)
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return (element.compareDocumentPosition(ancestor) & 8) === 8;
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ancestor.contains)
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return ancestor.contains(element) && ancestor !== element;
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (element = element.parentNode)
23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element == ancestor) return true;
23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  scrollTo: function(element) {
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var pos = Element.cumulativeOffset(element);
23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    window.scrollTo(pos[0], pos[1]);
23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getStyle: function(element, style) {
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style = style == 'float' ? 'cssFloat' : style.camelize();
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = element.style[style];
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value || value == 'auto') {
23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var css = document.defaultView.getComputedStyle(element, null);
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = css ? css[style] : null;
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value == 'auto' ? null : value;
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getOpacity: function(element) {
23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(element).getStyle('opacity');
23805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  setStyle: function(element, styles) {
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var elementStyle = element.style, match;
23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(styles)) {
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.style.cssText += ';' + styles;
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return styles.include('opacity') ?
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var property in styles)
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (property == 'opacity') element.setOpacity(styles[property]);
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        elementStyle[(property == 'float' || property == 'cssFloat') ?
23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            property] = styles[property];
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  setOpacity: function(element, value) {
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.style.opacity = (value == 1 || value === '') ? '' :
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (value < 0.00001) ? 0 : value;
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  makePositioned: function(element) {
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var pos = Element.getStyle(element, 'position');
24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pos == 'static' || !pos) {
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element._madePositioned = true;
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.style.position = 'relative';
24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Prototype.Browser.Opera) {
24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.top = 0;
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.left = 0;
24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  undoPositioned: function(element) {
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element._madePositioned) {
24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element._madePositioned = undefined;
24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.style.position =
24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.top =
24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.left =
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.bottom =
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.right = '';
24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  makeClipping: function(element) {
24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element._overflow) return element;
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element._overflow !== 'hidden')
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.style.overflow = 'hidden';
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  undoClipping: function(element) {
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element._overflow) return element;
24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element._overflow = null;
24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  clonePosition: function(element, source) {
24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var options = Object.extend({
24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      setLeft:    true,
24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      setTop:     true,
24555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      setWidth:   true,
24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      setHeight:  true,
24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      offsetTop:  0,
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      offsetLeft: 0
24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }, arguments[2] || { });
24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    source = $(source);
24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var p = Element.viewportOffset(source), delta = [0, 0], parent = null;
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Element.getStyle(element, 'position') == 'absolute') {
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      parent = Element.getOffsetParent(element);
24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      delta = Element.viewportOffset(parent);
24695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parent == document.body) {
24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      delta[0] -= document.body.offsetLeft;
24735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      delta[1] -= document.body.offsetTop;
24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
24775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
24785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(Element.Methods, {
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getElementsBySelector: Element.Methods.select,
24865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  childElements: Element.Methods.immediateDescendants
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element._attributeTranslations = {
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  write: {
24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    names: {
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      className: 'class',
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      htmlFor:   'for'
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    values: { }
24975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
24985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (Prototype.Browser.Opera) {
25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
25025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function(proceed, element, style) {
25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      switch (style) {
25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'height': case 'width':
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (!Element.visible(element)) return null;
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var dim = parseInt(proceed(element, style), 10);
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (dim !== element['offset' + style.capitalize()])
25105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return dim + 'px';
25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var properties;
25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (style === 'height') {
25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            properties = ['border-top-width', 'padding-top',
25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             'padding-bottom', 'border-bottom-width'];
25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          else {
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            properties = ['border-left-width', 'padding-left',
25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)             'padding-right', 'border-right-width'];
25205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
25215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return properties.inject(dim, function(memo, property) {
25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var val = proceed(element, property);
25235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return val === null ? memo : memo - parseInt(val, 10);
25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }) + 'px';
25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default: return proceed(element, style);
25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  );
25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function(proceed, element, attribute) {
25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (attribute === 'title') return element.title;
25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return proceed(element, attribute);
25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  );
25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)else if (Prototype.Browser.IE) {
25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.getStyle = function(element, style) {
25405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = element.style[style];
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value && element.currentStyle) value = element.currentStyle[style];
25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (style == 'opacity') {
25465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
25475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value[1]) return parseFloat(value[1]) / 100;
25485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return 1.0;
25495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value == 'auto') {
25525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
25535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return element['offset' + style.capitalize()] + 'px';
25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return null;
25555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value;
25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
25585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.setOpacity = function(element, value) {
25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function stripAlpha(filter){
25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return filter.replace(/alpha\([^\)]*\)/gi,'');
25625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var currentStyle = element.currentStyle;
25655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((currentStyle && !currentStyle.hasLayout) ||
25665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (!currentStyle && element.style.zoom == 'normal'))
25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.zoom = 1;
25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var filter = element.getStyle('filter'), style = element.style;
25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value == 1 || value === '') {
25715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (filter = stripAlpha(filter)) ?
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        style.filter = filter : style.removeAttribute('filter');
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (value < 0.00001) value = 0;
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style.filter = stripAlpha(filter) +
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'alpha(opacity=' + (value * 100) + ')';
25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element._attributeTranslations = (function(){
25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var classProp = 'className',
25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forProp = 'for',
25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        el = document.createElement('div');
25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    el.setAttribute(classProp, 'x');
25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (el.className !== 'x') {
25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      el.setAttribute('class', 'x');
25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (el.className === 'x') {
25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        classProp = 'class';
25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    el = null;
25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    el = document.createElement('label');
25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    el.setAttribute(forProp, 'x');
25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (el.htmlFor !== 'x') {
25995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      el.setAttribute('htmlFor', 'x');
26005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (el.htmlFor === 'x') {
26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        forProp = 'htmlFor';
26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    el = null;
26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return {
26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read: {
26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        names: {
26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          'class':      classProp,
26105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          'className':  classProp,
26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          'for':        forProp,
26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          'htmlFor':    forProp
26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        values: {
26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          _getAttr: function(element, attribute) {
26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return element.getAttribute(attribute);
26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          },
26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          _getAttr2: function(element, attribute) {
26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return element.getAttribute(attribute, 2);
26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          },
26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          _getAttrNode: function(element, attribute) {
26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var node = element.getAttributeNode(attribute);
26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node ? node.value : "";
26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          },
26255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          _getEv: (function(){
26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var el = document.createElement('div'), f;
26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            el.onclick = Prototype.emptyFunction;
26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var value = el.getAttribute('onclick');
26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (String(value).indexOf('{') > -1) {
26325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              f = function(element, attribute) {
26335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                attribute = element.getAttribute(attribute);
26345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!attribute) return null;
26355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                attribute = attribute.toString();
26365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                attribute = attribute.split('{')[1];
26375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                attribute = attribute.split('}')[0];
26385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return attribute.strip();
26395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              };
26405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else if (value === '') {
26425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              f = function(element, attribute) {
26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                attribute = element.getAttribute(attribute);
26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!attribute) return null;
26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return attribute.strip();
26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              };
26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            el = null;
26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return f;
26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          })(),
26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          _flag: function(element, attribute) {
26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return $(element).hasAttribute(attribute) ? attribute : null;
26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          },
26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          style: function(element) {
26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return element.style.cssText.toLowerCase();
26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          },
26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          title: function(element) {
26585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return element.title;
26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })();
26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element._attributeTranslations.write = {
26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    names: Object.extend({
26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cellpadding: 'cellPadding',
26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cellspacing: 'cellSpacing'
26695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }, Element._attributeTranslations.read.names),
26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    values: {
26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      checked: function(element, value) {
26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.checked = !!value;
26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      style: function(element, value) {
26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.cssText = value ? value : '';
26775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element._attributeTranslations.has = {};
26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
26865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  (function(v) {
26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(v, {
26915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      href:        v._getAttr2,
26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      src:         v._getAttr2,
26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      type:        v._getAttr,
26945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      action:      v._getAttrNode,
26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      disabled:    v._flag,
26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      checked:     v._flag,
26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      readonly:    v._flag,
26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      multiple:    v._flag,
26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onload:      v._getEv,
27005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onunload:    v._getEv,
27015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onclick:     v._getEv,
27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ondblclick:  v._getEv,
27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onmousedown: v._getEv,
27045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onmouseup:   v._getEv,
27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onmouseover: v._getEv,
27065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onmousemove: v._getEv,
27075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onmouseout:  v._getEv,
27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onfocus:     v._getEv,
27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onblur:      v._getEv,
27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onkeypress:  v._getEv,
27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onkeydown:   v._getEv,
27125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onkeyup:     v._getEv,
27135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onsubmit:    v._getEv,
27145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onreset:     v._getEv,
27155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onselect:    v._getEv,
27165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      onchange:    v._getEv
27175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
27185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  })(Element._attributeTranslations.read.values);
27195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Prototype.BrowserFeatures.ElementExtensions) {
27215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    (function() {
27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      function _descendants(element) {
27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nodes = element.getElementsByTagName('*'), results = [];
27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0, node; node = nodes[i]; i++)
27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (node.tagName !== "!") // Filter out comment nodes.
27265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            results.push(node);
27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return results;
27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
27295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.Methods.down = function(element, expression, index) {
27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element = $(element);
27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (arguments.length == 1) return element.firstDescendant();
27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Object.isNumber(expression) ? _descendants(element)[expression] :
27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Element.select(element, expression)[index || 0];
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })();
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.setOpacity = function(element, value) {
27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.style.opacity = (value == 1) ? 0.999999 :
27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (value === '') ? '' : (value < 0.00001) ? 0 : value;
27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)else if (Prototype.Browser.WebKit) {
27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.setOpacity = function(element, value) {
27525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
27535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.style.opacity = (value == 1 || value === '') ? '' :
27545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (value < 0.00001) ? 0 : value;
27555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value == 1)
27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.tagName.toUpperCase() == 'IMG' && element.width) {
27585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.width++; element.width--;
27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else try {
27605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var n = document.createTextNode(' ');
27615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.appendChild(n);
27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.removeChild(n);
27635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } catch (e) { }
27645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if ('outerHTML' in document.documentElement) {
27705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Methods.replace = function(element, content) {
27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
27725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (content && content.toElement) content = content.toElement();
27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isElement(content)) {
27755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.parentNode.replaceChild(content, element);
27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    content = Object.toHTML(content);
27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Element._insertionTranslations.tags[tagName]) {
27835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var nextSibling = element.next(),
27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      parent.removeChild(element);
27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (nextSibling)
27875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fragments.each(function(node) { parent.appendChild(node) });
27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
27915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else element.outerHTML = content.stripScripts();
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    content.evalScripts.bind(content).defer();
27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element._returnOffset = function(l, t) {
27995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var result = [l, t];
28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result.left = l;
28015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  result.top = t;
28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return result;
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
28045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element._getContentFromAnonymousElement = function(tagName, html, force) {
28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var div = new Element('div'),
28075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      t = Element._insertionTranslations.tags[tagName];
28085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var workaround = false;
28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (t) workaround = true;
28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else if (force) {
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    workaround = true;
28135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    t = ['', '', 0];
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (workaround) {
28175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    div.innerHTML = '&nbsp;' + t[0] + html + t[1];
28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    div.removeChild(div.firstChild);
28195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = t[2]; i--; ) {
28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      div = div.firstChild;
28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else {
28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    div.innerHTML = html;
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return $A(div.childNodes);
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element._insertionTranslations = {
28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  before: function(element, node) {
28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.parentNode.insertBefore(node, element);
28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
28335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  top: function(element, node) {
28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.insertBefore(node, element.firstChild);
28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bottom: function(element, node) {
28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.appendChild(node);
28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  after: function(element, node) {
28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.parentNode.insertBefore(node, element.nextSibling);
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  tags: {
28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TABLE:  ['<table>',                '</table>',                   1],
28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SELECT: ['<select>',               '</select>',                  1]
28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var tags = Element._insertionTranslations.tags;
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(tags, {
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    THEAD: tags.TBODY,
28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TFOOT: tags.TBODY,
28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TH:    tags.TD
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Methods.Simulated = {
28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  hasAttribute: function(element, attribute) {
28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    attribute = Element._attributeTranslations.has[attribute] || attribute;
28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var node = $(element).getAttributeNode(attribute);
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!(node && node.specified);
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Methods.ByTag = { };
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(Element, Element.Methods);
28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(div) {
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    window.HTMLElement = { };
28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    window.HTMLElement.prototype = div['__proto__'];
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Prototype.BrowserFeatures.ElementExtensions = true;
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  div = null;
28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(document.createElement('div'));
28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.extend = (function() {
28855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function checkDeficiency(tagName) {
28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (typeof window.Element != 'undefined') {
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var proto = window.Element.prototype;
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (proto) {
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var id = '_' + (Math.random()+'').slice(2),
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            el = document.createElement(tagName);
28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        proto[id] = 'x';
28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var isBuggy = (el[id] !== 'x');
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete proto[id];
28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        el = null;
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isBuggy;
28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function extendElementWith(element, methods) {
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var property in methods) {
29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var value = methods[property];
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isFunction(value) && !(property in element))
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element[property] = value.methodize();
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
29115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Prototype.BrowserFeatures.SpecificElementExtensions) {
29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return function(element) {
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (element && typeof element._extendedByPrototype == 'undefined') {
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          var t = element.tagName;
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (t && (/^(?:object|applet|embed)$/i.test(t))) {
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            extendElementWith(element, Element.Methods);
29195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            extendElementWith(element, Element.Methods.Simulated);
29205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return element;
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Prototype.K;
29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var Methods = { }, ByTag = Element.Methods.ByTag;
29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var extend = Object.extend(function(element) {
29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element || typeof element._extendedByPrototype != 'undefined' ||
29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.nodeType != 1 || element == window) return element;
29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var methods = Object.clone(Methods),
29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        tagName = element.tagName.toUpperCase();
29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extendElementWith(element, methods);
29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element._extendedByPrototype = Prototype.emptyFunction;
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }, {
29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    refresh: function() {
29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!Prototype.BrowserFeatures.ElementExtensions) {
29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Object.extend(Methods, Element.Methods);
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Object.extend(Methods, Element.Methods.Simulated);
29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
29515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
29535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  extend.refresh();
29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return extend;
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (document.documentElement.hasAttribute) {
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.hasAttribute = function(element, attribute) {
29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.hasAttribute(attribute);
29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)else {
29645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.hasAttribute = Element.Methods.Simulated.hasAttribute;
29655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
29665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.addMethods = function(methods) {
29685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!methods) {
29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(Form, Form.Methods);
29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(Form.Element, Form.Element.Methods);
29735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(Element.Methods.ByTag, {
29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "FORM":     Object.clone(Form.Methods),
29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "INPUT":    Object.clone(Form.Element.Methods),
29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "SELECT":   Object.clone(Form.Element.Methods),
29775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "TEXTAREA": Object.clone(Form.Element.Methods),
29785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "BUTTON":   Object.clone(Form.Element.Methods)
29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
29805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (arguments.length == 2) {
29835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var tagName = methods;
29845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    methods = arguments[1];
29855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!tagName) Object.extend(Element.Methods, methods || { });
29885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else {
29895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isArray(tagName)) tagName.each(extend);
29905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else extend(tagName);
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function extend(tagName) {
29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tagName = tagName.toUpperCase();
29955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!Element.Methods.ByTag[tagName])
29965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.Methods.ByTag[tagName] = { };
29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(Element.Methods.ByTag[tagName], methods);
29985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
29995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function copy(methods, destination, onlyIfAbsent) {
30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onlyIfAbsent = onlyIfAbsent || false;
30025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var property in methods) {
30035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var value = methods[property];
30045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!Object.isFunction(value)) continue;
30055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!onlyIfAbsent || !(property in destination))
30065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        destination[property] = value.methodize();
30075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function findDOMClass(tagName) {
30115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var klass;
30125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var trans = {
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
30145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
30185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
30195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
30205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
30215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      "FrameSet", "IFRAME": "IFrame"
30225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
30235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
30245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (window[klass]) return window[klass];
30255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    klass = 'HTML' + tagName + 'Element';
30265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (window[klass]) return window[klass];
30275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    klass = 'HTML' + tagName.capitalize() + 'Element';
30285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (window[klass]) return window[klass];
30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var element = document.createElement(tagName),
30315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        proto = element['__proto__'] || element.constructor.prototype;
30325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = null;
30345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return proto;
30355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
30385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   Element.prototype;
30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (F.ElementExtensions) {
30415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    copy(Element.Methods, elementPrototype);
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    copy(Element.Methods.Simulated, elementPrototype, true);
30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (F.SpecificElementExtensions) {
30465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var tag in Element.Methods.ByTag) {
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var klass = findDOMClass(tag);
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isUndefined(klass)) continue;
30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      copy(T[tag], klass.prototype);
30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(Element, Element.Methods);
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  delete Element.ByTag;
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Element.extend.refresh) Element.extend.refresh();
30575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.cache = { };
30585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
30595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)document.viewport = {
30625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getDimensions: function() {
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return { width: this.getWidth(), height: this.getHeight() };
30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getScrollOffsets: function() {
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element._returnOffset(
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop);
30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(viewport) {
30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var B = Prototype.Browser, doc = document, element, property = {};
30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function getRootElement() {
30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (B.WebKit && !doc.evaluate)
30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return document;
30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return document.body;
30835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return document.documentElement;
30855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function define(D) {
30885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element) element = getRootElement();
30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    property[D] = 'client' + D;
30915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    viewport['get' + D] = function() { return element[property[D]] };
30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return viewport['get' + D]();
30945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
30955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  viewport.getWidth  = define.curry('Width');
30975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  viewport.getHeight = define.curry('Height');
30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(document.viewport);
31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Storage = {
31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  UID: 1
31045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
31055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.addMethods({
31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getStorage: function(element) {
31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var uid;
31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element === window) {
31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      uid = 0;
31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (typeof element._prototypeUID === "undefined")
31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element._prototypeUID = Element.Storage.UID++;
31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      uid = element._prototypeUID;
31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!Element.Storage[uid])
31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.Storage[uid] = $H();
31215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.Storage[uid];
31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
31245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  store: function(element, key, value) {
31265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
31275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (arguments.length === 2) {
31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.getStorage(element).update(key);
31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
31315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.getStorage(element).set(key, value);
31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
31365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  retrieve: function(element, key, defaultValue) {
31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var hash = Element.getStorage(element), value = hash.get(key);
31405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(value)) {
31425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hash.set(key, defaultValue);
31435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = defaultValue;
31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value;
31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  clone: function(element, deep) {
31505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
31515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var clone = element.cloneNode(deep);
31525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clone._prototypeUID = void 0;
31535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (deep) {
31545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var descendants = Element.select(clone, '*'),
31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          i = descendants.length;
31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      while (i--) {
31575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        descendants[i]._prototypeUID = void 0;
31585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.extend(clone);
31615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
31625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  purge: function(element) {
31645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(element = $(element))) return;
31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var purgeElement = Element._purgeElement;
31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    purgeElement(element);
31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var descendants = element.getElementsByTagName('*'),
31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     i = descendants.length;
31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (i--) purgeElement(descendants[i]);
31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return null;
31755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
31765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
31775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
31795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toDecimal(pctString) {
31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var match = pctString.match(/^(\d+)%?$/i);
31825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!match) return null;
31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (Number(match[1]) / 100);
31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function getPixelValue(value, property, context) {
31875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var element = null;
31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isElement(value)) {
31895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = value;
31905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = element.getStyle(property);
31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value === null) {
31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return null;
31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {
31985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return window.parseFloat(value);
31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var isPercentage = value.include('%'), isViewport = (context === document.viewport);
32025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) {
32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var style = element.style.left, rStyle = element.runtimeStyle.left;
32055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.runtimeStyle.left = element.currentStyle.left;
32065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.style.left = value || 0;
32075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      value = element.style.pixelLeft;
32085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.style.left = style;
32095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.runtimeStyle.left = rStyle;
32105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return value;
32125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element && isPercentage) {
32155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      context = context || element.parentNode;
32165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var decimal = toDecimal(value);
32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var whole = null;
32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var position = element.getStyle('position');
32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var isHorizontal = property.include('left') || property.include('right') ||
32215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       property.include('width');
32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var isVertical =  property.include('top') || property.include('bottom') ||
32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        property.include('height');
32255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (context === document.viewport) {
32275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isHorizontal) {
32285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          whole = document.viewport.getWidth();
32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (isVertical) {
32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          whole = document.viewport.getHeight();
32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
32325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else {
32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isHorizontal) {
32345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          whole = $(context).measure('width');
32355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (isVertical) {
32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          whole = $(context).measure('height');
32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
32385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return (whole === null) ? 0 : whole * decimal;
32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
32445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function toCSSPixels(number) {
32475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(number) && number.endsWith('px')) {
32485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return number;
32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return number + 'px';
32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isDisplayed(element) {
32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var originalElement = element;
32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (element && element.parentNode) {
32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var display = element.getStyle('display');
32575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (display === 'none') {
32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
32595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
32605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = $(element.parentNode);
32615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
32625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var hasLayout = Prototype.K;
32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if ('currentStyle' in document.documentElement) {
32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hasLayout = function(element) {
32685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!element.currentStyle.hasLayout) {
32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.zoom = 1;
32705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function cssNameFor(key) {
32765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (key.include('border')) key = key + '-width';
32775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return key.camelize();
32785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
32795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Layout = Class.create(Hash, {
32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    initialize: function($super, element, preCompute) {
32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      $super();
32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.element = $(element);
32845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.Layout.PROPERTIES.each( function(property) {
32865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._set(property, null);
32875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }, this);
32885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (preCompute) {
32905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._preComputing = true;
32915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._begin();
32925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Element.Layout.PROPERTIES.each( this._compute, this );
32935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._end();
32945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._preComputing = false;
32955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _set: function(property, value) {
32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Hash.prototype.set.call(this, property, value);
33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set: function(property, value) {
33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      throw "Properties of Element.Layout are read-only.";
33045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get: function($super, property) {
33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var value = $super(property);
33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return value === null ? this._compute(property) : value;
33095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _begin: function() {
33125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (this._prepared) return;
33135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var element = this.element;
33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (isDisplayed(element)) {
33165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._prepared = true;
33175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var originalStyles = {
33215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        position:   element.style.position   || '',
33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        width:      element.style.width      || '',
33235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        visibility: element.style.visibility || '',
33245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        display:    element.style.display    || ''
33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      };
33265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.store('prototype_original_styles', originalStyles);
33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var position = element.getStyle('position'),
33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       width = element.getStyle('width');
33315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (width === "0px" || width === null) {
33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.style.display = 'block';
33345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        width = element.getStyle('width');
33355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
33365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var context = (position === 'fixed') ? document.viewport :
33385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       element.parentNode;
33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.setStyle({
33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        position:   'absolute',
33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        visibility: 'hidden',
33435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        display:    'block'
33445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      });
33455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var positionedWidth = element.getStyle('width');
33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var newWidth;
33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (width && (positionedWidth === width)) {
33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newWidth = getPixelValue(element, 'width', context);
33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else if (position === 'absolute' || position === 'fixed') {
33525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newWidth = getPixelValue(element, 'width', context);
33535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else {
33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var parent = element.parentNode, pLayout = $(parent).getLayout();
33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        newWidth = pLayout.get('width') -
33575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         this.get('margin-left') -
33585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         this.get('border-left') -
33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         this.get('padding-left') -
33605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         this.get('padding-right') -
33615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         this.get('border-right') -
33625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         this.get('margin-right');
33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.setStyle({ width: newWidth + 'px' });
33665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this._prepared = true;
33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _end: function() {
33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var element = this.element;
33725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var originalStyles = element.retrieve('prototype_original_styles');
33735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.store('prototype_original_styles', null);
33745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.setStyle(originalStyles);
33755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this._prepared = false;
33765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _compute: function(property) {
33795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var COMPUTATIONS = Element.Layout.COMPUTATIONS;
33805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!(property in COMPUTATIONS)) {
33815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        throw "Property not found.";
33825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
33835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this._set(property, COMPUTATIONS[property].call(this, this.element));
33855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toObject: function() {
33885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var args = $A(arguments);
33895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
33905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       args.join(' ').split(' ');
33915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var obj = {};
33925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      keys.each( function(key) {
33935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!Element.Layout.PROPERTIES.include(key)) return;
33945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var value = this.get(key);
33955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value != null) obj[key] = value;
33965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }, this);
33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return obj;
33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toHash: function() {
34015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var obj = this.toObject.apply(this, arguments);
34025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return new Hash(obj);
34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
34045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toCSS: function() {
34065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var args = $A(arguments);
34075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
34085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       args.join(' ').split(' ');
34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var css = {};
34105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      keys.each( function(key) {
34125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!Element.Layout.PROPERTIES.include(key)) return;
34135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;
34145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var value = this.get(key);
34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value != null) css[cssNameFor(key)] = value + 'px';
34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }, this);
34185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return css;
34195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect: function() {
34225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return "#<Element.Layout>";
34235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
34245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
34255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(Element.Layout, {
34275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    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'),
34285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'),
34305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COMPUTATIONS: {
34325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'height': function(element) {
34335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._begin();
34345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var bHeight = this.get('border-box-height');
34365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (bHeight <= 0) {
34375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (!this._preComputing) this._end();
34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return 0;
34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var bTop = this.get('border-top'),
34425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         bBottom = this.get('border-bottom');
34435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var pTop = this.get('padding-top'),
34455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pBottom = this.get('padding-bottom');
34465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._end();
34485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return bHeight - bTop - bBottom - pTop - pBottom;
34505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
34515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'width': function(element) {
34535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._begin();
34545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var bWidth = this.get('border-box-width');
34565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (bWidth <= 0) {
34575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (!this._preComputing) this._end();
34585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return 0;
34595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
34605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var bLeft = this.get('border-left'),
34625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         bRight = this.get('border-right');
34635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var pLeft = this.get('padding-left'),
34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pRight = this.get('padding-right');
34665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._end();
34685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return bWidth - bLeft - bRight - pLeft - pRight;
34705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
34715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'padding-box-height': function(element) {
34735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var height = this.get('height'),
34745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pTop = this.get('padding-top'),
34755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pBottom = this.get('padding-bottom');
34765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return height + pTop + pBottom;
34785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
34795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'padding-box-width': function(element) {
34815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var width = this.get('width'),
34825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pLeft = this.get('padding-left'),
34835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pRight = this.get('padding-right');
34845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return width + pLeft + pRight;
34865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
34875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'border-box-height': function(element) {
34895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._begin();
34905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var height = element.offsetHeight;
34915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._end();
34925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return height;
34935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
34945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'border-box-width': function(element) {
34965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._begin();
34975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var width = element.offsetWidth;
34985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._preComputing) this._end();
34995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return width;
35005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'margin-box-height': function(element) {
35035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var bHeight = this.get('border-box-height'),
35045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         mTop = this.get('margin-top'),
35055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         mBottom = this.get('margin-bottom');
35065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (bHeight <= 0) return 0;
35085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return bHeight + mTop + mBottom;
35105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'margin-box-width': function(element) {
35135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var bWidth = this.get('border-box-width'),
35145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         mLeft = this.get('margin-left'),
35155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         mRight = this.get('margin-right');
35165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (bWidth <= 0) return 0;
35185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return bWidth + mLeft + mRight;
35205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'top': function(element) {
35235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var offset = element.positionedOffset();
35245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return offset.top;
35255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'bottom': function(element) {
35285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var offset = element.positionedOffset(),
35295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         parent = element.getOffsetParent(),
35305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pHeight = parent.measure('height');
35315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var mHeight = this.get('border-box-height');
35335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pHeight - mHeight - offset.top;
35355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'left': function(element) {
35385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var offset = element.positionedOffset();
35395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return offset.left;
35405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'right': function(element) {
35435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var offset = element.positionedOffset(),
35445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         parent = element.getOffsetParent(),
35455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pWidth = parent.measure('width');
35465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var mWidth = this.get('border-box-width');
35485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pWidth - mWidth - offset.left;
35505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'padding-top': function(element) {
35535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'paddingTop');
35545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'padding-bottom': function(element) {
35575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'paddingBottom');
35585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'padding-left': function(element) {
35615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'paddingLeft');
35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'padding-right': function(element) {
35655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'paddingRight');
35665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'border-top': function(element) {
35695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'borderTopWidth');
35705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'border-bottom': function(element) {
35735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'borderBottomWidth');
35745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'border-left': function(element) {
35775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'borderLeftWidth');
35785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'border-right': function(element) {
35815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'borderRightWidth');
35825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'margin-top': function(element) {
35855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'marginTop');
35865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'margin-bottom': function(element) {
35895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'marginBottom');
35905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'margin-left': function(element) {
35935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'marginLeft');
35945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
35955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'margin-right': function(element) {
35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getPixelValue(element, 'marginRight');
35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
36005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if ('getBoundingClientRect' in document.documentElement) {
36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(Element.Layout.COMPUTATIONS, {
36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'right': function(element) {
36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var parent = hasLayout(element.getOffsetParent());
36065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rect = element.getBoundingClientRect(),
36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pRect = parent.getBoundingClientRect();
36085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (pRect.right - rect.right).round();
36105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      },
36115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      'bottom': function(element) {
36135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var parent = hasLayout(element.getOffsetParent());
36145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rect = element.getBoundingClientRect(),
36155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         pRect = parent.getBoundingClientRect();
36165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (pRect.bottom - rect.bottom).round();
36185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
36195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
36205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
36215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.Offset = Class.create({
36235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    initialize: function(left, top) {
36245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.left = left.round();
36255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.top  = top.round();
36265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this[0] = this.left;
36285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this[1] = this.top;
36295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
36305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    relativeTo: function(offset) {
36325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return new Element.Offset(
36335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.left - offset.left,
36345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.top  - offset.top
36355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      );
36365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
36375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect: function() {
36395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this);
36405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
36415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toString: function() {
36435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return "[#{left}, #{top}]".interpolate(this);
36445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
36455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toArray: function() {
36475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return [this.left, this.top];
36485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
36495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
36505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function getLayout(element, preCompute) {
36525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Element.Layout(element, preCompute);
36535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
36545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function measure(element, property) {
36565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(element).getLayout().get(property);
36575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
36585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function getDimensions(element) {
36605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
36615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var display = Element.getStyle(element, 'display');
36625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (display && display !== 'none') {
36645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return { width: element.offsetWidth, height: element.offsetHeight };
36655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
36665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var style = element.style;
36685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var originalStyles = {
36695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      visibility: style.visibility,
36705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      position:   style.position,
36715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      display:    style.display
36725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
36735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var newStyles = {
36755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      visibility: 'hidden',
36765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      display:    'block'
36775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
36785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (originalStyles.position !== 'fixed')
36805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      newStyles.position = 'absolute';
36815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element.setStyle(element, newStyles);
36835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var dimensions = {
36855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      width:  element.offsetWidth,
36865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      height: element.offsetHeight
36875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
36885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element.setStyle(element, originalStyles);
36905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return dimensions;
36925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
36935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function getOffsetParent(element) {
36955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
36965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
36985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return $(document.body);
36995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var isInline = (Element.getStyle(element, 'display') === 'inline');
37015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isInline && element.offsetParent) return $(element.offsetParent);
37025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while ((element = element.parentNode) && element !== document.body) {
37045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Element.getStyle(element, 'position') !== 'static') {
37055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHtml(element) ? $(document.body) : $(element);
37065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
37075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
37085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(document.body);
37105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
37115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function cumulativeOffset(element) {
37145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
37155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var valueT = 0, valueL = 0;
37165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element.parentNode) {
37175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      do {
37185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        valueT += element.offsetTop  || 0;
37195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        valueL += element.offsetLeft || 0;
37205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element = element.offsetParent;
37215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } while (element);
37225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
37235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Element.Offset(valueL, valueT);
37245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
37255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function positionedOffset(element) {
37275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
37285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var layout = element.getLayout();
37305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var valueT = 0, valueL = 0;
37325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    do {
37335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      valueT += element.offsetTop  || 0;
37345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      valueL += element.offsetLeft || 0;
37355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = element.offsetParent;
37365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element) {
37375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isBody(element)) break;
37385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var p = Element.getStyle(element, 'position');
37395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (p !== 'static') break;
37405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
37415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } while (element);
37425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    valueL -= layout.get('margin-top');
37445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    valueT -= layout.get('margin-left');
37455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Element.Offset(valueL, valueT);
37475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
37485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function cumulativeScrollOffset(element) {
37505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var valueT = 0, valueL = 0;
37515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    do {
37525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      valueT += element.scrollTop  || 0;
37535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      valueL += element.scrollLeft || 0;
37545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = element.parentNode;
37555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } while (element);
37565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Element.Offset(valueL, valueT);
37575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
37585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function viewportOffset(forElement) {
37605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
37615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var valueT = 0, valueL = 0, docBody = document.body;
37625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var element = forElement;
37645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    do {
37655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      valueT += element.offsetTop  || 0;
37665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      valueL += element.offsetLeft || 0;
37675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.offsetParent == docBody &&
37685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Element.getStyle(element, 'position') == 'absolute') break;
37695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } while (element = element.offsetParent);
37705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = forElement;
37725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    do {
37735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element != docBody) {
37745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        valueT -= element.scrollTop  || 0;
37755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        valueL -= element.scrollLeft || 0;
37765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
37775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } while (element = element.parentNode);
37785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Element.Offset(valueL, valueT);
37795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
37805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function absolutize(element) {
37825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
37835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Element.getStyle(element, 'position') === 'absolute') {
37855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
37865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
37875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var offsetParent = getOffsetParent(element);
37895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var eOffset = element.viewportOffset(),
37905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     pOffset = offsetParent.viewportOffset();
37915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var offset = eOffset.relativeTo(pOffset);
37935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var layout = element.getLayout();
37945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.store('prototype_absolutize_original_styles', {
37965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      left:   element.getStyle('left'),
37975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      top:    element.getStyle('top'),
37985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      width:  element.getStyle('width'),
37995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      height: element.getStyle('height')
38005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
38015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.setStyle({
38035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      position: 'absolute',
38045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      top:    offset.top + 'px',
38055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      left:   offset.left + 'px',
38065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      width:  layout.get('width') + 'px',
38075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      height: layout.get('height') + 'px'
38085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
38095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
38115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
38125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function relativize(element) {
38145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
38155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Element.getStyle(element, 'position') === 'relative') {
38165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
38175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
38185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var originalStyles =
38205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     element.retrieve('prototype_absolutize_original_styles');
38215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (originalStyles) element.setStyle(originalStyles);
38235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
38245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
38255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Prototype.Browser.IE) {
38275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    getOffsetParent = getOffsetParent.wrap(
38285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      function(proceed, element) {
38295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element = $(element);
38305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
38325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return $(document.body);
38335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var position = element.getStyle('position');
38355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (position !== 'static') return proceed(element);
38365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.setStyle({ position: 'relative' });
38385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var value = proceed(element);
38395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.setStyle({ position: position });
38405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
38415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
38425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    );
38435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    positionedOffset = positionedOffset.wrap(function(proceed, element) {
38455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = $(element);
38465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!element.parentNode) return new Element.Offset(0, 0);
38475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var position = element.getStyle('position');
38485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (position !== 'static') return proceed(element);
38495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var offsetParent = element.getOffsetParent();
38515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (offsetParent && offsetParent.getStyle('position') === 'fixed')
38525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hasLayout(offsetParent);
38535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.setStyle({ position: 'relative' });
38555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var value = proceed(element);
38565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.setStyle({ position: position });
38575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return value;
38585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
38595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else if (Prototype.Browser.Webkit) {
38605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cumulativeOffset = function(element) {
38615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = $(element);
38625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var valueT = 0, valueL = 0;
38635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      do {
38645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        valueT += element.offsetTop  || 0;
38655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        valueL += element.offsetLeft || 0;
38665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (element.offsetParent == document.body)
38675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (Element.getStyle(element, 'position') == 'absolute') break;
38685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element = element.offsetParent;
38705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } while (element);
38715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return new Element.Offset(valueL, valueT);
38735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
38745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
38755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.addMethods({
38785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    getLayout:              getLayout,
38795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    measure:                measure,
38805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    getDimensions:          getDimensions,
38815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    getOffsetParent:        getOffsetParent,
38825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cumulativeOffset:       cumulativeOffset,
38835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    positionedOffset:       positionedOffset,
38845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cumulativeScrollOffset: cumulativeScrollOffset,
38855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    viewportOffset:         viewportOffset,
38865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    absolutize:             absolutize,
38875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    relativize:             relativize
38885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
38895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isBody(element) {
38915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.nodeName.toUpperCase() === 'BODY';
38925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
38935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isHtml(element) {
38955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.nodeName.toUpperCase() === 'HTML';
38965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
38975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isDocument(element) {
38995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.nodeType === Node.DOCUMENT_NODE;
39005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isDetached(element) {
39035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element !== document.body &&
39045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     !Element.descendantOf(element, document.body);
39055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if ('getBoundingClientRect' in document.documentElement) {
39085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element.addMethods({
39095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      viewportOffset: function(element) {
39105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element = $(element);
39115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isDetached(element)) return new Element.Offset(0, 0);
39125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rect = element.getBoundingClientRect(),
39145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         docEl = document.documentElement;
39155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return new Element.Offset(rect.left - docEl.clientLeft,
39165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         rect.top - docEl.clientTop);
39175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
39185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
39195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
39215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)window.$$ = function() {
39225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var expression = $A(arguments).join(', ');
39235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return Prototype.Selector.select(expression, document);
39245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
39255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Prototype.Selector = (function() {
39275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function select() {
39295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    throw new Error('Method "Prototype.Selector.select" must be defined.');
39305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function match() {
39335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    throw new Error('Method "Prototype.Selector.match" must be defined.');
39345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function find(elements, expression, index) {
39375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    index = index || 0;
39385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i;
39395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = 0; i < length; i++) {
39415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (match(elements[i], expression) && index == matchIndex++) {
39425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Element.extend(elements[i]);
39435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
39445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
39455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function extendElements(elements) {
39485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = elements.length; i < length; i++) {
39495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Element.extend(elements[i]);
39505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
39515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return elements;
39525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
39535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var K = Prototype.K;
39565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
39585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    select: select,
39595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    match: match,
39605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    find: find,
39615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extendElements: (Element.extend === K) ? K : extendElements,
39625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extendElement: Element.extend
39635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
39645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
39655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Prototype._original_property = window.Sizzle;
39665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*!
39675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Sizzle CSS Selector Engine - v1.0
39685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Copyright 2009, The Dojo Foundation
39695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  Released under the MIT, BSD, and GPL Licenses.
39705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *  More information: http://sizzlejs.com/
39715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
39725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
39735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
39755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        done = 0,
39765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        toString = Object.prototype.toString,
39775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        hasDuplicate = false,
39785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        baseHasDuplicate = true;
39795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)[0, 0].sort(function(){
39815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        baseHasDuplicate = false;
39825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
39835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
39845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Sizzle = function(selector, context, results, seed) {
39865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results = results || [];
39875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var origContext = context = context || document;
39885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
39905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return [];
39915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
39925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( !selector || typeof selector !== "string" ) {
39945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return results;
39955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
39965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context),
39985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                soFar = selector;
39995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
40015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                soFar = m[3];
40025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                parts.push( m[1] );
40045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( m[2] ) {
40065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        extra = m[3];
40075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        break;
40085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
40095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
40105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( parts.length > 1 && origPOS.exec( selector ) ) {
40125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
40135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        set = posProcess( parts[0] + parts[1], context );
40145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
40155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        set = Expr.relative[ parts[0] ] ?
40165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                [ context ] :
40175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                Sizzle( parts.shift(), context );
40185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        while ( parts.length ) {
40205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                selector = parts.shift();
40215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( Expr.relative[ selector ] )
40235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        selector += parts.shift();
40245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                set = posProcess( selector, set );
40265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
40275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
40285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
40295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
40305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
40315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var ret = Sizzle.find( parts.shift(), context, contextXML );
40325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
40335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
40345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( context ) {
40365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var ret = seed ?
40375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                { expr: parts.pop(), set: makeArray(seed) } :
40385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
40395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
40405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( parts.length > 0 ) {
40425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                checkSet = makeArray(set);
40435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else {
40445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                prune = false;
40455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
40465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        while ( parts.length ) {
40485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var cur = parts.pop(), pop = cur;
40495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( !Expr.relative[ cur ] ) {
40515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        cur = "";
40525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                } else {
40535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        pop = parts.pop();
40545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
40555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( pop == null ) {
40575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        pop = context;
40585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
40595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                Expr.relative[ cur ]( checkSet, pop, contextXML );
40615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
40625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
40635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        checkSet = parts = [];
40645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
40655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
40665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( !checkSet ) {
40685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                checkSet = set;
40695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
40705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( !checkSet ) {
40725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                throw "Syntax error, unrecognized expression: " + (cur || selector);
40735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
40745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( toString.call(checkSet) === "[object Array]" ) {
40765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !prune ) {
40775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.push.apply( results, checkSet );
40785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else if ( context && context.nodeType === 1 ) {
40795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; checkSet[i] != null; i++ ) {
40805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
40815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        results.push( set[i] );
40825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
40835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
40845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
40855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; checkSet[i] != null; i++ ) {
40865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
40875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        results.push( set[i] );
40885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
40895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
40905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
40915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
40925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                makeArray( checkSet, results );
40935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
40945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( extra ) {
40965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Sizzle( extra, origContext, results, seed );
40975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Sizzle.uniqueSort( results );
40985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
40995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return results;
41015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
41025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Sizzle.uniqueSort = function(results){
41045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( sortOrder ) {
41055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                hasDuplicate = baseHasDuplicate;
41065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                results.sort(sortOrder);
41075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( hasDuplicate ) {
41095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 1; i < results.length; i++ ) {
41105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( results[i] === results[i-1] ) {
41115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        results.splice(i--, 1);
41125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
41135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
41145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
41155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
41165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return results;
41185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
41195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Sizzle.matches = function(expr, set){
41215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Sizzle(expr, null, null, set);
41225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
41235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Sizzle.find = function(expr, context, isXML){
41255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var set, match;
41265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( !expr ) {
41285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return [];
41295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
41305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
41325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var type = Expr.order[i], match;
41335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
41355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var left = match[1];
41365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        match.splice(1,1);
41375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( left.substr( left.length - 1 ) !== "\\" ) {
41395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                match[1] = (match[1] || "").replace(/\\/g, "");
41405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                set = Expr.find[ type ]( match, context, isXML );
41415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( set != null ) {
41425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        expr = expr.replace( Expr.match[ type ], "" );
41435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        break;
41445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
41455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
41465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
41475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
41485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( !set ) {
41505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                set = context.getElementsByTagName("*");
41515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
41525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {set: set, expr: expr};
41545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
41555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Sizzle.filter = function(expr, set, inplace, not){
41575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var old = expr, result = [], curLoop = set, match, anyFound,
41585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                isXMLFilter = set && set[0] && isXML(set[0]);
41595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while ( expr && set.length ) {
41615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for ( var type in Expr.filter ) {
41625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( (match = Expr.match[ type ].exec( expr )) != null ) {
41635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var filter = Expr.filter[ type ], found, item;
41645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                anyFound = false;
41655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( curLoop == result ) {
41675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        result = [];
41685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
41695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( Expr.preFilter[ type ] ) {
41715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
41725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !match ) {
41745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                anyFound = found = true;
41755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else if ( match === true ) {
41765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                continue;
41775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
41785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
41795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( match ) {
41815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
41825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                if ( item ) {
41835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        found = filter( item, match, i, curLoop );
41845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        var pass = not ^ !!found;
41855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        if ( inplace && found != null ) {
41875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                if ( pass ) {
41885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                        anyFound = true;
41895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                } else {
41905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                        curLoop[i] = false;
41915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                }
41925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        } else if ( pass ) {
41935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                result.push( item );
41945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                anyFound = true;
41955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        }
41965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                }
41975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
41985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
41995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( found !== undefined ) {
42015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !inplace ) {
42025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                curLoop = result;
42035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
42045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        expr = expr.replace( Expr.match[ type ], "" );
42065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !anyFound ) {
42085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                return [];
42095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
42105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        break;
42125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
42135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
42145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
42155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( expr == old ) {
42175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( anyFound == null ) {
42185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                throw "Syntax error, unrecognized expression: " + expr;
42195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else {
42205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                break;
42215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
42225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
42235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                old = expr;
42255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
42265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return curLoop;
42285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
42295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Expr = Sizzle.selectors = {
42315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        order: [ "ID", "NAME", "TAG" ],
42325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        match: {
42335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
42345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
42355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
42365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
42375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
42385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
42395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
42405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
42415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
42425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        leftMatch: {},
42435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        attrMap: {
42445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                "class": "className",
42455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                "for": "htmlFor"
42465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
42475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        attrHandle: {
42485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                href: function(elem){
42495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.getAttribute("href");
42505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
42515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
42525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        relative: {
42535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                "+": function(checkSet, part, isXML){
42545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var isPartStr = typeof part === "string",
42555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                isTag = isPartStr && !/\W/.test(part),
42565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                isPartStrNotTag = isPartStr && !isTag;
42575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( isTag && !isXML ) {
42595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                part = part.toUpperCase();
42605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
42615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
42635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( (elem = checkSet[i]) ) {
42645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
42655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
42675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                elem || false :
42685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                elem === part;
42695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
42705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
42715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( isPartStrNotTag ) {
42735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                Sizzle.filter( part, checkSet, true );
42745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
42755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
42765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ">": function(checkSet, part, isXML){
42775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var isPartStr = typeof part === "string";
42785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( isPartStr && !/\W/.test(part) ) {
42805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                part = isXML ? part : part.toUpperCase();
42815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
42835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var elem = checkSet[i];
42845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( elem ) {
42855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var parent = elem.parentNode;
42865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                checkSet[i] = parent.nodeName === part ? parent : false;
42875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
42885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
42895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else {
42905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0, l = checkSet.length; i < l; i++ ) {
42915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var elem = checkSet[i];
42925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( elem ) {
42935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                checkSet[i] = isPartStr ?
42945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        elem.parentNode :
42955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        elem.parentNode === part;
42965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
42975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
42985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( isPartStr ) {
43005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        Sizzle.filter( part, checkSet, true );
43015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
43025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                "": function(checkSet, part, isXML){
43055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var doneName = done++, checkFn = dirCheck;
43065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( !/\W/.test(part) ) {
43085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var nodeCheck = part = isXML ? part : part.toUpperCase();
43095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                checkFn = dirNodeCheck;
43105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
43135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                "~": function(checkSet, part, isXML){
43155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var doneName = done++, checkFn = dirCheck;
43165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( typeof part === "string" && !/\W/.test(part) ) {
43185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var nodeCheck = part = isXML ? part : part.toUpperCase();
43195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                checkFn = dirNodeCheck;
43205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
43235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
43245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
43255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        find: {
43265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ID: function(match, context, isXML){
43275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
43285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var m = context.getElementById(match[1]);
43295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return m ? [m] : [];
43305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                NAME: function(match, context, isXML){
43335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( typeof context.getElementsByName !== "undefined" ) {
43345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var ret = [], results = context.getElementsByName(match[1]);
43355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0, l = results.length; i < l; i++ ) {
43375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( results[i].getAttribute("name") === match[1] ) {
43385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                ret.push( results[i] );
43395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
43405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
43415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return ret.length === 0 ? null : ret;
43435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TAG: function(match, context){
43465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return context.getElementsByTagName(match[1]);
43475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
43485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
43495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        preFilter: {
43505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                CLASS: function(match, curLoop, inplace, result, not, isXML){
43515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        match = " " + match[1].replace(/\\/g, "") + " ";
43525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( isXML ) {
43545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return match;
43555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
43585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( elem ) {
43595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
43605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                if ( !inplace )
43615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        result.push( elem );
43625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else if ( inplace ) {
43635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                curLoop[i] = false;
43645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
43655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
43665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return false;
43695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ID: function(match){
43715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match[1].replace(/\\/g, "");
43725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TAG: function(match, curLoop){
43745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; curLoop[i] === false; i++ ){}
43755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
43765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                CHILD: function(match){
43785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( match[1] == "nth" ) {
43795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
43805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
43815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
43825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                match[2] = (test[1] + (test[2] || 1)) - 0;
43845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                match[3] = test[3] - 0;
43855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        match[0] = done++;
43885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match;
43905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
43915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ATTR: function(match, curLoop, inplace, result, not, isXML){
43925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var name = match[1].replace(/\\/g, "");
43935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( !isXML && Expr.attrMap[name] ) {
43955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                match[1] = Expr.attrMap[name];
43965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
43975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( match[2] === "~=" ) {
43995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                match[4] = " " + match[4] + " ";
44005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
44015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match;
44035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                PSEUDO: function(match, curLoop, inplace, result, not){
44055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( match[1] === "not" ) {
44065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
44075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        match[3] = Sizzle(match[3], null, null, curLoop);
44085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                } else {
44095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
44105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !inplace ) {
44115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                result.push.apply( result, ret );
44125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
44135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        return false;
44145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
44155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
44165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return true;
44175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
44185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match;
44205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                POS: function(match){
44225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        match.unshift( true );
44235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match;
44245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
44255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
44265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        filters: {
44275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                enabled: function(elem){
44285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.disabled === false && elem.type !== "hidden";
44295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                disabled: function(elem){
44315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.disabled === true;
44325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                checked: function(elem){
44345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.checked === true;
44355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                selected: function(elem){
44375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        elem.parentNode.selectedIndex;
44385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.selected === true;
44395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                parent: function(elem){
44415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return !!elem.firstChild;
44425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                empty: function(elem){
44445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return !elem.firstChild;
44455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                has: function(elem, i, match){
44475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return !!Sizzle( match[3], elem ).length;
44485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                header: function(elem){
44505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return /h\d/i.test( elem.nodeName );
44515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                text: function(elem){
44535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "text" === elem.type;
44545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                radio: function(elem){
44565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "radio" === elem.type;
44575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                checkbox: function(elem){
44595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "checkbox" === elem.type;
44605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                file: function(elem){
44625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "file" === elem.type;
44635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                password: function(elem){
44655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "password" === elem.type;
44665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                submit: function(elem){
44685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "submit" === elem.type;
44695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                image: function(elem){
44715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "image" === elem.type;
44725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                reset: function(elem){
44745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "reset" === elem.type;
44755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                button: function(elem){
44775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
44785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                input: function(elem){
44805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return /input|select|textarea|button/i.test(elem.nodeName);
44815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
44825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
44835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setFilters: {
44845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                first: function(elem, i){
44855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return i === 0;
44865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                last: function(elem, i, match, array){
44885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return i === array.length - 1;
44895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                even: function(elem, i){
44915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return i % 2 === 0;
44925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                odd: function(elem, i){
44945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return i % 2 === 1;
44955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                lt: function(elem, i, match){
44975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return i < match[3] - 0;
44985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
44995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gt: function(elem, i, match){
45005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return i > match[3] - 0;
45015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                nth: function(elem, i, match){
45035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match[3] - 0 == i;
45045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                eq: function(elem, i, match){
45065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return match[3] - 0 == i;
45075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
45085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        },
45095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        filter: {
45105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                PSEUDO: function(elem, match, i, array){
45115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var name = match[1], filter = Expr.filters[ name ];
45125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( filter ) {
45145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return filter( elem, i, match, array );
45155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else if ( name === "contains" ) {
45165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
45175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else if ( name === "not" ) {
45185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var not = match[3];
45195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0, l = not.length; i < l; i++ ) {
45215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( not[i] === elem ) {
45225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                return false;
45235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
45245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
45255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return true;
45275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
45285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                CHILD: function(elem, match){
45305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var type = match[1], node = elem;
45315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        switch (type) {
45325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                case 'only':
45335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                case 'first':
45345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        while ( (node = node.previousSibling) )  {
45355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                if ( node.nodeType === 1 ) return false;
45365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
45375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( type == 'first') return true;
45385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        node = elem;
45395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                case 'last':
45405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        while ( (node = node.nextSibling) )  {
45415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                if ( node.nodeType === 1 ) return false;
45425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
45435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        return true;
45445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                case 'nth':
45455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var first = match[2], last = match[3];
45465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( first == 1 && last == 0 ) {
45485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                return true;
45495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
45505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var doneName = match[0],
45525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                parent = elem.parentNode;
45535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
45555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var count = 0;
45565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
45575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        if ( node.nodeType === 1 ) {
45585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                node.nodeIndex = ++count;
45595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        }
45605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                }
45615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                parent.sizcache = doneName;
45625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
45635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var diff = elem.nodeIndex - last;
45655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( first == 0 ) {
45665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                return diff == 0;
45675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else {
45685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                return ( diff % first == 0 && diff / first >= 0 );
45695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
45705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
45715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ID: function(elem, match){
45735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
45745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                TAG: function(elem, match){
45765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
45775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                CLASS: function(elem, match){
45795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
45805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                .indexOf( match ) > -1;
45815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
45825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ATTR: function(elem, match){
45835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var name = match[1],
45845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                result = Expr.attrHandle[ name ] ?
45855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        Expr.attrHandle[ name ]( elem ) :
45865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        elem[ name ] != null ?
45875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                elem[ name ] :
45885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                elem.getAttribute( name ),
45895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value = result + "",
45905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type = match[2],
45915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                check = match[4];
45925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return result == null ?
45945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "!=" :
45955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "=" ?
45965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value === check :
45975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "*=" ?
45985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value.indexOf(check) >= 0 :
45995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "~=" ?
46005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                (" " + value + " ").indexOf(check) >= 0 :
46015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                !check ?
46025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value && result !== false :
46035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "!=" ?
46045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value != check :
46055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "^=" ?
46065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value.indexOf(check) === 0 :
46075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "$=" ?
46085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value.substr(value.length - check.length) === check :
46095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                type === "|=" ?
46105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                value === check || value.substr(0, check.length + 1) === check + "-" :
46115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                false;
46125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                },
46135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                POS: function(elem, match, i, array){
46145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var name = match[2], filter = Expr.setFilters[ name ];
46155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( filter ) {
46175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return filter( elem, i, match, array );
46185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
46195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
46205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
46215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
46225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var origPOS = Expr.match.POS;
46245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)for ( var type in Expr.match ) {
46265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
46275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source );
46285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
46295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var makeArray = function(array, results) {
46315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        array = Array.prototype.slice.call( array, 0 );
46325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( results ) {
46345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                results.push.apply( results, array );
46355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return results;
46365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
46375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return array;
46395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
46405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)try {
46425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Array.prototype.slice.call( document.documentElement.childNodes, 0 );
46435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} catch(e){
46455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        makeArray = function(array, results) {
46465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var ret = results || [];
46475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( toString.call(array) === "[object Array]" ) {
46495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        Array.prototype.push.apply( ret, array );
46505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
46515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( typeof array.length === "number" ) {
46525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0, l = array.length; i < l; i++ ) {
46535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        ret.push( array[i] );
46545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
46555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else {
46565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0; array[i]; i++ ) {
46575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        ret.push( array[i] );
46585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
46595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
46605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
46615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ret;
46635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
46645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
46655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var sortOrder;
46675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if ( document.documentElement.compareDocumentPosition ) {
46695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sortOrder = function( a, b ) {
46705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
46715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( a == b ) {
46725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                hasDuplicate = true;
46735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
46745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return 0;
46755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
46765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
46785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( ret === 0 ) {
46795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        hasDuplicate = true;
46805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
46815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ret;
46825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
46835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} else if ( "sourceIndex" in document.documentElement ) {
46845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sortOrder = function( a, b ) {
46855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !a.sourceIndex || !b.sourceIndex ) {
46865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( a == b ) {
46875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                hasDuplicate = true;
46885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
46895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return 0;
46905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
46915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var ret = a.sourceIndex - b.sourceIndex;
46935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( ret === 0 ) {
46945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        hasDuplicate = true;
46955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
46965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ret;
46975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
46985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} else if ( document.createRange ) {
46995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sortOrder = function( a, b ) {
47005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !a.ownerDocument || !b.ownerDocument ) {
47015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( a == b ) {
47025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                hasDuplicate = true;
47035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
47045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return 0;
47055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
47065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
47085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                aRange.setStart(a, 0);
47095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                aRange.setEnd(a, 0);
47105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bRange.setStart(b, 0);
47115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                bRange.setEnd(b, 0);
47125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
47135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( ret === 0 ) {
47145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        hasDuplicate = true;
47155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
47165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ret;
47175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
47185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
47195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
47215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var form = document.createElement("div"),
47225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                id = "script" + (new Date).getTime();
47235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        form.innerHTML = "<a name='" + id + "'/>";
47245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var root = document.documentElement;
47265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        root.insertBefore( form, root.firstChild );
47275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( !!document.getElementById( id ) ) {
47295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Expr.find.ID = function(match, context, isXML){
47305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
47315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var m = context.getElementById(match[1]);
47325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
47335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
47345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                };
47355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Expr.filter.ID = function(elem, match){
47375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
47385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.nodeType === 1 && node && node.nodeValue === match;
47395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                };
47405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
47415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        root.removeChild( form );
47435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        root = form = null; // release memory in IE
47445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
47455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
47475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var div = document.createElement("div");
47495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div.appendChild( document.createComment("") );
47505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( div.getElementsByTagName("*").length > 0 ) {
47525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Expr.find.TAG = function(match, context){
47535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var results = context.getElementsByTagName(match[1]);
47545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( match[1] === "*" ) {
47565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var tmp = [];
47575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0; results[i]; i++ ) {
47595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( results[i].nodeType === 1 ) {
47605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                tmp.push( results[i] );
47615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
47625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
47635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                results = tmp;
47655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
47665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return results;
47685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                };
47695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
47705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div.innerHTML = "<a href='#'></a>";
47725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
47735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        div.firstChild.getAttribute("href") !== "#" ) {
47745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Expr.attrHandle.href = function(elem){
47755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return elem.getAttribute("href", 2);
47765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                };
47775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
47785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div = null; // release memory in IE
47805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
47815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if ( document.querySelectorAll ) (function(){
47835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var oldSizzle = Sizzle, div = document.createElement("div");
47845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div.innerHTML = "<p class='TEST'></p>";
47855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
47875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
47885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
47895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Sizzle = function(query, context, extra, seed){
47915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                context = context || document;
47925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !seed && context.nodeType === 9 && !isXML(context) ) {
47945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        try {
47955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return makeArray( context.querySelectorAll(query), extra );
47965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } catch(e){}
47975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
47985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return oldSizzle(query, context, extra, seed);
48005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
48015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for ( var prop in oldSizzle ) {
48035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Sizzle[ prop ] = oldSizzle[ prop ];
48045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
48055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div = null; // release memory in IE
48075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
48085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
48105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var div = document.createElement("div");
48115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div.innerHTML = "<div class='test e'></div><div class='test'></div>";
48125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( div.getElementsByClassName("e").length === 0 )
48145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
48155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div.lastChild.className = "e";
48175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( div.getElementsByClassName("e").length === 1 )
48195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
48205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Expr.order.splice(1, 0, "CLASS");
48225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Expr.find.CLASS = function(match, context, isXML) {
48235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
48245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return context.getElementsByClassName(match[1]);
48255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
48265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
48275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        div = null; // release memory in IE
48295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
48305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
48325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var sibDir = dir == "previousSibling" && !isXML;
48335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
48345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var elem = checkSet[i];
48355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( elem ) {
48365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( sibDir && elem.nodeType === 1 ){
48375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                elem.sizcache = doneName;
48385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                elem.sizset = i;
48395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
48405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        elem = elem[dir];
48415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var match = false;
48425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        while ( elem ) {
48445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( elem.sizcache === doneName ) {
48455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        match = checkSet[elem.sizset];
48465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        break;
48475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
48485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( elem.nodeType === 1 && !isXML ){
48505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        elem.sizcache = doneName;
48515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        elem.sizset = i;
48525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
48535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( elem.nodeName === cur ) {
48555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        match = elem;
48565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        break;
48575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
48585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                elem = elem[dir];
48605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
48615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        checkSet[i] = match;
48635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
48645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
48655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
48665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
48685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var sibDir = dir == "previousSibling" && !isXML;
48695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
48705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var elem = checkSet[i];
48715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( elem ) {
48725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( sibDir && elem.nodeType === 1 ) {
48735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                elem.sizcache = doneName;
48745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                elem.sizset = i;
48755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
48765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        elem = elem[dir];
48775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var match = false;
48785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        while ( elem ) {
48805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( elem.sizcache === doneName ) {
48815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        match = checkSet[elem.sizset];
48825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        break;
48835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
48845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( elem.nodeType === 1 ) {
48865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !isXML ) {
48875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                elem.sizcache = doneName;
48885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                elem.sizset = i;
48895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
48905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( typeof cur !== "string" ) {
48915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                if ( elem === cur ) {
48925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        match = true;
48935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        break;
48945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                }
48955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
48975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                match = elem;
48985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                break;
48995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
49005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
49015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                elem = elem[dir];
49035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
49045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        checkSet[i] = match;
49065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
49075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
49085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
49095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var contains = document.compareDocumentPosition ?  function(a, b){
49115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return a.compareDocumentPosition(b) & 16;
49125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} : function(a, b){
49135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return a !== b && (a.contains ? a.contains(b) : true);
49145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
49155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var isXML = function(elem){
49175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
49185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
49195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
49205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var posProcess = function(selector, context){
49225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var tmpSet = [], later = "", match,
49235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                root = context.nodeType ? [context] : context;
49245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
49265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                later += match[0];
49275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                selector = selector.replace( Expr.match.PSEUDO, "" );
49285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
49295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        selector = Expr.relative[selector] ? selector + "*" : selector;
49315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for ( var i = 0, l = root.length; i < l; i++ ) {
49335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Sizzle( selector, root[i], tmpSet );
49345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
49355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Sizzle.filter( later, tmpSet );
49375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
49385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)window.Sizzle = Sizzle;
49415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
49435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles);(function(engine) {
49455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var extendElements = Prototype.Selector.extendElements;
49465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function select(selector, scope) {
49485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return extendElements(engine(selector, scope || document));
49495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
49505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function match(element, selector) {
49525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return engine.matches(selector, [element]).length == 1;
49535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
49545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Prototype.Selector.engine = engine;
49565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Prototype.Selector.select = select;
49575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Prototype.Selector.match = match;
49585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(Sizzle);
49595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)window.Sizzle = Prototype._original_property;
49615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)delete Prototype._original_property;
49625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Form = {
49645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  reset: function(form) {
49655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form = $(form);
49665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form.reset();
49675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return form;
49685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
49695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  serializeElements: function(elements, options) {
49715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (typeof options != 'object') options = { hash: !!options };
49725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (Object.isUndefined(options.hash)) options.hash = true;
49735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var key, value, submitted = false, submit = options.submit, accumulator, initial;
49745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (options.hash) {
49765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      initial = {};
49775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      accumulator = function(result, key, value) {
49785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (key in result) {
49795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          if (!Object.isArray(result[key])) result[key] = [result[key]];
49805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          result[key].push(value);
49815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else result[key] = value;
49825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
49835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      };
49845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
49855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      initial = '';
49865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      accumulator = function(result, key, value) {
49875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value);
49885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
49895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
49905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return elements.inject(initial, function(result, element) {
49925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!element.disabled && element.name) {
49935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        key = element.name; value = $(element).getValue();
49945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
49955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            submit !== false && (!submit || key == submit) && (submitted = true)))) {
49965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          result = accumulator(result, key, value);
49975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
49985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
49995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return result;
50005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
50015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
50025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
50035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Methods = {
50055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  serialize: function(form, options) {
50065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Form.serializeElements(Form.getElements(form), options);
50075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getElements: function(form) {
50105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var elements = $(form).getElementsByTagName('*'),
50115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element,
50125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        arr = [ ],
50135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        serializers = Form.Element.Serializers;
50145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; element = elements[i]; i++) {
50155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      arr.push(element);
50165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
50175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return arr.inject([], function(elements, child) {
50185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (serializers[child.tagName.toLowerCase()])
50195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        elements.push(Element.extend(child));
50205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return elements;
50215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })
50225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getInputs: function(form, typeName, name) {
50255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form = $(form);
50265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var inputs = form.getElementsByTagName('input');
50275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!typeName && !name) return $A(inputs).map(Element.extend);
50295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
50315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var input = inputs[i];
50325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if ((typeName && input.type != typeName) || (name && input.name != name))
50335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        continue;
50345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      matchingInputs.push(Element.extend(input));
50355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
50365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return matchingInputs;
50385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  disable: function(form) {
50415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form = $(form);
50425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Form.getElements(form).invoke('disable');
50435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return form;
50445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  enable: function(form) {
50475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form = $(form);
50485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Form.getElements(form).invoke('enable');
50495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return form;
50505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  findFirstElement: function(form) {
50535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var elements = $(form).getElements().findAll(function(element) {
50545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return 'hidden' != element.type && !element.disabled;
50555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
50565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var firstByIndex = elements.findAll(function(element) {
50575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
50585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }).sortBy(function(element) { return element.tabIndex }).first();
50595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return firstByIndex ? firstByIndex : elements.find(function(element) {
50615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return /^(?:input|select|textarea)$/i.test(element.tagName);
50625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    });
50635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  focusFirstElement: function(form) {
50665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form = $(form);
50675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var element = form.findFirstElement();
50685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element) element.activate();
50695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return form;
50705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  request: function(form, options) {
50735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    form = $(form), options = Object.clone(options || { });
50745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var params = options.parameters, action = form.readAttribute('action') || '';
50765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (action.blank()) action = window.location.href;
50775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    options.parameters = form.serialize(true);
50785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (params) {
50805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isString(params)) params = params.toQueryParams();
50815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Object.extend(options.parameters, params);
50825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
50835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (form.hasAttribute('method') && !options.method)
50855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      options.method = form.method;
50865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Ajax.Request(action, options);
50885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
50895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
50905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
50925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Element = {
50955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  focus: function(element) {
50965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $(element).focus();
50975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
50985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
50995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  select: function(element) {
51015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $(element).select();
51025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
51035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
51045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
51055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Element.Methods = {
51075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  serialize: function(element) {
51095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
51105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element.disabled && element.name) {
51115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var value = element.getValue();
51125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (value != undefined) {
51135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var pair = { };
51145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pair[element.name] = value;
51155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Object.toQueryString(pair);
51165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
51175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
51185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return '';
51195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getValue: function(element) {
51225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
51235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var method = element.tagName.toLowerCase();
51245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Form.Element.Serializers[method](element);
51255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  setValue: function(element, value) {
51285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
51295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var method = element.tagName.toLowerCase();
51305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Form.Element.Serializers[method](element, value);
51315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
51325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  clear: function(element) {
51355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $(element).value = '';
51365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
51375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  present: function(element) {
51405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(element).value != '';
51415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  activate: function(element) {
51445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
51455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
51465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.focus();
51475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.select && (element.tagName.toLowerCase() != 'input' ||
51485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          !(/^(?:button|reset|submit)$/i.test(element.type))))
51495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.select();
51505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) { }
51515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
51525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  disable: function(element) {
51555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
51565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.disabled = true;
51575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
51585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
51595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  enable: function(element) {
51615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
51625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element.disabled = false;
51635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
51645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
51655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
51665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
51685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Field = Form.Element;
51705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var $F = Form.Element.Methods.getValue;
51725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
51745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Element.Serializers = (function() {
51765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function input(element, value) {
51775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (element.type.toLowerCase()) {
51785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'checkbox':
51795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 'radio':
51805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return inputSelector(element, value);
51815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      default:
51825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return valueSelector(element, value);
51835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
51845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
51855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function inputSelector(element, value) {
51875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(value))
51885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element.checked ? element.value : null;
51895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else element.checked = !!value;
51905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
51915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function valueSelector(element, value) {
51935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(value)) return element.value;
51945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else element.value = value;
51955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
51965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function select(element, value) {
51985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(value))
51995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return (element.type === 'select-one' ? selectOne : selectMany)(element);
52005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var opt, currentValue, single = !Object.isArray(value);
52025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = element.length; i < length; i++) {
52035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      opt = element.options[i];
52045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      currentValue = this.optionValue(opt);
52055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (single) {
52065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (currentValue == value) {
52075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          opt.selected = true;
52085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return;
52095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
52105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
52115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else opt.selected = value.include(currentValue);
52125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
52135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function selectOne(element) {
52165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var index = element.selectedIndex;
52175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return index >= 0 ? optionValue(element.options[index]) : null;
52185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function selectMany(element) {
52215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var values, length = element.length;
52225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!length) return null;
52235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, values = []; i < length; i++) {
52255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var opt = element.options[i];
52265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (opt.selected) values.push(optionValue(opt));
52275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
52285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return values;
52295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function optionValue(opt) {
52325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.hasAttribute(opt, 'value') ? opt.value : opt.text;
52335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return {
52365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    input:         input,
52375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inputSelector: inputSelector,
52385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    textarea:      valueSelector,
52395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    select:        select,
52405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectOne:     selectOne,
52415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectMany:    selectMany,
52425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    optionValue:   optionValue,
52435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    button:        valueSelector
52445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
52455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
52465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
52485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
52515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function($super, element, frequency, callback) {
52525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    $super(callback, frequency);
52535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element   = $(element);
52545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.lastValue = this.getValue();
52555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
52565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  execute: function() {
52585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = this.getValue();
52595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isString(this.lastValue) && Object.isString(value) ?
52605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.lastValue != value : String(this.lastValue) != String(value)) {
52615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.callback(this.element, value);
52625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.lastValue = value;
52635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
52645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
52665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Element.Observer = Class.create(Abstract.TimedObserver, {
52685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getValue: function() {
52695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Form.Element.getValue(this.element);
52705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
52725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Observer = Class.create(Abstract.TimedObserver, {
52745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getValue: function() {
52755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Form.serialize(this.element);
52765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
52775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
52785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
52805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Abstract.EventObserver = Class.create({
52825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function(element, callback) {
52835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element  = $(element);
52845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.callback = callback;
52855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.lastValue = this.getValue();
52875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.element.tagName.toLowerCase() == 'form')
52885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.registerFormCallbacks();
52895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
52905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.registerCallback(this.element);
52915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
52925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  onElementEvent: function() {
52945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var value = this.getValue();
52955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.lastValue != value) {
52965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.callback(this.element, value);
52975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.lastValue = value;
52985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
52995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
53005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  registerFormCallbacks: function() {
53025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Form.getElements(this.element).each(this.registerCallback, this);
53035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
53045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  registerCallback: function(element) {
53065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element.type) {
53075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      switch (element.type.toLowerCase()) {
53085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'checkbox':
53095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'radio':
53105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Event.observe(element, 'click', this.onElementEvent.bind(this));
53115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          break;
53125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
53135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Event.observe(element, 'change', this.onElementEvent.bind(this));
53145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          break;
53155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
53165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
53175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
53195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
53215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getValue: function() {
53225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Form.Element.getValue(this.element);
53235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
53255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Form.EventObserver = Class.create(Abstract.EventObserver, {
53275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  getValue: function() {
53285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Form.serialize(this.element);
53295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
53315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
53325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var Event = {
53345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_BACKSPACE: 8,
53355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_TAB:       9,
53365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_RETURN:   13,
53375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_ESC:      27,
53385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_LEFT:     37,
53395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_UP:       38,
53405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_RIGHT:    39,
53415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_DOWN:     40,
53425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_DELETE:   46,
53435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_HOME:     36,
53445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_END:      35,
53455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_PAGEUP:   33,
53465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_PAGEDOWN: 34,
53475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KEY_INSERT:   45,
53485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cache: {}
53505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
53515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var docEl = document.documentElement;
53535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
53545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    && 'onmouseleave' in docEl;
53555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var isIELegacyEvent = function(event) { return false; };
53595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (window.attachEvent) {
53615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (window.addEventListener) {
53625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      isIELegacyEvent = function(event) {
53635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return !(event instanceof window.Event);
53645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      };
53655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
53665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      isIELegacyEvent = function(event) { return true; };
53675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
53685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var _isButton;
53715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _isButtonForDOMEvents(event, code) {
53735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return event.which ? (event.which === code + 1) : (event.button === code);
53745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var legacyButtonMap = { 0: 1, 1: 4, 2: 2 };
53775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _isButtonForLegacyEvents(event, code) {
53785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return event.button === legacyButtonMap[code];
53795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _isButtonForWebKit(event, code) {
53825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (code) {
53835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 0: return event.which == 1 && !event.metaKey;
53845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 1: return event.which == 2 || (event.which == 1 && event.metaKey);
53855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      case 2: return event.which == 3;
53865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      default: return false;
53875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
53885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
53895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (window.attachEvent) {
53915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!window.addEventListener) {
53925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      _isButton = _isButtonForLegacyEvents;
53935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
53945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      _isButton = function(event, code) {
53955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) :
53965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         _isButtonForDOMEvents(event, code);
53975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
53985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
53995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else if (Prototype.Browser.WebKit) {
54005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _isButton = _isButtonForWebKit;
54015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
54025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _isButton = _isButtonForDOMEvents;
54035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isLeftClick(event)   { return _isButton(event, 0) }
54065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isMiddleClick(event) { return _isButton(event, 1) }
54085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function isRightClick(event)  { return _isButton(event, 2) }
54105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function element(event) {
54125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event = Event.extend(event);
54135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var node = event.target, type = event.type,
54155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     currentTarget = event.currentTarget;
54165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (currentTarget && currentTarget.tagName) {
54185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (type === 'load' || type === 'error' ||
54195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
54205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          && currentTarget.type === 'radio'))
54215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node = currentTarget;
54225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
54235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node.nodeType == Node.TEXT_NODE)
54255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      node = node.parentNode;
54265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.extend(node);
54285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function findElement(event, expression) {
54315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var element = Event.element(event);
54325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!expression) return element;
54345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (element) {
54355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (Object.isElement(element) && Prototype.Selector.match(element, expression)) {
54365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Element.extend(element);
54375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
54385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = element.parentNode;
54395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
54405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function pointer(event) {
54435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return { x: pointerX(event), y: pointerY(event) };
54445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function pointerX(event) {
54475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var docElement = document.documentElement,
54485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     body = document.body || { scrollLeft: 0 };
54495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return event.pageX || (event.clientX +
54515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (docElement.scrollLeft || body.scrollLeft) -
54525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (docElement.clientLeft || 0));
54535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function pointerY(event) {
54565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var docElement = document.documentElement,
54575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     body = document.body || { scrollTop: 0 };
54585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return  event.pageY || (event.clientY +
54605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       (docElement.scrollTop || body.scrollTop) -
54615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       (docElement.clientTop || 0));
54625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function stop(event) {
54665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Event.extend(event);
54675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event.preventDefault();
54685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event.stopPropagation();
54695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event.stopped = true;
54715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
54725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Event.Methods = {
54755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isLeftClick:   isLeftClick,
54765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isMiddleClick: isMiddleClick,
54775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isRightClick:  isRightClick,
54785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element:     element,
54805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    findElement: findElement,
54815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pointer:  pointer,
54835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pointerX: pointerX,
54845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pointerY: pointerY,
54855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stop: stop
54875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
54885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
54905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m[name] = Event.Methods[name].methodize();
54915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m;
54925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
54935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (window.attachEvent) {
54955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function _relatedTarget(event) {
54965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var element;
54975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      switch (event.type) {
54985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'mouseover':
54995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'mouseenter':
55005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          element = event.fromElement;
55015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          break;
55025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'mouseout':
55035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 'mouseleave':
55045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          element = event.toElement;
55055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          break;
55065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
55075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return null;
55085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
55095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Element.extend(element);
55105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
55115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var additionalMethods = {
55135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stopPropagation: function() { this.cancelBubble = true },
55145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      preventDefault:  function() { this.returnValue = false },
55155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      inspect: function() { return '[object Event]' }
55165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
55175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Event.extend = function(event, element) {
55195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!event) return false;
55205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!isIELegacyEvent(event)) return event;
55225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (event._extendedByPrototype) return event;
55245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      event._extendedByPrototype = Prototype.emptyFunction;
55255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var pointer = Event.pointer(event);
55275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Object.extend(event, {
55295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        target: event.srcElement || element,
55305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        relatedTarget: _relatedTarget(event),
55315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pageX:  pointer.x,
55325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pageY:  pointer.y
55335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      });
55345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Object.extend(event, methods);
55365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Object.extend(event, additionalMethods);
55375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return event;
55395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
55405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
55415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Event.extend = Prototype.K;
55425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
55435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (window.addEventListener) {
55455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
55465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Object.extend(Event.prototype, methods);
55475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
55485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _createResponder(element, eventName, handler) {
55505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var registry = Element.retrieve(element, 'prototype_event_registry');
55515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(registry)) {
55535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      CACHE.push(element);
55545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      registry = Element.retrieve(element, 'prototype_event_registry', $H());
55555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
55565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var respondersForEvent = registry.get(eventName);
55585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(respondersForEvent)) {
55595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      respondersForEvent = [];
55605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      registry.set(eventName, respondersForEvent);
55615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
55625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (respondersForEvent.pluck('handler').include(handler)) return false;
55645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var responder;
55665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventName.include(":")) {
55675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      responder = function(event) {
55685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Object.isUndefined(event.eventName))
55695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return false;
55705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.eventName !== eventName)
55725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return false;
55735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Event.extend(event, element);
55755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        handler.call(element, event);
55765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      };
55775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
55785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
55795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       (eventName === "mouseenter" || eventName === "mouseleave")) {
55805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (eventName === "mouseenter" || eventName === "mouseleave") {
55815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          responder = function(event) {
55825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Event.extend(event, element);
55835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var parent = event.relatedTarget;
55855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (parent && parent !== element) {
55865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              try { parent = parent.parentNode; }
55875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              catch(e) { parent = element; }
55885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
55895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (parent === element) return;
55915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            handler.call(element, event);
55935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          };
55945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
55955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else {
55965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        responder = function(event) {
55975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          Event.extend(event, element);
55985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          handler.call(element, event);
55995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
56005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
56015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    responder.handler = handler;
56045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    respondersForEvent.push(responder);
56055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return responder;
56065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
56075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function _destroyCache() {
56095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, length = CACHE.length; i < length; i++) {
56105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Event.stopObserving(CACHE[i]);
56115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      CACHE[i] = null;
56125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
56145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var CACHE = [];
56165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Prototype.Browser.IE)
56185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    window.attachEvent('onunload', _destroyCache);
56195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (Prototype.Browser.WebKit)
56215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    window.addEventListener('unload', Prototype.emptyFunction, false);
56225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var _getDOMEventName = Prototype.K,
56255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
56265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
56285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _getDOMEventName = function(eventName) {
56295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return (translations[eventName] || eventName);
56305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
56315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
56325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function observe(element, eventName, handler) {
56345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
56355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var responder = _createResponder(element, eventName, handler);
56375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!responder) return element;
56395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventName.include(':')) {
56415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.addEventListener)
56425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.addEventListener("dataavailable", responder, false);
56435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else {
56445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.attachEvent("ondataavailable", responder);
56455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.attachEvent("onlosecapture", responder);
56465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
56475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
56485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var actualEventName = _getDOMEventName(eventName);
56495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.addEventListener)
56515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.addEventListener(actualEventName, responder, false);
56525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
56535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.attachEvent("on" + actualEventName, responder);
56545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
56575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
56585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function stopObserving(element, eventName, handler) {
56605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
56615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var registry = Element.retrieve(element, 'prototype_event_registry');
56635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!registry) return element;
56645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!eventName) {
56665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      registry.each( function(pair) {
56675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var eventName = pair.key;
56685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        stopObserving(element, eventName);
56695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      });
56705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
56715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var responders = registry.get(eventName);
56745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!responders) return element;
56755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!handler) {
56775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      responders.each(function(r) {
56785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        stopObserving(element, eventName, r.handler);
56795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      });
56805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return element;
56815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var i = responders.length, responder;
56845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (i--) {
56855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (responders[i].handler === handler) {
56865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        responder = responders[i];
56875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
56885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
56895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
56905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!responder) return element;
56915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventName.include(':')) {
56935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.removeEventListener)
56945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.removeEventListener("dataavailable", responder, false);
56955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else {
56965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.detachEvent("ondataavailable", responder);
56975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.detachEvent("onlosecapture", responder);
56985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
56995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
57005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var actualEventName = _getDOMEventName(eventName);
57015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element.removeEventListener)
57025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.removeEventListener(actualEventName, responder, false);
57035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else
57045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.detachEvent('on' + actualEventName, responder);
57055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
57065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    registry.set(eventName, responders.without(responder));
57085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
57105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
57115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function fire(element, eventName, memo, bubble) {
57135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
57145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isUndefined(bubble))
57165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      bubble = true;
57175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (element == document && document.createEvent && !element.dispatchEvent)
57195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element = document.documentElement;
57205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var event;
57225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document.createEvent) {
57235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      event = document.createEvent('HTMLEvents');
57245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      event.initEvent('dataavailable', bubble, true);
57255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
57265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      event = document.createEventObject();
57275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
57285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
57295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event.eventName = eventName;
57315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event.memo = memo || { };
57325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document.createEvent)
57345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.dispatchEvent(event);
57355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
57365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      element.fireEvent(event.eventType, event);
57375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Event.extend(event);
57395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
57405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Event.Handler = Class.create({
57425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    initialize: function(element, eventName, selector, callback) {
57435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.element   = $(element);
57445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.eventName = eventName;
57455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.selector  = selector;
57465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.callback  = callback;
57475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.handler   = this.handleEvent.bind(this);
57485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
57495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    start: function() {
57515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Event.observe(this.element, this.eventName, this.handler);
57525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this;
57535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
57545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stop: function() {
57565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      Event.stopObserving(this.element, this.eventName, this.handler);
57575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this;
57585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
57595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    handleEvent: function(event) {
57615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var element = Event.findElement(event, this.selector);
57625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (element) this.callback.call(this.element, event, element);
57635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
57645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
57655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function on(element, eventName, selector, callback) {
57675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element = $(element);
57685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Object.isFunction(selector) && Object.isUndefined(callback)) {
57695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      callback = selector, selector = null;
57705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
57715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new Event.Handler(element, eventName, selector, callback).start();
57735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
57745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(Event, Event.Methods);
57765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(Event, {
57785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fire:          fire,
57795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    observe:       observe,
57805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopObserving: stopObserving,
57815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    on:            on
57825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
57835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Element.addMethods({
57855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fire:          fire,
57865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    observe:       observe,
57885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopObserving: stopObserving,
57905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    on:            on
57925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
57935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(document, {
57955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fire:          fire.methodize(),
57965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    observe:       observe.methodize(),
57985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopObserving: stopObserving.methodize(),
58005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    on:            on.methodize(),
58025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    loaded:        false
58045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
58055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (window.Event) Object.extend(window.Event, Event);
58075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else window.Event = Event;
58085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
58095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
58115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
58125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
58135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  var timer;
58155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function fireContentLoadedEvent() {
58175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document.loaded) return;
58185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (timer) window.clearTimeout(timer);
58195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document.loaded = true;
58205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document.fire('dom:loaded');
58215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
58225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function checkReadyState() {
58245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document.readyState === 'complete') {
58255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      document.stopObserving('readystatechange', checkReadyState);
58265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      fireContentLoadedEvent();
58275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
58285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
58295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function pollDoScroll() {
58315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try { document.documentElement.doScroll('left'); }
58325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    catch(e) {
58335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      timer = pollDoScroll.defer();
58345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return;
58355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
58365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fireContentLoadedEvent();
58375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
58385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (document.addEventListener) {
58405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
58415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
58425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document.observe('readystatechange', checkReadyState);
58435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (window == top)
58445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      timer = pollDoScroll.defer();
58455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
58465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Event.observe(window, 'load', fireContentLoadedEvent);
58485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
58495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.addMethods();
58515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*------------------------------- DEPRECATED -------------------------------*/
58535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.toQueryString = Object.toQueryString;
58555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Toggle = { display: Element.toggle };
58575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Methods.childOf = Element.Methods.descendantOf;
58595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Insertion = {
58615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Before: function(element, content) {
58625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.insert(element, {before:content});
58635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
58645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Top: function(element, content) {
58665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.insert(element, {top:content});
58675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
58685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Bottom: function(element, content) {
58705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.insert(element, {bottom:content});
58715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
58725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  After: function(element, content) {
58745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.insert(element, {after:content});
58755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
58765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
58775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
58795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Position = {
58815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  includeScrollOffsets: false,
58825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  prepare: function() {
58845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.deltaX =  window.pageXOffset
58855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                || document.documentElement.scrollLeft
58865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                || document.body.scrollLeft
58875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                || 0;
58885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.deltaY =  window.pageYOffset
58895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                || document.documentElement.scrollTop
58905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                || document.body.scrollTop
58915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                || 0;
58925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
58935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  within: function(element, x, y) {
58955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.includeScrollOffsets)
58965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.withinIncludingScrolloffsets(element, x, y);
58975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.xcomp = x;
58985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.ycomp = y;
58995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.offset = Element.cumulativeOffset(element);
59005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (y >= this.offset[1] &&
59025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            y <  this.offset[1] + element.offsetHeight &&
59035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            x >= this.offset[0] &&
59045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            x <  this.offset[0] + element.offsetWidth);
59055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
59065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  withinIncludingScrolloffsets: function(element, x, y) {
59085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var offsetcache = Element.cumulativeScrollOffset(element);
59095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.xcomp = x + offsetcache[0] - this.deltaX;
59115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.ycomp = y + offsetcache[1] - this.deltaY;
59125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.offset = Element.cumulativeOffset(element);
59135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (this.ycomp >= this.offset[1] &&
59155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.ycomp <  this.offset[1] + element.offsetHeight &&
59165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.xcomp >= this.offset[0] &&
59175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.xcomp <  this.offset[0] + element.offsetWidth);
59185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
59195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  overlap: function(mode, element) {
59215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!mode) return 0;
59225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mode == 'vertical')
59235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
59245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.offsetHeight;
59255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mode == 'horizontal')
59265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
59275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.offsetWidth;
59285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
59295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  cumulativeOffset: Element.Methods.cumulativeOffset,
59325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  positionedOffset: Element.Methods.positionedOffset,
59345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  absolutize: function(element) {
59365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position.prepare();
59375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.absolutize(element);
59385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
59395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  relativize: function(element) {
59415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Position.prepare();
59425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.relativize(element);
59435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
59445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  realOffset: Element.Methods.cumulativeScrollOffset,
59465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  offsetParent: Element.Methods.getOffsetParent,
59485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  page: Element.Methods.viewportOffset,
59505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  clone: function(source, target, options) {
59525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    options = options || { };
59535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Element.clonePosition(target, source, options);
59545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
59555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
59565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
59585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
59605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function iter(name) {
59615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
59625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
59635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
59655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  function(element, className) {
59665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    className = className.toString().strip();
59675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
59685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
59695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } : function(element, className) {
59705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    className = className.toString().strip();
59715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
59725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!classNames && !className) return elements;
59735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var nodes = $(element).getElementsByTagName('*');
59755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    className = ' ' + className + ' ';
59765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0, child, cn; child = nodes[i]; i++) {
59785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
59795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          (classNames && classNames.all(function(name) {
59805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return !name.toString().blank() && cn.include(' ' + name + ' ');
59815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          }))))
59825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        elements.push(Element.extend(child));
59835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
59845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return elements;
59855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
59865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return function(className, parentElement) {
59885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $(parentElement || document.body).getElementsByClassName(className);
59895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  };
59905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}(Element.Methods);
59915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
59935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.ClassNames = Class.create();
59955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.ClassNames.prototype = {
59965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  initialize: function(element) {
59975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element = $(element);
59985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
59995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  _each: function(iterator) {
60015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.className.split(/\s+/).select(function(name) {
60025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return name.length > 0;
60035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    })._each(iterator);
60045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
60055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  set: function(className) {
60075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.className = className;
60085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
60095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  add: function(classNameToAdd) {
60115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this.include(classNameToAdd)) return;
60125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.set($A(this).concat(classNameToAdd).join(' '));
60135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
60145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  remove: function(classNameToRemove) {
60165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!this.include(classNameToRemove)) return;
60175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.set($A(this).without(classNameToRemove).join(' '));
60185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  },
60195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  toString: function() {
60215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return $A(this).join(' ');
60225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
60235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
60245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.extend(Element.ClassNames.prototype, Enumerable);
60265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*--------------------------------------------------------------------------*/
60285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function() {
60305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  window.Selector = Class.create({
60315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    initialize: function(expression) {
60325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      this.expression = expression.strip();
60335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
60345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    findElements: function(rootElement) {
60365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Prototype.Selector.select(this.expression, rootElement);
60375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
60385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    match: function(element) {
60405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Prototype.Selector.match(element, this.expression);
60415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
60425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    toString: function() {
60445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return this.expression;
60455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
60465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inspect: function() {
60485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return "#<Selector: " + this.expression + ">";
60495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
60505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
60515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Object.extend(Selector, {
60535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    matchElements: function(elements, expression) {
60545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var match = Prototype.Selector.match,
60555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          results = [];
60565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      for (var i = 0, length = elements.length; i < length; i++) {
60585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = elements[i];
60595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (match(element, expression)) {
60605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          results.push(Element.extend(element));
60615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
60625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
60635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return results;
60645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
60655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    findElement: function(elements, expression, index) {
60675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      index = index || 0;
60685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var matchIndex = 0, element;
60695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      for (var i = 0, length = elements.length; i < length; i++) {
60705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element = elements[i];
60715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Prototype.Selector.match(element, expression) && index === matchIndex++) {
60725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          return Element.extend(element);
60735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
60745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
60755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
60765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    findChildElements: function(element, expressions) {
60785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      var selector = expressions.toArray().join(', ');
60795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return Prototype.Selector.select(selector, element || document);
60805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
60815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  });
60825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
6083