124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikMooTools: the javascript framework
424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikweb build:
624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik - http://mootools.net/core/8423c12ffd6a6bfcde9ea22554aec795
724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpackager build:
924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady
1024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
1124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
1224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
1324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
1424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
1524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
1624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
1724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Core
1824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
1924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: The heart of MooTools.
2024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
2224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikcopyright: Copyright (c) 2006-2014 [Valerio Proietti](http://mad4milk.net/).
2424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikauthors: The MooTools production team (http://mootools.net/developers/)
2624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikinspiration:
2824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik  - 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)
2924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
3024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Core, MooTools, Type, typeOf, instanceOf, Native]
3224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
3424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
3524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
3724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.MooTools = {
3924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	version: '1.5.0',
4024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	build: '0f7b690afee9349b15909f33016a25d2e4d9f4e3'
4124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
4224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// typeOf, instanceOf
4424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar typeOf = this.typeOf = function(item){
4624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item == null) return 'null';
4724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item.$family != null) return item.$family();
4824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item.nodeName){
5024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (item.nodeType == 1) return 'element';
5124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
5224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (typeof item.length == 'number'){
5324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if ('callee' in item) return 'arguments';
5424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if ('item' in item) return 'collection';
5524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
5624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
5724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return typeof item;
5824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
5924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
6024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar instanceOf = this.instanceOf = function(item, object){
6124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item == null) return false;
6224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var constructor = item.$constructor || item.constructor;
6324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (constructor){
6424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (constructor === object) return true;
6524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		constructor = constructor.parent;
6624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
6724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<ltIE8>*/
6824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!item.hasOwnProperty) return false;
6924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</ltIE8>*/
7024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return item instanceof object;
7124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
7224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Function overloading
7424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Function = this.Function;
7624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar enumerables = true;
7824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfor (var i in {toString: 1}) enumerables = null;
7924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
8024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
8124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.prototype.overloadSetter = function(usePlural){
8224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var self = this;
8324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return function(a, b){
8424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (a == null) return this;
8524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (usePlural || typeof a != 'string'){
8624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var k in a) self.call(this, k, a[k]);
8724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (enumerables) for (var i = enumerables.length; i--;){
8824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				k = enumerables[i];
8924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
9024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
9124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
9224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			self.call(this, a, b);
9324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
9424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
9524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
9624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
9724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
9824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.prototype.overloadGetter = function(usePlural){
9924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var self = this;
10024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return function(a){
10124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var args, result;
10224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeof a != 'string') args = a;
10324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else if (arguments.length > 1) args = arguments;
10424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else if (usePlural) args = [a];
10524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (args){
10624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			result = {};
10724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
10824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
10924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			result = self.call(this, a);
11024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
11124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return result;
11224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
11324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
11424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
11524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.prototype.extend = function(key, value){
11624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this[key] = value;
11724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}.overloadSetter();
11824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
11924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.prototype.implement = function(key, value){
12024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.prototype[key] = value;
12124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}.overloadSetter();
12224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
12324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// From
12424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
12524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar slice = Array.prototype.slice;
12624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
12724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.from = function(item){
12824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (typeOf(item) == 'function') ? item : function(){
12924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return item;
13024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
13124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
13224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
13324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.from = function(item){
13424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item == null) return [];
13524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
13624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
13724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
13824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikNumber.from = function(item){
13924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var number = parseFloat(item);
14024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return isFinite(number) ? number : null;
14124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
14224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
14324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikString.from = function(item){
14424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return item + '';
14524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
14624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
14724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// hide, protect
14824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
14924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.implement({
15024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
15124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hide: function(){
15224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$hidden = true;
15324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
15424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
15524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
15624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	protect: function(){
15724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$protected = true;
15824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
15924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
16024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
16124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
16224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
16324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Type
16424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
16524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Type = this.Type = function(name, object){
16624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (name){
16724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var lower = name.toLowerCase();
16824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var typeCheck = function(item){
16924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (typeOf(item) == lower);
17024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
17124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
17224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Type['is' + name] = typeCheck;
17324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (object != null){
17424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			object.prototype.$family = (function(){
17524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return lower;
17624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}).hide();
17724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
17824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
17924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
18024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
18124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (object == null) return null;
18224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
18324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	object.extend(this);
18424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	object.$constructor = Type;
18524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	object.prototype.$constructor = object;
18624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
18724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return object;
18824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
18924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
19024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar toString = Object.prototype.toString;
19124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
19224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikType.isEnumerable = function(item){
19324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
19424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
19524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
19624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hooks = {};
19724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
19824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hooksOf = function(object){
19924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var type = typeOf(object.prototype);
20024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return hooks[type] || (hooks[type] = []);
20124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
20224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
20324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar implement = function(name, method){
20424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (method && method.$hidden) return;
20524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
20624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var hooks = hooksOf(this);
20724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
20824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var i = 0; i < hooks.length; i++){
20924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var hook = hooks[i];
21024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeOf(hook) == 'type') implement.call(hook, name, method);
21124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else hook.call(this, name, method);
21224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
21324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
21424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var previous = this.prototype[name];
21524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (previous == null || !previous.$protected) this.prototype[name] = method;
21624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
21724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
21824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return method.apply(item, slice.call(arguments, 1));
21924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
22024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
22124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
22224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar extend = function(name, method){
22324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (method && method.$hidden) return;
22424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var previous = this[name];
22524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (previous == null || !previous.$protected) this[name] = method;
22624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
22724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
22824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikType.implement({
22924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
23024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	implement: implement.overloadSetter(),
23124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
23224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	extend: extend.overloadSetter(),
23324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
23424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	alias: function(name, existing){
23524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		implement.call(this, name, this.prototype[existing]);
23624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.overloadSetter(),
23724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
23824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	mirror: function(hook){
23924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		hooksOf(this).push(hook);
24024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
24124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
24224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
24424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiknew Type('Type', Type);
24624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Default Types
24824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar force = function(name, object, methods){
25024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var isType = (object != Object),
25124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		prototype = object.prototype;
25224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
25324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (isType) object = new Type(name, object);
25424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
25524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var i = 0, l = methods.length; i < l; i++){
25624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var key = methods[i],
25724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			generic = object[key],
25824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			proto = prototype[key];
25924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
26024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (generic) generic.protect();
26124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isType && proto) object.implement(key, proto.protect());
26224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
26324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
26424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (isType){
26524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
26624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		object.forEachMethod = function(fn){
26724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){
26824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				fn.call(prototype, prototype[methods[i]], methods[i]);
26924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
27024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var key in prototype) fn.call(prototype, prototype[key], key);
27124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
27224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
27324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
27424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return force;
27524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
27624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
27724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikforce('String', String, [
27824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
27924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'
28024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik])('Array', Array, [
28124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
28224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
28324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik])('Number', Number, [
28424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
28524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik])('Function', Function, [
28624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'apply', 'call', 'bind'
28724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik])('RegExp', RegExp, [
28824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'exec', 'test'
28924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik])('Object', Object, [
29024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'create', 'defineProperty', 'defineProperties', 'keys',
29124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
29224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
29324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik])('Date', Date, ['now']);
29424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
29524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.extend = extend.overloadSetter();
29624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
29724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDate.extend('now', function(){
29824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return +(new Date);
29924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
30024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiknew Type('Boolean', Boolean);
30224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// fixes NaN returning as Number
30424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikNumber.prototype.$family = function(){
30624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return isFinite(this) ? 'number' : 'null';
30724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}.hide();
30824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Number.random
31024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
31124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikNumber.extend('random', function(min, max){
31224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return Math.floor(Math.random() * (max - min + 1) + min);
31324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
31424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
31524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// forEach, each
31624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
31724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hasOwnProperty = Object.prototype.hasOwnProperty;
31824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.extend('forEach', function(object, fn, bind){
31924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var key in object){
32024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
32124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
32224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
32324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
32424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.each = Object.forEach;
32524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
32624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.implement({
32724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
32824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<!ES5>*/
32924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	forEach: function(fn, bind){
33024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length; i < l; i++){
33124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (i in this) fn.call(bind, this[i], i, this);
33224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
33324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
33424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</!ES5>*/
33524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
33624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	each: function(fn, bind){
33724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.forEach(this, fn, bind);
33824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
33924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
34024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
34124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
34224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
34324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Array & Object cloning, Object merging and appending
34424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
34524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar cloneOf = function(item){
34624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	switch (typeOf(item)){
34724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'array': return item.clone();
34824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'object': return Object.clone(item);
34924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		default: return item;
35024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
35124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
35224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
35324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.implement('clone', function(){
35424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var i = this.length, clone = new Array(i);
35524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (i--) clone[i] = cloneOf(this[i]);
35624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return clone;
35724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
35824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
35924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar mergeOne = function(source, key, current){
36024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	switch (typeOf(current)){
36124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'object':
36224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
36324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else source[key] = Object.clone(current);
36424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		break;
36524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'array': source[key] = current.clone(); break;
36624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		default: source[key] = current;
36724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
36824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return source;
36924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
37024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
37124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.extend({
37224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
37324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	merge: function(source, k, v){
37424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeOf(k) == 'string') return mergeOne(source, k, v);
37524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 1, l = arguments.length; i < l; i++){
37624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var object = arguments[i];
37724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var key in object) mergeOne(source, key, object[key]);
37824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
37924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return source;
38024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
38124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
38224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clone: function(object){
38324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var clone = {};
38424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object) clone[key] = cloneOf(object[key]);
38524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return clone;
38624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
38724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
38824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	append: function(original){
38924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 1, l = arguments.length; i < l; i++){
39024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var extended = arguments[i] || {};
39124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var key in extended) original[key] = extended[key];
39224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
39324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return original;
39424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
39524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
39624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
39724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
39824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Object-less types
39924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
40024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
40124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	new Type(name);
40224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
40324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
40424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Unique ID
40524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
40624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar UID = Date.now();
40724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
40824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikString.extend('uniqueID', function(){
40924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (UID++).toString(36);
41024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
41124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
41224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
41324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
41424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
41524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
41624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
41724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
41824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
41924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
42024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Array
42124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
42224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains Array Prototypes like each, contains, and erase.
42324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
42424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
42524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
42624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Type]
42724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
42824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Array
42924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
43024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
43124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
43224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
43324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.implement({
43424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
43524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<!ES5>*/
43624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	every: function(fn, bind){
43724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length >>> 0; i < l; i++){
43824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
43924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
44024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
44124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
44224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
44324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	filter: function(fn, bind){
44424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var results = [];
44524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){
44624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value = this[i];
44724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (fn.call(bind, value, i, this)) results.push(value);
44824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
44924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return results;
45024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
45124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
45224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	indexOf: function(item, from){
45324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var length = this.length >>> 0;
45424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){
45524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this[i] === item) return i;
45624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
45724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return -1;
45824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
45924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
46024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	map: function(fn, bind){
46124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var length = this.length >>> 0, results = Array(length);
46224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; i < length; i++){
46324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (i in this) results[i] = fn.call(bind, this[i], i, this);
46424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
46524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return results;
46624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
46724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
46824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	some: function(fn, bind){
46924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length >>> 0; i < l; i++){
47024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
47124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
47224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return false;
47324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
47424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</!ES5>*/
47524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
47624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clean: function(){
47724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.filter(function(item){
47824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return item != null;
47924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
48024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
48124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
48224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	invoke: function(methodName){
48324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var args = Array.slice(arguments, 1);
48424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.map(function(item){
48524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return item[methodName].apply(item, args);
48624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
48724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
48824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
48924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	associate: function(keys){
49024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var obj = {}, length = Math.min(this.length, keys.length);
49124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
49224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return obj;
49324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
49424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
49524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	link: function(object){
49624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var result = {};
49724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length; i < l; i++){
49824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var key in object){
49924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (object[key](this[i])){
50024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					result[key] = this[i];
50124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					delete object[key];
50224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					break;
50324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
50424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
50524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
50624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return result;
50724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
50824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
50924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	contains: function(item, from){
51024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.indexOf(item, from) != -1;
51124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
51224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
51324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	append: function(array){
51424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.push.apply(this, array);
51524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
51624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
51724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
51824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getLast: function(){
51924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.length) ? this[this.length - 1] : null;
52024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
52124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
52224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getRandom: function(){
52324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
52424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
52524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
52624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	include: function(item){
52724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.contains(item)) this.push(item);
52824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
52924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
53024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
53124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	combine: function(array){
53224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
53324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
53424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
53524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
53624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	erase: function(item){
53724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = this.length; i--;){
53824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this[i] === item) this.splice(i, 1);
53924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
54024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
54124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
54224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
54324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	empty: function(){
54424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.length = 0;
54524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
54624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
54724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
54824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	flatten: function(){
54924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var array = [];
55024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length; i < l; i++){
55124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var type = typeOf(this[i]);
55224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (type == 'null') continue;
55324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
55424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
55524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return array;
55624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
55724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
55824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pick: function(){
55924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length; i < l; i++){
56024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this[i] != null) return this[i];
56124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
56224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
56324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
56424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
56524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hexToRgb: function(array){
56624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.length != 3) return null;
56724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var rgb = this.map(function(value){
56824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (value.length == 1) value += value;
56924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return parseInt(value, 16);
57024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
57124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (array) ? rgb : 'rgb(' + rgb + ')';
57224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
57324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
57424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	rgbToHex: function(array){
57524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.length < 3) return null;
57624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
57724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var hex = [];
57824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; i < 3; i++){
57924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var bit = (this[i] - 0).toString(16);
58024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			hex.push((bit.length == 1) ? '0' + bit : bit);
58124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
58224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (array) ? hex : '#' + hex.join('');
58324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
58424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
58524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
58624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
58724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
58824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
58924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
59124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
59224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: String
59424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains String Prototypes like camelCase, capitalize, test, and toInt.
59624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
59824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Type, Array]
60024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
60124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: String
60224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
60324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
60424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
60524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
60624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikString.implement({
60724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
60824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//<!ES6>
60924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	contains: function(string, index){
61024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (index ? String(this).slice(index) : String(this)).indexOf(string) > -1;
61124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
61224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//</!ES6>
61324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
61424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	test: function(regex, params){
61524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
61624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
61724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
61824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	trim: function(){
61924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(/^\s+|\s+$/g, '');
62024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
62124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
62224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clean: function(){
62324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(/\s+/g, ' ').trim();
62424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
62524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
62624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	camelCase: function(){
62724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(/-\D/g, function(match){
62824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return match.charAt(1).toUpperCase();
62924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
63024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
63124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
63224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hyphenate: function(){
63324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(/[A-Z]/g, function(match){
63424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return ('-' + match.charAt(0).toLowerCase());
63524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
63624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
63724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
63824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	capitalize: function(){
63924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(/\b[a-z]/g, function(match){
64024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return match.toUpperCase();
64124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
64224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
64324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
64424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	escapeRegExp: function(){
64524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
64624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
64724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
64824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toInt: function(base){
64924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return parseInt(this, base || 10);
65024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
65124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
65224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toFloat: function(){
65324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return parseFloat(this);
65424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
65524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
65624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hexToRgb: function(array){
65724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
65824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (hex) ? hex.slice(1).hexToRgb(array) : null;
65924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
66024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
66124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	rgbToHex: function(array){
66224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var rgb = String(this).match(/\d{1,3}/g);
66324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (rgb) ? rgb.rgbToHex(array) : null;
66424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
66524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
66624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	substitute: function(object, regexp){
66724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
66824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (match.charAt(0) == '\\') return match.slice(1);
66924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (object[name] != null) ? object[name] : '';
67024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
67124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
67224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
67324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
67424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
67524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
67624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
67724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
67824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
67924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
68024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
68124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Number
68224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
68324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains Number Prototypes like limit, round, times, and ceil.
68424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
68524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
68624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
68724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Type
68824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
68924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Number
69024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
69124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
69224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
69324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
69424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikNumber.implement({
69524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
69624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	limit: function(min, max){
69724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.min(max, Math.max(min, this));
69824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
69924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
70024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	round: function(precision){
70124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
70224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.round(this * precision) / precision;
70324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
70424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
70524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	times: function(fn, bind){
70624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; i < this; i++) fn.call(bind, i, this);
70724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
70824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
70924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toFloat: function(){
71024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return parseFloat(this);
71124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
71224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
71324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toInt: function(base){
71424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return parseInt(this, base || 10);
71524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
71624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
71724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
71824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
71924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikNumber.alias('each', 'times');
72024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
72124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(math){
72224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var methods = {};
72324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	math.each(function(name){
72424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!Number[name]) methods[name] = function(){
72524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return Math[name].apply(null, [this].concat(Array.from(arguments)));
72624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
72724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
72824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Number.implement(methods);
72924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
73024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
73124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
73224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
73324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
73424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
73524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Function
73624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
73724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains Function Prototypes like create, bind, pass, and delay.
73824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
73924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
74024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
74124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Type
74224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
74324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Function
74424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
74524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
74624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
74724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
74824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.extend({
74924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
75024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	attempt: function(){
75124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = arguments.length; i < l; i++){
75224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
75324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return arguments[i]();
75424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch (e){}
75524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
75624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
75724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
75824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
75924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
76024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
76124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFunction.implement({
76224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
76324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	attempt: function(args, bind){
76424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
76524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return this.apply(bind, Array.from(args));
76624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch (e){}
76724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
76824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
76924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
77024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
77124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<!ES5-bind>*/
77224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	bind: function(that){
77324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var self = this,
77424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
77524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			F = function(){};
77624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
77724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var bound = function(){
77824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var context = that, length = arguments.length;
77924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this instanceof bound){
78024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				F.prototype = self.prototype;
78124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				context = new F;
78224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
78324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var result = (!args && !length)
78424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				? self.call(context)
78524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				: self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
78624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return context == that ? result : context;
78724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
78824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return bound;
78924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
79024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</!ES5-bind>*/
79124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
79224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pass: function(args, bind){
79324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var self = this;
79424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (args != null) args = Array.from(args);
79524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return function(){
79624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return self.apply(bind, args || arguments);
79724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
79824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
79924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
80024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	delay: function(delay, bind, args){
80124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
80224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
80324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
80424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	periodical: function(periodical, bind, args){
80524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return setInterval(this.pass((args == null ? [] : args), bind), periodical);
80624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
80724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
80824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
80924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
81024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
81124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
81224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
81324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
81424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
81524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
81624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Object
81724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
81824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Object generic methods
81924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
82024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
82124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
82224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Type
82324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
82424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Object, Hash]
82524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
82624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
82724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
82824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
82924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
83024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
83124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hasOwnProperty = Object.prototype.hasOwnProperty;
83224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
83324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.extend({
83424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
83524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	subset: function(object, keys){
83624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var results = {};
83724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = keys.length; i < l; i++){
83824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var k = keys[i];
83924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (k in object) results[k] = object[k];
84024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
84124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return results;
84224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
84324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
84424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	map: function(object, fn, bind){
84524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var results = {};
84624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
84724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
84824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
84924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return results;
85024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
85124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
85224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	filter: function(object, fn, bind){
85324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var results = {};
85424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
85524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var value = object[key];
85624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value;
85724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
85824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return results;
85924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
86024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
86124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	every: function(object, fn, bind){
86224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
86324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
86424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
86524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
86624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
86724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
86824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	some: function(object, fn, bind){
86924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
87024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
87124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
87224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return false;
87324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
87424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
87524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	keys: function(object){
87624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var keys = [];
87724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
87824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key)) keys.push(key);
87924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
88024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return keys;
88124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
88224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
88324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	values: function(object){
88424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var values = [];
88524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
88624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key)) values.push(object[key]);
88724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
88824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return values;
88924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
89024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
89124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getLength: function(object){
89224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Object.keys(object).length;
89324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
89424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
89524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	keyOf: function(object, value){
89624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var key in object){
89724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOwnProperty.call(object, key) && object[key] === value) return key;
89824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
89924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
90024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
90124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
90224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	contains: function(object, value){
90324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Object.keyOf(object, value) != null;
90424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
90524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
90624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toQueryString: function(object, base){
90724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var queryString = [];
90824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
90924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Object.each(object, function(value, key){
91024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (base) key = base + '[' + key + ']';
91124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var result;
91224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			switch (typeOf(value)){
91324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				case 'object': result = Object.toQueryString(value, key); break;
91424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				case 'array':
91524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					var qs = {};
91624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					value.each(function(val, i){
91724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						qs[i] = val;
91824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					});
91924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					result = Object.toQueryString(qs, key);
92024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				break;
92124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				default: result = key + '=' + encodeURIComponent(value);
92224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
92324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (value != null) queryString.push(result);
92424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
92524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
92624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return queryString.join('&');
92724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
92824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
92924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
93024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
93124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
93224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
93324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
93424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
93524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
93624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
93724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
93824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
93924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Browser
94024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
94124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
94224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
94324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
94424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
94524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Array, Function, Number, String]
94624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
94724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Browser, Window, Document]
94824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
94924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
95024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
95124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
95224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
95324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
95424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar document = this.document;
95524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar window = document.window = this;
95624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
95724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar parse = function(ua, platform){
95824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	ua = ua.toLowerCase();
95924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	platform = (platform ? platform.toLowerCase() : '');
96024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
96124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\s\/:]([\w\d\.]+)?.*?(safari|(?:rv[\s\/:]|version[\s\/:])([\w\d\.]+)|$)/) || [null, 'unknown', 0];
96224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
96324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (UA[1] == 'trident'){
96424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		UA[1] = 'ie';
96524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (UA[4]) UA[2] = UA[4];
96624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (UA[1] == 'crios') {
96724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		UA[1] = 'chrome';
96824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
96924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
97024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0];
97124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (platform == 'win') platform = 'windows';
97224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
97324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return {
97424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		extend: Function.prototype.extend,
97524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		name: (UA[1] == 'version') ? UA[3] : UA[1],
97624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		version: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
97724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		platform: platform
97824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
97924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
98024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
98124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Browser = this.Browser = parse(navigator.userAgent, navigator.platform);
98224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
98324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (Browser.ie){
98424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Browser.version = document.documentMode;
98524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
98624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
98724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikBrowser.extend({
98824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Features: {
98924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xpath: !!(document.evaluate),
99024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		air: !!(window.runtime),
99124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		query: !!(document.querySelector),
99224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		json: !!(window.JSON)
99324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
99424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	parseUA: parse
99524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
99624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
99724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
99824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
99924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Request
100024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
100124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikBrowser.Request = (function(){
100224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
100324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var XMLHTTP = function(){
100424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return new XMLHttpRequest();
100524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
100624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
100724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var MSXML2 = function(){
100824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return new ActiveXObject('MSXML2.XMLHTTP');
100924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
101024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
101124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var MSXML = function(){
101224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return new ActiveXObject('Microsoft.XMLHTTP');
101324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
101424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
101524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return Function.attempt(function(){
101624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		XMLHTTP();
101724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return XMLHTTP;
101824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}, function(){
101924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		MSXML2();
102024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return MSXML2;
102124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}, function(){
102224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		MSXML();
102324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return MSXML;
102424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
102524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
102624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
102724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
102824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikBrowser.Features.xhr = !!(Browser.Request);
102924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
103024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
103124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
103224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// String scripts
103324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
103424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikBrowser.exec = function(text){
103524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!text) return text;
103624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (window.execScript){
103724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		window.execScript(text);
103824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else {
103924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var script = document.createElement('script');
104024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		script.setAttribute('type', 'text/javascript');
104124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		script.text = text;
104224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		document.head.appendChild(script);
104324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		document.head.removeChild(script);
104424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
104524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return text;
104624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
104724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
104824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikString.implement('stripScripts', function(exec){
104924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var scripts = '';
105024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
105124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		scripts += code + '\n';
105224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return '';
105324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
105424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (exec === true) Browser.exec(scripts);
105524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if (typeOf(exec) == 'function') exec(scripts, text);
105624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return text;
105724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
105824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
105924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Window, Document
106024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
106124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikBrowser.extend({
106224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Document: this.Document,
106324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Window: this.Window,
106424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element: this.Element,
106524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Event: this.Event
106624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
106724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
106824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.Window = this.$constructor = new Type('Window', function(){});
106924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
107024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.$family = Function.from('window').hide();
107124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
107224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikWindow.mirror(function(name, method){
107324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	window[name] = method;
107424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
107524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
107624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.Document = document.$constructor = new Type('Document', function(){});
107724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
107824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdocument.$family = Function.from('document').hide();
107924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
108024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDocument.mirror(function(name, method){
108124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	document[name] = method;
108224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
108324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
108424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdocument.html = document.documentElement;
108524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!document.head) document.head = document.getElementsByTagName('head')[0];
108624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
108724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (document.execCommand) try {
108824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	document.execCommand("BackgroundImageCache", false, true);
108924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} catch (e){}
109024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
109124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE9>*/
109224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (this.attachEvent && !this.addEventListener){
109324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var unloadEvent = function(){
109424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.detachEvent('onunload', unloadEvent);
109524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		document.head = document.html = document.window = null;
109624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
109724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.attachEvent('onunload', unloadEvent);
109824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
109924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
110024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// IE fails on collections and <select>.options (refers to <select>)
110124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar arrayFrom = Array.from;
110224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiktry {
110324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	arrayFrom(document.html.childNodes);
110424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} catch(e){
110524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Array.from = function(item){
110624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
110724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var i = item.length, array = new Array(i);
110824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			while (i--) array[i] = item[i];
110924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return array;
111024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
111124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return arrayFrom(item);
111224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
111324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
111424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var prototype = Array.prototype,
111524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		slice = prototype.slice;
111624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
111724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var method = prototype[name];
111824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array[name] = function(item){
111924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return method.apply(Array.from(item), slice.call(arguments, 1));
112024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
112124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
112224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
112324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE9>*/
112424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
112524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
112624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
112724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
112824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
112924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
113024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
113124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
113224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
113324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Event
113424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
113524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains the Event Type, to make the event object cross-browser.
113624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
113724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
113824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
113924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Window, Document, Array, Function, String, Object]
114024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
114124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Event
114224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
114324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
114424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
114524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
114624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function() {
114724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
114824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar _keys = {};
114924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
115024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){
115124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!win) win = window;
115224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	event = event || win.event;
115324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (event.$extended) return event;
115424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.event = event;
115524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.$extended = true;
115624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.shift = event.shiftKey;
115724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.control = event.ctrlKey;
115824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.alt = event.altKey;
115924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.meta = event.metaKey;
116024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var type = this.type = event.type;
116124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var target = event.target || event.srcElement;
116224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (target && target.nodeType == 3) target = target.parentNode;
116324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.target = document.id(target);
116424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
116524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (type.indexOf('key') == 0){
116624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var code = this.code = (event.which || event.keyCode);
116724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.key = _keys[code];
116824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (type == 'keydown' || type == 'keyup'){
116924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (code > 111 && code < 124) this.key = 'f' + (code - 111);
117024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else if (code > 95 && code < 106) this.key = code - 96;
117124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
117224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.key == null) this.key = String.fromCharCode(code).toLowerCase();
117324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){
117424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var doc = win.document;
117524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
117624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.page = {
117724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
117824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
117924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
118024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.client = {
118124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
118224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
118324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
118424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (type == 'DOMMouseScroll' || type == 'mousewheel')
118524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
118624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
118724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.rightClick = (event.which == 3 || event.button == 2);
118824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (type == 'mouseover' || type == 'mouseout'){
118924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
119024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			while (related && related.nodeType == 3) related = related.parentNode;
119124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.relatedTarget = document.id(related);
119224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
119324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){
119424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.rotation = event.rotation;
119524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.scale = event.scale;
119624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.targetTouches = event.targetTouches;
119724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.changedTouches = event.changedTouches;
119824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var touches = this.touches = event.touches;
119924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (touches && touches[0]){
120024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var touch = touches[0];
120124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.page = {x: touch.pageX, y: touch.pageY};
120224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.client = {x: touch.clientX, y: touch.clientY};
120324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
120424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
120524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
120624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!this.client) this.client = {};
120724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!this.page) this.page = {};
120824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
120924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
121024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDOMEvent.implement({
121124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
121224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	stop: function(){
121324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.preventDefault().stopPropagation();
121424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
121524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
121624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	stopPropagation: function(){
121724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.event.stopPropagation) this.event.stopPropagation();
121824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else this.event.cancelBubble = true;
121924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
122024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
122124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
122224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	preventDefault: function(){
122324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.event.preventDefault) this.event.preventDefault();
122424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else this.event.returnValue = false;
122524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
122624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
122724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
122824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
122924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
123024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDOMEvent.defineKey = function(code, key){
123124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	_keys[code] = key;
123224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
123324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
123424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
123524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);
123624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
123724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDOMEvent.defineKeys({
123824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'38': 'up', '40': 'down', '37': 'left', '39': 'right',
123924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',
124024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'46': 'delete', '13': 'enter'
124124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
124224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
124324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
124424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
124524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
124624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
124724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
124824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
124924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
125024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
125124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
125224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
125324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Class
125424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
125524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
125624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
125724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
125824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
125924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Array, String, Function, Number]
126024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
126124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Class
126224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
126324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
126424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
126524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
126624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
126724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
126824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Class = this.Class = new Type('Class', function(params){
126924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (instanceOf(params, Function)) params = {initialize: params};
127024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
127124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var newClass = function(){
127224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		reset(this);
127324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (newClass.$prototyping) return this;
127424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$caller = null;
127524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
127624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$caller = this.caller = null;
127724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return value;
127824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.extend(this).implement(params);
127924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
128024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	newClass.$constructor = Class;
128124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	newClass.prototype.$constructor = newClass;
128224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	newClass.prototype.parent = parent;
128324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
128424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return newClass;
128524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
128624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
128724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar parent = function(){
128824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!this.$caller) throw new Error('The method "parent" cannot be called.');
128924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var name = this.$caller.$name,
129024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parent = this.$caller.$owner.parent,
129124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		previous = (parent) ? parent.prototype[name] : null;
129224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!previous) throw new Error('The method "' + name + '" has no parent.');
129324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return previous.apply(this, arguments);
129424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
129524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
129624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar reset = function(object){
129724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var key in object){
129824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var value = object[key];
129924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		switch (typeOf(value)){
130024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'object':
130124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var F = function(){};
130224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				F.prototype = value;
130324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				object[key] = reset(new F);
130424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			break;
130524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'array': object[key] = value.clone(); break;
130624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
130724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
130824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return object;
130924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
131024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
131124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar wrap = function(self, key, method){
131224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (method.$origin) method = method.$origin;
131324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var wrapper = function(){
131424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
131524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var caller = this.caller, current = this.$caller;
131624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.caller = current; this.$caller = wrapper;
131724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var result = method.apply(this, arguments);
131824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$caller = current; this.caller = caller;
131924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return result;
132024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.extend({$owner: self, $origin: method, $name: key});
132124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return wrapper;
132224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
132324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
132424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar implement = function(key, value, retain){
132524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (Class.Mutators.hasOwnProperty(key)){
132624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		value = Class.Mutators[key].call(this, value);
132724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (value == null) return this;
132824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
132924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
133024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (typeOf(value) == 'function'){
133124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (value.$hidden) return this;
133224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.prototype[key] = (retain) ? value : wrap(this, key, value);
133324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else {
133424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Object.merge(this.prototype, key, value);
133524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
133624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
133724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
133824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
133924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
134024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar getInstance = function(klass){
134124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	klass.$prototyping = true;
134224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var proto = new klass;
134324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	delete klass.$prototyping;
134424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return proto;
134524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
134624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
134724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikClass.implement('implement', implement.overloadSetter());
134824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
134924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikClass.Mutators = {
135024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
135124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Extends: function(parent){
135224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.parent = parent;
135324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.prototype = getInstance(parent);
135424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
135524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
135624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Implements: function(items){
135724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.from(items).each(function(item){
135824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var instance = new item;
135924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var key in instance) implement.call(this, key, instance[key], true);
136024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}, this);
136124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
136224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
136324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
136424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
136524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
136624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
136724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
136824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
136924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
137024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Class.Extras
137124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
137224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
137324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
137424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
137524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
137624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Class
137724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
137824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Class.Extras, Chain, Events, Options]
137924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
138024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
138124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
138224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
138324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
138424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
138524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.Chain = new Class({
138624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
138724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$chain: [],
138824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
138924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	chain: function(){
139024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$chain.append(Array.flatten(arguments));
139124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
139224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
139324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
139424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	callChain: function(){
139524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
139624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
139724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
139824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clearChain: function(){
139924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$chain.empty();
140024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
140124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
140224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
140324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
140424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
140524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar removeOn = function(string){
140624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return string.replace(/^on([A-Z])/, function(full, first){
140724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return first.toLowerCase();
140824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
140924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
141024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
141124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.Events = new Class({
141224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
141324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$events: {},
141424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
141524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvent: function(type, fn, internal){
141624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		type = removeOn(type);
141724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
141824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
141924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
142024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.$events[type] = (this.$events[type] || []).include(fn);
142124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (internal) fn.internal = true;
142224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
142324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
142424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
142524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvents: function(events){
142624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var type in events) this.addEvent(type, events[type]);
142724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
142824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
142924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
143024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	fireEvent: function(type, args, delay){
143124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		type = removeOn(type);
143224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var events = this.$events[type];
143324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!events) return this;
143424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		args = Array.from(args);
143524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		events.each(function(fn){
143624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (delay) fn.delay(delay, this, args);
143724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else fn.apply(this, args);
143824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}, this);
143924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
144024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
144124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
144224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvent: function(type, fn){
144324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		type = removeOn(type);
144424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var events = this.$events[type];
144524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (events && !fn.internal){
144624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var index =  events.indexOf(fn);
144724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (index != -1) delete events[index];
144824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
144924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
145024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
145124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
145224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvents: function(events){
145324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var type;
145424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeOf(events) == 'object'){
145524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (type in events) this.removeEvent(type, events[type]);
145624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return this;
145724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
145824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (events) events = removeOn(events);
145924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (type in this.$events){
146024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (events && events != type) continue;
146124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var fns = this.$events[type];
146224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var i = fns.length; i--;) if (i in fns){
146324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.removeEvent(type, fns[i]);
146424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
146524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
146624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
146724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
146824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
146924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
147024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
147124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthis.Options = new Class({
147224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
147324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setOptions: function(){
147424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
147524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.addEvent) for (var option in options){
147624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
147724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.addEvent(option, options[option]);
147824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete options[option];
147924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
148024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
148124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
148224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
148324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
148424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
148524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
148624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
148724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
148824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
148924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
149024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Slick.Parser
149124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Standalone CSS3 Selector parser
149224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Slick.Parser
149324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
149424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
149524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
149624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik;(function(){
149724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
149824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar parsed,
149924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	separatorIndex,
150024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	combinatorIndex,
150124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reversed,
150224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	cache = {},
150324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reverseCache = {},
150424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reUnescape = /\\/g;
150524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
150624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar parse = function(expression, isReversed){
150724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (expression == null) return null;
150824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (expression.Slick === true) return expression;
150924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	expression = ('' + expression).replace(/^\s+|\s+$/g, '');
151024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reversed = !!isReversed;
151124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var currentCache = (reversed) ? reverseCache : cache;
151224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (currentCache[expression]) return currentCache[expression];
151324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	parsed = {
151424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Slick: true,
151524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		expressions: [],
151624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		raw: expression,
151724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		reverse: function(){
151824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return parse(this.raw, true);
151924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
152024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
152124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	separatorIndex = -1;
152224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (expression != (expression = expression.replace(regexp, parser)));
152324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	parsed.length = parsed.expressions.length;
152424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
152524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
152624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
152724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar reverseCombinator = function(combinator){
152824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (combinator === '!') return ' ';
152924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if (combinator === ' ') return '!';
153024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
153124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else return '!' + combinator;
153224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
153324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
153424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar reverse = function(expression){
153524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var expressions = expression.expressions;
153624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var i = 0; i < expressions.length; i++){
153724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var exp = expressions[i];
153824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
153924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
154024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var j = 0; j < exp.length; j++){
154124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var cexp = exp[j];
154224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
154324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			cexp.combinator = cexp.reverseCombinator;
154424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete cexp.reverseCombinator;
154524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
154624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
154724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		exp.reverse().push(last);
154824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
154924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return expression;
155024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
155124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
155224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
155324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
155424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return '\\' + match;
155524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
155624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
155724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
155824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar regexp = new RegExp(
155924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
156024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#!/usr/bin/env ruby
156124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikputs "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
156224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik__END__
156324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	"(?x)^(?:\
156424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	  \\s* ( , ) \\s*               # Separator          \n\
156524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
156624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|      ( \\s+ )                 # CombinatorChildren \n\
156724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|      ( <unicode>+ | \\* )     # Tag                \n\
156824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	| \\#  ( <unicode>+       )     # ID                 \n\
156924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	| \\.  ( <unicode>+       )     # ClassName          \n\
157024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|                               # Attribute          \n\
157124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	\\[  \
157224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		\\s* (<unicode1>+)  (?:  \
157324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			\\s* ([*^$!~|]?=)  (?:  \
157424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				\\s* (?:\
157524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					([\"']?)(.*?)\\9 \
157624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				)\
157724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			)  \
157824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		)?  \\s*  \
157924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	\\](?!\\]) \n\
158024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|   :+ ( <unicode>+ )(?:\
158124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	\\( (?:\
158224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
158324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	) \\)\
158424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	)?\
158524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	)"
158624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
158724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
158824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	.replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
158924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
159024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
159124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik);
159224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
159324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction parser(
159424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	rawMatch,
159524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
159624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	separator,
159724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	combinator,
159824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	combinatorChildren,
159924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
160024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	tagName,
160124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	id,
160224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	className,
160324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
160424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	attributeKey,
160524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	attributeOperator,
160624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	attributeQuote,
160724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	attributeValue,
160824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
160924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pseudoMarker,
161024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pseudoClass,
161124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pseudoQuote,
161224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pseudoClassQuotedValue,
161324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pseudoClassValue
161424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik){
161524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (separator || separatorIndex === -1){
161624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parsed.expressions[++separatorIndex] = [];
161724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		combinatorIndex = -1;
161824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (separator) return '';
161924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
162024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
162124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (combinator || combinatorChildren || combinatorIndex === -1){
162224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		combinator = combinator || ' ';
162324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var currentSeparator = parsed.expressions[separatorIndex];
162424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (reversed && currentSeparator[combinatorIndex])
162524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
162624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
162724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
162824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
162924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
163024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
163124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (tagName){
163224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentParsed.tag = tagName.replace(reUnescape, '');
163324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
163424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (id){
163524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentParsed.id = id.replace(reUnescape, '');
163624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
163724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (className){
163824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		className = className.replace(reUnescape, '');
163924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
164024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!currentParsed.classList) currentParsed.classList = [];
164124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!currentParsed.classes) currentParsed.classes = [];
164224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentParsed.classList.push(className);
164324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentParsed.classes.push({
164424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value: className,
164524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
164624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
164724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
164824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (pseudoClass){
164924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
165024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
165124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
165224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!currentParsed.pseudos) currentParsed.pseudos = [];
165324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentParsed.pseudos.push({
165424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			key: pseudoClass.replace(reUnescape, ''),
165524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value: pseudoClassValue,
165624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			type: pseudoMarker.length == 1 ? 'class' : 'element'
165724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
165824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
165924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (attributeKey){
166024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		attributeKey = attributeKey.replace(reUnescape, '');
166124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		attributeValue = (attributeValue || '').replace(reUnescape, '');
166224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
166324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var test, regexp;
166424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
166524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		switch (attributeOperator){
166624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
166724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
166824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
166924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
167024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case  '=' : test = function(value){
167124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return attributeValue == value;
167224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}; break;
167324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case '*=' : test = function(value){
167424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return value && value.indexOf(attributeValue) > -1;
167524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}; break;
167624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case '!=' : test = function(value){
167724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return attributeValue != value;
167824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}; break;
167924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			default   : test = function(value){
168024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return !!value;
168124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			};
168224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
168324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
168424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
168524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return false;
168624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
168724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
168824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!test) test = function(value){
168924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return value && regexp.test(value);
169024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
169124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
169224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!currentParsed.attributes) currentParsed.attributes = [];
169324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentParsed.attributes.push({
169424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			key: attributeKey,
169524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			operator: attributeOperator,
169624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value: attributeValue,
169724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			test: test
169824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
169924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
170024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
170124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
170224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return '';
170324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
170424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
170524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick NS
170624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
170724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Slick = (this.Slick || {});
170824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
170924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.parse = function(expression){
171024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return parse(expression);
171124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
171224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
171324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.escapeRegExp = escapeRegExp;
171424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
171524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!this.Slick) this.Slick = Slick;
171624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
171724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
171824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
171924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
172024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
172124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
172224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Slick.Finder
172324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: The new, superfast css selector engine.
172424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Slick.Finder
172524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Slick.Parser
172624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
172724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
172824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
172924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik;(function(){
173024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
173124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar local = {},
173224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	featuresCache = {},
173324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toString = Object.prototype.toString;
173424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
173524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Feature / Bug detection
173624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
173724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.isNativeCode = function(fn){
173824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
173924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
174024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
174124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.isXML = function(document){
174224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
174324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
174424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
174524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
174624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.setDocument = function(document){
174724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
174824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
174924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var nodeType = document.nodeType;
175024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (nodeType == 9); // document
175124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if (nodeType) document = document.ownerDocument; // node
175224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if (document.navigator) document = document.document; // window
175324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else return;
175424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
175524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// check if it's the old document
175624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
175724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (this.document === document) return;
175824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.document = document;
175924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
176024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// check if we have done feature detection on this document before
176124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
176224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var root = document.documentElement,
176324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		rootUid = this.getUIDXML(root),
176424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		features = featuresCache[rootUid],
176524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		feature;
176624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
176724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (features){
176824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (feature in features){
176924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this[feature] = features[feature];
177024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
177124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return;
177224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
177324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
177424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features = featuresCache[rootUid] = {};
177524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
177624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.root = root;
177724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.isXMLDocument = this.isXML(document);
177824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
177924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.brokenStarGEBTN
178024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.starSelectsClosedQSA
178124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.idGetsName
178224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.brokenMixedCaseQSA
178324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.brokenGEBCN
178424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.brokenCheckedQSA
178524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.brokenEmptyAttributeQSA
178624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.isHTMLDocument
178724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= features.nativeMatchesSelector
178824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	= false;
178924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
179024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var starSelectsClosed, starSelectsComments,
179124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
179224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		brokenFormAttributeGetter;
179324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
179424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var selected, id = 'slick_uniqueid';
179524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var testNode = document.createElement('div');
179624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
179724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
179824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	testRoot.appendChild(testNode);
179924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
180024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// on non-HTML documents innerHTML and getElementsById doesnt work properly
180124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	try {
180224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		testNode.innerHTML = '<a id="'+id+'"></a>';
180324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		features.isHTMLDocument = !!document.getElementById(id);
180424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} catch(e){};
180524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
180624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (features.isHTMLDocument){
180724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
180824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		testNode.style.display = 'none';
180924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
181024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		// IE returns comment nodes for getElementsByTagName('*') for some documents
181124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		testNode.appendChild(document.createComment(''));
181224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
181324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
181424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		// IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
181524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
181624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			testNode.innerHTML = 'foo</foo>';
181724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			selected = testNode.getElementsByTagName('*');
181824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
181924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch(e){};
182024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
182124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
182224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
182324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		// IE returns elements with the name instead of just id for getElementsById for some documents
182424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
182524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
182624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			features.idGetsName = document.getElementById(id) === testNode.firstChild;
182724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch(e){};
182824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
182924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (testNode.getElementsByClassName){
183024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
183124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// Safari 3.2 getElementsByClassName caches results
183224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
183324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
183424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.getElementsByClassName('b').length;
183524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.firstChild.className = 'b';
183624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
183724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e){};
183824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
183924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
184024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
184124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
184224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
184324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e){};
184424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
184524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
184624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
184724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
184824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (testNode.querySelectorAll){
184924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
185024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
185124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.innerHTML = 'foo</foo>';
185224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				selected = testNode.querySelectorAll('*');
185324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
185424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e){};
185524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
185624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
185724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
185824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.innerHTML = '<a class="MiX"></a>';
185924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
186024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e){};
186124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
186224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// Webkit and Opera dont return selected options on querySelectorAll
186324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
186424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.innerHTML = '<select><option selected="selected">a</option></select>';
186524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
186624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e){};
186724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
186824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
186924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
187024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				testNode.innerHTML = '<a class=""></a>';
187124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
187224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e){};
187324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
187424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
187524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
187624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
187724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
187824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			testNode.innerHTML = '<form action="s"><input id="action"/></form>';
187924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
188024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch(e){};
188124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
188224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		// native matchesSelector function
188324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
188424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		features.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
188524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (features.nativeMatchesSelector) try {
188624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// if matchesSelector trows errors on incorrect sintaxes we can use it
188724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			features.nativeMatchesSelector.call(root, ':slick');
188824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			features.nativeMatchesSelector = null;
188924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch(e){};
189024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
189124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
189224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
189324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	try {
189424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		root.slick_expando = 1;
189524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		delete root.slick_expando;
189624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		features.getUID = this.getUIDHTML;
189724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} catch(e) {
189824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		features.getUID = this.getUIDXML;
189924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
190024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
190124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	testRoot.removeChild(testNode);
190224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	testNode = selected = testRoot = null;
190324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
190424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// getAttribute
190524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
190624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
190724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var method = this.attributeGetters[name];
190824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (method) return method.call(node);
190924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var attributeNode = node.getAttributeNode(name);
191024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (attributeNode) ? attributeNode.nodeValue : null;
191124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(node, name){
191224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var method = this.attributeGetters[name];
191324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (method) ? method.call(node) : node.getAttribute(name);
191424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
191524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
191624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// hasAttribute
191724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
191824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
191924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return node.hasAttribute(attribute);
192024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(node, attribute) {
192124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node = node.getAttributeNode(attribute);
192224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !!(node && (node.specified || node.nodeValue));
192324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
192424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
192524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// contains
192624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// FIXME: Add specs: local.contains should be different for xml and html documents?
192724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var nativeRootContains = root && this.isNativeCode(root.contains),
192824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		nativeDocumentContains = document && this.isNativeCode(document.contains);
192924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
193024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){
193124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return context.contains(node);
193224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : (nativeRootContains && !nativeDocumentContains) ? function(context, node){
193324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		// IE8 does not have .contains on document.
193424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return context === node || ((context === document) ? document.documentElement : context).contains(node);
193524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : (root && root.compareDocumentPosition) ? function(context, node){
193624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return context === node || !!(context.compareDocumentPosition(node) & 16);
193724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(context, node){
193824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (node) do {
193924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node === context) return true;
194024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} while ((node = node.parentNode));
194124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return false;
194224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
194324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
194424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// document order sorting
194524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// credits to Sizzle (http://sizzlejs.com/)
194624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
194724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
194824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
194924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
195024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : ('sourceIndex' in root) ? function(a, b){
195124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!a.sourceIndex || !b.sourceIndex) return 0;
195224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return a.sourceIndex - b.sourceIndex;
195324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : (document.createRange) ? function(a, b){
195424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!a.ownerDocument || !b.ownerDocument) return 0;
195524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
195624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		aRange.setStart(a, 0);
195724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		aRange.setEnd(a, 0);
195824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		bRange.setStart(b, 0);
195924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		bRange.setEnd(b, 0);
196024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
196124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : null ;
196224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
196324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	root = null;
196424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
196524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (feature in features){
196624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this[feature] = features[feature];
196724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
196824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
196924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
197024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Main Method
197124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
197224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
197324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
197424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	qsaFailExpCache = {};
197524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
197624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.search = function(context, expression, append, first){
197724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
197824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var found = this.found = (first) ? null : (append || []);
197924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
198024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!context) return found;
198124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if (context.navigator) context = context.document; // Convert the node from a window to a document
198224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else if (!context.nodeType) return found;
198324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
198424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// setup
198524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
198624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var parsed, i,
198724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		uniques = this.uniques = {},
198824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		hasOthers = !!(append && append.length),
198924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		contextIsDocument = (context.nodeType == 9);
199024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
199124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
199224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
199324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// avoid duplicating items already in the append array
199424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
199524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
199624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// expression checks
199724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
199824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (typeof expression == 'string'){ // expression is a string
199924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
200024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*<simple-selectors-override>*/
200124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var simpleSelector = expression.match(reSimpleSelector);
200224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		simpleSelectors: if (simpleSelector) {
200324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
200424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var symbol = simpleSelector[1],
200524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				name = simpleSelector[2],
200624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				node, nodes;
200724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
200824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!symbol){
200924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
201024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
201124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				nodes = context.getElementsByTagName(name);
201224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (first) return nodes[0] || null;
201324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				for (i = 0; node = nodes[i++];){
201424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
201524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
201624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
201724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else if (symbol == '#'){
201824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
201924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
202024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				node = context.getElementById(name);
202124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!node) return found;
202224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
202324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (first) return node || null;
202424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
202524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
202624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else if (symbol == '.'){
202724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
202824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
202924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (context.getElementsByClassName && !this.brokenGEBCN){
203024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					nodes = context.getElementsByClassName(name);
203124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (first) return nodes[0] || null;
203224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					for (i = 0; node = nodes[i++];){
203324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
203424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					}
203524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				} else {
203624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
203724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					nodes = context.getElementsByTagName('*');
203824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					for (i = 0; node = nodes[i++];){
203924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						className = node.className;
204024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						if (!(className && matchClass.test(className))) continue;
204124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						if (first) return node;
204224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
204324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					}
204424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
204524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
204624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
204724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
204824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOthers) this.sort(found);
204924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (first) ? null : found;
205024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
205124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
205224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*</simple-selectors-override>*/
205324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
205424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*<query-selector-override>*/
205524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		querySelector: if (context.querySelectorAll) {
205624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
205724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!this.isHTMLDocument
205824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				|| qsaFailExpCache[expression]
205924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				//TODO: only skip when expression is actually mixed case
206024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				|| this.brokenMixedCaseQSA
206124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				|| (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)
206224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				|| (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))
206324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				|| (!contextIsDocument //Abort when !contextIsDocument and...
206424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					//  there are multiple expressions in the selector
206524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					//  since we currently only fix non-document rooted QSA for single expression selectors
206624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					&& expression.indexOf(',') > -1
206724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				)
206824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				|| Slick.disableQSA
206924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			) break querySelector;
207024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
207124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var _expression = expression, _context = context;
207224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!contextIsDocument){
207324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				// non-document rooted QSA
207424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				// credits to Andrew Dupont
207524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var currentId = _context.getAttribute('id'), slickid = 'slickid__';
207624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				_context.setAttribute('id', slickid);
207724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				_expression = '#' + slickid + ' ' + _expression;
207824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				context = _context.parentNode;
207924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
208024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
208124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
208224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (first) return context.querySelector(_expression) || null;
208324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				else nodes = context.querySelectorAll(_expression);
208424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch(e) {
208524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				qsaFailExpCache[expression] = 1;
208624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				break querySelector;
208724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} finally {
208824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!contextIsDocument){
208924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (currentId) _context.setAttribute('id', currentId);
209024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					else _context.removeAttribute('id');
209124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					context = _context;
209224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
209324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
209424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
209524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
209624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
209724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else for (i = 0; node = nodes[i++];){
209824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
209924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
210024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
210124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (hasOthers) this.sort(found);
210224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return found;
210324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
210424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
210524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*</query-selector-override>*/
210624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
210724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parsed = this.Slick.parse(expression);
210824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!parsed.length) return found;
210924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (expression == null){ // there is no expression
211024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return found;
211124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (expression.Slick){ // expression is a parsed Slick object
211224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parsed = expression;
211324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else if (this.contains(context.documentElement || context, expression)){ // expression is a node
211424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(found) ? found.push(expression) : found = expression;
211524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return found;
211624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else { // other junk
211724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return found;
211824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
211924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
212024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
212124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
212224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// cache elements for the nth selectors
212324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
212424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.posNTH = {};
212524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.posNTHLast = {};
212624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.posNTHType = {};
212724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.posNTHTypeLast = {};
212824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
212924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
213024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
213124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// if append is null and there is only a single selector with one expression use pushArray, else use pushUID
213224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
213324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
213424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (found == null) found = [];
213524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
213624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// default engine
213724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
213824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var j, m, n;
213924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var combinator, tag, id, classList, classes, attributes, pseudos;
214024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
214124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
214224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
214324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
214424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		combinator = 'combinator:' + currentBit.combinator;
214524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this[combinator]) continue search;
214624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
214724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
214824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		id         = currentBit.id;
214924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		classList  = currentBit.classList;
215024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		classes    = currentBit.classes;
215124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		attributes = currentBit.attributes;
215224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		pseudos    = currentBit.pseudos;
215324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		lastBit    = (j === (currentExpression.length - 1));
215424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
215524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.bitUniques = {};
215624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
215724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (lastBit){
215824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.uniques = uniques;
215924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.found = found;
216024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
216124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.uniques = {};
216224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.found = [];
216324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
216424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
216524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (j === 0){
216624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this[combinator](context, tag, id, classes, attributes, pseudos, classList);
216724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (first && lastBit && found.length) break search;
216824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
216924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
217024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
217124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (found.length) break search;
217224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
217324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
217424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
217524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		currentItems = this.found;
217624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
217724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
217824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// should sort if there are nodes in append and if you pass multiple expressions.
217924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
218024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
218124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (first) ? (found[0] || null) : found;
218224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
218324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
218424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Utils
218524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
218624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.uidx = 1;
218724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.uidk = 'slick-uniqueid';
218824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
218924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.getUIDXML = function(node){
219024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var uid = node.getAttribute(this.uidk);
219124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!uid){
219224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		uid = this.uidx++;
219324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node.setAttribute(this.uidk, uid);
219424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
219524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return uid;
219624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
219724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
219824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.getUIDHTML = function(node){
219924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
220024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
220124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
220224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// sort based on the setDocument documentSorter method.
220324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
220424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.sort = function(results){
220524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!this.documentSorter) return results;
220624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	results.sort(this.documentSorter);
220724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return results;
220824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
220924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
221024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
221124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
221224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.cacheNTH = {};
221324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
221424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
221524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
221624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.parseNTHArgument = function(argument){
221724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var parsed = argument.match(this.matchNTH);
221824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!parsed) return false;
221924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var special = parsed[2] || false;
222024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var a = parsed[1] || 1;
222124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (a == '-') a = -1;
222224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var b = +parsed[3] || 0;
222324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	parsed =
222424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(special == 'n')	? {a: a, b: b} :
222524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(special == 'odd')	? {a: 2, b: 1} :
222624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};
222724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
222824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (this.cacheNTH[argument] = parsed);
222924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
223024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
223124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.createNTHPseudo = function(child, sibling, positions, ofType){
223224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return function(node, argument){
223324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var uid = this.getUID(node);
223424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this[positions][uid]){
223524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var parent = node.parentNode;
223624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!parent) return false;
223724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var el = parent[child], count = 1;
223824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (ofType){
223924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var nodeName = node.nodeName;
224024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				do {
224124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (el.nodeName != nodeName) continue;
224224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					this[positions][this.getUID(el)] = count++;
224324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				} while ((el = el[sibling]));
224424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else {
224524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				do {
224624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (el.nodeType != 1) continue;
224724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					this[positions][this.getUID(el)] = count++;
224824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				} while ((el = el[sibling]));
224924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
225024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
225124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		argument = argument || 'n';
225224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
225324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!parsed) return false;
225424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
225524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (a == 0) return b == pos;
225624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (a > 0){
225724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (pos < b) return false;
225824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
225924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (b < pos) return false;
226024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
226124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return ((pos - b) % a) == 0;
226224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
226324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
226424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
226524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
226624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
226724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.pushArray = function(node, tag, id, classes, attributes, pseudos){
226824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
226924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
227024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
227124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.pushUID = function(node, tag, id, classes, attributes, pseudos){
227224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var uid = this.getUID(node);
227324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
227424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.uniques[uid] = true;
227524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.found.push(node);
227624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
227724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
227824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
227924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.matchNode = function(node, selector){
228024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (this.isHTMLDocument && this.nativeMatchesSelector){
228124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
228224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
228324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch(matchError) {}
228424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
228524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
228624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var parsed = this.Slick.parse(selector);
228724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!parsed) return true;
228824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
228924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// simple (single) selectors
229024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var expressions = parsed.expressions, simpleExpCounter = 0, i;
229124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (i = 0; (currentExpression = expressions[i]); i++){
229224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (currentExpression.length == 1){
229324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var exp = currentExpression[0];
229424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
229524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			simpleExpCounter++;
229624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
229724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
229824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
229924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (simpleExpCounter == parsed.length) return false;
230024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
230124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var nodes = this.search(this.document, parsed), item;
230224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (i = 0; item = nodes[i++];){
230324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (item === node) return true;
230424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
230524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return false;
230624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
230724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
230824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.matchPseudo = function(node, name, argument){
230924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var pseudoName = 'pseudo:' + name;
231024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (this[pseudoName]) return this[pseudoName](node, argument);
231124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var attribute = this.getAttribute(node, name);
231224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (argument) ? argument == attribute : !!attribute;
231324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
231424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
231524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklocal.matchSelector = function(node, tag, id, classes, attributes, pseudos){
231624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (tag){
231724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
231824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (tag == '*'){
231924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
232024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
232124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (nodeName != tag) return false;
232224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
232324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
232424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
232524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (id && node.getAttribute('id') != id) return false;
232624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
232724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var i, part, cls;
232824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (classes) for (i = classes.length; i--;){
232924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		cls = this.getAttribute(node, 'class');
233024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!(cls && classes[i].regexp.test(cls))) return false;
233124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
233224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (attributes) for (i = attributes.length; i--;){
233324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		part = attributes[i];
233424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
233524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
233624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (pseudos) for (i = pseudos.length; i--;){
233724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		part = pseudos[i];
233824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.matchPseudo(node, part.key, part.value)) return false;
233924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
234024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return true;
234124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
234224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
234324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar combinators = {
234424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
234524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
234624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
234724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var i, item, children;
234824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
234924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.isHTMLDocument){
235024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			getById: if (id){
235124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				item = this.document.getElementById(id);
235224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
235324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					// all[id] returns all the elements with that name or id inside node
235424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					// if theres just one it will return the element, else it will be a collection
235524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					children = node.all[id];
235624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (!children) return;
235724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (!children[0]) children = [children];
235824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					for (i = 0; item = children[i++];){
235924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						var idNode = item.getAttributeNode('id');
236024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						if (idNode && idNode.nodeValue == id){
236124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik							this.push(item, tag, null, classes, attributes, pseudos);
236224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik							break;
236324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						}
236424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					}
236524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					return;
236624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
236724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!item){
236824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					// if the context is in the dom we return, else we will try GEBTN, breaking the getById label
236924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (this.contains(this.root, node)) return;
237024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					else break getById;
237124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				} else if (this.document !== node && !this.contains(node, item)) return;
237224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.push(item, tag, null, classes, attributes, pseudos);
237324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return;
237424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
237524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
237624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				children = node.getElementsByClassName(classList.join(' '));
237724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!(children && children.length)) break getByClass;
237824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
237924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return;
238024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
238124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
238224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		getByTag: {
238324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			children = node.getElementsByTagName(tag);
238424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!(children && children.length)) break getByTag;
238524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!this.brokenStarGEBTN) tag = null;
238624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
238724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
238824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
238924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
239024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'>': function(node, tag, id, classes, attributes, pseudos){ // direct children
239124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if ((node = node.firstChild)) do {
239224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
239324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} while ((node = node.nextSibling));
239424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
239524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
239624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
239724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.nextSibling)) if (node.nodeType == 1){
239824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.push(node, tag, id, classes, attributes, pseudos);
239924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			break;
240024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
240124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
240224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
240324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'^': function(node, tag, id, classes, attributes, pseudos){ // first child
240424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node = node.firstChild;
240524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (node){
240624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
240724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
240824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
240924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
241024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
241124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
241224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.nextSibling)){
241324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node.nodeType != 1) continue;
241424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var uid = this.getUID(node);
241524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this.bitUniques[uid]) break;
241624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.bitUniques[uid] = true;
241724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.push(node, tag, id, classes, attributes, pseudos);
241824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
241924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
242024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
242124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
242224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this['combinator:+'](node, tag, id, classes, attributes, pseudos);
242324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
242424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
242524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
242624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
242724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this['combinator:~'](node, tag, id, classes, attributes, pseudos);
242824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
242924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
243024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
243124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
243224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
243324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
243424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
243524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
243624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node = node.parentNode;
243724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
243824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
243924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
244024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
244124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.previousSibling)) if (node.nodeType == 1){
244224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.push(node, tag, id, classes, attributes, pseudos);
244324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			break;
244424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
244524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
244624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
244724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'!^': function(node, tag, id, classes, attributes, pseudos){ // last child
244824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node = node.lastChild;
244924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (node){
245024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
245124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
245224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
245324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
245424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
245524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
245624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.previousSibling)){
245724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node.nodeType != 1) continue;
245824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var uid = this.getUID(node);
245924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this.bitUniques[uid]) break;
246024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.bitUniques[uid] = true;
246124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.push(node, tag, id, classes, attributes, pseudos);
246224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
246324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
246424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
246524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
246624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
246724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfor (var c in combinators) local['combinator:' + c] = combinators[c];
246824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
246924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar pseudos = {
247024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
247124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<pseudo-selectors>*/
247224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
247324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'empty': function(node){
247424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var child = node.firstChild;
247524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
247624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
247724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
247824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'not': function(node, expression){
247924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !this.matchNode(node, expression);
248024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
248124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
248224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'contains': function(node, text){
248324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (node.innerText || node.textContent || '').indexOf(text) > -1;
248424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
248524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
248624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'first-child': function(node){
248724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
248824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
248924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
249024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
249124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'last-child': function(node){
249224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
249324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
249424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
249524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
249624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'only-child': function(node){
249724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var prev = node;
249824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
249924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var next = node;
250024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
250124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
250224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
250324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
250424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<nth-pseudo-selectors>*/
250524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
250624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
250724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
250824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
250924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
251024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
251124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
251224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
251324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
251424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'index': function(node, index){
251524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this['pseudo:nth-child'](node, '' + (index + 1));
251624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
251724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
251824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'even': function(node){
251924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this['pseudo:nth-child'](node, '2n');
252024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
252124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
252224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'odd': function(node){
252324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this['pseudo:nth-child'](node, '2n+1');
252424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
252524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
252624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</nth-pseudo-selectors>*/
252724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
252824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*<of-type-pseudo-selectors>*/
252924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
253024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'first-of-type': function(node){
253124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var nodeName = node.nodeName;
253224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
253324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
253424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
253524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
253624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'last-of-type': function(node){
253724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var nodeName = node.nodeName;
253824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
253924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
254024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
254124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
254224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'only-of-type': function(node){
254324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var prev = node, nodeName = node.nodeName;
254424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
254524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var next = node;
254624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
254724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
254824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
254924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
255024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</of-type-pseudo-selectors>*/
255124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
255224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// custom pseudos
255324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
255424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'enabled': function(node){
255524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !node.disabled;
255624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
255724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
255824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'disabled': function(node){
255924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return node.disabled;
256024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
256124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
256224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'checked': function(node){
256324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return node.checked || node.selected;
256424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
256524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
256624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'focus': function(node){
256724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
256824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
256924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
257024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'root': function(node){
257124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (node === this.root);
257224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
257324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
257424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'selected': function(node){
257524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return node.selected;
257624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
257724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
257824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	/*</pseudo-selectors>*/
257924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
258024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
258124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfor (var p in pseudos) local['pseudo:' + p] = pseudos[p];
258224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
258324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// attributes methods
258424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
258524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar attributeGetters = local.attributeGetters = {
258624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
258724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'for': function(){
258824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
258924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
259024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
259124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'href': function(){
259224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
259324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
259424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
259524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'style': function(){
259624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.style) ? this.style.cssText : this.getAttribute('style');
259724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
259824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
259924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'tabindex': function(){
260024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var attributeNode = this.getAttributeNode('tabindex');
260124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
260224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
260324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
260424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'type': function(){
260524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getAttribute('type');
260624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
260724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
260824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'maxlength': function(){
260924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var attributeNode = this.getAttributeNode('maxLength');
261024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
261124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
261224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
261324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
261424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
261524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikattributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;
261624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
261724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick
261824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
261924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Slick = local.Slick = (this.Slick || {});
262024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
262124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.version = '1.1.7';
262224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
262324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick finder
262424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
262524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.search = function(context, expression, append){
262624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.search(context, expression, append);
262724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
262824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
262924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.find = function(context, expression){
263024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.search(context, expression, null, true);
263124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
263224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
263324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick containment checker
263424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
263524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.contains = function(container, node){
263624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local.setDocument(container);
263724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.contains(container, node);
263824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
263924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
264024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick attribute getter
264124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
264224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.getAttribute = function(node, name){
264324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local.setDocument(node);
264424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.getAttribute(node, name);
264524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
264624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
264724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.hasAttribute = function(node, name){
264824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local.setDocument(node);
264924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.hasAttribute(node, name);
265024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
265124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
265224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick matcher
265324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
265424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.match = function(node, selector){
265524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!(node && selector)) return false;
265624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!selector || selector === node) return true;
265724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local.setDocument(node);
265824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.matchNode(node, selector);
265924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
266024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
266124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick attribute accessor
266224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
266324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.defineAttributeGetter = function(name, fn){
266424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local.attributeGetters[name] = fn;
266524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
266624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
266724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
266824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.lookupAttributeGetter = function(name){
266924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.attributeGetters[name];
267024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
267124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
267224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick pseudo accessor
267324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
267424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.definePseudo = function(name, fn){
267524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local['pseudo:' + name] = function(node, argument){
267624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return fn.call(node, argument);
267724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
267824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
267924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
268024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
268124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.lookupPseudo = function(name){
268224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var pseudo = local['pseudo:' + name];
268324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (pseudo) return function(argument){
268424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return pseudo.call(this, argument);
268524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
268624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return null;
268724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
268824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
268924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Slick overrides accessor
269024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
269124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.override = function(regexp, fn){
269224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	local.override(regexp, fn);
269324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
269424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
269524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
269624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.isXML = local.isXML;
269724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
269824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.uidOf = function(node){
269924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return local.getUIDHTML(node);
270024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
270124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
270224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!this.Slick) this.Slick = Slick;
270324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
270424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
270524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
270624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
270724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
270824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
270924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
271024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Element
271124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
271224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
271324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
271424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
271524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
271624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder]
271724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
271824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Element, Elements, $, $$, IFrame, Selectors]
271924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
272024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
272124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
272224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
272324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Element = this.Element = function(tag, props){
272424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var konstructor = Element.Constructors[tag];
272524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (konstructor) return konstructor(props);
272624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (typeof tag != 'string') return document.id(tag).set(props);
272724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
272824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!props) props = {};
272924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
273024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!(/^[\w-]+$/).test(tag)){
273124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parsed = Slick.parse(tag).expressions[0][0];
273224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
273324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (parsed.id && props.id == null) props.id = parsed.id;
273424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
273524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var attributes = parsed.attributes;
273624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){
273724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			attr = attributes[i];
273824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (props[attr.key] != null) continue;
273924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
274024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;
274124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else if (!attr.value && !attr.operator) props[attr.key] = true;
274224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
274324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
274424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
274524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
274624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
274724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return document.newElement(tag, props);
274824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
274924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
275024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
275124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (Browser.Element){
275224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.prototype = Browser.Element.prototype;
275324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	// IE8 and IE9 require the wrapping.
275424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.prototype._fireEvent = (function(fireEvent){
275524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return function(type, event){
275624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return fireEvent.call(this, type, event);
275724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
275824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	})(Element.prototype.fireEvent);
275924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
276024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
276124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiknew Type('Element', Element).mirror(function(name){
276224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (Array.prototype[name]) return;
276324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
276424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var obj = {};
276524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	obj[name] = function(){
276624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var results = [], args = arguments, elements = true;
276724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = this.length; i < l; i++){
276824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var element = this[i], result = results[i] = element[name].apply(element, args);
276924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			elements = (elements && typeOf(result) == 'element');
277024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
277124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (elements) ? new Elements(results) : results;
277224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
277324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
277424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Elements.implement(obj);
277524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
277624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
277724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!Browser.Element){
277824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.parent = Object;
277924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
278024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.Prototype = {
278124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		'$constructor': Element,
278224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		'$family': Function.from('element').hide()
278324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
278424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
278524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.mirror(function(name, method){
278624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Element.Prototype[name] = method;
278724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
278824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
278924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
279024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Constructors = {};
279124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
279224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
279324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
279424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar IFrame = new Type('IFrame', function(){
279524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var params = Array.link(arguments, {
279624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		properties: Type.isObject,
279724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		iframe: function(obj){
279824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (obj != null);
279924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
280024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
280124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
280224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var props = params.properties || {}, iframe;
280324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (params.iframe) iframe = document.id(params.iframe);
280424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var onload = props.onload || function(){};
280524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	delete props.onload;
280624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
280724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	iframe = new Element(iframe || 'iframe', props);
280824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
280924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var onLoad = function(){
281024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onload.call(iframe.contentWindow);
281124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
281224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
281324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (window.frames[props.id]) onLoad();
281424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	else iframe.addListener('load', onLoad);
281524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return iframe;
281624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
281724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
281824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Elements = this.Elements = function(nodes){
281924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (nodes && nodes.length){
282024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var uniques = {}, node;
282124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; node = nodes[i++];){
282224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var uid = Slick.uidOf(node);
282324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!uniques[uid]){
282424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				uniques[uid] = true;
282524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.push(node);
282624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
282724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
282824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
282924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
283024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
283124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElements.prototype = {length: 0};
283224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElements.parent = Array;
283324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
283424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiknew Type('Elements', Elements).implement({
283524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
283624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	filter: function(filter, bind){
283724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!filter) return this;
283824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
283924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return item.match(filter);
284024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} : filter, bind));
284124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.protect(),
284224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
284324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	push: function(){
284424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var length = this.length;
284524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = arguments.length; i < l; i++){
284624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var item = document.id(arguments[i]);
284724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (item) this[length++] = item;
284824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
284924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.length = length);
285024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.protect(),
285124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
285224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	unshift: function(){
285324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var items = [];
285424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = arguments.length; i < l; i++){
285524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var item = document.id(arguments[i]);
285624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (item) items.push(item);
285724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
285824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Array.prototype.unshift.apply(this, items);
285924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.protect(),
286024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
286124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	concat: function(){
286224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var newElements = new Elements(this);
286324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = arguments.length; i < l; i++){
286424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var item = arguments[i];
286524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (Type.isEnumerable(item)) newElements.append(item);
286624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else newElements.push(item);
286724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
286824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return newElements;
286924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.protect(),
287024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
287124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	append: function(collection){
287224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
287324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
287424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.protect(),
287524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
287624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	empty: function(){
287724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while (this.length) delete this[--this.length];
287824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
287924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.protect()
288024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
288124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
288224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
288324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
288424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
288524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
288624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
288724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// FF, IE
288824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
288924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
289024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksplice.call(object, 1, 1);
289124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (object[1] == 1) Elements.implement('splice', function(){
289224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var length = this.length;
289324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var result = splice.apply(this, arguments);
289424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (length >= this.length) delete this[length--];
289524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return result;
289624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}.protect());
289724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
289824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.forEachMethod(function(method, name){
289924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Elements.implement(name, method);
290024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
290124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
290224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.mirror(Elements);
290324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
290424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE8>*/
290524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar createElementAcceptsHTML;
290624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiktry {
290724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	createElementAcceptsHTML = (document.createElement('<input name=x>').name == 'x');
290824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} catch (e){}
290924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
291024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar escapeQuotes = function(html){
291124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
291224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
291324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE8>*/
291424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
291524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDocument.implement({
291624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
291724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	newElement: function(tag, props){
291824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (props && props.checked != null) props.defaultChecked = props.checked;
291924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
292024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (createElementAcceptsHTML && props){
292124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			tag = '<' + tag;
292224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
292324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
292424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			tag += '>';
292524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete props.name;
292624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete props.type;
292724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
292824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*</ltIE8>*/
292924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.id(this.createElement(tag)).set(props);
293024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
293124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
293224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
293324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
293424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
293524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
293624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
293724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
293824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.uidOf(window);
293924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSlick.uidOf(document);
294024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
294124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDocument.implement({
294224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
294324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	newTextNode: function(text){
294424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.createTextNode(text);
294524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
294624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
294724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getDocument: function(){
294824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
294924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
295024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
295124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getWindow: function(){
295224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.window;
295324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
295424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
295524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	id: (function(){
295624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
295724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var types = {
295824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
295924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			string: function(id, nocash, doc){
296024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
296124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return (id) ? types.element(id, nocash) : null;
296224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			},
296324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
296424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			element: function(el, nocash){
296524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				Slick.uidOf(el);
296624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
296724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					var fireEvent = el.fireEvent;
296824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					// wrapping needed in IE7, or else crash
296924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					el._fireEvent = function(type, event){
297024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						return fireEvent(type, event);
297124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					};
297224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					Object.append(el, Element.Prototype);
297324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
297424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return el;
297524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			},
297624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
297724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			object: function(obj, nocash, doc){
297824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
297924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return null;
298024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
298124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
298224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
298324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
298424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		types.textnode = types.whitespace = types.window = types.document = function(zero){
298524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return zero;
298624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
298724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
298824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return function(el, nocash, doc){
298924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (el && el.$family && el.uniqueNumber) return el;
299024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var type = typeOf(el);
299124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (types[type]) ? types[type](el, nocash, doc || document) : null;
299224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
299324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
299424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	})()
299524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
299624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
299724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
299824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (window.$ == null) Window.implement('$', function(el, nc){
299924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return document.id(el, nc, this.document);
300024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
300124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
300224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikWindow.implement({
300324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
300424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getDocument: function(){
300524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.document;
300624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
300724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
300824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getWindow: function(){
300924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
301024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
301124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
301224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
301324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
301424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[Document, Element].invoke('implement', {
301524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
301624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getElements: function(expression){
301724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Slick.search(this, expression, new Elements);
301824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
301924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
302024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getElement: function(expression){
302124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return document.id(Slick.find(this, expression));
302224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
302324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
302424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
302524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
302624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar contains = {contains: function(element){
302724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return Slick.contains(this, element);
302824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}};
302924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
303024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!document.contains) Document.implement(contains);
303124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!document.createElement('div').contains) Element.implement(contains);
303224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
303324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
303424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
303524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// tree walking
303624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
303724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar injectCombinator = function(expression, combinator){
303824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!expression) return combinator;
303924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
304024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	expression = Object.clone(Slick.parse(expression));
304124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
304224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var expressions = expression.expressions;
304324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var i = expressions.length; i--;)
304424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		expressions[i][0].combinator = combinator;
304524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
304624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return expression;
304724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
304824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
304924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.forEach({
305024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getNext: '~',
305124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getPrevious: '!~',
305224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getParent: '!'
305324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}, function(combinator, method){
305424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.implement(method, function(expression){
305524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getElement(injectCombinator(expression, combinator));
305624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
305724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
305824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
305924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.forEach({
306024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getAllNext: '~',
306124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getAllPrevious: '!~',
306224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getSiblings: '~~',
306324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getChildren: '>',
306424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getParents: '!'
306524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}, function(combinator, method){
306624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.implement(method, function(expression){
306724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getElements(injectCombinator(expression, combinator));
306824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
306924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
307024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
307124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
307224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
307324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getFirst: function(expression){
307424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
307524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
307624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
307724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getLast: function(expression){
307824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
307924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
308024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
308124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getWindow: function(){
308224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.ownerDocument.window;
308324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
308424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
308524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getDocument: function(){
308624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.ownerDocument;
308724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
308824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
308924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getElementById: function(id){
309024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
309124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
309224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
309324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	match: function(expression){
309424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !expression || Slick.match(this, expression);
309524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
309624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
309724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
309824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
309924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
310024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
310124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (window.$$ == null) Window.implement('$$', function(selector){
310224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (arguments.length == 1){
310324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
310424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else if (Type.isEnumerable(selector)) return new Elements(selector);
310524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
310624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return new Elements(arguments);
310724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
310824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
310924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Inserters
311024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
311124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar inserters = {
311224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
311324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	before: function(context, element){
311424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parent = element.parentNode;
311524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (parent) parent.insertBefore(context, element);
311624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
311724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
311824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	after: function(context, element){
311924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parent = element.parentNode;
312024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (parent) parent.insertBefore(context, element.nextSibling);
312124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
312224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
312324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	bottom: function(context, element){
312424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		element.appendChild(context);
312524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
312624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
312724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	top: function(context, element){
312824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		element.insertBefore(context, element.firstChild);
312924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
313024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
313124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
313224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
313324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikinserters.inside = inserters.bottom;
313424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
313524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
313624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
313724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// getProperty / setProperty
313824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
313924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar propertyGetters = {}, propertySetters = {};
314024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
314124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// properties
314224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
314324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar properties = {};
314424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.forEach([
314524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan',
314624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'frameBorder', 'rowSpan', 'tabIndex', 'useMap'
314724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik], function(property){
314824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	properties[property.toLowerCase()] = property;
314924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
315024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
315124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikproperties.html = 'innerHTML';
315224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikproperties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';
315324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
315424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.forEach(properties, function(real, key){
315524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	propertySetters[key] = function(node, value){
315624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node[real] = value;
315724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
315824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	propertyGetters[key] = function(node){
315924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return node[real];
316024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
316124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
316224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
316324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Booleans
316424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
316524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar bools = [
316624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked',
316724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'disabled', 'readOnly', 'multiple', 'selected', 'noresize',
316824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay',
316924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'loop'
317024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik];
317124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
317224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar booleans = {};
317324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikArray.forEach(bools, function(bool){
317424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var lower = bool.toLowerCase();
317524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	booleans[lower] = bool;
317624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	propertySetters[lower] = function(node, value){
317724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node[bool] = !!value;
317824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
317924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	propertyGetters[lower] = function(node){
318024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !!node[bool];
318124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
318224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
318324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
318424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Special cases
318524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
318624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikObject.append(propertySetters, {
318724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
318824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'class': function(node, value){
318924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		('className' in node) ? node.className = (value || '') : node.setAttribute('class', value);
319024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
319124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
319224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'for': function(node, value){
319324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value);
319424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
319524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
319624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'style': function(node, value){
319724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(node.style) ? node.style.cssText = value : node.setAttribute('style', value);
319824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
319924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
320024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	'value': function(node, value){
320124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		node.value = (value != null) ? value : '';
320224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
320324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
320424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
320524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
320624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikpropertyGetters['class'] = function(node){
320724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return ('className' in node) ? node.className || null : node.getAttribute('class');
320824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
320924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
321024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/* <webkit> */
321124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar el = document.createElement('button');
321224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// IE sets type as readonly and throws
321324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiktry { el.type = 'button'; } catch(e){}
321424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (el.type != 'button') propertySetters.type = function(node, value){
321524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	node.setAttribute('type', value);
321624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
321724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikel = null;
321824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/* </webkit> */
321924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
322024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<IE>*/
322124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar input = document.createElement('input');
322224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikinput.value = 't';
322324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikinput.type = 'submit';
322424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (input.value != 't') propertySetters.type = function(node, type){
322524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var value = node.value;
322624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	node.type = type;
322724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	node.value = value;
322824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
322924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikinput = null;
323024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</IE>*/
323124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
323224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/* getProperty, setProperty */
323324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
323424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/* <ltIE9> */
323524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar pollutesGetAttribute = (function(div){
323624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	div.random = 'attribute';
323724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (div.getAttribute('random') == 'attribute');
323824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})(document.createElement('div'));
323924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
324024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hasCloneBug = (function(test){
324124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	test.innerHTML = '<object><param name="should_fix" value="the unknown"></object>';
324224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return test.cloneNode(true).firstChild.childNodes.length != 1;
324324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})(document.createElement('div'));
324424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/* </ltIE9> */
324524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
324624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hasClassList = !!document.createElement('div').classList;
324724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
324824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar classes = function(className){
324924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var classNames = (className || '').clean().split(" "), uniques = {};
325024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return classNames.filter(function(className){
325124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (className !== "" && !uniques[className]) return uniques[className] = className;
325224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
325324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
325424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
325524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar addToClassList = function(name){
325624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.classList.add(name);
325724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
325824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
325924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar removeFromClassList = function(name){
326024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.classList.remove(name);
326124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
326224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
326324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
326424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
326524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setProperty: function(name, value){
326624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var setter = propertySetters[name.toLowerCase()];
326724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (setter){
326824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			setter(this, value);
326924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
327024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			/* <ltIE9> */
327124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var attributeWhiteList;
327224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {});
327324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			/* </ltIE9> */
327424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
327524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (value == null){
327624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.removeAttribute(name);
327724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				/* <ltIE9> */
327824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (pollutesGetAttribute) delete attributeWhiteList[name];
327924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				/* </ltIE9> */
328024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else {
328124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.setAttribute(name, '' + value);
328224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				/* <ltIE9> */
328324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (pollutesGetAttribute) attributeWhiteList[name] = true;
328424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				/* </ltIE9> */
328524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
328624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
328724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
328824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
328924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
329024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setProperties: function(attributes){
329124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
329224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
329324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
329424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
329524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getProperty: function(name){
329624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var getter = propertyGetters[name.toLowerCase()];
329724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (getter) return getter(this);
329824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/* <ltIE9> */
329924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (pollutesGetAttribute){
330024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {});
330124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!attr) return null;
330224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (attr.expando && !attributeWhiteList[name]){
330324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var outer = this.outerHTML;
330424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				// segment by the opening tag and find mention of attribute name
330524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null;
330624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				attributeWhiteList[name] = true;
330724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
330824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
330924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/* </ltIE9> */
331024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var result = Slick.getAttribute(this, name);
331124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (!result && !Slick.hasAttribute(this, name)) ? null : result;
331224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
331324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
331424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getProperties: function(){
331524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var args = Array.from(arguments);
331624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return args.map(this.getProperty, this).associate(args);
331724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
331824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
331924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeProperty: function(name){
332024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.setProperty(name, null);
332124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
332224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
332324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeProperties: function(){
332424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.each(arguments, this.removeProperty, this);
332524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
332624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
332724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
332824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(prop, value){
332924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var property = Element.Properties[prop];
333024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
333124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.overloadSetter(),
333224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
333324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(prop){
333424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var property = Element.Properties[prop];
333524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
333624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}.overloadGetter(),
333724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
333824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	erase: function(prop){
333924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var property = Element.Properties[prop];
334024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
334124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
334224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
334324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
334424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hasClass: hasClassList ? function(className){
334524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.classList.contains(className);
334624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(className){
334724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.className.clean().contains(className, ' ');
334824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
334924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
335024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addClass: hasClassList ? function(className){
335124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		classes(className).forEach(addToClassList, this);
335224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
335324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(className){
335424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.className = classes(className + ' ' + this.className).join(' ');
335524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
335624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
335724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
335824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeClass: hasClassList ? function(className){
335924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		classes(className).forEach(removeFromClassList, this);
336024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
336124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(className){
336224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var classNames = classes(this.className);
336324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		classes(className).forEach(classNames.erase, classNames);
336424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.className = classNames.join(' ');
336524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
336624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
336724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
336824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toggleClass: function(className, force){
336924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (force == null) force = !this.hasClass(className);
337024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (force) ? this.addClass(className) : this.removeClass(className);
337124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
337224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
337324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	adopt: function(){
337424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
337524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (length > 1) parent = fragment = document.createDocumentFragment();
337624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
337724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; i < length; i++){
337824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var element = document.id(elements[i], true);
337924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (element) parent.appendChild(element);
338024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
338124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
338224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (fragment) this.appendChild(fragment);
338324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
338424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
338524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
338624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
338724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	appendText: function(text, where){
338824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.grab(this.getDocument().newTextNode(text), where);
338924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
339024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
339124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	grab: function(el, where){
339224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		inserters[where || 'bottom'](document.id(el, true), this);
339324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
339424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
339524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
339624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	inject: function(el, where){
339724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		inserters[where || 'bottom'](this, document.id(el, true));
339824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
339924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
340024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
340124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	replaces: function(el){
340224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		el = document.id(el, true);
340324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		el.parentNode.replaceChild(this, el);
340424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
340524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
340624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
340724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	wraps: function(el, where){
340824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		el = document.id(el, true);
340924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.replaces(el).grab(el, where);
341024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
341124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
341224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getSelected: function(){
341324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.selectedIndex; // Safari 3.2.1
341424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return new Elements(Array.from(this.options).filter(function(option){
341524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return option.selected;
341624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}));
341724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
341824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
341924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	toQueryString: function(){
342024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var queryString = [];
342124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.getElements('input, select, textarea').each(function(el){
342224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var type = el.type;
342324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
342424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
342524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
342624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				// IE
342724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return document.id(opt).get('value');
342824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
342924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
343024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			Array.from(value).each(function(val){
343124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
343224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			});
343324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
343424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return queryString.join('&');
343524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
343624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
343724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
343824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
343924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
344024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// appendHTML
344124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
344224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar appendInserters = {
344324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	before: 'beforeBegin',
344424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	after: 'afterEnd',
344524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	bottom: 'beforeEnd',
344624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	top: 'afterBegin',
344724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	inside: 'beforeEnd'
344824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
344924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
345024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){
345124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.insertAdjacentHTML(appendInserters[where || 'bottom'], html);
345224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
345324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} : function(html, where){
345424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var temp = new Element('div', {html: html}),
345524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		children = temp.childNodes,
345624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		fragment = temp.firstChild;
345724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
345824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!fragment) return this;
345924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (children.length > 1){
346024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		fragment = document.createDocumentFragment();
346124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0, l = children.length; i < l; i++){
346224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			fragment.appendChild(children[i]);
346324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
346424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
346524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
346624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	inserters[where || 'bottom'](fragment, this);
346724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return this;
346824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
346924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
347024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar collected = {}, storage = {};
347124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
347224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar get = function(uid){
347324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (storage[uid] || (storage[uid] = {}));
347424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
347524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
347624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar clean = function(item){
347724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var uid = item.uniqueNumber;
347824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item.removeEvents) item.removeEvents();
347924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (item.clearAttributes) item.clearAttributes();
348024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (uid != null){
348124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		delete collected[uid];
348224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		delete storage[uid];
348324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
348424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return item;
348524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
348624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
348724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar formProps = {input: 'checked', option: 'selected', textarea: 'value'};
348824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
348924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
349024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
349124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	destroy: function(){
349224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var children = clean(this).getElementsByTagName('*');
349324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.each(children, clean);
349424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Element.dispose(this);
349524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
349624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
349724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
349824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	empty: function(){
349924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.from(this.childNodes).each(Element.dispose);
350024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
350124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
350224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
350324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	dispose: function(){
350424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
350524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
350624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
350724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clone: function(contents, keepid){
350824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		contents = contents !== false;
350924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var clone = this.cloneNode(contents), ce = [clone], te = [this], i;
351024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
351124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (contents){
351224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			ce.append(Array.from(clone.getElementsByTagName('*')));
351324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			te.append(Array.from(this.getElementsByTagName('*')));
351424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
351524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
351624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (i = ce.length; i--;){
351724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var node = ce[i], element = te[i];
351824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!keepid) node.removeAttribute('id');
351924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			/*<ltIE9>*/
352024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (node.clearAttributes){
352124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				node.clearAttributes();
352224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				node.mergeAttributes(element);
352324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				node.removeAttribute('uniqueNumber');
352424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (node.options){
352524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					var no = node.options, eo = element.options;
352624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
352724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
352824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
352924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			/*</ltIE9>*/
353024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var prop = formProps[element.tagName.toLowerCase()];
353124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (prop && element[prop]) node[prop] = element[prop];
353224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
353324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
353424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*<ltIE9>*/
353524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (hasCloneBug){
353624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
353724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
353824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
353924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*</ltIE9>*/
354024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return document.id(clone);
354124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
354224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
354324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
354424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
354524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[Element, Window, Document].invoke('implement', {
354624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
354724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addListener: function(type, fn){
354824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (window.attachEvent && !window.addEventListener){
354924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			collected[Slick.uidOf(this)] = this;
355024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
355124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
355224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else this.attachEvent('on' + type, fn);
355324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
355424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
355524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
355624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeListener: function(type, fn){
355724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
355824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else this.detachEvent('on' + type, fn);
355924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
356024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
356124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
356224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	retrieve: function(property, dflt){
356324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var storage = get(Slick.uidOf(this)), prop = storage[property];
356424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (dflt != null && prop == null) prop = storage[property] = dflt;
356524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return prop != null ? prop : null;
356624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
356724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
356824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	store: function(property, value){
356924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var storage = get(Slick.uidOf(this));
357024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		storage[property] = value;
357124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
357224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
357324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
357424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	eliminate: function(property){
357524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var storage = get(Slick.uidOf(this));
357624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		delete storage[property];
357724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
357824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
357924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
358024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
358124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
358224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE9>*/
358324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (window.attachEvent && !window.addEventListener){
358424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var gc = function(){
358524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Object.each(collected, clean);
358624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (window.CollectGarbage) CollectGarbage();
358724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		window.removeListener('unload', gc);
358824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
358924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	window.addListener('unload', gc);
359024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
359124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE9>*/
359224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
359324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties = {};
359424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
359524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
359624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
359724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.style = {
359824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
359924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(style){
360024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.style.cssText = style;
360124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
360224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
360324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
360424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.style.cssText;
360524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
360624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
360724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	erase: function(){
360824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.style.cssText = '';
360924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
361024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
361124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
361224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
361324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.tag = {
361424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
361524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
361624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.tagName.toLowerCase();
361724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
361824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
361924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
362024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
362124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.html = {
362224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
362324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(html){
362424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (html == null) html = '';
362524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else if (typeOf(html) == 'array') html = html.join('');
362624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.innerHTML = html;
362724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
362824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
362924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	erase: function(){
363024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.innerHTML = '';
363124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
363224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
363324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
363424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
363524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true;
363624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
363724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE9>*/
363824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// technique by jdbarlett - http://jdbartlett.com/innershiv/
363924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar div = document.createElement('div');
364024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdiv.innerHTML = '<nav></nav>';
364124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraiksupportsHTML5Elements = (div.childNodes.length == 1);
364224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!supportsHTML5Elements){
364324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '),
364424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		fragment = document.createDocumentFragment(), l = tags.length;
364524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (l--) fragment.createElement(tags[l]);
364624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
364724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdiv = null;
364824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE9>*/
364924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
365024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<IE>*/
365124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraiksupportsTableInnerHTML = Function.attempt(function(){
365224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var table = document.createElement('table');
365324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	table.innerHTML = '<tr><td></td></tr>';
365424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return true;
365524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
365624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
365724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltFF4>*/
365824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar tr = document.createElement('tr'), html = '<td></td>';
365924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiktr.innerHTML = html;
366024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraiksupportsTRInnerHTML = (tr.innerHTML == html);
366124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiktr = null;
366224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltFF4>*/
366324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
366424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){
366524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
366624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.Properties.html.set = (function(set){
366724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
366824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var translations = {
366924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			table: [1, '<table>', '</table>'],
367024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			select: [1, '<select>', '</select>'],
367124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			tbody: [2, '<table><tbody>', '</tbody></table>'],
367224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
367324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
367424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
367524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		translations.thead = translations.tfoot = translations.tbody;
367624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
367724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return function(html){
367824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var wrap = translations[this.get('tag')];
367924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!wrap && !supportsHTML5Elements) wrap = [0, '', ''];
368024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!wrap) return set.call(this, html);
368124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
368224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var level = wrap[0], wrapper = document.createElement('div'), target = wrapper;
368324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!supportsHTML5Elements) fragment.appendChild(wrapper);
368424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join('');
368524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			while (level--) target = target.firstChild;
368624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.empty().adopt(target.childNodes);
368724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!supportsHTML5Elements) fragment.removeChild(wrapper);
368824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			wrapper = null;
368924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
369024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
369124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	})(Element.Properties.html.set);
369224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
369324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</IE>*/
369424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
369524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE9>*/
369624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar testForm = document.createElement('form');
369724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraiktestForm.innerHTML = '<select><option>s</option></select>';
369824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
369924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (testForm.firstChild.value != 's') Element.Properties.value = {
370024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
370124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(value){
370224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var tag = this.get('tag');
370324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (tag != 'select') return this.setProperty('value', value);
370424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var options = this.getElements('option');
370524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		value = String(value);
370624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var i = 0; i < options.length; i++){
370724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var option = options[i],
370824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				attr = option.getAttributeNode('value'),
370924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				optionValue = (attr && attr.specified) ? option.value : option.get('text');
371024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (optionValue === value) return option.selected = true;
371124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
371224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
371324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
371424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
371524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var option = this, tag = option.get('tag');
371624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
371724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (tag != 'select' && tag != 'option') return this.getProperty('value');
371824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
371924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (tag == 'select' && !(option = option.getSelected()[0])) return '';
372024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
372124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var attr = option.getAttributeNode('value');
372224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (attr && attr.specified) ? option.value : option.get('text');
372324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
372424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
372524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
372624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraiktestForm = null;
372724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE9>*/
372824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
372924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<IE>*/
373024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (document.createElement('div').getAttributeNode('id')) Element.Properties.id = {
373124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(id){
373224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.id = this.getAttributeNode('id').value = id;
373324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
373424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
373524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.id || null;
373624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
373724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	erase: function(){
373824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.id = this.getAttributeNode('id').value = '';
373924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
374024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
374124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</IE>*/
374224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
374324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
374424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
374524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
374624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
374724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
374824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
374924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Element.Style
375024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
375124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains methods for interacting with the styles of Elements in a fashionable way.
375224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
375324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
375424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
375524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Element
375624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
375724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Element.Style
375824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
375924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
376024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
376124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
376224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
376324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
376424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar html = document.html, el;
376524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
376624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//<ltIE9>
376724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Check for oldIE, which does not remove styles when they're set to null
376824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikel = document.createElement('div');
376924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikel.style.color = 'red';
377024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikel.style.color = null;
377124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar doesNotRemoveStyles = el.style.color == 'red';
377224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
377324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color)
377424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar border = '1px solid #123abc';
377524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikel.style.border = border;
377624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar returnsBordersInWrongOrder = el.style.border != border;
377724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikel = null;
377824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//</ltIE9>
377924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
378024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hasGetComputedStyle = !!window.getComputedStyle;
378124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
378224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.styles = {set: function(styles){
378324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.setStyles(styles);
378424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}};
378524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
378624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar hasOpacity = (html.style.opacity != null),
378724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hasFilter = (html.style.filter != null),
378824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reAlpha = /alpha\(opacity=([\d.]+)\)/i;
378924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
379024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar setVisibility = function(element, opacity){
379124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	element.store('$opacity', opacity);
379224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden';
379324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
379424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
379524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//<ltIE9>
379624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar setFilter = function(element, regexp, value){
379724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var style = element.style,
379824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		filter = style.filter || element.getComputedStyle('filter') || '';
379924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	style.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim();
380024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!style.filter) style.removeAttribute('filter');
380124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
380224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//</ltIE9>
380324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
380424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar setOpacity = (hasOpacity ? function(element, opacity){
380524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	element.style.opacity = opacity;
380624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} : (hasFilter ? function(element, opacity){
380724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;
380824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (opacity == null || opacity == 1){
380924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		setFilter(element, reAlpha, '');
381024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)');
381124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else {
381224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		setFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')');
381324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
381424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} : setVisibility));
381524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
381624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar getOpacity = (hasOpacity ? function(element){
381724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var opacity = element.style.opacity || element.getComputedStyle('opacity');
381824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (opacity == '') ? 1 : opacity.toFloat();
381924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} : (hasFilter ? function(element){
382024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var filter = (element.style.filter || element.getComputedStyle('filter')),
382124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		opacity;
382224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (filter) opacity = filter.match(reAlpha);
382324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
382424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} : function(element){
382524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var opacity = element.retrieve('$opacity');
382624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1);
382724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return opacity;
382824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}));
382924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
383024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat',
383124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	namedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'},
383224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hasBackgroundPositionXY = (html.style.backgroundPositionX != null);
383324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
383424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//<ltIE9>
383524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar removeStyle = function(style, property){
383624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (property == 'backgroundPosition'){
383724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		style.removeAttribute(property + 'X');
383824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		property += 'Y';
383924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
384024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	style.removeAttribute(property);
384124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
384224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//</ltIE9>
384324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
384424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
384524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
384624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getComputedStyle: function(property){
384724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[property.camelCase()];
384824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var defaultView = Element.getDocument(this).defaultView,
384924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
385024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : '';
385124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
385224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
385324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setStyle: function(property, value){
385424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (property == 'opacity'){
385524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (value != null) value = parseFloat(value);
385624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			setOpacity(this, value);
385724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return this;
385824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
385924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		property = (property == 'float' ? floatName : property).camelCase();
386024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeOf(value) != 'string'){
386124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var map = (Element.Styles[property] || '@').split(' ');
386224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value = Array.from(value).map(function(val, i){
386324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!map[i]) return '';
386424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
386524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}).join(' ');
386624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else if (value == String(Number(value))){
386724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value = Math.round(value);
386824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
386924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.style[property] = value;
387024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		//<ltIE9>
387124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){
387224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			removeStyle(this.style, property);
387324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
387424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		//</ltIE9>
387524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
387624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
387724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
387824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getStyle: function(property){
387924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (property == 'opacity') return getOpacity(this);
388024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		property = (property == 'float' ? floatName : property).camelCase();
388124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var result = this.style[property];
388224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!result || property == 'zIndex'){
388324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (Element.ShortStyles.hasOwnProperty(property)){
388424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				result = [];
388524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				for (var s in Element.ShortStyles[property]) result.push(this.getStyle(s));
388624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return result.join(' ');
388724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
388824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			result = this.getComputedStyle(property);
388924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
389024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){
389124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return result.replace(/(top|right|bottom|left)/g, function(position){
389224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return namedPositions[position];
389324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}) || '0px';
389424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
389524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!result && property == 'backgroundPosition') return '0px 0px';
389624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (result){
389724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			result = String(result);
389824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var color = result.match(/rgba?\([\d\s,]+\)/);
389924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (color) result = result.replace(color[0], color[0].rgbToHex());
390024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
390124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!hasGetComputedStyle && !this.style[property]){
390224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){
390324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
390424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				values.each(function(value){
390524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
390624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}, this);
390724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return this['offset' + property.capitalize()] - size + 'px';
390824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
390924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){
391024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return '0px';
391124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
391224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
391324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		//<ltIE9>
391424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){
391524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return result.replace(/^(.+)\s(.+)\s(.+)$/, '$2 $3 $1');
391624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
391724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		//</ltIE9>
391824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return result;
391924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
392024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
392124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setStyles: function(styles){
392224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var style in styles) this.setStyle(style, styles[style]);
392324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
392424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
392524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
392624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getStyles: function(){
392724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var result = {};
392824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.flatten(arguments).each(function(key){
392924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			result[key] = this.getStyle(key);
393024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}, this);
393124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return result;
393224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
393324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
393424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
393524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
393624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Styles = {
393724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	left: '@px', top: '@px', bottom: '@px', right: '@px',
393824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
393924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	backgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
394024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
394124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
394224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
394324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
394424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
394524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
394624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
394724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
394824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
394924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
395024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
395124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
395224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
395324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var Short = Element.ShortStyles;
395424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var All = Element.Styles;
395524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	['margin', 'padding'].each(function(style){
395624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var sd = style + direction;
395724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Short[style][sd] = All[sd] = '@px';
395824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
395924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var bd = 'border' + direction;
396024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
396124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
396224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Short[bd] = {};
396324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
396424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
396524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
396624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
396724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
396824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'};
396924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
397024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
397124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
397224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
397324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
397424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
397524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Element.Event
397624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
397724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary.
397824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
397924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
398024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
398124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Element, Event]
398224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
398324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Element.Event
398424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
398524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
398624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
398724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
398824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
398924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
399024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.events = {set: function(events){
399124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	this.addEvents(events);
399224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}};
399324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
399424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[Element, Window, Document].invoke('implement', {
399524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
399624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvent: function(type, fn){
399724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var events = this.retrieve('events', {});
399824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!events[type]) events[type] = {keys: [], values: []};
399924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (events[type].keys.contains(fn)) return this;
400024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		events[type].keys.push(fn);
400124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var realType = type,
400224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			custom = Element.Events[type],
400324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			condition = fn,
400424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			self = this;
400524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (custom){
400624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (custom.onAdd) custom.onAdd.call(this, fn, type);
400724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (custom.condition){
400824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				condition = function(event){
400924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (custom.condition.call(this, event, type)) return fn.call(this, event);
401024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					return true;
401124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				};
401224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
401324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (custom.base) realType = Function.from(custom.base).call(this, type);
401424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
401524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var defn = function(){
401624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return fn.call(self);
401724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
401824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var nativeEvent = Element.NativeEvents[realType];
401924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (nativeEvent){
402024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (nativeEvent == 2){
402124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				defn = function(event){
402224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					event = new DOMEvent(event, self.getWindow());
402324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (condition.call(self, event) === false) event.stop();
402424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				};
402524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
402624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.addListener(realType, defn, arguments[2]);
402724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
402824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		events[type].values.push(defn);
402924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
403024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
403124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
403224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvent: function(type, fn){
403324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var events = this.retrieve('events');
403424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!events || !events[type]) return this;
403524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var list = events[type];
403624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var index = list.keys.indexOf(fn);
403724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (index == -1) return this;
403824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var value = list.values[index];
403924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		delete list.keys[index];
404024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		delete list.values[index];
404124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var custom = Element.Events[type];
404224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (custom){
404324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (custom.onRemove) custom.onRemove.call(this, fn, type);
404424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (custom.base) type = Function.from(custom.base).call(this, type);
404524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
404624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
404724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
404824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
404924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvents: function(events){
405024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var event in events) this.addEvent(event, events[event]);
405124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
405224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
405324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
405424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvents: function(events){
405524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var type;
405624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeOf(events) == 'object'){
405724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (type in events) this.removeEvent(type, events[type]);
405824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return this;
405924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
406024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var attached = this.retrieve('events');
406124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!attached) return this;
406224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!events){
406324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (type in attached) this.removeEvents(type);
406424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.eliminate('events');
406524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else if (attached[events]){
406624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			attached[events].keys.each(function(fn){
406724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.removeEvent(events, fn);
406824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}, this);
406924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete attached[events];
407024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
407124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
407224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
407324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
407424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	fireEvent: function(type, args, delay){
407524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var events = this.retrieve('events');
407624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!events || !events[type]) return this;
407724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		args = Array.from(args);
407824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
407924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		events[type].keys.each(function(fn){
408024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (delay) fn.delay(delay, this, args);
408124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else fn.apply(this, args);
408224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}, this);
408324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
408424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
408524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
408624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	cloneEvents: function(from, type){
408724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		from = document.id(from);
408824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var events = from.retrieve('events');
408924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!events) return this;
409024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!type){
409124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			for (var eventType in events) this.cloneEvents(from, eventType);
409224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else if (events[type]){
409324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			events[type].keys.each(function(fn){
409424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.addEvent(type, fn);
409524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}, this);
409624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
409724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
409824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
409924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
410024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
410124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
410224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.NativeEvents = {
410324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
410424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
410524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
410624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	keydown: 2, keypress: 2, keyup: 2, //keyboard
410724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	orientationchange: 2, // mobile
410824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
410924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
411024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements
411124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
411224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	hashchange: 1, popstate: 2, // history
411324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	error: 1, abort: 1, scroll: 1 //misc
411424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
411524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
411624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Events = {
411724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	mousewheel: {
411824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll'
411924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
412024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
412124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
412224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar check = function(event){
412324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var related = event.relatedTarget;
412424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (related == null) return true;
412524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!related) return false;
412624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
412724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
412824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
412924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif ('onmouseenter' in document.documentElement){
413024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;
413124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.MouseenterCheck = check;
413224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} else {
413324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.Events.mouseenter = {
413424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'mouseover',
413524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		condition: check
413624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
413724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
413824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.Events.mouseleave = {
413924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'mouseout',
414024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		condition: check
414124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
414224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
414324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
414424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE9>*/
414524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!window.addEventListener){
414624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.NativeEvents.propertychange = 2;
414724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Element.Events.change = {
414824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: function(){
414924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var type = this.type;
415024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change';
415124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
415224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		condition: function(event){
415324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return event.type != 'propertychange' || event.event.propertyName == 'checked';
415424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
415524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
415624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
415724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE9>*/
415824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
415924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
416024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
416124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
416224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
416324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
416424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
416524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
416624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
416724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Element.Delegation
416824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
416924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Extends the Element native object to include the delegate method for more efficient event management.
417024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
417124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
417224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
417324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Element.Event]
417424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
417524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Element.Delegation]
417624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
417724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
417824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
417924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
418024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
418124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
418224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar eventListenerSupport = !!window.addEventListener;
418324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
418424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.NativeEvents.focusin = Element.NativeEvents.focusout = 2;
418524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
418624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar bubbleUp = function(self, match, fn, event, target){
418724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (target && target != self){
418824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (match(target, event)) return fn.call(target, event, target);
418924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		target = document.id(target.parentNode);
419024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
419124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
419224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
419324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar map = {
419424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	mouseenter: {
419524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'mouseover',
419624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		condition: Element.MouseenterCheck
419724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
419824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	mouseleave: {
419924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'mouseout',
420024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		condition: Element.MouseenterCheck
420124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
420224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	focus: {
420324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'focus' + (eventListenerSupport ? '' : 'in'),
420424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		capture: true
420524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
420624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	blur: {
420724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: eventListenerSupport ? 'blur' : 'focusout',
420824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		capture: true
420924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
421024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
421124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
421224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE9>*/
421324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar _key = '$delegation:';
421424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar formObserver = function(type){
421524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
421624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return {
421724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
421824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'focusin',
421924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
422024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		remove: function(self, uid){
422124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var list = self.retrieve(_key + type + 'listeners', {})[uid];
422224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (list && list.forms) for (var i = list.forms.length; i--;){
422324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				list.forms[i].removeEvent(type, list.fns[i]);
422424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
422524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
422624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
422724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		listen: function(self, match, fn, event, target, uid){
422824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var form = (target.get('tag') == 'form') ? target : event.target.getParent('form');
422924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!form) return;
423024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
423124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var listeners = self.retrieve(_key + type + 'listeners', {}),
423224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				listener = listeners[uid] || {forms: [], fns: []},
423324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				forms = listener.forms, fns = listener.fns;
423424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
423524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (forms.indexOf(form) != -1) return;
423624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			forms.push(form);
423724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
423824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var _fn = function(event){
423924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				bubbleUp(self, match, fn, event, target);
424024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			};
424124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			form.addEvent(type, _fn);
424224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			fns.push(_fn);
424324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
424424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			listeners[uid] = listener;
424524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			self.store(_key + type + 'listeners', listeners);
424624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
424724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
424824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
424924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
425024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar inputObserver = function(type){
425124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return {
425224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		base: 'focusin',
425324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		listen: function(self, match, fn, event, target){
425424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var events = {blur: function(){
425524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.removeEvents(events);
425624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}};
425724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			events[type] = function(event){
425824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				bubbleUp(self, match, fn, event, target);
425924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			};
426024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			event.target.addEvents(events);
426124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
426224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
426324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
426424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
426524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (!eventListenerSupport) Object.append(map, {
426624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	submit: formObserver('submit'),
426724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	reset: formObserver('reset'),
426824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	change: inputObserver('change'),
426924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	select: inputObserver('select')
427024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
427124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE9>*/
427224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
427324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar proto = Element.prototype,
427424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvent = proto.addEvent,
427524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvent = proto.removeEvent;
427624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
427724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar relay = function(old, method){
427824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return function(type, fn, useCapture){
427924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture);
428024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parsed = Slick.parse(type).expressions[0][0];
428124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture);
428224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var newType = parsed.tag;
428324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parsed.pseudos.slice(1).each(function(pseudo){
428424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : '');
428524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
428624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		old.call(this, type, fn);
428724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return method.call(this, newType, parsed.pseudos[0].value, fn);
428824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
428924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
429024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
429124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar delegation = {
429224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
429324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvent: function(type, match, fn){
429424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var storage = this.retrieve('$delegates', {}), stored = storage[type];
429524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (stored) for (var _uid in stored){
429624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (stored[_uid].fn == fn && stored[_uid].match == match) return this;
429724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
429824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
429924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var _type = type, _match = match, _fn = fn, _map = map[type] || {};
430024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		type = _map.base || _type;
430124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
430224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		match = function(target){
430324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return Slick.match(target, _match);
430424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
430524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
430624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var elementEvent = Element.Events[_type];
430724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (_map.condition || elementEvent && elementEvent.condition){
430824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var __match = match, condition = _map.condition || elementEvent.condition;
430924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			match = function(target, event){
431024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return __match(target, event) && condition.call(target, event, type);
431124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			};
431224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
431324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
431424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var self = this, uid = String.uniqueID();
431524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var delegator = _map.listen ? function(event, target){
431624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!target && event && event.target) target = event.target;
431724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (target) _map.listen(self, match, fn, event, target, uid);
431824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} : function(event, target){
431924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (!target && event && event.target) target = event.target;
432024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (target) bubbleUp(self, match, fn, event, target);
432124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
432224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
432324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!stored) stored = {};
432424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		stored[uid] = {
432524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			match: _match,
432624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			fn: _fn,
432724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delegator: delegator
432824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
432924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		storage[_type] = stored;
433024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return addEvent.call(this, type, delegator, _map.capture);
433124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
433224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
433324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvent: function(type, match, fn, _uid){
433424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var storage = this.retrieve('$delegates', {}), stored = storage[type];
433524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!stored) return this;
433624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
433724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (_uid){
433824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};
433924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			type = _map.base || _type;
434024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (_map.remove) _map.remove(this, _uid);
434124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete stored[_uid];
434224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			storage[_type] = stored;
434324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return removeEvent.call(this, type, delegator, _map.capture);
434424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
434524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
434624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var __uid, s;
434724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (fn) for (__uid in stored){
434824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			s = stored[__uid];
434924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);
435024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else for (__uid in stored){
435124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			s = stored[__uid];
435224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid);
435324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
435424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
435524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
435624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
435724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
435824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
435924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[Element, Window, Document].invoke('implement', {
436024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	addEvent: relay(addEvent, delegation.addEvent),
436124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	removeEvent: relay(removeEvent, delegation.removeEvent)
436224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
436324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
436424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
436524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
436624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
436724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
436824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
436924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
437024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Element.Dimensions
437124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
437224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains methods to work with size, scroll, or positioning of Elements and the window object.
437324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
437424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
437524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
437624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikcredits:
437724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
437824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
437924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
438024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Element, Element.Style]
438124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
438224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Element.Dimensions]
438324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
438424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
438524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
438624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
438724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
438824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
438924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar element = document.createElement('div'),
439024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	child = document.createElement('div');
439124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikelement.style.height = '0';
439224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikelement.appendChild(child);
439324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar brokenOffsetParent = (child.offsetParent === element);
439424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikelement = child = null;
439524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
439624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar isOffset = function(el){
439724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return styleString(el, 'position') != 'static' || isBody(el);
439824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
439924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
440024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar isOffsetStatic = function(el){
440124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
440224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
440324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
440424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
440524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
440624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	scrollTo: function(x, y){
440724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(this)){
440824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.getWindow().scrollTo(x, y);
440924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
441024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.scrollLeft = x;
441124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.scrollTop = y;
441224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
441324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
441424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
441524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
441624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getSize: function(){
441724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(this)) return this.getWindow().getSize();
441824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: this.offsetWidth, y: this.offsetHeight};
441924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
442024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
442124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrollSize: function(){
442224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(this)) return this.getWindow().getScrollSize();
442324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: this.scrollWidth, y: this.scrollHeight};
442424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
442524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
442624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScroll: function(){
442724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(this)) return this.getWindow().getScroll();
442824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: this.scrollLeft, y: this.scrollTop};
442924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
443024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
443124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrolls: function(){
443224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var element = this.parentNode, position = {x: 0, y: 0};
443324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while (element && !isBody(element)){
443424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			position.x += element.scrollLeft;
443524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			position.y += element.scrollTop;
443624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			element = element.parentNode;
443724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
443824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return position;
443924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
444024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
444124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getOffsetParent: brokenOffsetParent ? function(){
444224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var element = this;
444324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
444424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
444524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
444624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while ((element = element.parentNode)){
444724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (isOffsetCheck(element)) return element;
444824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
444924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
445024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} : function(){
445124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var element = this;
445224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
445324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
445424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
445524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return element.offsetParent;
445624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch(e) {}
445724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return null;
445824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
445924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
446024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getOffsets: function(){
446124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var hasGetBoundingClientRect = this.getBoundingClientRect;
446224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
446324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (hasGetBoundingClientRect){
446424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var bound = this.getBoundingClientRect(),
446524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				html = document.id(this.getDocument().documentElement),
446624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				htmlScroll = html.getScroll(),
446724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				elemScrolls = this.getScrolls(),
446824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				isFixed = (styleString(this, 'position') == 'fixed');
446924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
447024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return {
447124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
447224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
447324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			};
447424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
447524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
447624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var element = this, position = {x: 0, y: 0};
447724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(this)) return position;
447824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
447924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		while (element && !isBody(element)){
448024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			position.x += element.offsetLeft;
448124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			position.y += element.offsetTop;
448224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
448324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			element = element.offsetParent;
448424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
448524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
448624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return position;
448724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
448824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
448924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getPosition: function(relative){
449024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var offset = this.getOffsets(),
449124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			scroll = this.getScrolls();
449224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var position = {
449324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			x: offset.x - scroll.x,
449424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			y: offset.y - scroll.y
449524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
449624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
449724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (relative && (relative = document.id(relative))){
449824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var relativePosition = relative.getPosition();
449924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
450024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
450124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return position;
450224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
450324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
450424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getCoordinates: function(element){
450524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (isBody(this)) return this.getWindow().getCoordinates();
450624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var position = this.getPosition(element),
450724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			size = this.getSize();
450824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var obj = {
450924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			left: position.x,
451024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			top: position.y,
451124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			width: size.x,
451224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			height: size.y
451324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
451424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		obj.right = obj.left + obj.width;
451524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		obj.bottom = obj.top + obj.height;
451624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return obj;
451724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
451824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
451924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	computePosition: function(obj){
452024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {
452124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			left: obj.x - styleNumber(this, 'margin-left'),
452224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			top: obj.y - styleNumber(this, 'margin-top')
452324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
452424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
452524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
452624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setPosition: function(obj){
452724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.setStyles(this.computePosition(obj));
452824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
452924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
453024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
453124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
453224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
453324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[Document, Window].invoke('implement', {
453424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
453524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getSize: function(){
453624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var doc = getCompatElement(this);
453724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: doc.clientWidth, y: doc.clientHeight};
453824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
453924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
454024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScroll: function(){
454124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var win = this.getWindow(), doc = getCompatElement(this);
454224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
454324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
454424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
454524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrollSize: function(){
454624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var doc = getCompatElement(this),
454724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			min = this.getSize(),
454824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			body = this.getDocument().body;
454924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
455024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
455124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
455224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
455324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getPosition: function(){
455424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {x: 0, y: 0};
455524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
455624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
455724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getCoordinates: function(){
455824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var size = this.getSize();
455924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
456024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
456124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
456224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
456324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
456424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// private methods
456524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
456624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar styleString = Element.getComputedStyle;
456724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
456824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction styleNumber(element, style){
456924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return styleString(element, style).toInt() || 0;
457024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
457124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
457224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction borderBox(element){
457324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return styleString(element, '-moz-box-sizing') == 'border-box';
457424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
457524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
457624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction topBorder(element){
457724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return styleNumber(element, 'border-top-width');
457824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
457924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
458024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction leftBorder(element){
458124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return styleNumber(element, 'border-left-width');
458224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
458324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
458424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction isBody(element){
458524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (/^(?:body|html)$/i).test(element.tagName);
458624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
458724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
458824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfunction getCompatElement(element){
458924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var doc = element.getDocument();
459024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
459124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
459224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
459324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
459424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
459524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//aliases
459624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.alias({position: 'setPosition'}); //compatability
459724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
459824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[Window, Document, Element].invoke('implement', {
459924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
460024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getHeight: function(){
460124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getSize().y;
460224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
460324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
460424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getWidth: function(){
460524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getSize().x;
460624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
460724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
460824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrollTop: function(){
460924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getScroll().y;
461024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
461124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
461224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrollLeft: function(){
461324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getScroll().x;
461424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
461524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
461624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrollHeight: function(){
461724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getScrollSize().y;
461824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
461924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
462024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getScrollWidth: function(){
462124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getScrollSize().x;
462224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
462324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
462424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getTop: function(){
462524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getPosition().y;
462624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
462724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
462824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getLeft: function(){
462924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.getPosition().x;
463024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
463124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
463224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
463324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
463424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
463524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
463624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
463724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
463824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Fx
463924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
464024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains the basic animation logic to be extended by all other Fx Classes.
464124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
464224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
464324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
464424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Chain, Events, Options]
464524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
464624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Fx
464724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
464824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
464924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
465024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
465124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
465224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
465324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Fx = this.Fx = new Class({
465424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
465524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Implements: [Chain, Events, Options],
465624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
465724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	options: {
465824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*
465924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onStart: nil,
466024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onCancel: nil,
466124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onComplete: nil,
466224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		*/
466324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		fps: 60,
466424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		unit: false,
466524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		duration: 500,
466624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		frames: null,
466724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		frameSkip: true,
466824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		link: 'ignore'
466924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
467024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
467124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	initialize: function(options){
467224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.subject = this.subject || this;
467324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.setOptions(options);
467424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
467524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
467624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getTransition: function(){
467724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return function(p){
467824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return -(Math.cos(Math.PI * p) - 1) / 2;
467924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
468024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
468124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
468224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	step: function(now){
468324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.frameSkip){
468424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
468524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.time = now;
468624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.frame += frames;
468724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
468824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.frame++;
468924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
469024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
469124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.frame < this.frames){
469224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var delta = this.transition(this.frame / this.frames);
469324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.set(this.compute(this.from, this.to, delta));
469424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else {
469524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.frame = this.frames;
469624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.set(this.compute(this.from, this.to, 1));
469724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.stop();
469824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
469924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
470024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
470124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(now){
470224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return now;
470324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
470424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
470524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	compute: function(from, to, delta){
470624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Fx.compute(from, to, delta);
470724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
470824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
470924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	check: function(){
471024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.isRunning()) return true;
471124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		switch (this.options.link){
471224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'cancel': this.cancel(); return true;
471324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
471424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
471524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return false;
471624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
471724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
471824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	start: function(from, to){
471924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.check(from, to)) return this;
472024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.from = from;
472124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.to = to;
472224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.frame = (this.options.frameSkip) ? 0 : -1;
472324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.time = null;
472424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.transition = this.getTransition();
472524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
472624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.duration = Fx.Durations[duration] || duration.toInt();
472724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.frameInterval = 1000 / fps;
472824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.frames = frames || Math.round(this.duration / this.frameInterval);
472924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('start', this.subject);
473024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		pushInstance.call(this, fps);
473124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
473224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
473324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
473424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	stop: function(){
473524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.isRunning()){
473624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.time = null;
473724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			pullInstance.call(this, this.options.fps);
473824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (this.frames == this.frame){
473924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.fireEvent('complete', this.subject);
474024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
474124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} else {
474224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.fireEvent('stop', this.subject);
474324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
474424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
474524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
474624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
474724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
474824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	cancel: function(){
474924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.isRunning()){
475024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.time = null;
475124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			pullInstance.call(this, this.options.fps);
475224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.frame = this.frames;
475324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.fireEvent('cancel', this.subject).clearChain();
475424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
475524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
475624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
475724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
475824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	pause: function(){
475924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.isRunning()){
476024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.time = null;
476124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			pullInstance.call(this, this.options.fps);
476224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
476324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
476424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
476524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
476624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	resume: function(){
476724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.isPaused()) pushInstance.call(this, this.options.fps);
476824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
476924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
477024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
477124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	isRunning: function(){
477224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var list = instances[this.options.fps];
477324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return list && list.contains(this);
477424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
477524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
477624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	isPaused: function(){
477724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (this.frame < this.frames) && !this.isRunning();
477824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
477924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
478024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
478124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
478224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.compute = function(from, to, delta){
478324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (to - from) * delta + from;
478424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
478524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
478624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
478724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
478824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// global timers
478924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
479024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar instances = {}, timers = {};
479124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
479224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar loop = function(){
479324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var now = Date.now();
479424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var i = this.length; i--;){
479524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var instance = this[i];
479624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (instance) instance.step(now);
479724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
479824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
479924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
480024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar pushInstance = function(fps){
480124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var list = instances[fps] || (instances[fps] = []);
480224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	list.push(this);
480324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
480424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
480524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
480624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar pullInstance = function(fps){
480724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var list = instances[fps];
480824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (list){
480924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		list.erase(this);
481024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!list.length && timers[fps]){
481124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete instances[fps];
481224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			timers[fps] = clearInterval(timers[fps]);
481324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
481424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
481524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
481624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
481724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
481824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
481924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
482024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
482124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
482224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
482324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Fx.CSS
482424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
482524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
482624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
482724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
482824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
482924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Fx, Element.Style]
483024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
483124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Fx.CSS
483224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
483324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
483424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
483524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
483624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.CSS = new Class({
483724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
483824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Extends: Fx,
483924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
484024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//prepares the base from/to object
484124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
484224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	prepare: function(element, property, values){
484324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		values = Array.from(values);
484424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var from = values[0], to = values[1];
484524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (to == null){
484624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			to = from;
484724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			from = element.getStyle(property);
484824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var unit = this.options.unit;
484924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			// adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299
485024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){
485124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				element.setStyle(property, to + unit);
485224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var value = element.getComputedStyle(property);
485324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				// IE and Opera support pixelLeft or pixelWidth
485424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!(/px$/.test(value))){
485524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					value = element.style[('pixel-' + property).camelCase()];
485624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (value == null){
485724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						// adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
485824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						var left = element.style.left;
485924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						element.style.left = to + unit;
486024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						value = element.style.pixelLeft;
486124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik						element.style.left = left;
486224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					}
486324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
486424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);
486524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				element.setStyle(property, from + unit);
486624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
486724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
486824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return {from: this.parse(from), to: this.parse(to)};
486924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
487024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
487124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//parses a value into an array
487224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
487324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	parse: function(value){
487424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		value = Function.from(value)();
487524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
487624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return value.map(function(val){
487724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			val = String(val);
487824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var found = false;
487924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			Object.each(Fx.CSS.Parsers, function(parser, key){
488024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (found) return;
488124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var parsed = parser.parse(val);
488224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
488324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			});
488424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			found = found || {value: val, parser: Fx.CSS.Parsers.String};
488524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return found;
488624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
488724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
488824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
488924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//computes by a from and to prepared objects, using their parsers.
489024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
489124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	compute: function(from, to, delta){
489224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var computed = [];
489324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		(Math.min(from.length, to.length)).times(function(i){
489424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
489524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
489624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		computed.$family = Function.from('fx:css:value');
489724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return computed;
489824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
489924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
490024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//serves the value as settable
490124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
490224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	serve: function(value, unit){
490324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
490424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var returned = [];
490524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		value.each(function(bit){
490624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			returned = returned.concat(bit.parser.serve(bit.value, unit));
490724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
490824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return returned;
490924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
491024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
491124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//renders the change to an element
491224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
491324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	render: function(element, property, value, unit){
491424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		element.setStyle(property, this.serve(value, unit));
491524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
491624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
491724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	//searches inside the page css to find the values for a selector
491824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
491924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	search: function(selector){
492024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
492124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
492224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
492324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var searchStyles = function(rules){
492424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			Array.each(rules, function(rule, i){
492524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (rule.media){
492624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					searchStyles(rule.rules || rule.cssRules);
492724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					return;
492824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}
492924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!rule.style) return;
493024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
493124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					return m.toLowerCase();
493224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				}) : null;
493324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (!selectorText || !selectorTest.test(selectorText)) return;
493424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				Object.each(Element.Styles, function(value, style){
493524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					if (!rule.style[style] || Element.ShortStyles[style]) return;
493624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					value = String(rule.style[style]);
493724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
493824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				});
493924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			});
494024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
494124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
494224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Array.each(document.styleSheets, function(sheet, j){
494324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var href = sheet.href;
494424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return;
494524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var rules = sheet.rules || sheet.cssRules;
494624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			searchStyles(rules);
494724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
494824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Fx.CSS.Cache[selector] = to;
494924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
495024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
495124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
495224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
495324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.CSS.Cache = {};
495424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
495524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.CSS.Parsers = {
495624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
495724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Color: {
495824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parse: function(value){
495924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
496024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
496124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
496224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		compute: function(from, to, delta){
496324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return from.map(function(value, i){
496424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				return Math.round(Fx.compute(from[i], to[i], delta));
496524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			});
496624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
496724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		serve: function(value){
496824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return value.map(Number);
496924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
497024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
497124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
497224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Number: {
497324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parse: parseFloat,
497424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		compute: Fx.compute,
497524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		serve: function(value, unit){
497624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (unit) ? value + unit : value;
497724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
497824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
497924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
498024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	String: {
498124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		parse: Function.from(false),
498224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		compute: function(zero, one){
498324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return one;
498424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
498524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		serve: function(zero){
498624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return zero;
498724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
498824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
498924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
499024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
499124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
499224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
499324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
499424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
499524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
499624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
499724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
499824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Fx.Tween
499924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
500024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Formerly Fx.Style, effect to transition any CSS property for an element.
500124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
500224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
500324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
500424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Fx.CSS
500524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
500624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [Fx.Tween, Element.fade, Element.highlight]
500724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
500824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
500924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
501024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
501124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Tween = new Class({
501224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
501324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Extends: Fx.CSS,
501424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
501524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	initialize: function(element, options){
501624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.element = this.subject = document.id(element);
501724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.parent(options);
501824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
501924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
502024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(property, now){
502124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (arguments.length == 1){
502224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			now = property;
502324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			property = this.property || this.options.property;
502424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
502524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.render(this.element, property, now, this.options.unit);
502624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
502724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
502824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
502924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	start: function(property, from, to){
503024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.check(property, from, to)) return this;
503124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var args = Array.flatten(arguments);
503224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.property = this.options.property || args.shift();
503324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var parsed = this.prepare(this.element, this.property, args);
503424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.parent(parsed.from, parsed.to);
503524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
503624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
503724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
503824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
503924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.tween = {
504024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
504124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(options){
504224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.get('tween').cancel().setOptions(options);
504324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
504424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
504524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
504624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
504724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var tween = this.retrieve('tween');
504824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!tween){
504924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			tween = new Fx.Tween(this, {link: 'cancel'});
505024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.store('tween', tween);
505124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
505224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return tween;
505324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
505424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
505524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
505624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
505724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
505824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
505924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	tween: function(property, from, to){
506024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.get('tween').start(property, from, to);
506124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
506224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
506324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
506424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	fade: function(how){
506524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle;
506624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (args[1] == null) args[1] = 'toggle';
506724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		switch (args[1]){
506824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'in': method = 'start'; args[1] = 1; break;
506924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'out': method = 'start'; args[1] = 0; break;
507024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'show': method = 'set'; args[1] = 1; break;
507124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'hide': method = 'set'; args[1] = 0; break;
507224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'toggle':
507324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1);
507424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				method = 'start';
507524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				args[1] = flag ? 0 : 1;
507624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.store('fade:flag', !flag);
507724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				toggle = true;
507824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			break;
507924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			default: method = 'start';
508024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
508124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!toggle) this.eliminate('fade:flag');
508224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		fade[method].apply(fade, args);
508324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var to = args[args.length - 1];
508424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible');
508524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else fade.chain(function(){
508624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.element.setStyle('visibility', 'hidden');
508724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.callChain();
508824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
508924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
509024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
509124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
509224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	highlight: function(start, end){
509324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!end){
509424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			end = this.retrieve('highlight:original', this.getStyle('background-color'));
509524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			end = (end == 'transparent') ? '#fff' : end;
509624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
509724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var tween = this.get('tween');
509824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		tween.start('background-color', start || '#ffff88', end).chain(function(){
509924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.setStyle('background-color', this.retrieve('highlight:original'));
510024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			tween.callChain();
510124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}.bind(this));
510224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
510324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
510424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
510524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
510624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
510724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
510824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
510924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
511024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
511124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Fx.Morph
511224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
511324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
511424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
511524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
511624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
511724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Fx.CSS
511824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
511924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Fx.Morph
512024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
512124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
512224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
512324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
512424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Morph = new Class({
512524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
512624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Extends: Fx.CSS,
512724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
512824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	initialize: function(element, options){
512924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.element = this.subject = document.id(element);
513024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.parent(options);
513124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
513224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
513324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(now){
513424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeof now == 'string') now = this.search(now);
513524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
513624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
513724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
513824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
513924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	compute: function(from, to, delta){
514024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var now = {};
514124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
514224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return now;
514324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
514424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
514524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	start: function(properties){
514624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.check(properties)) return this;
514724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeof properties == 'string') properties = this.search(properties);
514824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var from = {}, to = {};
514924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var p in properties){
515024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var parsed = this.prepare(this.element, p, properties[p]);
515124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			from[p] = parsed.from;
515224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			to[p] = parsed.to;
515324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
515424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.parent(from, to);
515524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
515624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
515724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
515824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
515924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.morph = {
516024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
516124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(options){
516224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.get('morph').cancel().setOptions(options);
516324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
516424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
516524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
516624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
516724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var morph = this.retrieve('morph');
516824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!morph){
516924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			morph = new Fx.Morph(this, {link: 'cancel'});
517024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.store('morph', morph);
517124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
517224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return morph;
517324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
517424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
517524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
517624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
517724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
517824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
517924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	morph: function(props){
518024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.get('morph').start(props);
518124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
518224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
518324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
518424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
518524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
518624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
518724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
518824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
518924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
519024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Fx.Transitions
519124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
519224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains a set of advanced transitions to be used with any of the Fx Classes.
519324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
519424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
519524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
519624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikcredits:
519724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
519824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
519924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: Fx
520024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
520124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Fx.Transitions
520224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
520324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
520424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
520524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
520624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.implement({
520724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
520824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getTransition: function(){
520924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
521024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (typeof trans == 'string'){
521124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var data = trans.split(':');
521224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			trans = Fx.Transitions;
521324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			trans = trans[data[0]] || trans[data[0].capitalize()];
521424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
521524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
521624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return trans;
521724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
521824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
521924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
522024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
522124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Transition = function(transition, params){
522224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	params = Array.from(params);
522324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var easeIn = function(pos){
522424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return transition(pos, params);
522524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
522624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return Object.append(easeIn, {
522724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		easeIn: easeIn,
522824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		easeOut: function(pos){
522924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return 1 - transition(1 - pos, params);
523024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
523124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		easeInOut: function(pos){
523224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
523324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
523424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
523524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
523624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
523724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Transitions = {
523824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
523924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	linear: function(zero){
524024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return zero;
524124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
524224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
524324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
524424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
524524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
524624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
524724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Transitions.extend = function(transitions){
524824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
524924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
525024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
525124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikFx.Transitions.extend({
525224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
525324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Pow: function(p, x){
525424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.pow(p, x && x[0] || 6);
525524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
525624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
525724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Expo: function(p){
525824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.pow(2, 8 * (p - 1));
525924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
526024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
526124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Circ: function(p){
526224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return 1 - Math.sin(Math.acos(p));
526324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
526424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
526524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Sine: function(p){
526624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return 1 - Math.cos(p * Math.PI / 2);
526724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
526824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
526924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Back: function(p, x){
527024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		x = x && x[0] || 1.618;
527124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.pow(p, 2) * ((x + 1) * p - x);
527224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
527324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
527424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Bounce: function(p){
527524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var value;
527624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		for (var a = 0, b = 1; 1; a += b, b /= 2){
527724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (p >= (7 - 4 * a) / 11){
527824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
527924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				break;
528024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
528124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
528224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return value;
528324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
528424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
528524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Elastic: function(p, x){
528624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
528724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
528824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
528924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
529024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
529124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
529224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Fx.Transitions[transition] = new Fx.Transition(function(p){
529324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Math.pow(p, i + 2);
529424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	});
529524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
529624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
529724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
529824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
529924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
530024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
530124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Request
530224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
530324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Powerful all purpose Request Class. Uses XMLHTTPRequest.
530424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
530524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
530624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
530724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Object, Element, Chain, Events, Options, Browser]
530824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
530924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Request
531024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
531124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
531224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
531324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
531424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
531524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
531624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar empty = function(){},
531724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	progressSupport = ('onprogress' in new Browser.Request);
531824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
531924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Request = this.Request = new Class({
532024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
532124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Implements: [Chain, Events, Options],
532224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
532324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	options: {/*
532424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onRequest: function(){},
532524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onLoadstart: function(event, xhr){},
532624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onProgress: function(event, xhr){},
532724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onComplete: function(){},
532824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onCancel: function(){},
532924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onSuccess: function(responseText, responseXML){},
533024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onFailure: function(xhr){},
533124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onException: function(headerName, value){},
533224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		onTimeout: function(){},
533324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		user: '',
533424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		password: '',*/
533524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		url: '',
533624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		data: '',
533724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		headers: {
533824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			'X-Requested-With': 'XMLHttpRequest',
533924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
534024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		},
534124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		async: true,
534224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		format: false,
534324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		method: 'post',
534424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		link: 'ignore',
534524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		isSuccess: null,
534624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		emulation: true,
534724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		urlEncoded: true,
534824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		encoding: 'utf-8',
534924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		evalScripts: false,
535024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		evalResponse: false,
535124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		timeout: 0,
535224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		noCache: false
535324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
535424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
535524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	initialize: function(options){
535624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.xhr = new Browser.Request();
535724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.setOptions(options);
535824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.headers = this.options.headers;
535924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
536024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
536124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	onStateChange: function(){
536224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var xhr = this.xhr;
536324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (xhr.readyState != 4 || !this.running) return;
536424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.running = false;
536524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.status = 0;
536624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Function.attempt(function(){
536724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var status = xhr.status;
536824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.status = (status == 1223) ? 204 : status;
536924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}.bind(this));
537024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xhr.onreadystatechange = empty;
537124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
537224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		clearTimeout(this.timer);
537324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
537424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
537524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.isSuccess.call(this, this.status))
537624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.success(this.response.text, this.response.xml);
537724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else
537824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.failure();
537924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
538024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
538124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	isSuccess: function(){
538224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var status = this.status;
538324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (status >= 200 && status < 300);
538424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
538524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
538624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	isRunning: function(){
538724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return !!this.running;
538824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
538924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
539024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	processScripts: function(text){
539124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
539224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return text.stripScripts(this.options.evalScripts);
539324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
539424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
539524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	success: function(text, xml){
539624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.onSuccess(this.processScripts(text), xml);
539724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
539824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
539924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	onSuccess: function(){
540024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
540124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
540224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
540324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	failure: function(){
540424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.onFailure();
540524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
540624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
540724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	onFailure: function(){
540824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('complete').fireEvent('failure', this.xhr);
540924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
541024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
541124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	loadstart: function(event){
541224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('loadstart', [event, this.xhr]);
541324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
541424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
541524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	progress: function(event){
541624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('progress', [event, this.xhr]);
541724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
541824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
541924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	timeout: function(){
542024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('timeout', this.xhr);
542124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
542224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
542324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	setHeader: function(name, value){
542424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.headers[name] = value;
542524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
542624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
542724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
542824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	getHeader: function(name){
542924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return Function.attempt(function(){
543024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return this.xhr.getResponseHeader(name);
543124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}.bind(this));
543224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
543324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
543424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	check: function(){
543524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.running) return true;
543624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		switch (this.options.link){
543724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'cancel': this.cancel(); return true;
543824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
543924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
544024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return false;
544124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
544224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
544324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	send: function(options){
544424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.check(options)) return this;
544524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
544624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
544724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.running = true;
544824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
544924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var type = typeOf(options);
545024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (type == 'string' || type == 'element') options = {data: options};
545124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
545224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var old = this.options;
545324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		options = Object.append({data: old.data, url: old.url, method: old.method}, options);
545424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
545524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
545624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		switch (typeOf(data)){
545724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'element': data = document.id(data).toQueryString(); break;
545824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			case 'object': case 'hash': data = Object.toQueryString(data);
545924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
546024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
546124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.format){
546224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var format = 'format=' + this.options.format;
546324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			data = (data) ? format + '&' + data : format;
546424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
546524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
546624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.emulation && !['get', 'post'].contains(method)){
546724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var _method = '_method=' + method;
546824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			data = (data) ? _method + '&' + data : _method;
546924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			method = 'post';
547024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
547124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
547224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.urlEncoded && ['post', 'put'].contains(method)){
547324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
547424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
547524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
547624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
547724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!url) url = document.location.pathname;
547824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
547924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var trimPosition = url.lastIndexOf('/');
548024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
548124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
548224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.noCache)
548324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			url += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID();
548424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
548524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (data && (method == 'get' || method == 'delete')){
548624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			url += (url.indexOf('?') > -1 ? '&' : '?') + data;
548724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			data = null;
548824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
548924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
549024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var xhr = this.xhr;
549124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (progressSupport){
549224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			xhr.onloadstart = this.loadstart.bind(this);
549324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			xhr.onprogress = this.progress.bind(this);
549424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
549524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
549624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
549724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
549824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
549924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xhr.onreadystatechange = this.onStateChange.bind(this);
550024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
550124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Object.each(this.headers, function(value, key){
550224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			try {
550324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				xhr.setRequestHeader(key, value);
550424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			} catch (e){
550524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				this.fireEvent('exception', [key, value]);
550624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			}
550724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}, this);
550824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
550924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('request');
551024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xhr.send(data);
551124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.options.async) this.onStateChange();
551224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
551324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
551424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
551524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
551624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	cancel: function(){
551724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!this.running) return this;
551824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.running = false;
551924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var xhr = this.xhr;
552024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xhr.abort();
552124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		clearTimeout(this.timer);
552224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		xhr.onreadystatechange = empty;
552324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
552424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.xhr = new Browser.Request();
552524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.fireEvent('cancel');
552624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
552724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
552824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
552924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
553024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
553124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar methods = {};
553224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
553324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	methods[method] = function(data){
553424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var object = {
553524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			method: method
553624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		};
553724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (data != null) object.data = data;
553824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this.send(object);
553924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	};
554024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
554124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
554224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikRequest.implement(methods);
554324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
554424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.send = {
554524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
554624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(options){
554724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var send = this.get('send').cancel();
554824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		send.setOptions(options);
554924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
555024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
555124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
555224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
555324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var send = this.retrieve('send');
555424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!send){
555524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			send = new Request({
555624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
555724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			});
555824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.store('send', send);
555924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
556024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return send;
556124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
556224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
556324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
556424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
556524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
556624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
556724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	send: function(url){
556824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var sender = this.get('send');
556924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		sender.send({data: this, url: url || sender.options.url});
557024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
557124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
557224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
557324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
557424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
557524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
557624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
557724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
557824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
557924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
558024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
558124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Request.HTML
558224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
558324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Extends the basic Request Class with additional methods for interacting with HTML responses.
558424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
558524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
558624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
558724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Element, Request]
558824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
558924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Request.HTML
559024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
559124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
559224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
559324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
559424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikRequest.HTML = new Class({
559524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
559624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Extends: Request,
559724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
559824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	options: {
559924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		update: false,
560024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		append: false,
560124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		evalScripts: true,
560224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		filter: false,
560324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		headers: {
560424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			Accept: 'text/html, application/xml, text/xml, */*'
560524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
560624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
560724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
560824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	success: function(text){
560924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var options = this.options, response = this.response;
561024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
561124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		response.html = text.stripScripts(function(script){
561224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			response.javascript = script;
561324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
561424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
561524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
561624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (match) response.html = match[1];
561724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var temp = new Element('div').set('html', response.html);
561824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
561924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		response.tree = temp.childNodes;
562024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		response.elements = temp.getElements(options.filter || '*');
562124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
562224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (options.filter) response.tree = response.elements;
562324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (options.update){
562424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var update = document.id(options.update).empty();
562524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (options.filter) update.adopt(response.elements);
562624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else update.set('html', response.html);
562724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} else if (options.append){
562824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var append = document.id(options.append);
562924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			if (options.filter) response.elements.reverse().inject(append);
563024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			else append.adopt(temp.getChildren());
563124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
563224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (options.evalScripts) Browser.exec(response.javascript);
563324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
563424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
563524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
563624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
563724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
563824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
563924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Properties.load = {
564024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
564124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	set: function(options){
564224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var load = this.get('load').cancel();
564324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		load.setOptions(options);
564424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
564524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
564624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
564724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	get: function(){
564824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var load = this.retrieve('load');
564924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!load){
565024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
565124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.store('load', load);
565224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
565324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return load;
565424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
565524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
565624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
565724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
565824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.implement({
565924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
566024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	load: function(){
566124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
566224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
566324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
566424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
566524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
566624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
566724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
566824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
566924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
567024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
567124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: JSON
567224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
567324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: JSON encoder and decoder.
567424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
567524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
567624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
567724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSeeAlso: <http://www.json.org/>
567824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
567924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Array, String, Number, Function]
568024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
568124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: JSON
568224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
568324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
568424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
568524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
568624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (typeof JSON == 'undefined') this.JSON = {};
568724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
568824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
568924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
569024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(){
569124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
569224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
569324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
569424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar escape = function(chr){
569524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
569624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
569724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
569824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikJSON.validate = function(string){
569924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
570024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
570124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik					replace(/(?:^|:|,)(?:\s*\[)+/g, '');
570224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
570324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (/^[\],:{}\s]*$/).test(string);
570424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
570524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
570624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikJSON.encode = JSON.stringify ? function(obj){
570724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return JSON.stringify(obj);
570824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} : function(obj){
570924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (obj && obj.toJSON) obj = obj.toJSON();
571024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
571124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	switch (typeOf(obj)){
571224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'string':
571324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
571424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'array':
571524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return '[' + obj.map(JSON.encode).clean() + ']';
571624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'object': case 'hash':
571724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var string = [];
571824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			Object.each(obj, function(value, key){
571924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				var json = JSON.encode(value);
572024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik				if (json) string.push(JSON.encode(key) + ':' + json);
572124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			});
572224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return '{' + string + '}';
572324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'number': case 'boolean': return '' + obj;
572424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		case 'null': return 'null';
572524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
572624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
572724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return null;
572824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
572924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
573024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikJSON.secure = true;
573124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
573224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
573324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikJSON.decode = function(string, secure){
573424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!string || typeOf(string) != 'string') return null;
573524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
573624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (secure == null) secure = JSON.secure;
573724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (secure){
573824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (JSON.parse) return JSON.parse(string);
573924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
574024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
574124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
574224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return eval('(' + string + ')');
574324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
574424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
574524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})();
574624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
574724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
574824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
574924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
575024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
575124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Request.JSON
575224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
575324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Extends the basic Request Class with additional methods for sending and receiving JSON data.
575424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
575524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
575624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
575724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Request, JSON]
575824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
575924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Request.JSON
576024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
576124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
576224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
576324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
576424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikRequest.JSON = new Class({
576524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
576624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Extends: Request,
576724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
576824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	options: {
576924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		/*onError: function(text, error){},*/
577024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		secure: true
577124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
577224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
577324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	initialize: function(options){
577424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.parent(options);
577524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		Object.append(this.headers, {
577624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			'Accept': 'application/json',
577724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			'X-Request': 'JSON'
577824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		});
577924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
578024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
578124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	success: function(text){
578224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var json;
578324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		try {
578424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			json = this.response.json = JSON.decode(text, this.options.secure);
578524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		} catch (error){
578624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			this.fireEvent('error', [text, error]);
578724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			return;
578824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
578924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (json == null) this.onFailure();
579024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		else this.onSuccess(json, text);
579124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
579224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
579324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
579424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
579524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
579624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
579724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
579824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
579924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: Cookie
580024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
580124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Class for creating, reading, and deleting browser Cookies.
580224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
580324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
580424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
580524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikcredits:
580624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
580724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
580824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Options, Browser]
580924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
581024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: Cookie
581124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
581224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
581324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
581424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
581524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar Cookie = new Class({
581624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
581724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Implements: Options,
581824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
581924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	options: {
582024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		path: '/',
582124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		domain: false,
582224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		duration: false,
582324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		secure: false,
582424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		document: document,
582524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		encode: true
582624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
582724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
582824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	initialize: function(key, options){
582924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.key = key;
583024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.setOptions(options);
583124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
583224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
583324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	write: function(value){
583424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.encode) value = encodeURIComponent(value);
583524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.domain) value += '; domain=' + this.options.domain;
583624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.path) value += '; path=' + this.options.path;
583724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.duration){
583824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			var date = new Date();
583924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
584024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			value += '; expires=' + date.toGMTString();
584124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
584224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this.options.secure) value += '; secure';
584324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		this.options.document.cookie = this.key + '=' + value;
584424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
584524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
584624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
584724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	read: function(){
584824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
584924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return (value) ? decodeURIComponent(value[1]) : null;
585024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
585124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
585224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	dispose: function(){
585324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
585424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return this;
585524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
585624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
585724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
585824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
585924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikCookie.write = function(key, value, options){
586024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return new Cookie(key, options).write(value);
586124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
586224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
586324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikCookie.read = function(key){
586424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return new Cookie(key).read();
586524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
586624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
586724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikCookie.dispose = function(key, options){
586824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return new Cookie(key, options).dispose();
586924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
587024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
587124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
587224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*
587324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik---
587424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
587524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikname: DOMReady
587624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
587724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdescription: Contains the custom event domready.
587824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
587924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicense: MIT-style license.
588024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
588124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrequires: [Browser, Element, Element.Event]
588224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
588324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikprovides: [DOMReady, DomReady]
588424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
588524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik...
588624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik*/
588724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
588824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(function(window, document){
588924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
589024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar ready,
589124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	loaded,
589224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	checks = [],
589324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	shouldPoll,
589424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	timer,
589524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	testElement = document.createElement('div');
589624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
589724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar domready = function(){
589824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clearTimeout(timer);
589924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (ready) return;
590024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	Browser.loaded = ready = true;
590124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
590224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
590324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	document.fireEvent('domready');
590424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	window.fireEvent('domready');
590524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
590624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
590724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar check = function(){
590824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	for (var i = checks.length; i--;) if (checks[i]()){
590924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		domready();
591024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
591124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
591224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return false;
591324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
591424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
591524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar poll = function(){
591624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	clearTimeout(timer);
591724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if (!check()) timer = setTimeout(poll, 10);
591824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
591924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
592024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdocument.addListener('DOMContentLoaded', domready);
592124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
592224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*<ltIE8>*/
592324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
592424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// testElement.doScroll() throws when the DOM is not ready, only in the top window
592524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvar doScrollWorks = function(){
592624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	try {
592724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		testElement.doScroll();
592824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
592924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} catch (e){}
593024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return false;
593124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
593224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// If doScroll works already, it can't be used to determine domready
593324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik//   e.g. in an iframe
593424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (testElement.doScroll && !doScrollWorks()){
593524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	checks.push(doScrollWorks);
593624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	shouldPoll = true;
593724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
593824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik/*</ltIE8>*/
593924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
594024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (document.readyState) checks.push(function(){
594124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	var state = document.readyState;
594224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	return (state == 'loaded' || state == 'complete');
594324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
594424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
594524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif ('onreadystatechange' in document) document.addListener('readystatechange', check);
594624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikelse shouldPoll = true;
594724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
594824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (shouldPoll) poll();
594924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
595024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Events.domready = {
595124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	onAdd: function(fn){
595224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (ready) fn.call(this);
595324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
595424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
595524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
595624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// Make sure that domready fires before load
595724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikElement.Events.load = {
595824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	base: 'load',
595924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	onAdd: function(fn){
596024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (loaded && this == window) fn.call(this);
596124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	},
596224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	condition: function(){
596324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		if (this == window){
596424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			domready();
596524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik			delete Element.Events.load;
596624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		}
596724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		return true;
596824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
596924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik};
597024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
597124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik// This is based on the custom load event
597224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikwindow.addEvent('load', function(){
597324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	loaded = true;
597424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik});
597524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
597624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik})(window, document);
597724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
5978