/*!
 * jQuery UI 1.8.5
 *
 * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * http://docs.jquery.com/UI
 */
(function($, undefined) {

	// prevent duplicate loading
	// this is only a problem because we proxy existing functions
	// and we don't want to double proxy them
	$.ui = $.ui || {};
	if ($.ui.version) {
		return;
	}

	$.extend($.ui, {
		version : "1.8.5",

		keyCode : {
			ALT : 18,
			BACKSPACE : 8,
			CAPS_LOCK : 20,
			COMMA : 188,
			COMMAND : 91,
			COMMAND_LEFT : 91, // COMMAND
			COMMAND_RIGHT : 93,
			CONTROL : 17,
			DELETE : 46,
			DOWN : 40,
			END : 35,
			ENTER : 13,
			ESCAPE : 27,
			HOME : 36,
			INSERT : 45,
			LEFT : 37,
			MENU : 93, // COMMAND_RIGHT
			NUMPAD_ADD : 107,
			NUMPAD_DECIMAL : 110,
			NUMPAD_DIVIDE : 111,
			NUMPAD_ENTER : 108,
			NUMPAD_MULTIPLY : 106,
			NUMPAD_SUBTRACT : 109,
			PAGE_DOWN : 34,
			PAGE_UP : 33,
			PERIOD : 190,
			RIGHT : 39,
			SHIFT : 16,
			SPACE : 32,
			TAB : 9,
			UP : 38,
			WINDOWS : 91
		// COMMAND
		}
	});

	// plugins
	$.fn
			.extend({
				_focus : $.fn.focus,
				focus : function(delay, fn) {
					return typeof delay === "number" ? this.each(function() {
						var elem = this;
						setTimeout(function() {
							$(elem).focus();
							if (fn) {
								fn.call(elem);
							}
						}, delay);
					}) : this._focus.apply(this, arguments);
				},

				scrollParent : function() {
					var scrollParent;
					if (($.browser.msie && (/(static|relative)/).test(this
							.css('position')))
							|| (/absolute/).test(this.css('position'))) {
						scrollParent = this.parents().filter(
								function() {
									return (/(relative|absolute|fixed)/).test($
											.curCSS(this, 'position', 1))
											&& (/(auto|scroll)/).test($.curCSS(
													this, 'overflow', 1)
													+ $.curCSS(this,
															'overflow-y', 1)
													+ $.curCSS(this,
															'overflow-x', 1));
								}).eq(0);
					} else {
						scrollParent = this.parents().filter(
								function() {
									return (/(auto|scroll)/).test($.curCSS(
											this, 'overflow', 1)
											+ $.curCSS(this, 'overflow-y', 1)
											+ $.curCSS(this, 'overflow-x', 1));
								}).eq(0);
					}

					return (/fixed/).test(this.css('position'))
							|| !scrollParent.length ? $(document)
							: scrollParent;
				},

				zIndex : function(zIndex) {
					if (zIndex !== undefined) {
						return this.css("zIndex", zIndex);
					}

					if (this.length) {
						var elem = $(this[0]), position, value;
						while (elem.length && elem[0] !== document) {
							// Ignore z-index if position is set to a value
							// where z-index is ignored by the browser
							// This makes behavior of this function consistent
							// across browsers
							// WebKit always returns auto if the element is
							// positioned
							position = elem.css("position");
							if (position === "absolute"
									|| position === "relative"
									|| position === "fixed") {
								// IE returns 0 when zIndex is not specified
								// other browsers return a string
								// we ignore the case of nested elements with an
								// explicit value of 0
								// <div style="z-index: -10;"><div
								// style="z-index: 0;"></div></div>
								value = parseInt(elem.css("zIndex"));
								if (!isNaN(value) && value != 0) {
									return value;
								}
							}
							elem = elem.parent();
						}
					}

					return 0;
				},

				disableSelection : function() {
					return this
							.bind(
									"mousedown.ui-disableSelection selectstart.ui-disableSelection",
									function(event) {
										event.preventDefault();
									});
				},

				enableSelection : function() {
					return this.unbind(".ui-disableSelection");
				}
			});

	$.each([ "Width", "Height" ],
			function(i, name) {
				var side = name === "Width" ? [ "Left", "Right" ] : [ "Top",
						"Bottom" ], type = name.toLowerCase(), orig = {
					innerWidth : $.fn.innerWidth,
					innerHeight : $.fn.innerHeight,
					outerWidth : $.fn.outerWidth,
					outerHeight : $.fn.outerHeight
				};

				function reduce(elem, size, border, margin) {
					$.each(side, function() {
						size -= parseFloat($.curCSS(elem, "padding" + this,
								true)) || 0;
						if (border) {
							size -= parseFloat($.curCSS(elem, "border" + this
									+ "Width", true)) || 0;
						}
						if (margin) {
							size -= parseFloat($.curCSS(elem, "margin" + this,
									true)) || 0;
						}
					});
					return size;
				}

				$.fn["inner" + name] = function(size) {
					if (size === undefined) {
						return orig["inner" + name].call(this);
					}

					return this.each(function() {
						$.style(this, type, reduce(this, size) + "px");
					});
				};

				$.fn["outer" + name] = function(size, margin) {
					if (typeof size !== "number") {
						return orig["outer" + name].call(this, size);
					}

					return this.each(function() {
						$.style(this, type, reduce(this, size, true, margin)
								+ "px");
					});
				};
			});

	// selectors
	function visible(element) {
		return !$(element).parents().andSelf().filter(
				function() {
					return $.curCSS(this, "visibility") === "hidden"
							|| $.expr.filters.hidden(this);
				}).length;
	}

	$.extend($.expr[":"],
			{
				data : function(elem, i, match) {
					return !!$.data(elem, match[3]);
				},

				focusable : function(element) {
					var nodeName = element.nodeName.toLowerCase(), tabIndex = $
							.attr(element, "tabindex");
					if ("area" === nodeName) {
						var map = element.parentNode, mapName = map.name, img;
						if (!element.href || !mapName
								|| map.nodeName.toLowerCase() !== "map") {
							return false;
						}
						img = $("img[usemap=#" + mapName + "]")[0];
						return !!img && visible(img);
					}
					return (/input|select|textarea|button|object/
							.test(nodeName) ? !element.disabled
							: "a" == nodeName ? element.href
									|| !isNaN(tabIndex) : !isNaN(tabIndex))
							// the element and all of its ancestors must be
							// visible
							&& visible(element);
				},

				tabbable : function(element) {
					var tabIndex = $.attr(element, "tabindex");
					return (isNaN(tabIndex) || tabIndex >= 0)
							&& $(element).is(":focusable");
				}
			});

	// support
	$(function() {
		var div = document.createElement("div"), body = document.body;

		$.extend(div.style, {
			minHeight : "100px",
			height : "auto",
			padding : 0,
			borderWidth : 0
		});

		$.support.minHeight = body.appendChild(div).offsetHeight === 100;
		// set display to none to avoid a layout bug in IE
		// http://dev.jquery.com/ticket/4014
		body.removeChild(div).style.display = "none";
	});

	// deprecated
	$.extend($.ui,
			{
				// $.ui.plugin is deprecated. Use the proxy pattern instead.
				plugin : {
					add : function(module, option, set) {
						var proto = $.ui[module].prototype;
						for ( var i in set) {
							proto.plugins[i] = proto.plugins[i] || [];
							proto.plugins[i].push([ option, set[i] ]);
						}
					},
					call : function(instance, name, args) {
						var set = instance.plugins[name];
						if (!set || !instance.element[0].parentNode) {
							return;
						}

						for ( var i = 0; i < set.length; i++) {
							if (instance.options[set[i][0]]) {
								set[i][1].apply(instance.element, args);
							}
						}
					}
				},

				// will be deprecated when we switch to jQuery 1.4 - use
				// jQuery.contains()
				contains : function(a, b) {
					return document.compareDocumentPosition ? a
							.compareDocumentPosition(b) & 16 : a !== b
							&& a.contains(b);
				},

				// only used by resizable
				hasScroll : function(el, a) {

					// If overflow is hidden, the element might have extra
					// content, but the user wants to hide it
					if ($(el).css("overflow") === "hidden") {
						return false;
					}

					var scroll = (a && a === "left") ? "scrollLeft"
							: "scrollTop", has = false;

					if (el[scroll] > 0) {
						return true;
					}

					// TODO: determine which cases actually cause this to happen
					// if the element doesn't have the scroll set, see if it's
					// possible to
					// set the scroll
					el[scroll] = 1;
					has = (el[scroll] > 0);
					el[scroll] = 0;
					return has;
				},

				// these are odd functions, fix the API or move into individual
				// plugins
				isOverAxis : function(x, reference, size) {
					// Determines when x coordinate is over "b" element axis
					return (x > reference) && (x < (reference + size));
				},
				isOver : function(y, x, top, left, height, width) {
					// Determines when x, y coordinates is over "b" element
					return $.ui.isOverAxis(y, top, height)
							&& $.ui.isOverAxis(x, left, width);
				}
			});

})(jQuery);

