move a few things away in to-be-integrated/
[unfold.git] / plugins / code_editor / static / js / moo-clientcide-1.3.js
diff --git a/plugins/code_editor/static/js/moo-clientcide-1.3.js b/plugins/code_editor/static/js/moo-clientcide-1.3.js
deleted file mode 100644 (file)
index 793059b..0000000
+++ /dev/null
@@ -1,15425 +0,0 @@
-
-//This library: http://dev.clientcide.com/depender/build?download=true&version=Clientcide+3.1.0&require=Core%2FBrowser&require=Core%2FClass.Extras&require=Core%2FClass&require=Core%2FCore&require=Core%2FElement.Delegation&require=Core%2FElement.Dimensions&require=Core%2FElement.Event&require=Core%2FElement.Style&require=Core%2FElement&require=Core%2FFx.CSS&require=Core%2FFx.Morph&require=Core%2FFx.Transitions&require=Core%2FFx.Tween&require=Core%2FFx&require=Core%2FRequest.HTML&require=Core%2FRequest.JSON&require=Core%2FRequest&require=Core%2FSlick.Finder&require=Core%2FSlick.Parser&require=Core%2FArray&require=Core%2FEvent&require=Core%2FFunction&require=Core%2FNumber&require=Core%2FObject&require=Core%2FString&require=Core%2FCookie&require=Core%2FDOMReady&require=Core%2FJSON&require=Core%2FSwiff&require=Clientcide%2FBehavior.StickyWin&require=Clientcide%2FCollapsible&require=Clientcide%2FMultipleOpenAccordion&require=Clientcide%2FTabSwapper&require=Clientcide%2FStickyWin.Ajax&require=Clientcide%2FStickyWin.Alert&require=Clientcide%2FStickyWin.Confirm&require=Clientcide%2FStickyWin.Drag&require=Clientcide%2FStickyWin.Fx&require=Clientcide%2FStickyWin.Modal&require=Clientcide%2FStickyWin.UI&require=More%2FElement.Forms&require=More%2FOverText&require=More%2FFx.Accordion&require=More%2FFx.Move&require=More%2FFx.Reveal&require=More%2FFx.Scroll&require=More%2FFx.Slide&require=More%2FKeyboard.Extras&require=More%2FSpinner&require=More%2FMore&require=More%2FRequest.JSONP&require=More%2FRequest.Periodical&require=More%2FArray.Extras&require=More%2FDate.Extras&require=More%2FNumber.Format&require=More%2FURI.Relative&require=More%2FAssets&require=More%2FColor&require=More%2FHash.Cookie
-//Contents: Core:Source/Core/Core.js, Core:Source/Types/Object.js, Core:Source/Types/Array.js, Core:Source/Types/Function.js, Core:Source/Types/Number.js, Core:Source/Types/String.js, Core:Source/Browser/Browser.js, Core:Source/Slick/Slick.Parser.js, Core:Source/Slick/Slick.Finder.js, Core:Source/Element/Element.js, Core:Source/Class/Class.js, Core:Source/Class/Class.Extras.js, Core:Source/Request/Request.js, Core:Source/Utilities/JSON.js, Core:Source/Request/Request.JSON.js, Core:Source/Types/DOMEvent.js, Core:Source/Element/Element.Event.js, Core:Source/Element/Element.Delegation.js, Core:Source/Fx/Fx.js, Core:Source/Element/Element.Style.js, Core:Source/Fx/Fx.CSS.js, Core:Source/Fx/Fx.Morph.js, Core:Source/Utilities/Swiff.js, Core:Source/Fx/Fx.Transitions.js, More:Source/More/More.js, More:Source/Class/Class.Binds.js, More:Source/Class/Class.Occlude.js, Core:Source/Element/Element.Dimensions.js, More:Source/Element/Element.Measure.js, More:Source/Element/Element.Position.js, More:Source/Element/Element.Shortcuts.js, More:Source/Forms/OverText.js, More:Source/Utilities/IframeShim.js, More:Source/Interface/Mask.js, Core:Source/Utilities/DOMReady.js, More:Source/Element/Element.Pin.js, More:Source/Types/Object.Extras.js, Clientcide:Source/Core/Clientcide.js, Clientcide:Source/Core/dbug.js, Clientcide:Source/UI/StyleWriter.js, Clientcide:Source/UI/StickyWin.js, Clientcide:Source/UI/StickyWin.Modal.js, More:Source/Types/String.Extras.js, Clientcide:Source/UI/StickyWin.UI.js, Clientcide:Source/UI/StickyWin.Alert.js, Clientcide:Source/UI/StickyWin.Confirm.js, More:Source/Fx/Fx.Move.js, More:Source/Fx/Fx.Scroll.js, More:Source/Class/Class.Refactor.js, Core:Source/Fx/Fx.Tween.js, Clientcide:Source/UI/StickyWin.Fx.js, More:Source/Types/Array.Extras.js, Core:Source/Request/Request.HTML.js, Clientcide:Source/Layout/TabSwapper.js, More:Source/Element/Element.Forms.js, More:Source/Fx/Fx.Reveal.js, Clientcide:Source/Layout/Collapsible.js, More:Source/Utilities/Table.js, Behavior:Source/Element.Data.js, Behavior:Source/BehaviorAPI.js, Behavior:Source/Behavior.js, More:Source/Drag/Drag.js, More:Source/Drag/Drag.Move.js, Clientcide:Source/UI/StickyWin.Drag.js, Clientcide:Source/Behaviors/Behavior.StickyWin.js, More:Source/Utilities/Color.js, More:Source/Class/Events.Pseudos.js, More:Source/Element/Element.Event.Pseudos.js, More:Source/Element/Element.Event.Pseudos.Keys.js, More:Source/Interface/Keyboard.js, More:Source/Interface/Keyboard.Extras.js, More:Source/Locale/Locale.js, More:Source/Locale/Locale.en-US.Number.js, More:Source/Types/Number.Format.js, More:Source/Request/Request.Periodical.js, More:Source/Request/Request.JSONP.js, More:Source/Types/String.QueryString.js, More:Source/Types/URI.js, More:Source/Types/URI.Relative.js, Core:Source/Utilities/Cookie.js, More:Source/Locale/Locale.en-US.Date.js, More:Source/Types/Date.js, More:Source/Types/Date.Extras.js, More:Source/Fx/Fx.Elements.js, More:Source/Fx/Fx.Accordion.js, More:Source/Types/Hash.js, More:Source/Utilities/Hash.Cookie.js, More:Source/Utilities/Assets.js, More:Source/Interface/Spinner.js, More:Source/Fx/Fx.Slide.js, Clientcide:Source/UI/StickyWin.UI.Pointy.js, Clientcide:Source/UI/StickyWin.PointyTip.js, Clientcide:Source/UI/StickyWin.Ajax.js, Clientcide:Source/Layout/MultipleOpenAccordion.js
-
-// Begin: Source/Core/Core.js
-/*
----
-
-name: Core
-
-description: The heart of MooTools.
-
-license: MIT-style license.
-
-copyright: Copyright (c) 2006-2012 [Valerio Proietti](http://mad4milk.net/).
-
-authors: The MooTools production team (http://mootools.net/developers/)
-
-inspiration:
-  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
-  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
-
-provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
-
-...
-*/
-
-(function(){
-
-this.MooTools = {
-       version: '1.4.5',
-       build: 'ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0'
-};
-
-// typeOf, instanceOf
-
-var typeOf = this.typeOf = function(item){
-       if (item == null) return 'null';
-       if (item.$family != null) return item.$family();
-
-       if (item.nodeName){
-               if (item.nodeType == 1) return 'element';
-               if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
-       } else if (typeof item.length == 'number'){
-               if (item.callee) return 'arguments';
-               if ('item' in item) return 'collection';
-       }
-
-       return typeof item;
-};
-
-var instanceOf = this.instanceOf = function(item, object){
-       if (item == null) return false;
-       var constructor = item.$constructor || item.constructor;
-       while (constructor){
-               if (constructor === object) return true;
-               constructor = constructor.parent;
-       }
-       /*<ltIE8>*/
-       if (!item.hasOwnProperty) return false;
-       /*</ltIE8>*/
-       return item instanceof object;
-};
-
-// Function overloading
-
-var Function = this.Function;
-
-var enumerables = true;
-for (var i in {toString: 1}) enumerables = null;
-if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
-
-Function.prototype.overloadSetter = function(usePlural){
-       var self = this;
-       return function(a, b){
-               if (a == null) return this;
-               if (usePlural || typeof a != 'string'){
-                       for (var k in a) self.call(this, k, a[k]);
-                       if (enumerables) for (var i = enumerables.length; i--;){
-                               k = enumerables[i];
-                               if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
-                       }
-               } else {
-                       self.call(this, a, b);
-               }
-               return this;
-       };
-};
-
-Function.prototype.overloadGetter = function(usePlural){
-       var self = this;
-       return function(a){
-               var args, result;
-               if (typeof a != 'string') args = a;
-               else if (arguments.length > 1) args = arguments;
-               else if (usePlural) args = [a];
-               if (args){
-                       result = {};
-                       for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
-               } else {
-                       result = self.call(this, a);
-               }
-               return result;
-       };
-};
-
-Function.prototype.extend = function(key, value){
-       this[key] = value;
-}.overloadSetter();
-
-Function.prototype.implement = function(key, value){
-       this.prototype[key] = value;
-}.overloadSetter();
-
-// From
-
-var slice = Array.prototype.slice;
-
-Function.from = function(item){
-       return (typeOf(item) == 'function') ? item : function(){
-               return item;
-       };
-};
-
-Array.from = function(item){
-       if (item == null) return [];
-       return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
-};
-
-Number.from = function(item){
-       var number = parseFloat(item);
-       return isFinite(number) ? number : null;
-};
-
-String.from = function(item){
-       return item + '';
-};
-
-// hide, protect
-
-Function.implement({
-
-       hide: function(){
-               this.$hidden = true;
-               return this;
-       },
-
-       protect: function(){
-               this.$protected = true;
-               return this;
-       }
-
-});
-
-// Type
-
-var Type = this.Type = function(name, object){
-       if (name){
-               var lower = name.toLowerCase();
-               var typeCheck = function(item){
-                       return (typeOf(item) == lower);
-               };
-
-               Type['is' + name] = typeCheck;
-               if (object != null){
-                       object.prototype.$family = (function(){
-                               return lower;
-                       }).hide();
-                       //<1.2compat>
-                       object.type = typeCheck;
-                       //</1.2compat>
-               }
-       }
-
-       if (object == null) return null;
-
-       object.extend(this);
-       object.$constructor = Type;
-       object.prototype.$constructor = object;
-
-       return object;
-};
-
-var toString = Object.prototype.toString;
-
-Type.isEnumerable = function(item){
-       return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
-};
-
-var hooks = {};
-
-var hooksOf = function(object){
-       var type = typeOf(object.prototype);
-       return hooks[type] || (hooks[type] = []);
-};
-
-var implement = function(name, method){
-       if (method && method.$hidden) return;
-
-       var hooks = hooksOf(this);
-
-       for (var i = 0; i < hooks.length; i++){
-               var hook = hooks[i];
-               if (typeOf(hook) == 'type') implement.call(hook, name, method);
-               else hook.call(this, name, method);
-       }
-
-       var previous = this.prototype[name];
-       if (previous == null || !previous.$protected) this.prototype[name] = method;
-
-       if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
-               return method.apply(item, slice.call(arguments, 1));
-       });
-};
-
-var extend = function(name, method){
-       if (method && method.$hidden) return;
-       var previous = this[name];
-       if (previous == null || !previous.$protected) this[name] = method;
-};
-
-Type.implement({
-
-       implement: implement.overloadSetter(),
-
-       extend: extend.overloadSetter(),
-
-       alias: function(name, existing){
-               implement.call(this, name, this.prototype[existing]);
-       }.overloadSetter(),
-
-       mirror: function(hook){
-               hooksOf(this).push(hook);
-               return this;
-       }
-
-});
-
-new Type('Type', Type);
-
-// Default Types
-
-var force = function(name, object, methods){
-       var isType = (object != Object),
-               prototype = object.prototype;
-
-       if (isType) object = new Type(name, object);
-
-       for (var i = 0, l = methods.length; i < l; i++){
-               var key = methods[i],
-                       generic = object[key],
-                       proto = prototype[key];
-
-               if (generic) generic.protect();
-               if (isType && proto) object.implement(key, proto.protect());
-       }
-
-       if (isType){
-               var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
-               object.forEachMethod = function(fn){
-                       if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){
-                               fn.call(prototype, prototype[methods[i]], methods[i]);
-                       }
-                       for (var key in prototype) fn.call(prototype, prototype[key], key)
-               };
-       }
-
-       return force;
-};
-
-force('String', String, [
-       'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
-       'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'
-])('Array', Array, [
-       'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
-       'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
-])('Number', Number, [
-       'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
-])('Function', Function, [
-       'apply', 'call', 'bind'
-])('RegExp', RegExp, [
-       'exec', 'test'
-])('Object', Object, [
-       'create', 'defineProperty', 'defineProperties', 'keys',
-       'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
-       'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
-])('Date', Date, ['now']);
-
-Object.extend = extend.overloadSetter();
-
-Date.extend('now', function(){
-       return +(new Date);
-});
-
-new Type('Boolean', Boolean);
-
-// fixes NaN returning as Number
-
-Number.prototype.$family = function(){
-       return isFinite(this) ? 'number' : 'null';
-}.hide();
-
-// Number.random
-
-Number.extend('random', function(min, max){
-       return Math.floor(Math.random() * (max - min + 1) + min);
-});
-
-// forEach, each
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-Object.extend('forEach', function(object, fn, bind){
-       for (var key in object){
-               if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
-       }
-});
-
-Object.each = Object.forEach;
-
-Array.implement({
-
-       forEach: function(fn, bind){
-               for (var i = 0, l = this.length; i < l; i++){
-                       if (i in this) fn.call(bind, this[i], i, this);
-               }
-       },
-
-       each: function(fn, bind){
-               Array.forEach(this, fn, bind);
-               return this;
-       }
-
-});
-
-// Array & Object cloning, Object merging and appending
-
-var cloneOf = function(item){
-       switch (typeOf(item)){
-               case 'array': return item.clone();
-               case 'object': return Object.clone(item);
-               default: return item;
-       }
-};
-
-Array.implement('clone', function(){
-       var i = this.length, clone = new Array(i);
-       while (i--) clone[i] = cloneOf(this[i]);
-       return clone;
-});
-
-var mergeOne = function(source, key, current){
-       switch (typeOf(current)){
-               case 'object':
-                       if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
-                       else source[key] = Object.clone(current);
-               break;
-               case 'array': source[key] = current.clone(); break;
-               default: source[key] = current;
-       }
-       return source;
-};
-
-Object.extend({
-
-       merge: function(source, k, v){
-               if (typeOf(k) == 'string') return mergeOne(source, k, v);
-               for (var i = 1, l = arguments.length; i < l; i++){
-                       var object = arguments[i];
-                       for (var key in object) mergeOne(source, key, object[key]);
-               }
-               return source;
-       },
-
-       clone: function(object){
-               var clone = {};
-               for (var key in object) clone[key] = cloneOf(object[key]);
-               return clone;
-       },
-
-       append: function(original){
-               for (var i = 1, l = arguments.length; i < l; i++){
-                       var extended = arguments[i] || {};
-                       for (var key in extended) original[key] = extended[key];
-               }
-               return original;
-       }
-
-});
-
-// Object-less types
-
-['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
-       new Type(name);
-});
-
-// Unique ID
-
-var UID = Date.now();
-
-String.extend('uniqueID', function(){
-       return (UID++).toString(36);
-});
-
-//<1.2compat>
-
-var Hash = this.Hash = new Type('Hash', function(object){
-       if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
-       for (var key in object) this[key] = object[key];
-       return this;
-});
-
-Hash.implement({
-
-       forEach: function(fn, bind){
-               Object.forEach(this, fn, bind);
-       },
-
-       getClean: function(){
-               var clean = {};
-               for (var key in this){
-                       if (this.hasOwnProperty(key)) clean[key] = this[key];
-               }
-               return clean;
-       },
-
-       getLength: function(){
-               var length = 0;
-               for (var key in this){
-                       if (this.hasOwnProperty(key)) length++;
-               }
-               return length;
-       }
-
-});
-
-Hash.alias('each', 'forEach');
-
-Object.type = Type.isObject;
-
-var Native = this.Native = function(properties){
-       return new Type(properties.name, properties.initialize);
-};
-
-Native.type = Type.type;
-
-Native.implement = function(objects, methods){
-       for (var i = 0; i < objects.length; i++) objects[i].implement(methods);
-       return Native;
-};
-
-var arrayType = Array.type;
-Array.type = function(item){
-       return instanceOf(item, Array) || arrayType(item);
-};
-
-this.$A = function(item){
-       return Array.from(item).slice();
-};
-
-this.$arguments = function(i){
-       return function(){
-               return arguments[i];
-       };
-};
-
-this.$chk = function(obj){
-       return !!(obj || obj === 0);
-};
-
-this.$clear = function(timer){
-       clearTimeout(timer);
-       clearInterval(timer);
-       return null;
-};
-
-this.$defined = function(obj){
-       return (obj != null);
-};
-
-this.$each = function(iterable, fn, bind){
-       var type = typeOf(iterable);
-       ((type == 'arguments' || type == 'collection' || type == 'array' || type == 'elements') ? Array : Object).each(iterable, fn, bind);
-};
-
-this.$empty = function(){};
-
-this.$extend = function(original, extended){
-       return Object.append(original, extended);
-};
-
-this.$H = function(object){
-       return new Hash(object);
-};
-
-this.$merge = function(){
-       var args = Array.slice(arguments);
-       args.unshift({});
-       return Object.merge.apply(null, args);
-};
-
-this.$lambda = Function.from;
-this.$mixin = Object.merge;
-this.$random = Number.random;
-this.$splat = Array.from;
-this.$time = Date.now;
-
-this.$type = function(object){
-       var type = typeOf(object);
-       if (type == 'elements') return 'array';
-       return (type == 'null') ? false : type;
-};
-
-this.$unlink = function(object){
-       switch (typeOf(object)){
-               case 'object': return Object.clone(object);
-               case 'array': return Array.clone(object);
-               case 'hash': return new Hash(object);
-               default: return object;
-       }
-};
-
-//</1.2compat>
-
-})();
-
-
-// Begin: Source/Types/Object.js
-/*
----
-
-name: Object
-
-description: Object generic methods
-
-license: MIT-style license.
-
-requires: Type
-
-provides: [Object, Hash]
-
-...
-*/
-
-(function(){
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
-       subset: function(object, keys){
-               var results = {};
-               for (var i = 0, l = keys.length; i < l; i++){
-                       var k = keys[i];
-                       if (k in object) results[k] = object[k];
-               }
-               return results;
-       },
-
-       map: function(object, fn, bind){
-               var results = {};
-               for (var key in object){
-                       if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
-               }
-               return results;
-       },
-
-       filter: function(object, fn, bind){
-               var results = {};
-               for (var key in object){
-                       var value = object[key];
-                       if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value;
-               }
-               return results;
-       },
-
-       every: function(object, fn, bind){
-               for (var key in object){
-                       if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
-               }
-               return true;
-       },
-
-       some: function(object, fn, bind){
-               for (var key in object){
-                       if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
-               }
-               return false;
-       },
-
-       keys: function(object){
-               var keys = [];
-               for (var key in object){
-                       if (hasOwnProperty.call(object, key)) keys.push(key);
-               }
-               return keys;
-       },
-
-       values: function(object){
-               var values = [];
-               for (var key in object){
-                       if (hasOwnProperty.call(object, key)) values.push(object[key]);
-               }
-               return values;
-       },
-
-       getLength: function(object){
-               return Object.keys(object).length;
-       },
-
-       keyOf: function(object, value){
-               for (var key in object){
-                       if (hasOwnProperty.call(object, key) && object[key] === value) return key;
-               }
-               return null;
-       },
-
-       contains: function(object, value){
-               return Object.keyOf(object, value) != null;
-       },
-
-       toQueryString: function(object, base){
-               var queryString = [];
-
-               Object.each(object, function(value, key){
-                       if (base) key = base + '[' + key + ']';
-                       var result;
-                       switch (typeOf(value)){
-                               case 'object': result = Object.toQueryString(value, key); break;
-                               case 'array':
-                                       var qs = {};
-                                       value.each(function(val, i){
-                                               qs[i] = val;
-                                       });
-                                       result = Object.toQueryString(qs, key);
-                               break;
-                               default: result = key + '=' + encodeURIComponent(value);
-                       }
-                       if (value != null) queryString.push(result);
-               });
-
-               return queryString.join('&');
-       }
-
-});
-
-})();
-
-//<1.2compat>
-
-Hash.implement({
-
-       has: Object.prototype.hasOwnProperty,
-
-       keyOf: function(value){
-               return Object.keyOf(this, value);
-       },
-
-       hasValue: function(value){
-               return Object.contains(this, value);
-       },
-
-       extend: function(properties){
-               Hash.each(properties || {}, function(value, key){
-                       Hash.set(this, key, value);
-               }, this);
-               return this;
-       },
-
-       combine: function(properties){
-               Hash.each(properties || {}, function(value, key){
-                       Hash.include(this, key, value);
-               }, this);
-               return this;
-       },
-
-       erase: function(key){
-               if (this.hasOwnProperty(key)) delete this[key];
-               return this;
-       },
-
-       get: function(key){
-               return (this.hasOwnProperty(key)) ? this[key] : null;
-       },
-
-       set: function(key, value){
-               if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
-               return this;
-       },
-
-       empty: function(){
-               Hash.each(this, function(value, key){
-                       delete this[key];
-               }, this);
-               return this;
-       },
-
-       include: function(key, value){
-               if (this[key] == null) this[key] = value;
-               return this;
-       },
-
-       map: function(fn, bind){
-               return new Hash(Object.map(this, fn, bind));
-       },
-
-       filter: function(fn, bind){
-               return new Hash(Object.filter(this, fn, bind));
-       },
-
-       every: function(fn, bind){
-               return Object.every(this, fn, bind);
-       },
-
-       some: function(fn, bind){
-               return Object.some(this, fn, bind);
-       },
-
-       getKeys: function(){
-               return Object.keys(this);
-       },
-
-       getValues: function(){
-               return Object.values(this);
-       },
-
-       toQueryString: function(base){
-               return Object.toQueryString(this, base);
-       }
-
-});
-
-Hash.extend = Object.append;
-
-Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
-
-//</1.2compat>
-
-
-// Begin: Source/Types/Array.js
-/*
----
-
-name: Array
-
-description: Contains Array Prototypes like each, contains, and erase.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Array
-
-...
-*/
-
-Array.implement({
-
-       /*<!ES5>*/
-       every: function(fn, bind){
-               for (var i = 0, l = this.length >>> 0; i < l; i++){
-                       if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
-               }
-               return true;
-       },
-
-       filter: function(fn, bind){
-               var results = [];
-               for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){
-                       value = this[i];
-                       if (fn.call(bind, value, i, this)) results.push(value);
-               }
-               return results;
-       },
-
-       indexOf: function(item, from){
-               var length = this.length >>> 0;
-               for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){
-                       if (this[i] === item) return i;
-               }
-               return -1;
-       },
-
-       map: function(fn, bind){
-               var length = this.length >>> 0, results = Array(length);
-               for (var i = 0; i < length; i++){
-                       if (i in this) results[i] = fn.call(bind, this[i], i, this);
-               }
-               return results;
-       },
-
-       some: function(fn, bind){
-               for (var i = 0, l = this.length >>> 0; i < l; i++){
-                       if ((i in this) && fn.call(bind, this[i], i, this)) return true;
-               }
-               return false;
-       },
-       /*</!ES5>*/
-
-       clean: function(){
-               return this.filter(function(item){
-                       return item != null;
-               });
-       },
-
-       invoke: function(methodName){
-               var args = Array.slice(arguments, 1);
-               return this.map(function(item){
-                       return item[methodName].apply(item, args);
-               });
-       },
-
-       associate: function(keys){
-               var obj = {}, length = Math.min(this.length, keys.length);
-               for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
-               return obj;
-       },
-
-       link: function(object){
-               var result = {};
-               for (var i = 0, l = this.length; i < l; i++){
-                       for (var key in object){
-                               if (object[key](this[i])){
-                                       result[key] = this[i];
-                                       delete object[key];
-                                       break;
-                               }
-                       }
-               }
-               return result;
-       },
-
-       contains: function(item, from){
-               return this.indexOf(item, from) != -1;
-       },
-
-       append: function(array){
-               this.push.apply(this, array);
-               return this;
-       },
-
-       getLast: function(){
-               return (this.length) ? this[this.length - 1] : null;
-       },
-
-       getRandom: function(){
-               return (this.length) ? this[Number.random(0, this.length - 1)] : null;
-       },
-
-       include: function(item){
-               if (!this.contains(item)) this.push(item);
-               return this;
-       },
-
-       combine: function(array){
-               for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
-               return this;
-       },
-
-       erase: function(item){
-               for (var i = this.length; i--;){
-                       if (this[i] === item) this.splice(i, 1);
-               }
-               return this;
-       },
-
-       empty: function(){
-               this.length = 0;
-               return this;
-       },
-
-       flatten: function(){
-               var array = [];
-               for (var i = 0, l = this.length; i < l; i++){
-                       var type = typeOf(this[i]);
-                       if (type == 'null') continue;
-                       array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
-               }
-               return array;
-       },
-
-       pick: function(){
-               for (var i = 0, l = this.length; i < l; i++){
-                       if (this[i] != null) return this[i];
-               }
-               return null;
-       },
-
-       hexToRgb: function(array){
-               if (this.length != 3) return null;
-               var rgb = this.map(function(value){
-                       if (value.length == 1) value += value;
-                       return value.toInt(16);
-               });
-               return (array) ? rgb : 'rgb(' + rgb + ')';
-       },
-
-       rgbToHex: function(array){
-               if (this.length < 3) return null;
-               if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
-               var hex = [];
-               for (var i = 0; i < 3; i++){
-                       var bit = (this[i] - 0).toString(16);
-                       hex.push((bit.length == 1) ? '0' + bit : bit);
-               }
-               return (array) ? hex : '#' + hex.join('');
-       }
-
-});
-
-//<1.2compat>
-
-Array.alias('extend', 'append');
-
-var $pick = function(){
-       return Array.from(arguments).pick();
-};
-
-//</1.2compat>
-
-
-// Begin: Source/Types/Function.js
-/*
----
-
-name: Function
-
-description: Contains Function Prototypes like create, bind, pass, and delay.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Function
-
-...
-*/
-
-Function.extend({
-
-       attempt: function(){
-               for (var i = 0, l = arguments.length; i < l; i++){
-                       try {
-                               return arguments[i]();
-                       } catch (e){}
-               }
-               return null;
-       }
-
-});
-
-Function.implement({
-
-       attempt: function(args, bind){
-               try {
-                       return this.apply(bind, Array.from(args));
-               } catch (e){}
-
-               return null;
-       },
-
-       /*<!ES5-bind>*/
-       bind: function(that){
-               var self = this,
-                       args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
-                       F = function(){};
-
-               var bound = function(){
-                       var context = that, length = arguments.length;
-                       if (this instanceof bound){
-                               F.prototype = self.prototype;
-                               context = new F;
-                       }
-                       var result = (!args && !length)
-                               ? self.call(context)
-                               : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
-                       return context == that ? result : context;
-               };
-               return bound;
-       },
-       /*</!ES5-bind>*/
-
-       pass: function(args, bind){
-               var self = this;
-               if (args != null) args = Array.from(args);
-               return function(){
-                       return self.apply(bind, args || arguments);
-               };
-       },
-
-       delay: function(delay, bind, args){
-               return setTimeout(this.pass((args == null ? [] : args), bind), delay);
-       },
-
-       periodical: function(periodical, bind, args){
-               return setInterval(this.pass((args == null ? [] : args), bind), periodical);
-       }
-
-});
-
-//<1.2compat>
-
-delete Function.prototype.bind;
-
-Function.implement({
-
-       create: function(options){
-               var self = this;
-               options = options || {};
-               return function(event){
-                       var args = options.arguments;
-                       args = (args != null) ? Array.from(args) : Array.slice(arguments, (options.event) ? 1 : 0);
-                       if (options.event) args = [event || window.event].extend(args);
-                       var returns = function(){
-                               return self.apply(options.bind || null, args);
-                       };
-                       if (options.delay) return setTimeout(returns, options.delay);
-                       if (options.periodical) return setInterval(returns, options.periodical);
-                       if (options.attempt) return Function.attempt(returns);
-                       return returns();
-               };
-       },
-
-       bind: function(bind, args){
-               var self = this;
-               if (args != null) args = Array.from(args);
-               return function(){
-                       return self.apply(bind, args || arguments);
-               };
-       },
-
-       bindWithEvent: function(bind, args){
-               var self = this;
-               if (args != null) args = Array.from(args);
-               return function(event){
-                       return self.apply(bind, (args == null) ? arguments : [event].concat(args));
-               };
-       },
-
-       run: function(args, bind){
-               return this.apply(bind, Array.from(args));
-       }
-
-});
-
-if (Object.create == Function.prototype.create) Object.create = null;
-
-var $try = Function.attempt;
-
-//</1.2compat>
-
-
-// Begin: Source/Types/Number.js
-/*
----
-
-name: Number
-
-description: Contains Number Prototypes like limit, round, times, and ceil.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Number
-
-...
-*/
-
-Number.implement({
-
-       limit: function(min, max){
-               return Math.min(max, Math.max(min, this));
-       },
-
-       round: function(precision){
-               precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
-               return Math.round(this * precision) / precision;
-       },
-
-       times: function(fn, bind){
-               for (var i = 0; i < this; i++) fn.call(bind, i, this);
-       },
-
-       toFloat: function(){
-               return parseFloat(this);
-       },
-
-       toInt: function(base){
-               return parseInt(this, base || 10);
-       }
-
-});
-
-Number.alias('each', 'times');
-
-(function(math){
-       var methods = {};
-       math.each(function(name){
-               if (!Number[name]) methods[name] = function(){
-                       return Math[name].apply(null, [this].concat(Array.from(arguments)));
-               };
-       });
-       Number.implement(methods);
-})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
-
-
-// Begin: Source/Types/String.js
-/*
----
-
-name: String
-
-description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: String
-
-...
-*/
-
-String.implement({
-
-       test: function(regex, params){
-               return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
-       },
-
-       contains: function(string, separator){
-               return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : String(this).indexOf(string) > -1;
-       },
-
-       trim: function(){
-               return String(this).replace(/^\s+|\s+$/g, '');
-       },
-
-       clean: function(){
-               return String(this).replace(/\s+/g, ' ').trim();
-       },
-
-       camelCase: function(){
-               return String(this).replace(/-\D/g, function(match){
-                       return match.charAt(1).toUpperCase();
-               });
-       },
-
-       hyphenate: function(){
-               return String(this).replace(/[A-Z]/g, function(match){
-                       return ('-' + match.charAt(0).toLowerCase());
-               });
-       },
-
-       capitalize: function(){
-               return String(this).replace(/\b[a-z]/g, function(match){
-                       return match.toUpperCase();
-               });
-       },
-
-       escapeRegExp: function(){
-               return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
-       },
-
-       toInt: function(base){
-               return parseInt(this, base || 10);
-       },
-
-       toFloat: function(){
-               return parseFloat(this);
-       },
-
-       hexToRgb: function(array){
-               var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
-               return (hex) ? hex.slice(1).hexToRgb(array) : null;
-       },
-
-       rgbToHex: function(array){
-               var rgb = String(this).match(/\d{1,3}/g);
-               return (rgb) ? rgb.rgbToHex(array) : null;
-       },
-
-       substitute: function(object, regexp){
-               return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
-                       if (match.charAt(0) == '\\') return match.slice(1);
-                       return (object[name] != null) ? object[name] : '';
-               });
-       }
-
-});
-
-
-// Begin: Source/Browser/Browser.js
-/*
----
-
-name: Browser
-
-description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
-
-license: MIT-style license.
-
-requires: [Array, Function, Number, String]
-
-provides: [Browser, Window, Document]
-
-...
-*/
-
-(function(){
-
-var document = this.document;
-var window = document.window = this;
-
-var ua = navigator.userAgent.toLowerCase(),
-       platform = navigator.platform.toLowerCase(),
-       UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
-       mode = UA[1] == 'ie' && document.documentMode;
-
-var Browser = this.Browser = {
-
-       extend: Function.prototype.extend,
-
-       name: (UA[1] == 'version') ? UA[3] : UA[1],
-
-       version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
-
-       Platform: {
-               name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
-       },
-
-       Features: {
-               xpath: !!(document.evaluate),
-               air: !!(window.runtime),
-               query: !!(document.querySelector),
-               json: !!(window.JSON)
-       },
-
-       Plugins: {}
-
-};
-
-Browser[Browser.name] = true;
-Browser[Browser.name + parseInt(Browser.version, 10)] = true;
-Browser.Platform[Browser.Platform.name] = true;
-
-// Request
-
-Browser.Request = (function(){
-
-       var XMLHTTP = function(){
-               return new XMLHttpRequest();
-       };
-
-       var MSXML2 = function(){
-               return new ActiveXObject('MSXML2.XMLHTTP');
-       };
-
-       var MSXML = function(){
-               return new ActiveXObject('Microsoft.XMLHTTP');
-       };
-
-       return Function.attempt(function(){
-               XMLHTTP();
-               return XMLHTTP;
-       }, function(){
-               MSXML2();
-               return MSXML2;
-       }, function(){
-               MSXML();
-               return MSXML;
-       });
-
-})();
-
-Browser.Features.xhr = !!(Browser.Request);
-
-// Flash detection
-
-var version = (Function.attempt(function(){
-       return navigator.plugins['Shockwave Flash'].description;
-}, function(){
-       return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
-}) || '0 r0').match(/\d+/g);
-
-Browser.Plugins.Flash = {
-       version: Number(version[0] || '0.' + version[1]) || 0,
-       build: Number(version[2]) || 0
-};
-
-// String scripts
-
-Browser.exec = function(text){
-       if (!text) return text;
-       if (window.execScript){
-               window.execScript(text);
-       } else {
-               var script = document.createElement('script');
-               script.setAttribute('type', 'text/javascript');
-               script.text = text;
-               document.head.appendChild(script);
-               document.head.removeChild(script);
-       }
-       return text;
-};
-
-String.implement('stripScripts', function(exec){
-       var scripts = '';
-       var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
-               scripts += code + '\n';
-               return '';
-       });
-       if (exec === true) Browser.exec(scripts);
-       else if (typeOf(exec) == 'function') exec(scripts, text);
-       return text;
-});
-
-// Window, Document
-
-Browser.extend({
-       Document: this.Document,
-       Window: this.Window,
-       Element: this.Element,
-       Event: this.Event
-});
-
-this.Window = this.$constructor = new Type('Window', function(){});
-
-this.$family = Function.from('window').hide();
-
-Window.mirror(function(name, method){
-       window[name] = method;
-});
-
-this.Document = document.$constructor = new Type('Document', function(){});
-
-document.$family = Function.from('document').hide();
-
-Document.mirror(function(name, method){
-       document[name] = method;
-});
-
-document.html = document.documentElement;
-if (!document.head) document.head = document.getElementsByTagName('head')[0];
-
-if (document.execCommand) try {
-       document.execCommand("BackgroundImageCache", false, true);
-} catch (e){}
-
-/*<ltIE9>*/
-if (this.attachEvent && !this.addEventListener){
-       var unloadEvent = function(){
-               this.detachEvent('onunload', unloadEvent);
-               document.head = document.html = document.window = null;
-       };
-       this.attachEvent('onunload', unloadEvent);
-}
-
-// IE fails on collections and <select>.options (refers to <select>)
-var arrayFrom = Array.from;
-try {
-       arrayFrom(document.html.childNodes);
-} catch(e){
-       Array.from = function(item){
-               if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
-                       var i = item.length, array = new Array(i);
-                       while (i--) array[i] = item[i];
-                       return array;
-               }
-               return arrayFrom(item);
-       };
-
-       var prototype = Array.prototype,
-               slice = prototype.slice;
-       ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
-               var method = prototype[name];
-               Array[name] = function(item){
-                       return method.apply(Array.from(item), slice.call(arguments, 1));
-               };
-       });
-}
-/*</ltIE9>*/
-
-//<1.2compat>
-
-if (Browser.Platform.ios) Browser.Platform.ipod = true;
-
-Browser.Engine = {};
-
-var setEngine = function(name, version){
-       Browser.Engine.name = name;
-       Browser.Engine[name + version] = true;
-       Browser.Engine.version = version;
-};
-
-if (Browser.ie){
-       Browser.Engine.trident = true;
-
-       switch (Browser.version){
-               case 6: setEngine('trident', 4); break;
-               case 7: setEngine('trident', 5); break;
-               case 8: setEngine('trident', 6);
-       }
-}
-
-if (Browser.firefox){
-       Browser.Engine.gecko = true;
-
-       if (Browser.version >= 3) setEngine('gecko', 19);
-       else setEngine('gecko', 18);
-}
-
-if (Browser.safari || Browser.chrome){
-       Browser.Engine.webkit = true;
-
-       switch (Browser.version){
-               case 2: setEngine('webkit', 419); break;
-               case 3: setEngine('webkit', 420); break;
-               case 4: setEngine('webkit', 525);
-       }
-}
-
-if (Browser.opera){
-       Browser.Engine.presto = true;
-
-       if (Browser.version >= 9.6) setEngine('presto', 960);
-       else if (Browser.version >= 9.5) setEngine('presto', 950);
-       else setEngine('presto', 925);
-}
-
-if (Browser.name == 'unknown'){
-       switch ((ua.match(/(?:webkit|khtml|gecko)/) || [])[0]){
-               case 'webkit':
-               case 'khtml':
-                       Browser.Engine.webkit = true;
-               break;
-               case 'gecko':
-                       Browser.Engine.gecko = true;
-       }
-}
-
-this.$exec = Browser.exec;
-
-//</1.2compat>
-
-})();
-
-
-// Begin: Source/Slick/Slick.Parser.js
-/*
----
-name: Slick.Parser
-description: Standalone CSS3 Selector parser
-provides: Slick.Parser
-...
-*/
-
-;(function(){
-
-var parsed,
-       separatorIndex,
-       combinatorIndex,
-       reversed,
-       cache = {},
-       reverseCache = {},
-       reUnescape = /\\/g;
-
-var parse = function(expression, isReversed){
-       if (expression == null) return null;
-       if (expression.Slick === true) return expression;
-       expression = ('' + expression).replace(/^\s+|\s+$/g, '');
-       reversed = !!isReversed;
-       var currentCache = (reversed) ? reverseCache : cache;
-       if (currentCache[expression]) return currentCache[expression];
-       parsed = {
-               Slick: true,
-               expressions: [],
-               raw: expression,
-               reverse: function(){
-                       return parse(this.raw, true);
-               }
-       };
-       separatorIndex = -1;
-       while (expression != (expression = expression.replace(regexp, parser)));
-       parsed.length = parsed.expressions.length;
-       return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
-};
-
-var reverseCombinator = function(combinator){
-       if (combinator === '!') return ' ';
-       else if (combinator === ' ') return '!';
-       else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
-       else return '!' + combinator;
-};
-
-var reverse = function(expression){
-       var expressions = expression.expressions;
-       for (var i = 0; i < expressions.length; i++){
-               var exp = expressions[i];
-               var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
-
-               for (var j = 0; j < exp.length; j++){
-                       var cexp = exp[j];
-                       if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
-                       cexp.combinator = cexp.reverseCombinator;
-                       delete cexp.reverseCombinator;
-               }
-
-               exp.reverse().push(last);
-       }
-       return expression;
-};
-
-var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
-       return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
-               return '\\' + match;
-       });
-};
-
-var regexp = new RegExp(
-/*
-#!/usr/bin/env ruby
-puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
-__END__
-       "(?x)^(?:\
-         \\s* ( , ) \\s*               # Separator          \n\
-       | \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
-       |      ( \\s+ )                 # CombinatorChildren \n\
-       |      ( <unicode>+ | \\* )     # Tag                \n\
-       | \\#  ( <unicode>+       )     # ID                 \n\
-       | \\.  ( <unicode>+       )     # ClassName          \n\
-       |                               # Attribute          \n\
-       \\[  \
-               \\s* (<unicode1>+)  (?:  \
-                       \\s* ([*^$!~|]?=)  (?:  \
-                               \\s* (?:\
-                                       ([\"']?)(.*?)\\9 \
-                               )\
-                       )  \
-               )?  \\s*  \
-       \\](?!\\]) \n\
-       |   :+ ( <unicode>+ )(?:\
-       \\( (?:\
-               (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
-       ) \\)\
-       )?\
-       )"
-*/
-       "^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
-       .replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
-       .replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-       .replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-);
-
-function parser(
-       rawMatch,
-
-       separator,
-       combinator,
-       combinatorChildren,
-
-       tagName,
-       id,
-       className,
-
-       attributeKey,
-       attributeOperator,
-       attributeQuote,
-       attributeValue,
-
-       pseudoMarker,
-       pseudoClass,
-       pseudoQuote,
-       pseudoClassQuotedValue,
-       pseudoClassValue
-){
-       if (separator || separatorIndex === -1){
-               parsed.expressions[++separatorIndex] = [];
-               combinatorIndex = -1;
-               if (separator) return '';
-       }
-
-       if (combinator || combinatorChildren || combinatorIndex === -1){
-               combinator = combinator || ' ';
-               var currentSeparator = parsed.expressions[separatorIndex];
-               if (reversed && currentSeparator[combinatorIndex])
-                       currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
-               currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
-       }
-
-       var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
-
-       if (tagName){
-               currentParsed.tag = tagName.replace(reUnescape, '');
-
-       } else if (id){
-               currentParsed.id = id.replace(reUnescape, '');
-
-       } else if (className){
-               className = className.replace(reUnescape, '');
-
-               if (!currentParsed.classList) currentParsed.classList = [];
-               if (!currentParsed.classes) currentParsed.classes = [];
-               currentParsed.classList.push(className);
-               currentParsed.classes.push({
-                       value: className,
-                       regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
-               });
-
-       } else if (pseudoClass){
-               pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
-               pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
-
-               if (!currentParsed.pseudos) currentParsed.pseudos = [];
-               currentParsed.pseudos.push({
-                       key: pseudoClass.replace(reUnescape, ''),
-                       value: pseudoClassValue,
-                       type: pseudoMarker.length == 1 ? 'class' : 'element'
-               });
-
-       } else if (attributeKey){
-               attributeKey = attributeKey.replace(reUnescape, '');
-               attributeValue = (attributeValue || '').replace(reUnescape, '');
-
-               var test, regexp;
-
-               switch (attributeOperator){
-                       case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
-                       case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
-                       case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
-                       case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
-                       case  '=' : test = function(value){
-                               return attributeValue == value;
-                       }; break;
-                       case '*=' : test = function(value){
-                               return value && value.indexOf(attributeValue) > -1;
-                       }; break;
-                       case '!=' : test = function(value){
-                               return attributeValue != value;
-                       }; break;
-                       default   : test = function(value){
-                               return !!value;
-                       };
-               }
-
-               if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
-                       return false;
-               };
-
-               if (!test) test = function(value){
-                       return value && regexp.test(value);
-               };
-
-               if (!currentParsed.attributes) currentParsed.attributes = [];
-               currentParsed.attributes.push({
-                       key: attributeKey,
-                       operator: attributeOperator,
-                       value: attributeValue,
-                       test: test
-               });
-
-       }
-
-       return '';
-};
-
-// Slick NS
-
-var Slick = (this.Slick || {});
-
-Slick.parse = function(expression){
-       return parse(expression);
-};
-
-Slick.escapeRegExp = escapeRegExp;
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-
-// Begin: Source/Slick/Slick.Finder.js
-/*
----
-name: Slick.Finder
-description: The new, superfast css selector engine.
-provides: Slick.Finder
-requires: Slick.Parser
-...
-*/
-
-;(function(){
-
-var local = {},
-       featuresCache = {},
-       toString = Object.prototype.toString;
-
-// Feature / Bug detection
-
-local.isNativeCode = function(fn){
-       return (/\{\s*\[native code\]\s*\}/).test('' + fn);
-};
-
-local.isXML = function(document){
-       return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
-       (document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
-};
-
-local.setDocument = function(document){
-
-       // convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
-       var nodeType = document.nodeType;
-       if (nodeType == 9); // document
-       else if (nodeType) document = document.ownerDocument; // node
-       else if (document.navigator) document = document.document; // window
-       else return;
-
-       // check if it's the old document
-
-       if (this.document === document) return;
-       this.document = document;
-
-       // check if we have done feature detection on this document before
-
-       var root = document.documentElement,
-               rootUid = this.getUIDXML(root),
-               features = featuresCache[rootUid],
-               feature;
-
-       if (features){
-               for (feature in features){
-                       this[feature] = features[feature];
-               }
-               return;
-       }
-
-       features = featuresCache[rootUid] = {};
-
-       features.root = root;
-       features.isXMLDocument = this.isXML(document);
-
-       features.brokenStarGEBTN
-       = features.starSelectsClosedQSA
-       = features.idGetsName
-       = features.brokenMixedCaseQSA
-       = features.brokenGEBCN
-       = features.brokenCheckedQSA
-       = features.brokenEmptyAttributeQSA
-       = features.isHTMLDocument
-       = features.nativeMatchesSelector
-       = false;
-
-       var starSelectsClosed, starSelectsComments,
-               brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
-               brokenFormAttributeGetter;
-
-       var selected, id = 'slick_uniqueid';
-       var testNode = document.createElement('div');
-
-       var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
-       testRoot.appendChild(testNode);
-
-       // on non-HTML documents innerHTML and getElementsById doesnt work properly
-       try {
-               testNode.innerHTML = '<a id="'+id+'"></a>';
-               features.isHTMLDocument = !!document.getElementById(id);
-       } catch(e){};
-
-       if (features.isHTMLDocument){
-
-               testNode.style.display = 'none';
-
-               // IE returns comment nodes for getElementsByTagName('*') for some documents
-               testNode.appendChild(document.createComment(''));
-               starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
-
-               // IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
-               try {
-                       testNode.innerHTML = 'foo</foo>';
-                       selected = testNode.getElementsByTagName('*');
-                       starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
-               } catch(e){};
-
-               features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
-
-               // IE returns elements with the name instead of just id for getElementsById for some documents
-               try {
-                       testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
-                       features.idGetsName = document.getElementById(id) === testNode.firstChild;
-               } catch(e){};
-
-               if (testNode.getElementsByClassName){
-
-                       // Safari 3.2 getElementsByClassName caches results
-                       try {
-                               testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
-                               testNode.getElementsByClassName('b').length;
-                               testNode.firstChild.className = 'b';
-                               cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
-                       } catch(e){};
-
-                       // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
-                       try {
-                               testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
-                               brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
-                       } catch(e){};
-
-                       features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
-               }
-
-               if (testNode.querySelectorAll){
-                       // IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
-                       try {
-                               testNode.innerHTML = 'foo</foo>';
-                               selected = testNode.querySelectorAll('*');
-                               features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
-                       } catch(e){};
-
-                       // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
-                       try {
-                               testNode.innerHTML = '<a class="MiX"></a>';
-                               features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
-                       } catch(e){};
-
-                       // Webkit and Opera dont return selected options on querySelectorAll
-                       try {
-                               testNode.innerHTML = '<select><option selected="selected">a</option></select>';
-                               features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
-                       } catch(e){};
-
-                       // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
-                       try {
-                               testNode.innerHTML = '<a class=""></a>';
-                               features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
-                       } catch(e){};
-
-               }
-
-               // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
-               try {
-                       testNode.innerHTML = '<form action="s"><input id="action"/></form>';
-                       brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
-               } catch(e){};
-
-               // native matchesSelector function
-
-               features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
-               if (features.nativeMatchesSelector) try {
-                       // if matchesSelector trows errors on incorrect sintaxes we can use it
-                       features.nativeMatchesSelector.call(root, ':slick');
-                       features.nativeMatchesSelector = null;
-               } catch(e){};
-
-       }
-
-       try {
-               root.slick_expando = 1;
-               delete root.slick_expando;
-               features.getUID = this.getUIDHTML;
-       } catch(e) {
-               features.getUID = this.getUIDXML;
-       }
-
-       testRoot.removeChild(testNode);
-       testNode = selected = testRoot = null;
-
-       // getAttribute
-
-       features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
-               var method = this.attributeGetters[name];
-               if (method) return method.call(node);
-               var attributeNode = node.getAttributeNode(name);
-               return (attributeNode) ? attributeNode.nodeValue : null;
-       } : function(node, name){
-               var method = this.attributeGetters[name];
-               return (method) ? method.call(node) : node.getAttribute(name);
-       };
-
-       // hasAttribute
-
-       features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
-               return node.hasAttribute(attribute);
-       } : function(node, attribute) {
-               node = node.getAttributeNode(attribute);
-               return !!(node && (node.specified || node.nodeValue));
-       };
-
-       // contains
-       // FIXME: Add specs: local.contains should be different for xml and html documents?
-       var nativeRootContains = root && this.isNativeCode(root.contains),
-               nativeDocumentContains = document && this.isNativeCode(document.contains);
-
-       features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){
-               return context.contains(node);
-       } : (nativeRootContains && !nativeDocumentContains) ? function(context, node){
-               // IE8 does not have .contains on document.
-               return context === node || ((context === document) ? document.documentElement : context).contains(node);
-       } : (root && root.compareDocumentPosition) ? function(context, node){
-               return context === node || !!(context.compareDocumentPosition(node) & 16);
-       } : function(context, node){
-               if (node) do {
-                       if (node === context) return true;
-               } while ((node = node.parentNode));
-               return false;
-       };
-
-       // document order sorting
-       // credits to Sizzle (http://sizzlejs.com/)
-
-       features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
-               if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
-               return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
-       } : ('sourceIndex' in root) ? function(a, b){
-               if (!a.sourceIndex || !b.sourceIndex) return 0;
-               return a.sourceIndex - b.sourceIndex;
-       } : (document.createRange) ? function(a, b){
-               if (!a.ownerDocument || !b.ownerDocument) return 0;
-               var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
-               aRange.setStart(a, 0);
-               aRange.setEnd(a, 0);
-               bRange.setStart(b, 0);
-               bRange.setEnd(b, 0);
-               return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
-       } : null ;
-
-       root = null;
-
-       for (feature in features){
-               this[feature] = features[feature];
-       }
-};
-
-// Main Method
-
-var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
-       reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
-       qsaFailExpCache = {};
-
-local.search = function(context, expression, append, first){
-
-       var found = this.found = (first) ? null : (append || []);
-
-       if (!context) return found;
-       else if (context.navigator) context = context.document; // Convert the node from a window to a document
-       else if (!context.nodeType) return found;
-
-       // setup
-
-       var parsed, i,
-               uniques = this.uniques = {},
-               hasOthers = !!(append && append.length),
-               contextIsDocument = (context.nodeType == 9);
-
-       if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
-
-       // avoid duplicating items already in the append array
-       if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
-
-       // expression checks
-
-       if (typeof expression == 'string'){ // expression is a string
-
-               /*<simple-selectors-override>*/
-               var simpleSelector = expression.match(reSimpleSelector);
-               simpleSelectors: if (simpleSelector) {
-
-                       var symbol = simpleSelector[1],
-                               name = simpleSelector[2],
-                               node, nodes;
-
-                       if (!symbol){
-
-                               if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
-                               nodes = context.getElementsByTagName(name);
-                               if (first) return nodes[0] || null;
-                               for (i = 0; node = nodes[i++];){
-                                       if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-                               }
-
-                       } else if (symbol == '#'){
-
-                               if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
-                               node = context.getElementById(name);
-                               if (!node) return found;
-                               if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
-                               if (first) return node || null;
-                               if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-
-                       } else if (symbol == '.'){
-
-                               if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
-                               if (context.getElementsByClassName && !this.brokenGEBCN){
-                                       nodes = context.getElementsByClassName(name);
-                                       if (first) return nodes[0] || null;
-                                       for (i = 0; node = nodes[i++];){
-                                               if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-                                       }
-                               } else {
-                                       var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
-                                       nodes = context.getElementsByTagName('*');
-                                       for (i = 0; node = nodes[i++];){
-                                               className = node.className;
-                                               if (!(className && matchClass.test(className))) continue;
-                                               if (first) return node;
-                                               if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-                                       }
-                               }
-
-                       }
-
-                       if (hasOthers) this.sort(found);
-                       return (first) ? null : found;
-
-               }
-               /*</simple-selectors-override>*/
-
-               /*<query-selector-override>*/
-               querySelector: if (context.querySelectorAll) {
-
-                       if (!this.isHTMLDocument
-                               || qsaFailExpCache[expression]
-                               //TODO: only skip when expression is actually mixed case
-                               || this.brokenMixedCaseQSA
-                               || (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)
-                               || (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))
-                               || (!contextIsDocument //Abort when !contextIsDocument and...
-                                       //  there are multiple expressions in the selector
-                                       //  since we currently only fix non-document rooted QSA for single expression selectors
-                                       && expression.indexOf(',') > -1
-                               )
-                               || Slick.disableQSA
-                       ) break querySelector;
-
-                       var _expression = expression, _context = context;
-                       if (!contextIsDocument){
-                               // non-document rooted QSA
-                               // credits to Andrew Dupont
-                               var currentId = _context.getAttribute('id'), slickid = 'slickid__';
-                               _context.setAttribute('id', slickid);
-                               _expression = '#' + slickid + ' ' + _expression;
-                               context = _context.parentNode;
-                       }
-
-                       try {
-                               if (first) return context.querySelector(_expression) || null;
-                               else nodes = context.querySelectorAll(_expression);
-                       } catch(e) {
-                               qsaFailExpCache[expression] = 1;
-                               break querySelector;
-                       } finally {
-                               if (!contextIsDocument){
-                                       if (currentId) _context.setAttribute('id', currentId);
-                                       else _context.removeAttribute('id');
-                                       context = _context;
-                               }
-                       }
-
-                       if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
-                               if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
-                       } else for (i = 0; node = nodes[i++];){
-                               if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-                       }
-
-                       if (hasOthers) this.sort(found);
-                       return found;
-
-               }
-               /*</query-selector-override>*/
-
-               parsed = this.Slick.parse(expression);
-               if (!parsed.length) return found;
-       } else if (expression == null){ // there is no expression
-               return found;
-       } else if (expression.Slick){ // expression is a parsed Slick object
-               parsed = expression;
-       } else if (this.contains(context.documentElement || context, expression)){ // expression is a node
-               (found) ? found.push(expression) : found = expression;
-               return found;
-       } else { // other junk
-               return found;
-       }
-
-       /*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-       // cache elements for the nth selectors
-
-       this.posNTH = {};
-       this.posNTHLast = {};
-       this.posNTHType = {};
-       this.posNTHTypeLast = {};
-
-       /*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-       // if append is null and there is only a single selector with one expression use pushArray, else use pushUID
-       this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
-
-       if (found == null) found = [];
-
-       // default engine
-
-       var j, m, n;
-       var combinator, tag, id, classList, classes, attributes, pseudos;
-       var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
-
-       search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
-
-               combinator = 'combinator:' + currentBit.combinator;
-               if (!this[combinator]) continue search;
-
-               tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
-               id         = currentBit.id;
-               classList  = currentBit.classList;
-               classes    = currentBit.classes;
-               attributes = currentBit.attributes;
-               pseudos    = currentBit.pseudos;
-               lastBit    = (j === (currentExpression.length - 1));
-
-               this.bitUniques = {};
-
-               if (lastBit){
-                       this.uniques = uniques;
-                       this.found = found;
-               } else {
-                       this.uniques = {};
-                       this.found = [];
-               }
-
-               if (j === 0){
-                       this[combinator](context, tag, id, classes, attributes, pseudos, classList);
-                       if (first && lastBit && found.length) break search;
-               } else {
-                       if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
-                               this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
-                               if (found.length) break search;
-                       } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
-               }
-
-               currentItems = this.found;
-       }
-
-       // should sort if there are nodes in append and if you pass multiple expressions.
-       if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
-
-       return (first) ? (found[0] || null) : found;
-};
-
-// Utils
-
-local.uidx = 1;
-local.uidk = 'slick-uniqueid';
-
-local.getUIDXML = function(node){
-       var uid = node.getAttribute(this.uidk);
-       if (!uid){
-               uid = this.uidx++;
-               node.setAttribute(this.uidk, uid);
-       }
-       return uid;
-};
-
-local.getUIDHTML = function(node){
-       return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
-};
-
-// sort based on the setDocument documentSorter method.
-
-local.sort = function(results){
-       if (!this.documentSorter) return results;
-       results.sort(this.documentSorter);
-       return results;
-};
-
-/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-local.cacheNTH = {};
-
-local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
-
-local.parseNTHArgument = function(argument){
-       var parsed = argument.match(this.matchNTH);
-       if (!parsed) return false;
-       var special = parsed[2] || false;
-       var a = parsed[1] || 1;
-       if (a == '-') a = -1;
-       var b = +parsed[3] || 0;
-       parsed =
-               (special == 'n')        ? {a: a, b: b} :
-               (special == 'odd')      ? {a: 2, b: 1} :
-               (special == 'even')     ? {a: 2, b: 0} : {a: 0, b: a};
-
-       return (this.cacheNTH[argument] = parsed);
-};
-
-local.createNTHPseudo = function(child, sibling, positions, ofType){
-       return function(node, argument){
-               var uid = this.getUID(node);
-               if (!this[positions][uid]){
-                       var parent = node.parentNode;
-                       if (!parent) return false;
-                       var el = parent[child], count = 1;
-                       if (ofType){
-                               var nodeName = node.nodeName;
-                               do {
-                                       if (el.nodeName != nodeName) continue;
-                                       this[positions][this.getUID(el)] = count++;
-                               } while ((el = el[sibling]));
-                       } else {
-                               do {
-                                       if (el.nodeType != 1) continue;
-                                       this[positions][this.getUID(el)] = count++;
-                               } while ((el = el[sibling]));
-                       }
-               }
-               argument = argument || 'n';
-               var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
-               if (!parsed) return false;
-               var a = parsed.a, b = parsed.b, pos = this[positions][uid];
-               if (a == 0) return b == pos;
-               if (a > 0){
-                       if (pos < b) return false;
-               } else {
-                       if (b < pos) return false;
-               }
-               return ((pos - b) % a) == 0;
-       };
-};
-
-/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-local.pushArray = function(node, tag, id, classes, attributes, pseudos){
-       if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
-};
-
-local.pushUID = function(node, tag, id, classes, attributes, pseudos){
-       var uid = this.getUID(node);
-       if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
-               this.uniques[uid] = true;
-               this.found.push(node);
-       }
-};
-
-local.matchNode = function(node, selector){
-       if (this.isHTMLDocument && this.nativeMatchesSelector){
-               try {
-                       return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
-               } catch(matchError) {}
-       }
-
-       var parsed = this.Slick.parse(selector);
-       if (!parsed) return true;
-
-       // simple (single) selectors
-       var expressions = parsed.expressions, simpleExpCounter = 0, i;
-       for (i = 0; (currentExpression = expressions[i]); i++){
-               if (currentExpression.length == 1){
-                       var exp = currentExpression[0];
-                       if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
-                       simpleExpCounter++;
-               }
-       }
-
-       if (simpleExpCounter == parsed.length) return false;
-
-       var nodes = this.search(this.document, parsed), item;
-       for (i = 0; item = nodes[i++];){
-               if (item === node) return true;
-       }
-       return false;
-};
-
-local.matchPseudo = function(node, name, argument){
-       var pseudoName = 'pseudo:' + name;
-       if (this[pseudoName]) return this[pseudoName](node, argument);
-       var attribute = this.getAttribute(node, name);
-       return (argument) ? argument == attribute : !!attribute;
-};
-
-local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
-       if (tag){
-               var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
-               if (tag == '*'){
-                       if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
-               } else {
-                       if (nodeName != tag) return false;
-               }
-       }
-
-       if (id && node.getAttribute('id') != id) return false;
-
-       var i, part, cls;
-       if (classes) for (i = classes.length; i--;){
-               cls = this.getAttribute(node, 'class');
-               if (!(cls && classes[i].regexp.test(cls))) return false;
-       }
-       if (attributes) for (i = attributes.length; i--;){
-               part = attributes[i];
-               if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
-       }
-       if (pseudos) for (i = pseudos.length; i--;){
-               part = pseudos[i];
-               if (!this.matchPseudo(node, part.key, part.value)) return false;
-       }
-       return true;
-};
-
-var combinators = {
-
-       ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
-
-               var i, item, children;
-
-               if (this.isHTMLDocument){
-                       getById: if (id){
-                               item = this.document.getElementById(id);
-                               if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
-                                       // all[id] returns all the elements with that name or id inside node
-                                       // if theres just one it will return the element, else it will be a collection
-                                       children = node.all[id];
-                                       if (!children) return;
-                                       if (!children[0]) children = [children];
-                                       for (i = 0; item = children[i++];){
-                                               var idNode = item.getAttributeNode('id');
-                                               if (idNode && idNode.nodeValue == id){
-                                                       this.push(item, tag, null, classes, attributes, pseudos);
-                                                       break;
-                                               }
-                                       }
-                                       return;
-                               }
-                               if (!item){
-                                       // if the context is in the dom we return, else we will try GEBTN, breaking the getById label
-                                       if (this.contains(this.root, node)) return;
-                                       else break getById;
-                               } else if (this.document !== node && !this.contains(node, item)) return;
-                               this.push(item, tag, null, classes, attributes, pseudos);
-                               return;
-                       }
-                       getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
-                               children = node.getElementsByClassName(classList.join(' '));
-                               if (!(children && children.length)) break getByClass;
-                               for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
-                               return;
-                       }
-               }
-               getByTag: {
-                       children = node.getElementsByTagName(tag);
-                       if (!(children && children.length)) break getByTag;
-                       if (!this.brokenStarGEBTN) tag = null;
-                       for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
-               }
-       },
-
-       '>': function(node, tag, id, classes, attributes, pseudos){ // direct children
-               if ((node = node.firstChild)) do {
-                       if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-               } while ((node = node.nextSibling));
-       },
-
-       '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
-               while ((node = node.nextSibling)) if (node.nodeType == 1){
-                       this.push(node, tag, id, classes, attributes, pseudos);
-                       break;
-               }
-       },
-
-       '^': function(node, tag, id, classes, attributes, pseudos){ // first child
-               node = node.firstChild;
-               if (node){
-                       if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-                       else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
-               }
-       },
-
-       '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
-               while ((node = node.nextSibling)){
-                       if (node.nodeType != 1) continue;
-                       var uid = this.getUID(node);
-                       if (this.bitUniques[uid]) break;
-                       this.bitUniques[uid] = true;
-                       this.push(node, tag, id, classes, attributes, pseudos);
-               }
-       },
-
-       '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
-               this['combinator:+'](node, tag, id, classes, attributes, pseudos);
-               this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
-       },
-
-       '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
-               this['combinator:~'](node, tag, id, classes, attributes, pseudos);
-               this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
-       },
-
-       '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
-               while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
-       },
-
-       '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
-               node = node.parentNode;
-               if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
-       },
-
-       '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
-               while ((node = node.previousSibling)) if (node.nodeType == 1){
-                       this.push(node, tag, id, classes, attributes, pseudos);
-                       break;
-               }
-       },
-
-       '!^': function(node, tag, id, classes, attributes, pseudos){ // last child
-               node = node.lastChild;
-               if (node){
-                       if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-                       else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
-               }
-       },
-
-       '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
-               while ((node = node.previousSibling)){
-                       if (node.nodeType != 1) continue;
-                       var uid = this.getUID(node);
-                       if (this.bitUniques[uid]) break;
-                       this.bitUniques[uid] = true;
-                       this.push(node, tag, id, classes, attributes, pseudos);
-               }
-       }
-
-};
-
-for (var c in combinators) local['combinator:' + c] = combinators[c];
-
-var pseudos = {
-
-       /*<pseudo-selectors>*/
-
-       'empty': function(node){
-               var child = node.firstChild;
-               return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
-       },
-
-       'not': function(node, expression){
-               return !this.matchNode(node, expression);
-       },
-
-       'contains': function(node, text){
-               return (node.innerText || node.textContent || '').indexOf(text) > -1;
-       },
-
-       'first-child': function(node){
-               while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
-               return true;
-       },
-
-       'last-child': function(node){
-               while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
-               return true;
-       },
-
-       'only-child': function(node){
-               var prev = node;
-               while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
-               var next = node;
-               while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
-               return true;
-       },
-
-       /*<nth-pseudo-selectors>*/
-
-       'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
-
-       'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
-
-       'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
-
-       'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
-
-       'index': function(node, index){
-               return this['pseudo:nth-child'](node, '' + (index + 1));
-       },
-
-       'even': function(node){
-               return this['pseudo:nth-child'](node, '2n');
-       },
-
-       'odd': function(node){
-               return this['pseudo:nth-child'](node, '2n+1');
-       },
-
-       /*</nth-pseudo-selectors>*/
-
-       /*<of-type-pseudo-selectors>*/
-
-       'first-of-type': function(node){
-               var nodeName = node.nodeName;
-               while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
-               return true;
-       },
-
-       'last-of-type': function(node){
-               var nodeName = node.nodeName;
-               while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
-               return true;
-       },
-
-       'only-of-type': function(node){
-               var prev = node, nodeName = node.nodeName;
-               while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
-               var next = node;
-               while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
-               return true;
-       },
-
-       /*</of-type-pseudo-selectors>*/
-
-       // custom pseudos
-
-       'enabled': function(node){
-               return !node.disabled;
-       },
-
-       'disabled': function(node){
-               return node.disabled;
-       },
-
-       'checked': function(node){
-               return node.checked || node.selected;
-       },
-
-       'focus': function(node){
-               return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
-       },
-
-       'root': function(node){
-               return (node === this.root);
-       },
-
-       'selected': function(node){
-               return node.selected;
-       }
-
-       /*</pseudo-selectors>*/
-};
-
-for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
-
-// attributes methods
-
-var attributeGetters = local.attributeGetters = {
-
-       'for': function(){
-               return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
-       },
-
-       'href': function(){
-               return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
-       },
-
-       'style': function(){
-               return (this.style) ? this.style.cssText : this.getAttribute('style');
-       },
-
-       'tabindex': function(){
-               var attributeNode = this.getAttributeNode('tabindex');
-               return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
-       },
-
-       'type': function(){
-               return this.getAttribute('type');
-       },
-
-       'maxlength': function(){
-               var attributeNode = this.getAttributeNode('maxLength');
-               return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
-       }
-
-};
-
-attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;
-
-// Slick
-
-var Slick = local.Slick = (this.Slick || {});
-
-Slick.version = '1.1.7';
-
-// Slick finder
-
-Slick.search = function(context, expression, append){
-       return local.search(context, expression, append);
-};
-
-Slick.find = function(context, expression){
-       return local.search(context, expression, null, true);
-};
-
-// Slick containment checker
-
-Slick.contains = function(container, node){
-       local.setDocument(container);
-       return local.contains(container, node);
-};
-
-// Slick attribute getter
-
-Slick.getAttribute = function(node, name){
-       local.setDocument(node);
-       return local.getAttribute(node, name);
-};
-
-Slick.hasAttribute = function(node, name){
-       local.setDocument(node);
-       return local.hasAttribute(node, name);
-};
-
-// Slick matcher
-
-Slick.match = function(node, selector){
-       if (!(node && selector)) return false;
-       if (!selector || selector === node) return true;
-       local.setDocument(node);
-       return local.matchNode(node, selector);
-};
-
-// Slick attribute accessor
-
-Slick.defineAttributeGetter = function(name, fn){
-       local.attributeGetters[name] = fn;
-       return this;
-};
-
-Slick.lookupAttributeGetter = function(name){
-       return local.attributeGetters[name];
-};
-
-// Slick pseudo accessor
-
-Slick.definePseudo = function(name, fn){
-       local['pseudo:' + name] = function(node, argument){
-               return fn.call(node, argument);
-       };
-       return this;
-};
-
-Slick.lookupPseudo = function(name){
-       var pseudo = local['pseudo:' + name];
-       if (pseudo) return function(argument){
-               return pseudo.call(this, argument);
-       };
-       return null;
-};
-
-// Slick overrides accessor
-
-Slick.override = function(regexp, fn){
-       local.override(regexp, fn);
-       return this;
-};
-
-Slick.isXML = local.isXML;
-
-Slick.uidOf = function(node){
-       return local.getUIDHTML(node);
-};
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-
-// Begin: Source/Element/Element.js
-/*
----
-
-name: Element
-
-description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder]
-
-provides: [Element, Elements, $, $$, Iframe, Selectors]
-
-...
-*/
-
-var Element = function(tag, props){
-       var konstructor = Element.Constructors[tag];
-       if (konstructor) return konstructor(props);
-       if (typeof tag != 'string') return document.id(tag).set(props);
-
-       if (!props) props = {};
-
-       if (!(/^[\w-]+$/).test(tag)){
-               var parsed = Slick.parse(tag).expressions[0][0];
-               tag = (parsed.tag == '*') ? 'div' : parsed.tag;
-               if (parsed.id && props.id == null) props.id = parsed.id;
-
-               var attributes = parsed.attributes;
-               if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){
-                       attr = attributes[i];
-                       if (props[attr.key] != null) continue;
-
-                       if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;
-                       else if (!attr.value && !attr.operator) props[attr.key] = true;
-               }
-
-               if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
-       }
-
-       return document.newElement(tag, props);
-};
-
-
-if (Browser.Element){
-       Element.prototype = Browser.Element.prototype;
-       // IE8 and IE9 require the wrapping.
-       Element.prototype._fireEvent = (function(fireEvent){
-               return function(type, event){
-                       return fireEvent.call(this, type, event);
-               };
-       })(Element.prototype.fireEvent);
-}
-
-new Type('Element', Element).mirror(function(name){
-       if (Array.prototype[name]) return;
-
-       var obj = {};
-       obj[name] = function(){
-               var results = [], args = arguments, elements = true;
-               for (var i = 0, l = this.length; i < l; i++){
-                       var element = this[i], result = results[i] = element[name].apply(element, args);
-                       elements = (elements && typeOf(result) == 'element');
-               }
-               return (elements) ? new Elements(results) : results;
-       };
-
-       Elements.implement(obj);
-});
-
-if (!Browser.Element){
-       Element.parent = Object;
-
-       Element.Prototype = {
-               '$constructor': Element,
-               '$family': Function.from('element').hide()
-       };
-
-       Element.mirror(function(name, method){
-               Element.Prototype[name] = method;
-       });
-}
-
-Element.Constructors = {};
-
-//<1.2compat>
-
-Element.Constructors = new Hash;
-
-//</1.2compat>
-
-var IFrame = new Type('IFrame', function(){
-       var params = Array.link(arguments, {
-               properties: Type.isObject,
-               iframe: function(obj){
-                       return (obj != null);
-               }
-       });
-
-       var props = params.properties || {}, iframe;
-       if (params.iframe) iframe = document.id(params.iframe);
-       var onload = props.onload || function(){};
-       delete props.onload;
-       props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
-       iframe = new Element(iframe || 'iframe', props);
-
-       var onLoad = function(){
-               onload.call(iframe.contentWindow);
-       };
-
-       if (window.frames[props.id]) onLoad();
-       else iframe.addListener('load', onLoad);
-       return iframe;
-});
-
-var Elements = this.Elements = function(nodes){
-       if (nodes && nodes.length){
-               var uniques = {}, node;
-               for (var i = 0; node = nodes[i++];){
-                       var uid = Slick.uidOf(node);
-                       if (!uniques[uid]){
-                               uniques[uid] = true;
-                               this.push(node);
-                       }
-               }
-       }
-};
-
-Elements.prototype = {length: 0};
-Elements.parent = Array;
-
-new Type('Elements', Elements).implement({
-
-       filter: function(filter, bind){
-               if (!filter) return this;
-               return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
-                       return item.match(filter);
-               } : filter, bind));
-       }.protect(),
-
-       push: function(){
-               var length = this.length;
-               for (var i = 0, l = arguments.length; i < l; i++){
-                       var item = document.id(arguments[i]);
-                       if (item) this[length++] = item;
-               }
-               return (this.length = length);
-       }.protect(),
-
-       unshift: function(){
-               var items = [];
-               for (var i = 0, l = arguments.length; i < l; i++){
-                       var item = document.id(arguments[i]);
-                       if (item) items.push(item);
-               }
-               return Array.prototype.unshift.apply(this, items);
-       }.protect(),
-
-       concat: function(){
-               var newElements = new Elements(this);
-               for (var i = 0, l = arguments.length; i < l; i++){
-                       var item = arguments[i];
-                       if (Type.isEnumerable(item)) newElements.append(item);
-                       else newElements.push(item);
-               }
-               return newElements;
-       }.protect(),
-
-       append: function(collection){
-               for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
-               return this;
-       }.protect(),
-
-       empty: function(){
-               while (this.length) delete this[--this.length];
-               return this;
-       }.protect()
-
-});
-
-//<1.2compat>
-
-Elements.alias('extend', 'append');
-
-//</1.2compat>
-
-(function(){
-
-// FF, IE
-var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
-
-splice.call(object, 1, 1);
-if (object[1] == 1) Elements.implement('splice', function(){
-       var length = this.length;
-       var result = splice.apply(this, arguments);
-       while (length >= this.length) delete this[length--];
-       return result;
-}.protect());
-
-Array.forEachMethod(function(method, name){
-       Elements.implement(name, method);
-});
-
-Array.mirror(Elements);
-
-/*<ltIE8>*/
-var createElementAcceptsHTML;
-try {
-    createElementAcceptsHTML = (document.createElement('<input name=x>').name == 'x');
-} catch (e){}
-
-var escapeQuotes = function(html){
-       return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
-};
-/*</ltIE8>*/
-
-Document.implement({
-
-       newElement: function(tag, props){
-               if (props && props.checked != null) props.defaultChecked = props.checked;
-               /*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
-               if (createElementAcceptsHTML && props){
-                       tag = '<' + tag;
-                       if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
-                       if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
-                       tag += '>';
-                       delete props.name;
-                       delete props.type;
-               }
-               /*</ltIE8>*/
-               return this.id(this.createElement(tag)).set(props);
-       }
-
-});
-
-})();
-
-(function(){
-
-Slick.uidOf(window);
-Slick.uidOf(document);
-
-Document.implement({
-
-       newTextNode: function(text){
-               return this.createTextNode(text);
-       },
-
-       getDocument: function(){
-               return this;
-       },
-
-       getWindow: function(){
-               return this.window;
-       },
-
-       id: (function(){
-
-               var types = {
-
-                       string: function(id, nocash, doc){
-                               id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
-                               return (id) ? types.element(id, nocash) : null;
-                       },
-
-                       element: function(el, nocash){
-                               Slick.uidOf(el);
-                               if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
-                                       var fireEvent = el.fireEvent;
-                                       // wrapping needed in IE7, or else crash
-                                       el._fireEvent = function(type, event){
-                                               return fireEvent(type, event);
-                                       };
-                                       Object.append(el, Element.Prototype);
-                               }
-                               return el;
-                       },
-
-                       object: function(obj, nocash, doc){
-                               if (obj.toElement) return types.element(obj.toElement(doc), nocash);
-                               return null;
-                       }
-
-               };
-
-               types.textnode = types.whitespace = types.window = types.document = function(zero){
-                       return zero;
-               };
-
-               return function(el, nocash, doc){
-                       if (el && el.$family && el.uniqueNumber) return el;
-                       var type = typeOf(el);
-                       return (types[type]) ? types[type](el, nocash, doc || document) : null;
-               };
-
-       })()
-
-});
-
-if (window.$ == null) Window.implement('$', function(el, nc){
-       return document.id(el, nc, this.document);
-});
-
-Window.implement({
-
-       getDocument: function(){
-               return this.document;
-       },
-
-       getWindow: function(){
-               return this;
-       }
-
-});
-
-[Document, Element].invoke('implement', {
-
-       getElements: function(expression){
-               return Slick.search(this, expression, new Elements);
-       },
-
-       getElement: function(expression){
-               return document.id(Slick.find(this, expression));
-       }
-
-});
-
-var contains = {contains: function(element){
-       return Slick.contains(this, element);
-}};
-
-if (!document.contains) Document.implement(contains);
-if (!document.createElement('div').contains) Element.implement(contains);
-
-//<1.2compat>
-
-Element.implement('hasChild', function(element){
-       return this !== element && this.contains(element);
-});
-
-(function(search, find, match){
-
-       this.Selectors = {};
-       var pseudos = this.Selectors.Pseudo = new Hash();
-
-       var addSlickPseudos = function(){
-               for (var name in pseudos) if (pseudos.hasOwnProperty(name)){
-                       Slick.definePseudo(name, pseudos[name]);
-                       delete pseudos[name];
-               }
-       };
-
-       Slick.search = function(context, expression, append){
-               addSlickPseudos();
-               return search.call(this, context, expression, append);
-       };
-
-       Slick.find = function(context, expression){
-               addSlickPseudos();
-               return find.call(this, context, expression);
-       };
-
-       Slick.match = function(node, selector){
-               addSlickPseudos();
-               return match.call(this, node, selector);
-       };
-
-})(Slick.search, Slick.find, Slick.match);
-
-//</1.2compat>
-
-// tree walking
-
-var injectCombinator = function(expression, combinator){
-       if (!expression) return combinator;
-
-       expression = Object.clone(Slick.parse(expression));
-
-       var expressions = expression.expressions;
-       for (var i = expressions.length; i--;)
-               expressions[i][0].combinator = combinator;
-
-       return expression;
-};
-
-Object.forEach({
-       getNext: '~',
-       getPrevious: '!~',
-       getParent: '!'
-}, function(combinator, method){
-       Element.implement(method, function(expression){
-               return this.getElement(injectCombinator(expression, combinator));
-       });
-});
-
-Object.forEach({
-       getAllNext: '~',
-       getAllPrevious: '!~',
-       getSiblings: '~~',
-       getChildren: '>',
-       getParents: '!'
-}, function(combinator, method){
-       Element.implement(method, function(expression){
-               return this.getElements(injectCombinator(expression, combinator));
-       });
-});
-
-Element.implement({
-
-       getFirst: function(expression){
-               return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
-       },
-
-       getLast: function(expression){
-               return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
-       },
-
-       getWindow: function(){
-               return this.ownerDocument.window;
-       },
-
-       getDocument: function(){
-               return this.ownerDocument;
-       },
-
-       getElementById: function(id){
-               return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
-       },
-
-       match: function(expression){
-               return !expression || Slick.match(this, expression);
-       }
-
-});
-
-//<1.2compat>
-
-if (window.$$ == null) Window.implement('$$', function(selector){
-       var elements = new Elements;
-       if (arguments.length == 1 && typeof selector == 'string') return Slick.search(this.document, selector, elements);
-       var args = Array.flatten(arguments);
-       for (var i = 0, l = args.length; i < l; i++){
-               var item = args[i];
-               switch (typeOf(item)){
-                       case 'element': elements.push(item); break;
-                       case 'string': Slick.search(this.document, item, elements);
-               }
-       }
-       return elements;
-});
-
-//</1.2compat>
-
-if (window.$$ == null) Window.implement('$$', function(selector){
-       if (arguments.length == 1){
-               if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
-               else if (Type.isEnumerable(selector)) return new Elements(selector);
-       }
-       return new Elements(arguments);
-});
-
-// Inserters
-
-var inserters = {
-
-       before: function(context, element){
-               var parent = element.parentNode;
-               if (parent) parent.insertBefore(context, element);
-       },
-
-       after: function(context, element){
-               var parent = element.parentNode;
-               if (parent) parent.insertBefore(context, element.nextSibling);
-       },
-
-       bottom: function(context, element){
-               element.appendChild(context);
-       },
-
-       top: function(context, element){
-               element.insertBefore(context, element.firstChild);
-       }
-
-};
-
-inserters.inside = inserters.bottom;
-
-//<1.2compat>
-
-Object.each(inserters, function(inserter, where){
-
-       where = where.capitalize();
-
-       var methods = {};
-
-       methods['inject' + where] = function(el){
-               inserter(this, document.id(el, true));
-               return this;
-       };
-
-       methods['grab' + where] = function(el){
-               inserter(document.id(el, true), this);
-               return this;
-       };
-
-       Element.implement(methods);
-
-});
-
-//</1.2compat>
-
-// getProperty / setProperty
-
-var propertyGetters = {}, propertySetters = {};
-
-// properties
-
-var properties = {};
-Array.forEach([
-       'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan',
-       'frameBorder', 'rowSpan', 'tabIndex', 'useMap'
-], function(property){
-       properties[property.toLowerCase()] = property;
-});
-
-properties.html = 'innerHTML';
-properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';
-
-Object.forEach(properties, function(real, key){
-       propertySetters[key] = function(node, value){
-               node[real] = value;
-       };
-       propertyGetters[key] = function(node){
-               return node[real];
-       };
-});
-
-// Booleans
-
-var bools = [
-       'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked',
-       'disabled', 'readOnly', 'multiple', 'selected', 'noresize',
-       'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay',
-       'loop'
-];
-
-var booleans = {};
-Array.forEach(bools, function(bool){
-       var lower = bool.toLowerCase();
-       booleans[lower] = bool;
-       propertySetters[lower] = function(node, value){
-               node[bool] = !!value;
-       };
-       propertyGetters[lower] = function(node){
-               return !!node[bool];
-       };
-});
-
-// Special cases
-
-Object.append(propertySetters, {
-
-       'class': function(node, value){
-               ('className' in node) ? node.className = (value || '') : node.setAttribute('class', value);
-       },
-
-       'for': function(node, value){
-               ('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value);
-       },
-
-       'style': function(node, value){
-               (node.style) ? node.style.cssText = value : node.setAttribute('style', value);
-       },
-
-       'value': function(node, value){
-               node.value = (value != null) ? value : '';
-       }
-
-});
-
-propertyGetters['class'] = function(node){
-       return ('className' in node) ? node.className || null : node.getAttribute('class');
-};
-
-/* <webkit> */
-var el = document.createElement('button');
-// IE sets type as readonly and throws
-try { el.type = 'button'; } catch(e){}
-if (el.type != 'button') propertySetters.type = function(node, value){
-       node.setAttribute('type', value);
-};
-el = null;
-/* </webkit> */
-
-/*<IE>*/
-var input = document.createElement('input');
-input.value = 't';
-input.type = 'submit';
-if (input.value != 't') propertySetters.type = function(node, type){
-       var value = node.value;
-       node.type = type;
-       node.value = value;
-};
-input = null;
-/*</IE>*/
-
-/* getProperty, setProperty */
-
-/* <ltIE9> */
-var pollutesGetAttribute = (function(div){
-       div.random = 'attribute';
-       return (div.getAttribute('random') == 'attribute');
-})(document.createElement('div'));
-
-/* <ltIE9> */
-
-Element.implement({
-
-       setProperty: function(name, value){
-               var setter = propertySetters[name.toLowerCase()];
-               if (setter){
-                       setter(this, value);
-               } else {
-                       /* <ltIE9> */
-                       if (pollutesGetAttribute) var attributeWhiteList = this.retrieve('$attributeWhiteList', {});
-                       /* </ltIE9> */
-
-                       if (value == null){
-                               this.removeAttribute(name);
-                               /* <ltIE9> */
-                               if (pollutesGetAttribute) delete attributeWhiteList[name];
-                               /* </ltIE9> */
-                       } else {
-                               this.setAttribute(name, '' + value);
-                               /* <ltIE9> */
-                               if (pollutesGetAttribute) attributeWhiteList[name] = true;
-                               /* </ltIE9> */
-                       }
-               }
-               return this;
-       },
-
-       setProperties: function(attributes){
-               for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
-               return this;
-       },
-
-       getProperty: function(name){
-               var getter = propertyGetters[name.toLowerCase()];
-               if (getter) return getter(this);
-               /* <ltIE9> */
-               if (pollutesGetAttribute){
-                       var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {});
-                       if (!attr) return null;
-                       if (attr.expando && !attributeWhiteList[name]){
-                               var outer = this.outerHTML;
-                               // segment by the opening tag and find mention of attribute name
-                               if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null;
-                               attributeWhiteList[name] = true;
-                       }
-               }
-               /* </ltIE9> */
-               var result = Slick.getAttribute(this, name);
-               return (!result && !Slick.hasAttribute(this, name)) ? null : result;
-       },
-
-       getProperties: function(){
-               var args = Array.from(arguments);
-               return args.map(this.getProperty, this).associate(args);
-       },
-
-       removeProperty: function(name){
-               return this.setProperty(name, null);
-       },
-
-       removeProperties: function(){
-               Array.each(arguments, this.removeProperty, this);
-               return this;
-       },
-
-       set: function(prop, value){
-               var property = Element.Properties[prop];
-               (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
-       }.overloadSetter(),
-
-       get: function(prop){
-               var property = Element.Properties[prop];
-               return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
-       }.overloadGetter(),
-
-       erase: function(prop){
-               var property = Element.Properties[prop];
-               (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
-               return this;
-       },
-
-       hasClass: function(className){
-               return this.className.clean().contains(className, ' ');
-       },
-
-       addClass: function(className){
-               if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
-               return this;
-       },
-
-       removeClass: function(className){
-               this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
-               return this;
-       },
-
-       toggleClass: function(className, force){
-               if (force == null) force = !this.hasClass(className);
-               return (force) ? this.addClass(className) : this.removeClass(className);
-       },
-
-       adopt: function(){
-               var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
-               if (length > 1) parent = fragment = document.createDocumentFragment();
-
-               for (var i = 0; i < length; i++){
-                       var element = document.id(elements[i], true);
-                       if (element) parent.appendChild(element);
-               }
-
-               if (fragment) this.appendChild(fragment);
-
-               return this;
-       },
-
-       appendText: function(text, where){
-               return this.grab(this.getDocument().newTextNode(text), where);
-       },
-
-       grab: function(el, where){
-               inserters[where || 'bottom'](document.id(el, true), this);
-               return this;
-       },
-
-       inject: function(el, where){
-               inserters[where || 'bottom'](this, document.id(el, true));
-               return this;
-       },
-
-       replaces: function(el){
-               el = document.id(el, true);
-               el.parentNode.replaceChild(this, el);
-               return this;
-       },
-
-       wraps: function(el, where){
-               el = document.id(el, true);
-               return this.replaces(el).grab(el, where);
-       },
-
-       getSelected: function(){
-               this.selectedIndex; // Safari 3.2.1
-               return new Elements(Array.from(this.options).filter(function(option){
-                       return option.selected;
-               }));
-       },
-
-       toQueryString: function(){
-               var queryString = [];
-               this.getElements('input, select, textarea').each(function(el){
-                       var type = el.type;
-                       if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
-
-                       var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
-                               // IE
-                               return document.id(opt).get('value');
-                       }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
-
-                       Array.from(value).each(function(val){
-                               if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
-                       });
-               });
-               return queryString.join('&');
-       }
-
-});
-
-var collected = {}, storage = {};
-
-var get = function(uid){
-       return (storage[uid] || (storage[uid] = {}));
-};
-
-var clean = function(item){
-       var uid = item.uniqueNumber;
-       if (item.removeEvents) item.removeEvents();
-       if (item.clearAttributes) item.clearAttributes();
-       if (uid != null){
-               delete collected[uid];
-               delete storage[uid];
-       }
-       return item;
-};
-
-var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
-
-Element.implement({
-
-       destroy: function(){
-               var children = clean(this).getElementsByTagName('*');
-               Array.each(children, clean);
-               Element.dispose(this);
-               return null;
-       },
-
-       empty: function(){
-               Array.from(this.childNodes).each(Element.dispose);
-               return this;
-       },
-
-       dispose: function(){
-               return (this.parentNode) ? this.parentNode.removeChild(this) : this;
-       },
-
-       clone: function(contents, keepid){
-               contents = contents !== false;
-               var clone = this.cloneNode(contents), ce = [clone], te = [this], i;
-
-               if (contents){
-                       ce.append(Array.from(clone.getElementsByTagName('*')));
-                       te.append(Array.from(this.getElementsByTagName('*')));
-               }
-
-               for (i = ce.length; i--;){
-                       var node = ce[i], element = te[i];
-                       if (!keepid) node.removeAttribute('id');
-                       /*<ltIE9>*/
-                       if (node.clearAttributes){
-                               node.clearAttributes();
-                               node.mergeAttributes(element);
-                               node.removeAttribute('uniqueNumber');
-                               if (node.options){
-                                       var no = node.options, eo = element.options;
-                                       for (var j = no.length; j--;) no[j].selected = eo[j].selected;
-                               }
-                       }
-                       /*</ltIE9>*/
-                       var prop = formProps[element.tagName.toLowerCase()];
-                       if (prop && element[prop]) node[prop] = element[prop];
-               }
-
-               /*<ltIE9>*/
-               if (Browser.ie){
-                       var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
-                       for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
-               }
-               /*</ltIE9>*/
-               return document.id(clone);
-       }
-
-});
-
-[Element, Window, Document].invoke('implement', {
-
-       addListener: function(type, fn){
-               if (type == 'unload'){
-                       var old = fn, self = this;
-                       fn = function(){
-                               self.removeListener('unload', fn);
-                               old();
-                       };
-               } else {
-                       collected[Slick.uidOf(this)] = this;
-               }
-               if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
-               else this.attachEvent('on' + type, fn);
-               return this;
-       },
-
-       removeListener: function(type, fn){
-               if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
-               else this.detachEvent('on' + type, fn);
-               return this;
-       },
-
-       retrieve: function(property, dflt){
-               var storage = get(Slick.uidOf(this)), prop = storage[property];
-               if (dflt != null && prop == null) prop = storage[property] = dflt;
-               return prop != null ? prop : null;
-       },
-
-       store: function(property, value){
-               var storage = get(Slick.uidOf(this));
-               storage[property] = value;
-               return this;
-       },
-
-       eliminate: function(property){
-               var storage = get(Slick.uidOf(this));
-               delete storage[property];
-               return this;
-       }
-
-});
-
-/*<ltIE9>*/
-if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){
-       Object.each(collected, clean);
-       if (window.CollectGarbage) CollectGarbage();
-});
-/*</ltIE9>*/
-
-Element.Properties = {};
-
-//<1.2compat>
-
-Element.Properties = new Hash;
-
-//</1.2compat>
-
-Element.Properties.style = {
-
-       set: function(style){
-               this.style.cssText = style;
-       },
-
-       get: function(){
-               return this.style.cssText;
-       },
-
-       erase: function(){
-               this.style.cssText = '';
-       }
-
-};
-
-Element.Properties.tag = {
-
-       get: function(){
-               return this.tagName.toLowerCase();
-       }
-
-};
-
-Element.Properties.html = {
-
-       set: function(html){
-               if (html == null) html = '';
-               else if (typeOf(html) == 'array') html = html.join('');
-               this.innerHTML = html;
-       },
-
-       erase: function(){
-               this.innerHTML = '';
-       }
-
-};
-
-/*<ltIE9>*/
-// technique by jdbarlett - http://jdbartlett.com/innershiv/
-var div = document.createElement('div');
-div.innerHTML = '<nav></nav>';
-var supportsHTML5Elements = (div.childNodes.length == 1);
-if (!supportsHTML5Elements){
-       var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '),
-               fragment = document.createDocumentFragment(), l = tags.length;
-       while (l--) fragment.createElement(tags[l]);
-}
-div = null;
-/*</ltIE9>*/
-
-/*<IE>*/
-var supportsTableInnerHTML = Function.attempt(function(){
-       var table = document.createElement('table');
-       table.innerHTML = '<tr><td></td></tr>';
-       return true;
-});
-
-/*<ltFF4>*/
-var tr = document.createElement('tr'), html = '<td></td>';
-tr.innerHTML = html;
-var supportsTRInnerHTML = (tr.innerHTML == html);
-tr = null;
-/*</ltFF4>*/
-
-if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){
-
-       Element.Properties.html.set = (function(set){
-
-               var translations = {
-                       table: [1, '<table>', '</table>'],
-                       select: [1, '<select>', '</select>'],
-                       tbody: [2, '<table><tbody>', '</tbody></table>'],
-                       tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
-               };
-
-               translations.thead = translations.tfoot = translations.tbody;
-
-               return function(html){
-                       var wrap = translations[this.get('tag')];
-                       if (!wrap && !supportsHTML5Elements) wrap = [0, '', ''];
-                       if (!wrap) return set.call(this, html);
-
-                       var level = wrap[0], wrapper = document.createElement('div'), target = wrapper;
-                       if (!supportsHTML5Elements) fragment.appendChild(wrapper);
-                       wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join('');
-                       while (level--) target = target.firstChild;
-                       this.empty().adopt(target.childNodes);
-                       if (!supportsHTML5Elements) fragment.removeChild(wrapper);
-                       wrapper = null;
-               };
-
-       })(Element.Properties.html.set);
-}
-/*</IE>*/
-
-/*<ltIE9>*/
-var testForm = document.createElement('form');
-testForm.innerHTML = '<select><option>s</option></select>';
-
-if (testForm.firstChild.value != 's') Element.Properties.value = {
-
-       set: function(value){
-               var tag = this.get('tag');
-               if (tag != 'select') return this.setProperty('value', value);
-               var options = this.getElements('option');
-               for (var i = 0; i < options.length; i++){
-                       var option = options[i],
-                               attr = option.getAttributeNode('value'),
-                               optionValue = (attr && attr.specified) ? option.value : option.get('text');
-                       if (optionValue == value) return option.selected = true;
-               }
-       },
-
-       get: function(){
-               var option = this, tag = option.get('tag');
-
-               if (tag != 'select' && tag != 'option') return this.getProperty('value');
-
-               if (tag == 'select' && !(option = option.getSelected()[0])) return '';
-
-               var attr = option.getAttributeNode('value');
-               return (attr && attr.specified) ? option.value : option.get('text');
-       }
-
-};
-testForm = null;
-/*</ltIE9>*/
-
-/*<IE>*/
-if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = {
-       set: function(id){
-               this.id = this.getAttributeNode('id').value = id;
-       },
-       get: function(){
-               return this.id || null;
-       },
-       erase: function(){
-               this.id = this.getAttributeNode('id').value = '';
-       }
-};
-/*</IE>*/
-
-})();
-
-
-// Begin: Source/Class/Class.js
-/*
----
-
-name: Class
-
-description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
-
-license: MIT-style license.
-
-requires: [Array, String, Function, Number]
-
-provides: Class
-
-...
-*/
-
-(function(){
-
-var Class = this.Class = new Type('Class', function(params){
-       if (instanceOf(params, Function)) params = {initialize: params};
-
-       var newClass = function(){
-               reset(this);
-               if (newClass.$prototyping) return this;
-               this.$caller = null;
-               var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
-               this.$caller = this.caller = null;
-               return value;
-       }.extend(this).implement(params);
-
-       newClass.$constructor = Class;
-       newClass.prototype.$constructor = newClass;
-       newClass.prototype.parent = parent;
-
-       return newClass;
-});
-
-var parent = function(){
-       if (!this.$caller) throw new Error('The method "parent" cannot be called.');
-       var name = this.$caller.$name,
-               parent = this.$caller.$owner.parent,
-               previous = (parent) ? parent.prototype[name] : null;
-       if (!previous) throw new Error('The method "' + name + '" has no parent.');
-       return previous.apply(this, arguments);
-};
-
-var reset = function(object){
-       for (var key in object){
-               var value = object[key];
-               switch (typeOf(value)){
-                       case 'object':
-                               var F = function(){};
-                               F.prototype = value;
-                               object[key] = reset(new F);
-                       break;
-                       case 'array': object[key] = value.clone(); break;
-               }
-       }
-       return object;
-};
-
-var wrap = function(self, key, method){
-       if (method.$origin) method = method.$origin;
-       var wrapper = function(){
-               if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
-               var caller = this.caller, current = this.$caller;
-               this.caller = current; this.$caller = wrapper;
-               var result = method.apply(this, arguments);
-               this.$caller = current; this.caller = caller;
-               return result;
-       }.extend({$owner: self, $origin: method, $name: key});
-       return wrapper;
-};
-
-var implement = function(key, value, retain){
-       if (Class.Mutators.hasOwnProperty(key)){
-               value = Class.Mutators[key].call(this, value);
-               if (value == null) return this;
-       }
-
-       if (typeOf(value) == 'function'){
-               if (value.$hidden) return this;
-               this.prototype[key] = (retain) ? value : wrap(this, key, value);
-       } else {
-               Object.merge(this.prototype, key, value);
-       }
-
-       return this;
-};
-
-var getInstance = function(klass){
-       klass.$prototyping = true;
-       var proto = new klass;
-       delete klass.$prototyping;
-       return proto;
-};
-
-Class.implement('implement', implement.overloadSetter());
-
-Class.Mutators = {
-
-       Extends: function(parent){
-               this.parent = parent;
-               this.prototype = getInstance(parent);
-       },
-
-       Implements: function(items){
-               Array.from(items).each(function(item){
-                       var instance = new item;
-                       for (var key in instance) implement.call(this, key, instance[key], true);
-               }, this);
-       }
-};
-
-})();
-
-
-// Begin: Source/Class/Class.Extras.js
-/*
----
-
-name: Class.Extras
-
-description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
-
-license: MIT-style license.
-
-requires: Class
-
-provides: [Class.Extras, Chain, Events, Options]
-
-...
-*/
-
-(function(){
-
-this.Chain = new Class({
-
-       $chain: [],
-
-       chain: function(){
-               this.$chain.append(Array.flatten(arguments));
-               return this;
-       },
-
-       callChain: function(){
-               return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
-       },
-
-       clearChain: function(){
-               this.$chain.empty();
-               return this;
-       }
-
-});
-
-var removeOn = function(string){
-       return string.replace(/^on([A-Z])/, function(full, first){
-               return first.toLowerCase();
-       });
-};
-
-this.Events = new Class({
-
-       $events: {},
-
-       addEvent: function(type, fn, internal){
-               type = removeOn(type);
-
-               /*<1.2compat>*/
-               if (fn == $empty) return this;
-               /*</1.2compat>*/
-
-               this.$events[type] = (this.$events[type] || []).include(fn);
-               if (internal) fn.internal = true;
-               return this;
-       },
-
-       addEvents: function(events){
-               for (var type in events) this.addEvent(type, events[type]);
-               return this;
-       },
-
-       fireEvent: function(type, args, delay){
-               type = removeOn(type);
-               var events = this.$events[type];
-               if (!events) return this;
-               args = Array.from(args);
-               events.each(function(fn){
-                       if (delay) fn.delay(delay, this, args);
-                       else fn.apply(this, args);
-               }, this);
-               return this;
-       },
-
-       removeEvent: function(type, fn){
-               type = removeOn(type);
-               var events = this.$events[type];
-               if (events && !fn.internal){
-                       var index =  events.indexOf(fn);
-                       if (index != -1) delete events[index];
-               }
-               return this;
-       },
-
-       removeEvents: function(events){
-               var type;
-               if (typeOf(events) == 'object'){
-                       for (type in events) this.removeEvent(type, events[type]);
-                       return this;
-               }
-               if (events) events = removeOn(events);
-               for (type in this.$events){
-                       if (events && events != type) continue;
-                       var fns = this.$events[type];
-                       for (var i = fns.length; i--;) if (i in fns){
-                               this.removeEvent(type, fns[i]);
-                       }
-               }
-               return this;
-       }
-
-});
-
-this.Options = new Class({
-
-       setOptions: function(){
-               var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
-               if (this.addEvent) for (var option in options){
-                       if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
-                       this.addEvent(option, options[option]);
-                       delete options[option];
-               }
-               return this;
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Request/Request.js
-/*
----
-
-name: Request
-
-description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
-
-license: MIT-style license.
-
-requires: [Object, Element, Chain, Events, Options, Browser]
-
-provides: Request
-
-...
-*/
-
-(function(){
-
-var empty = function(){},
-       progressSupport = ('onprogress' in new Browser.Request);
-
-var Request = this.Request = new Class({
-
-       Implements: [Chain, Events, Options],
-
-       options: {/*
-               onRequest: function(){},
-               onLoadstart: function(event, xhr){},
-               onProgress: function(event, xhr){},
-               onComplete: function(){},
-               onCancel: function(){},
-               onSuccess: function(responseText, responseXML){},
-               onFailure: function(xhr){},
-               onException: function(headerName, value){},
-               onTimeout: function(){},
-               user: '',
-               password: '',*/
-               url: '',
-               data: '',
-               headers: {
-                       'X-Requested-With': 'XMLHttpRequest',
-                       'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
-               },
-               async: true,
-               format: false,
-               method: 'post',
-               link: 'ignore',
-               isSuccess: null,
-               emulation: true,
-               urlEncoded: true,
-               encoding: 'utf-8',
-               evalScripts: false,
-               evalResponse: false,
-               timeout: 0,
-               noCache: false
-       },
-
-       initialize: function(options){
-               this.xhr = new Browser.Request();
-               this.setOptions(options);
-               this.headers = this.options.headers;
-       },
-
-       onStateChange: function(){
-               var xhr = this.xhr;
-               if (xhr.readyState != 4 || !this.running) return;
-               this.running = false;
-               this.status = 0;
-               Function.attempt(function(){
-                       var status = xhr.status;
-                       this.status = (status == 1223) ? 204 : status;
-               }.bind(this));
-               xhr.onreadystatechange = empty;
-               if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
-               clearTimeout(this.timer);
-
-               this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
-               if (this.options.isSuccess.call(this, this.status))
-                       this.success(this.response.text, this.response.xml);
-               else
-                       this.failure();
-       },
-
-       isSuccess: function(){
-               var status = this.status;
-               return (status >= 200 && status < 300);
-       },
-
-       isRunning: function(){
-               return !!this.running;
-       },
-
-       processScripts: function(text){
-               if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
-               return text.stripScripts(this.options.evalScripts);
-       },
-
-       success: function(text, xml){
-               this.onSuccess(this.processScripts(text), xml);
-       },
-
-       onSuccess: function(){
-               this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
-       },
-
-       failure: function(){
-               this.onFailure();
-       },
-
-       onFailure: function(){
-               this.fireEvent('complete').fireEvent('failure', this.xhr);
-       },
-
-       loadstart: function(event){
-               this.fireEvent('loadstart', [event, this.xhr]);
-       },
-
-       progress: function(event){
-               this.fireEvent('progress', [event, this.xhr]);
-       },
-
-       timeout: function(){
-               this.fireEvent('timeout', this.xhr);
-       },
-
-       setHeader: function(name, value){
-               this.headers[name] = value;
-               return this;
-       },
-
-       getHeader: function(name){
-               return Function.attempt(function(){
-                       return this.xhr.getResponseHeader(name);
-               }.bind(this));
-       },
-
-       check: function(){
-               if (!this.running) return true;
-               switch (this.options.link){
-                       case 'cancel': this.cancel(); return true;
-                       case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
-               }
-               return false;
-       },
-
-       send: function(options){
-               if (!this.check(options)) return this;
-
-               this.options.isSuccess = this.options.isSuccess || this.isSuccess;
-               this.running = true;
-
-               var type = typeOf(options);
-               if (type == 'string' || type == 'element') options = {data: options};
-
-               var old = this.options;
-               options = Object.append({data: old.data, url: old.url, method: old.method}, options);
-               var data = options.data, url = String(options.url), method = options.method.toLowerCase();
-
-               switch (typeOf(data)){
-                       case 'element': data = document.id(data).toQueryString(); break;
-                       case 'object': case 'hash': data = Object.toQueryString(data);
-               }
-
-               if (this.options.format){
-                       var format = 'format=' + this.options.format;
-                       data = (data) ? format + '&' + data : format;
-               }
-
-               if (this.options.emulation && !['get', 'post'].contains(method)){
-                       var _method = '_method=' + method;
-                       data = (data) ? _method + '&' + data : _method;
-                       method = 'post';
-               }
-
-               if (this.options.urlEncoded && ['post', 'put'].contains(method)){
-                       var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
-                       this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
-               }
-
-               if (!url) url = document.location.pathname;
-
-               var trimPosition = url.lastIndexOf('/');
-               if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
-
-               if (this.options.noCache)
-                       url += (url.contains('?') ? '&' : '?') + String.uniqueID();
-
-               if (data && method == 'get'){
-                       url += (url.contains('?') ? '&' : '?') + data;
-                       data = null;
-               }
-
-               var xhr = this.xhr;
-               if (progressSupport){
-                       xhr.onloadstart = this.loadstart.bind(this);
-                       xhr.onprogress = this.progress.bind(this);
-               }
-
-               xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
-               if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
-
-               xhr.onreadystatechange = this.onStateChange.bind(this);
-
-               Object.each(this.headers, function(value, key){
-                       try {
-                               xhr.setRequestHeader(key, value);
-                       } catch (e){
-                               this.fireEvent('exception', [key, value]);
-                       }
-               }, this);
-
-               this.fireEvent('request');
-               xhr.send(data);
-               if (!this.options.async) this.onStateChange();
-               else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
-               return this;
-       },
-
-       cancel: function(){
-               if (!this.running) return this;
-               this.running = false;
-               var xhr = this.xhr;
-               xhr.abort();
-               clearTimeout(this.timer);
-               xhr.onreadystatechange = empty;
-               if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
-               this.xhr = new Browser.Request();
-               this.fireEvent('cancel');
-               return this;
-       }
-
-});
-
-var methods = {};
-['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
-       methods[method] = function(data){
-               var object = {
-                       method: method
-               };
-               if (data != null) object.data = data;
-               return this.send(object);
-       };
-});
-
-Request.implement(methods);
-
-Element.Properties.send = {
-
-       set: function(options){
-               var send = this.get('send').cancel();
-               send.setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var send = this.retrieve('send');
-               if (!send){
-                       send = new Request({
-                               data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
-                       });
-                       this.store('send', send);
-               }
-               return send;
-       }
-
-};
-
-Element.implement({
-
-       send: function(url){
-               var sender = this.get('send');
-               sender.send({data: this, url: url || sender.options.url});
-               return this;
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Utilities/JSON.js
-/*
----
-
-name: JSON
-
-description: JSON encoder and decoder.
-
-license: MIT-style license.
-
-SeeAlso: <http://www.json.org/>
-
-requires: [Array, String, Number, Function]
-
-provides: JSON
-
-...
-*/
-
-if (typeof JSON == 'undefined') this.JSON = {};
-
-//<1.2compat>
-
-JSON = new Hash({
-       stringify: JSON.stringify,
-       parse: JSON.parse
-});
-
-//</1.2compat>
-
-(function(){
-
-var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
-
-var escape = function(chr){
-       return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
-};
-
-JSON.validate = function(string){
-       string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-                                       replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-                                       replace(/(?:^|:|,)(?:\s*\[)+/g, '');
-
-       return (/^[\],:{}\s]*$/).test(string);
-};
-
-JSON.encode = JSON.stringify ? function(obj){
-       return JSON.stringify(obj);
-} : function(obj){
-       if (obj && obj.toJSON) obj = obj.toJSON();
-
-       switch (typeOf(obj)){
-               case 'string':
-                       return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
-               case 'array':
-                       return '[' + obj.map(JSON.encode).clean() + ']';
-               case 'object': case 'hash':
-                       var string = [];
-                       Object.each(obj, function(value, key){
-                               var json = JSON.encode(value);
-                               if (json) string.push(JSON.encode(key) + ':' + json);
-                       });
-                       return '{' + string + '}';
-               case 'number': case 'boolean': return '' + obj;
-               case 'null': return 'null';
-       }
-
-       return null;
-};
-
-JSON.decode = function(string, secure){
-       if (!string || typeOf(string) != 'string') return null;
-
-       if (secure || JSON.secure){
-               if (JSON.parse) return JSON.parse(string);
-               if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
-       }
-
-       return eval('(' + string + ')');
-};
-
-})();
-
-
-// Begin: Source/Request/Request.JSON.js
-/*
----
-
-name: Request.JSON
-
-description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
-
-license: MIT-style license.
-
-requires: [Request, JSON]
-
-provides: Request.JSON
-
-...
-*/
-
-Request.JSON = new Class({
-
-       Extends: Request,
-
-       options: {
-               /*onError: function(text, error){},*/
-               secure: true
-       },
-
-       initialize: function(options){
-               this.parent(options);
-               Object.append(this.headers, {
-                       'Accept': 'application/json',
-                       'X-Request': 'JSON'
-               });
-       },
-
-       success: function(text){
-               var json;
-               try {
-                       json = this.response.json = JSON.decode(text, this.options.secure);
-               } catch (error){
-                       this.fireEvent('error', [text, error]);
-                       return;
-               }
-               if (json == null) this.onFailure();
-               else this.onSuccess(json, text);
-       }
-
-});
-
-
-// Begin: Source/Types/DOMEvent.js
-/*
----
-
-name: Event
-
-description: Contains the Event Type, to make the event object cross-browser.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, Function, String, Object]
-
-provides: Event
-
-...
-*/
-
-(function() {
-
-var _keys = {};
-
-var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){
-       if (!win) win = window;
-       event = event || win.event;
-       if (event.$extended) return event;
-       this.event = event;
-       this.$extended = true;
-       this.shift = event.shiftKey;
-       this.control = event.ctrlKey;
-       this.alt = event.altKey;
-       this.meta = event.metaKey;
-       var type = this.type = event.type;
-       var target = event.target || event.srcElement;
-       while (target && target.nodeType == 3) target = target.parentNode;
-       this.target = document.id(target);
-
-       if (type.indexOf('key') == 0){
-               var code = this.code = (event.which || event.keyCode);
-               this.key = _keys[code]/*<1.3compat>*/ || Object.keyOf(Event.Keys, code)/*</1.3compat>*/;
-               if (type == 'keydown'){
-                       if (code > 111 && code < 124) this.key = 'f' + (code - 111);
-                       else if (code > 95 && code < 106) this.key = code - 96;
-               }
-               if (this.key == null) this.key = String.fromCharCode(code).toLowerCase();
-       } else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){
-               var doc = win.document;
-               doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-               this.page = {
-                       x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
-                       y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
-               };
-               this.client = {
-                       x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
-                       y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
-               };
-               if (type == 'DOMMouseScroll' || type == 'mousewheel')
-                       this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
-
-               this.rightClick = (event.which == 3 || event.button == 2);
-               if (type == 'mouseover' || type == 'mouseout'){
-                       var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
-                       while (related && related.nodeType == 3) related = related.parentNode;
-                       this.relatedTarget = document.id(related);
-               }
-       } else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){
-               this.rotation = event.rotation;
-               this.scale = event.scale;
-               this.targetTouches = event.targetTouches;
-               this.changedTouches = event.changedTouches;
-               var touches = this.touches = event.touches;
-               if (touches && touches[0]){
-                       var touch = touches[0];
-                       this.page = {x: touch.pageX, y: touch.pageY};
-                       this.client = {x: touch.clientX, y: touch.clientY};
-               }
-       }
-
-       if (!this.client) this.client = {};
-       if (!this.page) this.page = {};
-});
-
-DOMEvent.implement({
-
-       stop: function(){
-               return this.preventDefault().stopPropagation();
-       },
-
-       stopPropagation: function(){
-               if (this.event.stopPropagation) this.event.stopPropagation();
-               else this.event.cancelBubble = true;
-               return this;
-       },
-
-       preventDefault: function(){
-               if (this.event.preventDefault) this.event.preventDefault();
-               else this.event.returnValue = false;
-               return this;
-       }
-
-});
-
-DOMEvent.defineKey = function(code, key){
-       _keys[code] = key;
-       return this;
-};
-
-DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);
-
-DOMEvent.defineKeys({
-       '38': 'up', '40': 'down', '37': 'left', '39': 'right',
-       '27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',
-       '46': 'delete', '13': 'enter'
-});
-
-})();
-
-/*<1.3compat>*/
-var Event = DOMEvent;
-Event.Keys = {};
-/*</1.3compat>*/
-
-/*<1.2compat>*/
-
-Event.Keys = new Hash(Event.Keys);
-
-/*</1.2compat>*/
-
-
-// Begin: Source/Element/Element.Event.js
-/*
----
-
-name: Element.Event
-
-description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary.
-
-license: MIT-style license.
-
-requires: [Element, Event]
-
-provides: Element.Event
-
-...
-*/
-
-(function(){
-
-Element.Properties.events = {set: function(events){
-       this.addEvents(events);
-}};
-
-[Element, Window, Document].invoke('implement', {
-
-       addEvent: function(type, fn){
-               var events = this.retrieve('events', {});
-               if (!events[type]) events[type] = {keys: [], values: []};
-               if (events[type].keys.contains(fn)) return this;
-               events[type].keys.push(fn);
-               var realType = type,
-                       custom = Element.Events[type],
-                       condition = fn,
-                       self = this;
-               if (custom){
-                       if (custom.onAdd) custom.onAdd.call(this, fn, type);
-                       if (custom.condition){
-                               condition = function(event){
-                                       if (custom.condition.call(this, event, type)) return fn.call(this, event);
-                                       return true;
-                               };
-                       }
-                       if (custom.base) realType = Function.from(custom.base).call(this, type);
-               }
-               var defn = function(){
-                       return fn.call(self);
-               };
-               var nativeEvent = Element.NativeEvents[realType];
-               if (nativeEvent){
-                       if (nativeEvent == 2){
-                               defn = function(event){
-                                       event = new DOMEvent(event, self.getWindow());
-                                       if (condition.call(self, event) === false) event.stop();
-                               };
-                       }
-                       this.addListener(realType, defn, arguments[2]);
-               }
-               events[type].values.push(defn);
-               return this;
-       },
-
-       removeEvent: function(type, fn){
-               var events = this.retrieve('events');
-               if (!events || !events[type]) return this;
-               var list = events[type];
-               var index = list.keys.indexOf(fn);
-               if (index == -1) return this;
-               var value = list.values[index];
-               delete list.keys[index];
-               delete list.values[index];
-               var custom = Element.Events[type];
-               if (custom){
-                       if (custom.onRemove) custom.onRemove.call(this, fn, type);
-                       if (custom.base) type = Function.from(custom.base).call(this, type);
-               }
-               return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
-       },
-
-       addEvents: function(events){
-               for (var event in events) this.addEvent(event, events[event]);
-               return this;
-       },
-
-       removeEvents: function(events){
-               var type;
-               if (typeOf(events) == 'object'){
-                       for (type in events) this.removeEvent(type, events[type]);
-                       return this;
-               }
-               var attached = this.retrieve('events');
-               if (!attached) return this;
-               if (!events){
-                       for (type in attached) this.removeEvents(type);
-                       this.eliminate('events');
-               } else if (attached[events]){
-                       attached[events].keys.each(function(fn){
-                               this.removeEvent(events, fn);
-                       }, this);
-                       delete attached[events];
-               }
-               return this;
-       },
-
-       fireEvent: function(type, args, delay){
-               var events = this.retrieve('events');
-               if (!events || !events[type]) return this;
-               args = Array.from(args);
-
-               events[type].keys.each(function(fn){
-                       if (delay) fn.delay(delay, this, args);
-                       else fn.apply(this, args);
-               }, this);
-               return this;
-       },
-
-       cloneEvents: function(from, type){
-               from = document.id(from);
-               var events = from.retrieve('events');
-               if (!events) return this;
-               if (!type){
-                       for (var eventType in events) this.cloneEvents(from, eventType);
-               } else if (events[type]){
-                       events[type].keys.each(function(fn){
-                               this.addEvent(type, fn);
-                       }, this);
-               }
-               return this;
-       }
-
-});
-
-Element.NativeEvents = {
-       click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
-       mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
-       mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
-       keydown: 2, keypress: 2, keyup: 2, //keyboard
-       orientationchange: 2, // mobile
-       touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
-       gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
-       focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements
-       load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
-       error: 1, abort: 1, scroll: 1 //misc
-};
-
-Element.Events = {mousewheel: {
-       base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'
-}};
-
-if ('onmouseenter' in document.documentElement){
-       Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;
-} else {
-       var check = function(event){
-               var related = event.relatedTarget;
-               if (related == null) return true;
-               if (!related) return false;
-               return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
-       };
-
-       Element.Events.mouseenter = {
-               base: 'mouseover',
-               condition: check
-       };
-
-       Element.Events.mouseleave = {
-               base: 'mouseout',
-               condition: check
-       };
-}
-
-/*<ltIE9>*/
-if (!window.addEventListener){
-       Element.NativeEvents.propertychange = 2;
-       Element.Events.change = {
-               base: function(){
-                       var type = this.type;
-                       return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'
-               },
-               condition: function(event){
-                       return this.type != 'radio' || (event.event.propertyName == 'checked' && this.checked);
-               }
-       }
-}
-/*</ltIE9>*/
-
-//<1.2compat>
-
-Element.Events = new Hash(Element.Events);
-
-//</1.2compat>
-
-})();
-
-
-// Begin: Source/Element/Element.Delegation.js
-/*
----
-
-name: Element.Delegation
-
-description: Extends the Element native object to include the delegate method for more efficient event management.
-
-license: MIT-style license.
-
-requires: [Element.Event]
-
-provides: [Element.Delegation]
-
-...
-*/
-
-(function(){
-
-var eventListenerSupport = !!window.addEventListener;
-
-Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2;
-
-var bubbleUp = function(self, match, fn, event, target){
-       while (target && target != self){
-               if (match(target, event)) return fn.call(target, event, target);
-               target = document.id(target.parentNode);
-       }
-};
-
-var map = {
-       mouseenter: {
-               base: 'mouseover'
-       },
-       mouseleave: {
-               base: 'mouseout'
-       },
-       focus: {
-               base: 'focus' + (eventListenerSupport ? '' : 'in'),
-               capture: true
-       },
-       blur: {
-               base: eventListenerSupport ? 'blur' : 'focusout',
-               capture: true
-       }
-};
-
-/*<ltIE9>*/
-var _key = '$delegation:';
-var formObserver = function(type){
-
-       return {
-
-               base: 'focusin',
-
-               remove: function(self, uid){
-                       var list = self.retrieve(_key + type + 'listeners', {})[uid];
-                       if (list && list.forms) for (var i = list.forms.length; i--;){
-                               list.forms[i].removeEvent(type, list.fns[i]);
-                       }
-               },
-
-               listen: function(self, match, fn, event, target, uid){
-                       var form = (target.get('tag') == 'form') ? target : event.target.getParent('form');
-                       if (!form) return;
-
-                       var listeners = self.retrieve(_key + type + 'listeners', {}),
-                               listener = listeners[uid] || {forms: [], fns: []},
-                               forms = listener.forms, fns = listener.fns;
-
-                       if (forms.indexOf(form) != -1) return;
-                       forms.push(form);
-
-                       var _fn = function(event){
-                               bubbleUp(self, match, fn, event, target);
-                       };
-                       form.addEvent(type, _fn);
-                       fns.push(_fn);
-
-                       listeners[uid] = listener;
-                       self.store(_key + type + 'listeners', listeners);
-               }
-       };
-};
-
-var inputObserver = function(type){
-       return {
-               base: 'focusin',
-               listen: function(self, match, fn, event, target){
-                       var events = {blur: function(){
-                               this.removeEvents(events);
-                       }};
-                       events[type] = function(event){
-                               bubbleUp(self, match, fn, event, target);
-                       };
-                       event.target.addEvents(events);
-               }
-       };
-};
-
-if (!eventListenerSupport) Object.append(map, {
-       submit: formObserver('submit'),
-       reset: formObserver('reset'),
-       change: inputObserver('change'),
-       select: inputObserver('select')
-});
-/*</ltIE9>*/
-
-var proto = Element.prototype,
-       addEvent = proto.addEvent,
-       removeEvent = proto.removeEvent;
-
-var relay = function(old, method){
-       return function(type, fn, useCapture){
-               if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture);
-               var parsed = Slick.parse(type).expressions[0][0];
-               if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture);
-               var newType = parsed.tag;
-               parsed.pseudos.slice(1).each(function(pseudo){
-                       newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : '');
-               });
-               old.call(this, type, fn);
-               return method.call(this, newType, parsed.pseudos[0].value, fn);
-       };
-};
-
-var delegation = {
-
-       addEvent: function(type, match, fn){
-               var storage = this.retrieve('$delegates', {}), stored = storage[type];
-               if (stored) for (var _uid in stored){
-                       if (stored[_uid].fn == fn && stored[_uid].match == match) return this;
-               }
-
-               var _type = type, _match = match, _fn = fn, _map = map[type] || {};
-               type = _map.base || _type;
-
-               match = function(target){
-                       return Slick.match(target, _match);
-               };
-
-               var elementEvent = Element.Events[_type];
-               if (elementEvent && elementEvent.condition){
-                       var __match = match, condition = elementEvent.condition;
-                       match = function(target, event){
-                               return __match(target, event) && condition.call(target, event, type);
-                       };
-               }
-
-               var self = this, uid = String.uniqueID();
-               var delegator = _map.listen ? function(event, target){
-                       if (!target && event && event.target) target = event.target;
-                       if (target) _map.listen(self, match, fn, event, target, uid);
-               } : function(event, target){
-                       if (!target && event && event.target) target = event.target;
-                       if (target) bubbleUp(self, match, fn, event, target);
-               };
-
-               if (!stored) stored = {};
-               stored[uid] = {
-                       match: _match,
-                       fn: _fn,
-                       delegator: delegator
-               };
-               storage[_type] = stored;
-               return addEvent.call(this, type, delegator, _map.capture);
-       },
-
-       removeEvent: function(type, match, fn, _uid){
-               var storage = this.retrieve('$delegates', {}), stored = storage[type];
-               if (!stored) return this;
-
-               if (_uid){
-                       var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};
-                       type = _map.base || _type;
-                       if (_map.remove) _map.remove(this, _uid);
-                       delete stored[_uid];
-                       storage[_type] = stored;
-                       return removeEvent.call(this, type, delegator);
-               }
-
-               var __uid, s;
-               if (fn) for (__uid in stored){
-                       s = stored[__uid];
-                       if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);
-               } else for (__uid in stored){
-                       s = stored[__uid];
-                       if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid);
-               }
-               return this;
-       }
-
-};
-
-[Element, Window, Document].invoke('implement', {
-       addEvent: relay(addEvent, delegation.addEvent),
-       removeEvent: relay(removeEvent, delegation.removeEvent)
-});
-
-})();
-
-
-// Begin: Source/Fx/Fx.js
-/*
----
-
-name: Fx
-
-description: Contains the basic animation logic to be extended by all other Fx Classes.
-
-license: MIT-style license.
-
-requires: [Chain, Events, Options]
-
-provides: Fx
-
-...
-*/
-
-(function(){
-
-var Fx = this.Fx = new Class({
-
-       Implements: [Chain, Events, Options],
-
-       options: {
-               /*
-               onStart: nil,
-               onCancel: nil,
-               onComplete: nil,
-               */
-               fps: 60,
-               unit: false,
-               duration: 500,
-               frames: null,
-               frameSkip: true,
-               link: 'ignore'
-       },
-
-       initialize: function(options){
-               this.subject = this.subject || this;
-               this.setOptions(options);
-       },
-
-       getTransition: function(){
-               return function(p){
-                       return -(Math.cos(Math.PI * p) - 1) / 2;
-               };
-       },
-
-       step: function(now){
-               if (this.options.frameSkip){
-                       var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
-                       this.time = now;
-                       this.frame += frames;
-               } else {
-                       this.frame++;
-               }
-
-               if (this.frame < this.frames){
-                       var delta = this.transition(this.frame / this.frames);
-                       this.set(this.compute(this.from, this.to, delta));
-               } else {
-                       this.frame = this.frames;
-                       this.set(this.compute(this.from, this.to, 1));
-                       this.stop();
-               }
-       },
-
-       set: function(now){
-               return now;
-       },
-
-       compute: function(from, to, delta){
-               return Fx.compute(from, to, delta);
-       },
-
-       check: function(){
-               if (!this.isRunning()) return true;
-               switch (this.options.link){
-                       case 'cancel': this.cancel(); return true;
-                       case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
-               }
-               return false;
-       },
-
-       start: function(from, to){
-               if (!this.check(from, to)) return this;
-               this.from = from;
-               this.to = to;
-               this.frame = (this.options.frameSkip) ? 0 : -1;
-               this.time = null;
-               this.transition = this.getTransition();
-               var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
-               this.duration = Fx.Durations[duration] || duration.toInt();
-               this.frameInterval = 1000 / fps;
-               this.frames = frames || Math.round(this.duration / this.frameInterval);
-               this.fireEvent('start', this.subject);
-               pushInstance.call(this, fps);
-               return this;
-       },
-
-       stop: function(){
-               if (this.isRunning()){
-                       this.time = null;
-                       pullInstance.call(this, this.options.fps);
-                       if (this.frames == this.frame){
-                               this.fireEvent('complete', this.subject);
-                               if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
-                       } else {
-                               this.fireEvent('stop', this.subject);
-                       }
-               }
-               return this;
-       },
-
-       cancel: function(){
-               if (this.isRunning()){
-                       this.time = null;
-                       pullInstance.call(this, this.options.fps);
-                       this.frame = this.frames;
-                       this.fireEvent('cancel', this.subject).clearChain();
-               }
-               return this;
-       },
-
-       pause: function(){
-               if (this.isRunning()){
-                       this.time = null;
-                       pullInstance.call(this, this.options.fps);
-               }
-               return this;
-       },
-
-       resume: function(){
-               if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);
-               return this;
-       },
-
-       isRunning: function(){
-               var list = instances[this.options.fps];
-               return list && list.contains(this);
-       }
-
-});
-
-Fx.compute = function(from, to, delta){
-       return (to - from) * delta + from;
-};
-
-Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
-
-// global timers
-
-var instances = {}, timers = {};
-
-var loop = function(){
-       var now = Date.now();
-       for (var i = this.length; i--;){
-               var instance = this[i];
-               if (instance) instance.step(now);
-       }
-};
-
-var pushInstance = function(fps){
-       var list = instances[fps] || (instances[fps] = []);
-       list.push(this);
-       if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
-};
-
-var pullInstance = function(fps){
-       var list = instances[fps];
-       if (list){
-               list.erase(this);
-               if (!list.length && timers[fps]){
-                       delete instances[fps];
-                       timers[fps] = clearInterval(timers[fps]);
-               }
-       }
-};
-
-})();
-
-
-// Begin: Source/Element/Element.Style.js
-/*
----
-
-name: Element.Style
-
-description: Contains methods for interacting with the styles of Elements in a fashionable way.
-
-license: MIT-style license.
-
-requires: Element
-
-provides: Element.Style
-
-...
-*/
-
-(function(){
-
-var html = document.html;
-
-//<ltIE9>
-// Check for oldIE, which does not remove styles when they're set to null
-var el = document.createElement('div');
-el.style.color = 'red';
-el.style.color = null;
-var doesNotRemoveStyles = el.style.color == 'red';
-el = null;
-//</ltIE9>
-
-Element.Properties.styles = {set: function(styles){
-       this.setStyles(styles);
-}};
-
-var hasOpacity = (html.style.opacity != null),
-       hasFilter = (html.style.filter != null),
-       reAlpha = /alpha\(opacity=([\d.]+)\)/i;
-
-var setVisibility = function(element, opacity){
-       element.store('$opacity', opacity);
-       element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden';
-};
-
-var setOpacity = (hasOpacity ? function(element, opacity){
-       element.style.opacity = opacity;
-} : (hasFilter ? function(element, opacity){
-       var style = element.style;
-       if (!element.currentStyle || !element.currentStyle.hasLayout) style.zoom = 1;
-       if (opacity == null || opacity == 1) opacity = '';
-       else opacity = 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')';
-       var filter = style.filter || element.getComputedStyle('filter') || '';
-       style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;
-       if (!style.filter) style.removeAttribute('filter');
-} : setVisibility));
-
-var getOpacity = (hasOpacity ? function(element){
-       var opacity = element.style.opacity || element.getComputedStyle('opacity');
-       return (opacity == '') ? 1 : opacity.toFloat();
-} : (hasFilter ? function(element){
-       var filter = (element.style.filter || element.getComputedStyle('filter')),
-               opacity;
-       if (filter) opacity = filter.match(reAlpha);
-       return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
-} : function(element){
-       var opacity = element.retrieve('$opacity');
-       if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1);
-       return opacity;
-}));
-
-var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';
-
-Element.implement({
-
-       getComputedStyle: function(property){
-               if (this.currentStyle) return this.currentStyle[property.camelCase()];
-               var defaultView = Element.getDocument(this).defaultView,
-                       computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
-               return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;
-       },
-
-       setStyle: function(property, value){
-               if (property == 'opacity'){
-                       if (value != null) value = parseFloat(value);
-                       setOpacity(this, value);
-                       return this;
-               }
-               property = (property == 'float' ? floatName : property).camelCase();
-               if (typeOf(value) != 'string'){
-                       var map = (Element.Styles[property] || '@').split(' ');
-                       value = Array.from(value).map(function(val, i){
-                               if (!map[i]) return '';
-                               return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
-                       }).join(' ');
-               } else if (value == String(Number(value))){
-                       value = Math.round(value);
-               }
-               this.style[property] = value;
-               //<ltIE9>
-               if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){
-                       this.style.removeAttribute(property);
-               }
-               //</ltIE9>
-               return this;
-       },
-
-       getStyle: function(property){
-               if (property == 'opacity') return getOpacity(this);
-               property = (property == 'float' ? floatName : property).camelCase();
-               var result = this.style[property];
-               if (!result || property == 'zIndex'){
-                       result = [];
-                       for (var style in Element.ShortStyles){
-                               if (property != style) continue;
-                               for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
-                               return result.join(' ');
-                       }
-                       result = this.getComputedStyle(property);
-               }
-               if (result){
-                       result = String(result);
-                       var color = result.match(/rgba?\([\d\s,]+\)/);
-                       if (color) result = result.replace(color[0], color[0].rgbToHex());
-               }
-               if (Browser.opera || Browser.ie){
-                       if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){
-                               var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
-                               values.each(function(value){
-                                       size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
-                               }, this);
-                               return this['offset' + property.capitalize()] - size + 'px';
-                       }
-                       if (Browser.ie && (/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){
-                               return '0px';
-                       }
-               }
-               return result;
-       },
-
-       setStyles: function(styles){
-               for (var style in styles) this.setStyle(style, styles[style]);
-               return this;
-       },
-
-       getStyles: function(){
-               var result = {};
-               Array.flatten(arguments).each(function(key){
-                       result[key] = this.getStyle(key);
-               }, this);
-               return result;
-       }
-
-});
-
-Element.Styles = {
-       left: '@px', top: '@px', bottom: '@px', right: '@px',
-       width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
-       backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
-       fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
-       margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
-       borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
-       zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
-};
-
-//<1.3compat>
-
-Element.implement({
-
-       setOpacity: function(value){
-               setOpacity(this, value);
-               return this;
-       },
-
-       getOpacity: function(){
-               return getOpacity(this);
-       }
-
-});
-
-Element.Properties.opacity = {
-
-       set: function(opacity){
-               setOpacity(this, opacity);
-               setVisibility(this, opacity);
-       },
-
-       get: function(){
-               return getOpacity(this);
-       }
-
-};
-
-//</1.3compat>
-
-//<1.2compat>
-
-Element.Styles = new Hash(Element.Styles);
-
-//</1.2compat>
-
-Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
-
-['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
-       var Short = Element.ShortStyles;
-       var All = Element.Styles;
-       ['margin', 'padding'].each(function(style){
-               var sd = style + direction;
-               Short[style][sd] = All[sd] = '@px';
-       });
-       var bd = 'border' + direction;
-       Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
-       var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
-       Short[bd] = {};
-       Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
-       Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
-       Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
-});
-
-})();
-
-
-// Begin: Source/Fx/Fx.CSS.js
-/*
----
-
-name: Fx.CSS
-
-description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
-
-license: MIT-style license.
-
-requires: [Fx, Element.Style]
-
-provides: Fx.CSS
-
-...
-*/
-
-Fx.CSS = new Class({
-
-       Extends: Fx,
-
-       //prepares the base from/to object
-
-       prepare: function(element, property, values){
-               values = Array.from(values);
-               var from = values[0], to = values[1];
-               if (to == null){
-                       to = from;
-                       from = element.getStyle(property);
-                       var unit = this.options.unit;
-                       // adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299
-                       if (unit && from.slice(-unit.length) != unit && parseFloat(from) != 0){
-                               element.setStyle(property, to + unit);
-                               var value = element.getComputedStyle(property);
-                               // IE and Opera support pixelLeft or pixelWidth
-                               if (!(/px$/.test(value))){
-                                       value = element.style[('pixel-' + property).camelCase()];
-                                       if (value == null){
-                                               // adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-                                               var left = element.style.left;
-                                               element.style.left = to + unit;
-                                               value = element.style.pixelLeft;
-                                               element.style.left = left;
-                                       }
-                               }
-                               from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);
-                               element.setStyle(property, from + unit);
-                       }
-               }
-               return {from: this.parse(from), to: this.parse(to)};
-       },
-
-       //parses a value into an array
-
-       parse: function(value){
-               value = Function.from(value)();
-               value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
-               return value.map(function(val){
-                       val = String(val);
-                       var found = false;
-                       Object.each(Fx.CSS.Parsers, function(parser, key){
-                               if (found) return;
-                               var parsed = parser.parse(val);
-                               if (parsed || parsed === 0) found = {value: parsed, parser: parser};
-                       });
-                       found = found || {value: val, parser: Fx.CSS.Parsers.String};
-                       return found;
-               });
-       },
-
-       //computes by a from and to prepared objects, using their parsers.
-
-       compute: function(from, to, delta){
-               var computed = [];
-               (Math.min(from.length, to.length)).times(function(i){
-                       computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
-               });
-               computed.$family = Function.from('fx:css:value');
-               return computed;
-       },
-
-       //serves the value as settable
-
-       serve: function(value, unit){
-               if (typeOf(value) != 'fx:css:value') value = this.parse(value);
-               var returned = [];
-               value.each(function(bit){
-                       returned = returned.concat(bit.parser.serve(bit.value, unit));
-               });
-               return returned;
-       },
-
-       //renders the change to an element
-
-       render: function(element, property, value, unit){
-               element.setStyle(property, this.serve(value, unit));
-       },
-
-       //searches inside the page css to find the values for a selector
-
-       search: function(selector){
-               if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
-               var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
-               Array.each(document.styleSheets, function(sheet, j){
-                       var href = sheet.href;
-                       if (href && href.contains('://') && !href.contains(document.domain)) return;
-                       var rules = sheet.rules || sheet.cssRules;
-                       Array.each(rules, function(rule, i){
-                               if (!rule.style) return;
-                               var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
-                                       return m.toLowerCase();
-                               }) : null;
-                               if (!selectorText || !selectorTest.test(selectorText)) return;
-                               Object.each(Element.Styles, function(value, style){
-                                       if (!rule.style[style] || Element.ShortStyles[style]) return;
-                                       value = String(rule.style[style]);
-                                       to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
-                               });
-                       });
-               });
-               return Fx.CSS.Cache[selector] = to;
-       }
-
-});
-
-Fx.CSS.Cache = {};
-
-Fx.CSS.Parsers = {
-
-       Color: {
-               parse: function(value){
-                       if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
-                       return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
-               },
-               compute: function(from, to, delta){
-                       return from.map(function(value, i){
-                               return Math.round(Fx.compute(from[i], to[i], delta));
-                       });
-               },
-               serve: function(value){
-                       return value.map(Number);
-               }
-       },
-
-       Number: {
-               parse: parseFloat,
-               compute: Fx.compute,
-               serve: function(value, unit){
-                       return (unit) ? value + unit : value;
-               }
-       },
-
-       String: {
-               parse: Function.from(false),
-               compute: function(zero, one){
-                       return one;
-               },
-               serve: function(zero){
-                       return zero;
-               }
-       }
-
-};
-
-//<1.2compat>
-
-Fx.CSS.Parsers = new Hash(Fx.CSS.Parsers);
-
-//</1.2compat>
-
-
-// Begin: Source/Fx/Fx.Morph.js
-/*
----
-
-name: Fx.Morph
-
-description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: Fx.Morph
-
-...
-*/
-
-Fx.Morph = new Class({
-
-       Extends: Fx.CSS,
-
-       initialize: function(element, options){
-               this.element = this.subject = document.id(element);
-               this.parent(options);
-       },
-
-       set: function(now){
-               if (typeof now == 'string') now = this.search(now);
-               for (var p in now) this.render(this.element, p, now[p], this.options.unit);
-               return this;
-       },
-
-       compute: function(from, to, delta){
-               var now = {};
-               for (var p in from) now[p] = this.parent(from[p], to[p], delta);
-               return now;
-       },
-
-       start: function(properties){
-               if (!this.check(properties)) return this;
-               if (typeof properties == 'string') properties = this.search(properties);
-               var from = {}, to = {};
-               for (var p in properties){
-                       var parsed = this.prepare(this.element, p, properties[p]);
-                       from[p] = parsed.from;
-                       to[p] = parsed.to;
-               }
-               return this.parent(from, to);
-       }
-
-});
-
-Element.Properties.morph = {
-
-       set: function(options){
-               this.get('morph').cancel().setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var morph = this.retrieve('morph');
-               if (!morph){
-                       morph = new Fx.Morph(this, {link: 'cancel'});
-                       this.store('morph', morph);
-               }
-               return morph;
-       }
-
-};
-
-Element.implement({
-
-       morph: function(props){
-               this.get('morph').start(props);
-               return this;
-       }
-
-});
-
-
-// Begin: Source/Utilities/Swiff.js
-/*
----
-
-name: Swiff
-
-description: Wrapper for embedding SWF movies. Supports External Interface Communication.
-
-license: MIT-style license.
-
-credits:
-  - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
-
-requires: [Options, Object, Element]
-
-provides: Swiff
-
-...
-*/
-
-(function(){
-
-var Swiff = this.Swiff = new Class({
-
-       Implements: Options,
-
-       options: {
-               id: null,
-               height: 1,
-               width: 1,
-               container: null,
-               properties: {},
-               params: {
-                       quality: 'high',
-                       allowScriptAccess: 'always',
-                       wMode: 'window',
-                       swLiveConnect: true
-               },
-               callBacks: {},
-               vars: {}
-       },
-
-       toElement: function(){
-               return this.object;
-       },
-
-       initialize: function(path, options){
-               this.instance = 'Swiff_' + String.uniqueID();
-
-               this.setOptions(options);
-               options = this.options;
-               var id = this.id = options.id || this.instance;
-               var container = document.id(options.container);
-
-               Swiff.CallBacks[this.instance] = {};
-
-               var params = options.params, vars = options.vars, callBacks = options.callBacks;
-               var properties = Object.append({height: options.height, width: options.width}, options.properties);
-
-               var self = this;
-
-               for (var callBack in callBacks){
-                       Swiff.CallBacks[this.instance][callBack] = (function(option){
-                               return function(){
-                                       return option.apply(self.object, arguments);
-                               };
-                       })(callBacks[callBack]);
-                       vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
-               }
-
-               params.flashVars = Object.toQueryString(vars);
-               if (Browser.ie){
-                       properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
-                       params.movie = path;
-               } else {
-                       properties.type = 'application/x-shockwave-flash';
-               }
-               properties.data = path;
-
-               var build = '<object id="' + id + '"';
-               for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
-               build += '>';
-               for (var param in params){
-                       if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
-               }
-               build += '</object>';
-               this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
-       },
-
-       replaces: function(element){
-               element = document.id(element, true);
-               element.parentNode.replaceChild(this.toElement(), element);
-               return this;
-       },
-
-       inject: function(element){
-               document.id(element, true).appendChild(this.toElement());
-               return this;
-       },
-
-       remote: function(){
-               return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
-       }
-
-});
-
-Swiff.CallBacks = {};
-
-Swiff.remote = function(obj, fn){
-       var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
-       return eval(rs);
-};
-
-})();
-
-
-// Begin: Source/Fx/Fx.Transitions.js
-/*
----
-
-name: Fx.Transitions
-
-description: Contains a set of advanced transitions to be used with any of the Fx Classes.
-
-license: MIT-style license.
-
-credits:
-  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
-
-requires: Fx
-
-provides: Fx.Transitions
-
-...
-*/
-
-Fx.implement({
-
-       getTransition: function(){
-               var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
-               if (typeof trans == 'string'){
-                       var data = trans.split(':');
-                       trans = Fx.Transitions;
-                       trans = trans[data[0]] || trans[data[0].capitalize()];
-                       if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
-               }
-               return trans;
-       }
-
-});
-
-Fx.Transition = function(transition, params){
-       params = Array.from(params);
-       var easeIn = function(pos){
-               return transition(pos, params);
-       };
-       return Object.append(easeIn, {
-               easeIn: easeIn,
-               easeOut: function(pos){
-                       return 1 - transition(1 - pos, params);
-               },
-               easeInOut: function(pos){
-                       return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
-               }
-       });
-};
-
-Fx.Transitions = {
-
-       linear: function(zero){
-               return zero;
-       }
-
-};
-
-//<1.2compat>
-
-Fx.Transitions = new Hash(Fx.Transitions);
-
-//</1.2compat>
-
-Fx.Transitions.extend = function(transitions){
-       for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
-};
-
-Fx.Transitions.extend({
-
-       Pow: function(p, x){
-               return Math.pow(p, x && x[0] || 6);
-       },
-
-       Expo: function(p){
-               return Math.pow(2, 8 * (p - 1));
-       },
-
-       Circ: function(p){
-               return 1 - Math.sin(Math.acos(p));
-       },
-
-       Sine: function(p){
-               return 1 - Math.cos(p * Math.PI / 2);
-       },
-
-       Back: function(p, x){
-               x = x && x[0] || 1.618;
-               return Math.pow(p, 2) * ((x + 1) * p - x);
-       },
-
-       Bounce: function(p){
-               var value;
-               for (var a = 0, b = 1; 1; a += b, b /= 2){
-                       if (p >= (7 - 4 * a) / 11){
-                               value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
-                               break;
-                       }
-               }
-               return value;
-       },
-
-       Elastic: function(p, x){
-               return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
-       }
-
-});
-
-['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
-       Fx.Transitions[transition] = new Fx.Transition(function(p){
-               return Math.pow(p, i + 2);
-       });
-});
-
-
-// Begin: Source/More/More.js
-/*
----
-
-script: More.js
-
-name: More
-
-description: MooTools More
-
-license: MIT-style license
-
-authors:
-  - Guillermo Rauch
-  - Thomas Aylott
-  - Scott Kyle
-  - Arian Stolwijk
-  - Tim Wienk
-  - Christoph Pojer
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/MooTools
-
-provides: [MooTools.More]
-
-...
-*/
-
-MooTools.More = {
-       version: '1.4.3.1dev',
-       build: '%build%'
-};
-
-
-// Begin: Source/Class/Class.Binds.js
-/*
----
-
-script: Class.Binds.js
-
-name: Class.Binds
-
-description: Automagically binds specified methods in a class to the instance of the class.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - /MooTools.More
-
-provides: [Class.Binds]
-
-...
-*/
-
-Class.Mutators.Binds = function(binds){
-       if (!this.prototype.initialize) this.implement('initialize', function(){});
-       return Array.from(binds).concat(this.prototype.Binds || []);
-};
-
-Class.Mutators.initialize = function(initialize){
-       return function(){
-               Array.from(this.Binds).each(function(name){
-                       var original = this[name];
-                       if (original) this[name] = original.bind(this);
-               }, this);
-               return initialize.apply(this, arguments);
-       };
-};
-
-
-// Begin: Source/Class/Class.Occlude.js
-/*
----
-
-script: Class.Occlude.js
-
-name: Class.Occlude
-
-description: Prevents a class from being applied to a DOM element twice.
-
-license: MIT-style license.
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - Core/Element
-  - /MooTools.More
-
-provides: [Class.Occlude]
-
-...
-*/
-
-Class.Occlude = new Class({
-
-       occlude: function(property, element){
-               element = document.id(element || this.element);
-               var instance = element.retrieve(property || this.property);
-               if (instance && !this.occluded)
-                       return (this.occluded = instance);
-
-               this.occluded = false;
-               element.store(property || this.property, this);
-               return this.occluded;
-       }
-
-});
-
-
-// Begin: Source/Element/Element.Dimensions.js
-/*
----
-
-name: Element.Dimensions
-
-description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
-
-license: MIT-style license.
-
-credits:
-  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
-  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
-
-requires: [Element, Element.Style]
-
-provides: [Element.Dimensions]
-
-...
-*/
-
-(function(){
-
-var element = document.createElement('div'),
-       child = document.createElement('div');
-element.style.height = '0';
-element.appendChild(child);
-var brokenOffsetParent = (child.offsetParent === element);
-element = child = null;
-
-var isOffset = function(el){
-       return styleString(el, 'position') != 'static' || isBody(el);
-};
-
-var isOffsetStatic = function(el){
-       return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
-};
-
-Element.implement({
-
-       scrollTo: function(x, y){
-               if (isBody(this)){
-                       this.getWindow().scrollTo(x, y);
-               } else {
-                       this.scrollLeft = x;
-                       this.scrollTop = y;
-               }
-               return this;
-       },
-
-       getSize: function(){
-               if (isBody(this)) return this.getWindow().getSize();
-               return {x: this.offsetWidth, y: this.offsetHeight};
-       },
-
-       getScrollSize: function(){
-               if (isBody(this)) return this.getWindow().getScrollSize();
-               return {x: this.scrollWidth, y: this.scrollHeight};
-       },
-
-       getScroll: function(){
-               if (isBody(this)) return this.getWindow().getScroll();
-               return {x: this.scrollLeft, y: this.scrollTop};
-       },
-
-       getScrolls: function(){
-               var element = this.parentNode, position = {x: 0, y: 0};
-               while (element && !isBody(element)){
-                       position.x += element.scrollLeft;
-                       position.y += element.scrollTop;
-                       element = element.parentNode;
-               }
-               return position;
-       },
-
-       getOffsetParent: brokenOffsetParent ? function(){
-               var element = this;
-               if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
-               var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
-               while ((element = element.parentNode)){
-                       if (isOffsetCheck(element)) return element;
-               }
-               return null;
-       } : function(){
-               var element = this;
-               if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
-               try {
-                       return element.offsetParent;
-               } catch(e) {}
-               return null;
-       },
-
-       getOffsets: function(){
-               if (this.getBoundingClientRect && !Browser.Platform.ios){
-                       var bound = this.getBoundingClientRect(),
-                               html = document.id(this.getDocument().documentElement),
-                               htmlScroll = html.getScroll(),
-                               elemScrolls = this.getScrolls(),
-                               isFixed = (styleString(this, 'position') == 'fixed');
-
-                       return {
-                               x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
-                               y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
-                       };
-               }
-
-               var element = this, position = {x: 0, y: 0};
-               if (isBody(this)) return position;
-
-               while (element && !isBody(element)){
-                       position.x += element.offsetLeft;
-                       position.y += element.offsetTop;
-
-                       if (Browser.firefox){
-                               if (!borderBox(element)){
-                                       position.x += leftBorder(element);
-                                       position.y += topBorder(element);
-                               }
-                               var parent = element.parentNode;
-                               if (parent && styleString(parent, 'overflow') != 'visible'){
-                                       position.x += leftBorder(parent);
-                                       position.y += topBorder(parent);
-                               }
-                       } else if (element != this && Browser.safari){
-                               position.x += leftBorder(element);
-                               position.y += topBorder(element);
-                       }
-
-                       element = element.offsetParent;
-               }
-               if (Browser.firefox && !borderBox(this)){
-                       position.x -= leftBorder(this);
-                       position.y -= topBorder(this);
-               }
-               return position;
-       },
-
-       getPosition: function(relative){
-               var offset = this.getOffsets(),
-                       scroll = this.getScrolls();
-               var position = {
-                       x: offset.x - scroll.x,
-                       y: offset.y - scroll.y
-               };
-
-               if (relative && (relative = document.id(relative))){
-                       var relativePosition = relative.getPosition();
-                       return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
-               }
-               return position;
-       },
-
-       getCoordinates: function(element){
-               if (isBody(this)) return this.getWindow().getCoordinates();
-               var position = this.getPosition(element),
-                       size = this.getSize();
-               var obj = {
-                       left: position.x,
-                       top: position.y,
-                       width: size.x,
-                       height: size.y
-               };
-               obj.right = obj.left + obj.width;
-               obj.bottom = obj.top + obj.height;
-               return obj;
-       },
-
-       computePosition: function(obj){
-               return {
-                       left: obj.x - styleNumber(this, 'margin-left'),
-                       top: obj.y - styleNumber(this, 'margin-top')
-               };
-       },
-
-       setPosition: function(obj){
-               return this.setStyles(this.computePosition(obj));
-       }
-
-});
-
-
-[Document, Window].invoke('implement', {
-
-       getSize: function(){
-               var doc = getCompatElement(this);
-               return {x: doc.clientWidth, y: doc.clientHeight};
-       },
-
-       getScroll: function(){
-               var win = this.getWindow(), doc = getCompatElement(this);
-               return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
-       },
-
-       getScrollSize: function(){
-               var doc = getCompatElement(this),
-                       min = this.getSize(),
-                       body = this.getDocument().body;
-
-               return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
-       },
-
-       getPosition: function(){
-               return {x: 0, y: 0};
-       },
-
-       getCoordinates: function(){
-               var size = this.getSize();
-               return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
-       }
-
-});
-
-// private methods
-
-var styleString = Element.getComputedStyle;
-
-function styleNumber(element, style){
-       return styleString(element, style).toInt() || 0;
-}
-
-function borderBox(element){
-       return styleString(element, '-moz-box-sizing') == 'border-box';
-}
-
-function topBorder(element){
-       return styleNumber(element, 'border-top-width');
-}
-
-function leftBorder(element){
-       return styleNumber(element, 'border-left-width');
-}
-
-function isBody(element){
-       return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-function getCompatElement(element){
-       var doc = element.getDocument();
-       return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-}
-
-})();
-
-//aliases
-Element.alias({position: 'setPosition'}); //compatability
-
-[Window, Document, Element].invoke('implement', {
-
-       getHeight: function(){
-               return this.getSize().y;
-       },
-
-       getWidth: function(){
-               return this.getSize().x;
-       },
-
-       getScrollTop: function(){
-               return this.getScroll().y;
-       },
-
-       getScrollLeft: function(){
-               return this.getScroll().x;
-       },
-
-       getScrollHeight: function(){
-               return this.getScrollSize().y;
-       },
-
-       getScrollWidth: function(){
-               return this.getScrollSize().x;
-       },
-
-       getTop: function(){
-               return this.getPosition().y;
-       },
-
-       getLeft: function(){
-               return this.getPosition().x;
-       }
-
-});
-
-
-// Begin: Source/Element/Element.Measure.js
-/*
----
-
-script: Element.Measure.js
-
-name: Element.Measure
-
-description: Extends the Element native object to include methods useful in measuring dimensions.
-
-credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Element.Measure]
-
-...
-*/
-
-(function(){
-
-var getStylesList = function(styles, planes){
-       var list = [];
-       Object.each(planes, function(directions){
-               Object.each(directions, function(edge){
-                       styles.each(function(style){
-                               list.push(style + '-' + edge + (style == 'border' ? '-width' : ''));
-                       });
-               });
-       });
-       return list;
-};
-
-var calculateEdgeSize = function(edge, styles){
-       var total = 0;
-       Object.each(styles, function(value, style){
-               if (style.test(edge)) total = total + value.toInt();
-       });
-       return total;
-};
-
-var isVisible = function(el){
-       return !!(!el || el.offsetHeight || el.offsetWidth);
-};
-
-
-Element.implement({
-
-       measure: function(fn){
-               if (isVisible(this)) return fn.call(this);
-               var parent = this.getParent(),
-                       toMeasure = [];
-               while (!isVisible(parent) && parent != document.body){
-                       toMeasure.push(parent.expose());
-                       parent = parent.getParent();
-               }
-               var restore = this.expose(),
-                       result = fn.call(this);
-               restore();
-               toMeasure.each(function(restore){
-                       restore();
-               });
-               return result;
-       },
-
-       expose: function(){
-               if (this.getStyle('display') != 'none') return function(){};
-               var before = this.style.cssText;
-               this.setStyles({
-                       display: 'block',
-                       position: 'absolute',
-                       visibility: 'hidden'
-               });
-               return function(){
-                       this.style.cssText = before;
-               }.bind(this);
-       },
-
-       getDimensions: function(options){
-               options = Object.merge({computeSize: false}, options);
-               var dim = {x: 0, y: 0};
-
-               var getSize = function(el, options){
-                       return (options.computeSize) ? el.getComputedSize(options) : el.getSize();
-               };
-
-               var parent = this.getParent('body');
-
-               if (parent && this.getStyle('display') == 'none'){
-                       dim = this.measure(function(){
-                               return getSize(this, options);
-                       });
-               } else if (parent){
-                       try { //safari sometimes crashes here, so catch it
-                               dim = getSize(this, options);
-                       }catch(e){}
-               }
-
-               return Object.append(dim, (dim.x || dim.x === 0) ? {
-                               width: dim.x,
-                               height: dim.y
-                       } : {
-                               x: dim.width,
-                               y: dim.height
-                       }
-               );
-       },
-
-       getComputedSize: function(options){
-               //<1.2compat>
-               //legacy support for my stupid spelling error
-               if (options && options.plains) options.planes = options.plains;
-               //</1.2compat>
-
-               options = Object.merge({
-                       styles: ['padding','border'],
-                       planes: {
-                               height: ['top','bottom'],
-                               width: ['left','right']
-                       },
-                       mode: 'both'
-               }, options);
-
-               var styles = {},
-                       size = {width: 0, height: 0},
-                       dimensions;
-
-               if (options.mode == 'vertical'){
-                       delete size.width;
-                       delete options.planes.width;
-               } else if (options.mode == 'horizontal'){
-                       delete size.height;
-                       delete options.planes.height;
-               }
-
-               getStylesList(options.styles, options.planes).each(function(style){
-                       styles[style] = this.getStyle(style).toInt();
-               }, this);
-
-               Object.each(options.planes, function(edges, plane){
-
-                       var capitalized = plane.capitalize(),
-                               style = this.getStyle(plane);
-
-                       if (style == 'auto' && !dimensions) dimensions = this.getDimensions();
-
-                       style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt();
-                       size['total' + capitalized] = style;
-
-                       edges.each(function(edge){
-                               var edgesize = calculateEdgeSize(edge, styles);
-                               size['computed' + edge.capitalize()] = edgesize;
-                               size['total' + capitalized] += edgesize;
-                       });
-
-               }, this);
-
-               return Object.append(size, styles);
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Element/Element.Position.js
-/*
----
-
-script: Element.Position.js
-
-name: Element.Position
-
-description: Extends the Element native object to include methods useful positioning elements relative to others.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/Options
-  - Core/Element.Dimensions
-  - Element.Measure
-
-provides: [Element.Position]
-
-...
-*/
-
-(function(original){
-
-var local = Element.Position = {
-
-       options: {/*
-               edge: false,
-               returnPos: false,
-               minimum: {x: 0, y: 0},
-               maximum: {x: 0, y: 0},
-               relFixedPosition: false,
-               ignoreMargins: false,
-               ignoreScroll: false,
-               allowNegative: false,*/
-               relativeTo: document.body,
-               position: {
-                       x: 'center', //left, center, right
-                       y: 'center' //top, center, bottom
-               },
-               offset: {x: 0, y: 0}
-       },
-
-       getOptions: function(element, options){
-               options = Object.merge({}, local.options, options);
-               local.setPositionOption(options);
-               local.setEdgeOption(options);
-               local.setOffsetOption(element, options);
-               local.setDimensionsOption(element, options);
-               return options;
-       },
-
-       setPositionOption: function(options){
-               options.position = local.getCoordinateFromValue(options.position);
-       },
-
-       setEdgeOption: function(options){
-               var edgeOption = local.getCoordinateFromValue(options.edge);
-               options.edge = edgeOption ? edgeOption :
-                       (options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} :
-                       {x: 'left', y: 'top'};
-       },
-
-       setOffsetOption: function(element, options){
-               var parentOffset = {x: 0, y: 0},
-                       offsetParent = element.measure(function(){
-                               return document.id(this.getOffsetParent());
-                       }),
-                       parentScroll = offsetParent.getScroll();
-
-               if (!offsetParent || offsetParent == element.getDocument().body) return;
-               parentOffset = offsetParent.measure(function(){
-                       var position = this.getPosition();
-                       if (this.getStyle('position') == 'fixed'){
-                               var scroll = window.getScroll();
-                               position.x += scroll.x;
-                               position.y += scroll.y;
-                       }
-                       return position;
-               });
-
-               options.offset = {
-                       parentPositioned: offsetParent != document.id(options.relativeTo),
-                       x: options.offset.x - parentOffset.x + parentScroll.x,
-                       y: options.offset.y - parentOffset.y + parentScroll.y
-               };
-       },
-
-       setDimensionsOption: function(element, options){
-               options.dimensions = element.getDimensions({
-                       computeSize: true,
-                       styles: ['padding', 'border', 'margin']
-               });
-       },
-
-       getPosition: function(element, options){
-               var position = {};
-               options = local.getOptions(element, options);
-               var relativeTo = document.id(options.relativeTo) || document.body;
-
-               local.setPositionCoordinates(options, position, relativeTo);
-               if (options.edge) local.toEdge(position, options);
-
-               var offset = options.offset;
-               position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt();
-               position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt();
-
-               local.toMinMax(position, options);
-
-               if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position);
-               if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position);
-               if (options.ignoreMargins) local.toIgnoreMargins(position, options);
-
-               position.left = Math.ceil(position.left);
-               position.top = Math.ceil(position.top);
-               delete position.x;
-               delete position.y;
-
-               return position;
-       },
-
-       setPositionCoordinates: function(options, position, relativeTo){
-               var offsetY = options.offset.y,
-                       offsetX = options.offset.x,
-                       calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(),
-                       top = calc.y,
-                       left = calc.x,
-                       winSize = window.getSize();
-
-               switch(options.position.x){
-                       case 'left': position.x = left + offsetX; break;
-                       case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break;
-                       default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break;
-               }
-
-               switch(options.position.y){
-                       case 'top': position.y = top + offsetY; break;
-                       case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break;
-                       default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break;
-               }
-       },
-
-       toMinMax: function(position, options){
-               var xy = {left: 'x', top: 'y'}, value;
-               ['minimum', 'maximum'].each(function(minmax){
-                       ['left', 'top'].each(function(lr){
-                               value = options[minmax] ? options[minmax][xy[lr]] : null;
-                               if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value;
-                       });
-               });
-       },
-
-       toRelFixedPosition: function(relativeTo, position){
-               var winScroll = window.getScroll();
-               position.top += winScroll.y;
-               position.left += winScroll.x;
-       },
-
-       toIgnoreScroll: function(relativeTo, position){
-               var relScroll = relativeTo.getScroll();
-               position.top -= relScroll.y;
-               position.left -= relScroll.x;
-       },
-
-       toIgnoreMargins: function(position, options){
-               position.left += options.edge.x == 'right'
-                       ? options.dimensions['margin-right']
-                       : (options.edge.x != 'center'
-                               ? -options.dimensions['margin-left']
-                               : -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2));
-
-               position.top += options.edge.y == 'bottom'
-                       ? options.dimensions['margin-bottom']
-                       : (options.edge.y != 'center'
-                               ? -options.dimensions['margin-top']
-                               : -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2));
-       },
-
-       toEdge: function(position, options){
-               var edgeOffset = {},
-                       dimensions = options.dimensions,
-                       edge = options.edge;
-
-               switch(edge.x){
-                       case 'left': edgeOffset.x = 0; break;
-                       case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break;
-                       // center
-                       default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break;
-               }
-
-               switch(edge.y){
-                       case 'top': edgeOffset.y = 0; break;
-                       case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break;
-                       // center
-                       default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break;
-               }
-
-               position.x += edgeOffset.x;
-               position.y += edgeOffset.y;
-       },
-
-       getCoordinateFromValue: function(option){
-               if (typeOf(option) != 'string') return option;
-               option = option.toLowerCase();
-
-               return {
-                       x: option.test('left') ? 'left'
-                               : (option.test('right') ? 'right' : 'center'),
-                       y: option.test(/upper|top/) ? 'top'
-                               : (option.test('bottom') ? 'bottom' : 'center')
-               };
-       }
-
-};
-
-Element.implement({
-
-       position: function(options){
-               if (options && (options.x != null || options.y != null)){
-                       return (original ? original.apply(this, arguments) : this);
-               }
-               var position = this.setStyle('position', 'absolute').calculatePosition(options);
-               return (options && options.returnPos) ? position : this.setStyles(position);
-       },
-
-       calculatePosition: function(options){
-               return local.getPosition(this, options);
-       }
-
-});
-
-})(Element.prototype.position);
-
-
-// Begin: Source/Element/Element.Shortcuts.js
-/*
----
-
-script: Element.Shortcuts.js
-
-name: Element.Shortcuts
-
-description: Extends the Element native object to include some shortcut methods.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Style
-  - /MooTools.More
-
-provides: [Element.Shortcuts]
-
-...
-*/
-
-Element.implement({
-
-       isDisplayed: function(){
-               return this.getStyle('display') != 'none';
-       },
-
-       isVisible: function(){
-               var w = this.offsetWidth,
-                       h = this.offsetHeight;
-               return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none';
-       },
-
-       toggle: function(){
-               return this[this.isDisplayed() ? 'hide' : 'show']();
-       },
-
-       hide: function(){
-               var d;
-               try {
-                       //IE fails here if the element is not in the dom
-                       d = this.getStyle('display');
-               } catch(e){}
-               if (d == 'none') return this;
-               return this.store('element:_originalDisplay', d || '').setStyle('display', 'none');
-       },
-
-       show: function(display){
-               if (!display && this.isDisplayed()) return this;
-               display = display || this.retrieve('element:_originalDisplay') || 'block';
-               return this.setStyle('display', (display == 'none') ? 'block' : display);
-       },
-
-       swapClass: function(remove, add){
-               return this.removeClass(remove).addClass(add);
-       }
-
-});
-
-Document.implement({
-
-       clearSelection: function(){
-               if (window.getSelection){
-                       var selection = window.getSelection();
-                       if (selection && selection.removeAllRanges) selection.removeAllRanges();
-               } else if (document.selection && document.selection.empty){
-                       try {
-                               //IE fails here if selected element is not in dom
-                               document.selection.empty();
-                       } catch(e){}
-               }
-       }
-
-});
-
-
-// Begin: Source/Forms/OverText.js
-/*
----
-
-script: OverText.js
-
-name: OverText
-
-description: Shows text over an input that disappears when the user clicks into it. The text remains hidden if the user adds a value.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - Class.Binds
-  - Class.Occlude
-  - Element.Position
-  - Element.Shortcuts
-
-provides: [OverText]
-
-...
-*/
-
-var OverText = new Class({
-
-       Implements: [Options, Events, Class.Occlude],
-
-       Binds: ['reposition', 'assert', 'focus', 'hide'],
-
-       options: {/*
-               textOverride: null,
-               onFocus: function(){},
-               onTextHide: function(textEl, inputEl){},
-               onTextShow: function(textEl, inputEl){}, */
-               element: 'label',
-               labelClass: 'overTxtLabel',
-               positionOptions: {
-                       position: 'upperLeft',
-                       edge: 'upperLeft',
-                       offset: {
-                               x: 4,
-                               y: 2
-                       }
-               },
-               poll: false,
-               pollInterval: 250,
-               wrap: false
-       },
-
-       property: 'OverText',
-
-       initialize: function(element, options){
-               element = this.element = document.id(element);
-
-               if (this.occlude()) return this.occluded;
-               this.setOptions(options);
-
-               this.attach(element);
-               OverText.instances.push(this);
-
-               if (this.options.poll) this.poll();
-       },
-
-       toElement: function(){
-               return this.element;
-       },
-
-       attach: function(){
-               var element = this.element,
-                       options = this.options,
-                       value = options.textOverride || element.get('alt') || element.get('title');
-
-               if (!value) return this;
-
-               var text = this.text = new Element(options.element, {
-                       'class': options.labelClass,
-                       styles: {
-                               lineHeight: 'normal',
-                               position: 'absolute',
-                               cursor: 'text'
-                       },
-                       html: value,
-                       events: {
-                               click: this.hide.pass(options.element == 'label', this)
-                       }
-               }).inject(element, 'after');
-
-               if (options.element == 'label'){
-                       if (!element.get('id')) element.set('id', 'input_' + String.uniqueID());
-                       text.set('for', element.get('id'));
-               }
-
-               if (options.wrap){
-                       this.textHolder = new Element('div.overTxtWrapper', {
-                               styles: {
-                                       lineHeight: 'normal',
-                                       position: 'relative'
-                               }
-                       }).grab(text).inject(element, 'before');
-               }
-
-               return this.enable();
-       },
-
-       destroy: function(){
-               this.element.eliminate(this.property); // Class.Occlude storage
-               this.disable();
-               if (this.text) this.text.destroy();
-               if (this.textHolder) this.textHolder.destroy();
-               return this;
-       },
-
-       disable: function(){
-               this.element.removeEvents({
-                       focus: this.focus,
-                       blur: this.assert,
-                       change: this.assert
-               });
-               window.removeEvent('resize', this.reposition);
-               this.hide(true, true);
-               return this;
-       },
-
-       enable: function(){
-               this.element.addEvents({
-                       focus: this.focus,
-                       blur: this.assert,
-                       change: this.assert
-               });
-               window.addEvent('resize', this.reposition);
-               this.reposition();
-               return this;
-       },
-
-       wrap: function(){
-               if (this.options.element == 'label'){
-                       if (!this.element.get('id')) this.element.set('id', 'input_' + String.uniqueID());
-                       this.text.set('for', this.element.get('id'));
-               }
-       },
-
-       startPolling: function(){
-               this.pollingPaused = false;
-               return this.poll();
-       },
-
-       poll: function(stop){
-               //start immediately
-               //pause on focus
-               //resumeon blur
-               if (this.poller && !stop) return this;
-               if (stop){
-                       clearInterval(this.poller);
-               } else {
-                       this.poller = (function(){
-                               if (!this.pollingPaused) this.assert(true);
-                       }).periodical(this.options.pollInterval, this);
-               }
-
-               return this;
-       },
-
-       stopPolling: function(){
-               this.pollingPaused = true;
-               return this.poll(true);
-       },
-
-       focus: function(){
-               if (this.text && (!this.text.isDisplayed() || this.element.get('disabled'))) return this;
-               return this.hide();
-       },
-
-       hide: function(suppressFocus, force){
-               if (this.text && (this.text.isDisplayed() && (!this.element.get('disabled') || force))){
-                       this.text.hide();
-                       this.fireEvent('textHide', [this.text, this.element]);
-                       this.pollingPaused = true;
-                       if (!suppressFocus){
-                               try {
-                                       this.element.fireEvent('focus');
-                                       this.element.focus();
-                               } catch(e){} //IE barfs if you call focus on hidden elements
-                       }
-               }
-               return this;
-       },
-
-       show: function(){
-               if (document.id(this.text) && !this.text.isDisplayed()){
-                       this.text.show();
-                       this.reposition();
-                       this.fireEvent('textShow', [this.text, this.element]);
-                       this.pollingPaused = false;
-               }
-               return this;
-       },
-
-       test: function(){
-               return !this.element.get('value');
-       },
-
-       assert: function(suppressFocus){
-               return this[this.test() ? 'show' : 'hide'](suppressFocus);
-       },
-
-       reposition: function(){
-               this.assert(true);
-               if (!this.element.isVisible()) return this.stopPolling().hide();
-               if (this.text && this.test()){
-                       this.text.position(Object.merge(this.options.positionOptions, {
-                               relativeTo: this.element
-                       }));
-               }
-               return this;
-       }
-
-});
-
-OverText.instances = [];
-
-Object.append(OverText, {
-
-       each: function(fn){
-               return OverText.instances.each(function(ot, i){
-                       if (ot.element && ot.text) fn.call(OverText, ot, i);
-               });
-       },
-
-       update: function(){
-
-               return OverText.each(function(ot){
-                       return ot.reposition();
-               });
-
-       },
-
-       hideAll: function(){
-
-               return OverText.each(function(ot){
-                       return ot.hide(true, true);
-               });
-
-       },
-
-       showAll: function(){
-               return OverText.each(function(ot){
-                       return ot.show();
-               });
-       }
-
-});
-
-
-
-// Begin: Source/Utilities/IframeShim.js
-/*
----
-
-script: IframeShim.js
-
-name: IframeShim
-
-description: Defines IframeShim, a class for obscuring select lists and flash objects in IE.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Options
-  - Core/Events
-  - /Element.Position
-  - /Class.Occlude
-
-provides: [IframeShim]
-
-...
-*/
-
-var IframeShim = new Class({
-
-       Implements: [Options, Events, Class.Occlude],
-
-       options: {
-               className: 'iframeShim',
-               src: 'javascript:false;document.write("");',
-               display: false,
-               zIndex: null,
-               margin: 0,
-               offset: {x: 0, y: 0},
-               browsers: (Browser.ie6 || (Browser.firefox && Browser.version < 3 && Browser.Platform.mac))
-       },
-
-       property: 'IframeShim',
-
-       initialize: function(element, options){
-               this.element = document.id(element);
-               if (this.occlude()) return this.occluded;
-               this.setOptions(options);
-               this.makeShim();
-               return this;
-       },
-
-       makeShim: function(){
-               if (this.options.browsers){
-                       var zIndex = this.element.getStyle('zIndex').toInt();
-
-                       if (!zIndex){
-                               zIndex = 1;
-                               var pos = this.element.getStyle('position');
-                               if (pos == 'static' || !pos) this.element.setStyle('position', 'relative');
-                               this.element.setStyle('zIndex', zIndex);
-                       }
-                       zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1;
-                       if (zIndex < 0) zIndex = 1;
-                       this.shim = new Element('iframe', {
-                               src: this.options.src,
-                               scrolling: 'no',
-                               frameborder: 0,
-                               styles: {
-                                       zIndex: zIndex,
-                                       position: 'absolute',
-                                       border: 'none',
-                                       filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
-                               },
-                               'class': this.options.className
-                       }).store('IframeShim', this);
-                       var inject = (function(){
-                               this.shim.inject(this.element, 'after');
-                               this[this.options.display ? 'show' : 'hide']();
-                               this.fireEvent('inject');
-                       }).bind(this);
-                       if (!IframeShim.ready) window.addEvent('load', inject);
-                       else inject();
-               } else {
-                       this.position = this.hide = this.show = this.dispose = Function.from(this);
-               }
-       },
-
-       position: function(){
-               if (!IframeShim.ready || !this.shim) return this;
-               var size = this.element.measure(function(){
-                       return this.getSize();
-               });
-               if (this.options.margin != undefined){
-                       size.x = size.x - (this.options.margin * 2);
-                       size.y = size.y - (this.options.margin * 2);
-                       this.options.offset.x += this.options.margin;
-                       this.options.offset.y += this.options.margin;
-               }
-               this.shim.set({width: size.x, height: size.y}).position({
-                       relativeTo: this.element,
-                       offset: this.options.offset
-               });
-               return this;
-       },
-
-       hide: function(){
-               if (this.shim) this.shim.setStyle('display', 'none');
-               return this;
-       },
-
-       show: function(){
-               if (this.shim) this.shim.setStyle('display', 'block');
-               return this.position();
-       },
-
-       dispose: function(){
-               if (this.shim) this.shim.dispose();
-               return this;
-       },
-
-       destroy: function(){
-               if (this.shim) this.shim.destroy();
-               return this;
-       }
-
-});
-
-window.addEvent('load', function(){
-       IframeShim.ready = true;
-});
-
-
-// Begin: Source/Interface/Mask.js
-/*
----
-
-script: Mask.js
-
-name: Mask
-
-description: Creates a mask element to cover another.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - /Class.Binds
-  - /Element.Position
-  - /IframeShim
-
-provides: [Mask]
-
-...
-*/
-
-var Mask = new Class({
-
-       Implements: [Options, Events],
-
-       Binds: ['position'],
-
-       options: {/*
-               onShow: function(){},
-               onHide: function(){},
-               onDestroy: function(){},
-               onClick: function(event){},
-               inject: {
-                       where: 'after',
-                       target: null,
-               },
-               hideOnClick: false,
-               id: null,
-               destroyOnHide: false,*/
-               style: {},
-               'class': 'mask',
-               maskMargins: false,
-               useIframeShim: true,
-               iframeShimOptions: {}
-       },
-
-       initialize: function(target, options){
-               this.target = document.id(target) || document.id(document.body);
-               this.target.store('mask', this);
-               this.setOptions(options);
-               this.render();
-               this.inject();
-       },
-
-       render: function(){
-               this.element = new Element('div', {
-                       'class': this.options['class'],
-                       id: this.options.id || 'mask-' + String.uniqueID(),
-                       styles: Object.merge({}, this.options.style, {
-                               display: 'none'
-                       }),
-                       events: {
-                               click: function(event){
-                                       this.fireEvent('click', event);
-                                       if (this.options.hideOnClick) this.hide();
-                               }.bind(this)
-                       }
-               });
-
-               this.hidden = true;
-       },
-
-       toElement: function(){
-               return this.element;
-       },
-
-       inject: function(target, where){
-               where = where || (this.options.inject ? this.options.inject.where : '') || this.target == document.body ? 'inside' : 'after';
-               target = target || (this.options.inject && this.options.inject.target) || this.target;
-
-               this.element.inject(target, where);
-
-               if (this.options.useIframeShim){
-                       this.shim = new IframeShim(this.element, this.options.iframeShimOptions);
-
-                       this.addEvents({
-                               show: this.shim.show.bind(this.shim),
-                               hide: this.shim.hide.bind(this.shim),
-                               destroy: this.shim.destroy.bind(this.shim)
-                       });
-               }
-       },
-
-       position: function(){
-               this.resize(this.options.width, this.options.height);
-
-               this.element.position({
-                       relativeTo: this.target,
-                       position: 'topLeft',
-                       ignoreMargins: !this.options.maskMargins,
-                       ignoreScroll: this.target == document.body
-               });
-
-               return this;
-       },
-
-       resize: function(x, y){
-               var opt = {
-                       styles: ['padding', 'border']
-               };
-               if (this.options.maskMargins) opt.styles.push('margin');
-
-               var dim = this.target.getComputedSize(opt);
-               if (this.target == document.body){
-                       this.element.setStyles({width: 0, height: 0});
-                       var win = window.getScrollSize();
-                       if (dim.totalHeight < win.y) dim.totalHeight = win.y;
-                       if (dim.totalWidth < win.x) dim.totalWidth = win.x;
-               }
-               this.element.setStyles({
-                       width: Array.pick([x, dim.totalWidth, dim.x]),
-                       height: Array.pick([y, dim.totalHeight, dim.y])
-               });
-
-               return this;
-       },
-
-       show: function(){
-               if (!this.hidden) return this;
-
-               window.addEvent('resize', this.position);
-               this.position();
-               this.showMask.apply(this, arguments);
-
-               return this;
-       },
-
-       showMask: function(){
-               this.element.setStyle('display', 'block');
-               this.hidden = false;
-               this.fireEvent('show');
-       },
-
-       hide: function(){
-               if (this.hidden) return this;
-
-               window.removeEvent('resize', this.position);
-               this.hideMask.apply(this, arguments);
-               if (this.options.destroyOnHide) return this.destroy();
-
-               return this;
-       },
-
-       hideMask: function(){
-               this.element.setStyle('display', 'none');
-               this.hidden = true;
-               this.fireEvent('hide');
-       },
-
-       toggle: function(){
-               this[this.hidden ? 'show' : 'hide']();
-       },
-
-       destroy: function(){
-               this.hide();
-               this.element.destroy();
-               this.fireEvent('destroy');
-               this.target.eliminate('mask');
-       }
-
-});
-
-Element.Properties.mask = {
-
-       set: function(options){
-               var mask = this.retrieve('mask');
-               if (mask) mask.destroy();
-               return this.eliminate('mask').store('mask:options', options);
-       },
-
-       get: function(){
-               var mask = this.retrieve('mask');
-               if (!mask){
-                       mask = new Mask(this, this.retrieve('mask:options'));
-                       this.store('mask', mask);
-               }
-               return mask;
-       }
-
-};
-
-Element.implement({
-
-       mask: function(options){
-               if (options) this.set('mask', options);
-               this.get('mask').show();
-               return this;
-       },
-
-       unmask: function(){
-               this.get('mask').hide();
-               return this;
-       }
-
-});
-
-
-// Begin: Source/Utilities/DOMReady.js
-/*
----
-
-name: DOMReady
-
-description: Contains the custom event domready.
-
-license: MIT-style license.
-
-requires: [Browser, Element, Element.Event]
-
-provides: [DOMReady, DomReady]
-
-...
-*/
-
-(function(window, document){
-
-var ready,
-       loaded,
-       checks = [],
-       shouldPoll,
-       timer,
-       testElement = document.createElement('div');
-
-var domready = function(){
-       clearTimeout(timer);
-       if (ready) return;
-       Browser.loaded = ready = true;
-       document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
-
-       document.fireEvent('domready');
-       window.fireEvent('domready');
-};
-
-var check = function(){
-       for (var i = checks.length; i--;) if (checks[i]()){
-               domready();
-               return true;
-       }
-       return false;
-};
-
-var poll = function(){
-       clearTimeout(timer);
-       if (!check()) timer = setTimeout(poll, 10);
-};
-
-document.addListener('DOMContentLoaded', domready);
-
-/*<ltIE8>*/
-// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
-// testElement.doScroll() throws when the DOM is not ready, only in the top window
-var doScrollWorks = function(){
-       try {
-               testElement.doScroll();
-               return true;
-       } catch (e){}
-       return false;
-};
-// If doScroll works already, it can't be used to determine domready
-//   e.g. in an iframe
-if (testElement.doScroll && !doScrollWorks()){
-       checks.push(doScrollWorks);
-       shouldPoll = true;
-}
-/*</ltIE8>*/
-
-if (document.readyState) checks.push(function(){
-       var state = document.readyState;
-       return (state == 'loaded' || state == 'complete');
-});
-
-if ('onreadystatechange' in document) document.addListener('readystatechange', check);
-else shouldPoll = true;
-
-if (shouldPoll) poll();
-
-Element.Events.domready = {
-       onAdd: function(fn){
-               if (ready) fn.call(this);
-       }
-};
-
-// Make sure that domready fires before load
-Element.Events.load = {
-       base: 'load',
-       onAdd: function(fn){
-               if (loaded && this == window) fn.call(this);
-       },
-       condition: function(){
-               if (this == window){
-                       domready();
-                       delete Element.Events.load;
-               }
-               return true;
-       }
-};
-
-// This is based on the custom load event
-window.addEvent('load', function(){
-       loaded = true;
-});
-
-})(window, document);
-
-
-// Begin: Source/Element/Element.Pin.js
-/*
----
-
-script: Element.Pin.js
-
-name: Element.Pin
-
-description: Extends the Element native object to include the pin method useful for fixed positioning for elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - Core/Element.Style
-  - /MooTools.More
-
-provides: [Element.Pin]
-
-...
-*/
-
-(function(){
-       var supportsPositionFixed = false,
-               supportTested = false;
-
-       var testPositionFixed = function(){
-               var test = new Element('div').setStyles({
-                       position: 'fixed',
-                       top: 0,
-                       right: 0
-               }).inject(document.body);
-               supportsPositionFixed = (test.offsetTop === 0);
-               test.dispose();
-               supportTested = true;
-       };
-
-       Element.implement({
-
-               pin: function(enable, forceScroll){
-                       if (!supportTested) testPositionFixed();
-                       if (this.getStyle('display') == 'none') return this;
-
-                       var pinnedPosition,
-                               scroll = window.getScroll(),
-                               parent,
-                               scrollFixer;
-
-                       if (enable !== false){
-                               pinnedPosition = this.getPosition(supportsPositionFixed ? document.body : this.getOffsetParent());
-                               if (!this.retrieve('pin:_pinned')){
-                                       var currentPosition = {
-                                               top: pinnedPosition.y - scroll.y,
-                                               left: pinnedPosition.x - scroll.x
-                                       };
-
-                                       if (supportsPositionFixed && !forceScroll){
-                                               this.setStyle('position', 'fixed').setStyles(currentPosition);
-                                       } else {
-
-                                               parent = this.getOffsetParent();
-                                               var position = this.getPosition(parent),
-                                                       styles = this.getStyles('left', 'top');
-
-                                               if (parent && styles.left == 'auto' || styles.top == 'auto') this.setPosition(position);
-                                               if (this.getStyle('position') == 'static') this.setStyle('position', 'absolute');
-
-                                               position = {
-                                                       x: styles.left.toInt() - scroll.x,
-                                                       y: styles.top.toInt() - scroll.y
-                                               };
-
-                                               scrollFixer = function(){
-                                                       if (!this.retrieve('pin:_pinned')) return;
-                                                       var scroll = window.getScroll();
-                                                       this.setStyles({
-                                                               left: position.x + scroll.x,
-                                                               top: position.y + scroll.y
-                                                       });
-                                               }.bind(this);
-
-                                               this.store('pin:_scrollFixer', scrollFixer);
-                                               window.addEvent('scroll', scrollFixer);
-                                       }
-                                       this.store('pin:_pinned', true);
-                               }
-
-                       } else {
-                               if (!this.retrieve('pin:_pinned')) return this;
-
-                               parent = this.getParent();
-                               var offsetParent = (parent.getComputedStyle('position') != 'static' ? parent : parent.getOffsetParent());
-
-                               pinnedPosition = this.getPosition(offsetParent);
-
-                               this.store('pin:_pinned', false);
-                               scrollFixer = this.retrieve('pin:_scrollFixer');
-                               if (!scrollFixer){
-                                       this.setStyles({
-                                               position: 'absolute',
-                                               top: pinnedPosition.y + scroll.y,
-                                               left: pinnedPosition.x + scroll.x
-                                       });
-                               } else {
-                                       this.store('pin:_scrollFixer', null);
-                                       window.removeEvent('scroll', scrollFixer);
-                               }
-                               this.removeClass('isPinned');
-                       }
-                       return this;
-               },
-
-               unpin: function(){
-                       return this.pin(false);
-               },
-
-               togglePin: function(){
-                       return this.pin(!this.retrieve('pin:_pinned'));
-               }
-
-       });
-
-//<1.2compat>
-Element.alias('togglepin', 'togglePin');
-//</1.2compat>
-
-})();
-
-
-// Begin: Source/Types/Object.Extras.js
-/*
----
-
-script: Object.Extras.js
-
-name: Object.Extras
-
-description: Extra Object generics, like getFromPath which allows a path notation to child elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Object
-  - /MooTools.More
-
-provides: [Object.Extras]
-
-...
-*/
-
-(function(){
-
-var defined = function(value){
-       return value != null;
-};
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
-       getFromPath: function(source, parts){
-               if (typeof parts == 'string') parts = parts.split('.');
-               for (var i = 0, l = parts.length; i < l; i++){
-                       if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
-                       else return null;
-               }
-               return source;
-       },
-
-       cleanValues: function(object, method){
-               method = method || defined;
-               for (var key in object) if (!method(object[key])){
-                       delete object[key];
-               }
-               return object;
-       },
-
-       erase: function(object, key){
-               if (hasOwnProperty.call(object, key)) delete object[key];
-               return object;
-       },
-
-       run: function(object){
-               var args = Array.slice(arguments, 1);
-               for (var key in object) if (object[key].apply){
-                       object[key].apply(object, args);
-               }
-               return object;
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Core/Clientcide.js
-/*
----
-
-name: Clientcide
-
-description: The Clientcide namespace.
-
-license: MIT-style license.
-
-provides: Clientcide
-
-...
-*/
-var Clientcide = {
-       version: '3.0.10',
-       assetLocation: "http://github.com/anutron/clientcide/raw/master/Assets",
-       setAssetLocation: function(baseHref) {
-               Clientcide.assetLocation = baseHref;
-               if (Clientcide.preloaded) Clientcide.preLoadCss();
-       },
-       preLoadCss: function(){
-               if (window.StickyWin && StickyWin.ui) StickyWin.ui();
-               if (window.StickyWin && StickyWin.pointy) StickyWin.pointy();
-               Clientcide.preloaded = true;
-               return true;
-       },
-       preloaded: false
-};
-(function(){
-       if (!window.addEvent) return;
-       var preload = function(){
-               if (window.dbug) dbug.log('preloading clientcide css');
-               if (!Clientcide.preloaded) Clientcide.preLoadCss();
-       };
-       window.addEvent('domready', preload);
-       window.addEvent('load', preload);
-})();
-setCNETAssetBaseHref = Clientcide.setAssetLocation;
-
-
-// Begin: Source/Core/dbug.js
-/*
----
-
-name: dbug
-
-description: A wrapper for Firebug console.* statements.
-
-license: MIT-style license.
-
-authors:
-- Aaron Newton
-
-provides: dbug
-
-...
-*/
-var dbug = {
-       logged: [],
-       timers: {},
-       firebug: false,
-       enabled: false,
-       log: function() {
-               dbug.logged.push(arguments);
-       },
-       nolog: function(msg) {
-               dbug.logged.push(arguments);
-       },
-       time: function(name){
-               dbug.timers[name] = new Date().getTime();
-       },
-       timeEnd: function(name){
-               if (dbug.timers[name]) {
-                       var end = new Date().getTime() - dbug.timers[name];
-                       dbug.timers[name] = false;
-                       dbug.log('%s: %s', name, end);
-               } else dbug.log('no such timer: %s', name);
-       },
-       enable: function(silent) {
-               var con = window.firebug ? firebug.d.console.cmd : window.console;
-
-               if((!!window.console && !!window.console.warn) || window.firebug) {
-                       try {
-                               dbug.enabled = true;
-                               dbug.log = function(){
-                                               try {
-                                                       (con.debug || con.log).apply(con, arguments);
-                                               } catch(e) {
-                                                       console.log(Array.slice(arguments));
-                                               }
-                               };
-                               dbug.time = function(){
-                                       con.time.apply(con, arguments);
-                               };
-                               dbug.timeEnd = function(){
-                                       con.timeEnd.apply(con, arguments);
-                               };
-                               if(!silent) dbug.log('enabling dbug');
-                               for(var i=0;i<dbug.logged.length;i++){ dbug.log.apply(con, dbug.logged[i]); }
-                               dbug.logged=[];
-                       } catch(e) {
-                               dbug.enable.delay(400);
-                       }
-               }
-       },
-       disable: function(){
-               if(dbug.firebug) dbug.enabled = false;
-               dbug.log = dbug.nolog;
-               dbug.time = function(){};
-               dbug.timeEnd = function(){};
-       },
-       cookie: function(set){
-               var value = document.cookie.match('(?:^|;)\\s*jsdebug=([^;]*)');
-               var debugCookie = value ? unescape(value[1]) : false;
-               if((set == null && debugCookie != 'true') || (set != null && set)) {
-                       dbug.enable();
-                       dbug.log('setting debugging cookie');
-                       var date = new Date();
-                       date.setTime(date.getTime()+(24*60*60*1000));
-                       document.cookie = 'jsdebug=true;expires='+date.toGMTString()+';path=/;';
-               } else dbug.disableCookie();
-       },
-       disableCookie: function(){
-               dbug.log('disabling debugging cookie');
-               document.cookie = 'jsdebug=false;path=/;';
-       },
-       conditional: function(fn, fnIfError) {
-               if (dbug.enabled) {
-                       return fn();
-               } else {
-                       try {
-                               return fn();
-                       } catch(e) {
-                               if (fnIfError) fnIfError(e);
-                       }
-               }
-       }
-};
-
-(function(){
-       var fb = !!window.console || !!window.firebug;
-       var con = window.firebug ? window.firebug.d.console.cmd : window.console;
-       var debugMethods = ['debug','info','warn','error','assert','dir','dirxml'];
-       var otherMethods = ['trace','group','groupEnd','profile','profileEnd','count'];
-       function set(methodList, defaultFunction) {
-
-               var getLogger = function(method) {
-                       return function(){
-                               con[method].apply(con, arguments);
-                       };
-               };
-
-               for(var i = 0; i < methodList.length; i++){
-                       var method = methodList[i];
-                       if (fb && con[method]) {
-                               dbug[method] = getLogger(method);
-                       } else {
-                               dbug[method] = defaultFunction;
-                       }
-               }
-       };
-       set(debugMethods, dbug.log);
-       set(otherMethods, function(){});
-})();
-if ((!!window.console && !!window.console.warn) || window.firebug){
-       dbug.firebug = true;
-       var value = document.cookie.match('(?:^|;)\\s*jsdebug=([^;]*)');
-       var debugCookie = value ? unescape(value[1]) : false;
-       if(window.location.href.indexOf("jsdebug=true")>0 || debugCookie=='true') dbug.enable();
-       if(debugCookie=='true')dbug.log('debugging cookie enabled');
-       if(window.location.href.indexOf("jsdebugCookie=true")>0){
-               dbug.cookie();
-               if(!dbug.enabled)dbug.enable();
-       }
-       if(window.location.href.indexOf("jsdebugCookie=false")>0)dbug.disableCookie();
-}
-
-
-// Begin: Source/UI/StyleWriter.js
-/*
----
-name: StyleWriter
-
-description: Provides a simple method for injecting a css style element into the DOM if it's not already present.
-
-license: MIT-Style License
-
-requires: [Core/Class, Core/DomReady, Core/Element, dbug]
-
-provides: StyleWriter
-
-...
-*/
-
-var StyleWriter = new Class({
-       createStyle: function(css, id) {
-               window.addEvent('domready', function(){
-                       try {
-                               if (document.id(id) && id) return;
-                               var style = new Element('style', {id: id||''}).inject($$('head')[0]);
-                               if (Browser.ie) style.styleSheet.cssText = css;
-                               else style.set('text', css);
-                       }catch(e){dbug.log('error: %s',e);}
-               }.bind(this));
-       }
-});
-
-// Begin: Source/UI/StickyWin.js
-/*
----
-
-name: StickyWin
-
-description: Creates a div within the page with the specified contents at the location relative to the element you specify; basically an in-page popup maker.
-
-license: MIT-Style License
-
-requires: [
-  Core/DomReady,
-  Core/Slick.Finder,
-  More/Element.Position,
-  More/Class.Binds,
-  More/Element.Shortcuts,
-  More/Element.Pin,
-  More/IframeShim,
-  More/Object.Extras,
-  Clientcide,
-  StyleWriter
-]
-
-provides: [StickyWin, StickyWin.Stacker]
-...
-*/
-
-
-var StickyWin = new Class({
-       Binds: ['destroy', 'hide', 'togglepin', 'esc'],
-       Implements: [Options, Events, StyleWriter],
-       options: {
-//             onDisplay: function(){},
-//             onClose: function(){},
-//             onDestroy: function(){},
-               closeClassName: 'closeSticky',
-               pinClassName: 'pinSticky',
-               content: '',
-               zIndex: 10000,
-               className: '',
-//             id: ... set above in initialize function
-/*     these are the defaults for Element.position anyway
-               ************************************************
-               edge: false, //see Element.position
-               position: 'center', //center, corner == upperLeft, upperRight, bottomLeft, bottomRight
-               offset: {x:0,y:0},
-               relativeTo: document.body, */
-               width: false,
-               height: false,
-               timeout: -1,
-               allowMultipleByClass: true,
-               allowMultiple: true,
-               showNow: true,
-               useIframeShim: true,
-               iframeShimSelector: '',
-               destroyOnClose: false,
-               closeOnClickOut: false,
-               closeOnEsc: false,
-               getWindowManager: function(){ return StickyWin.WM; }
-       },
-
-       css: '.SWclearfix:after {content: "."; display: block; height: 0; clear: both; visibility: hidden;}'+
-                '.SWclearfix {display: inline-table;} * html .SWclearfix {height: 1%;} .SWclearfix {display: block;}',
-
-       initialize: function(options){
-               this.options.inject = this.options.inject || {
-                       target: document.body,
-                       where: 'bottom'
-               };
-               this.setOptions(options);
-               this.windowManager = this.options.getWindowManager();
-               this.id = this.options.id || 'StickyWin_'+new Date().getTime();
-               this.makeWindow();
-               if (this.windowManager) this.windowManager.add(this);
-
-               if (this.options.content) this.setContent(this.options.content);
-               if (this.options.timeout > 0) {
-                       this.addEvent('onDisplay', function(){
-                               this.hide.delay(this.options.timeout, this);
-                       }.bind(this));
-               }
-               //add css for clearfix
-               this.createStyle(this.css, 'StickyWinClearFix');
-               if (this.options.closeOnClickOut || this.options.closeOnEsc) this.attach();
-               if (this.options.destroyOnClose) this.addEvent('close', this.destroy);
-               if (this.options.showNow) this.show();
-       },
-       toElement: function(){
-               return this.element;
-       },
-       attach: function(dettach){
-               var method = dettach ? 'removeEvents' : 'addEvents';
-               var events = {};
-               if (this.options.closeOnClickOut) events.click = this.esc;
-               if (this.options.closeOnEsc) events.keyup = this.esc;
-               document[method](events);
-       },
-       esc: function(e) {
-               if (e.key == "esc") this.hide();
-               if (e.type == "click" && this.element != e.target && !this.element.contains(e.target)) this.hide();
-       },
-       makeWindow: function(){
-               this.destroyOthers();
-               if (!document.id(this.id)) {
-                       this.win = new Element('div', {
-                               id: this.id
-                       }).addClass(this.options.className).addClass('StickyWinInstance').addClass('SWclearfix').setStyles({
-                               display: 'none',
-                               position: 'absolute',
-                               zIndex: this.options.zIndex
-                       }).inject(this.options.inject.target, this.options.inject.where).store('StickyWin', this);
-               } else this.win = document.id(this.id);
-               this.element = this.win;
-               if (this.options.width && typeOf(this.options.width.toInt())=="number") this.win.setStyle('width', this.options.width.toInt());
-               if (this.options.height && typeOf(this.options.height.toInt())=="number") this.win.setStyle('height', this.options.height.toInt());
-               return this;
-       },
-       show: function(suppressEvent){
-               this.showWin();
-               if (!suppressEvent) this.fireEvent('display');
-               if (this.options.useIframeShim) this.showIframeShim();
-               this.visible = true;
-               return this;
-       },
-       showWin: function(){
-               if (this.windowManager) this.windowManager.focus(this);
-               if (!this.positioned) this.position();
-               this.win.show();
-       },
-       hide: function(suppressEvent){
-               if (typeOf(suppressEvent) == "event" || !suppressEvent) this.fireEvent('close');
-               this.hideWin();
-               if (this.options.useIframeShim) this.hideIframeShim();
-               this.visible = false;
-               return this;
-       },
-       hideWin: function(){
-               this.win.setStyle('display','none');
-       },
-       destroyOthers: function() {
-               if (!this.options.allowMultipleByClass || !this.options.allowMultiple) {
-                       $$('div.StickyWinInstance').each(function(sw) {
-                               if (!this.options.allowMultiple || (!this.options.allowMultipleByClass && sw.hasClass(this.options.className)))
-                                       sw.retrieve('StickyWin').destroy();
-                       }, this);
-               }
-       },
-       setContent: function(html) {
-               if (this.win.getChildren().length>0) this.win.empty();
-               if (typeOf(html) == "string") this.win.set('html', html);
-               else if (document.id(html)) this.win.adopt(html);
-               this.win.getElements('.'+this.options.closeClassName).each(function(el){
-                       el.addEvent('click', this.hide);
-               }, this);
-               this.win.getElements('.'+this.options.pinClassName).each(function(el){
-                       el.addEvent('click', this.togglepin);
-               }, this);
-               return this;
-       },
-       position: function(options){
-               this.positioned = true;
-               this.setOptions(options);
-               this.win.position(
-                       Object.cleanValues({
-                               allowNegative: [this.options.allowNegative, this.options.relativeTo != document.body].pick(),
-                               relativeTo: this.options.relativeTo,
-                               position: this.options.position,
-                               offset: this.options.offset,
-                               edge: this.options.edge
-                       })
-               );
-               if (this.shim) this.shim.position();
-               return this;
-       },
-       pin: function(pin) {
-               if (!this.win.pin) {
-                       dbug.log('you must include element.pin.js!');
-                       return this;
-               }
-               this.pinned = pin != null && pin;
-               this.win.pin(pin);
-               return this;
-       },
-       unpin: function(){
-               return this.pin(false);
-       },
-       togglepin: function(){
-               return this.pin(!this.pinned);
-       },
-       makeIframeShim: function(){
-               if (!this.shim){
-                       var el = (this.options.iframeShimSelector)?this.win.getElement(this.options.iframeShimSelector):this.win;
-                       this.shim = new IframeShim(el, {
-                               display: false,
-                               name: 'StickyWinShim'
-                       });
-               }
-       },
-       showIframeShim: function(){
-               if (this.options.useIframeShim) {
-                       this.makeIframeShim();
-                       this.shim.show();
-               }
-       },
-       hideIframeShim: function(){
-               if (this.shim) this.shim.hide();
-       },
-       destroy: function(){
-               this.destroyed = true;
-               this.attach(true);
-               if (this.windowManager) this.windowManager.remove(this);
-               if (this.win) this.win.destroy();
-               if (this.options.useIframeShim && this.shim) this.shim.destroy();
-               if (document.id('modalOverlay')) document.id('modalOverlay').destroy();
-               this.fireEvent('destroy');
-       }
-});
-
-StickyWin.Stacker = new Class({
-       Implements: [Options, Events],
-       Binds: ['click'],
-       instances: [],
-       options: {
-               zIndexBase: 9000
-       },
-       initialize: function(options) {
-               this.setOptions(options);
-       },
-       add: function(sw) {
-               this.instances.include(sw);
-               $(sw).addEvent('mousedown', this.click);
-       },
-       click: function(e) {
-               this.instances.each(function(sw){
-                       var el = $(sw);
-                       if (el == e.target || el.contains($(e.target))) this.focus(sw);
-               }, this);
-       },
-       focus: function(instance){
-               if (this.focused == instance) return;
-               this.focused = instance;
-               if (instance) this.instances.erase(instance).push(instance);
-               this.instances.each(function(current, i){
-                       $(current).setStyle('z-index', this.options.zIndexBase + i);
-               }, this);
-               this.focused = instance;
-       },
-       remove: function(sw) {
-               this.instances.erase(sw);
-               $(sw).removeEvent('click', this.click);
-       }
-});
-StickyWin.WM = new StickyWin.Stacker();
-
-// Begin: Source/UI/StickyWin.Modal.js
-/*
----
-
-name: StickyWin.Modal
-
-description: This script extends StickyWin and StickyWin.Fx classes to add Mask functionality.
-
-license: MIT-Style License
-
-requires: [More/Mask, StickyWin]
-
-provides: StickyWin.Modal
-...
-*/
-StickyWin.Modal = new Class({
-
-       Extends: StickyWin,
-
-       options: {
-               modalize: true,
-               maskOptions: {
-                       style: {
-                               'background-color':'#333',
-                               opacity:0.8
-                       }
-               },
-               hideOnClick: true,
-               getWindowManager: function(){ return StickyWin.ModalWM; }
-       },
-
-       initialize: function(options) {
-               this.options.maskTarget = this.options.maskTarget || document.body;
-               this.setOptions(options);
-               this.mask = new Mask(this.options.maskTarget, this.options.maskOptions).addEvent('click', function() {
-                       if (this.options.hideOnClick) this.hide();
-               }.bind(this));
-               this.parent(options);
-       },
-
-       show: function(showModal){
-               if ([showModal, this.options.modalize].pick()) this.mask.show();
-               this.parent();
-       },
-
-       hide: function(hideModal){
-               if ([hideModal, true].pick()) this.mask.hide();
-               this.parent();
-       },
-
-       destroy: function(){
-               this.mask.destroy();
-               this.parent.apply(this, arguments);
-       }
-
-});
-
-StickyWin.ModalWM = new StickyWin.Stacker({
-       zIndexBase: 11000
-});
-if (StickyWin.Fx) StickyWin.Fx.Modal = StickyWin.Modal;
-
-// Begin: Source/Types/String.Extras.js
-/*
----
-
-script: String.Extras.js
-
-name: String.Extras
-
-description: Extends the String native object to include methods useful in managing various kinds of strings (query strings, urls, html, etc).
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Guillermo Rauch
-  - Christopher Pitt
-
-requires:
-  - Core/String
-  - Core/Array
-  - MooTools.More
-
-provides: [String.Extras]
-
-...
-*/
-
-(function(){
-
-var special = {
-       'a': /[àáâãäåăą]/g,
-       'A': /[ÀÁÂÃÄÅĂĄ]/g,
-       'c': /[ćčç]/g,
-       'C': /[ĆČÇ]/g,
-       'd': /[ďđ]/g,
-       'D': /[ĎÐ]/g,
-       'e': /[èéêëěę]/g,
-       'E': /[ÈÉÊËĚĘ]/g,
-       'g': /[ğ]/g,
-       'G': /[Ğ]/g,
-       'i': /[ìíîï]/g,
-       'I': /[ÌÍÎÏ]/g,
-       'l': /[ĺľł]/g,
-       'L': /[ĹĽŁ]/g,
-       'n': /[ñňń]/g,
-       'N': /[ÑŇŃ]/g,
-       'o': /[òóôõöøő]/g,
-       'O': /[ÒÓÔÕÖØ]/g,
-       'r': /[řŕ]/g,
-       'R': /[ŘŔ]/g,
-       's': /[ššş]/g,
-       'S': /[ŠŞŚ]/g,
-       't': /[ťţ]/g,
-       'T': /[ŤŢ]/g,
-       'ue': /[ü]/g,
-       'UE': /[Ü]/g,
-       'u': /[ùúûůµ]/g,
-       'U': /[ÙÚÛŮ]/g,
-       'y': /[ÿý]/g,
-       'Y': /[ŸÝ]/g,
-       'z': /[žźż]/g,
-       'Z': /[ŽŹŻ]/g,
-       'th': /[þ]/g,
-       'TH': /[Þ]/g,
-       'dh': /[ð]/g,
-       'DH': /[Ð]/g,
-       'ss': /[ß]/g,
-       'oe': /[œ]/g,
-       'OE': /[Œ]/g,
-       'ae': /[æ]/g,
-       'AE': /[Æ]/g
-},
-
-tidy = {
-       ' ': /[\xa0\u2002\u2003\u2009]/g,
-       '*': /[\xb7]/g,
-       '\'': /[\u2018\u2019]/g,
-       '"': /[\u201c\u201d]/g,
-       '...': /[\u2026]/g,
-       '-': /[\u2013]/g,
-//     '--': /[\u2014]/g,
-       '&raquo;': /[\uFFFD]/g
-},
-
-conversions = {
-       ms: 1,
-       s: 1000,
-       m: 6e4,
-       h: 36e5
-},
-
-findUnits = /(\d*.?\d+)([msh]+)/;
-
-var walk = function(string, replacements){
-       var result = string, key;
-       for (key in replacements) result = result.replace(replacements[key], key);
-       return result;
-};
-
-var getRegexForTag = function(tag, contents){
-       tag = tag || '';
-       var regstr = contents ? "<" + tag + "(?!\\w)[^>]*>([\\s\\S]*?)<\/" + tag + "(?!\\w)>" : "<\/?" + tag + "([^>]+)?>",
-               reg = new RegExp(regstr, "gi");
-       return reg;
-};
-
-String.implement({
-
-       standardize: function(){
-               return walk(this, special);
-       },
-
-       repeat: function(times){
-               return new Array(times + 1).join(this);
-       },
-
-       pad: function(length, str, direction){
-               if (this.length >= length) return this;
-
-               var pad = (str == null ? ' ' : '' + str)
-                       .repeat(length - this.length)
-                       .substr(0, length - this.length);
-
-               if (!direction || direction == 'right') return this + pad;
-               if (direction == 'left') return pad + this;
-
-               return pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0, (pad.length / 2).ceil());
-       },
-
-       getTags: function(tag, contents){
-               return this.match(getRegexForTag(tag, contents)) || [];
-       },
-
-       stripTags: function(tag, contents){
-               return this.replace(getRegexForTag(tag, contents), '');
-       },
-
-       tidy: function(){
-               return walk(this, tidy);
-       },
-
-       truncate: function(max, trail, atChar){
-               var string = this;
-               if (trail == null && arguments.length == 1) trail = '…';
-               if (string.length > max){
-                       string = string.substring(0, max);
-                       if (atChar){
-                               var index = string.lastIndexOf(atChar);
-                               if (index != -1) string = string.substr(0, index);
-                       }
-                       if (trail) string += trail;
-               }
-               return string;
-       },
-
-       ms: function(){
-         // "Borrowed" from https://gist.github.com/1503944
-               var units = findUnits.exec(this);
-               if (units == null) return Number(this);
-               return Number(units[1]) * conversions[units[2]];
-       }
-
-});
-
-})();
-
-
-// Begin: Source/UI/StickyWin.UI.js
- /*
----
-name: StickyWin.UI
-
-description: Creates an html holder for in-page popups using a default style.
-
-license: MIT-Style License
-
-requires: [Core/Element.Style, More/String.Extras, StyleWriter, StickyWin]
-
-provides: StickyWin.UI
-...
-*/
-StickyWin.UI = new Class({
-       Implements: [Options, StyleWriter],
-       options: {
-               width: 300,
-               css: "div.DefaultStickyWin {font-family:verdana; font-size:11px; line-height: 13px;position: relative;}"+
-                       "div.DefaultStickyWin div.top{-moz-user-select: none;-khtml-user-select: none;}"+
-                       "div.DefaultStickyWin div.top_ul{background:url({%baseHref%}full.png) top left no-repeat; height:30px; width:15px; float:left}"+
-                       "div.DefaultStickyWin div.top_ur{position:relative; left:0px !important; left:-4px; background:url({%baseHref%}full.png) top right !important; height:30px; margin:0px 0px 0px 15px !important; margin-right:-4px; padding:0px}"+
-                       "div.DefaultStickyWin h1.caption{clear: none !important; margin:0px !important; overflow: hidden; padding:0 !important; font-weight:bold; color:#555; font-size:14px !important; position:relative; top:8px !important; left:5px !important; float: left; height: 22px !important;}"+
-                       "div.DefaultStickyWin div.middle, div.DefaultStickyWin div.closeBody {background:url({%baseHref%}body.png) top left repeat-y; margin:0px 20px 0px 0px !important;       margin-bottom: -3px; position: relative;        top: 0px !important; top: -3px;}"+
-                       "div.DefaultStickyWin div.body{background:url({%baseHref%}body.png) top right repeat-y; padding:8px 23px 8px 0px !important; margin-left:5px !important; position:relative; right:-20px !important; z-index: 1;}"+
-                       "div.DefaultStickyWin div.bottom{clear:both;}"+
-                       "div.DefaultStickyWin div.bottom_ll{background:url({%baseHref%}full.png) bottom left no-repeat; width:15px; height:15px; float:left}"+
-                       "div.DefaultStickyWin div.bottom_lr{background:url({%baseHref%}full.png) bottom right; position:relative; left:0px !important; left:-4px; margin:0px 0px 0px 15px !important; margin-right:-4px; height:15px}"+
-                       "div.DefaultStickyWin div.closeButtons{text-align: center; background:url({%baseHref%}body.png) top right repeat-y; padding: 4px 30px 8px 0px; margin-left:5px; position:relative; right:-20px}"+
-                       "div.DefaultStickyWin a.button:hover{background:url({%baseHref%}big_button_over.gif) repeat-x}"+
-                       "div.DefaultStickyWin a.button {background:url({%baseHref%}big_button.gif) repeat-x; margin: 2px 8px 2px 8px; padding: 2px 12px; cursor:pointer; border: 1px solid #999 !important; text-decoration:none; color: #000 !important;}"+
-                       "div.DefaultStickyWin div.closeButton{width:13px; height:13px; background:url({%baseHref%}closebtn.gif) no-repeat; position: absolute; right: 0px; margin:10px 15px 0px 0px !important; cursor:pointer;top:0px}"+
-                       "div.DefaultStickyWin div.dragHandle {  width: 11px;    height: 25px;   position: relative;     top: 5px;       left: -3px;     cursor: move;   background: url({%baseHref%}drag_corner.gif); float: left;}",
-               cornerHandle: false,
-               cssClass: '',
-               buttons: [],
-               cssId: 'defaultStickyWinStyle',
-               cssClassName: 'DefaultStickyWin',
-               closeButton: true
-/*     These options are deprecated:
-               closeTxt: false,
-               onClose: function(){},
-               confirmTxt: false,
-               onConfirm: function(){} */
-       },
-       initialize: function() {
-               var args = this.getArgs(arguments);
-               this.setOptions(args.options);
-               this.legacy();
-               var css = this.options.css.substitute({baseHref: this.options.baseHref || Clientcide.assetLocation + '/stickyWinHTML/'}, /\\?\{%([^}]+)%\}/g);
-               if (Browser.ie) css = css.replace(/png/g, 'gif');
-               this.createStyle(css, this.options.cssId);
-               this.build();
-               if (args.caption || args.body) this.setContent(args.caption, args.body);
-       },
-       toElement: function(){
-               return this.element;
-       },
-       getArgs: function(){
-               return StickyWin.UI.getArgs.apply(this, arguments);
-       },
-       legacy: function(){
-               var opt = this.options; //saving bytes
-               //legacy support
-               if (opt.confirmTxt) opt.buttons.push({text: opt.confirmTxt, onClick: opt.onConfirm || function(){}});
-               if (opt.closeTxt) opt.buttons.push({text: opt.closeTxt, onClick: opt.onClose || function(){}});
-       },
-       build: function(){
-               var opt = this.options;
-
-               var container = new Element('div', {
-                       'class': opt.cssClassName
-               });
-               if (opt.width) container.setStyle('width', opt.width);
-               this.element = container;
-               this.element.store('StickyWinUI', this);
-               if (opt.cssClass) container.addClass(opt.cssClass);
-
-
-               var bodyDiv = new Element('div').addClass('body');
-               this.body = bodyDiv;
-
-               var top_ur = new Element('div').addClass('top_ur');
-               this.top_ur = top_ur;
-               this.top = new Element('div').addClass('top').adopt(
-                               new Element('div').addClass('top_ul')
-                       ).adopt(top_ur);
-               container.adopt(this.top);
-
-               if (opt.cornerHandle) new Element('div').addClass('dragHandle').inject(top_ur, 'top');
-
-               //body
-               container.adopt(new Element('div').addClass('middle').adopt(bodyDiv));
-               //close buttons
-               if (opt.buttons.length > 0){
-                       var closeButtons = new Element('div').addClass('closeButtons');
-                       opt.buttons.each(function(button){
-                               if (button.properties && button.properties.className){
-                                       button.properties['class'] = button.properties.className;
-                                       delete button.properties.className;
-                               }
-                               var properties = Object.merge({'class': 'closeSticky'}, button.properties);
-                               new Element('a').addEvent('click', button.onClick || function(){})
-                                       .appendText(button.text).inject(closeButtons).set(properties).addClass('button');
-                       });
-                       container.adopt(new Element('div').addClass('closeBody').adopt(closeButtons));
-               }
-               //footer
-               container.adopt(
-                       new Element('div').addClass('bottom').adopt(
-                                       new Element('div').addClass('bottom_ll')
-                               ).adopt(
-                                       new Element('div').addClass('bottom_lr')
-                       )
-               );
-               if (this.options.closeButton) container.adopt(new Element('div').addClass('closeButton').addClass('closeSticky'));
-               return this;
-       },
-       setCaption: function(caption) {
-               this.caption = caption;
-               if (!this.h1) {
-                       this.makeCaption(caption);
-               } else {
-                       if (document.id(caption)) this.h1.adopt(caption);
-                       else this.h1.set('html', caption);
-               }
-               return this;
-       },
-       makeCaption: function(caption) {
-               if (!caption) return this.destroyCaption();
-               var opt = this.options;
-               this.h1 = new Element('h1').addClass('caption');
-               if (opt.width) this.h1.setStyle('width', (opt.width.toInt()-(opt.cornerHandle?55:40)-(opt.closeButton?10:0)));
-               this.setCaption(caption);
-               this.top_ur.adopt(this.h1);
-               if (!this.options.cornerHandle) this.h1.addClass('dragHandle');
-               return this;
-       },
-       destroyCaption: function(){
-               if (this.h1) {
-                       this.h1.destroy();
-                       this.h1 = null;
-               }
-               return this;
-       },
-       setContent: function(){
-               var args = this.getArgs.apply(this, arguments);
-               var caption = args.caption;
-               var body = args.body;
-               this.setCaption(caption);
-               if (document.id(body)) this.body.empty().adopt(body);
-               else this.body.set('html', body);
-               return this;
-       }
-});
-StickyWin.UI.getArgs = function(){
-       var input = typeOf(arguments[0]) == "arguments"?arguments[0]:arguments;
-       if (Browser.opera && 1 === input.length) input = input[0];
-
-       var cap = input[0], bod = input[1];
-       var args = Array.link(input, {options: Type.isObject});
-       if (input.length == 3 || (!args.options && input.length == 2)) {
-               args.caption = cap;
-               args.body = bod;
-       } else if ((typeOf(bod) == 'object' || !bod) && cap && typeOf(cap) != 'object'){
-               args.body = cap;
-       }
-       return args;
-};
-
-StickyWin.ui = function(caption, body, options){
-       return document.id(new StickyWin.UI(caption, body, options));
-};
-
-
-// Begin: Source/UI/StickyWin.Alert.js
-/*
----
-
-name: StickyWin.Alert
-
-description: Defines StickyWin.Alert, a simple little alert box with a close button.
-
-license: MIT-Style License
-
-requires: [StickyWin.Modal, StickyWin.UI]
-
-provides: [StickyWin.Alert, StickyWin.Error, StickyWin.alert, StickyWin.error]
-
-...
-*/
-StickyWin.Alert = new Class({
-       Implements: Options,
-       Extends: StickyWin.Modal,
-       options: {
-               destroyOnClose: true,
-               modalOptions: {
-                       modalStyle: {
-                               zIndex: 11000
-                       }
-               },
-               zIndex: 110001,
-               uiOptions: {
-                       width: 250,
-                       buttons: [
-                               {text: 'Ok'}
-                       ]
-               },
-               getWindowManager: function(){}
-       },
-       initialize: function(caption, message, options) {
-               this.message = message;
-               this.caption = caption;
-               this.setOptions(options);
-               this.setOptions({
-                       content: this.build()
-               });
-               this.parent(options);
-       },
-       makeMessage: function() {
-               return new Element('p', {
-                       'class': 'errorMsg SWclearfix',
-                       styles: {
-                               margin: 0,
-                               minHeight: 10
-                       },
-                       html: this.message
-               });
-       },
-       build: function(){
-               return StickyWin.ui(this.caption, this.makeMessage(), this.options.uiOptions);
-       }
-});
-
-StickyWin.Error = new Class({
-       Extends: StickyWin.Alert,
-       makeMessage: function(){
-               var message = this.parent();
-               new Element('img', {
-                       src: (this.options.baseHref || Clientcide.assetLocation + '/simple.error.popup') + '/icon_problems_sm.gif',
-                       'class': 'bang clearfix',
-                       styles: {
-                               'float': 'left',
-                               width: 30,
-                               height: 30,
-                               margin: '3px 5px 5px 0px'
-                       }
-               }).inject(message, 'top');
-               return message;
-       }
-});
-
-StickyWin.alert = function(caption, message, options) {
-       if (typeOf(options) == "string") options = {baseHref: options};
-       return new StickyWin.Alert(caption, message, options);
-};
-
-StickyWin.error = function(caption, message, options) {
-       return new StickyWin.Error(caption, message, options);
-};
-
-// Begin: Source/UI/StickyWin.Confirm.js
-/*
----
-name: StickyWin.Confirm
-
-description: Defines StickyWin.Conferm, a simple confirmation box with an ok and a close button.
-
-license: MIT-Style License
-
-requires: StickyWin.Alert
-
-provides: [StickyWin.Confirm, StickyWin.confirm]
-
-...
-*/
-StickyWin.Confirm = new Class({
-       Extends: StickyWin.Alert,
-       options: {
-               uiOptions: {
-                       width: 250
-               }
-       },
-       build: function(callback){
-               this.setOptions({
-                       uiOptions: {
-                               buttons: [
-                                       {text: 'Cancel'},
-                                       {
-                                               text: 'Ok',
-                                               onClick: callback || function(){
-                                                       this.fireEvent('confirm');
-                                               }.bind(this)
-                                       }
-                               ]
-                       }
-               });
-               return this.parent();
-       }
-});
-
-StickyWin.confirm = function(caption, message, callback, options) {
-       return new StickyWin.Confirm(caption, message, options).addEvent('confirm', callback);
-};
-
-// Begin: Source/Fx/Fx.Move.js
-/*
----
-
-script: Fx.Move.js
-
-name: Fx.Move
-
-description: Defines Fx.Move, a class that works with Element.Position.js to transition an element from one location to another.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Morph
-  - /Element.Position
-
-provides: [Fx.Move]
-
-...
-*/
-
-Fx.Move = new Class({
-
-       Extends: Fx.Morph,
-
-       options: {
-               relativeTo: document.body,
-               position: 'center',
-               edge: false,
-               offset: {x: 0, y: 0}
-       },
-
-       start: function(destination){
-               var element = this.element,
-                       topLeft = element.getStyles('top', 'left');
-               if (topLeft.top == 'auto' || topLeft.left == 'auto'){
-                       element.setPosition(element.getPosition(element.getOffsetParent()));
-               }
-               return this.parent(element.position(Object.merge({}, this.options, destination, {returnPos: true})));
-       }
-
-});
-
-Element.Properties.move = {
-
-       set: function(options){
-               this.get('move').cancel().setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var move = this.retrieve('move');
-               if (!move){
-                       move = new Fx.Move(this, {link: 'cancel'});
-                       this.store('move', move);
-               }
-               return move;
-       }
-
-};
-
-Element.implement({
-
-       move: function(options){
-               this.get('move').start(options);
-               return this;
-       }
-
-});
-
-
-// Begin: Source/Fx/Fx.Scroll.js
-/*
----
-
-script: Fx.Scroll.js
-
-name: Fx.Scroll
-
-description: Effect to smoothly scroll any element, including the window.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Fx.Scroll]
-
-...
-*/
-
-(function(){
-
-Fx.Scroll = new Class({
-
-       Extends: Fx,
-
-       options: {
-               offset: {x: 0, y: 0},
-               wheelStops: true
-       },
-
-       initialize: function(element, options){
-               this.element = this.subject = document.id(element);
-               this.parent(options);
-
-               if (typeOf(this.element) != 'element') this.element = document.id(this.element.getDocument().body);
-
-               if (this.options.wheelStops){
-                       var stopper = this.element,
-                               cancel = this.cancel.pass(false, this);
-                       this.addEvent('start', function(){
-                               stopper.addEvent('mousewheel', cancel);
-                       }, true);
-                       this.addEvent('complete', function(){
-                               stopper.removeEvent('mousewheel', cancel);
-                       }, true);
-               }
-       },
-
-       set: function(){
-               var now = Array.flatten(arguments);
-               if (Browser.firefox) now = [Math.round(now[0]), Math.round(now[1])]; // not needed anymore in newer firefox versions
-               this.element.scrollTo(now[0], now[1]);
-               return this;
-       },
-
-       compute: function(from, to, delta){
-               return [0, 1].map(function(i){
-                       return Fx.compute(from[i], to[i], delta);
-               });
-       },
-
-       start: function(x, y){
-               if (!this.check(x, y)) return this;
-               var scroll = this.element.getScroll();
-               return this.parent([scroll.x, scroll.y], [x, y]);
-       },
-
-       calculateScroll: function(x, y){
-               var element = this.element,
-                       scrollSize = element.getScrollSize(),
-                       scroll = element.getScroll(),
-                       size = element.getSize(),
-                       offset = this.options.offset,
-                       values = {x: x, y: y};
-
-               for (var z in values){
-                       if (!values[z] && values[z] !== 0) values[z] = scroll[z];
-                       if (typeOf(values[z]) != 'number') values[z] = scrollSize[z] - size[z];
-                       values[z] += offset[z];
-               }
-
-               return [values.x, values.y];
-       },
-
-       toTop: function(){
-               return this.start.apply(this, this.calculateScroll(false, 0));
-       },
-
-       toLeft: function(){
-               return this.start.apply(this, this.calculateScroll(0, false));
-       },
-
-       toRight: function(){
-               return this.start.apply(this, this.calculateScroll('right', false));
-       },
-
-       toBottom: function(){
-               return this.start.apply(this, this.calculateScroll(false, 'bottom'));
-       },
-
-       toElement: function(el, axes){
-               axes = axes ? Array.from(axes) : ['x', 'y'];
-               var scroll = isBody(this.element) ? {x: 0, y: 0} : this.element.getScroll();
-               var position = Object.map(document.id(el).getPosition(this.element), function(value, axis){
-                       return axes.contains(axis) ? value + scroll[axis] : false;
-               });
-               return this.start.apply(this, this.calculateScroll(position.x, position.y));
-       },
-
-       toElementEdge: function(el, axes, offset){
-               axes = axes ? Array.from(axes) : ['x', 'y'];
-               el = document.id(el);
-               var to = {},
-                       position = el.getPosition(this.element),
-                       size = el.getSize(),
-                       scroll = this.element.getScroll(),
-                       containerSize = this.element.getSize(),
-                       edge = {
-                               x: position.x + size.x,
-                               y: position.y + size.y
-                       };
-
-               ['x', 'y'].each(function(axis){
-                       if (axes.contains(axis)){
-                               if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis];
-                               if (position[axis] < scroll[axis]) to[axis] = position[axis];
-                       }
-                       if (to[axis] == null) to[axis] = scroll[axis];
-                       if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
-               }, this);
-
-               if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
-               return this;
-       },
-
-       toElementCenter: function(el, axes, offset){
-               axes = axes ? Array.from(axes) : ['x', 'y'];
-               el = document.id(el);
-               var to = {},
-                       position = el.getPosition(this.element),
-                       size = el.getSize(),
-                       scroll = this.element.getScroll(),
-                       containerSize = this.element.getSize();
-
-               ['x', 'y'].each(function(axis){
-                       if (axes.contains(axis)){
-                               to[axis] = position[axis] - (containerSize[axis] - size[axis]) / 2;
-                       }
-                       if (to[axis] == null) to[axis] = scroll[axis];
-                       if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
-               }, this);
-
-               if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
-               return this;
-       }
-
-});
-
-//<1.2compat>
-Fx.Scroll.implement({
-       scrollToCenter: function(){
-               return this.toElementCenter.apply(this, arguments);
-       },
-       scrollIntoView: function(){
-               return this.toElementEdge.apply(this, arguments);
-       }
-});
-//</1.2compat>
-
-function isBody(element){
-       return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-})();
-
-
-// Begin: Source/Class/Class.Refactor.js
-/*
----
-
-script: Class.Refactor.js
-
-name: Class.Refactor
-
-description: Extends a class onto itself with new property, preserving any items attached to the class's namespace.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - /MooTools.More
-
-# Some modules declare themselves dependent on Class.Refactor
-provides: [Class.refactor, Class.Refactor]
-
-...
-*/
-
-Class.refactor = function(original, refactors){
-
-       Object.each(refactors, function(item, name){
-               var origin = original.prototype[name];
-               origin = (origin && origin.$origin) || origin || function(){};
-               original.implement(name, (typeof item == 'function') ? function(){
-                       var old = this.previous;
-                       this.previous = origin;
-                       var value = item.apply(this, arguments);
-                       this.previous = old;
-                       return value;
-               } : item);
-       });
-
-       return original;
-
-};
-
-
-// Begin: Source/Fx/Fx.Tween.js
-/*
----
-
-name: Fx.Tween
-
-description: Formerly Fx.Style, effect to transition any CSS property for an element.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: [Fx.Tween, Element.fade, Element.highlight]
-
-...
-*/
-
-Fx.Tween = new Class({
-
-       Extends: Fx.CSS,
-
-       initialize: function(element, options){
-               this.element = this.subject = document.id(element);
-               this.parent(options);
-       },
-
-       set: function(property, now){
-               if (arguments.length == 1){
-                       now = property;
-                       property = this.property || this.options.property;
-               }
-               this.render(this.element, property, now, this.options.unit);
-               return this;
-       },
-
-       start: function(property, from, to){
-               if (!this.check(property, from, to)) return this;
-               var args = Array.flatten(arguments);
-               this.property = this.options.property || args.shift();
-               var parsed = this.prepare(this.element, this.property, args);
-               return this.parent(parsed.from, parsed.to);
-       }
-
-});
-
-Element.Properties.tween = {
-
-       set: function(options){
-               this.get('tween').cancel().setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var tween = this.retrieve('tween');
-               if (!tween){
-                       tween = new Fx.Tween(this, {link: 'cancel'});
-                       this.store('tween', tween);
-               }
-               return tween;
-       }
-
-};
-
-Element.implement({
-
-       tween: function(property, from, to){
-               this.get('tween').start(property, from, to);
-               return this;
-       },
-
-       fade: function(how){
-               var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle;
-               if (args[1] == null) args[1] = 'toggle';
-               switch (args[1]){
-                       case 'in': method = 'start'; args[1] = 1; break;
-                       case 'out': method = 'start'; args[1] = 0; break;
-                       case 'show': method = 'set'; args[1] = 1; break;
-                       case 'hide': method = 'set'; args[1] = 0; break;
-                       case 'toggle':
-                               var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1);
-                               method = 'start';
-                               args[1] = flag ? 0 : 1;
-                               this.store('fade:flag', !flag);
-                               toggle = true;
-                       break;
-                       default: method = 'start';
-               }
-               if (!toggle) this.eliminate('fade:flag');
-               fade[method].apply(fade, args);
-               var to = args[args.length - 1];
-               if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible');
-               else fade.chain(function(){
-                       this.element.setStyle('visibility', 'hidden');
-                       this.callChain();
-               });
-               return this;
-       },
-
-       highlight: function(start, end){
-               if (!end){
-                       end = this.retrieve('highlight:original', this.getStyle('background-color'));
-                       end = (end == 'transparent') ? '#fff' : end;
-               }
-               var tween = this.get('tween');
-               tween.start('background-color', start || '#ffff88', end).chain(function(){
-                       this.setStyle('background-color', this.retrieve('highlight:original'));
-                       tween.callChain();
-               }.bind(this));
-               return this;
-       }
-
-});
-
-
-// Begin: Source/UI/StickyWin.Fx.js
-/*
----
-
-name: StickyWin.Fx
-
-description: Extends StickyWin to create popups that fade in and out.
-
-license: MIT-style license.
-
-requires: [More/Class.Refactor, Core/Fx.Tween, StickyWin]
-
-provides: StickyWin.Fx
-
-...
-*/
-if (!Browser.ie){
-       StickyWin = Class.refactor(StickyWin, {
-               options: {
-                       //fadeTransition: 'sine:in:out',
-                       fade: true,
-                       fadeDuration: 150
-               },
-               hideWin: function(){
-                       if (this.options.fade) this.fade(0);
-                       else this.previous();
-               },
-               showWin: function(){
-                       if (this.options.fade) this.fade(1);
-                       else this.previous();
-               },
-               hide: function(){
-                       this.previous(this.options.fade);
-               },
-               show: function(){
-                       this.previous(this.options.fade);
-               },
-               fade: function(to){
-                       if (!this.fadeFx) {
-                               this.win.setStyles({
-                                       opacity: 0,
-                                       display: 'block'
-                               });
-                               var opts = {
-                                       property: 'opacity',
-                                       duration: this.options.fadeDuration
-                               };
-                               if (this.options.fadeTransition) opts.transition = this.options.fadeTransition;
-                               this.fadeFx = new Fx.Tween(this.win, opts);
-                       }
-                       if (to > 0) {
-                               this.win.setStyle('display','block');
-                               this.position();
-                       }
-                       this.fadeFx.clearChain();
-                       this.fadeFx.start(to).chain(function (){
-                               if (to == 0) {
-                                       this.win.setStyle('display', 'none');
-                                       this.fireEvent('onClose');
-                               } else {
-                                       this.fireEvent('onDisplay');
-                               }
-                       }.bind(this));
-                       return this;
-               }
-       });
-}
-StickyWin.Fx = StickyWin;
-
-
-// Begin: Source/Types/Array.Extras.js
-/*
----
-
-script: Array.Extras.js
-
-name: Array.Extras
-
-description: Extends the Array native object to include useful methods to work with arrays.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-  - Sebastian Markbåge
-
-requires:
-  - Core/Array
-  - MooTools.More
-
-provides: [Array.Extras]
-
-...
-*/
-
-(function(nil){
-
-Array.implement({
-
-       min: function(){
-               return Math.min.apply(null, this);
-       },
-
-       max: function(){
-               return Math.max.apply(null, this);
-       },
-
-       average: function(){
-               return this.length ? this.sum() / this.length : 0;
-       },
-
-       sum: function(){
-               var result = 0, l = this.length;
-               if (l){
-                       while (l--) result += this[l];
-               }
-               return result;
-       },
-
-       unique: function(){
-               return [].combine(this);
-       },
-
-       shuffle: function(){
-               for (var i = this.length; i && --i;){
-                       var temp = this[i], r = Math.floor(Math.random() * ( i + 1 ));
-                       this[i] = this[r];
-                       this[r] = temp;
-               }
-               return this;
-       },
-
-       reduce: function(fn, value){
-               for (var i = 0, l = this.length; i < l; i++){
-                       if (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);
-               }
-               return value;
-       },
-
-       reduceRight: function(fn, value){
-               var i = this.length;
-               while (i--){
-                       if (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);
-               }
-               return value;
-       },
-
-       pluck: function(prop){
-               return this.map(function(item){
-                       return item[prop];
-               });
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Request/Request.HTML.js
-/*
----
-
-name: Request.HTML
-
-description: Extends the basic Request Class with additional methods for interacting with HTML responses.
-
-license: MIT-style license.
-
-requires: [Element, Request]
-
-provides: Request.HTML
-
-...
-*/
-
-Request.HTML = new Class({
-
-       Extends: Request,
-
-       options: {
-               update: false,
-               append: false,
-               evalScripts: true,
-               filter: false,
-               headers: {
-                       Accept: 'text/html, application/xml, text/xml, */*'
-               }
-       },
-
-       success: function(text){
-               var options = this.options, response = this.response;
-
-               response.html = text.stripScripts(function(script){
-                       response.javascript = script;
-               });
-
-               var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
-               if (match) response.html = match[1];
-               var temp = new Element('div').set('html', response.html);
-
-               response.tree = temp.childNodes;
-               response.elements = temp.getElements(options.filter || '*');
-
-               if (options.filter) response.tree = response.elements;
-               if (options.update){
-                       var update = document.id(options.update).empty();
-                       if (options.filter) update.adopt(response.elements);
-                       else update.set('html', response.html);
-               } else if (options.append){
-                       var append = document.id(options.append);
-                       if (options.filter) response.elements.reverse().inject(append);
-                       else append.adopt(temp.getChildren());
-               }
-               if (options.evalScripts) Browser.exec(response.javascript);
-
-               this.onSuccess(response.tree, response.elements, response.html, response.javascript);
-       }
-
-});
-
-Element.Properties.load = {
-
-       set: function(options){
-               var load = this.get('load').cancel();
-               load.setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var load = this.retrieve('load');
-               if (!load){
-                       load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
-                       this.store('load', load);
-               }
-               return load;
-       }
-
-};
-
-Element.implement({
-
-       load: function(){
-               this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
-               return this;
-       }
-
-});
-
-
-// Begin: Source/Layout/TabSwapper.js
-/*
----
-
-name: TabSwapper
-
-description: Handles the scripting for a common UI layout; the tabbed box.
-
-license: MIT-Style License
-
-requires: [Core/Element.Event, Core/Fx.Tween, Core/Fx.Morph, Core/Element.Dimensions, More/Element.Shortcuts, More/Element.Measure]
-
-provides: TabSwapper
-
-...
-*/
-var TabSwapper = new Class({
-       Implements: [Options, Events],
-       options: {
-               // initPanel: null,
-               // smooth: false,
-               // smoothSize: false,
-               // maxSize: null,
-               // onActive: function(){},
-               // onActiveAfterFx: function(){},
-               // onBackground: function(){}
-               // cookieName: null,
-               preventDefault: true,
-               selectedClass: 'tabSelected',
-               mouseoverClass: 'tabOver',
-               deselectedClass: '',
-               rearrangeDOM: true,
-               effectOptions: {
-                       duration: 500
-               },
-               cookieDays: 999
-       },
-       tabs: [],
-       sections: [],
-       clickers: [],
-       sectionFx: [],
-       initialize: function(options){
-               this.setOptions(options);
-               var prev = this.setup();
-               if (prev) return prev;
-               if (this.options.initPanel != null) this.show(this.options.initPanel);
-               else if (this.options.cookieName && this.recall()) this.show(this.recall().toInt());
-               else this.show(0);
-
-       },
-       setup: function(){
-               var opt = this.options,
-                   sections = $$(opt.sections),
-                   tabs = $$(opt.tabs);
-               if (tabs[0] && tabs[0].retrieve('tabSwapper')) return tabs[0].retrieve('tabSwapper');
-               var clickers = $$(opt.clickers);
-               tabs.each(function(tab, index){
-                       this.addTab(tab, sections[index], clickers[index], index);
-               }, this);
-       },
-       addTab: function(tab, section, clicker, index){
-               tab = document.id(tab); clicker = document.id(clicker); section = document.id(section);
-               //if the tab is already in the interface, just move it
-               if (this.tabs.indexOf(tab) >= 0 && tab.retrieve('tabbered')
-                        && this.tabs.indexOf(tab) != index && this.options.rearrangeDOM) {
-                       this.moveTab(this.tabs.indexOf(tab), index);
-                       return this;
-               }
-               //if the index isn't specified, put the tab at the end
-               if (index == null) index = this.tabs.length;
-               //if this isn't the first item, and there's a tab
-               //already in the interface at the index 1 less than this
-               //insert this after that one
-               if (index > 0 && this.tabs[index-1] && this.options.rearrangeDOM) {
-                       tab.inject(this.tabs[index-1], 'after');
-                       section.inject(this.tabs[index-1].retrieve('section'), 'after');
-               }
-               this.tabs.splice(index, 0, tab);
-               clicker = clicker || tab;
-
-               tab.addEvents({
-                       mouseout: function(){
-                               tab.removeClass(this.options.mouseoverClass);
-                       }.bind(this),
-                       mouseover: function(){
-                               tab.addClass(this.options.mouseoverClass);
-                       }.bind(this)
-               });
-
-               clicker.addEvent('click', function(e){
-                       if (this.options.preventDefault) e.preventDefault();
-                       this.show(index);
-               }.bind(this));
-
-               tab.store('tabbered', true);
-               tab.store('section', section);
-               tab.store('clicker', clicker);
-               this.hideSection(index);
-               return this;
-       },
-       removeTab: function(index){
-               var now = this.tabs[this.now];
-               if (this.now == index){
-                       if (index > 0) this.show(index - 1);
-                       else if (index < this.tabs.length) this.show(index + 1);
-               }
-               this.now = this.tabs.indexOf(now);
-               return this;
-       },
-       moveTab: function(from, to){
-               var tab = this.tabs[from];
-               var clicker = tab.retrieve('clicker');
-               var section = tab.retrieve('section');
-
-               var toTab = this.tabs[to];
-               var toClicker = toTab.retrieve('clicker');
-               var toSection = toTab.retrieve('section');
-
-               this.tabs.erase(tab).splice(to, 0, tab);
-
-               tab.inject(toTab, 'before');
-               clicker.inject(toClicker, 'before');
-               section.inject(toSection, 'before');
-               return this;
-       },
-       show: function(i){
-               if (this.now == null) {
-                       this.tabs.each(function(tab, idx){
-                               if (i != idx)
-                                       this.hideSection(idx);
-                       }, this);
-               }
-               this.showSection(i).save(i);
-               return this;
-       },
-       save: function(index){
-               if (this.options.cookieName)
-                       Cookie.write(this.options.cookieName, index, {duration:this.options.cookieDays});
-               return this;
-       },
-       recall: function(){
-               return (this.options.cookieName) ? Cookie.read(this.options.cookieName) : false;
-       },
-       hideSection: function(idx) {
-               var tab = this.tabs[idx];
-               if (!tab) return this;
-               var sect = tab.retrieve('section');
-               if (!sect) return this;
-               if (sect.getStyle('display') != 'none') {
-                       this.lastHeight = sect.getSize().y;
-                       sect.setStyle('display', 'none');
-                       tab.swapClass(this.options.selectedClass, this.options.deselectedClass);
-                       this.fireEvent('onBackground', [idx, sect, tab]);
-               }
-               return this;
-       },
-       showSection: function(idx) {
-               var tab = this.tabs[idx];
-               if (!tab) return this;
-               var sect = tab.retrieve('section');
-               if (!sect) return this;
-               var smoothOk = this.options.smooth && !Browser.ie;
-               if (this.now != idx) {
-                       if (!tab.retrieve('tabFx'))
-                               tab.store('tabFx', new Fx.Morph(sect, this.options.effectOptions));
-                       var overflow = sect.getStyle('overflow');
-                       var start = {
-                               display:'block',
-                               overflow: 'hidden'
-                       };
-                       if (smoothOk) start.opacity = 0;
-                       var effect = false;
-                       if (smoothOk) {
-                               effect = {opacity: 1};
-                       } else if (sect.getStyle('opacity').toInt() < 1) {
-                               sect.setStyle('opacity', 1);
-                               if (!this.options.smoothSize) this.fireEvent('onActiveAfterFx', [idx, sect, tab]);
-                       }
-                       if (this.options.smoothSize) {
-                               var size = sect.getDimensions().height;
-                               if (this.options.maxSize != null && this.options.maxSize < size)
-                                       size = this.options.maxSize;
-                               if (!effect) effect = {};
-                               effect.height = size;
-                       }
-                       if (this.now != null) this.hideSection(this.now);
-                       if (this.options.smoothSize && this.lastHeight) start.height = this.lastHeight;
-                       sect.setStyles(start);
-                       var finish = function(){
-                               this.fireEvent('onActiveAfterFx', [idx, sect, tab]);
-                               sect.setStyles({
-                                       height: this.options.maxSize == effect.height ? this.options.maxSize : "auto",
-                                       overflow: overflow
-                               });
-                               sect.getElements('input, textarea').setStyle('opacity', 1);
-                       }.bind(this);
-                       if (effect) {
-                               tab.retrieve('tabFx').start(effect).chain(finish);
-                       } else {
-                               finish();
-                       }
-                       this.now = idx;
-                       this.fireEvent('onActive', [idx, sect, tab]);
-               }
-               tab.swapClass(this.options.deselectedClass, this.options.selectedClass);
-               return this;
-       }
-});
-
-
-// Begin: Source/Element/Element.Forms.js
-/*
----
-
-script: Element.Forms.js
-
-name: Element.Forms
-
-description: Extends the Element native object to include methods useful in managing inputs.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element
-  - /String.Extras
-  - /MooTools.More
-
-provides: [Element.Forms]
-
-...
-*/
-
-Element.implement({
-
-       tidy: function(){
-               this.set('value', this.get('value').tidy());
-       },
-
-       getTextInRange: function(start, end){
-               return this.get('value').substring(start, end);
-       },
-
-       getSelectedText: function(){
-               if (this.setSelectionRange) return this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd());
-               return document.selection.createRange().text;
-       },
-
-       getSelectedRange: function(){
-               if (this.selectionStart != null){
-                       return {
-                               start: this.selectionStart,
-                               end: this.selectionEnd
-                       };
-               }
-
-               var pos = {
-                       start: 0,
-                       end: 0
-               };
-               var range = this.getDocument().selection.createRange();
-               if (!range || range.parentElement() != this) return pos;
-               var duplicate = range.duplicate();
-
-               if (this.type == 'text'){
-                       pos.start = 0 - duplicate.moveStart('character', -100000);
-                       pos.end = pos.start + range.text.length;
-               } else {
-                       var value = this.get('value');
-                       var offset = value.length;
-                       duplicate.moveToElementText(this);
-                       duplicate.setEndPoint('StartToEnd', range);
-                       if (duplicate.text.length) offset -= value.match(/[\n\r]*$/)[0].length;
-                       pos.end = offset - duplicate.text.length;
-                       duplicate.setEndPoint('StartToStart', range);
-                       pos.start = offset - duplicate.text.length;
-               }
-               return pos;
-       },
-
-       getSelectionStart: function(){
-               return this.getSelectedRange().start;
-       },
-
-       getSelectionEnd: function(){
-               return this.getSelectedRange().end;
-       },
-
-       setCaretPosition: function(pos){
-               if (pos == 'end') pos = this.get('value').length;
-               this.selectRange(pos, pos);
-               return this;
-       },
-
-       getCaretPosition: function(){
-               return this.getSelectedRange().start;
-       },
-
-       selectRange: function(start, end){
-               if (this.setSelectionRange){
-                       this.focus();
-                       this.setSelectionRange(start, end);
-               } else {
-                       var value = this.get('value');
-                       var diff = value.substr(start, end - start).replace(/\r/g, '').length;
-                       start = value.substr(0, start).replace(/\r/g, '').length;
-                       var range = this.createTextRange();
-                       range.collapse(true);
-                       range.moveEnd('character', start + diff);
-                       range.moveStart('character', start);
-                       range.select();
-               }
-               return this;
-       },
-
-       insertAtCursor: function(value, select){
-               var pos = this.getSelectedRange();
-               var text = this.get('value');
-               this.set('value', text.substring(0, pos.start) + value + text.substring(pos.end, text.length));
-               if (select !== false) this.selectRange(pos.start, pos.start + value.length);
-               else this.setCaretPosition(pos.start + value.length);
-               return this;
-       },
-
-       insertAroundCursor: function(options, select){
-               options = Object.append({
-                       before: '',
-                       defaultMiddle: '',
-                       after: ''
-               }, options);
-
-               var value = this.getSelectedText() || options.defaultMiddle;
-               var pos = this.getSelectedRange();
-               var text = this.get('value');
-
-               if (pos.start == pos.end){
-                       this.set('value', text.substring(0, pos.start) + options.before + value + options.after + text.substring(pos.end, text.length));
-                       this.selectRange(pos.start + options.before.length, pos.end + options.before.length + value.length);
-               } else {
-                       var current = text.substring(pos.start, pos.end);
-                       this.set('value', text.substring(0, pos.start) + options.before + current + options.after + text.substring(pos.end, text.length));
-                       var selStart = pos.start + options.before.length;
-                       if (select !== false) this.selectRange(selStart, selStart + current.length);
-                       else this.setCaretPosition(selStart + text.length);
-               }
-               return this;
-       }
-
-});
-
-
-// Begin: Source/Fx/Fx.Reveal.js
-/*
----
-
-script: Fx.Reveal.js
-
-name: Fx.Reveal
-
-description: Defines Fx.Reveal, a class that shows and hides elements with a transition.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Morph
-  - /Element.Shortcuts
-  - /Element.Measure
-
-provides: [Fx.Reveal]
-
-...
-*/
-
-(function(){
-
-
-var hideTheseOf = function(object){
-       var hideThese = object.options.hideInputs;
-       if (window.OverText){
-               var otClasses = [null];
-               OverText.each(function(ot){
-                       otClasses.include('.' + ot.options.labelClass);
-               });
-               if (otClasses) hideThese += otClasses.join(', ');
-       }
-       return (hideThese) ? object.element.getElements(hideThese) : null;
-};
-
-
-Fx.Reveal = new Class({
-
-       Extends: Fx.Morph,
-
-       options: {/*
-               onShow: function(thisElement){},
-               onHide: function(thisElement){},
-               onComplete: function(thisElement){},
-               heightOverride: null,
-               widthOverride: null,*/
-               link: 'cancel',
-               styles: ['padding', 'border', 'margin'],
-               transitionOpacity: !Browser.ie6,
-               mode: 'vertical',
-               display: function(){
-                       return this.element.get('tag') != 'tr' ? 'block' : 'table-row';
-               },
-               opacity: 1,
-               hideInputs: Browser.ie ? 'select, input, textarea, object, embed' : null
-       },
-
-       dissolve: function(){
-               if (!this.hiding && !this.showing){
-                       if (this.element.getStyle('display') != 'none'){
-                               this.hiding = true;
-                               this.showing = false;
-                               this.hidden = true;
-                               this.cssText = this.element.style.cssText;
-
-                               var startStyles = this.element.getComputedSize({
-                                       styles: this.options.styles,
-                                       mode: this.options.mode
-                               });
-                               if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity;
-
-                               var zero = {};
-                               Object.each(startStyles, function(style, name){
-                                       zero[name] = [style, 0];
-                               });
-
-                               this.element.setStyles({
-                                       display: Function.from(this.options.display).call(this),
-                                       overflow: 'hidden'
-                               });
-
-                               var hideThese = hideTheseOf(this);
-                               if (hideThese) hideThese.setStyle('visibility', 'hidden');
-
-                               this.$chain.unshift(function(){
-                                       if (this.hidden){
-                                               this.hiding = false;
-                                               this.element.style.cssText = this.cssText;
-                                               this.element.setStyle('display', 'none');
-                                               if (hideThese) hideThese.setStyle('visibility', 'visible');
-                                       }
-                                       this.fireEvent('hide', this.element);
-                                       this.callChain();
-                               }.bind(this));
-
-                               this.start(zero);
-                       } else {
-                               this.callChain.delay(10, this);
-                               this.fireEvent('complete', this.element);
-                               this.fireEvent('hide', this.element);
-                       }
-               } else if (this.options.link == 'chain'){
-                       this.chain(this.dissolve.bind(this));
-               } else if (this.options.link == 'cancel' && !this.hiding){
-                       this.cancel();
-                       this.dissolve();
-               }
-               return this;
-       },
-
-       reveal: function(){
-               if (!this.showing && !this.hiding){
-                       if (this.element.getStyle('display') == 'none'){
-                               this.hiding = false;
-                               this.showing = true;
-                               this.hidden = false;
-                               this.cssText = this.element.style.cssText;
-
-                               var startStyles;
-                               this.element.measure(function(){
-                                       startStyles = this.element.getComputedSize({
-                                               styles: this.options.styles,
-                                               mode: this.options.mode
-                                       });
-                               }.bind(this));
-                               if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt();
-                               if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt();
-                               if (this.options.transitionOpacity){
-                                       this.element.setStyle('opacity', 0);
-                                       startStyles.opacity = this.options.opacity;
-                               }
-
-                               var zero = {
-                                       height: 0,
-                                       display: Function.from(this.options.display).call(this)
-                               };
-                               Object.each(startStyles, function(style, name){
-                                       zero[name] = 0;
-                               });
-                               zero.overflow = 'hidden';
-
-                               this.element.setStyles(zero);
-
-                               var hideThese = hideTheseOf(this);
-                               if (hideThese) hideThese.setStyle('visibility', 'hidden');
-
-                               this.$chain.unshift(function(){
-                                       this.element.style.cssText = this.cssText;
-                                       this.element.setStyle('display', Function.from(this.options.display).call(this));
-                                       if (!this.hidden) this.showing = false;
-                                       if (hideThese) hideThese.setStyle('visibility', 'visible');
-                                       this.callChain();
-                                       this.fireEvent('show', this.element);
-                               }.bind(this));
-
-                               this.start(startStyles);
-                       } else {
-                               this.callChain();
-                               this.fireEvent('complete', this.element);
-                               this.fireEvent('show', this.element);
-                       }
-               } else if (this.options.link == 'chain'){
-                       this.chain(this.reveal.bind(this));
-               } else if (this.options.link == 'cancel' && !this.showing){
-                       this.cancel();
-                       this.reveal();
-               }
-               return this;
-       },
-
-       toggle: function(){
-               if (this.element.getStyle('display') == 'none'){
-                       this.reveal();
-               } else {
-                       this.dissolve();
-               }
-               return this;
-       },
-
-       cancel: function(){
-               this.parent.apply(this, arguments);
-               if (this.cssText != null) this.element.style.cssText = this.cssText;
-               this.hiding = false;
-               this.showing = false;
-               return this;
-       }
-
-});
-
-Element.Properties.reveal = {
-
-       set: function(options){
-               this.get('reveal').cancel().setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var reveal = this.retrieve('reveal');
-               if (!reveal){
-                       reveal = new Fx.Reveal(this);
-                       this.store('reveal', reveal);
-               }
-               return reveal;
-       }
-
-};
-
-Element.Properties.dissolve = Element.Properties.reveal;
-
-Element.implement({
-
-       reveal: function(options){
-               this.get('reveal').setOptions(options).reveal();
-               return this;
-       },
-
-       dissolve: function(options){
-               this.get('reveal').setOptions(options).dissolve();
-               return this;
-       },
-
-       nix: function(options){
-               var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject});
-               this.get('reveal').setOptions(options).dissolve().chain(function(){
-                       this[params.destroy ? 'destroy' : 'dispose']();
-               }.bind(this));
-               return this;
-       },
-
-       wink: function(){
-               var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject});
-               var reveal = this.get('reveal').setOptions(params.options);
-               reveal.reveal().chain(function(){
-                       (function(){
-                               reveal.dissolve();
-                       }).delay(params.duration || 2000);
-               });
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Layout/Collapsible.js
-/*
----
-name: Collapsible
-
-description: Enables a dom element to, when clicked, hide or show (it toggles) another dom element. Kind of an Accordion for one item.
-
-license: MIT-Style License
-
-requires: [Core/Element.Event, More/Fx.Reveal]
-
-provides: Collapsible
-...
-*/
-var Collapsible = new Class({
-       Extends: Fx.Reveal,
-       initialize: function(clicker, section, options) {
-               this.clicker = document.id(clicker);
-               this.section = document.id(section);
-               this.parent(this.section, options);
-               this.boundtoggle = this.toggle.bind(this);
-               this.attach();
-       },
-       attach: function(){
-               this.clicker.addEvent('click', this.boundtoggle);
-       },
-       detach: function(){
-               this.clicker.removeEvent('click', this.boundtoggle);
-       }
-});
-//legacy, this class originated w/ a typo. nice!
-var Collapsable = Collapsible;
-
-// Begin: Source/Utilities/Table.js
-/*
----
-name: Table
-description: LUA-Style table implementation.
-license: MIT-style license
-authors:
-  - Valerio Proietti
-requires: [Core/Array]
-provides: [Table]
-...
-*/
-
-(function(){
-
-var Table = this.Table = function(){
-
-       this.length = 0;
-       var keys = [],
-           values = [];
-       
-       this.set = function(key, value){
-               var index = keys.indexOf(key);
-               if (index == -1){
-                       var length = keys.length;
-                       keys[length] = key;
-                       values[length] = value;
-                       this.length++;
-               } else {
-                       values[index] = value;
-               }
-               return this;
-       };
-
-       this.get = function(key){
-               var index = keys.indexOf(key);
-               return (index == -1) ? null : values[index];
-       };
-
-       this.erase = function(key){
-               var index = keys.indexOf(key);
-               if (index != -1){
-                       this.length--;
-                       keys.splice(index, 1);
-                       return values.splice(index, 1)[0];
-               }
-               return null;
-       };
-
-       this.each = this.forEach = function(fn, bind){
-               for (var i = 0, l = this.length; i < l; i++) fn.call(bind, keys[i], values[i], this);
-       };
-       
-};
-
-if (this.Type) new Type('Table', Table);
-
-})();
-
-
-// Begin: Source/Element.Data.js
-/*
----
-name: Element.Data
-description: Stores data in HTML5 data properties
-provides: [Element.Data]
-requires: [Core/Element, Core/JSON]
-script: Element.Data.js
-
-...
-*/
-(function(){
-
-       JSON.isSecure = function(string){
-               //this verifies that the string is parsable JSON and not malicious (borrowed from JSON.js in MooTools, which in turn borrowed it from Crockford)
-               //this version is a little more permissive, as it allows single quoted attributes because forcing the use of double quotes
-               //is a pain when this stuff is used as HTML properties
-               return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '').replace(/'[^'\\\n\r]*'/g, ''));
-       };
-
-       Element.implement({
-               /*
-                       sets an HTML5 data property.
-                       arguments:
-                               name - (string) the data name to store; will be automatically prefixed with 'data-'.
-                               value - (string, number) the value to store.
-               */
-               setData: function(name, value){
-                       return this.set('data-' + name.hyphenate(), value);
-               },
-
-               getData: function(name, defaultValue){
-                       var value = this.get('data-' + name.hyphenate());
-                       if (value != undefined){
-                               return value;
-                       } else if (defaultValue != undefined){
-                               this.setData(name, defaultValue);
-                               return defaultValue;
-                       }
-               },
-
-               /* 
-                       arguments:
-                               name - (string) the data name to store; will be automatically prefixed with 'data-'
-                               value - (string, array, or object) if an object or array the object will be JSON encoded; otherwise stored as provided.
-               */
-               setJSONData: function(name, value){
-                       return this.setData(name, JSON.encode(value));
-               },
-
-               /*
-                       retrieves a property from HTML5 data property you specify
-               
-                       arguments:
-                               name - (retrieve) the data name to store; will be automatically prefixed with 'data-'
-                               strict - (boolean) if true, will set the JSON.decode's secure flag to true; otherwise the value is still tested but allows single quoted attributes.
-                               defaultValue - (string, array, or object) the value to set if no value is found (see storeData above)
-               */
-               getJSONData: function(name, strict, defaultValue){
-                       var value = this.get('data-' + name);
-                       if (value != undefined){
-                               if (value && JSON.isSecure(value)) {
-                                       return JSON.decode(value, strict);
-                               } else {
-                                       return value;
-                               }
-                       } else if (defaultValue != undefined){
-                               this.setJSONData(name, defaultValue);
-                               return defaultValue;
-                       }
-               }
-
-       });
-
-})();
-
-// Begin: Source/BehaviorAPI.js
-/*
----
-name: BehaviorAPI
-description: HTML getters for Behavior's API model.
-requires: [Core/Class, /Element.Data]
-provides: [BehaviorAPI]
-...
-*/
-
-
-(function(){
-       //see Docs/BehaviorAPI.md for documentation of public methods.
-
-       var reggy = /[^a-z0-9\-]/gi;
-
-       window.BehaviorAPI = new Class({
-               element: null,
-               prefix: '',
-               defaults: {},
-
-               initialize: function(element, prefix){
-                       this.element = element;
-                       this.prefix = prefix.toLowerCase().replace('.', '-', 'g').replace(reggy, '');
-               },
-
-               /******************
-                * PUBLIC METHODS
-                ******************/
-
-               get: function(/* name[, name, name, etc] */){
-                       if (arguments.length > 1) return this._getObj(Array.from(arguments));
-                       return this._getValue(arguments[0]);
-               },
-
-               getAs: function(/*returnType, name, defaultValue OR {name: returnType, name: returnType, etc}*/){
-                       if (typeOf(arguments[0]) == 'object') return this._getValuesAs.apply(this, arguments);
-                       return this._getValueAs.apply(this, arguments);
-               },
-
-               require: function(/* name[, name, name, etc] */){
-                       for (var i = 0; i < arguments.length; i++){
-                               if (this._getValue(arguments[i]) == undefined) throw new Error('Could not retrieve ' + this.prefix + '-' + arguments[i] + ' option from element.');
-                       }
-                       return this;
-               },
-
-               requireAs: function(returnType, name /* OR {name: returnType, name: returnType, etc}*/){
-                       var val;
-                       if (typeOf(arguments[0]) == 'object'){
-                               for (var objName in arguments[0]){
-                                       val = this._getValueAs(arguments[0][objName], objName);
-                                       if (val === undefined || val === null) throw new Error("Could not retrieve " + this.prefix + '-' + objName + " option from element.");
-                               }
-                       } else {
-                               val = this._getValueAs(returnType, name);
-                               if (val === undefined || val === null) throw new Error("Could not retrieve " + this.prefix + '-' + name + " option from element.");
-                       }
-                       return this;
-               },
-
-               setDefault: function(name, value /* OR {name: value, name: value, etc }*/){
-                       if (typeOf(arguments[0]) == 'object'){
-                               for (var objName in arguments[0]){
-                                       this.setDefault(objName, arguments[0][objName]);
-                               }
-                               return;
-                       }
-                       name = name.camelCase();
-                       this.defaults[name] = value;
-                       if (this._getValue(name) == null){
-                               var options = this._getOptions();
-                               options[name] = value;
-                       }
-                       return this;
-               },
-
-               refreshAPI: function(){
-                       delete this.options;
-                       this.setDefault(this.defaults);
-                       return;
-               },
-
-               /******************
-                * PRIVATE METHODS
-                ******************/
-
-               //given an array of names, returns an object of key/value pairs for each name
-               _getObj: function(names){
-                       var obj = {};
-                       names.each(function(name){
-                               var value = this._getValue(name);
-                               if (value !== undefined) obj[name] = value;
-                       }, this);
-                       return obj;
-               },
-               //gets the data-behaviorname-options object and parses it as JSON
-               _getOptions: function(){
-                       try {
-                               if (!this.options){
-                                       var options = this.element.getData(this.prefix + '-options', '{}');
-                                       if (options && options.substring(0,1) != '{') options = '{' + options + '}';
-                                       var isSecure = JSON.isSecure(options);
-                                       if (!isSecure) throw new Error('warning, options value for element is not parsable, check your JSON format for quotes, etc.');
-                                       this.options = isSecure ? JSON.decode(options) : {};
-                                       for (option in this.options) {
-                                               this.options[option.camelCase()] = this.options[option];
-                                       }
-                               }
-                       } catch (e){
-                               throw new Error('Could not get options from element; check your syntax. ' + this.prefix + '-options: "' + this.element.getData(this.prefix + '-options', '{}') + '"');
-                       }
-                       return this.options;
-               },
-               //given a name (string) returns the value for it
-               _getValue: function(name){
-                       name = name.camelCase();
-                       var options = this._getOptions();
-                       if (!options.hasOwnProperty(name)){
-                               var inline = this.element.getData(this.prefix + '-' + name.hyphenate());
-                               if (inline) options[name] = inline;
-                       }
-                       return options[name];
-               },
-               //given a Type and a name (string) returns the value for it coerced to that type if possible
-               //else returns the defaultValue or null
-               _getValueAs: function(returnType, name, defaultValue){
-                       var value = this._getValue(name);
-                       if (value == null || value == undefined) return defaultValue;
-                       var coerced = this._coerceFromString(returnType, value);
-                       if (coerced == null) throw new Error("Could not retrieve value '" + name + "' as the specified type. Its value is: " + value);
-                       return coerced;
-               },
-               //given an object of name/Type pairs, returns those as an object of name/value (as specified Type) pairs
-               _getValuesAs: function(obj){
-                       var returnObj = {};
-                       for (var name in obj){
-                               returnObj[name] = this._getValueAs(obj[name], name);
-                       }
-                       return returnObj;
-               },
-               //attempts to run a value through the JSON parser. If the result is not of that type returns null.
-               _coerceFromString: function(toType, value){
-                       if (typeOf(value) == 'string' && toType != String){
-                               if (JSON.isSecure(value)) value = JSON.decode(value);
-                       }
-                       if (instanceOf(value, toType)) return value;
-                       return null;
-               }
-       });
-
-})();
-
-// Begin: Source/Behavior.js
-/*
----
-name: Behavior
-description: Auto-instantiates widgets/classes based on parsed, declarative HTML.
-requires: [Core/Class.Extras, Core/Element.Event, Core/Selectors, More/Table, /Element.Data, /BehaviorAPI]
-provides: [Behavior]
-...
-*/
-
-(function(){
-
-       var getLog = function(method){
-               return function(){
-                       if (window.console && console[method]){
-                               if(console[method].apply) console[method].apply(console, arguments);
-                               else console[method](Array.from(arguments).join(' '));
-                       }
-               };
-       };
-
-       var PassMethods = new Class({
-               //pass a method pointer through to a filter
-               //by default the methods for add/remove events are passed to the filter
-               //pointed to this instance of behavior. you could use this to pass along
-               //other methods to your filters. For example, a method to close a popup
-               //for filters presented inside popups.
-               passMethod: function(method, fn){
-                       if (this.API.prototype[method]) throw new Error('Cannot overwrite API method ' + method + ' as it already exists');
-                       this.API.implement(method, fn);
-                       return this;
-               },
-
-               passMethods: function(methods){
-                       for (method in methods) this.passMethod(method, methods[method]);
-                       return this;
-               }
-
-       });
-
-       var spaceOrCommaRegex = /\s*,\s*|\s+/g;
-
-       BehaviorAPI.implement({
-               deprecate: function(deprecated, asJSON){
-                       var set,
-                           values = {};
-                       Object.each(deprecated, function(prop, key){
-                               var value = this.element[ asJSON ? 'getJSONData' : 'getData'](prop);
-                               if (value !== undefined){
-                                       set = true;
-                                       values[key] = value;
-                               }
-                       }, this);
-                       this.setDefault(values);
-                       return this;
-               }
-       });
-
-       this.Behavior = new Class({
-
-               Implements: [Options, Events, PassMethods],
-
-               options: {
-                       //by default, errors thrown by filters are caught; the onError event is fired.
-                       //set this to *true* to NOT catch these errors to allow them to be handled by the browser.
-                       // breakOnErrors: false,
-                       // container: document.body,
-
-                       //default error behavior when a filter cannot be applied
-                       onError: getLog('error'),
-                       onWarn: getLog('warn'),
-                       enableDeprecation: true,
-                       selector: '[data-behavior]'
-               },
-
-               initialize: function(options){
-                       this.setOptions(options);
-                       this.API = new Class({ Extends: BehaviorAPI });
-                       this.passMethods({
-                               getDelegator: this.getDelegator.bind(this),
-                               addEvent: this.addEvent.bind(this),
-                               removeEvent: this.removeEvent.bind(this),
-                               addEvents: this.addEvents.bind(this),
-                               removeEvents: this.removeEvents.bind(this),
-                               fireEvent: this.fireEvent.bind(this),
-                               applyFilters: this.apply.bind(this),
-                               applyFilter: this.applyFilter.bind(this),
-                               getContentElement: this.getContentElement.bind(this),
-                               cleanup: this.cleanup.bind(this),
-                               getContainerSize: function(){
-                                       return this.getContentElement().measure(function(){
-                                               return this.getSize();
-                                       });
-                               }.bind(this),
-                               error: function(){ this.fireEvent('error', arguments); }.bind(this),
-                               fail: function(){
-                                       var msg = Array.join(arguments, ' ');
-                                       throw new Error(msg);
-                               },
-                               warn: function(){
-                                       this.fireEvent('warn', arguments);
-                               }.bind(this)
-                       });
-               },
-
-               getDelegator: function(){
-                       return this.delegator;
-               },
-
-               setDelegator: function(delegator){
-                       if (!instanceOf(delegator, Delegator)) throw new Error('Behavior.setDelegator only accepts instances of Delegator.');
-                       this.delegator = delegator;
-                       return this;
-               },
-
-               getContentElement: function(){
-                       return this.options.container || document.body;
-               },
-
-               //Applies all the behavior filters for an element.
-               //container - (element) an element to apply the filters registered with this Behavior instance to.
-               //force - (boolean; optional) passed through to applyFilter (see it for docs)
-               apply: function(container, force){
-                 this._getElements(container).each(function(element){
-                               var plugins = [];
-                               element.getBehaviors().each(function(name){
-                                       var filter = this.getFilter(name);
-                                       if (!filter){
-                                               this.fireEvent('error', ['There is no filter registered with this name: ', name, element]);
-                                       } else {
-                                               var config = filter.config;
-                                               if (config.delay !== undefined){
-                                                       this.applyFilter.delay(filter.config.delay, this, [element, filter, force]);
-                                               } else if(config.delayUntil){
-                                                       this._delayFilterUntil(element, filter, force);
-                                               } else if(config.initializer){
-                                                       this._customInit(element, filter, force);
-                                               } else {
-                                                       plugins.append(this.applyFilter(element, filter, force, true));
-                                               }
-                                       }
-                               }, this);
-                               plugins.each(function(plugin){ plugin(); });
-                       }, this);
-                       return this;
-               },
-
-               _getElements: function(container){
-                       if (typeOf(this.options.selector) == 'function') return this.options.selector(container);
-                       else return document.id(container).getElements(this.options.selector);
-               },
-
-               //delays a filter until the event specified in filter.config.delayUntil is fired on the element
-               _delayFilterUntil: function(element, filter, force){
-                       var events = filter.config.delayUntil.split(','),
-                           attached = {},
-                           inited = false;
-                       var clear = function(){
-                               events.each(function(event){
-                                       element.removeEvent(event, attached[event]);
-                               });
-                               clear = function(){};
-                       };
-                       events.each(function(event){
-                               var init = function(e){
-                                       clear();
-                                       if (inited) return;
-                                       inited = true;
-                                       var setup = filter.setup;
-                                       filter.setup = function(element, api, _pluginResult){
-                                               api.event = e;
-                                               return setup.apply(filter, [element, api, _pluginResult]);
-                                       };
-                                       this.applyFilter(element, filter, force);
-                                       filter.setup = setup;
-                               }.bind(this);
-                               element.addEvent(event, init);
-                               attached[event] = init;
-                       }, this);
-               },
-
-               //runs custom initiliazer defined in filter.config.initializer
-               _customInit: function(element, filter, force){
-                       var api = new this.API(element, filter.name);
-                       api.runSetup = this.applyFilter.pass([element, filter, force], this);
-                       filter.config.initializer(element, api);
-               },
-
-               //Applies a specific behavior to a specific element.
-               //element - the element to which to apply the behavior
-               //filter - (object) a specific behavior filter, typically one registered with this instance or registered globally.
-               //force - (boolean; optional) apply the behavior to each element it matches, even if it was previously applied. Defaults to *false*.
-               //_returnPlugins - (boolean; optional; internal) if true, plugins are not rendered but instead returned as an array of functions
-               //_pluginTargetResult - (obj; optional internal) if this filter is a plugin for another, this is whatever that target filter returned
-               //                      (an instance of a class for example)
-               applyFilter: function(element, filter, force, _returnPlugins, _pluginTargetResult){
-                       var pluginsToReturn = [];
-                       if (this.options.breakOnErrors){
-                               pluginsToReturn = this._applyFilter.apply(this, arguments);
-                       } else {
-                               try {
-                                       pluginsToReturn = this._applyFilter.apply(this, arguments);
-                               } catch (e){
-                                       this.fireEvent('error', ['Could not apply the behavior ' + filter.name, e]);
-                               }
-                       }
-                       return _returnPlugins ? pluginsToReturn : this;
-               },
-
-               //see argument list above for applyFilter
-               _applyFilter: function(element, filter, force, _returnPlugins, _pluginTargetResult){
-                       var pluginsToReturn = [];
-                       element = document.id(element);
-                       //get the filters already applied to this element
-                       var applied = getApplied(element);
-                       //if this filter is not yet applied to the element, or we are forcing the filter
-                       if (!applied[filter.name] || force){
-                               //if it was previously applied, garbage collect it
-                               if (applied[filter.name]) applied[filter.name].cleanup(element);
-                               var api = new this.API(element, filter.name);
-
-                               //deprecated
-                               api.markForCleanup = filter.markForCleanup.bind(filter);
-                               api.onCleanup = function(fn){
-                                       filter.markForCleanup(element, fn);
-                               };
-
-                               if (filter.config.deprecated && this.options.enableDeprecation) api.deprecate(filter.config.deprecated);
-                               if (filter.config.deprecateAsJSON && this.options.enableDeprecation) api.deprecate(filter.config.deprecatedAsJSON, true);
-
-                               //deal with requirements and defaults
-                               if (filter.config.requireAs){
-                                       api.requireAs(filter.config.requireAs);
-                               } else if (filter.config.require){
-                                       api.require.apply(api, Array.from(filter.config.require));
-                               }
-
-                               if (filter.config.defaults) api.setDefault(filter.config.defaults);
-
-                               //apply the filter
-                               var result = filter.setup(element, api, _pluginTargetResult);
-                               if (filter.config.returns && !instanceOf(result, filter.config.returns)){
-                                       throw new Error("Filter " + filter.name + " did not return a valid instance.");
-                               }
-                               element.store('Behavior Filter result:' + filter.name, result);
-                               //and mark it as having been previously applied
-                               applied[filter.name] = filter;
-                               //apply all the plugins for this filter
-                               var plugins = this.getPlugins(filter.name);
-                               if (plugins){
-                                       for (var name in plugins){
-                                               if (_returnPlugins){
-                                                       pluginsToReturn.push(this.applyFilter.pass([element, plugins[name], force, null, result], this));
-                                               } else {
-                                                       this.applyFilter(element, plugins[name], force, null, result);
-                                               }
-                                       }
-                               }
-                       }
-                       return pluginsToReturn;
-               },
-
-               //given a name, returns a registered behavior
-               getFilter: function(name){
-                       return this._registered[name] || Behavior.getFilter(name);
-               },
-
-               getPlugins: function(name){
-                       return this._plugins[name] || Behavior._plugins[name];
-               },
-
-               //Garbage collects all applied filters for an element and its children.
-               //element - (*element*) container to cleanup
-               //ignoreChildren - (*boolean*; optional) if *true* only the element will be cleaned, otherwise the element and all the
-               //        children with filters applied will be cleaned. Defaults to *false*.
-               cleanup: function(element, ignoreChildren){
-                       element = document.id(element);
-                       var applied = getApplied(element);
-                       for (var filter in applied){
-                               applied[filter].cleanup(element);
-                               element.eliminate('Behavior Filter result:' + filter);
-                               delete applied[filter];
-                       }
-                       if (!ignoreChildren) this._getElements(element).each(this.cleanup, this);
-                       return this;
-               }
-
-       });
-
-       //Export these for use elsewhere (notabily: Delegator).
-       Behavior.getLog = getLog;
-       Behavior.PassMethods = PassMethods;
-
-
-       //Returns the applied behaviors for an element.
-       var getApplied = function(el){
-               return el.retrieve('_appliedBehaviors', {});
-       };
-
-       //Registers a behavior filter.
-       //name - the name of the filter
-       //fn - a function that applies the filter to the given element
-       //overwrite - (boolean) if true, will overwrite existing filter if one exists; defaults to false.
-       var addFilter = function(name, fn, overwrite){
-               if (!this._registered[name] || overwrite) this._registered[name] = new Behavior.Filter(name, fn);
-               else throw new Error('Could not add the Behavior filter "' + name  +'" as a previous trigger by that same name exists.');
-       };
-
-       var addFilters = function(obj, overwrite){
-               for (var name in obj){
-                       addFilter.apply(this, [name, obj[name], overwrite]);
-               }
-       };
-
-       //Registers a behavior plugin
-       //filterName - (*string*) the filter (or plugin) this is a plugin for
-       //name - (*string*) the name of this plugin
-       //setup - a function that applies the filter to the given element
-       var addPlugin = function(filterName, name, setup, overwrite){
-               if (!this._plugins[filterName]) this._plugins[filterName] = {};
-               if (!this._plugins[filterName][name] || overwrite) this._plugins[filterName][name] = new Behavior.Filter(name, setup);
-               else throw new Error('Could not add the Behavior filter plugin "' + name  +'" as a previous trigger by that same name exists.');
-       };
-
-       var addPlugins = function(obj, overwrite){
-               for (var name in obj){
-                       addPlugin.apply(this, [obj[name].fitlerName, obj[name].name, obj[name].setup], overwrite);
-               }
-       };
-
-       var setFilterDefaults = function(name, defaults){
-               var filter = this.getFilter(name);
-               if (!filter.config.defaults) filter.config.defaults = {};
-               Object.append(filter.config.defaults, defaults);
-       };
-
-       //Add methods to the Behavior namespace for global registration.
-       Object.append(Behavior, {
-               _registered: {},
-               _plugins: {},
-               addGlobalFilter: addFilter,
-               addGlobalFilters: addFilters,
-               addGlobalPlugin: addPlugin,
-               addGlobalPlugins: addPlugins,
-               setFilterDefaults: setFilterDefaults,
-               getFilter: function(name){
-                       return this._registered[name];
-               }
-       });
-       //Add methods to the Behavior class for instance registration.
-       Behavior.implement({
-               _registered: {},
-               _plugins: {},
-               addFilter: addFilter,
-               addFilters: addFilters,
-               addPlugin: addPlugin,
-               addPlugins: addPlugins,
-               setFilterDefaults: setFilterDefaults
-       });
-
-       //This class is an actual filter that, given an element, alters it with specific behaviors.
-       Behavior.Filter = new Class({
-
-               config: {
-                       /**
-                               returns: Foo,
-                               require: ['req1', 'req2'],
-                               //or
-                               requireAs: {
-                                       req1: Boolean,
-                                       req2: Number,
-                                       req3: String
-                               },
-                               defaults: {
-                                       opt1: false,
-                                       opt2: 2
-                               },
-                               //simple example:
-                               setup: function(element, API){
-                                       var kids = element.getElements(API.get('selector'));
-                                       //some validation still has to occur here
-                                       if (!kids.length) API.fail('there were no child elements found that match ', API.get('selector'));
-                                       if (kids.length < 2) API.warn("there weren't more than 2 kids that match", API.get('selector'));
-                                       var fooInstance = new Foo(kids, API.get('opt1', 'opt2'));
-                                       API.onCleanup(function(){
-                                               fooInstance.destroy();
-                                       });
-                                       return fooInstance;
-                               },
-                               delayUntil: 'mouseover',
-                               //OR
-                               delay: 100,
-                               //OR
-                               initializer: function(element, API){
-                                       element.addEvent('mouseover', API.runSetup); //same as specifying event
-                                       //or
-                                       API.runSetup.delay(100); //same as specifying delay
-                                       //or something completely esoteric
-                                       var timer = (function(){
-                                               if (element.hasClass('foo')){
-                                                       clearInterval(timer);
-                                                       API.runSetup();
-                                               }
-                                       }).periodical(100);
-                                       //or
-                                       API.addEvent('someBehaviorEvent', API.runSetup);
-                               });
-                               */
-               },
-
-               //Pass in an object with the following properties:
-               //name - the name of this filter
-               //setup - a function that applies the filter to the given element
-               initialize: function(name, setup){
-                       this.name = name;
-                       if (typeOf(setup) == "function"){
-                               this.setup = setup;
-                       } else {
-                               Object.append(this.config, setup);
-                               this.setup = this.config.setup;
-                       }
-                       this._cleanupFunctions = new Table();
-               },
-
-               //Stores a garbage collection pointer for a specific element.
-               //Example: if your filter enhances all the inputs in the container
-               //you might have a function that removes that enhancement for garbage collection.
-               //You would mark each input matched with its own cleanup function.
-               //NOTE: this MUST be the element passed to the filter - the element with this filters
-               //      name in its data-behavior property. I.E.:
-               //<form data-behavior="FormValidator">
-               //  <input type="text" name="email"/>
-               //</form>
-               //If this filter is FormValidator, you can mark the form for cleanup, but not, for example
-               //the input. Only elements that match this filter can be marked.
-               markForCleanup: function(element, fn){
-                       var functions = this._cleanupFunctions.get(element);
-                       if (!functions) functions = [];
-                       functions.include(fn);
-                       this._cleanupFunctions.set(element, functions);
-                       return this;
-               },
-
-               //Garbage collect a specific element.
-               //NOTE: this should be an element that has a data-behavior property that matches this filter.
-               cleanup: function(element){
-                       var marks = this._cleanupFunctions.get(element);
-                       if (marks){
-                               marks.each(function(fn){ fn(); });
-                               this._cleanupFunctions.erase(element);
-                       }
-                       return this;
-               }
-
-       });
-
-       Behavior.elementDataProperty = 'behavior';
-
-       Element.implement({
-
-               addBehaviorFilter: function(name){
-                       return this.setData(Behavior.elementDataProperty, this.getBehaviors().include(name).join(' '));
-               },
-
-               removeBehaviorFilter: function(name){
-                       return this.setData(Behavior.elementDataProperty, this.getBehaviors().erase(name).join(' '));
-               },
-
-               getBehaviors: function(){
-                       var filters = this.getData(Behavior.elementDataProperty);
-                       if (!filters) return [];
-                       return filters.trim().split(spaceOrCommaRegex);
-               },
-
-               hasBehavior: function(name){
-                       return this.getBehaviors().contains(name);
-               },
-
-               getBehaviorResult: function(name){
-                       return this.retrieve('Behavior Filter result:' + name);
-               }
-
-       });
-
-
-})();
-
-
-// Begin: Source/Drag/Drag.js
-/*
----
-
-script: Drag.js
-
-name: Drag
-
-description: The base Drag Class. Can be used to drag and resize Elements using mouse events.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Tom Occhinno
-  - Jan Kassens
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Drag]
-...
-
-*/
-
-var Drag = new Class({
-
-       Implements: [Events, Options],
-
-       options: {/*
-               onBeforeStart: function(thisElement){},
-               onStart: function(thisElement, event){},
-               onSnap: function(thisElement){},
-               onDrag: function(thisElement, event){},
-               onCancel: function(thisElement){},
-               onComplete: function(thisElement, event){},*/
-               snap: 6,
-               unit: 'px',
-               grid: false,
-               style: true,
-               limit: false,
-               handle: false,
-               invert: false,
-               preventDefault: false,
-               stopPropagation: false,
-               modifiers: {x: 'left', y: 'top'}
-       },
-
-       initialize: function(){
-               var params = Array.link(arguments, {
-                       'options': Type.isObject,
-                       'element': function(obj){
-                               return obj != null;
-                       }
-               });
-
-               this.element = document.id(params.element);
-               this.document = this.element.getDocument();
-               this.setOptions(params.options || {});
-               var htype = typeOf(this.options.handle);
-               this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;
-               this.mouse = {'now': {}, 'pos': {}};
-               this.value = {'start': {}, 'now': {}};
-
-               this.selection = (Browser.ie) ? 'selectstart' : 'mousedown';
-
-
-               if (Browser.ie && !Drag.ondragstartFixed){
-                       document.ondragstart = Function.from(false);
-                       Drag.ondragstartFixed = true;
-               }
-
-               this.bound = {
-                       start: this.start.bind(this),
-                       check: this.check.bind(this),
-                       drag: this.drag.bind(this),
-                       stop: this.stop.bind(this),
-                       cancel: this.cancel.bind(this),
-                       eventStop: Function.from(false)
-               };
-               this.attach();
-       },
-
-       attach: function(){
-               this.handles.addEvent('mousedown', this.bound.start);
-               return this;
-       },
-
-       detach: function(){
-               this.handles.removeEvent('mousedown', this.bound.start);
-               return this;
-       },
-
-       start: function(event){
-               var options = this.options;
-
-               if (event.rightClick) return;
-
-               if (options.preventDefault) event.preventDefault();
-               if (options.stopPropagation) event.stopPropagation();
-               this.mouse.start = event.page;
-
-               this.fireEvent('beforeStart', this.element);
-
-               var limit = options.limit;
-               this.limit = {x: [], y: []};
-
-               var z, coordinates;
-               for (z in options.modifiers){
-                       if (!options.modifiers[z]) continue;
-
-                       var style = this.element.getStyle(options.modifiers[z]);
-
-                       // Some browsers (IE and Opera) don't always return pixels.
-                       if (style && !style.match(/px$/)){
-                               if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent());
-                               style = coordinates[options.modifiers[z]];
-                       }
-
-                       if (options.style) this.value.now[z] = (style || 0).toInt();
-                       else this.value.now[z] = this.element[options.modifiers[z]];
-
-                       if (options.invert) this.value.now[z] *= -1;
-
-                       this.mouse.pos[z] = event.page[z] - this.value.now[z];
-
-                       if (limit && limit[z]){
-                               var i = 2;
-                               while (i--){
-                                       var limitZI = limit[z][i];
-                                       if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI;
-                               }
-                       }
-               }
-
-               if (typeOf(this.options.grid) == 'number') this.options.grid = {
-                       x: this.options.grid,
-                       y: this.options.grid
-               };
-
-               var events = {
-                       mousemove: this.bound.check,
-                       mouseup: this.bound.cancel
-               };
-               events[this.selection] = this.bound.eventStop;
-               this.document.addEvents(events);
-       },
-
-       check: function(event){
-               if (this.options.preventDefault) event.preventDefault();
-               var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
-               if (distance > this.options.snap){
-                       this.cancel();
-                       this.document.addEvents({
-                               mousemove: this.bound.drag,
-                               mouseup: this.bound.stop
-                       });
-                       this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
-               }
-       },
-
-       drag: function(event){
-               var options = this.options;
-
-               if (options.preventDefault) event.preventDefault();
-               this.mouse.now = event.page;
-
-               for (var z in options.modifiers){
-                       if (!options.modifiers[z]) continue;
-                       this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
-
-                       if (options.invert) this.value.now[z] *= -1;
-
-                       if (options.limit && this.limit[z]){
-                               if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){
-                                       this.value.now[z] = this.limit[z][1];
-                               } else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){
-                                       this.value.now[z] = this.limit[z][0];
-                               }
-                       }
-
-                       if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]);
-
-                       if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit);
-                       else this.element[options.modifiers[z]] = this.value.now[z];
-               }
-
-               this.fireEvent('drag', [this.element, event]);
-       },
-
-       cancel: function(event){
-               this.document.removeEvents({
-                       mousemove: this.bound.check,
-                       mouseup: this.bound.cancel
-               });
-               if (event){
-                       this.document.removeEvent(this.selection, this.bound.eventStop);
-                       this.fireEvent('cancel', this.element);
-               }
-       },
-
-       stop: function(event){
-               var events = {
-                       mousemove: this.bound.drag,
-                       mouseup: this.bound.stop
-               };
-               events[this.selection] = this.bound.eventStop;
-               this.document.removeEvents(events);
-               if (event) this.fireEvent('complete', [this.element, event]);
-       }
-
-});
-
-Element.implement({
-
-       makeResizable: function(options){
-               var drag = new Drag(this, Object.merge({
-                       modifiers: {
-                               x: 'width',
-                               y: 'height'
-                       }
-               }, options));
-
-               this.store('resizer', drag);
-               return drag.addEvent('drag', function(){
-                       this.fireEvent('resize', drag);
-               }.bind(this));
-       }
-
-});
-
-
-// Begin: Source/Drag/Drag.Move.js
-/*
----
-
-script: Drag.Move.js
-
-name: Drag.Move
-
-description: A Drag extension that provides support for the constraining of draggables to containers and droppables.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Tom Occhinno
-  - Jan Kassens
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Core/Element.Dimensions
-  - /Drag
-
-provides: [Drag.Move]
-
-...
-*/
-
-Drag.Move = new Class({
-
-       Extends: Drag,
-
-       options: {/*
-               onEnter: function(thisElement, overed){},
-               onLeave: function(thisElement, overed){},
-               onDrop: function(thisElement, overed, event){},*/
-               droppables: [],
-               container: false,
-               precalculate: false,
-               includeMargins: true,
-               checkDroppables: true
-       },
-
-       initialize: function(element, options){
-               this.parent(element, options);
-               element = this.element;
-
-               this.droppables = $$(this.options.droppables);
-               this.container = document.id(this.options.container);
-
-               if (this.container && typeOf(this.container) != 'element')
-                       this.container = document.id(this.container.getDocument().body);
-
-               if (this.options.style){
-                       if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){
-                               var parent = element.getOffsetParent(),
-                                       styles = element.getStyles('left', 'top');
-                               if (parent && (styles.left == 'auto' || styles.top == 'auto')){
-                                       element.setPosition(element.getPosition(parent));
-                               }
-                       }
-
-                       if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute');
-               }
-
-               this.addEvent('start', this.checkDroppables, true);
-               this.overed = null;
-       },
-
-       start: function(event){
-               if (this.container) this.options.limit = this.calculateLimit();
-
-               if (this.options.precalculate){
-                       this.positions = this.droppables.map(function(el){
-                               return el.getCoordinates();
-                       });
-               }
-
-               this.parent(event);
-       },
-
-       calculateLimit: function(){
-               var element = this.element,
-                       container = this.container,
-
-                       offsetParent = document.id(element.getOffsetParent()) || document.body,
-                       containerCoordinates = container.getCoordinates(offsetParent),
-                       elementMargin = {},
-                       elementBorder = {},
-                       containerMargin = {},
-                       containerBorder = {},
-                       offsetParentPadding = {};
-
-               ['top', 'right', 'bottom', 'left'].each(function(pad){
-                       elementMargin[pad] = element.getStyle('margin-' + pad).toInt();
-                       elementBorder[pad] = element.getStyle('border-' + pad).toInt();
-                       containerMargin[pad] = container.getStyle('margin-' + pad).toInt();
-                       containerBorder[pad] = container.getStyle('border-' + pad).toInt();
-                       offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();
-               }, this);
-
-               var width = element.offsetWidth + elementMargin.left + elementMargin.right,
-                       height = element.offsetHeight + elementMargin.top + elementMargin.bottom,
-                       left = 0,
-                       top = 0,
-                       right = containerCoordinates.right - containerBorder.right - width,
-                       bottom = containerCoordinates.bottom - containerBorder.bottom - height;
-
-               if (this.options.includeMargins){
-                       left += elementMargin.left;
-                       top += elementMargin.top;
-               } else {
-                       right += elementMargin.right;
-                       bottom += elementMargin.bottom;
-               }
-
-               if (element.getStyle('position') == 'relative'){
-                       var coords = element.getCoordinates(offsetParent);
-                       coords.left -= element.getStyle('left').toInt();
-                       coords.top -= element.getStyle('top').toInt();
-
-                       left -= coords.left;
-                       top -= coords.top;
-                       if (container.getStyle('position') != 'relative'){
-                               left += containerBorder.left;
-                               top += containerBorder.top;
-                       }
-                       right += elementMargin.left - coords.left;
-                       bottom += elementMargin.top - coords.top;
-
-                       if (container != offsetParent){
-                               left += containerMargin.left + offsetParentPadding.left;
-                               top += ((Browser.ie6 || Browser.ie7) ? 0 : containerMargin.top) + offsetParentPadding.top;
-                       }
-               } else {
-                       left -= elementMargin.left;
-                       top -= elementMargin.top;
-                       if (container != offsetParent){
-                               left += containerCoordinates.left + containerBorder.left;
-                               top += containerCoordinates.top + containerBorder.top;
-                       }
-               }
-
-               return {
-                       x: [left, right],
-                       y: [top, bottom]
-               };
-       },
-
-       getDroppableCoordinates: function(element){
-               var position = element.getCoordinates();
-               if (element.getStyle('position') == 'fixed'){
-                       var scroll = window.getScroll();
-                       position.left += scroll.x;
-                       position.right += scroll.x;
-                       position.top += scroll.y;
-                       position.bottom += scroll.y;
-               }
-               return position;
-       },
-
-       checkDroppables: function(){
-               var overed = this.droppables.filter(function(el, i){
-                       el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el);
-                       var now = this.mouse.now;
-                       return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
-               }, this).getLast();
-
-               if (this.overed != overed){
-                       if (this.overed) this.fireEvent('leave', [this.element, this.overed]);
-                       if (overed) this.fireEvent('enter', [this.element, overed]);
-                       this.overed = overed;
-               }
-       },
-
-       drag: function(event){
-               this.parent(event);
-               if (this.options.checkDroppables && this.droppables.length) this.checkDroppables();
-       },
-
-       stop: function(event){
-               this.checkDroppables();
-               this.fireEvent('drop', [this.element, this.overed, event]);
-               this.overed = null;
-               return this.parent(event);
-       }
-
-});
-
-Element.implement({
-
-       makeDraggable: function(options){
-               var drag = new Drag.Move(this, options);
-               this.store('dragger', drag);
-               return drag;
-       }
-
-});
-
-
-// Begin: Source/UI/StickyWin.Drag.js
-/*
----
-
-name: StickyWin.Drag
-
-description: Implements drag and resize functionaity into StickyWin.Fx. See StickyWin.Fx for the options.
-
-license: MIT-Style License
-
-requires: [More/Class.Refactor, More/Drag.Move, StickyWin]
-
-provides: StickyWin.Drag
-
-...
-*/
-StickyWin = Class.refactor(StickyWin, {
-       options: {
-               draggable: false,
-               dragOptions: {
-                       onComplete: function(){}
-               },
-               dragHandleSelector: '.dragHandle',
-               resizable: false,
-               resizeOptions: {
-                       onComplete: function(){}
-               },
-               resizeHandleSelector: ''
-       },
-       setContent: function(){
-               this.previous.apply(this, arguments);
-               if (this.options.draggable) this.makeDraggable();
-               if (this.options.resizable) this.makeResizable();
-               return this;
-       },
-       makeDraggable: function(){
-               var toggled = this.toggleVisible(true);
-               if (this.options.useIframeShim) {
-                       this.makeIframeShim();
-                       var onComplete = (this.options.dragOptions.onComplete);
-                       this.options.dragOptions.onComplete = function(){
-                               onComplete();
-                               this.shim.position();
-                       }.bind(this);
-               }
-               if (this.options.dragHandleSelector) {
-                       var handle = this.win.getElement(this.options.dragHandleSelector);
-                       if (handle) {
-                               handle.setStyle('cursor','move');
-                               this.options.dragOptions.handle = handle;
-                       }
-               }
-               this.win.makeDraggable(this.options.dragOptions);
-               if (toggled) this.toggleVisible(false);
-       },
-       makeResizable: function(){
-               var toggled = this.toggleVisible(true);
-               if (this.options.useIframeShim) {
-                       this.makeIframeShim();
-                       var onComplete = (this.options.resizeOptions.onComplete);
-                       this.options.resizeOptions.onComplete = function(){
-                               onComplete();
-                               this.shim.position();
-                       }.bind(this);
-               }
-               if (this.options.resizeHandleSelector) {
-                       var handle = this.win.getElement(this.options.resizeHandleSelector);
-                       if (handle) this.options.resizeOptions.handle = this.win.getElement(this.options.resizeHandleSelector);
-               }
-               this.win.makeResizable(this.options.resizeOptions);
-               if (toggled) this.toggleVisible(false);
-       },
-       toggleVisible: function(show){
-               if (!this.visible && show == null || show) {
-                       this.win.setStyles({
-                               display: 'block',
-                               opacity: 0
-                       });
-                       return true;
-               } else if (show != null && !show){
-                       this.win.setStyles({
-                               display: 'none',
-                               opacity: 1
-                       });
-                       return false;
-               }
-               return false;
-       }
-});
-StickyWin.Fx = StickyWin;
-
-// Begin: Source/Behaviors/Behavior.StickyWin.js
-/*
----
-name: Behavior.StickyWin
-description: Behaviors for StickyWin instances.
-provides: [Behavior.StickyWin]
-requires: [Behavior/Behavior, /StickyWin, /StickyWin.Modal, /StickyWin.Fx, /StickyWin.Drag, More/Array.Extras, More/Object.Extras]
-script: Behavior.Tabs.js
-
-...
-*/
-
-Behavior.addGlobalFilters({
-
-       'StickyWin.Modal': {
-               defaults: {
-                       destroyOnClose: true,
-                       closeOnClickOut: true,
-                       closeOnEsc: true,
-                       draggable: false,
-                       resizable: false
-               },
-               returns: StickyWin.Modal,
-               setup: function(element, api) {
-                       var flex = element.getElement('.flex'),
-                           height = api.getAs(Number, 'height') || (window.getSize().y * .9);
-
-                       if (flex){
-                               element.measure(function(){
-                                       var tmp = new Element('span', { styles: { display: 'none' }}).replaces(flex),
-                                           remainder = element.getSize().y;
-                                       var padding = ['padding-top', 'padding-bottom', 'margin-top', 'margin-bottom', 'border-top-width', 'border-bottom-width'].map(function(style){
-                                               return flex.getStyle(style).toInt();
-                                       }).sum();
-                                       flex.setStyle('max-height', height - remainder - padding);
-                                       flex.replaces(tmp);
-                               });
-                       }
-
-                       var options = Object.merge({
-                                       content: element
-                               },
-                               Object.cleanValues(
-                                       api.getAs({
-                                               closeClassName: String,
-                                               pinClassName: String,
-                                               className: String,
-                                               edge: String,
-                                               position: String,
-                                               offset: Object,
-                                               relativeTo: String,
-                                               width: Number,
-                                               height: Number,
-                                               timeout: Number,
-                                               destroyOnClose: Boolean,
-                                               closeOnClickOut: Boolean,
-                                               closeOnEsc: Boolean,
-                                               //modal options
-                                               maskOptions: Object,
-                                               //draggable options
-                                               draggable: Boolean,
-                                               dragHandleSelector: String,
-                                               resizable: Boolean,
-                                               resizeHandleSelector: String
-                                       })
-                               )
-                       );
-
-                       if (options.mask) options.closeOnClickOut = false;
-
-                       var sw = new StickyWin.Modal(options);
-                       api.onCleanup(function(){
-                               if (!sw.destroyed) sw.destroy();
-                       });
-                       sw.addEvent('destroy', function(){
-                               api.cleanup(element);
-                       });
-                       return sw;
-               }
-       }
-
-});
-
-
-// Begin: Source/Utilities/Color.js
-/*
----
-
-script: Color.js
-
-name: Color
-
-description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Array
-  - Core/String
-  - Core/Number
-  - Core/Hash
-  - Core/Function
-  - MooTools.More
-
-provides: [Color]
-
-...
-*/
-
-(function(){
-
-var Color = this.Color = new Type('Color', function(color, type){
-       if (arguments.length >= 3){
-               type = 'rgb'; color = Array.slice(arguments, 0, 3);
-       } else if (typeof color == 'string'){
-               if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);
-               else if (color.match(/hsb/)) color = color.hsbToRgb();
-               else color = color.hexToRgb(true);
-       }
-       type = type || 'rgb';
-       switch (type){
-               case 'hsb':
-                       var old = color;
-                       color = color.hsbToRgb();
-                       color.hsb = old;
-               break;
-               case 'hex': color = color.hexToRgb(true); break;
-       }
-       color.rgb = color.slice(0, 3);
-       color.hsb = color.hsb || color.rgbToHsb();
-       color.hex = color.rgbToHex();
-       return Object.append(color, this);
-});
-
-Color.implement({
-
-       mix: function(){
-               var colors = Array.slice(arguments);
-               var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50;
-               var rgb = this.slice();
-               colors.each(function(color){
-                       color = new Color(color);
-                       for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));
-               });
-               return new Color(rgb, 'rgb');
-       },
-
-       invert: function(){
-               return new Color(this.map(function(value){
-                       return 255 - value;
-               }));
-       },
-
-       setHue: function(value){
-               return new Color([value, this.hsb[1], this.hsb[2]], 'hsb');
-       },
-
-       setSaturation: function(percent){
-               return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');
-       },
-
-       setBrightness: function(percent){
-               return new Color([this.hsb[0], this.hsb[1], percent], 'hsb');
-       }
-
-});
-
-this.$RGB = function(r, g, b){
-       return new Color([r, g, b], 'rgb');
-};
-
-this.$HSB = function(h, s, b){
-       return new Color([h, s, b], 'hsb');
-};
-
-this.$HEX = function(hex){
-       return new Color(hex, 'hex');
-};
-
-Array.implement({
-
-       rgbToHsb: function(){
-               var red = this[0],
-                               green = this[1],
-                               blue = this[2],
-                               hue = 0;
-               var max = Math.max(red, green, blue),
-                               min = Math.min(red, green, blue);
-               var delta = max - min;
-               var brightness = max / 255,
-                               saturation = (max != 0) ? delta / max : 0;
-               if (saturation != 0){
-                       var rr = (max - red) / delta;
-                       var gr = (max - green) / delta;
-                       var br = (max - blue) / delta;
-                       if (red == max) hue = br - gr;
-                       else if (green == max) hue = 2 + rr - br;
-                       else hue = 4 + gr - rr;
-                       hue /= 6;
-                       if (hue < 0) hue++;
-               }
-               return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)];
-       },
-
-       hsbToRgb: function(){
-               var br = Math.round(this[2] / 100 * 255);
-               if (this[1] == 0){
-                       return [br, br, br];
-               } else {
-                       var hue = this[0] % 360;
-                       var f = hue % 60;
-                       var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
-                       var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);
-                       var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255);
-                       switch (Math.floor(hue / 60)){
-                               case 0: return [br, t, p];
-                               case 1: return [q, br, p];
-                               case 2: return [p, br, t];
-                               case 3: return [p, q, br];
-                               case 4: return [t, p, br];
-                               case 5: return [br, p, q];
-                       }
-               }
-               return false;
-       }
-
-});
-
-String.implement({
-
-       rgbToHsb: function(){
-               var rgb = this.match(/\d{1,3}/g);
-               return (rgb) ? rgb.rgbToHsb() : null;
-       },
-
-       hsbToRgb: function(){
-               var hsb = this.match(/\d{1,3}/g);
-               return (hsb) ? hsb.hsbToRgb() : null;
-       }
-
-});
-
-})();
-
-
-
-// Begin: Source/Class/Events.Pseudos.js
-/*
----
-
-name: Events.Pseudos
-
-description: Adds the functionality to add pseudo events
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Core/Class.Extras, Core/Slick.Parser, More/MooTools.More]
-
-provides: [Events.Pseudos]
-
-...
-*/
-
-(function(){
-
-Events.Pseudos = function(pseudos, addEvent, removeEvent){
-
-       var storeKey = '_monitorEvents:';
-
-       var storageOf = function(object){
-               return {
-                       store: object.store ? function(key, value){
-                               object.store(storeKey + key, value);
-                       } : function(key, value){
-                               (object._monitorEvents || (object._monitorEvents = {}))[key] = value;
-                       },
-                       retrieve: object.retrieve ? function(key, dflt){
-                               return object.retrieve(storeKey + key, dflt);
-                       } : function(key, dflt){
-                               if (!object._monitorEvents) return dflt;
-                               return object._monitorEvents[key] || dflt;
-                       }
-               };
-       };
-
-       var splitType = function(type){
-               if (type.indexOf(':') == -1 || !pseudos) return null;
-
-               var parsed = Slick.parse(type).expressions[0][0],
-                       parsedPseudos = parsed.pseudos,
-                       l = parsedPseudos.length,
-                       splits = [];
-
-               while (l--){
-                       var pseudo = parsedPseudos[l].key,
-                               listener = pseudos[pseudo];
-                       if (listener != null) splits.push({
-                               event: parsed.tag,
-                               value: parsedPseudos[l].value,
-                               pseudo: pseudo,
-                               original: type,
-                               listener: listener
-                       });
-               }
-               return splits.length ? splits : null;
-       };
-
-       return {
-
-               addEvent: function(type, fn, internal){
-                       var split = splitType(type);
-                       if (!split) return addEvent.call(this, type, fn, internal);
-
-                       var storage = storageOf(this),
-                               events = storage.retrieve(type, []),
-                               eventType = split[0].event,
-                               args = Array.slice(arguments, 2),
-                               stack = fn,
-                               self = this;
-
-                       split.each(function(item){
-                               var listener = item.listener,
-                                       stackFn = stack;
-                               if (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')';
-                               else stack = function(){
-                                       listener.call(self, item, stackFn, arguments, stack);
-                               };
-                       });
-
-                       events.include({type: eventType, event: fn, monitor: stack});
-                       storage.store(type, events);
-
-                       if (type != eventType) addEvent.apply(this, [type, fn].concat(args));
-                       return addEvent.apply(this, [eventType, stack].concat(args));
-               },
-
-               removeEvent: function(type, fn){
-                       var split = splitType(type);
-                       if (!split) return removeEvent.call(this, type, fn);
-
-                       var storage = storageOf(this),
-                               events = storage.retrieve(type);
-                       if (!events) return this;
-
-                       var args = Array.slice(arguments, 2);
-
-                       removeEvent.apply(this, [type, fn].concat(args));
-                       events.each(function(monitor, i){
-                               if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args));
-                               delete events[i];
-                       }, this);
-
-                       storage.store(type, events);
-                       return this;
-               }
-
-       };
-
-};
-
-var pseudos = {
-
-       once: function(split, fn, args, monitor){
-               fn.apply(this, args);
-               this.removeEvent(split.event, monitor)
-                       .removeEvent(split.original, fn);
-       },
-
-       throttle: function(split, fn, args){
-               if (!fn._throttled){
-                       fn.apply(this, args);
-                       fn._throttled = setTimeout(function(){
-                               fn._throttled = false;
-                       }, split.value || 250);
-               }
-       },
-
-       pause: function(split, fn, args){
-               clearTimeout(fn._pause);
-               fn._pause = fn.delay(split.value || 250, this, args);
-       }
-
-};
-
-Events.definePseudo = function(key, listener){
-       pseudos[key] = listener;
-       return this;
-};
-
-Events.lookupPseudo = function(key){
-       return pseudos[key];
-};
-
-var proto = Events.prototype;
-Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));
-
-['Request', 'Fx'].each(function(klass){
-       if (this[klass]) this[klass].implement(Events.prototype);
-});
-
-})();
-
-
-// Begin: Source/Element/Element.Event.Pseudos.js
-/*
----
-
-name: Element.Event.Pseudos
-
-description: Adds the functionality to add pseudo events for Elements
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos]
-
-provides: [Element.Event.Pseudos, Element.Delegation]
-
-...
-*/
-
-(function(){
-
-var pseudos = {relay: false},
-       copyFromEvents = ['once', 'throttle', 'pause'],
-       count = copyFromEvents.length;
-
-while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]);
-
-DOMEvent.definePseudo = function(key, listener){
-       pseudos[key] = listener;
-       return this;
-};
-
-var proto = Element.prototype;
-[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));
-
-})();
-
-
-// Begin: Source/Element/Element.Event.Pseudos.Keys.js
-/*
----
-
-name: Element.Event.Pseudos.Keys
-
-description: Adds functionality fire events if certain keycombinations are pressed
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Element.Event.Pseudos]
-
-provides: [Element.Event.Pseudos.Keys]
-
-...
-*/
-
-(function(){
-
-var keysStoreKey = '$moo:keys-pressed',
-       keysKeyupStoreKey = '$moo:keys-keyup';
-
-
-DOMEvent.definePseudo('keys', function(split, fn, args){
-
-       var event = args[0],
-               keys = [],
-               pressed = this.retrieve(keysStoreKey, []);
-
-       keys.append(split.value.replace('++', function(){
-               keys.push('+'); // shift++ and shift+++a
-               return '';
-       }).split('+'));
-
-       pressed.include(event.key);
-
-       if (keys.every(function(key){
-               return pressed.contains(key);
-       })) fn.apply(this, args);
-
-       this.store(keysStoreKey, pressed);
-
-       if (!this.retrieve(keysKeyupStoreKey)){
-               var keyup = function(event){
-                       (function(){
-                               pressed = this.retrieve(keysStoreKey, []).erase(event.key);
-                               this.store(keysStoreKey, pressed);
-                       }).delay(0, this); // Fix for IE
-               };
-               this.store(keysKeyupStoreKey, keyup).addEvent('keyup', keyup);
-       }
-
-});
-
-DOMEvent.defineKeys({
-       '16': 'shift',
-       '17': 'control',
-       '18': 'alt',
-       '20': 'capslock',
-       '33': 'pageup',
-       '34': 'pagedown',
-       '35': 'end',
-       '36': 'home',
-       '144': 'numlock',
-       '145': 'scrolllock',
-       '186': ';',
-       '187': '=',
-       '188': ',',
-       '190': '.',
-       '191': '/',
-       '192': '`',
-       '219': '[',
-       '220': '\\',
-       '221': ']',
-       '222': "'",
-       '107': '+'
-}).defineKey(Browser.firefox ? 109 : 189, '-');
-
-})();
-
-
-// Begin: Source/Interface/Keyboard.js
-/*
----
-
-script: Keyboard.js
-
-name: Keyboard
-
-description: KeyboardEvents used to intercept events on a class for keyboard and format modifiers in a specific order so as to make alt+shift+c the same as shift+alt+c.
-
-license: MIT-style license
-
-authors:
-  - Perrin Westrich
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Element.Event.Pseudos.Keys
-
-provides: [Keyboard]
-
-...
-*/
-
-(function(){
-
-       var Keyboard = this.Keyboard = new Class({
-
-               Extends: Events,
-
-               Implements: [Options],
-
-               options: {/*
-                       onActivate: function(){},
-                       onDeactivate: function(){},*/
-                       defaultEventType: 'keydown',
-                       active: false,
-                       manager: null,
-                       events: {},
-                       nonParsedEvents: ['activate', 'deactivate', 'onactivate', 'ondeactivate', 'changed', 'onchanged']
-               },
-
-               initialize: function(options){
-                       if (options && options.manager){
-                               this._manager = options.manager;
-                               delete options.manager;
-                       }
-                       this.setOptions(options);
-                       this._setup();
-               },
-
-               addEvent: function(type, fn, internal){
-                       return this.parent(Keyboard.parse(type, this.options.defaultEventType, this.options.nonParsedEvents), fn, internal);
-               },
-
-               removeEvent: function(type, fn){
-                       return this.parent(Keyboard.parse(type, this.options.defaultEventType, this.options.nonParsedEvents), fn);
-               },
-
-               toggleActive: function(){
-                       return this[this.isActive() ? 'deactivate' : 'activate']();
-               },
-
-               activate: function(instance){
-                       if (instance){
-                               if (instance.isActive()) return this;
-                               //if we're stealing focus, store the last keyboard to have it so the relinquish command works
-                               if (this._activeKB && instance != this._activeKB){
-                                       this.previous = this._activeKB;
-                                       this.previous.fireEvent('deactivate');
-                               }
-                               //if we're enabling a child, assign it so that events are now passed to it
-                               this._activeKB = instance.fireEvent('activate');
-                               Keyboard.manager.fireEvent('changed');
-                       } else if (this._manager){
-                               //else we're enabling ourselves, we must ask our parent to do it for us
-                               this._manager.activate(this);
-                       }
-                       return this;
-               },
-
-               isActive: function(){
-                       return this._manager ? (this._manager._activeKB == this) : (Keyboard.manager == this);
-               },
-
-               deactivate: function(instance){
-                       if (instance){
-                               if (instance === this._activeKB){
-                                       this._activeKB = null;
-                                       instance.fireEvent('deactivate');
-                                       Keyboard.manager.fireEvent('changed');
-                               }
-                       } else if (this._manager){
-                               this._manager.deactivate(this);
-                       }
-                       return this;
-               },
-
-               relinquish: function(){
-                       if (this.isActive() && this._manager && this._manager.previous) this._manager.activate(this._manager.previous);
-                       else this.deactivate();
-                       return this;
-               },
-
-               //management logic
-               manage: function(instance){
-                       if (instance._manager) instance._manager.drop(instance);
-                       this._instances.push(instance);
-                       instance._manager = this;
-                       if (!this._activeKB) this.activate(instance);
-                       return this;
-               },
-
-               drop: function(instance){
-                       instance.relinquish();
-                       this._instances.erase(instance);
-                       if (this._activeKB == instance){
-                               if (this.previous && this._instances.contains(this.previous)) this.activate(this.previous);
-                               else this._activeKB = this._instances[0];
-                       }
-                       return this;
-               },
-
-               trace: function(){
-                       Keyboard.trace(this);
-               },
-
-               each: function(fn){
-                       Keyboard.each(this, fn);
-               },
-
-               /*
-                       PRIVATE METHODS
-               */
-
-               _instances: [],
-
-               _disable: function(instance){
-                       if (this._activeKB == instance) this._activeKB = null;
-               },
-
-               _setup: function(){
-                       this.addEvents(this.options.events);
-                       //if this is the root manager, nothing manages it
-                       if (Keyboard.manager && !this._manager) Keyboard.manager.manage(this);
-                       if (this.options.active) this.activate();
-                       else this.relinquish();
-               },
-
-               _handle: function(event, type){
-                       //Keyboard.stop(event) prevents key propagation
-                       if (event.preventKeyboardPropagation) return;
-
-                       var bubbles = !!this._manager;
-                       if (bubbles && this._activeKB){
-                               this._activeKB._handle(event, type);
-                               if (event.preventKeyboardPropagation) return;
-                       }
-                       this.fireEvent(type, event);
-
-                       if (!bubbles && this._activeKB) this._activeKB._handle(event, type);
-               }
-
-       });
-
-       var parsed = {};
-       var modifiers = ['shift', 'control', 'alt', 'meta'];
-       var regex = /^(?:shift|control|ctrl|alt|meta)$/;
-
-       Keyboard.parse = function(type, eventType, ignore){
-               if (ignore && ignore.contains(type.toLowerCase())) return type;
-
-               type = type.toLowerCase().replace(/^(keyup|keydown):/, function($0, $1){
-                       eventType = $1;
-                       return '';
-               });
-
-               if (!parsed[type]){
-                       var key, mods = {};
-                       type.split('+').each(function(part){
-                               if (regex.test(part)) mods[part] = true;
-                               else key = part;
-                       });
-
-                       mods.control = mods.control || mods.ctrl; // allow both control and ctrl
-
-                       var keys = [];
-                       modifiers.each(function(mod){
-                               if (mods[mod]) keys.push(mod);
-                       });
-
-                       if (key) keys.push(key);
-                       parsed[type] = keys.join('+');
-               }
-
-               return eventType + ':keys(' + parsed[type] + ')';
-       };
-
-       Keyboard.each = function(keyboard, fn){
-               var current = keyboard || Keyboard.manager;
-               while (current){
-                       fn.run(current);
-                       current = current._activeKB;
-               }
-       };
-
-       Keyboard.stop = function(event){
-               event.preventKeyboardPropagation = true;
-       };
-
-       Keyboard.manager = new Keyboard({
-               active: true
-       });
-
-       Keyboard.trace = function(keyboard){
-               keyboard = keyboard || Keyboard.manager;
-               var hasConsole = window.console && console.log;
-               if (hasConsole) console.log('the following items have focus: ');
-               Keyboard.each(keyboard, function(current){
-                       if (hasConsole) console.log(document.id(current.widget) || current.wiget || current);
-               });
-       };
-
-       var handler = function(event){
-               var keys = [];
-               modifiers.each(function(mod){
-                       if (event[mod]) keys.push(mod);
-               });
-
-               if (!regex.test(event.key)) keys.push(event.key);
-               Keyboard.manager._handle(event, event.type + ':keys(' + keys.join('+') + ')');
-       };
-
-       document.addEvents({
-               'keyup': handler,
-               'keydown': handler
-       });
-
-})();
-
-
-// Begin: Source/Interface/Keyboard.Extras.js
-/*
----
-
-script: Keyboard.Extras.js
-
-name: Keyboard.Extras
-
-description: Enhances Keyboard by adding the ability to name and describe keyboard shortcuts, and the ability to grab shortcuts by name and bind the shortcut to different keys.
-
-license: MIT-style license
-
-authors:
-  - Perrin Westrich
-
-requires:
-  - /Keyboard
-  - /MooTools.More
-
-provides: [Keyboard.Extras]
-
-...
-*/
-Keyboard.prototype.options.nonParsedEvents.combine(['rebound', 'onrebound']);
-
-Keyboard.implement({
-
-       /*
-               shortcut should be in the format of:
-               {
-                       'keys': 'shift+s', // the default to add as an event.
-                       'description': 'blah blah blah', // a brief description of the functionality.
-                       'handler': function(){} // the event handler to run when keys are pressed.
-               }
-       */
-       addShortcut: function(name, shortcut){
-               this._shortcuts = this._shortcuts || [];
-               this._shortcutIndex = this._shortcutIndex || {};
-
-               shortcut.getKeyboard = Function.from(this);
-               shortcut.name = name;
-               this._shortcutIndex[name] = shortcut;
-               this._shortcuts.push(shortcut);
-               if (shortcut.keys) this.addEvent(shortcut.keys, shortcut.handler);
-               return this;
-       },
-
-       addShortcuts: function(obj){
-               for (var name in obj) this.addShortcut(name, obj[name]);
-               return this;
-       },
-
-       removeShortcut: function(name){
-               var shortcut = this.getShortcut(name);
-               if (shortcut && shortcut.keys){
-                       this.removeEvent(shortcut.keys, shortcut.handler);
-                       delete this._shortcutIndex[name];
-                       this._shortcuts.erase(shortcut);
-               }
-               return this;
-       },
-
-       removeShortcuts: function(names){
-               names.each(this.removeShortcut, this);
-               return this;
-       },
-
-       getShortcuts: function(){
-               return this._shortcuts || [];
-       },
-
-       getShortcut: function(name){
-               return (this._shortcutIndex || {})[name];
-       }
-
-});
-
-Keyboard.rebind = function(newKeys, shortcuts){
-       Array.from(shortcuts).each(function(shortcut){
-               shortcut.getKeyboard().removeEvent(shortcut.keys, shortcut.handler);
-               shortcut.getKeyboard().addEvent(newKeys, shortcut.handler);
-               shortcut.keys = newKeys;
-               shortcut.getKeyboard().fireEvent('rebound');
-       });
-};
-
-
-Keyboard.getActiveShortcuts = function(keyboard){
-       var activeKBS = [], activeSCS = [];
-       Keyboard.each(keyboard, [].push.bind(activeKBS));
-       activeKBS.each(function(kb){ activeSCS.extend(kb.getShortcuts()); });
-       return activeSCS;
-};
-
-Keyboard.getShortcut = function(name, keyboard, opts){
-       opts = opts || {};
-       var shortcuts = opts.many ? [] : null,
-               set = opts.many ? function(kb){
-                               var shortcut = kb.getShortcut(name);
-                               if (shortcut) shortcuts.push(shortcut);
-                       } : function(kb){
-                               if (!shortcuts) shortcuts = kb.getShortcut(name);
-                       };
-       Keyboard.each(keyboard, set);
-       return shortcuts;
-};
-
-Keyboard.getShortcuts = function(name, keyboard){
-       return Keyboard.getShortcut(name, keyboard, { many: true });
-};
-
-
-// Begin: Source/Locale/Locale.js
-/*
----
-
-script: Locale.js
-
-name: Locale
-
-description: Provides methods for localization.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Arian Stolwijk
-
-requires:
-  - Core/Events
-  - /Object.Extras
-  - /MooTools.More
-
-provides: [Locale, Lang]
-
-...
-*/
-
-(function(){
-
-var current = null,
-       locales = {},
-       inherits = {};
-
-var getSet = function(set){
-       if (instanceOf(set, Locale.Set)) return set;
-       else return locales[set];
-};
-
-var Locale = this.Locale = {
-
-       define: function(locale, set, key, value){
-               var name;
-               if (instanceOf(locale, Locale.Set)){
-                       name = locale.name;
-                       if (name) locales[name] = locale;
-               } else {
-                       name = locale;
-                       if (!locales[name]) locales[name] = new Locale.Set(name);
-                       locale = locales[name];
-               }
-
-               if (set) locale.define(set, key, value);
-
-               /*<1.2compat>*/
-               if (set == 'cascade') return Locale.inherit(name, key);
-               /*</1.2compat>*/
-
-               if (!current) current = locale;
-
-               return locale;
-       },
-
-       use: function(locale){
-               locale = getSet(locale);
-
-               if (locale){
-                       current = locale;
-
-                       this.fireEvent('change', locale);
-
-                       /*<1.2compat>*/
-                       this.fireEvent('langChange', locale.name);
-                       /*</1.2compat>*/
-               }
-
-               return this;
-       },
-
-       getCurrent: function(){
-               return current;
-       },
-
-       get: function(key, args){
-               return (current) ? current.get(key, args) : '';
-       },
-
-       inherit: function(locale, inherits, set){
-               locale = getSet(locale);
-
-               if (locale) locale.inherit(inherits, set);
-               return this;
-       },
-
-       list: function(){
-               return Object.keys(locales);
-       }
-
-};
-
-Object.append(Locale, new Events);
-
-Locale.Set = new Class({
-
-       sets: {},
-
-       inherits: {
-               locales: [],
-               sets: {}
-       },
-
-       initialize: function(name){
-               this.name = name || '';
-       },
-
-       define: function(set, key, value){
-               var defineData = this.sets[set];
-               if (!defineData) defineData = {};
-
-               if (key){
-                       if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
-                       else defineData[key] = value;
-               }
-               this.sets[set] = defineData;
-
-               return this;
-       },
-
-       get: function(key, args, _base){
-               var value = Object.getFromPath(this.sets, key);
-               if (value != null){
-                       var type = typeOf(value);
-                       if (type == 'function') value = value.apply(null, Array.from(args));
-                       else if (type == 'object') value = Object.clone(value);
-                       return value;
-               }
-
-               // get value of inherited locales
-               var index = key.indexOf('.'),
-                       set = index < 0 ? key : key.substr(0, index),
-                       names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
-               if (!_base) _base = [];
-
-               for (var i = 0, l = names.length; i < l; i++){
-                       if (_base.contains(names[i])) continue;
-                       _base.include(names[i]);
-
-                       var locale = locales[names[i]];
-                       if (!locale) continue;
-
-                       value = locale.get(key, args, _base);
-                       if (value != null) return value;
-               }
-
-               return '';
-       },
-
-       inherit: function(names, set){
-               names = Array.from(names);
-
-               if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
-
-               var l = names.length;
-               while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
-
-               return this;
-       }
-
-});
-
-/*<1.2compat>*/
-var lang = MooTools.lang = {};
-
-Object.append(lang, Locale, {
-       setLanguage: Locale.use,
-       getCurrentLanguage: function(){
-               var current = Locale.getCurrent();
-               return (current) ? current.name : null;
-       },
-       set: function(){
-               Locale.define.apply(this, arguments);
-               return this;
-       },
-       get: function(set, key, args){
-               if (key) set += '.' + key;
-               return Locale.get(set, args);
-       }
-});
-/*</1.2compat>*/
-
-})();
-
-
-// Begin: Source/Locale/Locale.en-US.Number.js
-/*
----
-
-name: Locale.en-US.Number
-
-description: Number messages for US English.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - /Locale
-
-provides: [Locale.en-US.Number]
-
-...
-*/
-
-Locale.define('en-US', 'Number', {
-
-       decimal: '.',
-       group: ',',
-
-/*     Commented properties are the defaults for Number.format
-       decimals: 0,
-       precision: 0,
-       scientific: null,
-
-       prefix: null,
-       suffic: null,
-
-       // Negative/Currency/percentage will mixin Number
-       negative: {
-               prefix: '-'
-       },*/
-
-       currency: {
-//             decimals: 2,
-               prefix: '$ '
-       }/*,
-
-       percentage: {
-               decimals: 2,
-               suffix: '%'
-       }*/
-
-});
-
-
-
-
-// Begin: Source/Types/Number.Format.js
-/*
----
-name: Number.Format
-description: Extends the Number Type object to include a number formatting method.
-license: MIT-style license
-authors: [Arian Stolwijk]
-requires: [Core/Number, Locale.en-US.Number]
-# Number.Extras is for compatibility
-provides: [Number.Format, Number.Extras]
-...
-*/
-
-
-Number.implement({
-
-       format: function(options){
-               // Thanks dojo and YUI for some inspiration
-               var value = this;
-               options = options ? Object.clone(options) : {};
-               var getOption = function(key){
-                       if (options[key] != null) return options[key];
-                       return Locale.get('Number.' + key);
-               };
-
-               var negative = value < 0,
-                       decimal = getOption('decimal'),
-                       precision = getOption('precision'),
-                       group = getOption('group'),
-                       decimals = getOption('decimals');
-
-               if (negative){
-                       var negativeLocale = getOption('negative') || {};
-                       if (negativeLocale.prefix == null && negativeLocale.suffix == null) negativeLocale.prefix = '-';
-                       ['prefix', 'suffix'].each(function(key){
-                               if (negativeLocale[key]) options[key] = getOption(key) + negativeLocale[key];
-                       });
-
-                       value = -value;
-               }
-
-               var prefix = getOption('prefix'),
-                       suffix = getOption('suffix');
-
-               if (decimals !== '' && decimals >= 0 && decimals <= 20) value = value.toFixed(decimals);
-               if (precision >= 1 && precision <= 21) value = (+value).toPrecision(precision);
-
-               value += '';
-               var index;
-               if (getOption('scientific') === false && value.indexOf('e') > -1){
-                       var match = value.split('e'),
-                               zeros = +match[1];
-                       value = match[0].replace('.', '');
-
-                       if (zeros < 0){
-                               zeros = -zeros - 1;
-                               index = match[0].indexOf('.');
-                               if (index > -1) zeros -= index - 1;
-                               while (zeros--) value = '0' + value;
-                               value = '0.' + value;
-                       } else {
-                               index = match[0].lastIndexOf('.');
-                               if (index > -1) zeros -= match[0].length - index - 1;
-                               while (zeros--) value += '0';
-                       }
-               }
-
-               if (decimal != '.') value = value.replace('.', decimal);
-
-               if (group){
-                       index = value.lastIndexOf(decimal);
-                       index = (index > -1) ? index : value.length;
-                       var newOutput = value.substring(index),
-                               i = index;
-
-                       while (i--){
-                               if ((index - i - 1) % 3 == 0 && i != (index - 1)) newOutput = group + newOutput;
-                               newOutput = value.charAt(i) + newOutput;
-                       }
-
-                       value = newOutput;
-               }
-
-               if (prefix) value = prefix + value;
-               if (suffix) value += suffix;
-
-               return value;
-       },
-
-       formatCurrency: function(decimals){
-               var locale = Locale.get('Number.currency') || {};
-               if (locale.scientific == null) locale.scientific = false;
-               locale.decimals = decimals != null ? decimals
-                       : (locale.decimals == null ? 2 : locale.decimals);
-
-               return this.format(locale);
-       },
-
-       formatPercentage: function(decimals){
-               var locale = Locale.get('Number.percentage') || {};
-               if (locale.suffix == null) locale.suffix = '%';
-               locale.decimals = decimals != null ? decimals
-                       : (locale.decimals == null ? 2 : locale.decimals);
-
-               return this.format(locale);
-       }
-
-});
-
-
-// Begin: Source/Request/Request.Periodical.js
-/*
----
-
-script: Request.Periodical.js
-
-name: Request.Periodical
-
-description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-
-requires:
-  - Core/Request
-  - /MooTools.More
-
-provides: [Request.Periodical]
-
-...
-*/
-
-Request.implement({
-
-       options: {
-               initialDelay: 5000,
-               delay: 5000,
-               limit: 60000
-       },
-
-       startTimer: function(data){
-               var fn = function(){
-                       if (!this.running) this.send({data: data});
-               };
-               this.lastDelay = this.options.initialDelay;
-               this.timer = fn.delay(this.lastDelay, this);
-               this.completeCheck = function(response){
-                       clearTimeout(this.timer);
-                       this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit);
-                       this.timer = fn.delay(this.lastDelay, this);
-               };
-               return this.addEvent('complete', this.completeCheck);
-       },
-
-       stopTimer: function(){
-               clearTimeout(this.timer);
-               return this.removeEvent('complete', this.completeCheck);
-       }
-
-});
-
-
-// Begin: Source/Request/Request.JSONP.js
-/*
----
-
-script: Request.JSONP.js
-
-name: Request.JSONP
-
-description: Defines Request.JSONP, a class for cross domain javascript via script injection.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Guillermo Rauch
-  - Arian Stolwijk
-
-requires:
-  - Core/Element
-  - Core/Request
-  - MooTools.More
-
-provides: [Request.JSONP]
-
-...
-*/
-
-Request.JSONP = new Class({
-
-       Implements: [Chain, Events, Options],
-
-       options: {/*
-               onRequest: function(src, scriptElement){},
-               onComplete: function(data){},
-               onSuccess: function(data){},
-               onCancel: function(){},
-               onTimeout: function(){},
-               onError: function(){}, */
-               onRequest: function(src){
-                       if (this.options.log && window.console && console.log){
-                               console.log('JSONP retrieving script with url:' + src);
-                       }
-               },
-               onError: function(src){
-                       if (this.options.log && window.console && console.warn){
-                               console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
-                       }
-               },
-               url: '',
-               callbackKey: 'callback',
-               injectScript: document.head,
-               data: '',
-               link: 'ignore',
-               timeout: 0,
-               log: false
-       },
-
-       initialize: function(options){
-               this.setOptions(options);
-       },
-
-       send: function(options){
-               if (!Request.prototype.check.call(this, options)) return this;
-               this.running = true;
-
-               var type = typeOf(options);
-               if (type == 'string' || type == 'element') options = {data: options};
-               options = Object.merge(this.options, options || {});
-
-               var data = options.data;
-               switch (typeOf(data)){
-                       case 'element': data = document.id(data).toQueryString(); break;
-                       case 'object': case 'hash': data = Object.toQueryString(data);
-               }
-
-               var index = this.index = Request.JSONP.counter++;
-
-               var src = options.url +
-                       (options.url.test('\\?') ? '&' :'?') +
-                       (options.callbackKey) +
-                       '=Request.JSONP.request_map.request_'+ index +
-                       (data ? '&' + data : '');
-
-               if (src.length > 2083) this.fireEvent('error', src);
-
-               Request.JSONP.request_map['request_' + index] = function(){
-                       this.success(arguments, index);
-               }.bind(this);
-
-               var script = this.getScript(src).inject(options.injectScript);
-               this.fireEvent('request', [src, script]);
-
-               if (options.timeout) this.timeout.delay(options.timeout, this);
-
-               return this;
-       },
-
-       getScript: function(src){
-               if (!this.script) this.script = new Element('script', {
-                       type: 'text/javascript',
-                       async: true,
-                       src: src
-               });
-               return this.script;
-       },
-
-       success: function(args, index){
-               if (!this.running) return;
-               this.clear()
-                       .fireEvent('complete', args).fireEvent('success', args)
-                       .callChain();
-       },
-
-       cancel: function(){
-               if (this.running) this.clear().fireEvent('cancel');
-               return this;
-       },
-
-       isRunning: function(){
-               return !!this.running;
-       },
-
-       clear: function(){
-               this.running = false;
-               if (this.script){
-                       this.script.destroy();
-                       this.script = null;
-               }
-               return this;
-       },
-
-       timeout: function(){
-               if (this.running){
-                       this.running = false;
-                       this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();
-               }
-               return this;
-       }
-
-});
-
-Request.JSONP.counter = 0;
-Request.JSONP.request_map = {};
-
-
-// Begin: Source/Types/String.QueryString.js
-/*
----
-
-script: String.QueryString.js
-
-name: String.QueryString
-
-description: Methods for dealing with URI query strings.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-  - Aaron Newton
-  - Lennart Pilon
-  - Valerio Proietti
-
-requires:
-  - Core/Array
-  - Core/String
-  - /MooTools.More
-
-provides: [String.QueryString]
-
-...
-*/
-
-String.implement({
-
-       parseQueryString: function(decodeKeys, decodeValues){
-               if (decodeKeys == null) decodeKeys = true;
-               if (decodeValues == null) decodeValues = true;
-
-               var vars = this.split(/[&;]/),
-                       object = {};
-               if (!vars.length) return object;
-
-               vars.each(function(val){
-                       var index = val.indexOf('=') + 1,
-                               value = index ? val.substr(index) : '',
-                               keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val],
-                               obj = object;
-                       if (!keys) return;
-                       if (decodeValues) value = decodeURIComponent(value);
-                       keys.each(function(key, i){
-                               if (decodeKeys) key = decodeURIComponent(key);
-                               var current = obj[key];
-
-                               if (i < keys.length - 1) obj = obj[key] = current || {};
-                               else if (typeOf(current) == 'array') current.push(value);
-                               else obj[key] = current != null ? [current, value] : value;
-                       });
-               });
-
-               return object;
-       },
-
-       cleanQueryString: function(method){
-               return this.split('&').filter(function(val){
-                       var index = val.indexOf('='),
-                               key = index < 0 ? '' : val.substr(0, index),
-                               value = val.substr(index + 1);
-
-                       return method ? method.call(null, key, value) : (value || value === 0);
-               }).join('&');
-       }
-
-});
-
-
-// Begin: Source/Types/URI.js
-/*
----
-
-script: URI.js
-
-name: URI
-
-description: Provides methods useful in managing the window location and uris.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-  - Aaron Newton
-
-requires:
-  - Core/Object
-  - Core/Class
-  - Core/Class.Extras
-  - Core/Element
-  - /String.QueryString
-
-provides: [URI]
-
-...
-*/
-
-(function(){
-
-var toString = function(){
-       return this.get('value');
-};
-
-var URI = this.URI = new Class({
-
-       Implements: Options,
-
-       options: {
-               /*base: false*/
-       },
-
-       regex: /^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
-       parts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'],
-       schemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0},
-
-       initialize: function(uri, options){
-               this.setOptions(options);
-               var base = this.options.base || URI.base;
-               if (!uri) uri = base;
-
-               if (uri && uri.parsed) this.parsed = Object.clone(uri.parsed);
-               else this.set('value', uri.href || uri.toString(), base ? new URI(base) : false);
-       },
-
-       parse: function(value, base){
-               var bits = value.match(this.regex);
-               if (!bits) return false;
-               bits.shift();
-               return this.merge(bits.associate(this.parts), base);
-       },
-
-       merge: function(bits, base){
-               if ((!bits || !bits.scheme) && (!base || !base.scheme)) return false;
-               if (base){
-                       this.parts.every(function(part){
-                               if (bits[part]) return false;
-                               bits[part] = base[part] || '';
-                               return true;
-                       });
-               }
-               bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];
-               bits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/';
-               return bits;
-       },
-
-       parseDirectory: function(directory, baseDirectory){
-               directory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory;
-               if (!directory.test(URI.regs.directoryDot)) return directory;
-               var result = [];
-               directory.replace(URI.regs.endSlash, '').split('/').each(function(dir){
-                       if (dir == '..' && result.length > 0) result.pop();
-                       else if (dir != '.') result.push(dir);
-               });
-               return result.join('/') + '/';
-       },
-
-       combine: function(bits){
-               return bits.value || bits.scheme + '://' +
-                       (bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') +
-                       (bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') +
-                       (bits.directory || '/') + (bits.file || '') +
-                       (bits.query ? '?' + bits.query : '') +
-                       (bits.fragment ? '#' + bits.fragment : '');
-       },
-
-       set: function(part, value, base){
-               if (part == 'value'){
-                       var scheme = value.match(URI.regs.scheme);
-                       if (scheme) scheme = scheme[1];
-                       if (scheme && this.schemes[scheme.toLowerCase()] == null) this.parsed = { scheme: scheme, value: value };
-                       else this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value });
-               } else if (part == 'data'){
-                       this.setData(value);
-               } else {
-                       this.parsed[part] = value;
-               }
-               return this;
-       },
-
-       get: function(part, base){
-               switch (part){
-                       case 'value': return this.combine(this.parsed, base ? base.parsed : false);
-                       case 'data' : return this.getData();
-               }
-               return this.parsed[part] || '';
-       },
-
-       go: function(){
-               document.location.href = this.toString();
-       },
-
-       toURI: function(){
-               return this;
-       },
-
-       getData: function(key, part){
-               var qs = this.get(part || 'query');
-               if (!(qs || qs === 0)) return key ? null : {};
-               var obj = qs.parseQueryString();
-               return key ? obj[key] : obj;
-       },
-
-       setData: function(values, merge, part){
-               if (typeof values == 'string'){
-                       var data = this.getData();
-                       data[arguments[0]] = arguments[1];
-                       values = data;
-               } else if (merge){
-                       values = Object.merge(this.getData(), values);
-               }
-               return this.set(part || 'query', Object.toQueryString(values));
-       },
-
-       clearData: function(part){
-               return this.set(part || 'query', '');
-       },
-
-       toString: toString,
-       valueOf: toString
-
-});
-
-URI.regs = {
-       endSlash: /\/$/,
-       scheme: /^(\w+):/,
-       directoryDot: /\.\/|\.$/
-};
-
-URI.base = new URI(Array.from(document.getElements('base[href]', true)).getLast(), {base: document.location});
-
-String.implement({
-
-       toURI: function(options){
-               return new URI(this, options);
-       }
-
-});
-
-})();
-
-
-// Begin: Source/Types/URI.Relative.js
-/*
----
-
-script: URI.Relative.js
-
-name: URI.Relative
-
-description: Extends the URI class to add methods for computing relative and absolute urls.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-
-
-requires:
-  - /Class.refactor
-  - /URI
-
-provides: [URI.Relative]
-
-...
-*/
-
-URI = Class.refactor(URI, {
-
-       combine: function(bits, base){
-               if (!base || bits.scheme != base.scheme || bits.host != base.host || bits.port != base.port)
-                       return this.previous.apply(this, arguments);
-               var end = bits.file + (bits.query ? '?' + bits.query : '') + (bits.fragment ? '#' + bits.fragment : '');
-
-               if (!base.directory) return (bits.directory || (bits.file ? '' : './')) + end;
-
-               var baseDir = base.directory.split('/'),
-                       relDir = bits.directory.split('/'),
-                       path = '',
-                       offset;
-
-               var i = 0;
-               for (offset = 0; offset < baseDir.length && offset < relDir.length && baseDir[offset] == relDir[offset]; offset++);
-               for (i = 0; i < baseDir.length - offset - 1; i++) path += '../';
-               for (i = offset; i < relDir.length - 1; i++) path += relDir[i] + '/';
-
-               return (path || (bits.file ? '' : './')) + end;
-       },
-
-       toAbsolute: function(base){
-               base = new URI(base);
-               if (base) base.set('directory', '').set('file', '');
-               return this.toRelative(base);
-       },
-
-       toRelative: function(base){
-               return this.get('value', new URI(base));
-       }
-
-});
-
-
-// Begin: Source/Utilities/Cookie.js
-/*
----
-
-name: Cookie
-
-description: Class for creating, reading, and deleting browser Cookies.
-
-license: MIT-style license.
-
-credits:
-  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
-
-requires: [Options, Browser]
-
-provides: Cookie
-
-...
-*/
-
-var Cookie = new Class({
-
-       Implements: Options,
-
-       options: {
-               path: '/',
-               domain: false,
-               duration: false,
-               secure: false,
-               document: document,
-               encode: true
-       },
-
-       initialize: function(key, options){
-               this.key = key;
-               this.setOptions(options);
-       },
-
-       write: function(value){
-               if (this.options.encode) value = encodeURIComponent(value);
-               if (this.options.domain) value += '; domain=' + this.options.domain;
-               if (this.options.path) value += '; path=' + this.options.path;
-               if (this.options.duration){
-                       var date = new Date();
-                       date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
-                       value += '; expires=' + date.toGMTString();
-               }
-               if (this.options.secure) value += '; secure';
-               this.options.document.cookie = this.key + '=' + value;
-               return this;
-       },
-
-       read: function(){
-               var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
-               return (value) ? decodeURIComponent(value[1]) : null;
-       },
-
-       dispose: function(){
-               new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
-               return this;
-       }
-
-});
-
-Cookie.write = function(key, value, options){
-       return new Cookie(key, options).write(value);
-};
-
-Cookie.read = function(key){
-       return new Cookie(key).read();
-};
-
-Cookie.dispose = function(key, options){
-       return new Cookie(key, options).dispose();
-};
-
-
-// Begin: Source/Locale/Locale.en-US.Date.js
-/*
----
-
-name: Locale.en-US.Date
-
-description: Date messages for US English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Locale
-
-provides: [Locale.en-US.Date]
-
-...
-*/
-
-Locale.define('en-US', 'Date', {
-
-       months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-       months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-       days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-       days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-
-       // Culture's date order: MM/DD/YYYY
-       dateOrder: ['month', 'date', 'year'],
-       shortDate: '%m/%d/%Y',
-       shortTime: '%I:%M%p',
-       AM: 'AM',
-       PM: 'PM',
-       firstDayOfWeek: 0,
-
-       // Date.Extras
-       ordinal: function(dayOfMonth){
-               // 1st, 2nd, 3rd, etc.
-               return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
-       },
-
-       lessThanMinuteAgo: 'less than a minute ago',
-       minuteAgo: 'about a minute ago',
-       minutesAgo: '{delta} minutes ago',
-       hourAgo: 'about an hour ago',
-       hoursAgo: 'about {delta} hours ago',
-       dayAgo: '1 day ago',
-       daysAgo: '{delta} days ago',
-       weekAgo: '1 week ago',
-       weeksAgo: '{delta} weeks ago',
-       monthAgo: '1 month ago',
-       monthsAgo: '{delta} months ago',
-       yearAgo: '1 year ago',
-       yearsAgo: '{delta} years ago',
-
-       lessThanMinuteUntil: 'less than a minute from now',
-       minuteUntil: 'about a minute from now',
-       minutesUntil: '{delta} minutes from now',
-       hourUntil: 'about an hour from now',
-       hoursUntil: 'about {delta} hours from now',
-       dayUntil: '1 day from now',
-       daysUntil: '{delta} days from now',
-       weekUntil: '1 week from now',
-       weeksUntil: '{delta} weeks from now',
-       monthUntil: '1 month from now',
-       monthsUntil: '{delta} months from now',
-       yearUntil: '1 year from now',
-       yearsUntil: '{delta} years from now'
-
-});
-
-
-// Begin: Source/Types/Date.js
-/*
----
-
-script: Date.js
-
-name: Date
-
-description: Extends the Date native object to include methods useful in managing dates.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
-  - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
-  - Scott Kyle - scott [at] appden.com; http://appden.com
-
-requires:
-  - Core/Array
-  - Core/String
-  - Core/Number
-  - MooTools.More
-  - Locale
-  - Locale.en-US.Date
-
-provides: [Date]
-
-...
-*/
-
-(function(){
-
-var Date = this.Date;
-
-var DateMethods = Date.Methods = {
-       ms: 'Milliseconds',
-       year: 'FullYear',
-       min: 'Minutes',
-       mo: 'Month',
-       sec: 'Seconds',
-       hr: 'Hours'
-};
-
-['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
-       'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
-       'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){
-       Date.Methods[method.toLowerCase()] = method;
-});
-
-var pad = function(n, digits, string){
-       if (digits == 1) return n;
-       return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
-};
-
-Date.implement({
-
-       set: function(prop, value){
-               prop = prop.toLowerCase();
-               var method = DateMethods[prop] && 'set' + DateMethods[prop];
-               if (method && this[method]) this[method](value);
-               return this;
-       }.overloadSetter(),
-
-       get: function(prop){
-               prop = prop.toLowerCase();
-               var method = DateMethods[prop] && 'get' + DateMethods[prop];
-               if (method && this[method]) return this[method]();
-               return null;
-       }.overloadGetter(),
-
-       clone: function(){
-               return new Date(this.get('time'));
-       },
-
-       increment: function(interval, times){
-               interval = interval || 'day';
-               times = times != null ? times : 1;
-
-               switch (interval){
-                       case 'year':
-                               return this.increment('month', times * 12);
-                       case 'month':
-                               var d = this.get('date');
-                               this.set('date', 1).set('mo', this.get('mo') + times);
-                               return this.set('date', d.min(this.get('lastdayofmonth')));
-                       case 'week':
-                               return this.increment('day', times * 7);
-                       case 'day':
-                               return this.set('date', this.get('date') + times);
-               }
-
-               if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
-
-               return this.set('time', this.get('time') + times * Date.units[interval]());
-       },
-
-       decrement: function(interval, times){
-               return this.increment(interval, -1 * (times != null ? times : 1));
-       },
-
-       isLeapYear: function(){
-               return Date.isLeapYear(this.get('year'));
-       },
-
-       clearTime: function(){
-               return this.set({hr: 0, min: 0, sec: 0, ms: 0});
-       },
-
-       diff: function(date, resolution){
-               if (typeOf(date) == 'string') date = Date.parse(date);
-
-               return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
-       },
-
-       getLastDayOfMonth: function(){
-               return Date.daysInMonth(this.get('mo'), this.get('year'));
-       },
-
-       getDayOfYear: function(){
-               return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
-                       - Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
-       },
-
-       setDay: function(day, firstDayOfWeek){
-               if (firstDayOfWeek == null){
-                       firstDayOfWeek = Date.getMsg('firstDayOfWeek');
-                       if (firstDayOfWeek === '') firstDayOfWeek = 1;
-               }
-
-               day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
-               var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
-
-               return this.increment('day', day - currentDay);
-       },
-
-       getWeek: function(firstDayOfWeek){
-               if (firstDayOfWeek == null){
-                       firstDayOfWeek = Date.getMsg('firstDayOfWeek');
-                       if (firstDayOfWeek === '') firstDayOfWeek = 1;
-               }
-
-               var date = this,
-                       dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
-                       dividend = 0,
-                       firstDayOfYear;
-
-               if (firstDayOfWeek == 1){
-                       // ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
-                       var month = date.get('month'),
-                               startOfWeek = date.get('date') - dayOfWeek;
-
-                       if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
-
-                       if (month == 0 && startOfWeek < -2){
-                               // Use a date from last year to determine the week
-                               date = new Date(date).decrement('day', dayOfWeek);
-                               dayOfWeek = 0;
-                       }
-
-                       firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
-                       if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
-               } else {
-                       // In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
-                       // Days in the same week can have a different weeknumber if the week spreads across two years.
-                       firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
-               }
-
-               dividend += date.get('dayofyear');
-               dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
-               dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
-
-               return (dividend / 7);
-       },
-
-       getOrdinal: function(day){
-               return Date.getMsg('ordinal', day || this.get('date'));
-       },
-
-       getTimezone: function(){
-               return this.toString()
-                       .replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
-                       .replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
-       },
-
-       getGMTOffset: function(){
-               var off = this.get('timezoneOffset');
-               return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
-       },
-
-       setAMPM: function(ampm){
-               ampm = ampm.toUpperCase();
-               var hr = this.get('hr');
-               if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
-               else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
-               return this;
-       },
-
-       getAMPM: function(){
-               return (this.get('hr') < 12) ? 'AM' : 'PM';
-       },
-
-       parse: function(str){
-               this.set('time', Date.parse(str));
-               return this;
-       },
-
-       isValid: function(date){
-               if (!date) date = this;
-               return typeOf(date) == 'date' && !isNaN(date.valueOf());
-       },
-
-       format: function(format){
-               if (!this.isValid()) return 'invalid date';
-
-               if (!format) format = '%x %X';
-               if (typeof format == 'string') format = formats[format.toLowerCase()] || format;
-               if (typeof format == 'function') return format(this);
-
-               var d = this;
-               return format.replace(/%([a-z%])/gi,
-                       function($0, $1){
-                               switch ($1){
-                                       case 'a': return Date.getMsg('days_abbr')[d.get('day')];
-                                       case 'A': return Date.getMsg('days')[d.get('day')];
-                                       case 'b': return Date.getMsg('months_abbr')[d.get('month')];
-                                       case 'B': return Date.getMsg('months')[d.get('month')];
-                                       case 'c': return d.format('%a %b %d %H:%M:%S %Y');
-                                       case 'd': return pad(d.get('date'), 2);
-                                       case 'e': return pad(d.get('date'), 2, ' ');
-                                       case 'H': return pad(d.get('hr'), 2);
-                                       case 'I': return pad((d.get('hr') % 12) || 12, 2);
-                                       case 'j': return pad(d.get('dayofyear'), 3);
-                                       case 'k': return pad(d.get('hr'), 2, ' ');
-                                       case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
-                                       case 'L': return pad(d.get('ms'), 3);
-                                       case 'm': return pad((d.get('mo') + 1), 2);
-                                       case 'M': return pad(d.get('min'), 2);
-                                       case 'o': return d.get('ordinal');
-                                       case 'p': return Date.getMsg(d.get('ampm'));
-                                       case 's': return Math.round(d / 1000);
-                                       case 'S': return pad(d.get('seconds'), 2);
-                                       case 'T': return d.format('%H:%M:%S');
-                                       case 'U': return pad(d.get('week'), 2);
-                                       case 'w': return d.get('day');
-                                       case 'x': return d.format(Date.getMsg('shortDate'));
-                                       case 'X': return d.format(Date.getMsg('shortTime'));
-                                       case 'y': return d.get('year').toString().substr(2);
-                                       case 'Y': return d.get('year');
-                                       case 'z': return d.get('GMTOffset');
-                                       case 'Z': return d.get('Timezone');
-                               }
-                               return $1;
-                       }
-               );
-       },
-
-       toISOString: function(){
-               return this.format('iso8601');
-       }
-
-}).alias({
-       toJSON: 'toISOString',
-       compare: 'diff',
-       strftime: 'format'
-});
-
-// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
-var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-       rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-
-var formats = {
-       db: '%Y-%m-%d %H:%M:%S',
-       compact: '%Y%m%dT%H%M%S',
-       'short': '%d %b %H:%M',
-       'long': '%B %d, %Y %H:%M',
-       rfc822: function(date){
-               return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
-       },
-       rfc2822: function(date){
-               return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
-       },
-       iso8601: function(date){
-               return (
-                       date.getUTCFullYear() + '-' +
-                       pad(date.getUTCMonth() + 1, 2) + '-' +
-                       pad(date.getUTCDate(), 2) + 'T' +
-                       pad(date.getUTCHours(), 2) + ':' +
-                       pad(date.getUTCMinutes(), 2) + ':' +
-                       pad(date.getUTCSeconds(), 2) + '.' +
-                       pad(date.getUTCMilliseconds(), 3) + 'Z'
-               );
-       }
-};
-
-var parsePatterns = [],
-       nativeParse = Date.parse;
-
-var parseWord = function(type, word, num){
-       var ret = -1,
-               translated = Date.getMsg(type + 's');
-       switch (typeOf(word)){
-               case 'object':
-                       ret = translated[word.get(type)];
-                       break;
-               case 'number':
-                       ret = translated[word];
-                       if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
-                       break;
-               case 'string':
-                       var match = translated.filter(function(name){
-                               return this.test(name);
-                       }, new RegExp('^' + word, 'i'));
-                       if (!match.length) throw new Error('Invalid ' + type + ' string');
-                       if (match.length > 1) throw new Error('Ambiguous ' + type);
-                       ret = match[0];
-       }
-
-       return (num) ? translated.indexOf(ret) : ret;
-};
-
-var startCentury = 1900,
-       startYear = 70;
-
-Date.extend({
-
-       getMsg: function(key, args){
-               return Locale.get('Date.' + key, args);
-       },
-
-       units: {
-               ms: Function.from(1),
-               second: Function.from(1000),
-               minute: Function.from(60000),
-               hour: Function.from(3600000),
-               day: Function.from(86400000),
-               week: Function.from(608400000),
-               month: function(month, year){
-                       var d = new Date;
-                       return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
-               },
-               year: function(year){
-                       year = year || new Date().get('year');
-                       return Date.isLeapYear(year) ? 31622400000 : 31536000000;
-               }
-       },
-
-       daysInMonth: function(month, year){
-               return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
-       },
-
-       isLeapYear: function(year){
-               return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
-       },
-
-       parse: function(from){
-               var t = typeOf(from);
-               if (t == 'number') return new Date(from);
-               if (t != 'string') return from;
-               from = from.clean();
-               if (!from.length) return null;
-
-               var parsed;
-               parsePatterns.some(function(pattern){
-                       var bits = pattern.re.exec(from);
-                       return (bits) ? (parsed = pattern.handler(bits)) : false;
-               });
-
-               if (!(parsed && parsed.isValid())){
-                       parsed = new Date(nativeParse(from));
-                       if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
-               }
-               return parsed;
-       },
-
-       parseDay: function(day, num){
-               return parseWord('day', day, num);
-       },
-
-       parseMonth: function(month, num){
-               return parseWord('month', month, num);
-       },
-
-       parseUTC: function(value){
-               var localDate = new Date(value);
-               var utcSeconds = Date.UTC(
-                       localDate.get('year'),
-                       localDate.get('mo'),
-                       localDate.get('date'),
-                       localDate.get('hr'),
-                       localDate.get('min'),
-                       localDate.get('sec'),
-                       localDate.get('ms')
-               );
-               return new Date(utcSeconds);
-       },
-
-       orderIndex: function(unit){
-               return Date.getMsg('dateOrder').indexOf(unit) + 1;
-       },
-
-       defineFormat: function(name, format){
-               formats[name] = format;
-               return this;
-       },
-
-       //<1.2compat>
-       parsePatterns: parsePatterns,
-       //</1.2compat>
-
-       defineParser: function(pattern){
-               parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
-               return this;
-       },
-
-       defineParsers: function(){
-               Array.flatten(arguments).each(Date.defineParser);
-               return this;
-       },
-
-       define2DigitYearStart: function(year){
-               startYear = year % 100;
-               startCentury = year - startYear;
-               return this;
-       }
-
-}).extend({
-       defineFormats: Date.defineFormat.overloadSetter()
-});
-
-var regexOf = function(type){
-       return new RegExp('(?:' + Date.getMsg(type).map(function(name){
-               return name.substr(0, 3);
-       }).join('|') + ')[a-z]*');
-};
-
-var replacers = function(key){
-       switch (key){
-               case 'T':
-                       return '%H:%M:%S';
-               case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
-                       return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
-               case 'X':
-                       return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
-       }
-       return null;
-};
-
-var keys = {
-       d: /[0-2]?[0-9]|3[01]/,
-       H: /[01]?[0-9]|2[0-3]/,
-       I: /0?[1-9]|1[0-2]/,
-       M: /[0-5]?\d/,
-       s: /\d+/,
-       o: /[a-z]*/,
-       p: /[ap]\.?m\.?/,
-       y: /\d{2}|\d{4}/,
-       Y: /\d{4}/,
-       z: /Z|[+-]\d{2}(?::?\d{2})?/
-};
-
-keys.m = keys.I;
-keys.S = keys.M;
-
-var currentLanguage;
-
-var recompile = function(language){
-       currentLanguage = language;
-
-       keys.a = keys.A = regexOf('days');
-       keys.b = keys.B = regexOf('months');
-
-       parsePatterns.each(function(pattern, i){
-               if (pattern.format) parsePatterns[i] = build(pattern.format);
-       });
-};
-
-var build = function(format){
-       if (!currentLanguage) return {format: format};
-
-       var parsed = [];
-       var re = (format.source || format) // allow format to be regex
-        .replace(/%([a-z])/gi,
-               function($0, $1){
-                       return replacers($1) || $0;
-               }
-       ).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
-        .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
-        .replace(/%([a-z%])/gi,
-               function($0, $1){
-                       var p = keys[$1];
-                       if (!p) return $1;
-                       parsed.push($1);
-                       return '(' + p.source + ')';
-               }
-       ).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
-
-       return {
-               format: format,
-               re: new RegExp('^' + re + '$', 'i'),
-               handler: function(bits){
-                       bits = bits.slice(1).associate(parsed);
-                       var date = new Date().clearTime(),
-                               year = bits.y || bits.Y;
-
-                       if (year != null) handle.call(date, 'y', year); // need to start in the right year
-                       if ('d' in bits) handle.call(date, 'd', 1);
-                       if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
-
-                       for (var key in bits) handle.call(date, key, bits[key]);
-                       return date;
-               }
-       };
-};
-
-var handle = function(key, value){
-       if (!value) return this;
-
-       switch (key){
-               case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
-               case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
-               case 'd': return this.set('date', value);
-               case 'H': case 'I': return this.set('hr', value);
-               case 'm': return this.set('mo', value - 1);
-               case 'M': return this.set('min', value);
-               case 'p': return this.set('ampm', value.replace(/\./g, ''));
-               case 'S': return this.set('sec', value);
-               case 's': return this.set('ms', ('0.' + value) * 1000);
-               case 'w': return this.set('day', value);
-               case 'Y': return this.set('year', value);
-               case 'y':
-                       value = +value;
-                       if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
-                       return this.set('year', value);
-               case 'z':
-                       if (value == 'Z') value = '+00';
-                       var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
-                       offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
-                       return this.set('time', this - offset * 60000);
-       }
-
-       return this;
-};
-
-Date.defineParsers(
-       '%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
-       '%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
-       '%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
-       '%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
-       '%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
-       '%Y %b( %d%o( %X)?)?', // Same as above with year coming first
-       '%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
-       '%T', // %H:%M:%S
-       '%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
-);
-
-Locale.addEvent('change', function(language){
-       if (Locale.get('Date')) recompile(language);
-}).fireEvent('change', Locale.getCurrent());
-
-})();
-
-
-// Begin: Source/Types/Date.Extras.js
-/*
----
-
-script: Date.Extras.js
-
-name: Date.Extras
-
-description: Extends the Date native object to include extra methods (on top of those in Date.js).
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - /Date
-
-provides: [Date.Extras]
-
-...
-*/
-
-Date.implement({
-
-       timeDiffInWords: function(to){
-               return Date.distanceOfTimeInWords(this, to || new Date);
-       },
-
-       timeDiff: function(to, separator){
-               if (to == null) to = new Date;
-               var delta = ((to - this) / 1000).floor().abs();
-
-               var vals = [],
-                       durations = [60, 60, 24, 365, 0],
-                       names = ['s', 'm', 'h', 'd', 'y'],
-                       value, duration;
-
-               for (var item = 0; item < durations.length; item++){
-                       if (item && !delta) break;
-                       value = delta;
-                       if ((duration = durations[item])){
-                               value = (delta % duration);
-                               delta = (delta / duration).floor();
-                       }
-                       vals.unshift(value + (names[item] || ''));
-               }
-
-               return vals.join(separator || ':');
-       }
-
-}).extend({
-
-       distanceOfTimeInWords: function(from, to){
-               return Date.getTimePhrase(((to - from) / 1000).toInt());
-       },
-
-       getTimePhrase: function(delta){
-               var suffix = (delta < 0) ? 'Until' : 'Ago';
-               if (delta < 0) delta *= -1;
-
-               var units = {
-                       minute: 60,
-                       hour: 60,
-                       day: 24,
-                       week: 7,
-                       month: 52 / 12,
-                       year: 12,
-                       eon: Infinity
-               };
-
-               var msg = 'lessThanMinute';
-
-               for (var unit in units){
-                       var interval = units[unit];
-                       if (delta < 1.5 * interval){
-                               if (delta > 0.75 * interval) msg = unit;
-                               break;
-                       }
-                       delta /= interval;
-                       msg = unit + 's';
-               }
-
-               delta = delta.round();
-               return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
-       }
-
-}).defineParsers(
-
-       {
-               // "today", "tomorrow", "yesterday"
-               re: /^(?:tod|tom|yes)/i,
-               handler: function(bits){
-                       var d = new Date().clearTime();
-                       switch (bits[0]){
-                               case 'tom': return d.increment();
-                               case 'yes': return d.decrement();
-                               default: return d;
-                       }
-               }
-       },
-
-       {
-               // "next Wednesday", "last Thursday"
-               re: /^(next|last) ([a-z]+)$/i,
-               handler: function(bits){
-                       var d = new Date().clearTime();
-                       var day = d.getDay();
-                       var newDay = Date.parseDay(bits[2], true);
-                       var addDays = newDay - day;
-                       if (newDay <= day) addDays += 7;
-                       if (bits[1] == 'last') addDays -= 7;
-                       return d.set('date', d.getDate() + addDays);
-               }
-       }
-
-).alias('timeAgoInWords', 'timeDiffInWords');
-
-
-// Begin: Source/Fx/Fx.Elements.js
-/*
----
-
-script: Fx.Elements.js
-
-name: Fx.Elements
-
-description: Effect to change any number of CSS properties of any number of Elements.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx.CSS
-  - /MooTools.More
-
-provides: [Fx.Elements]
-
-...
-*/
-
-Fx.Elements = new Class({
-
-       Extends: Fx.CSS,
-
-       initialize: function(elements, options){
-               this.elements = this.subject = $$(elements);
-               this.parent(options);
-       },
-
-       compute: function(from, to, delta){
-               var now = {};
-
-               for (var i in from){
-                       var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
-                       for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
-               }
-
-               return now;
-       },
-
-       set: function(now){
-               for (var i in now){
-                       if (!this.elements[i]) continue;
-
-                       var iNow = now[i];
-                       for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);
-               }
-
-               return this;
-       },
-
-       start: function(obj){
-               if (!this.check(obj)) return this;
-               var from = {}, to = {};
-
-               for (var i in obj){
-                       if (!this.elements[i]) continue;
-
-                       var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
-
-                       for (var p in iProps){
-                               var parsed = this.prepare(this.elements[i], p, iProps[p]);
-                               iFrom[p] = parsed.from;
-                               iTo[p] = parsed.to;
-                       }
-               }
-
-               return this.parent(from, to);
-       }
-
-});
-
-
-// Begin: Source/Fx/Fx.Accordion.js
-/*
----
-
-script: Fx.Accordion.js
-
-name: Fx.Accordion
-
-description: An Fx.Elements extension which allows you to easily create accordion type controls.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Event
-  - /Fx.Elements
-
-provides: [Fx.Accordion]
-
-...
-*/
-
-Fx.Accordion = new Class({
-
-       Extends: Fx.Elements,
-
-       options: {/*
-               onActive: function(toggler, section){},
-               onBackground: function(toggler, section){},*/
-               fixedHeight: false,
-               fixedWidth: false,
-               display: 0,
-               show: false,
-               height: true,
-               width: false,
-               opacity: true,
-               alwaysHide: false,
-               trigger: 'click',
-               initialDisplayFx: true,
-               resetHeight: true
-       },
-
-       initialize: function(){
-               var defined = function(obj){
-                       return obj != null;
-               };
-
-               var params = Array.link(arguments, {
-                       'container': Type.isElement, //deprecated
-                       'options': Type.isObject,
-                       'togglers': defined,
-                       'elements': defined
-               });
-               this.parent(params.elements, params.options);
-
-               var options = this.options,
-                       togglers = this.togglers = $$(params.togglers);
-
-               this.previous = -1;
-               this.internalChain = new Chain();
-
-               if (options.alwaysHide) this.options.link = 'chain';
-
-               if (options.show || this.options.show === 0){
-                       options.display = false;
-                       this.previous = options.show;
-               }
-
-               if (options.start){
-                       options.display = false;
-                       options.show = false;
-               }
-
-               var effects = this.effects = {};
-
-               if (options.opacity) effects.opacity = 'fullOpacity';
-               if (options.width) effects.width = options.fixedWidth ? 'fullWidth' : 'offsetWidth';
-               if (options.height) effects.height = options.fixedHeight ? 'fullHeight' : 'scrollHeight';
-
-               for (var i = 0, l = togglers.length; i < l; i++) this.addSection(togglers[i], this.elements[i]);
-
-               this.elements.each(function(el, i){
-                       if (options.show === i){
-                               this.fireEvent('active', [togglers[i], el]);
-                       } else {
-                               for (var fx in effects) el.setStyle(fx, 0);
-                       }
-               }, this);
-
-               if (options.display || options.display === 0 || options.initialDisplayFx === false){
-                       this.display(options.display, options.initialDisplayFx);
-               }
-
-               if (options.fixedHeight !== false) options.resetHeight = false;
-               this.addEvent('complete', this.internalChain.callChain.bind(this.internalChain));
-       },
-
-       addSection: function(toggler, element){
-               toggler = document.id(toggler);
-               element = document.id(element);
-               this.togglers.include(toggler);
-               this.elements.include(element);
-
-               var togglers = this.togglers,
-                       options = this.options,
-                       test = togglers.contains(toggler),
-                       idx = togglers.indexOf(toggler),
-                       displayer = this.display.pass(idx, this);
-
-               toggler.store('accordion:display', displayer)
-                       .addEvent(options.trigger, displayer);
-
-               if (options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
-               if (options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
-
-               element.fullOpacity = 1;
-               if (options.fixedWidth) element.fullWidth = options.fixedWidth;
-               if (options.fixedHeight) element.fullHeight = options.fixedHeight;
-               element.setStyle('overflow', 'hidden');
-
-               if (!test) for (var fx in this.effects){
-                       element.setStyle(fx, 0);
-               }
-               return this;
-       },
-
-       removeSection: function(toggler, displayIndex){
-               var togglers = this.togglers,
-                       idx = togglers.indexOf(toggler),
-                       element = this.elements[idx];
-
-               var remover = function(){
-                       togglers.erase(toggler);
-                       this.elements.erase(element);
-                       this.detach(toggler);
-               }.bind(this);
-
-               if (this.now == idx || displayIndex != null){
-                       this.display(displayIndex != null ? displayIndex : (idx - 1 >= 0 ? idx - 1 : 0)).chain(remover);
-               } else {
-                       remover();
-               }
-               return this;
-       },
-
-       detach: function(toggler){
-               var remove = function(toggler){
-                       toggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display'));
-               }.bind(this);
-
-               if (!toggler) this.togglers.each(remove);
-               else remove(toggler);
-               return this;
-       },
-
-       display: function(index, useFx){
-               if (!this.check(index, useFx)) return this;
-
-               var obj = {},
-                       elements = this.elements,
-                       options = this.options,
-                       effects = this.effects;
-
-               if (useFx == null) useFx = true;
-               if (typeOf(index) == 'element') index = elements.indexOf(index);
-               if (index == this.previous && !options.alwaysHide) return this;
-
-               if (options.resetHeight){
-                       var prev = elements[this.previous];
-                       if (prev && !this.selfHidden){
-                               for (var fx in effects) prev.setStyle(fx, prev[effects[fx]]);
-                       }
-               }
-
-               if ((this.timer && options.link == 'chain') || (index === this.previous && !options.alwaysHide)) return this;
-
-               this.previous = index;
-               this.selfHidden = false;
-
-               elements.each(function(el, i){
-                       obj[i] = {};
-                       var hide;
-                       if (i != index){
-                               hide = true;
-                       } else if (options.alwaysHide && ((el.offsetHeight > 0 && options.height) || el.offsetWidth > 0 && options.width)){
-                               hide = true;
-                               this.selfHidden = true;
-                       }
-                       this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);
-                       for (var fx in effects) obj[i][fx] = hide ? 0 : el[effects[fx]];
-                       if (!useFx && !hide && options.resetHeight) obj[i].height = 'auto';
-               }, this);
-
-               this.internalChain.clearChain();
-               this.internalChain.chain(function(){
-                       if (options.resetHeight && !this.selfHidden){
-                               var el = elements[index];
-                               if (el) el.setStyle('height', 'auto');
-                       }
-               }.bind(this));
-
-               return useFx ? this.start(obj) : this.set(obj).internalChain.callChain();
-       }
-
-});
-
-/*<1.2compat>*/
-/*
-       Compatibility with 1.2.0
-*/
-var Accordion = new Class({
-
-       Extends: Fx.Accordion,
-
-       initialize: function(){
-               this.parent.apply(this, arguments);
-               var params = Array.link(arguments, {'container': Type.isElement});
-               this.container = params.container;
-       },
-
-       addSection: function(toggler, element, pos){
-               toggler = document.id(toggler);
-               element = document.id(element);
-
-               var test = this.togglers.contains(toggler);
-               var len = this.togglers.length;
-               if (len && (!test || pos)){
-                       pos = pos != null ? pos : len - 1;
-                       toggler.inject(this.togglers[pos], 'before');
-                       element.inject(toggler, 'after');
-               } else if (this.container && !test){
-                       toggler.inject(this.container);
-                       element.inject(this.container);
-               }
-               return this.parent.apply(this, arguments);
-       }
-
-});
-/*</1.2compat>*/
-
-
-// Begin: Source/Types/Hash.js
-/*
----
-
-name: Hash
-
-description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
-
-license: MIT-style license.
-
-requires:
-  - Core/Object
-  - /MooTools.More
-
-provides: [Hash]
-
-...
-*/
-
-(function(){
-
-if (this.Hash) return;
-
-var Hash = this.Hash = new Type('Hash', function(object){
-       if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
-       for (var key in object) this[key] = object[key];
-       return this;
-});
-
-this.$H = function(object){
-       return new Hash(object);
-};
-
-Hash.implement({
-
-       forEach: function(fn, bind){
-               Object.forEach(this, fn, bind);
-       },
-
-       getClean: function(){
-               var clean = {};
-               for (var key in this){
-                       if (this.hasOwnProperty(key)) clean[key] = this[key];
-               }
-               return clean;
-       },
-
-       getLength: function(){
-               var length = 0;
-               for (var key in this){
-                       if (this.hasOwnProperty(key)) length++;
-               }
-               return length;
-       }
-
-});
-
-Hash.alias('each', 'forEach');
-
-Hash.implement({
-
-       has: Object.prototype.hasOwnProperty,
-
-       keyOf: function(value){
-               return Object.keyOf(this, value);
-       },
-
-       hasValue: function(value){
-               return Object.contains(this, value);
-       },
-
-       extend: function(properties){
-               Hash.each(properties || {}, function(value, key){
-                       Hash.set(this, key, value);
-               }, this);
-               return this;
-       },
-
-       combine: function(properties){
-               Hash.each(properties || {}, function(value, key){
-                       Hash.include(this, key, value);
-               }, this);
-               return this;
-       },
-
-       erase: function(key){
-               if (this.hasOwnProperty(key)) delete this[key];
-               return this;
-       },
-
-       get: function(key){
-               return (this.hasOwnProperty(key)) ? this[key] : null;
-       },
-
-       set: function(key, value){
-               if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
-               return this;
-       },
-
-       empty: function(){
-               Hash.each(this, function(value, key){
-                       delete this[key];
-               }, this);
-               return this;
-       },
-
-       include: function(key, value){
-               if (this[key] == undefined) this[key] = value;
-               return this;
-       },
-
-       map: function(fn, bind){
-               return new Hash(Object.map(this, fn, bind));
-       },
-
-       filter: function(fn, bind){
-               return new Hash(Object.filter(this, fn, bind));
-       },
-
-       every: function(fn, bind){
-               return Object.every(this, fn, bind);
-       },
-
-       some: function(fn, bind){
-               return Object.some(this, fn, bind);
-       },
-
-       getKeys: function(){
-               return Object.keys(this);
-       },
-
-       getValues: function(){
-               return Object.values(this);
-       },
-
-       toQueryString: function(base){
-               return Object.toQueryString(this, base);
-       }
-
-});
-
-Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
-
-
-})();
-
-
-
-// Begin: Source/Utilities/Hash.Cookie.js
-/*
----
-
-script: Hash.Cookie.js
-
-name: Hash.Cookie
-
-description: Class for creating, reading, and deleting Cookies in JSON format.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Aaron Newton
-
-requires:
-  - Core/Cookie
-  - Core/JSON
-  - /MooTools.More
-  - /Hash
-
-provides: [Hash.Cookie]
-
-...
-*/
-
-Hash.Cookie = new Class({
-
-       Extends: Cookie,
-
-       options: {
-               autoSave: true
-       },
-
-       initialize: function(name, options){
-               this.parent(name, options);
-               this.load();
-       },
-
-       save: function(){
-               var value = JSON.encode(this.hash);
-               if (!value || value.length > 4096) return false; //cookie would be truncated!
-               if (value == '{}') this.dispose();
-               else this.write(value);
-               return true;
-       },
-
-       load: function(){
-               this.hash = new Hash(JSON.decode(this.read(), true));
-               return this;
-       }
-
-});
-
-Hash.each(Hash.prototype, function(method, name){
-       if (typeof method == 'function') Hash.Cookie.implement(name, function(){
-               var value = method.apply(this.hash, arguments);
-               if (this.options.autoSave) this.save();
-               return value;
-       });
-});
-
-
-// Begin: Source/Utilities/Assets.js
-/*
----
-
-script: Assets.js
-
-name: Assets
-
-description: Provides methods to dynamically load JavaScript, CSS, and Image files into the document.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Event
-  - /MooTools.More
-
-provides: [Assets]
-
-...
-*/
-
-var Asset = {
-
-       javascript: function(source, properties){
-               if (!properties) properties = {};
-
-               var script = new Element('script', {src: source, type: 'text/javascript'}),
-                       doc = properties.document || document,
-                       load = properties.onload || properties.onLoad;
-
-               delete properties.onload;
-               delete properties.onLoad;
-               delete properties.document;
-
-               if (load){
-                       if (!script.addEventListener){
-                               script.addEvent('readystatechange', function(){
-                                       if (['loaded', 'complete'].contains(this.readyState)) load.call(this);
-                               });
-                       } else {
-                               script.addEvent('load', load);
-                       }
-               }
-
-               return script.set(properties).inject(doc.head);
-       },
-
-       css: function(source, properties){
-               if (!properties) properties = {};
-
-               var link = new Element('link', {
-                       rel: 'stylesheet',
-                       media: 'screen',
-                       type: 'text/css',
-                       href: source
-               });
-
-               var load = properties.onload || properties.onLoad,
-                       doc = properties.document || document;
-
-               delete properties.onload;
-               delete properties.onLoad;
-               delete properties.document;
-
-               if (load) link.addEvent('load', load);
-               return link.set(properties).inject(doc.head);
-       },
-
-       image: function(source, properties){
-               if (!properties) properties = {};
-
-               var image = new Image(),
-                       element = document.id(image) || new Element('img');
-
-               ['load', 'abort', 'error'].each(function(name){
-                       var type = 'on' + name,
-                               cap = 'on' + name.capitalize(),
-                               event = properties[type] || properties[cap] || function(){};
-
-                       delete properties[cap];
-                       delete properties[type];
-
-                       image[type] = function(){
-                               if (!image) return;
-                               if (!element.parentNode){
-                                       element.width = image.width;
-                                       element.height = image.height;
-                               }
-                               image = image.onload = image.onabort = image.onerror = null;
-                               event.delay(1, element, element);
-                               element.fireEvent(name, element, 1);
-                       };
-               });
-
-               image.src = element.src = source;
-               if (image && image.complete) image.onload.delay(1);
-               return element.set(properties);
-       },
-
-       images: function(sources, options){
-               sources = Array.from(sources);
-
-               var fn = function(){},
-                       counter = 0;
-
-               options = Object.merge({
-                       onComplete: fn,
-                       onProgress: fn,
-                       onError: fn,
-                       properties: {}
-               }, options);
-
-               return new Elements(sources.map(function(source, index){
-                       return Asset.image(source, Object.append(options.properties, {
-                               onload: function(){
-                                       counter++;
-                                       options.onProgress.call(this, counter, index, source);
-                                       if (counter == sources.length) options.onComplete();
-                               },
-                               onerror: function(){
-                                       counter++;
-                                       options.onError.call(this, counter, index, source);
-                                       if (counter == sources.length) options.onComplete();
-                               }
-                       }));
-               }));
-       }
-
-};
-
-
-// Begin: Source/Interface/Spinner.js
-/*
----
-
-script: Spinner.js
-
-name: Spinner
-
-description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Tween
-  - Core/Request
-  - /Class.refactor
-  - /Mask
-
-provides: [Spinner]
-
-...
-*/
-
-var Spinner = new Class({
-
-       Extends: Mask,
-
-       Implements: Chain,
-
-       options: {/*
-               message: false,*/
-               'class': 'spinner',
-               containerPosition: {},
-               content: {
-                       'class': 'spinner-content'
-               },
-               messageContainer: {
-                       'class': 'spinner-msg'
-               },
-               img: {
-                       'class': 'spinner-img'
-               },
-               fxOptions: {
-                       link: 'chain'
-               }
-       },
-
-       initialize: function(target, options){
-               this.target = document.id(target) || document.id(document.body);
-               this.target.store('spinner', this);
-               this.setOptions(options);
-               this.render();
-               this.inject();
-
-               // Add this to events for when noFx is true; parent methods handle hide/show.
-               var deactivate = function(){ this.active = false; }.bind(this);
-               this.addEvents({
-                       hide: deactivate,
-                       show: deactivate
-               });
-       },
-
-       render: function(){
-               this.parent();
-
-               this.element.set('id', this.options.id || 'spinner-' + String.uniqueID());
-
-               this.content = document.id(this.options.content) || new Element('div', this.options.content);
-               this.content.inject(this.element);
-
-               if (this.options.message){
-                       this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message);
-                       this.msg.inject(this.content);
-               }
-
-               if (this.options.img){
-                       this.img = document.id(this.options.img) || new Element('div', this.options.img);
-                       this.img.inject(this.content);
-               }
-
-               this.element.set('tween', this.options.fxOptions);
-       },
-
-       show: function(noFx){
-               if (this.active) return this.chain(this.show.bind(this));
-               if (!this.hidden){
-                       this.callChain.delay(20, this);
-                       return this;
-               }
-
-               this.active = true;
-
-               return this.parent(noFx);
-       },
-
-       showMask: function(noFx){
-               var pos = function(){
-                       this.content.position(Object.merge({
-                               relativeTo: this.element
-                       }, this.options.containerPosition));
-               }.bind(this);
-
-               if (noFx){
-                       this.parent();
-                       pos();
-               } else {
-                       if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat();
-                       this.element.setStyles({
-                               display: 'block',
-                               opacity: 0
-                       }).tween('opacity', this.options.style.opacity);
-                       pos();
-                       this.hidden = false;
-                       this.fireEvent('show');
-                       this.callChain();
-               }
-       },
-
-       hide: function(noFx){
-               if (this.active) return this.chain(this.hide.bind(this));
-               if (this.hidden){
-                       this.callChain.delay(20, this);
-                       return this;
-               }
-               this.active = true;
-               return this.parent(noFx);
-       },
-
-       hideMask: function(noFx){
-               if (noFx) return this.parent();
-               this.element.tween('opacity', 0).get('tween').chain(function(){
-                       this.element.setStyle('display', 'none');
-                       this.hidden = true;
-                       this.fireEvent('hide');
-                       this.callChain();
-               }.bind(this));
-       },
-
-       destroy: function(){
-               this.content.destroy();
-               this.parent();
-               this.target.eliminate('spinner');
-       }
-
-});
-
-Request = Class.refactor(Request, {
-
-       options: {
-               useSpinner: false,
-               spinnerOptions: {},
-               spinnerTarget: false
-       },
-
-       initialize: function(options){
-               this._send = this.send;
-               this.send = function(options){
-                       var spinner = this.getSpinner();
-                       if (spinner) spinner.chain(this._send.pass(options, this)).show();
-                       else this._send(options);
-                       return this;
-               };
-               this.previous(options);
-       },
-
-       getSpinner: function(){
-               if (!this.spinner){
-                       var update = document.id(this.options.spinnerTarget) || document.id(this.options.update);
-                       if (this.options.useSpinner && update){
-                               update.set('spinner', this.options.spinnerOptions);
-                               var spinner = this.spinner = update.get('spinner');
-                               ['complete', 'exception', 'cancel'].each(function(event){
-                                       this.addEvent(event, spinner.hide.bind(spinner));
-                               }, this);
-                       }
-               }
-               return this.spinner;
-       }
-
-});
-
-Element.Properties.spinner = {
-
-       set: function(options){
-               var spinner = this.retrieve('spinner');
-               if (spinner) spinner.destroy();
-               return this.eliminate('spinner').store('spinner:options', options);
-       },
-
-       get: function(){
-               var spinner = this.retrieve('spinner');
-               if (!spinner){
-                       spinner = new Spinner(this, this.retrieve('spinner:options'));
-                       this.store('spinner', spinner);
-               }
-               return spinner;
-       }
-
-};
-
-Element.implement({
-
-       spin: function(options){
-               if (options) this.set('spinner', options);
-               this.get('spinner').show();
-               return this;
-       },
-
-       unspin: function(){
-               this.get('spinner').hide();
-               return this;
-       }
-
-});
-
-
-// Begin: Source/Fx/Fx.Slide.js
-/*
----
-
-script: Fx.Slide.js
-
-name: Fx.Slide
-
-description: Effect to slide an element in and out of view.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx
-  - Core/Element.Style
-  - /MooTools.More
-
-provides: [Fx.Slide]
-
-...
-*/
-
-Fx.Slide = new Class({
-
-       Extends: Fx,
-
-       options: {
-               mode: 'vertical',
-               wrapper: false,
-               hideOverflow: true,
-               resetHeight: false
-       },
-
-       initialize: function(element, options){
-               element = this.element = this.subject = document.id(element);
-               this.parent(options);
-               options = this.options;
-
-               var wrapper = element.retrieve('wrapper'),
-                       styles = element.getStyles('margin', 'position', 'overflow');
-
-               if (options.hideOverflow) styles = Object.append(styles, {overflow: 'hidden'});
-               if (options.wrapper) wrapper = document.id(options.wrapper).setStyles(styles);
-
-               if (!wrapper) wrapper = new Element('div', {
-                       styles: styles
-               }).wraps(element);
-
-               element.store('wrapper', wrapper).setStyle('margin', 0);
-               if (element.getStyle('overflow') == 'visible') element.setStyle('overflow', 'hidden');
-
-               this.now = [];
-               this.open = true;
-               this.wrapper = wrapper;
-
-               this.addEvent('complete', function(){
-                       this.open = (wrapper['offset' + this.layout.capitalize()] != 0);
-                       if (this.open && this.options.resetHeight) wrapper.setStyle('height', '');
-               }, true);
-       },
-
-       vertical: function(){
-               this.margin = 'margin-top';
-               this.layout = 'height';
-               this.offset = this.element.offsetHeight;
-       },
-
-       horizontal: function(){
-               this.margin = 'margin-left';
-               this.layout = 'width';
-               this.offset = this.element.offsetWidth;
-       },
-
-       set: function(now){
-               this.element.setStyle(this.margin, now[0]);
-               this.wrapper.setStyle(this.layout, now[1]);
-               return this;
-       },
-
-       compute: function(from, to, delta){
-               return [0, 1].map(function(i){
-                       return Fx.compute(from[i], to[i], delta);
-               });
-       },
-
-       start: function(how, mode){
-               if (!this.check(how, mode)) return this;
-               this[mode || this.options.mode]();
-
-               var margin = this.element.getStyle(this.margin).toInt(),
-                       layout = this.wrapper.getStyle(this.layout).toInt(),
-                       caseIn = [[margin, layout], [0, this.offset]],
-                       caseOut = [[margin, layout], [-this.offset, 0]],
-                       start;
-
-               switch (how){
-                       case 'in': start = caseIn; break;
-                       case 'out': start = caseOut; break;
-                       case 'toggle': start = (layout == 0) ? caseIn : caseOut;
-               }
-               return this.parent(start[0], start[1]);
-       },
-
-       slideIn: function(mode){
-               return this.start('in', mode);
-       },
-
-       slideOut: function(mode){
-               return this.start('out', mode);
-       },
-
-       hide: function(mode){
-               this[mode || this.options.mode]();
-               this.open = false;
-               return this.set([-this.offset, 0]);
-       },
-
-       show: function(mode){
-               this[mode || this.options.mode]();
-               this.open = true;
-               return this.set([0, this.offset]);
-       },
-
-       toggle: function(mode){
-               return this.start('toggle', mode);
-       }
-
-});
-
-Element.Properties.slide = {
-
-       set: function(options){
-               this.get('slide').cancel().setOptions(options);
-               return this;
-       },
-
-       get: function(){
-               var slide = this.retrieve('slide');
-               if (!slide){
-                       slide = new Fx.Slide(this, {link: 'cancel'});
-                       this.store('slide', slide);
-               }
-               return slide;
-       }
-
-};
-
-Element.implement({
-
-       slide: function(how, mode){
-               how = how || 'toggle';
-               var slide = this.get('slide'), toggle;
-               switch (how){
-                       case 'hide': slide.hide(mode); break;
-                       case 'show': slide.show(mode); break;
-                       case 'toggle':
-                               var flag = this.retrieve('slide:flag', slide.open);
-                               slide[flag ? 'slideOut' : 'slideIn'](mode);
-                               this.store('slide:flag', !flag);
-                               toggle = true;
-                       break;
-                       default: slide.start(how, mode);
-               }
-               if (!toggle) this.eliminate('slide:flag');
-               return this;
-       }
-
-});
-
-
-// Begin: Source/UI/StickyWin.UI.Pointy.js
-/*
----
-name: StickyWin.UI.Pointy
-
-description: Creates an html holder for in-page popups using a default style - this one including a pointer in the specified direction.
-
-license: MIT-Style License
-
-requires: [More/Element.Shortcuts, More/Element.Position, StickyWin.UI]
-
-provides: [StickyWin.UI.Pointy, StickyWin.UI.pointy]
-...
-*/
-StickyWin.UI.Pointy = new Class({
-       Extends: StickyWin.UI,
-       options: {
-               theme: 'dark',
-               themes: {
-                       dark: {
-                               bgColor: '#333',
-                               fgColor: '#ddd',
-                               imgset: 'dark'
-                       },
-                       light: {
-                               bgColor: '#ccc',
-                               fgColor: '#333',
-                               imgset: 'light'
-                       }
-               },
-               css: "div.DefaultPointyTip {vertical-align: auto; position: relative;}"+
-               "div.DefaultPointyTip * {text-align:left !important}"+
-               "div.DefaultPointyTip .pointyWrapper div.body{background: {%bgColor%}; color: {%fgColor%}; left: 0px; right: 0px !important;padding:  0px 10px !important;margin-left: 0px !important;font-family: verdana;font-size: 11px;line-height: 13px;position: relative;}"+
-               "div.DefaultPointyTip .pointyWrapper div.top {position: relative;height: 25px; overflow: visible;}"+
-               "div.DefaultPointyTip .pointyWrapper div.top_ul{background: url({%baseHref%}{%imgset%}_back.png) top left no-repeat;width: 8px;height: 25px; position: absolute; left: 0px;}"+
-               "div.DefaultPointyTip .pointyWrapper div.top_ur{background: url({%baseHref%}{%imgset%}_back.png) top right !important;margin: 0 0 0 8px !important;height: 25px;position: relative;left: 0px !important;padding: 0;}"+
-               "div.DefaultPointyTip .pointyWrapper h1.caption{color: {%fgColor%};left: 0px !important;top: 4px !important;clear: none !important;overflow: hidden;font-weight: 700;font-size: 12px !important;position: relative;float: left;height: 22px !important;margin: 0 !important;padding: 0 !important;}"+
-               "div.DefaultPointyTip .pointyWrapper div.middle, div.DefaultPointyTip .pointyWrapper div.closeBody{background:  {%bgColor%};margin: 0 0px 0 0 !important;position: relative;top: 0 !important;}"+
-               "div.DefaultPointyTip .pointyWrapper div.middle {min-height: 16px; background:  {%bgColor%};margin: 0 0px 0 0 !important;position: relative;top: 0 !important;}"+
-               "div.DefaultPointyTip .pointyWrapper div.bottom {clear: both; width: 100% !important; background: none; height: 6px} "+
-               "div.DefaultPointyTip .pointyWrapper div.bottom_ll{font-size:1; background: url({%baseHref%}{%imgset%}_back.png) bottom left no-repeat;width: 6px;height: 6px;position: absolute; left: 0px;}"+
-               "div.DefaultPointyTip .pointyWrapper div.bottom_lr{font-size:1; background: url({%baseHref%}{%imgset%}_back.png) bottom right;height: 6px;margin: 0 0 0 6px !important;position: relative;left: 0 !important;}"+
-               "div.DefaultPointyTip .pointyWrapper div.noCaption{ height: 6px; overflow: hidden}"+
-               "div.DefaultPointyTip .pointyWrapper div.closeButton{width:13px; height:13px; background:url({%baseHref%}{%imgset%}_x.png) no-repeat; position: absolute; right: 0px; margin:0px !important; cursor:pointer; z-index: 1; top: 4px;}"+
-               "div.DefaultPointyTip .pointyWrapper div.pointyDivot {background: url({%divot%}) no-repeat;}",
-               divot: '{%baseHref%}{%imgset%}_divot.png',
-               divotSize: 22,
-               direction: 12,
-               cssId: 'defaultPointyTipStyle',
-               cssClassName: 'DefaultPointyTip'
-       },
-       initialize: function() {
-               var args = this.getArgs(arguments);
-               this.setOptions(args.options);
-               Object.append(this.options, this.options.themes[this.options.theme]);
-               this.options.baseHref = this.options.baseHref || Clientcide.assetLocation + '/PointyTip/';
-               this.options.divot = this.options.divot.substitute(this.options, /\\?\{%([^}]+)%\}/g);
-               if (Browser.ie) this.options.divot = this.options.divot.replace(/png/g, 'gif');
-               this.options.css = this.options.css.substitute(this.options, /\\?\{%([^}]+)%\}/g);
-               if (args.options && args.options.theme) {
-                       while (!this.id) {
-                               var id = Number.random(0, 999999999);
-                               if (!StickyWin.UI.Pointy[id]) {
-                                       StickyWin.UI.Pointy[id] = this;
-                                       this.id = id;
-                               }
-                       }
-                       this.options.css = this.options.css.replace(/div\.DefaultPointyTip/g, "div#pointy_"+this.id);
-                       this.options.cssId = "pointyTipStyle_" + this.id;
-               }
-               if (typeOf(this.options.direction) == 'string') {
-                       var map = {
-                               left: 9,
-                               right: 3,
-                               up: 12,
-                               down: 6
-                       };
-                       this.options.direction = map[this.options.direction];
-               }
-
-               this.parent(args.caption, args.body, this.options);
-               if (this.id) document.id(this).set('id', "pointy_"+this.id);
-       },
-       build: function(){
-               this.parent();
-               var opt = this.options;
-               this.pointyWrapper = new Element('div', {
-                       'class': 'pointyWrapper'
-               }).inject(document.id(this));
-               document.id(this).getChildren().each(function(el){
-                       if (el != this.pointyWrapper) this.pointyWrapper.grab(el);
-               }, this);
-
-               var w = opt.divotSize;
-               var h = w;
-               var left = (opt.width.toInt() - opt.divotSize)/2;
-               var orient = function(){
-                       switch(opt.direction) {
-                               case 12: case 1: case 11:
-                                       return {
-                                               height: h/2
-                                       };
-                               case 5: case 6: case 7:
-                                       return {
-                                               height: h/2,
-                                               backgroundPosition: '0 -'+h/2+'px'
-                                       };
-                               case 8: case 9: case 10:
-                                       return {
-                                               width: w/2
-                                       };
-                               case 2: case 3: case 4:
-                                       return {
-                                               width: w/2,
-                                               backgroundPosition: '100%'
-                                       };
-                       };
-               };
-               this.pointer = new Element('div', {
-                       styles: Object.append({
-                               width: w,
-                               height: h,
-                               overflow: 'hidden'
-                       }, orient()),
-                       'class': 'pointyDivot pointy_'+opt.direction
-               }).inject(this.pointyWrapper);
-       },
-       expose: function(){
-               if (document.id(this).getStyle('display') != 'none' &&
-                 document.body != document.id(this) &&
-                 document.id(document.body).contains(document.id(this))) return function(){};
-               document.id(this).setStyles({
-                       visibility: 'hidden',
-                       position: 'absolute'
-               });
-               var dispose;
-               if (document.body != document.id(this) && !document.body.contains(document.id(this))) {
-                       document.id(this).inject(document.body);
-                       dispose = true;
-               }
-               return (function(){
-                       if (dispose) document.id(this).dispose();
-                       document.id(this).setStyles({
-                               visibility: 'visible',
-                               position: 'relative'
-                       });
-               }).bind(this);
-       },
-       positionPointer: function(options){
-               if (!this.pointer) return;
-               var opt = options || this.options;
-               var pos;
-               var d = opt.direction;
-               switch (d){
-                       case 12: case 1: case 11:
-                               pos = {
-                                       edge: {x: 'center', y: 'bottom'},
-                                       position: {
-                                               x: d==12?'center':d==1?'right':'left',
-                                               y: 'top'
-                                       },
-                                       offset: {
-                                               x: (d==12?0:d==1?-1:1)*opt.divotSize,
-                                               y: 1
-                                       }
-                               };
-                               break;
-                       case 2: case 3: case 4:
-                               pos = {
-                                       edge: {x: 'left', y: 'center'},
-                                       position: {
-                                               x: 'right',
-                                               y: d==3?'center':d==2?'top':'bottom'
-                                       },
-                                       offset: {
-                                               x: -1,
-                                               y: (d==3?0:d==4?-1:1)*opt.divotSize
-                                       }
-                               };
-                               break;
-                       case 5: case 6: case 7:
-                               pos = {
-                                       edge: {x: 'center', y: 'top'},
-                                       position: {
-                                               x: d==6?'center':d==5?'right':'left',
-                                               y: 'bottom'
-                                       },
-                                       offset: {
-                                               x: (d==6?0:d==5?-1:1)*opt.divotSize,
-                                               y: -1
-                                       }
-                               };
-                               break;
-                       case 8: case 9: case 10:
-                               pos = {
-                                       edge: {x: 'right', y: 'center'},
-                                       position: {
-                                               x: 'left',
-                                               y: d==9?'center':d==10?'top':'bottom'
-                                       },
-                                       offset: {
-                                               x: 1,
-                                               y: (d==9?0:d==8?-1:1)*opt.divotSize
-                                       }
-                               };
-                               break;
-               };
-               var putItBack = this.expose();
-               this.pointer.position(Object.append({
-                       relativeTo: this.pointyWrapper,
-                       allowNegative: true
-               }, pos, options));
-               putItBack();
-       },
-       setContent: function(a1, a2){
-               this.parent(a1, a2);
-               this.top[this.h1?'removeClass':'addClass']('noCaption');
-               if (Browser.ie) document.id(this).getElements('.bottom_ll, .bottom_lr').setStyle('font-size', 1); //IE6 bullshit
-               if (this.options.closeButton) this.body.setStyle('margin-right', 6);
-               this.positionPointer();
-               return this;
-       },
-       makeCaption: function(caption){
-               this.parent(caption);
-               if (this.options.width && this.h1) this.h1.setStyle('width', (this.options.width.toInt()-(this.options.closeButton?25:15)));
-       }
-});
-
-StickyWin.UI.pointy = function(caption, body, options){
-       return document.id(new StickyWin.UI.Pointy(caption, body, options));
-};
-StickyWin.ui.pointy = StickyWin.UI.pointy;
-
-// Begin: Source/UI/StickyWin.PointyTip.js
-/*
----
-name: StickyWin.PointyTip
-
-description: Positions a pointy tip relative to the element you specify.
-
-license: MIT-Style License
-
-requires: StickyWin.UI.Pointy
-
-provides: StickyWin.PointyTip
-
-...
-*/
-StickyWin.PointyTip = new Class({
-       Extends: StickyWin,
-       options: {
-               point: "left",
-               pointyOptions: {}
-       },
-       initialize: function(){
-               var args = this.getArgs(arguments);
-               this.setOptions(args.options);
-               var popts = this.options.pointyOptions;
-               var d = popts.direction;
-               if (!d) {
-                       var map = {
-                               left: 9,
-                               right: 3,
-                               up: 12,
-                               down: 6
-                       };
-                       d = map[this.options.point];
-                       if (!d) d = this.options.point;
-                       popts.direction = d;
-               }
-               if (!popts.width) popts.width = this.options.width;
-               this.pointy = new StickyWin.UI.Pointy(args.caption, args.body, popts);
-               this.options.content = null;
-               this.setOptions(args.options, this.getPositionSettings());
-               this.parent(this.options);
-               this.win.empty().adopt(document.id(this.pointy));
-               this.attachHandlers(this.win);
-               if (this.options.showNow) this.position();
-       },
-       getArgs: function(){
-               return StickyWin.UI.getArgs.apply(this, arguments);
-       },
-       getPositionSettings: function(){
-               var s = this.pointy.options.divotSize;
-               var d = this.options.point;
-               var offset = this.options.offset || {};
-               switch(d) {
-                       case "left": case 8: case 9: case 10:
-                               return {
-                                       edge: {
-                                               x: 'left',
-                                               y: d==10?'top':d==8?'bottom':'center'
-                                       },
-                                       position: {x: 'right', y: 'center'},
-                                       offset: {
-                                               x: s + (offset.x || 0),
-                                               y: offset.y || 0
-                                       }
-                               };
-                       case "right": case 2:  case 3: case 4:
-                               return {
-                                       edge: {
-                                               x: 'right',
-                                               y: (d==2?'top':d==4?'bottom':'center') + (offset.y || 0)
-                                       },
-                                       position: {x: 'left', y: 'center'},
-                                       offset: {
-                                               x: -s + (offset.x || 0),
-                                               y: offset.y || 0
-                                       }
-                               };
-                       case "up": case 11: case 12: case 1:
-                               return {
-                                       edge: {
-                                               x: d==11?'left':d==1?'right':'center',
-                                               y: 'top'
-                                       },
-                                       position: {     x: 'center', y: 'bottom' },
-                                       offset: {
-                                               y: s + (offset.y || 0),
-                                               x: (d==11?-s:d==1?s:0) + (offset.x || 0)
-                                       }
-                               };
-                       case "down": case 5: case 6: case 7:
-                               return {
-                                       edge: {
-                                               x: (d==7?'left':d==5?'right':'center') + (offset.x || 0),
-                                               y: 'bottom'
-                                       },
-                                       position: {x: 'center', y: 'top'},
-                                       offset: {
-                                               y: -s + (offset.y || 0),
-                                               x: (d==7?-s:d==5?s:0) + (offset.x || 0)
-                                       }
-                               };
-               };
-       },
-       setContent: function() {
-               var args = this.getArgs(arguments);
-               this.pointy.setContent(args.caption, args.body);
-               [this.pointy.h1, this.pointy.body].each(this.attachHandlers, this);
-               if (this.visible) this.position();
-               return this;
-       },
-       showWin: function(){
-               this.parent();
-               this.pointy.positionPointer();
-       },
-       position: function(options){
-               this.parent(options);
-               this.pointy.positionPointer();
-       },
-       attachHandlers: function(content) {
-               if (!content) return;
-               content.getElements('.'+this.options.closeClassName).addEvent('click', function(){ this.hide(); }.bind(this));
-               content.getElements('.'+this.options.pinClassName).addEvent('click', function(){ this.togglepin(); }.bind(this));
-       }
-});
-
-// Begin: Source/UI/StickyWin.Ajax.js
-/*
----
-
-name: StickyWin.Ajax
-
-description: Adds ajax functionality to all the StickyWin classes.
-
-license: MIT-Style License
-
-requires: [Core/Request, StickyWin, StickyWin.UI, StickyWin.PointyTip]
-
-provides: [StickyWin.Ajax, StickyWin.Modal.Ajax, StickyWin.PointyTip.Ajax]
-
-...
-*/
-(function(){
-       var SWA = function(extend){
-               return {
-                       Extends: extend,
-                       options: {
-                               //onUpdate: function(){},
-                               url: '',
-                               showNow: false,
-                               cacheRequest: false,
-                               requestOptions: {
-                                       method: 'get',
-                                       evalScripts: true
-                               },
-                               wrapWithUi: false,
-                               caption: '',
-                               uiOptions:{},
-                               cacheRequest: false,
-                               handleResponse: function(response){
-                                       if(this.options.cacheRequest) {
-                                               this.element.store(this.Request.options.url, response);
-                                       }
-                                       var responseScript = "";
-                                       this.Request.response.text.stripScripts(function(script){       responseScript += script; });
-                                       if (this.options.wrapWithUi) response = StickyWin.ui(this.options.caption, response, this.options.uiOptions);
-                                       this.setContent(response);
-                                       this.show();
-                                       if (this.evalScripts) Browser.exec(responseScript);
-                                       this.fireEvent('update');
-                               }
-                       },
-                       initialize: function(options){
-                               var showNow;
-                               if (options && options.showNow) {
-                                       showNow = true;
-                                       options.showNow = false;
-                               }
-                               this.parent(options);
-                               this.evalScripts = this.options.requestOptions.evalScripts;
-                               this.options.requestOptions.evalScripts = false;
-                               this.createRequest();
-                               if (showNow) this.update();
-                       },
-                       createRequest: function(){
-                               this.Request = new Request(this.options.requestOptions).addEvent('onSuccess',
-                                       this.options.handleResponse.bind(this));
-                       },
-                       update: function(url, options){
-                               this.Request.options.url = url || options.url;
-                               var cachedResponse;
-                               if(this.options.cacheRequest) {
-                                       cachedResponse = this.element.retrieve(url);
-                               }
-                               if(!cachedResponse) {
-                                       this.Request.setOptions(options).send({url: url||this.options.url});
-                                       return this;
-                               } else {
-                                       this.Request.fireEvent('onSuccess', cachedResponse);
-                                       return this;
-                               }
-                       }
-               };
-       };
-       try { StickyWin.Ajax = new Class(SWA(StickyWin)); } catch(e){}
-       try { StickyWin.Modal.Ajax = new Class(SWA(StickyWin.Modal)); } catch(e){}
-       try { StickyWin.PointyTip.Ajax = new Class(SWA(StickyWin.PointyTip)); } catch(e){}
-})();
-
-// Begin: Source/Layout/MultipleOpenAccordion.js
-/*
----
-name: MultipleOpenAccordion
-
-description: Creates a Mootools Fx.Accordion that allows the user to open more than one element.
-
-license: MIT-Style License
-
-requires: [Core/Element.Event, More/Fx.Reveal]
-
-provides: MultipleOpenAccordion
-
-...
-*/
-var MultipleOpenAccordion = new Class({
-       Implements: [Options, Events, Chain],
-       options: {
-               togglers: [],
-               elements: [],
-               openAll: false,
-               firstElementsOpen: [0],
-               fixedHeight: null,
-               fixedWidth: null,
-               height: true,
-               opacity: true,
-               width: false
-               //onActive: function(){},
-               //onBackground: function(){}
-       },
-       togglers: [],
-       elements: [],
-       initialize: function(options){
-               var args = Array.link(arguments, {options: Type.isObject, elements: Type.isElements});
-               this.setOptions(args.options);
-               elements = $$(this.options.elements);
-               $$(this.options.togglers).each(function(toggler, idx){
-                       this.addSection(toggler, elements[idx], idx);
-               }, this);
-               if (this.togglers.length) {
-                       if (this.options.openAll) this.showAll();
-                       else this.toggleSections(this.options.firstElementsOpen, false, true);
-               }
-               this.openSections = this.showSections.bind(this);
-               this.closeSections = this.hideSections.bind(this);
-       },
-       addSection: function(toggler, element){
-               toggler = document.id(toggler);
-               element = document.id(element);
-               var test = this.togglers.contains(toggler);
-               var len = this.togglers.length;
-               this.togglers.include(toggler);
-               this.elements.include(element);
-               var idx = this.togglers.indexOf(toggler);
-               var displayer = this.toggleSection.bind(this, idx);
-               toggler.addEvent('click', displayer).store('multipleOpenAccordion:display', displayer);
-               var mode;
-               if (this.options.height && this.options.width) mode = "both";
-               else mode = (this.options.height)?"vertical":"horizontal";
-               element.store('moa:reveal', new Fx.Reveal(element, {
-                       transitionOpacity: this.options.opacity,
-                       mode: mode,
-                       heightOverride: this.options.fixedHeight,
-                       widthOverride: this.options.fixedWidth
-               }));
-               return this;
-       },
-       removeSection: function(toggler) {
-               var idx = this.togglers.indexOf(toggler);
-               var element = this.elements[idx];
-               element.dissolve();
-               this.togglers.erase(toggler);
-               this.elements.erase(element);
-               this.detach(toggler);
-               return this;
-       },
-       detach: function(toggler){
-               var remove = function(toggler) {
-                       toggler.removeEvent(this.options.trigger, toggler.retrieve('multipleOpenAccordion:display'));
-               }.bind(this);
-               if (!toggler) this.togglers.each(remove);
-               else remove(toggler);
-               return this;
-       },
-       onComplete: function(idx, callChain){
-               this.fireEvent(this.elements[idx].isDisplayed()?'onActive':'onBackground', [this.togglers[idx], this.elements[idx]]);
-               this.callChain();
-               return this;
-       },
-       showSection: function(idx, useFx){
-               this.toggleSection(idx, useFx, true);
-       },
-       hideSection: function(idx, useFx){
-               this.toggleSection(idx, useFx, false);
-       },
-       toggleSection: function(idx, useFx, show, callChain){
-               var method = show?'reveal':show != null?'dissolve':'toggle';
-               callChain = [callChain, true].pick();
-               var el = this.elements[idx];
-               if (useFx != null ? useFx : true) {
-                       el.retrieve('moa:reveal')[method]().chain(
-                               this.onComplete.bind(this, idx, callChain)
-                       );
-               } else {
-                               if (method == "toggle") el.toggle();
-                               else el[method == "reveal"?'show':'hide']();
-                               this.onComplete(idx, callChain);
-               }
-               return this;
-       },
-       toggleAll: function(useFx, show){
-               var method = show?'reveal':(show!=null)?'disolve':'toggle';
-               var last = this.elements.getLast();
-               this.elements.each(function(el, idx){
-                       this.toggleSection(idx, useFx, show, el == last);
-               }, this);
-               return this;
-       },
-       toggleSections: function(sections, useFx, show) {
-               last = sections.getLast();
-               this.elements.each(function(el,idx){
-                       this.toggleSection(idx, useFx, sections.contains(idx)?show:!show, idx == last);
-               }, this);
-               return this;
-       },
-       showSections: function(sections, useFx){
-               sections.each(function(i){
-                       this.showSection(i, useFx);
-               }, this);
-       },
-       hideSections: function(sections, useFx){
-               sections.each(function(i){
-                       this.hideSection(i, useFx);
-               }, this);
-       },
-       showAll: function(useFx){
-               return this.toggleAll(useFx, true);
-       },
-       hideAll: function(useFx){
-               return this.toggleAll(useFx, false);
-       }
-});
-
-