15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Core.js
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MooTools - My Object Oriented JavaScript Tools.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Copyright:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Copyright (c) 2006-2008 [Valerio Proietti](http://mad4milk.net/).
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Code & Documentation:
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	[The MooTools production team](http://mootools.net/developers/).
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Inspiration:
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	- 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)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var MooTools = {
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'version': '1.2.2',
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'build': 'f0491d62fbb7e906789aa3733d6a67d43e5af7c9'
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Native = function(options){
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options = options || {};
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var name = options.name;
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var legacy = options.legacy;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var protect = options.protect;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var methods = options.implement;
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var generics = options.generics;
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var initialize = options.initialize;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var afterImplement = options.afterImplement || function(){};
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var object = initialize || legacy;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	generics = generics !== false;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	object.constructor = Native;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	object.$family = {name: 'native'};
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (legacy && initialize) object.prototype = legacy.prototype;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	object.prototype.constructor = object;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (name){
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var family = name.toLowerCase();
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		object.prototype.$family = {name: family};
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Native.typize(object, family);
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var add = function(obj, name, method, force){
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (generics) Native.genericize(obj, name, protect);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		afterImplement.call(obj, name, method);
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return obj;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	object.alias = function(a1, a2, a3){
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (typeof a1 == 'string'){
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if ((a1 = this.prototype[a1])) return add(this, a2, a1, a3);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var a in a1) this.alias(a, a1[a], a2);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	object.implement = function(a1, a2, a3){
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (typeof a1 == 'string') return add(this, a1, a2, a3);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var p in a1) add(this, p, a1[p], a2);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (methods) object.implement(methods);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return object;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.genericize = function(object, property, check){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var args = Array.prototype.slice.call(arguments);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return object.prototype[property].apply(args.shift(), args);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement = function(objects, properties){
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.typize = function(object, family){
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (!object.type) object.type = function(item){
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return ($type(item) === family);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var natives = {'Array': Array, 'Date': Date, 'Function': Function, 'Number': Number, 'RegExp': RegExp, 'String': String};
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var n in natives) new Native({name: n, initialize: natives[n], protect: true});
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var types = {'boolean': Boolean, 'native': Native, 'object': Object};
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var t in types) Native.typize(types[t], t);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var generics = {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"],
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var g in generics){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = generics[g].length; i--;) Native.genericize(window[g], generics[g][i], true);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Hash = new Native({
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	name: 'Hash',
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(object){
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(object) == 'hash') object = $unlink(object.getClean());
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in object) this[key] = object[key];
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.implement({
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	forEach: function(fn, bind){
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in this){
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getClean: function(){
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var clean = {};
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in this){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this.hasOwnProperty(key)) clean[key] = this[key];
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return clean;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getLength: function(){
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var length = 0;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in this){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this.hasOwnProperty(key)) length++;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return length;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.alias('forEach', 'each');
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Array.implement({
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	forEach: function(fn, bind){
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this);
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Array.alias('forEach', 'each');
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $A(iterable){
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (iterable.item){
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var l = iterable.length, array = new Array(l);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while (l--) array[l] = iterable[l];
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return array;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return Array.prototype.slice.call(iterable);
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $arguments(i){
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return function(){
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return arguments[i];
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $chk(obj){
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return !!(obj || obj === 0);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $clear(timer){
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	clearTimeout(timer);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	clearInterval(timer);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return null;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $defined(obj){
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (obj != undefined);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $each(iterable, fn, bind){
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var type = $type(iterable);
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $empty(){};
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $extend(original, extended){
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var key in (extended || {})) original[key] = extended[key];
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return original;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $H(object){
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return new Hash(object);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $lambda(value){
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (typeof value == 'function') ? value : function(){
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return value;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $merge(){
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var args = Array.slice(arguments);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	args.unshift({});
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return $mixin.apply(null, args);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $mixin(mix){
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var i = 1, l = arguments.length; i < l; i++){
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var object = arguments[i];
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(object) != 'object') continue;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in object){
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var op = object[key], mp = mix[key];
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $mixin(mp, op) : $unlink(op);
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return mix;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $pick(){
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var i = 0, l = arguments.length; i < l; i++){
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (arguments[i] != undefined) return arguments[i];
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return null;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $random(min, max){
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return Math.floor(Math.random() * (max - min + 1) + min);
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $splat(obj){
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var type = $type(obj);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : [];
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var $time = Date.now || function(){
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return +new Date;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $try(){
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var i = 0, l = arguments.length; i < l; i++){
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		try {
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return arguments[i]();
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} catch(e){}
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return null;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $type(obj){
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (obj == undefined) return false;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name;
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (obj.nodeName){
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (obj.nodeType){
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 1: return 'element';
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	} else if (typeof obj.length == 'number'){
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (obj.callee) return 'arguments';
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else if (obj.item) return 'collection';
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return typeof obj;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $unlink(object){
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var unlinked;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	switch ($type(object)){
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		case 'object':
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			unlinked = {};
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var p in object) unlinked[p] = $unlink(object[p]);
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		break;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		case 'hash':
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			unlinked = new Hash(object);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		break;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		case 'array':
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			unlinked = [];
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		break;
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		default: return object;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return unlinked;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Browser.js
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash.
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Browser = $merge({
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Engine: {name: 'unknown', version: 0},
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Plugins: {},
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Engines: {
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		presto: function(){
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		trident: function(){
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? 5 : 4);
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		webkit: function(){
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		gecko: function(){
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (document.getBoxObjectFor == undefined) ? false : ((document.getElementsByClassName) ? 19 : 18);
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}, Browser || {});
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Browser.Platform[Browser.Platform.name] = true;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Browser.detect = function(){
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var engine in this.Engines){
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var version = this.Engines[engine]();
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (version){
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.Engine = {name: engine, version: version};
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.Engine[engine] = this.Engine[engine + version] = true;
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			break;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return {name: engine, version: version};
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Browser.detect();
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Browser.Request = function(){
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return $try(function(){
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new XMLHttpRequest();
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}, function(){
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new ActiveXObject('MSXML2.XMLHTTP');
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Browser.Features.xhr = !!(Browser.Request());
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Browser.Plugins.Flash = (function(){
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var version = ($try(function(){
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return navigator.plugins['Shockwave Flash'].description;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}, function(){
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}) || '0 r0').match(/\d+/g);
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $exec(text){
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (!text) return text;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (window.execScript){
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		window.execScript(text);
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	} else {
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var script = document.createElement('script');
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		script.setAttribute('type', 'text/javascript');
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text;
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		document.head.appendChild(script);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		document.head.removeChild(script);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return text;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.UID = 1;
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var $uid = (Browser.Engine.trident) ? function(item){
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (item.uid || (item.uid = [Native.UID++]))[0];
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} : function(item){
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return item.uid || (item.uid = Native.UID++);
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Window = new Native({
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	name: 'Window',
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	legacy: (Browser.Engine.trident) ? null: window.Window,
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(win){
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		$uid(win);
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!win.Element){
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			win.Element = $empty;
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {};
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		win.document.window = win;
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $extend(win, Window.Prototype);
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	afterImplement: function(property, value){
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		window[property] = Window.Prototype[property] = value;
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Window.Prototype = {$family: {name: 'window'}};
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)new Window(window);
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Document = new Native({
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	name: 'Document',
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	legacy: (Browser.Engine.trident) ? null: window.Document,
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(doc){
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		$uid(doc);
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		doc.head = doc.getElementsByTagName('head')[0];
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		doc.html = doc.getElementsByTagName('html')[0];
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.trident && Browser.Engine.version <= 4) $try(function(){
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			doc.execCommand("BackgroundImageCache", false, true);
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.trident) doc.window.attachEvent('onunload', function() {
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			doc.window.detachEvent('onunload', arguments.callee);
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			doc.head = doc.html = doc.window = null;
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $extend(doc, Document.Prototype);
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	afterImplement: function(property, value){
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		document[property] = Document.Prototype[property] = value;
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Document.Prototype = {$family: {name: 'document'}};
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)new Document(document);
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Array.js
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains Array Prototypes like each, contains, and erase.
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Array.implement({
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	every: function(fn, bind){
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++){
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!fn.call(bind, this[i], i, this)) return false;
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	filter: function(fn, bind){
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var results = [];
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++){
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (fn.call(bind, this[i], i, this)) results.push(this[i]);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return results;
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	clean: function() {
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.filter($defined);
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	indexOf: function(item, from){
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var len = this.length;
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this[i] === item) return i;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return -1;
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	map: function(fn, bind){
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var results = [];
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this);
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return results;
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	some: function(fn, bind){
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++){
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (fn.call(bind, this[i], i, this)) return true;
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return false;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	associate: function(keys){
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var obj = {}, length = Math.min(this.length, keys.length);
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return obj;
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	link: function(object){
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var result = {};
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++){
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var key in object){
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (object[key](this[i])){
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					result[key] = this[i];
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					delete object[key];
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					break;
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return result;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	contains: function(item, from){
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.indexOf(item, from) != -1;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	extend: function(array){
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getLast: function(){
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.length) ? this[this.length - 1] : null;
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getRandom: function(){
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.length) ? this[$random(0, this.length - 1)] : null;
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	include: function(item){
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.contains(item)) this.push(item);
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	combine: function(array){
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	erase: function(item){
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = this.length; i--; i){
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this[i] === item) this.splice(i, 1);
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	empty: function(){
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.length = 0;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	flatten: function(){
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var array = [];
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = this.length; i < l; i++){
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var type = $type(this[i]);
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!type) continue;
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]);
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return array;
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	hexToRgb: function(array){
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.length != 3) return null;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var rgb = this.map(function(value){
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (value.length == 1) value += value;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return value.toInt(16);
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (array) ? rgb : 'rgb(' + rgb + ')';
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	rgbToHex: function(array){
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.length < 3) return null;
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var hex = [];
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0; i < 3; i++){
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var bit = (this[i] - 0).toString(16);
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			hex.push((bit.length == 1) ? '0' + bit : bit);
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (array) ? hex : '#' + hex.join('');
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Function.js
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains Function Prototypes like create, bind, pass, and delay.
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Function.implement({
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	extend: function(properties){
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var property in properties) this[property] = properties[property];
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	create: function(options){
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var self = this;
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		options = options || {};
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return function(event){
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var args = options.arguments;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options.event) args = [event || window.event].extend(args);
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var returns = function(){
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return self.apply(options.bind || null, args);
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			};
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options.delay) return setTimeout(returns, options.delay);
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options.periodical) return setInterval(returns, options.periodical);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options.attempt) return $try(returns);
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return returns();
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		};
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	run: function(args, bind){
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.apply(bind, $splat(args));
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	pass: function(args, bind){
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.create({bind: bind, arguments: args});
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	bind: function(bind, args){
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.create({bind: bind, arguments: args});
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	bindWithEvent: function(bind, args){
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.create({bind: bind, arguments: args, event: true});
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	attempt: function(args, bind){
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.create({bind: bind, arguments: args, attempt: true})();
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	delay: function(delay, bind, args){
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.create({bind: bind, arguments: args, delay: delay})();
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	periodical: function(periodical, bind, args){
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.create({bind: bind, arguments: args, periodical: periodical})();
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Number.js
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains Number Prototypes like limit, round, times, and ceil.
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Number.implement({
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	limit: function(min, max){
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.min(max, Math.max(min, this));
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	round: function(precision){
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		precision = Math.pow(10, precision || 0);
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.round(this * precision) / precision;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	times: function(fn, bind){
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0; i < this; i++) fn.call(bind, i, this);
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toFloat: function(){
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return parseFloat(this);
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toInt: function(base){
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return parseInt(this, base || 10);
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Number.alias('times', 'each');
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(math){
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var methods = {};
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	math.each(function(name){
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!Number[name]) methods[name] = function(){
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return Math[name].apply(null, [this].concat($A(arguments)));
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		};
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Number.implement(methods);
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: String.js
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains String Prototypes like camelCase, capitalize, test, and toInt.
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String.implement({
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	test: function(regex, params){
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this);
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	contains: function(string, separator){
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	trim: function(){
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(/^\s+|\s+$/g, '');
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	clean: function(){
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(/\s+/g, ' ').trim();
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	camelCase: function(){
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(/-\D/g, function(match){
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return match.charAt(1).toUpperCase();
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	hyphenate: function(){
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(/[A-Z]/g, function(match){
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return ('-' + match.charAt(0).toLowerCase());
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	capitalize: function(){
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(/\b[a-z]/g, function(match){
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return match.toUpperCase();
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	escapeRegExp: function(){
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toInt: function(base){
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return parseInt(this, base || 10);
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toFloat: function(){
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return parseFloat(this);
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	hexToRgb: function(array){
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (hex) ? hex.slice(1).hexToRgb(array) : null;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	rgbToHex: function(array){
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var rgb = this.match(/\d{1,3}/g);
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (rgb) ? rgb.rgbToHex(array) : null;
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	stripScripts: function(option){
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var scripts = '';
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			scripts += arguments[1] + '\n';
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return '';
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (option === true) $exec(scripts);
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else if ($type(option) == 'function') option(scripts, text);
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return text;
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	substitute: function(object, regexp){
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (match.charAt(0) == '\\') return match.slice(1);
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (object[name] != undefined) ? object[name] : '';
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Hash.js
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.implement({
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	has: Object.prototype.hasOwnProperty,
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	keyOf: function(value){
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in this){
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this.hasOwnProperty(key) && this[key] === value) return key;
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return null;
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	hasValue: function(value){
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (Hash.keyOf(this, value) !== null);
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	extend: function(properties){
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(properties, function(value, key){
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Hash.set(this, key, value);
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	combine: function(properties){
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(properties, function(value, key){
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Hash.include(this, key, value);
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	erase: function(key){
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.hasOwnProperty(key)) delete this[key];
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(key){
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.hasOwnProperty(key)) ? this[key] : null;
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(key, value){
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	empty: function(){
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(this, function(value, key){
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			delete this[key];
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	include: function(key, value){
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this[key] == undefined) this[key] = value;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	map: function(fn, bind){
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var results = new Hash;
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(this, function(value, key){
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			results.set(key, fn.call(bind, value, key, this));
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return results;
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	filter: function(fn, bind){
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var results = new Hash;
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(this, function(value, key){
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (fn.call(bind, value, key, this)) results.set(key, value);
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return results;
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	every: function(fn, bind){
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in this){
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false;
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	some: function(fn, bind){
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var key in this){
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true;
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return false;
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getKeys: function(){
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var keys = [];
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(this, function(value, key){
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			keys.push(key);
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return keys;
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getValues: function(){
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var values = [];
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(this, function(value){
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			values.push(value);
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return values;
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toQueryString: function(base){
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var queryString = [];
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Hash.each(this, function(value, key){
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (base) key = base + '[' + key + ']';
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var result;
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			switch ($type(value)){
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				case 'object': result = Hash.toQueryString(value, key); break;
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				case 'array':
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					var qs = {};
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					value.each(function(val, i){
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)						qs[i] = val;
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					});
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					result = Hash.toQueryString(qs, key);
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				break;
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				default: result = key + '=' + encodeURIComponent(value);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (value != undefined) queryString.push(result);
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return queryString.join('&');
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.alias({keyOf: 'indexOf', hasValue: 'contains'});
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Event.js
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains the Event Native, to make the event object completely crossbrowser.
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Event = new Native({
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	name: 'Event',
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(event, win){
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		win = win || window;
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var doc = win.document;
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		event = event || win.event;
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (event.$extended) return event;
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.$extended = true;
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var type = event.type;
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var target = event.target || event.srcElement;
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while (target && target.nodeType == 3) target = target.parentNode;
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (type.test(/key/)){
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var code = event.which || event.keyCode;
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var key = Event.Keys.keyOf(code);
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (type == 'keydown'){
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var fKey = code - 111;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (fKey > 0 && fKey < 13) key = 'f' + fKey;
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			key = key || String.fromCharCode(code).toLowerCase();
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else if (type.match(/(click|mouse|menu)/i)){
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var page = {
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				x: event.pageX || event.clientX + doc.scrollLeft,
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				y: event.pageY || event.clientY + doc.scrollTop
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			};
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var client = {
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			};
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (type.match(/DOMMouseScroll|mousewheel/)){
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var rightClick = (event.which == 3) || (event.button == 2);
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var related = null;
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (type.match(/over|out/)){
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				switch (type){
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					case 'mouseover': related = event.relatedTarget || event.fromElement; break;
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					case 'mouseout': related = event.relatedTarget || event.toElement;
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!(function(){
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					while (related && related.nodeType == 3) related = related.parentNode;
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					return true;
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}).create({attempt: Browser.Engine.gecko})()) related = false;
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $extend(this, {
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			event: event,
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			type: type,
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			page: page,
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			client: client,
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			rightClick: rightClick,
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			wheel: wheel,
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			relatedTarget: related,
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			target: target,
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			code: code,
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			key: key,
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			shift: event.shiftKey,
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			control: event.ctrlKey,
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			alt: event.altKey,
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			meta: event.metaKey
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Event.Keys = new Hash({
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'enter': 13,
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'up': 38,
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'down': 40,
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'left': 37,
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'right': 39,
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'esc': 27,
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'space': 32,
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'backspace': 8,
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'tab': 9,
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'delete': 46
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Event.implement({
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	stop: function(){
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.stopPropagation().preventDefault();
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	stopPropagation: function(){
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.event.stopPropagation) this.event.stopPropagation();
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else this.event.cancelBubble = true;
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	preventDefault: function(){
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.event.preventDefault) this.event.preventDefault();
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else this.event.returnValue = false;
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Class.js
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains the Class Function for easily creating, extending, and implementing reusable Classes.
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function Class(params){
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (params instanceof Function) params = {initialize: params};
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var newClass = function(){
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Object.reset(this);
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (newClass._prototyping) return this;
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this._current = $empty;
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		delete this._current; delete this.caller;
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return value;
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}.extend(this);
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	newClass.implement(params);
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	newClass.constructor = Class;
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	newClass.prototype.constructor = newClass;
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return newClass;
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Function.prototype.protect = function(){
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	this._protected = true;
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return this;
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Object.reset = function(object, key){
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (key == null){
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var p in object) Object.reset(object, p);
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return object;
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	delete object[key];
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	switch ($type(object[key])){
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		case 'object':
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var F = function(){};
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			F.prototype = object[key];
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var i = new F;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			object[key] = Object.reset(i);
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		break;
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		case 'array': object[key] = $unlink(object[key]); break;
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return object;
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)new Native({name: 'Class', initialize: Class}).extend({
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	instantiate: function(F){
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		F._prototyping = true;
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var proto = new F;
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		delete F._prototyping;
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return proto;
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	wrap: function(self, key, method){
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (method._origin) method = method._origin;
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return function(){
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (method._protected && this._current == null) throw new Error('The method "' + key + '" cannot be called.');
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var caller = this.caller, current = this._current;
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.caller = current; this._current = arguments.callee;
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var result = method.apply(this, arguments);
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this._current = current; this.caller = caller;
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return result;
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}.extend({_owner: self, _origin: method, _name: key});
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Class.implement({
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	implement: function(key, value){
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(key) == 'object'){
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var p in key) this.implement(p, key[p]);
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return this;
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var mutator = Class.Mutators[key];
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (mutator){
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			value = mutator.call(this, value);
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (value == null) return this;
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var proto = this.prototype;
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch ($type(value)){
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'function':
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (value._hidden) return this;
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				proto[key] = Class.wrap(this, key, value);
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			break;
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'object':
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var previous = proto[key];
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if ($type(previous) == 'object') $mixin(previous, value);
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				else proto[key] = $unlink(value);
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			break;
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'array':
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				proto[key] = $unlink(value);
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			break;
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			default: proto[key] = value;
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Class.Mutators = {
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends: function(parent){
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.parent = parent;
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.prototype = Class.instantiate(parent);
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.implement('parent', function(){
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var name = this.caller._name, previous = this.caller._owner.parent.prototype[name];
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!previous) throw new Error('The method "' + name + '" has no parent.');
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return previous.apply(this, arguments);
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}.protect());
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Implements: function(items){
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		$splat(items).each(function(item){
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (item instanceof Function) item = Class.instantiate(item);
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.implement(item);
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Class.Extras.js
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Chain = new Class({
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$chain: [],
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	chain: function(){
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.$chain.extend(Array.flatten(arguments));
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	callChain: function(){
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	clearChain: function(){
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.$chain.empty();
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Events = new Class({
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$events: {},
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	addEvent: function(type, fn, internal){
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		type = Events.removeOn(type);
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (fn != $empty){
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.$events[type] = this.$events[type] || [];
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.$events[type].include(fn);
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (internal) fn.internal = true;
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	addEvents: function(events){
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var type in events) this.addEvent(type, events[type]);
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	fireEvent: function(type, args, delay){
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		type = Events.removeOn(type);
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.$events || !this.$events[type]) return this;
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.$events[type].each(function(fn){
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeEvent: function(type, fn){
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		type = Events.removeOn(type);
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.$events[type]) return this;
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!fn.internal) this.$events[type].erase(fn);
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeEvents: function(events){
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var type;
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(events) == 'object'){
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (type in events) this.removeEvent(type, events[type]);
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return this;
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (events) events = Events.removeOn(events);
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (type in this.$events){
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (events && events != type) continue;
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var fns = this.$events[type];
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var i = fns.length; i--; i) this.removeEvent(type, fns[i]);
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Events.removeOn = function(string){
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return string.replace(/^on([A-Z])/, function(full, first) {
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return first.toLowerCase();
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Options = new Class({
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setOptions: function(){
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.options = $merge.run([this.options].extend(arguments));
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.addEvent) return this;
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var option in this.options){
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.addEvent(option, this.options[option]);
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			delete this.options[option];
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Element.js
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser,
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	time-saver methods to let you easily work with HTML Elements.
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Element = new Native({
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	name: 'Element',
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	legacy: window.Element,
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(tag, props){
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var konstructor = Element.Constructors.get(tag);
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (konstructor) return konstructor(props);
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (typeof tag == 'string') return document.newElement(tag, props);
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $(tag).set(props);
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	afterImplement: function(key, value){
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Element.Prototype[key] = value;
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Array[key]) return;
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Elements.implement(key, function(){
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var items = [], elements = true;
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var i = 0, j = this.length; i < j; i++){
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var returns = this[i][key].apply(this[i], arguments);
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				items.push(returns);
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (elements) elements = ($type(returns) == 'element');
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (elements) ? new Elements(items) : items;
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Prototype = {$family: {name: 'element'}};
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Constructors = new Hash;
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var IFrame = new Native({
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	name: 'IFrame',
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	generics: false,
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(){
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var props = params.properties || {};
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var iframe = $(params.iframe) || false;
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var onload = props.onload || $empty;
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		delete props.onload;
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		props.id = props.name = $pick(props.id, props.name, iframe.id, iframe.name, 'IFrame_' + $time());
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		iframe = new Element(iframe || 'iframe', props);
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var onFrameLoad = function(){
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var host = $try(function(){
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return iframe.contentWindow.location.host;
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			});
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (host && host == window.location.host){
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var win = new Window(iframe.contentWindow);
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				new Document(iframe.contentWindow.document);
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				$extend(win.Element.prototype, Element.Prototype);
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			onload.call(iframe.contentWindow, iframe.contentWindow.document);
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		};
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(window.frames[props.id]) ? onFrameLoad() : iframe.addListener('load', onFrameLoad);
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return iframe;
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Elements = new Native({
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(elements, options){
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		options = $extend({ddup: true, cash: true}, options);
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		elements = elements || [];
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options.ddup || options.cash){
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var uniques = {}, returned = [];
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var i = 0, l = elements.length; i < l; i++){
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var el = $.element(elements[i], !options.cash);
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (options.ddup){
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					if (uniques[el.uid]) continue;
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					uniques[el.uid] = true;
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				returned.push(el);
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			elements = returned;
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (options.cash) ? $extend(elements, this) : elements;
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Elements.implement({
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	filter: function(filter, bind){
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!filter) return this;
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return item.match(filter);
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} : filter, bind));
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Document.implement({
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	newElement: function(tag, props){
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.trident && props){
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			['name', 'type', 'checked'].each(function(attribute){
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!props[attribute]) return;
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				tag += ' ' + attribute + '="' + props[attribute] + '"';
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (attribute != 'checked') delete props[attribute];
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			});
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			tag = '<' + tag + '>';
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $.element(this.createElement(tag)).set(props);
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	newTextNode: function(text){
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.createTextNode(text);
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getDocument: function(){
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getWindow: function(){
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.window;
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Window.implement({
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$: function(el, nocash){
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (el && el.$family && el.uid) return el;
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var type = $type(el);
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return ($[type]) ? $[type](el, nocash, this.document) : null;
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$$: function(selector){
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector);
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var elements = [];
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var args = Array.flatten(arguments);
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = args.length; i < l; i++){
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var item = args[i];
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			switch ($type(item)){
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				case 'element': elements.push(item); break;
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				case 'string': elements.extend(this.document.getElements(item, true));
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new Elements(elements);
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getDocument: function(){
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.document;
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getWindow: function(){
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$.string = function(id, nocash, doc){
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	id = doc.getElementById(id);
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (id) ? $.element(id, nocash) : null;
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$.element = function(el, nocash){
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$uid(el);
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var proto = Element.Prototype;
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var p in proto) el[p] = proto[p];
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return el;
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$.object = function(obj, nocash, doc){
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (obj.toElement) return $.element(obj.toElement(doc), nocash);
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return null;
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)$.textnode = $.whitespace = $.window = $.document = $arguments(0);
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Element, Document], {
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getElement: function(selector, nocash){
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $(this.getElements(selector, true)[0] || null, nocash);
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getElements: function(tags, nocash){
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		tags = tags.split(',');
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var elements = [];
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var ddup = (tags.length > 1);
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		tags.each(function(tag){
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var partial = this.getElementsByTagName(tag.trim());
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			(ddup) ? elements.extend(partial) : elements = partial;
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new Elements(elements, {ddup: ddup, cash: !nocash});
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var collected = {}, storage = {};
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var props = {input: 'checked', option: 'selected', textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerHTML' : 'value'};
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var get = function(uid){
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (storage[uid] || (storage[uid] = {}));
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var clean = function(item, retain){
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (!item) return;
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var uid = item.uid;
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (Browser.Engine.trident){
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (item.clearAttributes){
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var clone = retain && item.cloneNode(false);
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			item.clearAttributes();
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (clone) item.mergeAttributes(clone);
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else if (item.removeEvents){
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			item.removeEvents();
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ((/object/i).test(item.tagName)){
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var p in item){
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (typeof item[p] == 'function') item[p] = $empty;
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Element.dispose(item);
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (!uid) return;
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	collected[uid] = storage[uid] = null;
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var purge = function(){
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Hash.each(collected, clean);
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (Browser.Engine.trident) $A(document.getElementsByTagName('object')).each(clean);
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (window.CollectGarbage) CollectGarbage();
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	collected = storage = null;
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var walk = function(element, walk, start, match, all, nocash){
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var el = element[start || walk];
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var elements = [];
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	while (el){
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (el.nodeType == 1 && (!match || Element.match(el, match))){
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!all) return $(el, nocash);
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			elements.push(el);
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		el = el[walk];
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : null;
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var attributes = {
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'html': 'innerHTML',
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'class': 'className',
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'for': 'htmlFor',
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'text': (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? 'innerText' : 'textContent'
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer'];
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var camels = ['value', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap'];
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bools = bools.associate(bools);
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.extend(attributes, bools);
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.extend(attributes, camels.associate(camels.map(String.toLowerCase)));
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var inserters = {
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	before: function(context, element){
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (element.parentNode) element.parentNode.insertBefore(context, element);
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	after: function(context, element){
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!element.parentNode) return;
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var next = element.nextSibling;
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context);
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	bottom: function(context, element){
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		element.appendChild(context);
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	top: function(context, element){
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var first = element.firstChild;
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(first) ? element.insertBefore(context, first) : element.appendChild(context);
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inserters.inside = inserters.bottom;
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Hash.each(inserters, function(inserter, where){
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	where = where.capitalize();
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Element.implement('inject' + where, function(el){
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		inserter(this, $(el, true));
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Element.implement('grab' + where, function(el){
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		inserter($(el, true), this);
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(prop, value){
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch ($type(prop)){
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'object':
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				for (var p in prop) this.set(p, prop[p]);
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				break;
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'string':
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var property = Element.Properties.get(prop);
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				(property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value);
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(prop){
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var property = Element.Properties.get(prop);
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop);
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	erase: function(prop){
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var property = Element.Properties.get(prop);
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setProperty: function(attribute, value){
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var key = attributes[attribute];
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (value == undefined) return this.removeProperty(attribute);
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (key && bools[attribute]) value = !!value;
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(key) ? this[key] = value : this.setAttribute(attribute, '' + value);
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setProperties: function(attributes){
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getProperty: function(attribute){
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var key = attributes[attribute];
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var value = (key) ? this[key] : this.getAttribute(attribute, 2);
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (bools[attribute]) ? !!value : (key) ? value : value || null;
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getProperties: function(){
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var args = $A(arguments);
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return args.map(this.getProperty, this).associate(args);
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeProperty: function(attribute){
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var key = attributes[attribute];
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(key) ? this[key] = (key && bools[attribute]) ? false : '' : this.removeAttribute(attribute);
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeProperties: function(){
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Array.each(arguments, this.removeProperty, this);
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	hasClass: function(className){
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.className.contains(className, ' ');
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	addClass: function(className){
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeClass: function(className){
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toggleClass: function(className){
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	adopt: function(){
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Array.flatten(arguments).each(function(element){
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			element = $(element, true);
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (element) this.appendChild(element);
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	appendText: function(text, where){
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.grab(this.getDocument().newTextNode(text), where);
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	grab: function(el, where){
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		inserters[where || 'bottom']($(el, true), this);
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	inject: function(el, where){
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		inserters[where || 'bottom'](this, $(el, true));
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	replaces: function(el){
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		el = $(el, true);
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		el.parentNode.replaceChild(this, el);
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	wraps: function(el, where){
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		el = $(el, true);
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.replaces(el).grab(el, where);
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getPrevious: function(match, nocash){
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'previousSibling', null, match, false, nocash);
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getAllPrevious: function(match, nocash){
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'previousSibling', null, match, true, nocash);
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getNext: function(match, nocash){
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'nextSibling', null, match, false, nocash);
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getAllNext: function(match, nocash){
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'nextSibling', null, match, true, nocash);
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getFirst: function(match, nocash){
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'nextSibling', 'firstChild', match, false, nocash);
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getLast: function(match, nocash){
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'previousSibling', 'lastChild', match, false, nocash);
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getParent: function(match, nocash){
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'parentNode', null, match, false, nocash);
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getParents: function(match, nocash){
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'parentNode', null, match, true, nocash);
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getSiblings: function(match, nocash) {
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getParent().getChildren(match, nocash).erase(this);
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getChildren: function(match, nocash){
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return walk(this, 'nextSibling', 'firstChild', match, true, nocash);
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getWindow: function(){
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.ownerDocument.window;
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getDocument: function(){
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.ownerDocument;
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getElementById: function(id, nocash){
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var el = this.ownerDocument.getElementById(id);
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!el) return null;
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!parent) return null;
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $.element(el, nocash);
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getSelected: function(){
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new Elements($A(this.options).filter(function(option){
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return option.selected;
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}));
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getComputedStyle: function(property){
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.currentStyle) return this.currentStyle[property.camelCase()];
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var computed = this.getDocument().defaultView.getComputedStyle(this, null);
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null;
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toQueryString: function(){
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var queryString = [];
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.getElements('input, select, textarea', true).each(function(el){
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!el.name || el.disabled) return;
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return opt.value;
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			$splat(value).each(function(val){
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (typeof val != 'undefined') queryString.push(el.name + '=' + encodeURIComponent(val));
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			});
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return queryString.join('&');
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	clone: function(contents, keepid){
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		contents = contents !== false;
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var clone = this.cloneNode(contents);
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var clean = function(node, element){
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!keepid) node.removeAttribute('id');
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (Browser.Engine.trident){
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				node.clearAttributes();
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				node.mergeAttributes(element);
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				node.removeAttribute('uid');
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (node.options){
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					var no = node.options, eo = element.options;
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var prop = props[element.tagName.toLowerCase()];
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (prop && element[prop]) node[prop] = element[prop];
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		};
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (contents){
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var i = ce.length; i--;) clean(ce[i], te[i]);
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		clean(clone, this);
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $(clone);
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	destroy: function(){
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Element.empty(this);
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Element.dispose(this);
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		clean(this, true);
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return null;
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	empty: function(){
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		$A(this.childNodes).each(function(node){
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Element.destroy(node);
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	dispose: function(){
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	hasChild: function(el){
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		el = $(el, true);
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!el) return false;
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el);
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16);
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	match: function(tag){
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (!tag || (tag == this) || (Element.get(this, 'tag') == tag));
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Element, Window, Document], {
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	addListener: function(type, fn){
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (type == 'unload'){
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var old = fn, self = this;
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			fn = function(){
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				self.removeListener('unload', fn);
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				old();
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			};
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			collected[this.uid] = this;
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.addEventListener) this.addEventListener(type, fn, false);
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else this.attachEvent('on' + type, fn);
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeListener: function(type, fn){
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.removeEventListener) this.removeEventListener(type, fn, false);
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else this.detachEvent('on' + type, fn);
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	retrieve: function(property, dflt){
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var storage = get(this.uid), prop = storage[property];
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (dflt != undefined && prop == undefined) prop = storage[property] = dflt;
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $pick(prop);
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	store: function(property, value){
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var storage = get(this.uid);
18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		storage[property] = value;
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
18905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
18915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	eliminate: function(property){
18935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var storage = get(this.uid);
18945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		delete storage[property];
18955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
18965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)window.addListener('unload', purge);
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties = new Hash;
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.style = {
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(style){
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.style.cssText = style;
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(){
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.style.cssText;
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	erase: function(){
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.style.cssText = '';
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.tag = {
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(){
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.tagName.toLowerCase();
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.html = (function(){
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var wrapper = document.createElement('div');
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var translations = {
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		table: [1, '<table>', '</table>'],
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		select: [1, '<select>', '</select>'],
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		tbody: [2, '<table><tbody>', '</tbody></table>'],
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
19395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	translations.thead = translations.tfoot = translations.tbody;
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var html = {
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		set: function(){
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var html = Array.flatten(arguments).join('');
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var wrap = Browser.Engine.trident && translations[this.get('tag')];
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (wrap){
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var first = wrapper;
19475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				first.innerHTML = wrap[1] + html + wrap[2];
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				for (var i = wrap[0]; i--;) first = first.firstChild;
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				this.empty().adopt(first.childNodes);
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else {
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				this.innerHTML = html;
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	html.erase = html.set;
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return html;
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if (Browser.Engine.webkit && Browser.Engine.version < 420) Element.Properties.text = {
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(){
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.innerText) return this.innerText;
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var temp = this.ownerDocument.newElement('div', {html: this.innerHTML}).inject(this.ownerDocument.body);
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var text = temp.innerText;
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		temp.destroy();
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return text;
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Element.Event.js
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains Element methods for dealing with events, and custom Events.
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.events = {set: function(events){
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	this.addEvents(events);
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}};
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Element, Window, Document], {
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	addEvent: function(type, fn){
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var events = this.retrieve('events', {});
19885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		events[type] = events[type] || {'keys': [], 'values': []};
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (events[type].keys.contains(fn)) return this;
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		events[type].keys.push(fn);
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var realType = type, custom = Element.Events.get(type), condition = fn, self = this;
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (custom){
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (custom.onAdd) custom.onAdd.call(this, fn);
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (custom.condition){
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				condition = function(event){
19965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					if (custom.condition.call(this, event)) return fn.call(this, event);
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					return true;
19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				};
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			realType = custom.base || realType;
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var defn = function(){
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return fn.call(self);
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		};
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var nativeEvent = Element.NativeEvents[realType];
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (nativeEvent){
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (nativeEvent == 2){
20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				defn = function(event){
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					event = new Event(event, self.getWindow());
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					if (condition.call(self, event) === false) event.stop();
20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				};
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
20135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.addListener(realType, defn);
20145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		events[type].values.push(defn);
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeEvent: function(type, fn){
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var events = this.retrieve('events');
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!events || !events[type]) return this;
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var pos = events[type].keys.indexOf(fn);
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (pos == -1) return this;
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		events[type].keys.splice(pos, 1);
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var value = events[type].values.splice(pos, 1)[0];
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var custom = Element.Events.get(type);
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (custom){
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (custom.onRemove) custom.onRemove.call(this, fn);
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			type = custom.base || type;
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this;
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	addEvents: function(events){
20355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var event in events) this.addEvent(event, events[event]);
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
20375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
20385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	removeEvents: function(events){
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var type;
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(events) == 'object'){
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (type in events) this.removeEvent(type, events[type]);
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return this;
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var attached = this.retrieve('events');
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!attached) return this;
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!events){
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (type in attached) this.removeEvents(type);
20495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.eliminate('events');
20505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else if (attached[events]){
20515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			while (attached[events].keys[0]) this.removeEvent(events, attached[events].keys[0]);
20525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			attached[events] = null;
20535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
20545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
20555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
20565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	fireEvent: function(type, args, delay){
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var events = this.retrieve('events');
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!events || !events[type]) return this;
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		events[type].keys.each(function(fn){
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
20655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	cloneEvents: function(from, type){
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		from = $(from);
20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var fevents = from.retrieve('events');
20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!fevents) return this;
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!type){
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var evType in fevents) this.cloneEvents(from, evType);
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else if (fevents[type]){
20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			fevents[type].keys.each(function(fn){
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				this.addEvent(type, fn);
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}, this);
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.NativeEvents = {
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	keydown: 2, keypress: 2, keyup: 2, //keyboard
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	error: 1, abort: 1, scroll: 1 //misc
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var $check = function(event){
20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var related = event.relatedTarget;
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (related == undefined) return true;
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (related === false) return false;
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related));
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Events = new Hash({
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	mouseenter: {
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		base: 'mouseover',
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		condition: $check
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
21075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	mouseleave: {
21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		base: 'mouseout',
21105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		condition: $check
21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
21125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	mousewheel: {
21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel'
21155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
21205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
21235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Element.Style.js
21245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains methods for interacting with the styles of Elements in a fashionable way.
21255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
21275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
21285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
21295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.styles = {set: function(styles){
21315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	this.setStyles(styles);
21325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}};
21335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.opacity = {
21355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(opacity, novisibility){
21375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!novisibility){
21385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (opacity == 0){
21395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (this.style.visibility != 'hidden') this.style.visibility = 'hidden';
21405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else {
21415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (this.style.visibility != 'visible') this.style.visibility = 'visible';
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
21435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
21445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.style.opacity = opacity;
21475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.store('opacity', opacity);
21485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
21495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(){
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.retrieve('opacity', 1);
21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setOpacity: function(value){
21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.set('opacity', value, true);
21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getOpacity: function(){
21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.get('opacity');
21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setStyle: function(property, value){
21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (property){
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'opacity': return this.set('opacity', parseFloat(value));
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		property = property.camelCase();
21725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(value) != 'string'){
21735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var map = (Element.Styles.get(property) || '@').split(' ');
21745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			value = $splat(value).map(function(val, i){
21755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!map[i]) return '';
21765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
21775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}).join(' ');
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else if (value == String(Number(value))){
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			value = Math.round(value);
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.style[property] = value;
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getStyle: function(property){
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (property){
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'opacity': return this.get('opacity');
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		property = property.camelCase();
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var result = this.style[property];
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!$chk(result)){
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			result = [];
21945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var style in Element.ShortStyles){
21955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (property != style) continue;
21965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
21975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return result.join(' ');
21985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			result = this.getComputedStyle(property);
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (result){
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			result = String(result);
22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var color = result.match(/rgba?\([\d\s,]+\)/);
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (color) result = result.replace(color[0], color[0].rgbToHex());
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result, 10)))){
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (property.test(/^(height|width)$/)){
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				values.each(function(value){
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}, this);
22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return this['offset' + property.capitalize()] - size + 'px';
22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if ((Browser.Engine.presto) && String(result).test('px')) return result;
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (property.test(/(border(.+)Width|margin|padding)/)) return '0px';
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return result;
22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setStyles: function(styles){
22215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var style in styles) this.setStyle(style, styles[style]);
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
22245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getStyles: function(){
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var result = {};
22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Array.each(arguments, function(key){
22285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			result[key] = this.getStyle(key);
22295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return result;
22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Styles = new Hash({
22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	left: '@px', top: '@px', bottom: '@px', right: '@px',
22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
22385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
22395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
22405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
22415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
22425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
22435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
22485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var Short = Element.ShortStyles;
22495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var All = Element.Styles;
22505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	['margin', 'padding'].each(function(style){
22515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var sd = style + direction;
22525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Short[style][sd] = All[sd] = '@px';
22535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var bd = 'border' + direction;
22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Short[bd] = {};
22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Element.Dimensions.js
22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains methods to work with size, scroll, or positioning of Elements and the window object.
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Credits:
22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	- Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	- Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	scrollTo: function(x, y){
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)){
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.getWindow().scrollTo(x, y);
22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.scrollLeft = x;
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.scrollTop = y;
22865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
22875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
22885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
22895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getSize: function(){
22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)) return this.getWindow().getSize();
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: this.offsetWidth, y: this.offsetHeight};
22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrollSize: function(){
22965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)) return this.getWindow().getScrollSize();
22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: this.scrollWidth, y: this.scrollHeight};
22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
22995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScroll: function(){
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)) return this.getWindow().getScroll();
23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: this.scrollLeft, y: this.scrollTop};
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrolls: function(){
23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var element = this, position = {x: 0, y: 0};
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while (element && !isBody(element)){
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			position.x += element.scrollLeft;
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			position.y += element.scrollTop;
23105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			element = element.parentNode;
23115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return position;
23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getOffsetParent: function(){
23165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var element = this;
23175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(element)) return null;
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!Browser.Engine.trident) return element.offsetParent;
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((element = element.parentNode) && !isBody(element)){
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (styleString(element, 'position') != 'static') return element;
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return null;
23235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getOffsets: function(){
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.trident){
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var bound = this.getBoundingClientRect(), html = this.getDocument().documentElement;
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var isFixed = styleString(this, 'position') == 'fixed';
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return {
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				x: bound.left + ((isFixed) ? 0 : html.scrollLeft) - html.clientLeft,
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				y: bound.top +  ((isFixed) ? 0 : html.scrollTop)  - html.clientTop
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			};
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var element = this, position = {x: 0, y: 0};
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)) return position;
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while (element && !isBody(element)){
23395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			position.x += element.offsetLeft;
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			position.y += element.offsetTop;
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (Browser.Engine.gecko){
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!borderBox(element)){
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					position.x += leftBorder(element);
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					position.y += topBorder(element);
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var parent = element.parentNode;
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (parent && styleString(parent, 'overflow') != 'visible'){
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					position.x += leftBorder(parent);
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					position.y += topBorder(parent);
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else if (element != this && Browser.Engine.webkit){
23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				position.x += leftBorder(element);
23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				position.y += topBorder(element);
23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			element = element.offsetParent;
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.gecko && !borderBox(this)){
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			position.x -= leftBorder(this);
23615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			position.y -= topBorder(this);
23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return position;
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getPosition: function(relative){
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)) return {x: 0, y: 0};
23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var offset = this.getOffsets(), scroll = this.getScrolls();
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var position = {x: offset.x - scroll.x, y: offset.y - scroll.y};
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var relativePosition = (relative && (relative = $(relative))) ? relative.getPosition() : {x: 0, y: 0};
23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getCoordinates: function(element){
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (isBody(this)) return this.getWindow().getCoordinates();
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var position = this.getPosition(element), size = this.getSize();
23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var obj = {left: position.x, top: position.y, width: size.x, height: size.y};
23785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		obj.right = obj.left + obj.width;
23795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		obj.bottom = obj.top + obj.height;
23805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return obj;
23815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	computePosition: function(obj){
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {left: obj.x - styleNumber(this, 'margin-left'), top: obj.y - styleNumber(this, 'margin-top')};
23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	position: function(obj){
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.setStyles(this.computePosition(obj));
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Document, Window], {
23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getSize: function(){
23965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.presto || Browser.Engine.webkit) {
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var win = this.getWindow();
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return {x: win.innerWidth, y: win.innerHeight};
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var doc = getCompatElement(this);
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: doc.clientWidth, y: doc.clientHeight};
24025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScroll: function(){
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var win = this.getWindow(), doc = getCompatElement(this);
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrollSize: function(){
24105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var doc = getCompatElement(this), min = this.getSize();
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)};
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getPosition: function(){
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {x: 0, y: 0};
24165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getCoordinates: function(){
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var size = this.getSize();
24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
24215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// private methods
24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var styleString = Element.getComputedStyle;
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function styleNumber(element, style){
24305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return styleString(element, style).toInt() || 0;
24315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function borderBox(element){
24345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return styleString(element, '-moz-box-sizing') == 'border-box';
24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function topBorder(element){
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return styleNumber(element, 'border-top-width');
24395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function leftBorder(element){
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return styleNumber(element, 'border-left-width');
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function isBody(element){
24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (/^(?:body|html)$/i).test(element.tagName);
24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function getCompatElement(element){
24505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var doc = element.getDocument();
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
24555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//aliases
24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Window, Document, Element], {
24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getHeight: function(){
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getSize().y;
24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getWidth: function(){
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getSize().x;
24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrollTop: function(){
24695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getScroll().y;
24705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrollLeft: function(){
24735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getScroll().x;
24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrollHeight: function(){
24775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getScrollSize().y;
24785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getScrollWidth: function(){
24815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getScrollSize().x;
24825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getTop: function(){
24855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getPosition().y;
24865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
24875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getLeft: function(){
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.getPosition().x;
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Selectors.js
24975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Adds advanced CSS Querying capabilities for targeting elements. Also includes pseudoselectors support.
24985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
25025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Document, Element], {
25045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getElements: function(expression, nocash){
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		expression = expression.split(',');
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var items, local = {};
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = expression.length; i < l; i++){
25095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var selector = expression[i], elements = Selectors.Utils.search(this, selector, local);
25105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (i != 0 && elements.item) elements = $A(elements);
25115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements);
25125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
25135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return new Elements(items, {ddup: (expression.length > 1), cash: !nocash});
25145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
25155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	match: function(selector){
25215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!selector || (selector == this)) return true;
25225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var tagid = Selectors.Utils.parseTagAndID(selector);
25235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var tag = tagid[0], id = tagid[1];
25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false;
25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var parsed = Selectors.Utils.parseSelector(selector);
25265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true;
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
25285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Selectors = {Cache: {nth: {}, parsed: {}}};
25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Selectors.RegExps = {
25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	id: (/#([\w-]+)/),
25355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	tag: (/^(\w+|\*)/),
25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	quick: (/^(\w+|\*)$/),
25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),
25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)
25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
25405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Selectors.Utils = {
25425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	chk: function(item, uniques){
25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!uniques) return true;
25455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var uid = $uid(item);
25465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!uniques[uid]) return uniques[uid] = true;
25475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return false;
25485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
25495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	parseNthArgument: function(argument){
25515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument];
25525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);
25535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!parsed) return false;
25545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var inta = parseInt(parsed[1], 10);
25555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var a = (inta || inta === 0) ? inta : 1;
25565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var special = parsed[2] || false;
25575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var b = parseInt(parsed[3], 10) || 0;
25585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (a != 0){
25595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			b--;
25605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			while (b < 1) b += a;
25615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			while (b >= a) b -= a;
25625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
25635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			a = b;
25645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			special = 'index';
25655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
25665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (special){
25675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'n': parsed = {a: a, b: b, special: 'n'}; break;
25685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break;
25695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'even': parsed = {a: 2, b: 1, special: 'n'}; break;
25705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'first': parsed = {a: 0, special: 'index'}; break;
25715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'last': parsed = {special: 'last-child'}; break;
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'only': parsed = {special: 'only-child'}; break;
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			default: parsed = {a: (a - 1), special: 'index'};
25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Selectors.Cache.nth[argument] = parsed;
25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	parseSelector: function(selector){
25805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector];
25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var m, parsed = {classes: [], pseudos: [], attributes: []};
25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((m = Selectors.RegExps.combined.exec(selector))){
25835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var cn = m[1], an = m[2], ao = m[3], av = m[5], pn = m[6], pa = m[7];
25845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (cn){
25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				parsed.classes.push(cn);
25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else if (pn){
25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var parser = Selectors.Pseudo.get(pn);
25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (parser) parsed.pseudos.push({parser: parser, argument: pa});
25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				else parsed.attributes.push({name: pn, operator: '=', value: pa});
25905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else if (an){
25915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				parsed.attributes.push({name: an, operator: ao, value: av});
25925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
25935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
25945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!parsed.classes.length) delete parsed.classes;
25955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!parsed.attributes.length) delete parsed.attributes;
25965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!parsed.pseudos.length) delete parsed.pseudos;
25975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null;
25985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Selectors.Cache.parsed[selector] = parsed;
25995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
26005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	parseTagAndID: function(selector){
26025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var tag = selector.match(Selectors.RegExps.tag);
26035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var id = selector.match(Selectors.RegExps.id);
26045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return [(tag) ? tag[1] : '*', (id) ? id[1] : false];
26055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
26065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	filter: function(item, parsed, local){
26085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var i;
26095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (parsed.classes){
26105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (i = parsed.classes.length; i--; i){
26115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var cn = parsed.classes[i];
26125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!Selectors.Filters.byClass(item, cn)) return false;
26135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
26145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
26155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (parsed.attributes){
26165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (i = parsed.attributes.length; i--; i){
26175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var att = parsed.attributes[i];
26185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false;
26195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
26205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
26215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (parsed.pseudos){
26225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (i = parsed.pseudos.length; i--; i){
26235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var psd = parsed.pseudos[i];
26245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false;
26255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
26265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
26275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
26285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
26295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getByTagAndID: function(ctx, tag, id){
26315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (id){
26325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true);
26335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (item && Selectors.Filters.byTag(item, tag)) ? [item] : [];
26345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
26355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return ctx.getElementsByTagName(tag);
26365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
26375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
26385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	search: function(self, expression, local){
26405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var splitters = [];
26415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){
26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			splitters.push(m1);
26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return ':)' + m2;
26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}).split(':)');
26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var items, filtered, item;
26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = selectors.length; i < l; i++){
26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var selector = selectors[i];
26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (i == 0 && Selectors.RegExps.quick.test(selector)){
26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				items = self.getElementsByTagName(selector);
26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				continue;
26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var splitter = splitters[i - 1];
26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var tagid = Selectors.Utils.parseTagAndID(selector);
26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var tag = tagid[0], id = tagid[1];
26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (i == 0){
26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				items = Selectors.Utils.getByTagAndID(self, tag, id);
26655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else {
26665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var uniques = {}, found = [];
26675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques);
26685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				items = found;
26695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
26705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var parsed = Selectors.Utils.parseSelector(selector);
26725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (parsed){
26745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				filtered = [];
26755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				for (var m = 0, n = items.length; m < n; m++){
26765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					item = items[m];
26775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item);
26785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
26795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				items = filtered;
26805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
26815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
26835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return items;
26855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
26875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
26895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Selectors.Getters = {
26915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	' ': function(found, self, tag, id, uniques){
26935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var items = Selectors.Utils.getByTagAndID(self, tag, id);
26945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = items.length; i < l; i++){
26955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var item = items[i];
26965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (Selectors.Utils.chk(item, uniques)) found.push(item);
26975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
26985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return found;
26995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'>': function(found, self, tag, id, uniques){
27025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var children = Selectors.Utils.getByTagAndID(self, tag, id);
27035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var i = 0, l = children.length; i < l; i++){
27045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var child = children[i];
27055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child);
27065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
27075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return found;
27085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'+': function(found, self, tag, id, uniques){
27115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((self = self.nextSibling)){
27125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (self.nodeType == 1){
27135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
27145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				break;
27155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
27165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
27175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return found;
27185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'~': function(found, self, tag, id, uniques){
27215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((self = self.nextSibling)){
27225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (self.nodeType == 1){
27235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!Selectors.Utils.chk(self, uniques)) break;
27245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
27255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
27265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
27275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return found;
27285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
27295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Selectors.Filters = {
27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	byTag: function(self, tag){
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag));
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	byID: function(self, id){
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (!id || (self.id && self.id == id));
27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	byClass: function(self, klass){
27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (self.className && self.className.contains(klass, ' '));
27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	byPseudo: function(self, parser, argument, local){
27475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return parser.call(self, argument, local);
27485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	byAttribute: function(self, name, operator, value){
27515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var result = Element.prototype.getProperty.call(self, name);
27525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!result) return (operator == '!=');
27535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!operator || value == undefined) return true;
27545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (operator){
27555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '=': return (result == value);
27565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '*=': return (result.contains(value));
27575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '^=': return (result.substr(0, value.length) == value);
27585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '$=': return (result.substr(result.length - value.length) == value);
27595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '!=': return (result != value);
27605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '~=': return result.contains(value, ' ');
27615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case '|=': return result.contains(value, '-');
27625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
27635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return false;
27645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
27655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
27675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Selectors.Pseudo = new Hash({
27695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	// w3c pseudo selectors
27715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	checked: function(){
27735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.checked;
27745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	empty: function(){
27775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return !(this.innerText || this.textContent || '').length;
27785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	not: function(selector){
27815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return !Element.match(this, selector);
27825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	contains: function(text){
27855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (this.innerText || this.textContent || '').contains(text);
27865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'first-child': function(){
27895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Selectors.Pseudo.index.call(this, 0);
27905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'last-child': function(){
27935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var element = this;
27945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((element = element.nextSibling)){
27955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (element.nodeType == 1) return false;
27965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
27975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
27985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
27995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'only-child': function(){
28015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var prev = this;
28025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((prev = prev.previousSibling)){
28035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (prev.nodeType == 1) return false;
28045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
28055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var next = this;
28065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((next = next.nextSibling)){
28075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (next.nodeType == 1) return false;
28085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
28095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
28105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
28115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	'nth-child': function(argument, local){
28135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		argument = (argument == undefined) ? 'n' : argument;
28145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var parsed = Selectors.Utils.parseNthArgument(argument);
28155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local);
28165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var count = 0;
28175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		local.positions = local.positions || {};
28185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var uid = $uid(this);
28195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!local.positions[uid]){
28205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var self = this;
28215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			while ((self = self.previousSibling)){
28225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (self.nodeType != 1) continue;
28235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				count ++;
28245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var position = local.positions[$uid(self)];
28255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (position != undefined){
28265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					count = position + count;
28275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					break;
28285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}
28295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
28305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			local.positions[uid] = count;
28315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
28325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (local.positions[uid] % parsed.a == parsed.b);
28335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
28345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	// custom pseudo selectors
28365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	index: function(index){
28385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var element = this, count = 0;
28395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		while ((element = element.previousSibling)){
28405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (element.nodeType == 1 && ++count > index) return false;
28415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
28425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (count == index);
28435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
28445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	even: function(argument, local){
28465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Selectors.Pseudo['nth-child'].call(this, '2n+1', local);
28475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
28485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	odd: function(argument, local){
28505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Selectors.Pseudo['nth-child'].call(this, '2n', local);
28515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
28525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	selected: function() {
28545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.selected;
28555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
28565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
28585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
28615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Domready.js
28625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains the domready custom event.
28635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
28655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
28665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
28675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Events.domready = {
28695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onAdd: function(fn){
28715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.loaded) fn.call(this);
28725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
28735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
28755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
28775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var domready = function(){
28795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.loaded) return;
28805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Browser.loaded = true;
28815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		window.fireEvent('domready');
28825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		document.fireEvent('domready');
28835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
28845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	if (Browser.Engine.trident){
28865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var temp = document.createElement('div');
28875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(function(){
28885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			($try(function(){
28895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				temp.doScroll('left');
28905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return $(temp).inject(document.body).set('html', 'temp').dispose();
28915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			})) ? domready() : arguments.callee.delay(50);
28925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		})();
28935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	} else if (Browser.Engine.webkit && Browser.Engine.version < 525){
28945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(function(){
28955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			(['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
28965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		})();
28975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	} else {
28985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		window.addEvent('load', domready);
28995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		document.addEvent('DOMContentLoaded', domready);
29005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
29015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
29035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
29065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: JSON.js
29075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	JSON encoder and decoder.
29085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
29105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
29115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)See Also:
29135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	<http://www.json.org/>
29145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
29155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var JSON = new Hash({
29175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},
29195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	$replaceChars: function(chr){
29215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
29225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
29235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	encode: function(obj){
29255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch ($type(obj)){
29265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'string':
29275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"';
29285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'array':
29295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return '[' + String(obj.map(JSON.encode).filter($defined)) + ']';
29305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'object': case 'hash':
29315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var string = [];
29325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				Hash.each(obj, function(value, key){
29335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					var json = JSON.encode(value);
29345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					if (json) string.push(JSON.encode(key) + ':' + json);
29355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				});
29365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return '{' + string + '}';
29375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'number': case 'boolean': return String(obj);
29385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case false: return 'null';
29395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
29405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return null;
29415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
29425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	decode: function(string, secure){
29445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(string) != 'string' || !string.length) return null;
29455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
29465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return eval('(' + string + ')');
29475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
29485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
29505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Native.implement([Hash, Array, String, Number], {
29525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toJSON: function(){
29545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return JSON.encode(this);
29555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
29565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
29585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
29615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Cookie.js
29625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Class for creating, loading, and saving browser Cookies.
29635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
29655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
29665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Credits:
29685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Based on the functions by Peter-Paul Koch (http://quirksmode.org).
29695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
29705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Cookie = new Class({
29725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Implements: Options,
29745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options: {
29765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		path: false,
29775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		domain: false,
29785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		duration: false,
29795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		secure: false,
29805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		document: document
29815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
29825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(key, options){
29845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.key = key;
29855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.setOptions(options);
29865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
29875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	write: function(value){
29895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		value = encodeURIComponent(value);
29905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.domain) value += '; domain=' + this.options.domain;
29915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.path) value += '; path=' + this.options.path;
29925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.duration){
29935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var date = new Date();
29945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
29955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			value += '; expires=' + date.toGMTString();
29965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
29975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.secure) value += '; secure';
29985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.options.document.cookie = this.key + '=' + value;
29995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
30005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
30015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	read: function(){
30035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
30045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return (value) ? decodeURIComponent(value[1]) : null;
30055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
30065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	dispose: function(){
30085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		new Cookie(this.key, $merge(this.options, {duration: -1})).write('');
30095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
30105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
30115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
30135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Cookie.write = function(key, value, options){
30155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return new Cookie(key, options).write(value);
30165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
30175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Cookie.read = function(key){
30195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return new Cookie(key).read();
30205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
30215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Cookie.dispose = function(key, options){
30235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return new Cookie(key, options).dispose();
30245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
30255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
30285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Swiff.js
30295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Wrapper for embedding SWF movies. Supports (and fixes) External Interface Communication.
30305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
30325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
30335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Credits:
30355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
30365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
30375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Swiff = new Class({
30395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Implements: [Options],
30415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options: {
30435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		id: null,
30445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		height: 1,
30455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		width: 1,
30465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		container: null,
30475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		properties: {},
30485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		params: {
30495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			quality: 'high',
30505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			allowScriptAccess: 'always',
30515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			wMode: 'transparent',
30525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			swLiveConnect: true
30535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
30545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		callBacks: {},
30555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		vars: {}
30565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
30575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	toElement: function(){
30595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.object;
30605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
30615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(path, options){
30635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.instance = 'Swiff_' + $time();
30645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.setOptions(options);
30665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		options = this.options;
30675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var id = this.id = options.id || this.instance;
30685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var container = $(options.container);
30695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Swiff.CallBacks[this.instance] = {};
30715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var params = options.params, vars = options.vars, callBacks = options.callBacks;
30735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var properties = $extend({height: options.height, width: options.width}, options.properties);
30745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var self = this;
30765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var callBack in callBacks){
30785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Swiff.CallBacks[this.instance][callBack] = (function(option){
30795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return function(){
30805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					return option.apply(self.object, arguments);
30815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				};
30825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			})(callBacks[callBack]);
30835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
30845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
30855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		params.flashVars = Hash.toQueryString(vars);
30875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Browser.Engine.trident){
30885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
30895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			params.movie = path;
30905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
30915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			properties.type = 'application/x-shockwave-flash';
30925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			properties.data = path;
30935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
30945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var build = '<object id="' + id + '"';
30955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
30965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		build += '>';
30975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var param in params){
30985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
30995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
31005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		build += '</object>';
31015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
31025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	replaces: function(element){
31055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		element = $(element, true);
31065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		element.parentNode.replaceChild(this.toElement(), element);
31075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
31085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	inject: function(element){
31115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		$(element, true).appendChild(this.toElement());
31125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
31135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	remote: function(){
31165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments));
31175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
31185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
31205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Swiff.CallBacks = {};
31225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Swiff.remote = function(obj, fn){
31245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
31255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return eval(rs);
31265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
31275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
31305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Fx.js
31315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains the basic animation logic to be extended by all other Fx Classes.
31325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
31345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
31355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
31365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Fx = new Class({
31385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Implements: [Chain, Events, Options],
31405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options: {
31425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		/*
31435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onStart: $empty,
31445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onCancel: $empty,
31455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onComplete: $empty,
31465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		*/
31475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		fps: 50,
31485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		unit: false,
31495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		duration: 500,
31505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		link: 'ignore'
31515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(options){
31545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.subject = this.subject || this;
31555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.setOptions(options);
31565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt();
31575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var wait = this.options.wait;
31585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (wait === false) this.options.link = 'cancel';
31595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getTransition: function(){
31625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return function(p){
31635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return -(Math.cos(Math.PI * p) - 1) / 2;
31645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		};
31655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	step: function(){
31685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var time = $time();
31695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (time < this.time + this.options.duration){
31705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var delta = this.transition((time - this.time) / this.options.duration);
31715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.set(this.compute(this.from, this.to, delta));
31725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
31735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.set(this.compute(this.from, this.to, 1));
31745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.complete();
31755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
31765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(now){
31795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return now;
31805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	compute: function(from, to, delta){
31835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Fx.compute(from, to, delta);
31845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	check: function(){
31875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.timer) return true;
31885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (this.options.link){
31895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'cancel': this.cancel(); return true;
31905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
31915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
31925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return false;
31935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
31945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	start: function(from, to){
31965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.check(from, to)) return this;
31975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.from = from;
31985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.to = to;
31995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.time = 0;
32005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.transition = this.getTransition();
32015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.startTimer();
32025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.onStart();
32035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
32045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	complete: function(){
32075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.stopTimer()) this.onComplete();
32085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
32095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	cancel: function(){
32125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.stopTimer()) this.onCancel();
32135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
32145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onStart: function(){
32175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('start', this.subject);
32185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onComplete: function(){
32215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('complete', this.subject);
32225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
32235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onCancel: function(){
32265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('cancel', this.subject).clearChain();
32275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	pause: function(){
32305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.stopTimer();
32315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
32325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	resume: function(){
32355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.startTimer();
32365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
32375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	stopTimer: function(){
32405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.timer) return false;
32415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.time = $time() - this.time;
32425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.timer = $clear(this.timer);
32435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
32445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	startTimer: function(){
32475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.timer) return false;
32485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.time = $time() - this.time;
32495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this);
32505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return true;
32515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
32525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
32545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.compute = function(from, to, delta){
32565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return (to - from) * delta + from;
32575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
32585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
32605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
32635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Fx.CSS.js
32645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
32655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
32675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
32685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
32695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.CSS = new Class({
32715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends: Fx,
32735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	//prepares the base from/to object
32755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	prepare: function(element, property, values){
32775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		values = $splat(values);
32785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var values1 = values[1];
32795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!$chk(values1)){
32805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			values[1] = values[0];
32815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			values[0] = element.getStyle(property);
32825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
32835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var parsed = values.map(this.parse);
32845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return {from: parsed[0], to: parsed[1]};
32855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
32865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	//parses a value into an array
32885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	parse: function(value){
32905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		value = $lambda(value)();
32915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		value = (typeof value == 'string') ? value.split(' ') : $splat(value);
32925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return value.map(function(val){
32935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			val = String(val);
32945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var found = false;
32955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Fx.CSS.Parsers.each(function(parser, key){
32965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (found) return;
32975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var parsed = parser.parse(val);
32985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if ($chk(parsed)) found = {value: parsed, parser: parser};
32995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			});
33005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			found = found || {value: val, parser: Fx.CSS.Parsers.String};
33015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return found;
33025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
33035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
33045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	//computes by a from and to prepared objects, using their parsers.
33065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	compute: function(from, to, delta){
33085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var computed = [];
33095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		(Math.min(from.length, to.length)).times(function(i){
33105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
33115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
33125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		computed.$family = {name: 'fx:css:value'};
33135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return computed;
33145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
33155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	//serves the value as settable
33175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	serve: function(value, unit){
33195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if ($type(value) != 'fx:css:value') value = this.parse(value);
33205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var returned = [];
33215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		value.each(function(bit){
33225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			returned = returned.concat(bit.parser.serve(bit.value, unit));
33235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
33245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return returned;
33255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
33265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	//renders the change to an element
33285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	render: function(element, property, value, unit){
33305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		element.setStyle(property, this.serve(value, unit));
33315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
33325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	//searches inside the page css to find the values for a selector
33345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	search: function(selector){
33365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
33375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var to = {};
33385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		Array.each(document.styleSheets, function(sheet, j){
33395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var href = sheet.href;
33405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (href && href.contains('://') && !href.contains(document.domain)) return;
33415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var rules = sheet.rules || sheet.cssRules;
33425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			Array.each(rules, function(rule, i){
33435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!rule.style) return;
33445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
33455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					return m.toLowerCase();
33465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				}) : null;
33475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (!selectorText || !selectorText.test('^' + selector + '$')) return;
33485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				Element.Styles.each(function(value, style){
33495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					if (!rule.style[style] || Element.ShortStyles[style]) return;
33505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					value = String(rule.style[style]);
33515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)					to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value;
33525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				});
33535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			});
33545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
33555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Fx.CSS.Cache[selector] = to;
33565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
33575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
33595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.CSS.Cache = {};
33615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.CSS.Parsers = new Hash({
33635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Color: {
33655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		parse: function(value){
33665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
33675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
33685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
33695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		compute: function(from, to, delta){
33705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return from.map(function(value, i){
33715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				return Math.round(Fx.compute(from[i], to[i], delta));
33725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			});
33735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
33745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		serve: function(value){
33755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return value.map(Number);
33765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
33775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
33785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Number: {
33805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		parse: parseFloat,
33815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		compute: Fx.compute,
33825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		serve: function(value, unit){
33835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (unit) ? value + unit : value;
33845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
33855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
33865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	String: {
33885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		parse: $lambda(false),
33895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		compute: $arguments(1),
33905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		serve: $arguments(0)
33915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
33925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
33945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
33975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Fx.Tween.js
33985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Formerly Fx.Style, effect to transition any CSS property for an element.
33995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
34015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
34025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
34035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Tween = new Class({
34055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends: Fx.CSS,
34075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(element, options){
34095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.element = this.subject = $(element);
34105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.parent(options);
34115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
34125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(property, now){
34145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (arguments.length == 1){
34155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			now = property;
34165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			property = this.property || this.options.property;
34175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
34185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.render(this.element, property, now, this.options.unit);
34195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
34205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
34215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	start: function(property, from, to){
34235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.check(property, from, to)) return this;
34245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var args = Array.flatten(arguments);
34255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.property = this.options.property || args.shift();
34265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var parsed = this.prepare(this.element, this.property, args);
34275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.parent(parsed.from, parsed.to);
34285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
34295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
34315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.tween = {
34335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(options){
34355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var tween = this.retrieve('tween');
34365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (tween) tween.cancel();
34375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options));
34385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
34395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(options){
34415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options || !this.retrieve('tween')){
34425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options || !this.retrieve('tween:options')) this.set('tween', options);
34435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.store('tween', new Fx.Tween(this, this.retrieve('tween:options')));
34445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
34455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.retrieve('tween');
34465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
34475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
34495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
34515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	tween: function(property, from, to){
34535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.get('tween').start(arguments);
34545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
34555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
34565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	fade: function(how){
34585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var fade = this.get('tween'), o = 'opacity', toggle;
34595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		how = $pick(how, 'toggle');
34605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (how){
34615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'in': fade.start(o, 1); break;
34625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'out': fade.start(o, 0); break;
34635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'show': fade.set(o, 1); break;
34645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'hide': fade.set(o, 0); break;
34655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'toggle':
34665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
34675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				fade.start(o, (flag) ? 0 : 1);
34685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				this.store('fade:flag', !flag);
34695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				toggle = true;
34705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			break;
34715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			default: fade.start(o, arguments);
34725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
34735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!toggle) this.eliminate('fade:flag');
34745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
34755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
34765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	highlight: function(start, end){
34785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!end){
34795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			end = this.retrieve('highlight:original', this.getStyle('background-color'));
34805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			end = (end == 'transparent') ? '#fff' : end;
34815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
34825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var tween = this.get('tween');
34835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		tween.start('background-color', start || '#ffff88', end).chain(function(){
34845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.setStyle('background-color', this.retrieve('highlight:original'));
34855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			tween.callChain();
34865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}.bind(this));
34875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
34885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
34895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
34915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
34945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Fx.Morph.js
34955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
34965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
34985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
34995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
35005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Morph = new Class({
35025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends: Fx.CSS,
35045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(element, options){
35065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.element = this.subject = $(element);
35075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.parent(options);
35085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
35095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(now){
35115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (typeof now == 'string') now = this.search(now);
35125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
35135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
35145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
35155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	compute: function(from, to, delta){
35175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var now = {};
35185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
35195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return now;
35205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
35215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	start: function(properties){
35235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.check(properties)) return this;
35245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (typeof properties == 'string') properties = this.search(properties);
35255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var from = {}, to = {};
35265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var p in properties){
35275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var parsed = this.prepare(this.element, p, properties[p]);
35285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			from[p] = parsed.from;
35295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			to[p] = parsed.to;
35305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
35315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.parent(from, to);
35325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
35335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
35355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.morph = {
35375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(options){
35395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var morph = this.retrieve('morph');
35405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (morph) morph.cancel();
35415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options));
35425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
35435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(options){
35455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options || !this.retrieve('morph')){
35465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options || !this.retrieve('morph:options')) this.set('morph', options);
35475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.store('morph', new Fx.Morph(this, this.retrieve('morph:options')));
35485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
35495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.retrieve('morph');
35505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
35515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
35535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
35555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	morph: function(props){
35575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.get('morph').start(props);
35585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
35595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
35605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
35625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
35655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Fx.Transitions.js
35665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Contains a set of advanced transitions to be used with any of the Fx Classes.
35675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
35695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
35705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Credits:
35725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
35735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
35745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.implement({
35765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getTransition: function(){
35785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
35795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (typeof trans == 'string'){
35805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var data = trans.split(':');
35815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			trans = Fx.Transitions;
35825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			trans = trans[data[0]] || trans[data[0].capitalize()];
35835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
35845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
35855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return trans;
35865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
35875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
35895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Transition = function(transition, params){
35915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	params = $splat(params);
35925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	return $extend(transition, {
35935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		easeIn: function(pos){
35945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return transition(pos, params);
35955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
35965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		easeOut: function(pos){
35975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return 1 - transition(1 - pos, params);
35985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
35995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		easeInOut: function(pos){
36005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2;
36015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
36025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
36035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
36045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Transitions = new Hash({
36065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	linear: $arguments(0)
36085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
36105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Transitions.extend = function(transitions){
36125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
36135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
36145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Fx.Transitions.extend({
36165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Pow: function(p, x){
36185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.pow(p, x[0] || 6);
36195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Expo: function(p){
36225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.pow(2, 8 * (p - 1));
36235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Circ: function(p){
36265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return 1 - Math.sin(Math.acos(p));
36275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Sine: function(p){
36305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return 1 - Math.sin((1 - p) * Math.PI / 2);
36315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Back: function(p, x){
36345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		x = x[0] || 1.618;
36355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.pow(p, 2) * ((x + 1) * p - x);
36365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Bounce: function(p){
36395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var value;
36405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		for (var a = 0, b = 1; 1; a += b, b /= 2){
36415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (p >= (7 - 4 * a) / 11){
36425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
36435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				break;
36445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
36455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
36465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return value;
36475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Elastic: function(p, x){
36505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3);
36515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
36525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
36545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
36565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Fx.Transitions[transition] = new Fx.Transition(function(p){
36575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return Math.pow(p, [i + 2]);
36585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	});
36595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
36605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
36635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Request.js
36645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Powerful all purpose Request Class. Uses XMLHTTPRequest.
36655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
36675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
36685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
36695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var Request = new Class({
36715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Implements: [Chain, Events, Options],
36735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options: {/*
36755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onRequest: $empty,
36765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onComplete: $empty,
36775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onCancel: $empty,
36785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onSuccess: $empty,
36795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onFailure: $empty,
36805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		onException: $empty,*/
36815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		url: '',
36825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		data: '',
36835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		headers: {
36845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			'X-Requested-With': 'XMLHttpRequest',
36855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
36865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		},
36875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		async: true,
36885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		format: false,
36895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		method: 'post',
36905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		link: 'ignore',
36915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		isSuccess: null,
36925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		emulation: true,
36935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		urlEncoded: true,
36945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		encoding: 'utf-8',
36955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		evalScripts: false,
36965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		evalResponse: false,
36975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		noCache: false
36985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
36995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(options){
37015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr = new Browser.Request();
37025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.setOptions(options);
37035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
37045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.headers = new Hash(this.options.headers);
37055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onStateChange: function(){
37085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.xhr.readyState != 4 || !this.running) return;
37095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.running = false;
37105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.status = 0;
37115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		$try(function(){
37125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.status = this.xhr.status;
37135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}.bind(this));
37145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.isSuccess.call(this, this.status)){
37155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML};
37165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.success(this.response.text, this.response.xml);
37175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		} else {
37185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.response = {text: null, xml: null};
37195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.failure();
37205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
37215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr.onreadystatechange = $empty;
37225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	isSuccess: function(){
37255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return ((this.status >= 200) && (this.status < 300));
37265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	processScripts: function(text){
37295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text);
37305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return text.stripScripts(this.options.evalScripts);
37315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	success: function(text, xml){
37345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.onSuccess(this.processScripts(text), xml);
37355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onSuccess: function(){
37385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
37395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	failure: function(){
37425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.onFailure();
37435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	onFailure: function(){
37465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('complete').fireEvent('failure', this.xhr);
37475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	setHeader: function(name, value){
37505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.headers.set(name, value);
37515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
37525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	getHeader: function(name){
37555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $try(function(){
37565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return this.xhr.getResponseHeader(name);
37575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}.bind(this));
37585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	check: function(){
37615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.running) return true;
37625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch (this.options.link){
37635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'cancel': this.cancel(); return true;
37645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'chain': this.chain(this.caller.bind(this, arguments)); return false;
37655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
37665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return false;
37675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
37685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	send: function(options){
37705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.check(options)) return this;
37715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.running = true;
37725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var type = $type(options);
37745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (type == 'string' || type == 'element') options = {data: options};
37755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var old = this.options;
37775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		options = $extend({data: old.data, url: old.url, method: old.method}, options);
37785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var data = options.data, url = options.url, method = options.method;
37795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		switch ($type(data)){
37815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'element': data = $(data).toQueryString(); break;
37825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			case 'object': case 'hash': data = Hash.toQueryString(data);
37835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
37845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.format){
37865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var format = 'format=' + this.options.format;
37875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			data = (data) ? format + '&' + data : format;
37885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
37895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.emulation && ['put', 'delete'].contains(method)){
37915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var _method = '_method=' + method;
37925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			data = (data) ? _method + '&' + data : _method;
37935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			method = 'post';
37945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
37955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (this.options.urlEncoded && method == 'post'){
37975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
37985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding);
37995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
38005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if(this.options.noCache) {
38025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var noCache = "noCache=" + new Date().getTime();
38035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			data = (data) ? noCache + '&' + data : noCache;
38045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
38055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (data && method == 'get'){
38085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			url = url + (url.contains('?') ? '&' : '?') + data;
38095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			data = null;
38105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
38115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr.open(method.toUpperCase(), url, this.options.async);
38145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr.onreadystatechange = this.onStateChange.bind(this);
38165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.headers.each(function(value, key){
38185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			try {
38195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				this.xhr.setRequestHeader(key, value);
38205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} catch (e){
38215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				this.fireEvent('exception', [key, value]);
38225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
38235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, this);
38245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('request');
38265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr.send(data);
38275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.options.async) this.onStateChange();
38285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
38295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
38305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	cancel: function(){
38325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (!this.running) return this;
38335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.running = false;
38345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr.abort();
38355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr.onreadystatechange = $empty;
38365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.xhr = new Browser.Request();
38375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.fireEvent('cancel');
38385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
38395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
38405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
38425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
38445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var methods = {};
38465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
38475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	methods[method] = function(){
38485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var params = Array.link(arguments, {url: String.type, data: $defined});
38495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.send($extend(params, {method: method.toLowerCase()}));
38505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	};
38515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
38525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Request.implement(methods);
38545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
38565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
38585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Request.HTML.js
38595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends the basic Request Class with additional methods for interacting with HTML responses.
38605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
38625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
38635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
38645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Request.HTML = new Class({
38665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends: Request,
38685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options: {
38705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		update: false,
38715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		append: false,
38725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		evalScripts: true,
38735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		filter: false
38745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
38755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	processHTML: function(text){
38775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
38785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		text = (match) ? match[1] : text;
38795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var container = new Element('div');
38815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return $try(function(){
38835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			var root = '<root>' + text + '</root>', doc;
38845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (Browser.Engine.trident){
38855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				doc = new ActiveXObject('Microsoft.XMLDOM');
38865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				doc.async = false;
38875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				doc.loadXML(root);
38885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			} else {
38895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				doc = new DOMParser().parseFromString(root, 'text/xml');
38905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
38915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			root = doc.getElementsByTagName('root')[0];
38925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (!root) return null;
38935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			for (var i = 0, k = root.childNodes.length; i < k; i++){
38945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				var child = Element.clone(root.childNodes[i], true, true);
38955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)				if (child) container.grab(child);
38965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			}
38975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			return container;
38985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}) || container.set('html', text);
38995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
39005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	success: function(text){
39025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var options = this.options, response = this.response;
39035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		response.html = text.stripScripts(function(script){
39055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			response.javascript = script;
39065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		});
39075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var temp = this.processHTML(response.html);
39095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		response.tree = temp.childNodes;
39115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		response.elements = temp.getElements('*');
39125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options.filter) response.tree = response.elements.filter(options.filter);
39145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options.update) $(options.update).empty().set('html', response.html);
39155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		else if (options.append) $(options.append).adopt(temp.getChildren());
39165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options.evalScripts) $exec(response.javascript);
39175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
39195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
39205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
39225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.send = {
39245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(options){
39265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var send = this.retrieve('send');
39275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (send) send.cancel();
39285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.eliminate('send').store('send:options', $extend({
39295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
39305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}, options));
39315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
39325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(options){
39345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options || !this.retrieve('send')){
39355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options || !this.retrieve('send:options')) this.set('send', options);
39365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.store('send', new Request(this.retrieve('send:options')));
39375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
39385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.retrieve('send');
39395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
39405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
39425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.Properties.load = {
39445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	set: function(options){
39465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var load = this.retrieve('load');
39475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (load) load.cancel();
39485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
39495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
39505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	get: function(options){
39525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		if (options || ! this.retrieve('load')){
39535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			if (options || !this.retrieve('load:options')) this.set('load', options);
39545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			this.store('load', new Request.HTML(this.retrieve('load:options')));
39555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		}
39565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this.retrieve('load');
39575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
39585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
39605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element.implement({
39625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	send: function(url){
39645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		var sender = this.get('send');
39655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		sender.send({data: this, url: url || sender.options.url});
39665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
39675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
39685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	load: function(){
39705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
39715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		return this;
39725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
39735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
39755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
39785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Script: Request.JSON.js
39795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends the basic Request Class with additional methods for sending and receiving JSON data.
39805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)License:
39825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	MIT-style license.
39835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
39845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Request.JSON = new Class({
39865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	Extends: Request,
39885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	options: {
39905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		secure: true
39915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
39925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	initialize: function(options){
39945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.parent(options);
39955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});
39965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	},
39975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	success: function(text){
39995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.response.json = JSON.decode(text, this.options.secure);
40005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)		this.onSuccess(this.response.json, text);
40015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)	}
40025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
4004