/**!
 * pbjs JavaScript Framework v0.4.4
 */
(function (l) {
	var g = {},
		t = Array.prototype.slice,
		h = document,
		u = h.documentElement,
		s = document.body;
	g.UID = 0;
	Object.extend = function (a, b) {
		for (var c in b) b.hasOwnProperty(c) && (a[c] = b[c]);
		return a
	};
	Object.extendIfNotExists = function (a, b) {
		for (var c in b) b.hasOwnProperty(c) && typeof a[c] === "undefined" && (a[c] = b[c]);
		return a
	};
	Object.extendIfNotExists(Object, {
		keys: function (a) {
			if (this === null || Object.isObject(a) === false) throw new TypeError;
			var b = [],
				c;
			for (c in a) a.hasOwnProperty(c) && b.push(c);
			return b
		},
		getPrototypeOf: function (a) {
			var b = a.constructor,
				c;
			if (typeof a.__proto__ !== "undefined") return a.__proto__;
			if (a.hasOwnProperty(a.constructor)) {
				c = a.constructor;
				if (delete a.constructor === false) return null;
				b = a.constructor;
				a.constructor = c
			}
			return b ? b.prototype : null
		}
	});
	Object.extend(Object, {
		isObject: function (a) {
			return Object.prototype.toString.call(a) === "[object Object]"
		},
		clone: function (a) {
			return Object.extend({}, a)
		},
		forEach: function (a, b, c) {
			var d;
			if (Object.isObject(a) === false || typeof b !== "function") throw new TypeError;
			for (d in a) a.hasOwnProperty(d) && b.call(c, a[d], d, a)
		}
	});
	Object.extendIfNotExists(Array, {
		isArray: function (a) {
			return typeof a !== "object" || a === null || typeof a.length === "undefined" ? false : true
		}
	});
	Object.extendIfNotExists(Array.prototype, {
		forEach: function (a, b) {
			if (this === null || typeof a !== "function") throw new TypeError;
			for (var c = this.length, d = 0; d < c;) a.call(b, this[d], d, this), d++
		},
		indexOf: function (a, b) {
			if (this === null) throw new TypeError;
			var c = this.length,
				b = b || 0;
			if (c <= b || c === 0) return -1;
			for (; b < c;) {
				if (this[b] === a) return b;
				b++
			}
			return -1
		},
		lastIndexOf: function (a, b) {
			if (this === null) throw new TypeError;
			var c = this.length,
				b = b || 0;
			if (c <= b || c === 0) return -1;
			for (; b <= c;) if (c--, this[c] === a) return c;
			return -1
		},
		filter: function (a, b) {
			if (this === null || typeof a !== "function") throw new TypeError;
			for (var c = [], d = 0, e = this.length; d < e;) a.call(b, this[d], d, this) && c.push(this[d]), d++;
			return c
		},
		every: function (a, b) {
			if (this === null || typeof a !== "function") throw new TypeError;
			for (var c = this.length, d = 0; d < c;) {
				if (a.call(b, this[d], d, this) === false) return false;
				d++
			}
			return true
		},
		map: function (a, b) {
			if (this === null || typeof a !== "function") throw new TypeError;
			for (var c = this.length, d = Array(c), e = 0; e < c;) e in this && (d[e] = a.call(b, this[e], e, this)), e++;
			return d
		},
		some: function (a, b) {
			if (this === null || typeof a !== "function") throw new TypeError;
			for (var c = this.length, d = 0; d < c;) {
				if (a.call(b, this[d], d, this) === true) return true;
				d++
			}
			return false
		},
		reduce: function () {},
		reduceRight: function () {}
	});
	Object.extend(Array.prototype, {
		clone: function () {
			if(this.nodeName != "#document") {
				return this.slice(0)
			}
		},
		empty: function () {
			this.length = 0;
			return this
		},
		remove: function (a) {
			if(this.nodeName != "#document") {
					a = this.indexOf(a);
					a !== -1 && this.splice(a, 1);
					return this
			}
		}
	});
	Object.extendIfNotExists(Function.prototype, {
		bind: function (a) {
			var b = t.call(arguments, 1),
				c = this;
			return function () {
				return c.apply(a, b.concat(t.call(arguments, 0)))
			}
		}
	});
	Object.extend(Function.prototype, {
		bindAsEventListener: function (a) {
			var b = t.call(arguments, 1),
				c = this;
			return function (d) {
				d = [d || l.event].concat(b);
				c.apply(a, d)
			}
		},
		delay: function (a) {
			var b = t.call(arguments, 1),
				c = this;
			return l.setTimeout(function () {
				return c.apply(c, b)
			}, a)
		}
	});
	var v = String.prototype.substr;
	Object.extend(String.prototype, {
		trim: function (a) {
			a = a || "\\s";
			return this.replace(RegExp("(^[" + a + "]+|[" + a + "]+$)", "g"), "")
		},
		trimLeft: function (a) {
			return this.replace(RegExp("(^" + (a || "\\s") + "+)", "g"), "")
		},
		trimRight: function (a) {
			return this.replace(RegExp("(" + (a || "\\s") + "+$)", "g"), "")
		},
		ucfirst: function () {
			return this.charAt(0).toUpperCase() + this.substr(1)
		},
		pad: function (a, b, c) {
			a -= this.length;
			b = String(b);
			if (typeof b === "undefined" || b.length !== 1) b = String(this);
			if (a <= 0) return String(this);
			b = b.repeat(a);
			return c === true ? b + this : this + b
		},
		repeat: function (a) {
			return Array(a + 1).join(this)
		},
		truncate: function (a, b, c) {
			var d = this.length,
				a = a >>> 0 || 30,
				b = typeof b === "undefined" ? "..." : b;
			if (d <= a) return String(this);
			return (c || false) === true ? (a = (d + b.length - a) / 2, c = a % 1 === 0 ? 0 : 1, d = Math.round(this.length / 2), c && (a = Math.floor(a)), this.substr(0, d - a) + b + this.substr(d + a + c)) : this.slice(0, a - b.length) + b
		},
		word_truncate: function (a, b, c) {
			var d = this.length,
				a = a >>> 0 || 30,
				b = typeof b === "undefined" ? "..." : b;
			return d <= a ? this : (c || false) === false ? this.slice(0, this.lastIndexOf(" ", a - b.length)) + b : (a = (d + b.length - a) / 2, c = a % 1 === 0 ? 0 : 1, d = Math.round(d / 2), c && (a = Math.floor(a)), this.substr(0, this.lastIndexOf(" ", d - a)) + b + this.substr(this.indexOf(" ", d + a + c)))
		},
		substr: ".e".substr(-1) === "e" ? v : function (a, b) {
			a = a < 0 ? this.length + a : a;
			return v.call(this, a, b)
		}
	});
	Object.extendIfNotExists(Date, {
		now: function () {
			return (new Date).getTime()
		}
	});
	Object.extendIfNotExists(Date.prototype, {
		toISOString: function () {
			return this.getUTCFullYear() + "-" + this.pad(this.getUTCMonth() + 1) + "-" + this.pad(this.getUTCDate()) + "T" + this.pad(this.getUTCHours()) + ":" + this.pad(this.getUTCMinutes()) + ":" + this.pad(this.getUTCSeconds()) + "." + this.getMilliseconds().toString().pad(3, 0, true) + "Z"
		}
	});
	Object.extend(Date.prototype, {
		clone: function () {
			return new Date(this.getTime())
		},
		pad: function (a) {
			return a < 10 ? "0" + a : a
		}
	});
	Date.languages = {
		en: {
			days: "Sunday Monday Tuesday Wendsday Thursday Friday Saturday".split(" "),
			daysShort: "Sun Mon Tue Wen Thu Fri Sat".split(" "),
			months: "January February March April May June July August September October November December".split(" "),
			monthsShort: "Jan Feb Mar Apr May Apr Mar Jun Jul Oct Nov Dec".split(" ")
		},
		nl: {
			days: "zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),
			daysShort: "zo ma di wo do vr za".split(" "),
			months: "januari februari maart april mei juni juli augustus september oktober november december".split(" "),
			monthsShort: "jan feb mrt apr mei jun jul aug sep okt nov dec".split(" ")
		}
	};
	Date.lang = "en";
	g.DateFormatRegExp = /\\?([a-zA-Z])/g;
	Object.extend(Date.prototype, {
		format: function (a, b) {
			if (typeof b === "undefined") b = Date.lang;
			return a.replace(g.DateFormatRegExp, this.formatChar.bind(this, b))
		},
		formatChar: function (a, b, c) {
			switch (b) {
			case "d":
				return this.pad(this.getDate());
			case "D":
				return Date.languages[a].daysShort[this.getDay()];
			case "j":
				return this.getDate();
			case "l":
				return Date.languages[a].days[this.getDay()];
			case "N":
				return this.getDay() || 7;
			case "w":
				return this.getDay();
			case "z":
				return Math.floor((this - new Date(this.getFullYear(), 0, 1, 0, 0, 0)) / 864E5);
			case "W":
				return a = new Date(this.valueOf()), b = (this.getDay() + 6) % 7, a.setDate(a.getDate() - b + 3), b = a.valueOf(), a.setMonth(0, 1), a.getDay() != 4 && a.setMonth(0, 1 + (4 - a.getDay() + 7) % 7), this.pad(1 + Math.ceil((b - a) / 6048E5));
			case "F":
				return Date.languages[a].months[this.getMonth()];
			case "m":
				return this.pad(this.getMonth() + 1);
			case "M":
				return Date.languages[a].monthsShort[this.getMonth()];
			case "n":
				return this.getMonth() + 1;
			case "t":
				return a = this.clone(), a.setDate(32), 32 - a.getDate();
			case "L":
				return (new Date(this.getFullYear(), 1, 29)).getDate() === 29;
			case "Y":
				return this.getFullYear();
			case "y":
				return String(this.getFullYear()).substr(2);
			case "a":
				return Math.floor(this.getHours() / 12) ? "pm" : "am";
			case "A":
				return Math.floor(this.getHours() / 12) ? "PM" : "AM";
			case "B":
				return Math.floor((this.getHours() * 3600 + this.getMinutes() * 60 + this.getSeconds()) / 86.4);
			case "g":
				return a = this.getHours(), a / 12 && a >= 12 ? a - 12 : a;
			case "G":
				return this.getHours();
			case "h":
				return this.pad(this.formatChar("g"));
			case "H":
				return this.pad(this.getHours());
			case "i":
				return this.pad(this.getMinutes());
			case "s":
				return this.pad(this.getSeconds());
			case "u":
				return this.getTime();
			case "O":
				return "+" + this.pad(-this.getTimezoneOffset() / 60) + "00";
			case "P":
				return "+" + this.pad(-this.getTimezoneOffset() / 60) + ":00";
			case "Z":
				return -this.getTimezoneOffset() * 60;
			case "c":
				return this.format("Y-m-dTH:i:sP");
			case "r":
				return this.format("D, d M Y H:i:s O");
			case "U":
				return Math.floor(this.getTime() / 1E3);
			default:
				return c
			}
		}
	});
	Object.extend(Date, {
		_parse: Date.parse,
		parse: function (a) {
			var b = Date._parse(a);
			if (isNaN(b) === false) return b;
			b = new Date;
			if (a = a.match(/([\d]+)-([\d]+)-([\d]+)[T ]?([\d]+)?:?([\d]+)?:?([\d]+)?\+?([\d: Z]+)?/)) b.setFullYear(a[1]), b.setMonth(parseInt(a[2], 10) - 1), b.setDate(a[3]), b.setHours(a[4] || 0), b.setMinutes(a[5] || 0), b.setSeconds(a[6] || 0), b.setMilliseconds(0), a[7] ? a[7] === "Z" ? b.setHours(b.getHours() - b.getTimezoneOffset() / 60) : -(parseInt(a[7], 10) * 60) !== b.getTimezoneOffset() && b.setHours(b.getHours() + (-(parseInt(a[7], 10) * 60) - b.getTimezoneOffset()) / 60) : a[4] || b.setHours(b.getHours() - b.getTimezoneOffset() / 60);
			return b.getTime()
		}
	});
	if (!l.JSON) l.JSON = function () {
		var a = function () {};
		a.prototype = {
			toString: function () {
				return "[object JSON]"
			},
			stringify: function () {},
			parse: function (a) {
				return eval("(" + a + ")")
			}
		};
		return new a
	}();
	l.PB = function (a) {
		if (!a) return null;
		if (a instanceof PB.Element) return a;
		typeof a === "string" && (a = h.getElementById(a));
		if ((!a || a.nodeType !== 1 && a.nodeType !== 9) && a !== l) return null;
		if (typeof a.__PBID__ === "number" && g.element_cache.hasOwnProperty(a.__PBID__) === true) return g.element_cache[a.__PBID__];
		a.__PBID__ = PB.id();
		return g.element_cache[a.__PBID__] = new PB.Element(a)
	};
	PB.VERSION = "0.4.4";
	Object.extend(PB, {
		isStrict: h.compatMode === "CSS1Compat",
		id: function () {
			return ++g.UID
		},
		Class: function (a) {
			var b = a.constructor === Object ?
			function () {
				this.parent && this.parent().constructor !== b && this.parent().constructor.apply(this, arguments)
			} : a.constructor;
			a.constructor && delete a.constructor;
			Object.extend(b.prototype, a);
			b.extend = function (a) {
				this.prototype.parent = function () {
					return a.prototype
				};
				Object.extendIfNotExists(this.prototype, a.prototype);
				return this
			};
			return b
		}
	});
	PB.Pattern = {};
	PB.Pattern.Observer = PB.Class({
		constructor: function () {
			this.listeners = {}
		},
		on: function (a, b) {
			this.listeners[a] || (this.listeners[a] = []);
			this.listeners[a].push(b);
			return this
		},
		off: function (a, b) {
			this.listeners[a].remove(b)
		},
		emit: function (a) {
			if (this.listeners[a]) {
				var b = t.call(arguments, 1);
				this.listeners[a].forEach(function (a) {
					a.apply(null, b || [])
				})
			}
		}
	});
	PB.browser = {};
	var q = h.createElement(s ? "div" : "body"),
		s = s || u,
		o = h.createElement("div");
	q.appendChild(o);
	s.insertBefore(q, s.firstChild);
	PB.supported = {
		cssOpacity: typeof o.style.opacity !== "undefined",
		cssFloat: typeof o.style.cssFloat !== "undefined",
		boxModel: false,
		substractBorder: false
	};
	o.style.width = o.style.paddingLeft = "1px";
	PB.supported.boxModel = o.offsetWidth === 2;
	o.style.borderLeft = "1px solid #000";
	PB.supported.substractBorder = o.offsetWidth === 3;
	s.removeChild(q);
	q = s = o = null;
	l.PB_EL_CACHE = g.element_cache = {};
	g.toArray = function (a) {
		try {
			a = t.call(a)
		} catch (b) {
			var c, d = [],
				e = 0;
			for (c = a.length; e < c; e++) d[e] = a[e];
			a = d
		}
		return a
	};
	PB.Element = function (a) {
		this.node = a;
		if (this.node.nodeName) this.nodeName = this.node.nodeName.toUpperCase();
		this.__storage = {}
	};
	Object.extend(PB.Element.prototype, {
		hasClass: function (a) {
			return RegExp("(^|\\s)" + a + "($|\\s)").test(this.node.className)
		},
		addClass: function (a) {
			if (Array.isArray(a) === true) return a.forEach(this.addClass, this), this;
			var b = this.node;
			if (this.hasClass(a)) return this;
			b.className === "" ? b.className = a : b.className += " " + a;
			return this
		},
		removeClass: function (a) {
			if (Array.isArray(a) === true) return a.forEach(this.removeClass, this), this;
			var b = this.node;
			b.className = b.className.replace(RegExp("(^|\\s+)" + a + "(\\s+|$)"), " ").trim();
			b.className === "" && this.attr("class", null);
			return this
		},
		getStyle: function (a, b) {
			return PB.Style.setNode(this.node).get(a, b)
		},
		setStyle: function (a, b) {
			var c = PB.Style.setNode(this.node),
				d;
			if (typeof b !== "undefined") return c.set(a, b), this;
			for (d in a) c.set(d, a[d]);
			return this
		},
		show: function () {
			var a = this.__storage;
			this.setStyle({
				display: a.css_display || "block"
			});
			a.css_display = null;
			return this
		},
		hide: function () {
			var a = this.__storage,
				b = this.getStyle("display");
			if (b === "none") return this;
			a.css_display = b;
			this.setStyle({
				display: "none"
			});
			return this
		},
		isVisible: function () {
			return this.getStyle("display") !== "none"
		},
		offsetParent: function () {
			for (var a = this.node.parentNode; a;) {
				if (PB(a).getStyle("position") !== "static") break;
				a = a.parentNode
			}
			return PB(a)
		},
		getXY: function () {},
		offset: function () {
			var a = this.node,
				b = 0,
				c = 0;
			do
			if (b += a.offsetLeft, c += a.offsetTop, PB(a).getStyle("position") !== "static") break;
			while (a = a.offsetParent);
			return {
				left: b,
				top: c
			}
		},
		position: function () {
			for (var a = this.node, b = 0, c = 0; a;) b += a.offsetLeft, c += a.offsetTop, a = a.offsetParent;
			return {
				left: b,
				top: c
			}
		},
		viewportPosition: function () {
			var a = this.position();
			a.top -= l.pageYOffset || h.body.scrollTop || h.documentElement.scrollTop;
			a.left -= l.pageXOffset || h.body.scrollLeft || h.documentElement.scrollLeft;
			return a
		},
		width: function (a) {
			if (typeof a !== "undefined") return this.setStyle("width", a), this;
			var b = this.node,
				c;
			if (b === l) {
				b = h.compatMode === "CSS1Compat" ? u : h.body;
				c = b.style.overflow;
				if (c === "" || c === "hidden") b.style.overflow = "hidden";
				a = b.clientWidth;
				b.style.overflow = c;
				return a
			} else if (b.nodeType === 9) return Math.max(b.documentElement.clientWidth, b.body.scrollWidth, b.documentElement.scrollWidth, b.body.offsetWidth, b.documentElement.offsetWidth);
			a = this.getStyle("width");
			if (a > 0) return a;
			c = this.isVisible();
			c === false && this.show();
			a = b.offsetWidth;
			c === false && this.hide();
			PB.supported.boxModel && (a -= (parseInt(this.getStyle("paddingLeft"), 10) || 0) + (parseInt(this.getStyle("paddingRight"), 10) || 0));
			PB.supported.substractBorder && (a -= (parseInt(this.getStyle("borderLeftWidth"), 10) || 0) + (parseInt(this.getStyle("borderRightWidth"), 10) || 0));
			return a
		},
		innerWidth: function () {
			return this.width() + (this.getStyle("paddingLeft") + this.getStyle("paddingRight"))
		},
		outerWidth: function () {
			var a = this.getStyle("borderRightWidth");
			return this.innerWidth() + (this.node.clientLeft + (typeof a === "string" ? 0 : a))
		},
		height: function (a) {
			if (typeof a !== "undefined") return this.setStyle("height", a), this;
			var b = this.node,
				c;
			if (b === l) {
				b = h.compatMode === "CSS1Compat" ? h.documentElement : h.body;
				c = b.style.overflow;
				if (c === "" || c === "hidden") b.style.overflow = "hidden";
				a = b.clientHeight;
				b.style.overflow = c;
				return a
			} else if (b.nodeType === 9) return Math.max(b.documentElement.clientHeight, b.body.scrollHeight, b.documentElement.scrollHeight, b.body.offsetHeight, b.documentElement.offsetHeight);
			a = this.getStyle("height");
			if (a > 0) return a;
			c = this.isVisible();
			c === false && this.show();
			a = b.offsetHeight;
			c === false && this.hide();
			PB.supported.boxModel && (a -= (parseInt(this.getStyle("paddingTop"), 10) || 0) + (parseInt(this.getStyle("paddingBottom"), 10) || 0));
			PB.supported.substractBorder && (a -= (parseInt(this.getStyle("borderTopWidth"), 10) || 0) + (parseInt(this.getStyle("borderBottomWidth"), 10) || 0));
			return a
		},
		innerHeight: function () {
			return this.height() + (this.getStyle("paddingTop") + this.getStyle("paddingBottom"))
		},
		outerHeight: function () {
			var a = this.getStyle("borderBottomWidth");
			return this.height() + (this.node.clientTop + (typeof a === "string" ? 0 : a))
		},
		scrollHeight: function () {
			return this.node.scrollHeight
		},
		scrollWidth: function () {
			return this.node.scrollWidth
		},
		left: function () {
			return this.offset().left
		},
		top: function () {
			return this.offset().top
		},
		getScroll: function () {
			var a = this.node,
				b = h.body,
				c = {};
			a === h || a === b || a === l ? (c.left = PB.isStrict ? u.scrollLeft : l.pageXOffset, c.top = u.scrollTop ? u.scrollTop : l.pageYOffset, c.left = c.left || b.scrollLeft, c.top = c.top || b.scrollTop) : (c.left = a.scrollLeft, c.top = a.scrollTop);
			return c
		},
		scrollTo: function (a, b) {
			this.node.scrollLeft = a;
			this.node.scrollTop = b;
			return this
		}
	});
	Object.extend(PB.Element.prototype, {
		append: function (a) {
			if ((a = PB(a)) === null) return null;
			this.node.appendChild(a.node);
			return this
		},
		appendTo: function (a) {
			if ((a = PB(a)) === null) return null;
			a.append(this);
			return this
		},
		insertBefore: function (a) {
			if ((a = PB(a)) === null) return null;
			a.parent().node.insertBefore(this.node, a.node);
			return this
		},
		insertAfter: function (a) {
			var b;
			if ((a = PB(a)) === null) return null;
			(b = a.next()) instanceof PB.Element ? a.parent().node.insertBefore(this.node, b.node) : a.parent().node.appendChild(this.node);
			return this
		},
		insertFirst: function (a) {
			if ((a = PB(a)) === null) return null;
			a.first() === null ? a.append(this) : this.insertBefore(a.first());
			return this
		},
		replace: function (a) {
			if ((a = PB(a)) === null) return null;
			this.insertBefore(a);
			a.remove();
			return this
		},
		wrap: function () {},
		unwrap: function () {},
		clone: function (a) {
			a = this.node.cloneNode(a);
			try {
				delete a.id, delete a.__PBID__
			} catch (b) {
				a.id = null, a.__PBID__ = null
			}
			return PB(a)
		},
		html: function (a) {
			if (typeof a === "undefined") return this.node.innerHTML;
			this.node.innerHTML = a;
			return this
		},
		empty: function () {
			this.childs().forEach(function (a) {
				a.remove()
			});
			return this
		},
		remove: function () {
			var a = this.node;
			typeof this.__storage.morph !== "undefined" && this.__storage.morph.stop();
			try {
				delete g.element_cache[a.__PBID__]
			} catch (b) {
				alert(b.message)
			}
			g.Event.purge(a.__PBID__);
			a.parentNode && a.parentNode.removeChild(a);
			this.node = null
		}
	});
	Object.extend(PB.Element.prototype, {
		attr: function (a, b) {
			var c = this.node;
			if (typeof b === "undefined") return c.getAttribute(a);
			else b === null ? c.removeAttribute(a) : c.setAttribute(a, b);
			return this
		}
	});
	Object.extend(PB.Element.prototype, {
		val: function (a) {
			if (typeof a === "undefined") return this.node.value;
			this.node.value = a;
			return this
		},
		serializeForm: function () {
			var a = g.toArray(this.node.elements),
				b, c = {},
				d = /file|undefined|reset|button|submit|fieldset/i,
				e = /radio|checkbox/i;
			if (this.nodeName !== "FORM") throw Error("No form found for serialize");
			a.forEach(function (a) {
				b = a.type;
				if (d.test(b) === false && (e.test(b) !== true || a.checked)) b === "select-multiple" ? (c[a.name] = [], g.toArray(a.options).forEach(function (b) {
					b.selected && c[a.name].push(b.value)
				})) : c[a.name] = a.value
			});
			return c
		}
	});
	g.Event = {
		supports_mouseenter_mouseleave: "onmouseenter" in h.documentElement && "onmouseleave" in h.documentElement,
		manualExtend: false,
		cache: {},
		createResponder: function (a, b, c) {
			return function (b) {
				var e = g.Event.cache[a],
					b = g.Event.extend(b, a);
				c.call(e.node, b)
			}
		},
		purge: function (a) {
			var b = g.Event.cache[a],
				c;
			if (b) c = b.node, Object.keys(b).forEach(function (a) {
				a !== "node" && PB(c).stop(a)
			}), delete g.Event.cache[a], c = null
		},
		extend: function (a, b) {
			if (g.Event.manualExtend === false) return a;
			var c = h.documentElement,
				d = h.body;
			Object.extend(a, g.Event.methods);
			a.target = a.srcElement || g.Event.cache[b].node;
			switch (a.type) {
			case "mouseover":
			case "mouseenter":
				a.relatedTarget = a.fromElement;
				break;
			case "mouseout":
			case "mouseleave":
				a.relatedTarget = a.toElement
			}
			if (!a.pageX || !a.pageY) a.pageX = a.clientX + (c.scrollLeft || d.scrollLeft) - (c.clientLeft || 0), a.pageY = a.clientY + (c.scrollTop || d.scrollTop) - (c.clientTop || 0);
			a.which = typeof a.keyCode === "undefined" ? a.charCode : a.keyCode;
			return a
		}
	};
	g.Event.methods = {
		stop: function () {
			this.preventDefault();
			this.stopPropagation()
		}
	};
	l.addEventListener && Object.extend(Event.prototype, g.Event.methods);
	if (l.attachEvent && !l.addEventListener) g.Event.manualExtend = true, Object.extend(g.Event.methods, {
		stopPropagation: function () {
			this.cancelBubble = true
		},
		preventDefault: function () {
			this.returnValue = false
		}
	});
	Object.extend(PB.Element.prototype, {
		on: function (a, b) {
			var c = this.node,
				d = c.__PBID__,
				e = g.Event.cache[d],
				p;
			a === "mouseenter" && g.Event.supports_mouseenter_mouseleave === false ? a = "mouseover" : a === "mouseleave" && g.Event.supports_mouseenter_mouseleave === false && (a = "mouseout");
			e || (g.Event.cache[d] = e = {
				node: c
			});
			e[a] || (e[a] = []);
			e = e[a];
			for (p = e.length; p--;) if (e[p].handler === b) return this;
			d = {
				handler: b,
				responder: g.Event.createResponder(d, a, b)
			};
			e.push(d);
			c.addEventListener ? c.addEventListener(a, d.responder, false) : c.attachEvent("on" + a, d.responder);
			return this
		},
		stop: function (a, b) {
			var c = this.node,
				d = c.__PBID__,
				e = g.Event.cache[d],
				p, f;
			if (!e) return this;
			if (!a) return g.Event.purge(d), this;
			e = e[a];
			if (!e) return this;
			f = e.length;
			if (!b) {
				for (; f--;) this.stop(a, e[f].handler);
				return this
			}
			for (; f--;) if (e[f].handler === b) {
				p = e[f];
				e.splice(f, 1);
				e.length || delete g.Event.cache[d][a];
				break
			}
			if (!p) return this;
			c.removeEventListener ? c.removeEventListener(a, p.responder, false) : c.detachEvent("on" + a, p.responder);
			return this
		},
		fire: function (a) {
			if (document.createEvent) {
				var b = document.createEvent("MouseEvents");
				b.initMouseEvent(a, true, true, l, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
				this.node.dispatchEvent(b)
			} else b = document.createEventObject(), this.node.fireEvent("on" + a, b)
		}
	});
	PB.Style = function (a) {
		var b = h.defaultView && h.defaultView.getComputedStyle,
			c = function () {};
		c.prototype = {
			unitRegex: /px$/i,
			IEOpacity: /alpha\(opacity=(.*)\)/i,
			getHooks: {
				border: "borderLeftWidth borderLeftStyle borderLeftColor",
				borderColor: "borderLeftColor",
				borderWidth: "borderLeftWidth",
				borderStyle: "borderLeftStyle",
				padding: "paddingTop paddingRight paddingBottom paddingLeft",
				margin: "marginTop marginRight marginBottom marginLeft",
				borderRadius: "borderRadiusTopleft",
				MozBorderRadius: "MozBorderRadiusTopleft"
			},
			noUnits: ["zIndex", "zoom", "fontWeight", "opacity"],
			addUnits: function (a, b) {
				return this.noUnits.indexOf(b) >= 0 ? a : typeof a === "string" ? a : a + "px"
			},
			removeUnits: function (a) {
				return this.unitRegex.test(a) ? parseInt(a, 10) : a
			},
			setNode: function (a) {
				this.node = a.node || a;
				return this
			},
			get: function (b, c) {
				b === "float" && (b = a.cssFloat ? "cssFloat" : "styleFloat");
				return c === true ? this.getComputedStyle(b) : this.getDOMStyle(b) || this.getComputedStyle(b)
			},
			getDOMStyle: function (b) {
				var c = this.node.style[b];
				if (b === "opacity") {
					if (a.cssOpacity === false) {
						c = this.node.style.filter;
						return !c ? null : (c = c.match(this.IEOpacity)) && c[1] ? parseFloat(c[1]) / 100 : null
					}
					return c ? parseFloat(c) : null
				}
				return c === null || c === "auto" ? null : this.removeUnits(c)
			},
			getComputedStyle: function () {
				return b ?
				function (a) {
					var b = h.defaultView.getComputedStyle(this.node, null),
						c;
					if (a in this.getHooks) return c = this.getHooks[a].split(" ").map(function (a) {
						return b[a]
					}), c.length === 1 ? this.removeUnits(c[0]) : c.join(" ");
					c = b[a];
					return a === "opacity" ? c ? parseFloat(c) : 1 : c === "auto" ? 0 : this.removeUnits(c)
				} : function (a) {
					var b = this.node.currentStyle;
					if (a in this.getHooks) return a = this.getHooks[a].split(" ").map(function (a) {
						return b[a]
					}), a.length === 1 ? this.removeUnits(a[0]) : a.join(" ");
					if (a === "opacity") return a = b.filter, (a = a.match(this.IEOpacity)) && a[1] ? parseInt(a[1]) / 100 : 1;
					a = b[a];
					return typeof a === "undefined" ? null : a === "auto" ? 0 : this.removeUnits(a)
				}
			}(),
			set: function (a, b) {
				a === "opacity" ? this.setOpacity(b) : this.node.style[a] = this.addUnits(b, a)
			},
			setOpacity: function () {
				return a.cssOpacity ?
				function (a) {
					this.node.style.opacity = a.toString()
				} : function (a) {
					this.node.style.filter = "alpha(opacity=" + a * 100 + ")"
				}
			}()
		};
		return new c
	}(PB.supported);
	Object.extend(PB.Element.prototype, {
		parent: function () {
			return PB(this.node.parentNode)
		},
		childs: function () {
			var a = [],
				b = this.node.firstChild;
			if (!b) return a;
			do b.nodeType === 1 && a.push(PB(b));
			while (b = b.nextSibling);
			return a
		},
		next: function () {
			for (var a = this.node; a = a.nextSibling;) if (a.nodeType === 1) return PB(a);
			return null
		},
		prev: function () {
			for (var a = this.node; a = a.previousSibling;) if (a.nodeType === 1) return PB(a);
			return null
		},
		first: function () {
			var a = this.node.firstChild;
			do
			if (a.nodeType === 1) return PB(a);
			while (a = a.nextSibling);
			return null
		},
		last: function () {
			var a = this.node.lastChild;
			do
			if (a.nodeType === 1) return PB(a);
			while (a = a.previousSibling);
			return null
		},
		descendantOf: function (a) {
			var b = this.node,
				c = 50,
				d = PB(h.body),
				a = PB(a).node;
			do {
				if (b === a) return true;
				if (!--c || b === d) break
			} while (b = b.parentNode);
			return false
		},
		find: function (a) {
			try {
				return g.toArray(this.node.querySelectorAll(a)).map(PB)
			} catch (b) {}
			return l.Sizzle(a, this.node).map(PB)
		},
		closest: function (a, b) {
			var c = this;
			PB(h.body);
			var d = l.Sizzle.matches,
				e = [],
				f, b = b || 50;
			do {
				e[0] = c.node;
				f = d(a, e);
				if (f.length) return PB(f[0]);
				if (!--b) break
			} while (c = c.parent());
			return null
		},
		matches: function (a) {
			return l.Sizzle.matches(a, [this.node]).length > 0
		}
	});
	PB.Animation_Observer = function () {
		this.isRunning = false;
		this.timerID = null;
		this.observers = [];
		this.notifyWrapper = this.notify.bind(this)
	};
	PB.Animation_Observer.prototype = {
		attach: function (a) {
			this.observers.indexOf(a) >= 0 || (this.observers.push(a), this.isRunning === false && this.start())
		},
		detach: function (a) {
			this.observers.remove(a);
			this.isRunning === true && this.observers.length === 0 && this.stop()
		},
		notify: function () {
			var a = Date.now();
			this.observers.forEach(function (b) {
				b && b.update(a)
			})
		},
		start: function () {
			this.isRunning = true;
			this.timerID = setInterval(this.notifyWrapper, 25)
		},
		stop: function () {
			this.isRunning = false;
			clearTimeout(this.timerID)
		}
	};
	PB.Animation_Observer = new PB.Animation_Observer;
	var f = {};
	PB.Morph = function () {
		this.isRunning = false;
		this.cssText = "";
		this.color = new PB.Color
	};
	PB.Morph.prototype = {
		colorProperties: ["backgroundColor", "borderColor", "color", "outlineColor"],
		decamalizeExp: /([A-Z])/g,
		reset: function (a, b) {
			this.isRunning === true && this.stop();
			this.element = a;
			this.after = b.after;
			this.duration = b.duration * 1E3;
			this.effect = PB.MorphEffects[b.effect] || PB.MorphEffects.ease;
			this.styleInfo = {};
			this.cssText = (this.element.node.style.cssText || "").toLowerCase();
			this.cssText !== "" && this.cssText.charAt(this.cssText.length - 1) !== ";" && (this.cssText += ";");
			Object.forEach(b.to, this.setStartEndStyles, this);
			return this
		},
		setStartEndStyles: function (a, b) {
			var c = this.element.getStyle(b, true),
				d, e = 0,
				f = b.replace(this.decamalizeExp, "-$1").toLowerCase();
			typeof c !== "undefined" && (typeof a === "number" ? (typeof c === "string" && c.charAt(c.length - 1) === "%" && (c = this.percentToPixel(b)), e = a - c, d = b === "opacity" ? 0 : "px") : a.charAt(a.length - 1) === "%" ? (c = parseFloat(c) === c ? this.pixelToPercent(b, c) : parseFloat(c), a = parseFloat(a), e = a - c, d = "%") : this.colorProperties.indexOf(b) >= 0 && (c === "transparent" && (c = "#FFFFFF"), a = new PB.Color(a), c = new PB.Color(c), e = a.diff(c), d = "color"), this.styleInfo[b] = {
				to: a,
				from: c,
				diff: e,
				unit: d,
				realCssName: f
			}, this.cssText !== "" && this.removeFromCssText(f))
		},
		percentToPixel: function (a) {
			switch (a) {
			case "height":
				return this.element.height();
			case "width":
				return this.element.width();
			case "left":
				return this.element.offset().left;
			case "top":
				return this.element.offset().top
			}
			return 0
		},
		pixelToPercent: function (a, b) {
			for (var c = this.element.parent(), d = h.body; c;) {
				if (c.getStyle("position") === "absolute" || c.node === d) break;
				c = c.parent()
			}
			c.node === d && (c = PB(h));
			b = parseFloat(b);
			switch (a) {
			case "left":
			case "right":
			case "width":
				return b / (c.width() / 100);
			case "top":
			case "bottom":
			case "height":
				return b / (c.height() / 100);
			default:
				return 0
			}
		},
		removeFromCssText: function (a) {
			typeof f[a] === "undefined" && (f[a] = RegExp("((^|\\s)" + a + ":\\s[a-z0-9.()=\\s,]+;)"));
			this.cssText = this.cssText.replace(f[a], "")
		},
		start: function () {
			this.isRunning = true;
			this.startedAt = Date.now();
			this.endsAt = this.startedAt + this.duration;
			PB.Animation_Observer.attach(this);
			return this
		},
		update: function (a) {
			var b = 1 - (this.endsAt - a) / this.duration;
			a >= this.endsAt ? (this.render(1), this.stop()) : this.render(b)
		},
		stop: function (a) {
			if (this.isRunning === false) return this;
			var b = this.after,
				c = this.element;
			PB.Animation_Observer.detach(this);
			a === true && this.render(1);
			this.after = this.element = null;
			this.isRunning = false;
			b && b(c);
			return this
		},
		render: function (a) {
			for (var b = Object.keys(this.styleInfo), c = this.cssText, d = b.length, e = this.effect(a), f; d--;) a = this.styleInfo[b[d]], a.unit === "color" ? (f = a.from.get(), this.color.set(f.R + a.diff.R * e, f.G + a.diff.G * e, f.B + a.diff.B * e), c += a.realCssName + ": " + this.color.toRGB() + "; ") : (f = a.from + a.diff * e, c += a.realCssName === "opacity" && PB.supported.cssOpacity === false ? "filter: alpha(opacity=" + f * 100 + "); " : a.realCssName + ": " + (f + a.unit) + "; ");
			this.element.node.style.cssText = c
		}
	};
	PB.MorphEffects = {
		linear: function (a) {
			return a
		},
		ease: function (a) {
			return a
		},
		easeIn: function (a) {
			return a * a
		},
		easeOut: function (a) {
			return -1 * a * (a - 2)
		},
		easeInOut: function (a) {
			return a
		},
		bounce: function (a) {
			return a < 1 / 2.75 ? 7.5625 * a * a : a < 2 / 2.75 ? 7.5625 * (a -= 1.5 / 2.75) * a + 0.75 : a < 2.5 / 2.75 ? 7.5625 * (a -= 2.25 / 2.75) * a + 0.9375 : 7.5625 * (a -= 2.625 / 2.75) * a + 0.984375
		},
		backIn: function (a) {
			return a * a * (2.70158 * a - 1.70158)
		},
		backOut: function (a) {
			return (a -= 1) * a * (2.70158 * a + 1.70158) + 1
		},
		elasticIn: function (a) {
			return a === 0 ? 0 : a === 1 ? 1 : -(1 * Math.pow(2, 10 * (a -= 1)) * Math.sin((a - 0.075) * 2 * Math.PI / 0.3))
		},
		elasticOut: function (a) {
			return a === 0 ? 0 : a === 1 ? 1 : 1 * Math.pow(2, -10 * a) * Math.sin((a - 0.075) * 2 * Math.PI / 0.3) + 1
		}
	};
	Object.extend(PB.Element.prototype, {
		morph: function (a) {
			var b = {
				to: a,
				duration: 0.4,
				effect: "easeOut"
			},
				c = 1;
			if (typeof this.__storage.morph === "undefined") this.__storage.morph = new PB.Morph;
			for (; c < arguments.length; c++) switch (typeof arguments[c]) {
			case "function":
				b.after = arguments[c];
				break;
			case "number":
				b.duration = arguments[c];
				break;
			case "string":
				b.effect = arguments[c]
			}
			this.__storage.morph.reset(this, b).start()
		},
		stopMorph: function (a) {
			typeof a !== "boolean" && (a = true);
			if (typeof this.__storage.morph === "undefined") return this;
			this.__storage.morph.stop(a);
			return this
		}
	});
	PB.Http = {
		buildQuery: function (a, b) {
			var c = "";
			if (typeof a === "string") return a;
			else Array.isArray(a) === true ? a.forEach(function (a, e) {
				c += typeof a === "object" ? PB.Http.buildQuery(a, (b || e) + "[]") : (b || e) + "=" + encodeURIComponent(a) + "&"
			}) : Object.isObject(a) === true && Object.keys(a).forEach(function (d) {
				c += typeof a[d] === "object" ? PB.Http.buildQuery(a[d], d + "[]") : (b || d) + "=" + encodeURIComponent(a[d]) + "&"
			});
			return c.trimRight("&")
		}
	};
	PB.Request = PB.Class({
		transports: [function () {
			return new ActiveXObject("Microsoft.XMLHTTP")
		}, function () {
			return new ActiveXObject("Msxml2.XMLHTTP")
		}, function () {
			return new ActiveXObject("Msxml3.XMLHTTP")
		}, function () {
			return new XMLHttpRequest
		}],
		readyStateEvents: "unsent,opened,headers,loading,end".split(","),
		constructor: function (a) {
			this.parent().constructor.apply(this);
			this.transport = false;
			Object.extend(this, PB.Request.defaults);
			Object.extend(this, a)
		},
		set: function (a, b) {
			switch (a) {
			case "header":
			case "headers":
				Object.isObject(b) === true && Object.extend(this.headers, b);
				break;
			default:
				this[a] = b
			}
			return this
		},
		getTransport: function () {
			for (var a = this.transports.length; a--;) try {
				return this.transport = this.transports[a]()
			} catch (b) {}
		},
		send: function () {
			var a = this.transport || this.getTransport(),
				b = this.url,
				c = this.method.toUpperCase(),
				d = this.data ? PB.Http.buildQuery(this.data) : null;
			d !== null && c !== "POST" && c !== "PUT" && (b += (b.indexOf("?") === -1 ? "?" : "&") + d, d = null);
			a.onreadystatechange = this.onreadystatechange.bind(this);
			a.open(c, b, this.async);
			(c === "POST" || c === "PUT") && a.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=" + this.charset);
			Object.forEach(this.headers, function (b, c) {
				a.setRequestHeader(c, b)
			});
			a.send(d);
			return this
		},
		abort: function () {
			this.transport.abort();
			this.emit("abort");
			return this
		},
		onreadystatechange: function () {
			var a = this.transport;
			if (a.readyState === 4) if (a.responseJSON = null, a.status >= 200 && a.status < 300) {
				if (a.getResponseHeader("Content-type").indexOf("application/json") >= 0) a.responseJSON = JSON.parse(a.responseText);
				this.emit("success", a, a.status)
			} else this.emit("error", a, a.status);
			this.emit(this.readyStateEvents[a.readyState], a, a.readyState > 1 ? a.status : 0)
		}
	}).extend(PB.Pattern.Observer);
	PB.Request.defaults = {
		url: null,
		data: null,
		method: "GET",
		contentType: "application/x-www-form-urlencoded",
		async: true,
		username: null,
		password: null,
		charset: "UTF-8",
		headers: {
			"X-Requested-With": "PBJS-" + PB.VERSION,
			Accept: "text/javascript, text/html, application/xml, text/xml, */*"
		},
		crossDomain: false
	};
	g.ajaxHandlers = [];
	g.ajax = function (a) {
		this.options = Object.clone(g.ajax.options);
		this.available = false;
		this.setOptions(a);
		this.xmlHttp = this.createTransport();
		this.readyStateChangeWrapper = this.readyStateChange.bind(this);
		this.send();
		g.ajaxHandlers.push(this)
	};
	g.ajax.prototype = {
		setOptions: function (a) {
			if (a.headers) a.headers = Object.extend(Object.clone(this.options.headers), a.headers);
			Object.extend(this.options, a);
			return this
		},
		createTransport: function () {
			try {
				return new XMLHttpRequest
			} catch (a) {}
			try {
				return new ActiveXObject("Msxml2.XMLHTTP")
			} catch (b) {}
			try {
				return new ActiveXObject("Msxml3.XMLHTTP")
			} catch (c) {}
			try {
				return new ActiveXObject("Microsoft.XMLHTTP")
			} catch (d) {}
			return null
		},
		send: function () {
			var a = this.options,
				b = this.options.url,
				c = a.method.toUpperCase(),
				d = this.xmlHttp,
				e = a.data ? PB.Http.buildQuery(a.data) : null;
			this.available = false;
			a.before && a.before(this);
			e !== null && c !== "POST" && c !== "PUT" && (b += (b.indexOf("?") === -1 ? "?" : "&") + e, e = null);
			d.open(c, b, a.asynchronous);
			d.onreadystatechange = this.readyStateChangeWrapper;
			(c === "POST" || c === "PUT") && d.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=" + a.charset);
			Object.forEach(a.headers, function (a, b) {
				d.setRequestHeader(b, a)
			});
			try {
				d.send(e)
			} catch (f) {}
			return this
		},
		abort: function () {
			this.xmlHttp.abort()
		},
		readyStateChange: function () {
			var a = this.xmlHttp,
				b;
			if (a.readyState === 4) {
				if (a.status >= 200 && a.status < 300) {
					if (b = a.getResponseHeader("Content-type"), this.options.update && this.options.update.html(a.responseText, true), this.options.success) {
						a.responseJSON = null;
						if (b.indexOf("application/json") !== -1) a.responseJSON = JSON.parse(a.responseText);
						this.options.success(a, a.status)
					}
				} else this.options.error && this.options.error(a, a.status);
				this.options.done && this.options.done();
				a.responseJSON = null;
				a.onreadystatechange = null;
				this.available = true
			}
		}
	};
	g.ajax.options = {
		url: null,
		method: "GET",
		contentType: "application/x-www-form-urlencoded",
		asynchronous: true,
		charset: "UTF-8",
		username: null,
		password: null,
		headers: {
			"X-Requested-With": "PBJS-" + PB.VERSION,
			Accept: "text/javascript, text/html, application/xml, text/xml, */*"
		}
	};
	PB.ajax = function (a) {
		for (var b = g.ajaxHandlers, c = b.length; c--;) if (b[c].available === true) return b[c].setOptions(a).send();
		return new g.ajax(a)
	};
	PB.ajax.options = function (a) {
		g.ajax.options = Object.extend(g.ajax.options, a)
	};
	(function () {
		var a = /RGB\((\d+),\s?(\d+),\s?(\d+)\)?/i,
			b = /RGBA\((\d+),\s?(\d+),\s?(\d+),\s?(\d+.\d+)\)?/i;
		PB.Color = function (a) {
			this.color = {
				R: 0,
				G: 0,
				B: 0,
				A: 1
			};
			a && this.setColorProperties(a)
		};
		PB.Color.prototype = {
			setColorProperties: function (c) {
				var d;
				Object.isObject(c) ? this.set(c.R, c.G, c.B, c.A || 0) : c.charAt(0) === "#" ? (c.length === 4 && (c = "#" + c.charAt(1).pad(2) + c.charAt(2).pad(2) + c.charAt(3).pad(2)), d = {
					R: parseInt(c.substr(1, 2), 16),
					G: parseInt(c.substr(3, 2), 16),
					B: parseInt(c.substr(5, 2), 16)
				}, this.set(d.R, d.G, d.B)) : Array.isArray(d = c.match(a)) === true ? this.set(parseInt(d[1]), parseInt(d[2]), parseInt(d[3])) : Array.isArray(d = c.match(b)) === true && this.set(parseInt(d[1]), parseInt(d[2]), parseInt(d[3]), parseInt(d[4]))
			},
			set: function (a, b, e, f) {
				this.color.R = Math.round(a);
				this.color.G = Math.round(b);
				this.color.B = Math.round(e);
				this.color.A = f || 1
			},
			get: function () {
				return this.color
			},
			sub: function (a, b, e, f) {
				this.add(-a, -b, -e, -f || 0)
			},
			add: function (a, b, e, f) {
				this.color.R += a;
				this.color.R = this.color.R < 0 ? 0 : this.color.R > 255 ? 255 : this.color.R;
				this.color.G += b;
				this.color.G = this.color.G < 0 ? 0 : this.color.G > 255 ? 255 : this.color.G;
				this.color.B += e;
				this.color.B = this.color.B < 0 ? 0 : this.color.B > 255 ? 255 : this.color.B;
				this.color.A += f || 0;
				this.color.A = this.color.A < 0 ? 0 : this.color.A > 1 ? 1 : this.color.A
			},
			diff: function (a) {
				var b = this.get();
				if (a instanceof PB.Color === false) return null;
				a = a.get();
				return {
					R: b.R - a.R,
					G: b.G - a.G,
					B: b.B - a.B,
					A: b.A - a.A
				}
			},
			toRGB: function () {
				return "RGB(" + this.color.R + ", " + this.color.G + ", " + this.color.B + ")"
			},
			toRGBA: function () {
				return "RGBA(" + this.color.R + ", " + this.color.G + ", " + this.color.B + ", " + this.color.A + ")"
			},
			toHex: function () {
				var a = this.color.R.toString(16),
					b = this.color.G.toString(16),
					e = this.color.B.toString(16);
				return "#" + (a.length == 1 ? "0" + a : a) + (b.length == 1 ? "0" + b : b) + (e.length == 1 ? "0" + e : e)
			},
			clone: function () {
				return new PB.Color(this.get())
			}
		}
	})();
	PB.ready = function () {
		function a() {
			var d;
			if (b !== true && h.readyState === "complete") {
				b = true;
				h[e](f + "DOMContentLoaded", a, false);
				h[e](f + "readystatechange", a, false);
				for (l[e](f + "load", a, false); d = c.shift();) d();
				c = null
			}
		}
		var b = false,
			c = [],
			d = h.addEventListener ? "addEventListener" : "attachEvent",
			e = h.addEventListener ? "removeEventListener" : "detachEvent",
			f = h.addEventListener ? "" : "on";
		h.readyState === "complete" ? a() : (h[d](f + "DOMContentLoaded", a, false), h[d](f + "readystatechange", a, false), l[d](f + "load", a, false));
		return function (a) {
			b === true ? a() : c.indexOf(a) === -1 && c.push(a)
		}
	}();
	var j = PB.Template = PB.Class({
		cachedFor: /\{for:?(\d+)? (\w+) in ([\w\.]+)\}(.*?)\{endfor:?\1+?\}/g,
		cachedVar: /\{([\w\.]+)\|?([\w_-]+)?:?(.*?)\}/g,
		rendered: null,
		constructor: function (a, b) {
			this.template = b ? a : this.clean(a)
		},
		clean: function (a) {
			return a = a.replace(/\n+/g, "").replace(/\t+/g, "").replace(/<\!--.*?--\>/g, "").replace(/[\s]{2,}/g, " ")
		},
		parse: function (a, b) {
			var c, b = b || this.template;
			c = b.replace(this.cachedFor, this.parseLoops.bind(this, a));
			return c = c.replace(this.cachedVar, this.parseVars.bind(this, a))
		},
		parseLoops: function (a, b, c, d, f, g) {
			var b = "",
				a = this._getByNameSpace(a, f),
				j;
			for (j in a) a.hasOwnProperty(j) === true && (b += this.parse(a[j], g));
			return b
		},
		parseStatements: function () {},
		parseVars: function (a, b, c, d, f) {
			a = this._getByNameSpace(a, c);
			d && j.Methods[d] && (f ? (f = f.split(","), f.unshift(a)) : f = [a], a = j.Methods[d].apply(null, f));
			return a
		},
		_getByNameSpace: function (a, b) {
			b = b.split(".");
			b.forEach(function (b) {
				a = a[b] || a
			});
			return a
		},
		appendTo: function (a, b) {
			var c = h.createDocumentFragment(),
				d = h.createElement("div"),
				f, a = PB(a).node;
			for (d.innerHTML = this.parse(b); f = d.firstChild;) c.appendChild(f);
			d = g.toArray(c.childNodes).map(PB);
			a.appendChild(c);
			return d
		}
	});
	j.Methods = {};
	j.register = function (a, b) {
		PB.Template.Methods[a] = b
	}
})(this);
(function () {
	function l(a, b, c, d, i, k) {
		for (var i = 0, f = d.length; i < f; i++) {
			var e = d[i];
			if (e) {
				for (var j = false, e = e[a]; e;) {
					if (e.sizcache === c) {
						j = d[e.sizset];
						break
					}
					if (e.nodeType === 1 && !k) e.sizcache = c, e.sizset = i;
					if (e.nodeName.toLowerCase() === b) {
						j = e;
						break
					}
					e = e[a]
				}
				d[i] = j
			}
		}
	}
	function g(a, b, c, d, i, k) {
		for (var i = 0, e = d.length; i < e; i++) {
			var n = d[i];
			if (n) {
				for (var j = false, n = n[a]; n;) {
					if (n.sizcache === c) {
						j = d[n.sizset];
						break
					}
					if (n.nodeType === 1) {
						if (!k) n.sizcache = c, n.sizset = i;
						if (typeof b !== "string") {
							if (n === b) {
								j = true;
								break
							}
						} else if (f.filter(b, [n]).length > 0) {
							j = n;
							break
						}
					}
					n = n[a]
				}
				d[i] = j
			}
		}
	}
	var t = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
		h = 0,
		u = Object.prototype.toString,
		s = false,
		v = true,
		q = /\\/g,
		o = /\W/;
	[0, 0].sort(function () {
		v = false;
		return 0
	});
	var f = function (b, c, r, x) {
			var r = r || [],
				i = c = c || document;
			if (c.nodeType !== 1 && c.nodeType !== 9) return [];
			if (!b || typeof b !== "string") return r;
			var k, e, n, g, h, l = true,
				o = f.isXML(c),
				m = [],
				p = b;
			do
			if (t.exec(""), k = t.exec(p)) if (p = k[3], m.push(k[1]), k[2]) {
				g = k[3];
				break
			}
			while (k);
			if (m.length > 1 && a.exec(b)) if (m.length === 2 && j.relative[m[0]]) e = y(m[0] + m[1], c);
			else for (e = j.relative[m[0]] ? [c] : f(m.shift(), c); m.length;) b = m.shift(), j.relative[b] && (b += m.shift()), e = y(b, e);
			else if (!x && m.length > 1 && c.nodeType === 9 && !o && j.match.ID.test(m[0]) && !j.match.ID.test(m[m.length - 1]) && (k = f.find(m.shift(), c, o), c = k.expr ? f.filter(k.expr, k.set)[0] : k.set[0]), c) {
				k = x ? {
					expr: m.pop(),
					set: d(x)
				} : f.find(m.pop(), m.length === 1 && (m[0] === "~" || m[0] === "+") && c.parentNode ? c.parentNode : c, o);
				e = k.expr ? f.filter(k.expr, k.set) : k.set;
				for (m.length > 0 ? n = d(e) : l = false; m.length;) k = h = m.pop(), j.relative[h] ? k = m.pop() : h = "", k == null && (k = c), j.relative[h](n, k, o)
			} else n = [];
			n || (n = e);
			n || f.error(h || b);
			if (u.call(n) === "[object Array]") if (l) if (c && c.nodeType === 1) for (b = 0; n[b] != null; b++) n[b] && (n[b] === true || n[b].nodeType === 1 && f.contains(c, n[b])) && r.push(e[b]);
			else for (b = 0; n[b] != null; b++) n[b] && n[b].nodeType === 1 && r.push(e[b]);
			else r.push.apply(r, n);
			else d(n, r);
			g && (f(g, i, r, x), f.uniqueSort(r));
			return r
		};
	f.uniqueSort = function (a) {
		if (p && (s = v, a.sort(p), s)) for (var b = 1; b < a.length; b++) a[b] === a[b - 1] && a.splice(b--, 1);
		return a
	};
	f.matches = function (a, b) {
		return f(a, null, null, b)
	};
	f.matchesSelector = function (a, b) {
		return f(b, null, null, [a]).length > 0
	};
	f.find = function (a, b, c) {
		var d;
		if (!a) return [];
		for (var i = 0, k = j.order.length; i < k; i++) {
			var e, f = j.order[i];
			if (e = j.leftMatch[f].exec(a)) {
				var g = e[1];
				e.splice(1, 1);
				if (g.substr(g.length - 1) !== "\\" && (e[1] = (e[1] || "").replace(q, ""), d = j.find[f](e, b, c), d != null)) {
					a = a.replace(j.match[f], "");
					break
				}
			}
		}
		d || (d = typeof b.getElementsByTagName !== "undefined" ? b.getElementsByTagName("*") : []);
		return {
			set: d,
			expr: a
		}
	};
	f.filter = function (a, b, c, d) {
		for (var i, k, e = a, g = [], h = b, l = b && b[0] && f.isXML(b[0]); a && b.length;) {
			for (var o in j.filter) if ((i = j.leftMatch[o].exec(a)) != null && i[2]) {
				var p, m, s = j.filter[o];
				m = i[1];
				k = false;
				i.splice(1, 1);
				if (m.substr(m.length - 1) !== "\\") {
					h === g && (g = []);
					if (j.preFilter[o]) if (i = j.preFilter[o](i, h, c, g, d, l)) {
						if (i === true) continue
					} else k = p = true;
					if (i) for (var q = 0;
					(m = h[q]) != null; q++) if (m) {
						p = s(m, i, q, h);
						var t = d ^ !! p;
						c && p != null ? t ? k = true : h[q] = false : t && (g.push(m), k = true)
					}
					if (p !== void 0) {
						c || (h = g);
						a = a.replace(j.match[o], "");
						if (!k) return [];
						break
					}
				}
			}
			if (a === e) if (k == null) f.error(a);
			else break;
			e = a
		}
		return h
	};
	f.error = function (a) {
		throw "Syntax error, unrecognized expression: " + a;
	};
	var j = f.selectors = {
		order: ["ID", "NAME", "TAG"],
		match: {
			ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
			CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
			NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
			ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
			TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
			CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
			POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
			PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
		},
		leftMatch: {},
		attrMap: {
			"class": "className",
			"for": "htmlFor"
		},
		attrHandle: {
			href: function (a) {
				return a.getAttribute("href")
			},
			type: function (a) {
				return a.getAttribute("type")
			}
		},
		relative: {
			"+": function (a, b) {
				var c = typeof b === "string",
					d = c && !o.test(b),
					c = c && !d;
				d && (b = b.toLowerCase());
				for (var d = 0, i = a.length, k; d < i; d++) if (k = a[d]) {
					for (;
					(k = k.previousSibling) && k.nodeType !== 1;);
					a[d] = c || k && k.nodeName.toLowerCase() === b ? k || false : k === b
				}
				c && f.filter(b, a, true)
			},
			">": function (a, b) {
				var c, d = typeof b === "string",
					i = 0,
					k = a.length;
				if (d && !o.test(b)) for (b = b.toLowerCase(); i < k; i++) {
					if (c = a[i]) c = c.parentNode, a[i] = c.nodeName.toLowerCase() === b ? c : false
				} else {
					for (; i < k; i++)(c = a[i]) && (a[i] = d ? c.parentNode : c.parentNode === b);
					d && f.filter(b, a, true)
				}
			},
			"": function (a, b, c) {
				var d, i = h++,
					k = g;
				typeof b === "string" && !o.test(b) && (d = b = b.toLowerCase(), k = l);
				k("parentNode", b, i, a, d, c)
			},
			"~": function (a, b, c) {
				var d, i = h++,
					k = g;
				typeof b === "string" && !o.test(b) && (d = b = b.toLowerCase(), k = l);
				k("previousSibling", b, i, a, d, c)
			}
		},
		find: {
			ID: function (a, b, c) {
				if (typeof b.getElementById !== "undefined" && !c) return (a = b.getElementById(a[1])) && a.parentNode ? [a] : []
			},
			NAME: function (a, b) {
				if (typeof b.getElementsByName !== "undefined") {
					for (var c = [], d = b.getElementsByName(a[1]), i = 0, k = d.length; i < k; i++) d[i].getAttribute("name") === a[1] && c.push(d[i]);
					return c.length === 0 ? null : c
				}
			},
			TAG: function (a, b) {
				if (typeof b.getElementsByTagName !== "undefined") return b.getElementsByTagName(a[1])
			}
		},
		preFilter: {
			CLASS: function (a, b, c, d, i, k) {
				a = " " + a[1].replace(q, "") + " ";
				if (k) return a;
				for (var k = 0, e;
				(e = b[k]) != null; k++) e && (i ^ (e.className && (" " + e.className + " ").replace(/[\t\n\r]/g, " ").indexOf(a) >= 0) ? c || d.push(e) : c && (b[k] = false));
				return false
			},
			ID: function (a) {
				return a[1].replace(q, "")
			},
			TAG: function (a) {
				return a[1].replace(q, "").toLowerCase()
			},
			CHILD: function (a) {
				if (a[1] === "nth") {
					a[2] || f.error(a[0]);
					a[2] = a[2].replace(/^\+|\s*/g, "");
					var b = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2] === "even" && "2n" || a[2] === "odd" && "2n+1" || !/\D/.test(a[2]) && "0n+" + a[2] || a[2]);
					a[2] = b[1] + (b[2] || 1) - 0;
					a[3] = b[3] - 0
				} else a[2] && f.error(a[0]);
				a[0] = h++;
				return a
			},
			ATTR: function (a, b, c, d, i, e) {
				b = a[1] = a[1].replace(q, "");
				!e && j.attrMap[b] && (a[1] = j.attrMap[b]);
				a[4] = (a[4] || a[5] || "").replace(q, "");
				a[2] === "~=" && (a[4] = " " + a[4] + " ");
				return a
			},
			PSEUDO: function (a, b, c, d, i) {
				if (a[1] === "not") if ((t.exec(a[3]) || "").length > 1 || /^\w/.test(a[3])) a[3] = f(a[3], null, null, b);
				else return a = f.filter(a[3], b, c, 1 ^ i), c || d.push.apply(d, a), false;
				else if (j.match.POS.test(a[0]) || j.match.CHILD.test(a[0])) return true;
				return a
			},
			POS: function (a) {
				a.unshift(true);
				return a
			}
		},
		filters: {
			enabled: function (a) {
				return a.disabled === false && a.type !== "hidden"
			},
			disabled: function (a) {
				return a.disabled === true
			},
			checked: function (a) {
				return a.checked === true
			},
			selected: function (a) {
				return a.selected === true
			},
			parent: function (a) {
				return !!a.firstChild
			},
			empty: function (a) {
				return !a.firstChild
			},
			has: function (a, b, c) {
				return !!f(c[3], a).length
			},
			header: function (a) {
				return /h\d/i.test(a.nodeName)
			},
			text: function (a) {
				var b = a.getAttribute("type"),
					c = a.type;
				return a.nodeName.toLowerCase() === "input" && "text" === c && (b === c || b === null)
			},
			radio: function (a) {
				return a.nodeName.toLowerCase() === "input" && "radio" === a.type
			},
			checkbox: function (a) {
				return a.nodeName.toLowerCase() === "input" && "checkbox" === a.type
			},
			file: function (a) {
				return a.nodeName.toLowerCase() === "input" && "file" === a.type
			},
			password: function (a) {
				return a.nodeName.toLowerCase() === "input" && "password" === a.type
			},
			submit: function (a) {
				var b = a.nodeName.toLowerCase();
				return (b === "input" || b === "button") && "submit" === a.type
			},
			image: function (a) {
				return a.nodeName.toLowerCase() === "input" && "image" === a.type
			},
			reset: function (a) {
				var b = a.nodeName.toLowerCase();
				return (b === "input" || b === "button") && "reset" === a.type
			},
			button: function (a) {
				var b = a.nodeName.toLowerCase();
				return b === "input" && "button" === a.type || b === "button"
			},
			input: function (a) {
				return /input|select|textarea|button/i.test(a.nodeName)
			},
			focus: function (a) {
				return a === a.ownerDocument.activeElement
			}
		},
		setFilters: {
			first: function (a, b) {
				return b === 0
			},
			last: function (a, b, c, d) {
				return b === d.length - 1
			},
			even: function (a, b) {
				return b % 2 === 0
			},
			odd: function (a, b) {
				return b % 2 === 1
			},
			lt: function (a, b, c) {
				return b < c[3] - 0
			},
			gt: function (a, b, c) {
				return b > c[3] - 0
			},
			nth: function (a, b, c) {
				return c[3] - 0 === b
			},
			eq: function (a, b, c) {
				return c[3] - 0 === b
			}
		},
		filter: {
			PSEUDO: function (a, b, c, d) {
				var i = b[1],
					e = j.filters[i];
				if (e) return e(a, c, b, d);
				else if (i === "contains") return (a.textContent || a.innerText || f.getText([a]) || "").indexOf(b[3]) >= 0;
				else if (i === "not") {
					b = b[3];
					c = 0;
					for (d = b.length; c < d; c++) if (b[c] === a) return false;
					return true
				} else f.error(i)
			},
			CHILD: function (a, b) {
				var c = b[1],
					d = a;
				switch (c) {
				case "only":
				case "first":
					for (; d = d.previousSibling;) if (d.nodeType === 1) return false;
					if (c === "first") return true;
					d = a;
				case "last":
					for (; d = d.nextSibling;) if (d.nodeType === 1) return false;
					return true;
				case "nth":
					var c = b[2],
						i = b[3];
					if (c === 1 && i === 0) return true;
					var e = b[0],
						f = a.parentNode;
					if (f && (f.sizcache !== e || !a.nodeIndex)) {
						for (var g = 0, d = f.firstChild; d; d = d.nextSibling) if (d.nodeType === 1) d.nodeIndex = ++g;
						f.sizcache = e
					}
					d = a.nodeIndex - i;
					return c === 0 ? d === 0 : d % c === 0 && d / c >= 0
				}
			},
			ID: function (a, b) {
				return a.nodeType === 1 && a.getAttribute("id") === b
			},
			TAG: function (a, b) {
				return b === "*" && a.nodeType === 1 || a.nodeName.toLowerCase() === b
			},
			CLASS: function (a, b) {
				return (" " + (a.className || a.getAttribute("class")) + " ").indexOf(b) > -1
			},
			ATTR: function (a, b) {
				var c = b[1],
					c = j.attrHandle[c] ? j.attrHandle[c](a) : a[c] != null ? a[c] : a.getAttribute(c),
					d = c + "",
					e = b[2],
					f = b[4];
				return c == null ? e === "!=" : e === "=" ? d === f : e === "*=" ? d.indexOf(f) >= 0 : e === "~=" ? (" " + d + " ").indexOf(f) >= 0 : !f ? d && c !== false : e === "!=" ? d !== f : e === "^=" ? d.indexOf(f) === 0 : e === "$=" ? d.substr(d.length - f.length) === f : e === "|=" ? d === f || d.substr(0, f.length + 1) === f + "-" : false
			},
			POS: function (a, b, c, d) {
				var e = j.setFilters[b[2]];
				if (e) return e(a, c, b, d)
			}
		}
	},
		a = j.match.POS,
		b = function (a, b) {
			return "\\" + (b - 0 + 1)
		},
		c;
	for (c in j.match) j.match[c] = RegExp(j.match[c].source + /(?![^\[]*\])(?![^\(]*\))/.source), j.leftMatch[c] = RegExp(/(^(?:.|\r|\n)*?)/.source + j.match[c].source.replace(/\\(\d+)/g, b));
	var d = function (a, b) {
			a = Array.prototype.slice.call(a, 0);
			return b ? (b.push.apply(b, a), b) : a
		};
	try {
		Array.prototype.slice.call(document.documentElement.childNodes, 0)
	} catch (e) {
		d = function (a, b) {
			var c = 0,
				d = b || [];
			if (u.call(a) === "[object Array]") Array.prototype.push.apply(d, a);
			else if (typeof a.length === "number") for (var e = a.length; c < e; c++) d.push(a[c]);
			else for (; a[c]; c++) d.push(a[c]);
			return d
		}
	}
	var p, w;
	document.documentElement.compareDocumentPosition ? p = function (a, b) {
		return a === b ? (s = true, 0) : !a.compareDocumentPosition || !b.compareDocumentPosition ? a.compareDocumentPosition ? -1 : 1 : a.compareDocumentPosition(b) & 4 ? -1 : 1
	} : (p = function (a, b) {
		if (a === b) return s = true, 0;
		else if (a.sourceIndex && b.sourceIndex) return a.sourceIndex - b.sourceIndex;
		var c, d, e = [],
			f = [];
		c = a.parentNode;
		d = b.parentNode;
		var g = c;
		if (c === d) return w(a, b);
		else if (c) {
			if (!d) return 1
		} else return -1;
		for (; g;) e.unshift(g), g = g.parentNode;
		for (g = d; g;) f.unshift(g), g = g.parentNode;
		c = e.length;
		d = f.length;
		for (g = 0; g < c && g < d; g++) if (e[g] !== f[g]) return w(e[g], f[g]);
		return g === c ? w(a, f[g], -1) : w(e[g], b, 1)
	}, w = function (a, b, c) {
		if (a === b) return c;
		for (a = a.nextSibling; a;) {
			if (a === b) return -1;
			a = a.nextSibling
		}
		return 1
	});
	f.getText = function (a) {
		for (var b = "", c, d = 0; a[d]; d++) c = a[d], c.nodeType === 3 || c.nodeType === 4 ? b += c.nodeValue : c.nodeType !== 8 && (b += f.getText(c.childNodes));
		return b
	};
	(function () {
		var a = document.createElement("div"),
			b = "script" + (new Date).getTime(),
			c = document.documentElement;
		a.innerHTML = "<a name='" + b + "'/>";
		c.insertBefore(a, c.firstChild);
		if (document.getElementById(b)) j.find.ID = function (a, b, c) {
			if (typeof b.getElementById !== "undefined" && !c) return (b = b.getElementById(a[1])) ? b.id === a[1] || typeof b.getAttributeNode !== "undefined" && b.getAttributeNode("id").nodeValue === a[1] ? [b] : void 0 : []
		}, j.filter.ID = function (a, b) {
			var c = typeof a.getAttributeNode !== "undefined" && a.getAttributeNode("id");
			return a.nodeType === 1 && c && c.nodeValue === b
		};
		c.removeChild(a);
		c = a = null
	})();
	(function () {
		var a = document.createElement("div");
		a.appendChild(document.createComment(""));
		if (a.getElementsByTagName("*").length > 0) j.find.TAG = function (a, b) {
			var c = b.getElementsByTagName(a[1]);
			if (a[1] === "*") {
				for (var d = [], e = 0; c[e]; e++) c[e].nodeType === 1 && d.push(c[e]);
				c = d
			}
			return c
		};
		a.innerHTML = "<a href='#'></a>";
		if (a.firstChild && typeof a.firstChild.getAttribute !== "undefined" && a.firstChild.getAttribute("href") !== "#") j.attrHandle.href = function (a) {
			return a.getAttribute("href", 2)
		};
		a = null
	})();
	document.querySelectorAll &&
	function () {
		var a = f,
			b = document.createElement("div");
		b.innerHTML = "<p class='TEST'></p>";
		if (!(b.querySelectorAll && b.querySelectorAll(".TEST").length === 0)) {
			f = function (b, c, e, g) {
				c = c || document;
				if (!g && !f.isXML(c)) {
					var h = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);
					if (h && (c.nodeType === 1 || c.nodeType === 9)) if (h[1]) return d(c.getElementsByTagName(b), e);
					else if (h[2] && j.find.CLASS && c.getElementsByClassName) return d(c.getElementsByClassName(h[2]), e);
					if (c.nodeType === 9) {
						if (b === "body" && c.body) return d([c.body], e);
						else if (h && h[3]) {
							var l = c.getElementById(h[3]);
							if (l && l.parentNode) {
								if (l.id === h[3]) return d([l], e)
							} else return d([], e)
						}
						try {
							return d(c.querySelectorAll(b), e)
						} catch (o) {}
					} else if (c.nodeType === 1 && c.nodeName.toLowerCase() !== "object") {
						var h = c,
							r = (l = c.getAttribute("id")) || "__sizzle__",
							p = c.parentNode,
							m = /^\s*[+~]/.test(b);
						l ? r = r.replace(/'/g, "\\$&") : c.setAttribute("id", r);
						if (m && p) c = c.parentNode;
						try {
							if (!m || p) return d(c.querySelectorAll("[id='" + r + "'] " + b), e)
						} catch (q) {} finally {
							l || h.removeAttribute("id")
						}
					}
				}
				return a(b, c, e, g)
			};
			for (var c in a) f[c] = a[c];
			b = null
		}
	}();
	(function () {
		var a = document.documentElement,
			b = a.matchesSelector || a.mozMatchesSelector || a.webkitMatchesSelector || a.msMatchesSelector;
		if (b) {
			var c = !b.call(document.createElement("div"), "div"),
				d = false;
			try {
				b.call(document.documentElement, "[test!='']:sizzle")
			} catch (e) {
				d = true
			}
			f.matchesSelector = function (a, e) {
				e = e.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
				if (!f.isXML(a)) try {
					if (d || !j.match.PSEUDO.test(e) && !/!=/.test(e)) {
						var g = b.call(a, e);
						if (g || !c || a.document && a.document.nodeType !== 11) return g
					}
				} catch (h) {}
				return f(e, null, null, [a]).length > 0
			}
		}
	})();
	(function () {
		var a = document.createElement("div");
		a.innerHTML = "<div class='test e'></div><div class='test'></div>";
		if (a.getElementsByClassName && a.getElementsByClassName("e").length !== 0 && (a.lastChild.className = "e", a.getElementsByClassName("e").length !== 1)) j.order.splice(1, 0, "CLASS"), j.find.CLASS = function (a, b, c) {
			if (typeof b.getElementsByClassName !== "undefined" && !c) return b.getElementsByClassName(a[1])
		}, a = null
	})();
	f.contains = document.documentElement.contains ?
	function (a, b) {
		return a !== b && (a.contains ? a.contains(b) : true)
	} : document.documentElement.compareDocumentPosition ?
	function (a, b) {
		return !!(a.compareDocumentPosition(b) & 16)
	} : function () {
		return false
	};
	f.isXML = function (a) {
		return (a = (a ? a.ownerDocument || a : 0).documentElement) ? a.nodeName !== "HTML" : false
	};
	var y = function (a, b) {
			for (var c, d = [], e = "", g = b.nodeType ? [b] : b; c = j.match.PSEUDO.exec(a);) e += c[0], a = a.replace(j.match.PSEUDO, "");
			a = j.relative[a] ? a + "*" : a;
			c = 0;
			for (var h = g.length; c < h; c++) f(a, g[c], d);
			return f.filter(e, d)
		};
	window.Sizzle = f
})();
