/*

 * jQuery UI 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */

;jQuery.ui || (function($) {
var _remove = $.fn.remove,
	isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);


//Helper functions and ui object
$.ui = {
	version: "1.7.2",

	// $.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);
				}
			}
		}
	},


	contains: function(a, b) {
		return document.compareDocumentPosition
			? a.compareDocumentPosition(b) & 16
			: a !== b && a.contains(b);
	},



	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;

	},



	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);

	},



	keyCode: {
		BACKSPACE: 8,
		CAPS_LOCK: 20,
		COMMA: 188,
		CONTROL: 17,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		INSERT: 45,
		LEFT: 37,
		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

	}

};



// WAI-ARIA normalization

if (isFF2) {
	var attr = $.attr,
		removeAttr = $.fn.removeAttr,
		ariaNS = "http://www.w3.org/2005/07/aaa",
		ariaState = /^aria-/,
		ariaRole = /^wairole:/;

	$.attr = function(elem, name, value) {
		var set = value !== undefined;
		return (name == 'role'
			? (set
				? attr.call(this, elem, name, "wairole:" + value)
				: (attr.apply(this, arguments) || "").replace(ariaRole, ""))
			: (ariaState.test(name)
				? (set
					? elem.setAttributeNS(ariaNS,
						name.replace(ariaState, "aaa:"), value)
					: attr.call(this, elem, name.replace(ariaState, "aaa:")))
				: attr.apply(this, arguments)));
	};

	$.fn.removeAttr = function(name) {
		return (ariaState.test(name)
			? this.each(function() {
				this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
			}) : removeAttr.call(this, name));

	};

}



//jQuery plugins
$.fn.extend({
	remove: function() {
		// Safari has a native remove event which actually removes DOM elements,
		// so we have to use triggerHandler instead of trigger (#3037).
		$("*", this).add(this).each(function() {
			$(this).triggerHandler("remove");
		});
		return _remove.apply(this, arguments );
	},



	enableSelection: function() {
		return this

			.attr('unselectable', 'off')
			.css('MozUserSelect', '')
			.unbind('selectstart.ui');

	},



	disableSelection: function() {
		return this
			.attr('unselectable', 'on')
			.css('MozUserSelect', 'none')
			.bind('selectstart.ui', function() { return false; });
	},



	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;
	}
});
//Additional selectors
$.extend($.expr[':'], {
	data: function(elem, i, match) {
		return !!$.data(elem, match[3]);
	},

	focusable: function(element) {
		var nodeName = element.nodeName.toLowerCase(),
			tabIndex = $.attr(element, 'tabindex');
		return (/input|select|textarea|button|object/.test(nodeName)
			? !element.disabled
			: 'a' == nodeName || 'area' == nodeName
				? element.href || !isNaN(tabIndex)
				: !isNaN(tabIndex))
			// the element and all of its ancestors must be visible
			// the browser may report that the area is hidden
			&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
	},



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





// $.widget is a factory to create jQuery plugins
// taking some boilerplate code out of the plugin code
function getter(namespace, plugin, method, args) {
	function getMethods(type) {
		var methods = $[namespace][plugin][type] || [];
		return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
	}



	var methods = getMethods('getter');
	if (args.length == 1 && typeof args[0] == 'string') {
		methods = methods.concat(getMethods('getterSetter'));
	}

	return ($.inArray(method, methods) != -1);
}



$.widget = function(name, prototype) {
	var namespace = name.split(".")[0];
	name = name.split(".")[1];


	// create plugin method
	$.fn[name] = function(options) {
		var isMethodCall = (typeof options == 'string'),
			args = Array.prototype.slice.call(arguments, 1);


		// prevent calls to internal methods
		if (isMethodCall && options.substring(0, 1) == '_') {
			return this;

		}



		// handle getter methods
		if (isMethodCall && getter(namespace, name, options, args)) {
			var instance = $.data(this[0], name);
			return (instance ? instance[options].apply(instance, args)
				: undefined);

		}



		// handle initialization and non-getter methods
		return this.each(function() {
			var instance = $.data(this, name);


			// constructor
			(!instance && !isMethodCall &&
				$.data(this, name, new $[namespace][name](this, options))._init());


			// method call
			(instance && isMethodCall && $.isFunction(instance[options]) &&
				instance[options].apply(instance, args));
		});

	};



	// create widget constructor
	$[namespace] = $[namespace] || {};
	$[namespace][name] = function(element, options) {
		var self = this;
		this.namespace = namespace;
		this.widgetName = name;
		this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
		this.widgetBaseClass = namespace + '-' + name;


		this.options = $.extend({},
			$.widget.defaults,
			$[namespace][name].defaults,
			$.metadata && $.metadata.get(element)[name],
			options);



		this.element = $(element)
			.bind('setData.' + name, function(event, key, value) {
				if (event.target == element) {
					return self._setData(key, value);

				}

			})

			.bind('getData.' + name, function(event, key) {
				if (event.target == element) {
					return self._getData(key);
				}

			})

			.bind('remove', function() {
				return self.destroy();

			});

	};



	// add widget prototype
	$[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);

	// TODO: merge getter and getterSetter properties from widget prototype
	// and plugin prototype

	$[namespace][name].getterSetter = 'option';

};



$.widget.prototype = {
	_init: function() {},
	destroy: function() {
		this.element.removeData(this.widgetName)
			.removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
			.removeAttr('aria-disabled');
	},



	option: function(key, value) {
		var options = key,
			self = this;
		if (typeof key == "string") {
			if (value === undefined) {
				return this._getData(key);
			}

			options = {};
			options[key] = value;
		}



		$.each(options, function(key, value) {
			self._setData(key, value);
		});

	},

	_getData: function(key) {
		return this.options[key];
	},

	_setData: function(key, value) {
		this.options[key] = value;



		if (key == 'disabled') {
			this.element

				[value ? 'addClass' : 'removeClass'](
					this.widgetBaseClass + '-disabled' + ' ' +
					this.namespace + '-state-disabled')
				.attr("aria-disabled", value);

		}

	},



	enable: function() {
		this._setData('disabled', false);
	},

	disable: function() {
		this._setData('disabled', true);
	},



	_trigger: function(type, event, data) {
		var callback = this.options[type],
			eventName = (type == this.widgetEventPrefix
				? type : this.widgetEventPrefix + type);

		event = $.Event(event);
		event.type = eventName;



		// copy original event properties over to the new event
		// this would happen if we could call $.event.fix instead of $.Event
		// but we don't have a way to force an event to be fixed multiple times

		if (event.originalEvent) {
			for (var i = $.event.props.length, prop; i;) {
				prop = $.event.props[--i];

				event[prop] = event.originalEvent[prop];

			}

		}



		this.element.trigger(event, data);



		return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false

			|| event.isDefaultPrevented());

	}

};



$.widget.defaults = {

	disabled: false

};





/** Mouse Interaction Plugin **/



$.ui.mouse = {

	_mouseInit: function() {

		var self = this;



		this.element

			.bind('mousedown.'+this.widgetName, function(event) {

				return self._mouseDown(event);

			})

			.bind('click.'+this.widgetName, function(event) {

				if(self._preventClickEvent) {

					self._preventClickEvent = false;

					event.stopImmediatePropagation();

					return false;

				}

			});



		// Prevent text selection in IE

		if ($.browser.msie) {

			this._mouseUnselectable = this.element.attr('unselectable');

			this.element.attr('unselectable', 'on');

		}



		this.started = false;

	},



	// TODO: make sure destroying one instance of mouse doesn't mess with

	// other instances of mouse

	_mouseDestroy: function() {

		this.element.unbind('.'+this.widgetName);



		// Restore text selection in IE

		($.browser.msie

			&& this.element.attr('unselectable', this._mouseUnselectable));

	},



	_mouseDown: function(event) {

		// don't let more than one widget handle mouseStart

		// TODO: figure out why we have to use originalEvent

		event.originalEvent = event.originalEvent || {};

		if (event.originalEvent.mouseHandled) { return; }



		// we may have missed mouseup (out of window)

		(this._mouseStarted && this._mouseUp(event));



		this._mouseDownEvent = event;



		var self = this,

			btnIsLeft = (event.which == 1),

			elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);

		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {

			return true;

		}



		this.mouseDelayMet = !this.options.delay;

		if (!this.mouseDelayMet) {

			this._mouseDelayTimer = setTimeout(function() {

				self.mouseDelayMet = true;

			}, this.options.delay);

		}



		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {

			this._mouseStarted = (this._mouseStart(event) !== false);

			if (!this._mouseStarted) {

				event.preventDefault();

				return true;

			}

		}



		// these delegates are required to keep context

		this._mouseMoveDelegate = function(event) {

			return self._mouseMove(event);

		};

		this._mouseUpDelegate = function(event) {

			return self._mouseUp(event);

		};

		$(document)

			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)

			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);



		// preventDefault() is used to prevent the selection of text here -

		// however, in Safari, this causes select boxes not to be selectable

		// anymore, so this fix is needed

		($.browser.safari || event.preventDefault());



		event.originalEvent.mouseHandled = true;

		return true;

	},



	_mouseMove: function(event) {

		// IE mouseup check - mouseup happened when mouse was out of window

		if ($.browser.msie && !event.button) {

			return this._mouseUp(event);

		}



		if (this._mouseStarted) {

			this._mouseDrag(event);

			return event.preventDefault();

		}



		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {

			this._mouseStarted =

				(this._mouseStart(this._mouseDownEvent, event) !== false);

			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));

		}



		return !this._mouseStarted;

	},



	_mouseUp: function(event) {

		$(document)

			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)

			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);



		if (this._mouseStarted) {

			this._mouseStarted = false;

			this._preventClickEvent = (event.target == this._mouseDownEvent.target);

			this._mouseStop(event);

		}



		return false;

	},



	_mouseDistanceMet: function(event) {

		return (Math.max(

				Math.abs(this._mouseDownEvent.pageX - event.pageX),

				Math.abs(this._mouseDownEvent.pageY - event.pageY)

			) >= this.options.distance

		);

	},



	_mouseDelayMet: function(event) {

		return this.mouseDelayMet;

	},



	// These are placeholder methods, to be overriden by extending plugin

	_mouseStart: function(event) {},

	_mouseDrag: function(event) {},

	_mouseStop: function(event) {},

	_mouseCapture: function(event) { return true; }

};



$.ui.mouse.defaults = {

	cancel: null,

	distance: 1,

	delay: 0

};



})(jQuery);







/*

 * jQuery UI Accordion 1.7.2

 *

 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)

 * Dual licensed under the MIT (MIT-LICENSE.txt)

 * and GPL (GPL-LICENSE.txt) licenses.

 *

 * http://docs.jquery.com/UI/Accordion

 *

 * Depends:

 *	ui.core.js

 */

(function($) {



$.widget("ui.accordion", {



	_init: function() {



		var o = this.options, self = this;

		this.running = 0;



		// if the user set the alwaysOpen option on init

		// then we need to set the collapsible option

		// if they set both on init, collapsible will take priority

		if (o.collapsible == $.ui.accordion.defaults.collapsible &&

			o.alwaysOpen != $.ui.accordion.defaults.alwaysOpen) {

			o.collapsible = !o.alwaysOpen;

		}



		if ( o.navigation ) {

			var current = this.element.find("a").filter(o.navigationFilter);

			if ( current.length ) {

				if ( current.filter(o.header).length ) {

					this.active = current;

				} else {

					this.active = current.parent().parent().prev();

					current.addClass("ui-accordion-content-active");

				}

			}

		}



		this.element.addClass("ui-accordion ui-widget ui-helper-reset");

		

		// in lack of child-selectors in CSS we need to mark top-LIs in a UL-accordion for some IE-fix

		if (this.element[0].nodeName == "UL") {

			this.element.children("li").addClass("ui-accordion-li-fix");

		}



		this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all")

			.bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); })

			.bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); })

			.bind("focus.accordion", function(){ $(this).addClass('ui-state-focus'); })

			.bind("blur.accordion", function(){ $(this).removeClass('ui-state-focus'); });



		this.headers

			.next()

				.addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");



		this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");

		this.active.next().addClass('ui-accordion-content-active');



		//Append icon elements

		$("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers);

		this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected);



		// IE7-/Win - Extra vertical space in lists fixed

		if ($.browser.msie) {

			this.element.find('a').css('zoom', '1');

		}



		this.resize();



		//ARIA

		this.element.attr('role','tablist');



		this.headers

			.attr('role','tab')

			.bind('keydown', function(event) { return self._keydown(event); })

			.next()

			.attr('role','tabpanel');



		this.headers

			.not(this.active || "")

			.attr('aria-expanded','false')

			.attr("tabIndex", "-1")

			.next()

			.hide();



		// make sure at least one header is in the tab order

		if (!this.active.length) {

			this.headers.eq(0).attr('tabIndex','0');

		} else {

			this.active

				.attr('aria-expanded','true')

				.attr('tabIndex', '0');

		}



		// only need links in taborder for Safari

		if (!$.browser.safari)

			this.headers.find('a').attr('tabIndex','-1');



		if (o.event) {

			this.headers.bind((o.event) + ".accordion", function(event) { return self._clickHandler.call(self, event, this); });

		}



	},



	destroy: function() {

		var o = this.options;



		this.element

			.removeClass("ui-accordion ui-widget ui-helper-reset")

			.removeAttr("role")

			.unbind('.accordion')

			.removeData('accordion');



		this.headers

			.unbind(".accordion")

			.removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top")

			.removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");



		this.headers.find("a").removeAttr("tabindex");

		this.headers.children(".ui-icon").remove();

		var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");

		if (o.autoHeight || o.fillHeight) {

			contents.css("height", "");

		}

	},

	

	_setData: function(key, value) {

		if(key == 'alwaysOpen') { key = 'collapsible'; value = !value; }

		$.widget.prototype._setData.apply(this, arguments);	

	},



	_keydown: function(event) {



		var o = this.options, keyCode = $.ui.keyCode;



		if (o.disabled || event.altKey || event.ctrlKey)

			return;



		var length = this.headers.length;

		var currentIndex = this.headers.index(event.target);

		var toFocus = false;



		switch(event.keyCode) {

			case keyCode.RIGHT:

			case keyCode.DOWN:

				toFocus = this.headers[(currentIndex + 1) % length];

				break;

			case keyCode.LEFT:

			case keyCode.UP:

				toFocus = this.headers[(currentIndex - 1 + length) % length];

				break;

			case keyCode.SPACE:

			case keyCode.ENTER:

				return this._clickHandler({ target: event.target }, event.target);

		}



		if (toFocus) {

			$(event.target).attr('tabIndex','-1');

			$(toFocus).attr('tabIndex','0');

			toFocus.focus();

			return false;

		}



		return true;



	},



	resize: function() {



		var o = this.options, maxHeight;



		if (o.fillSpace) {

			

			if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); }

			maxHeight = this.element.parent().height();

			if($.browser.msie) { this.element.parent().css('overflow', defOverflow); }

	

			this.headers.each(function() {

				maxHeight -= $(this).outerHeight();

			});



			var maxPadding = 0;

			this.headers.next().each(function() {

				maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height());

			}).height(Math.max(0, maxHeight - maxPadding))

			.css('overflow', 'auto');



		} else if ( o.autoHeight ) {

			maxHeight = 0;

			this.headers.next().each(function() {

				maxHeight = Math.max(maxHeight, $(this).outerHeight());

			}).height(maxHeight);

		}



	},



	activate: function(index) {

		// call clickHandler with custom event

		var active = this._findActive(index)[0];

		this._clickHandler({ target: active }, active);

	},



	_findActive: function(selector) {

		return selector

			? typeof selector == "number"

				? this.headers.filter(":eq(" + selector + ")")

				: this.headers.not(this.headers.not(selector))

			: selector === false

				? $([])

				: this.headers.filter(":eq(0)");

	},



	_clickHandler: function(event, target) {



		var o = this.options;

		if (o.disabled) return false;



		// called only when using activate(false) to close all parts programmatically

		if (!event.target && o.collapsible) {

			this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")

				.find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);

			this.active.next().addClass('ui-accordion-content-active');

			var toHide = this.active.next(),

				data = {

					options: o,

					newHeader: $([]),

					oldHeader: o.active,

					newContent: $([]),

					oldContent: toHide

				},

				toShow = (this.active = $([]));

			this._toggle(toShow, toHide, data);

			return false;

		}



		// get the click target

		var clicked = $(event.currentTarget || target);

		var clickedIsActive = clicked[0] == this.active[0];



		// if animations are still active, or the active header is the target, ignore click

		if (this.running || (!o.collapsible && clickedIsActive)) {

			return false;

		}



		// switch classes

		this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")

			.find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);

		this.active.next().addClass('ui-accordion-content-active');

		if (!clickedIsActive) {

			clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top")

				.find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected);

			clicked.next().addClass('ui-accordion-content-active');

		}



		// find elements to show and hide

		var toShow = clicked.next(),

			toHide = this.active.next(),

			data = {

				options: o,

				newHeader: clickedIsActive && o.collapsible ? $([]) : clicked,

				oldHeader: this.active,

				newContent: clickedIsActive && o.collapsible ? $([]) : toShow.find('> *'),

				oldContent: toHide.find('> *')

			},

			down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );



		this.active = clickedIsActive ? $([]) : clicked;

		this._toggle(toShow, toHide, data, clickedIsActive, down);



		return false;



	},



	_toggle: function(toShow, toHide, data, clickedIsActive, down) {



		var o = this.options, self = this;



		this.toShow = toShow;

		this.toHide = toHide;

		this.data = data;



		var complete = function() { if(!self) return; return self._completed.apply(self, arguments); };



		// trigger changestart event

		this._trigger("changestart", null, this.data);



		// count elements to animate

		this.running = toHide.size() === 0 ? toShow.size() : toHide.size();



		if (o.animated) {



			var animOptions = {};



			if ( o.collapsible && clickedIsActive ) {

				animOptions = {

					toShow: $([]),

					toHide: toHide,

					complete: complete,

					down: down,

					autoHeight: o.autoHeight || o.fillSpace

				};

			} else {

				animOptions = {

					toShow: toShow,

					toHide: toHide,

					complete: complete,

					down: down,

					autoHeight: o.autoHeight || o.fillSpace

				};

			}



			if (!o.proxied) {

				o.proxied = o.animated;

			}



			if (!o.proxiedDuration) {

				o.proxiedDuration = o.duration;

			}



			o.animated = $.isFunction(o.proxied) ?

				o.proxied(animOptions) : o.proxied;



			o.duration = $.isFunction(o.proxiedDuration) ?

				o.proxiedDuration(animOptions) : o.proxiedDuration;



			var animations = $.ui.accordion.animations,

				duration = o.duration,

				easing = o.animated;



			if (!animations[easing]) {

				animations[easing] = function(options) {

					this.slide(options, {

						easing: easing,

						duration: duration || 700

					});

				};

			}



			animations[easing](animOptions);



		} else {



			if (o.collapsible && clickedIsActive) {

				toShow.toggle();

			} else {

				toHide.hide();

				toShow.show();

			}



			complete(true);



		}



		toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur();

		toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus();



	},



	_completed: function(cancel) {



		var o = this.options;



		this.running = cancel ? 0 : --this.running;

		if (this.running) return;



		if (o.clearStyle) {

			this.toShow.add(this.toHide).css({

				height: "",

				overflow: ""

			});

		}



		this._trigger('change', null, this.data);

	}



});





$.extend($.ui.accordion, {

	version: "1.7.2",

	defaults: {

		active: null,

		alwaysOpen: true, //deprecated, use collapsible

		animated: 'slide',

		autoHeight: true,

		clearStyle: false,

		collapsible: false,

		event: "click",

		fillSpace: false,

		header: "> li > :first-child,> :not(li):even",

		icons: {

			header: "ui-icon-triangle-1-e",

			headerSelected: "ui-icon-triangle-1-s"

		},

		navigation: false,

		navigationFilter: function() {

			return this.href.toLowerCase() == location.href.toLowerCase();

		}

	},

	animations: {

		slide: function(options, additions) {

			options = $.extend({

				easing: "swing",

				duration: 300

			}, options, additions);

			if ( !options.toHide.size() ) {

				options.toShow.animate({height: "show"}, options);

				return;

			}

			if ( !options.toShow.size() ) {

				options.toHide.animate({height: "hide"}, options);

				return;

			}

			var overflow = options.toShow.css('overflow'),

				percentDone,

				showProps = {},

				hideProps = {},

				fxAttrs = [ "height", "paddingTop", "paddingBottom" ],

				originalWidth;

			// fix width before calculating height of hidden element

			var s = options.toShow;

			originalWidth = s[0].style.width;

			s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) );

			

			$.each(fxAttrs, function(i, prop) {

				hideProps[prop] = 'hide';

				

				var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/);

				showProps[prop] = {

					value: parts[1],

					unit: parts[2] || 'px'

				};

			});

			options.toShow.css({ height: 0, overflow: 'hidden' }).show();

			options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{

				step: function(now, settings) {

					// only calculate the percent when animating height

					// IE gets very inconsistent results when animating elements

					// with small values, which is common for padding

					if (settings.prop == 'height') {

						percentDone = (settings.now - settings.start) / (settings.end - settings.start);

					}

					

					options.toShow[0].style[settings.prop] =

						(percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit;

				},

				duration: options.duration,

				easing: options.easing,

				complete: function() {

					if ( !options.autoHeight ) {

						options.toShow.css("height", "");

					}

					options.toShow.css("width", originalWidth);

					options.toShow.css({overflow: overflow});

					options.complete();

				}

			});

		},

		bounceslide: function(options) {

			this.slide(options, {

				easing: options.down ? "easeOutBounce" : "swing",

				duration: options.down ? 1000 : 200

			});

		},

		easeslide: function(options) {

			this.slide(options, {

				easing: "easeinout",

				duration: 700

			});

		}

	}

});



})(jQuery);



/*

anythingSlider v1.2



By Chris Coyier: http://css-tricks.com

with major improvements by Doug Neiner: http://pixelgraphics.us/

based on work by Remy Sharp: http://jqueryfordesigners.com/





To use the navigationFormatter function, you must have a function that

accepts two paramaters, and returns a string of HTML text.



index = integer index (1 based);

panel = jQuery wrapped LI item this tab references

@return = Must return a string of HTML/Text



navigationFormatter: function(index, panel){

	return index + " Panel"; // This would have each tab with the text 'X Panel' where X = index

}

*/









(function($){



$.anythingSlider = function(el, options){

    

	

	

	

	// To avoid scope issues, use 'base' instead of 'this'

    // to reference this class from internal events and functions.

    var base = this;

	

	

    

    // Access to jQuery and DOM versions of element

    base.$el = $(el);

    base.el = el; 



	// Set up a few defaults

    base.currentPage = 1;

	base.timer = null;

	base.playing = false;



    // Add a reverse reference to the DOM object

    base.$el.data("AnythingSlider", base);

    



	

    base.init = function(){

        base.options = $.extend({},$.anythingSlider.defaults, options);

		

		// Cache existing DOM elements for later 

		base.$wrapper = base.$el.find('> div').css('overflow', 'hidden');

        base.$slider  = base.$wrapper.find('> ul');

        base.$items   = base.$slider.find('> .noSlide');

        base.$single  = base.$items.filter(':first');

		

		base.$allSlider = $('.spaetiSlider');

		

		//base.$wrapper = $('.spaetiSlider');

		//$('.spaetiSlider').css('backgroundColor','#000');

		

		if(base.$items.length < base.options.elementsForSliding){

		

			base.options.buildNavigation = false;

			base.options.autoPlay = false; 

			base.options.backButtons = false;

			return;

		}

		

		// Build the navigation if needed

		if(base.options.buildNavigation) base.buildNavigation();

    

    	// Get the details

        base.singleWidth = base.$single.outerWidth();

        base.singleHight  = base.$single.outerHeight();

       

        base.pages = base.$items.length;

		



        // Top and tail the list with 'visible' number of items, top has the last section, and tail has the first

		// This supports the "infinite" scrolling

		base.$items.filter(':first').before(base.$items.filter(':last').clone().addClass('cloned'));

       base.$items.filter(':last' ).after(base.$items.filter(':first').clone().addClass('cloned'));



		// We just added two items, time to re-cache the list

        base.$items = base.$slider.find('> li'); // reselect

        

		// Setup our forward/backward navigation

        if(base.options.backButtons){

        	

        	base.buildNextBackButtons();

        }

	

		// If autoPlay functionality is included, then initialize the settings

		if(base.options.autoPlay) {

			base.playing = !base.options.startStopped; // Sets the playing variable to false if startStopped is true

			base.buildAutoPlay();

		};

		

		// If pauseOnHover then add hover effects

		if(base.options.pauseOnHover) {

			base.$el.hover(function(){

				base.clearTimer();

			}, function(){

				base.startStop(base.playing);

			});

		}

		

		// If a hash can not be used to trigger the plugin, then go to page 1

		if((base.options.hashTags == true && !base.gotoHash()) || base.options.hashTags == false){

			base.setCurrentPage(1);

		};

    };



	base.gotoPage = function(page, autoplay){

		// When autoplay isn't passed, we stop the timer

		if(autoplay !== true) autoplay = false; // shug => false to true

		if(!autoplay) base.startStop(false);

		

		if(typeof(page) == "undefined" || page == null) {

			page = 1;

			base.setCurrentPage(1);

		};

		

		// Just check for bounds

		if(page > base.pages + 1) page = base.pages;

		if(page < 0 ) page = 1;



	

		

		

		if(base.options.vertical == true){

			var dir = page < base.currentPage ? -1 : 1,

	                n = Math.abs(base.currentPage - page),

	                top = base.singleHight * dir * n;

			

			base.$wrapper.filter(':not(:animated)').animate({

					scrollTop: '+=' + top

				}, base.options.animationTime, base.options.easing, function() {

		    // $(this).css('top','80px');

		     

		     if (page == 0) {

                    base.$wrapper.scrollTop(base.singleHight * base.pages);

					page = base.pages;

                } else if (page > base.pages) {

                    base.$wrapper.scrollTop(base.singleHight);

                    // reset back to start position

                    page = 1;

                };

				base.setCurrentPage(page);

		     

		     

		   });



		} else {

			var dir = page < base.currentPage ? -1 : 1,

	                n = Math.abs(base.currentPage - page),

	                left = base.singleWidth * dir * n;

			

			

		base.$wrapper.filter(':not(:animated)').animate({

            scrollLeft : '+=' + left

        }, base.options.animationTime, base.options.easing, function () {

            if (page == 0) {

                base.$wrapper.scrollLeft(base.singleWidth * base.pages);

				page = base.pages;

            } else if (page > base.pages) {

                base.$wrapper.scrollLeft(base.singleWidth);

                // reset back to start position

                page = 1;

            };

			base.setCurrentPage(page);

			

        });

		}

       

	};

	

	base.setCurrentPage = function(page, move){

		// Set visual

		if(base.options.buildNavigation){

			base.$nav.find('.cur').removeClass('cur');

			$(base.$navLinks[page - 1]).addClass('cur');	

		};

		

		// Only change left if move does not equal false

		

		if(move !== false && base.options.vertical == false){ 

			base.$wrapper.scrollLeft(base.singleWidth * page);

		}

		else if(move !== false){ 

			base.$wrapper.scrollTop(base.singleHight * page);

		}

		// Update local variable

		base.currentPage = page;

	};

	

	base.goForward = function(autoplay){

		if(autoplay !== true) autoplay = false;

		

		//base.$allSlider.gotoPage(base.currentPage + 1, autoplay);

		

		base.gotoPage(base.currentPage + 1, autoplay);

	};

	

	base.goBack = function(){

		base.gotoPage(base.currentPage - 1);

	};

	

	// This method tries to find a hash that matches panel-X

	// If found, it tries to find a matching item

	// If that is found as well, then that item starts visible

	base.gotoHash = function(){

		if(/^#?panel-\d+$/.test(window.location.hash)){

			var index = parseInt(window.location.hash.substr(7));

			var $item = base.$items.filter(':eq(' + index + ')');

			if($item.length != 0){

				base.setCurrentPage(index);

				return true;

			};

		};

		return false; // A item wasn't found;

	};

   

	// Creates the numbered navigation links

	base.buildNavigation = function(){

		base.$nav = $("<div class='thumbNav'></div>").appendTo(base.$el);

		

		

		

		

		base.$items.each(function(i,el){

			var index = i + 1;

			var $a = $("<a href='#'></a>");

			

			// If a formatter function is present, use it

			if( typeof(base.options.navigationFormatter) == "function"){

				$a.html(base.options.navigationFormatter(index, $(this)));

			} else {

				$a.text(index);

			}

			$a.click(function(e){

                base.gotoPage(index);

                

                if (base.options.hashTags)

					base.setHash('panel-' + index);

					

                e.preventDefault();

			});

			base.$nav.append($a);

		});

		base.$navLinks = base.$nav.find('> a');

		

		

	};

	

	

	// Creates the Forward/Backward buttons

	base.buildNextBackButtons = function(){

		var $forward = $('<a class="arrow forward"></a>'),

			$back    = $('<a class="arrow back"></a>');

			

        // Bind to the forward and back buttons

        $back.click(function(e){

            base.goBack();

			e.preventDefault();

        });



        $forward.click(function(e){

            base.goForward();

			e.preventDefault();

        });



		// Append elements to page

		base.$wrapper.after($back).after($forward);

	};

	

	// Creates the Start/Stop button

	base.buildAutoPlay = function(){



		base.$startStop = $("<a href='#' clase='start-stop'></a>").html(base.playing ? base.options.stopText :  base.options.startText);

		base.$el.append(base.$startStop);            

        base.$startStop.click(function(e){

			base.startStop(!base.playing);

			e.preventDefault();

        });



		// Use the same setting, but trigger the start;

		base.startStop(base.playing);

	};

	

	// Handles stopping and playing the slideshow

	// Pass startStop(false) to stop and startStop(true) to play

	base.startStop = function(playing){

		if(playing !== true) playing = false; // Default if not supplied is false

		

		// Update variable

		base.playing = playing;

		

		// Toggle playing and text

		if(base.options.autoPlay) base.$startStop.toggleClass("playing", playing).html( playing ? base.options.stopText : base.options.startText );

		

		if(playing){

			base.clearTimer(); // Just in case this was triggered twice in a row

			base.timer = window.setInterval(function(){

				base.goForward(true);

			}, base.options.delay);

		} else {

			base.clearTimer();

		};

	};

	

	base.clearTimer = function(){

		// Clear the timer only if it is set

		if(base.timer) window.clearInterval(base.timer);

	};

	

	// Taken from AJAXY jquery.history Plugin

	base.setHash = function ( hash ) {

		// Write hash

		if ( typeof window.location.hash !== 'undefined' ) {

			if ( window.location.hash !== hash ) {

				window.location.hash = hash;

			};

		} else if ( location.hash !== hash ) {

			location.hash = hash;

		};

		

		// Done

		return hash;

	};

	// <-- End AJAXY code





	// Trigger the initialization

    base.init();

};





$.anythingSlider.defaults = {

    easing: "swing",                // Anything other than "linear" or "swing" requires the easing plugin

    autoPlay: true,                 // This turns off the entire FUNCTIONALY, not just if it starts running or not

    startStopped: false,            // If autoPlay is on, this can force it to start stopped

    delay: 3000,                    // How long between slide transitions in AutoPlay mode

    animationTime: 600,             // How long the slide transition takes

    hashTags: true,                 // Should links change the hashtag in the URL?

    buildNavigation: true,          // If true, builds and list of anchor links to link to each slide

    pauseOnHover: true,             // If true, and autoPlay is enabled, the show will pause on hover

	startText: "Start",             // Start text

	stopText: "Stop",               // Stop text

	navigationFormatter: null,      // Details at the top of the file on this use (advanced use)

	elementsForSliding: 2,			// Elements are needed for sliding

	backButtons: true,				// Are enough elements, show backbuttons

	vertical: false

};





$.fn.anythingSlider = function(options){

	if(typeof(options) == "object"){

	    return this.each(function(i){			

			(new $.anythingSlider(this, options));



            // This plugin supports multiple instances, but only one can support hash-tag support

			// This disables hash-tags on all items but the first one

			options.hashTags = false;

        });	

	} else if (typeof(options) == "number") {



		return this.each(function(i){

			var anySlide = $(this).data('AnythingSlider');

			if(anySlide){

				anySlide.gotoPage(options);

			}

		});

	}

};





})(jQuery);



/*

 * jQuery EasIng v1.1.2 - http://gsgd.co.uk/sandbox/jquery.easIng.php

 *

 * Uses the built In easIng capabilities added In jQuery 1.1

 * to offer multiple easIng options

 *

 * Copyright (c) 2007 George Smith

 * Licensed under the MIT License:

 *   http://www.opensource.org/licenses/mit-license.php

 */



// t: current time, b: begInnIng value, c: change In value, d: duration



jQuery.extend( jQuery.easing,

{

	easeInQuad: function (x, t, b, c, d) {

		return c*(t/=d)*t + b;

	},

	easeOutQuad: function (x, t, b, c, d) {

		return -c *(t/=d)*(t-2) + b;

	},

	easeInOutQuad: function (x, t, b, c, d) {

		if ((t/=d/2) < 1) return c/2*t*t + b;

		return -c/2 * ((--t)*(t-2) - 1) + b;

	},

	easeInCubic: function (x, t, b, c, d) {

		return c*(t/=d)*t*t + b;

	},

	easeOutCubic: function (x, t, b, c, d) {

		return c*((t=t/d-1)*t*t + 1) + b;

	},

	easeInOutCubic: function (x, t, b, c, d) {

		if ((t/=d/2) < 1) return c/2*t*t*t + b;

		return c/2*((t-=2)*t*t + 2) + b;

	},

	easeInQuart: function (x, t, b, c, d) {

		return c*(t/=d)*t*t*t + b;

	},

	easeOutQuart: function (x, t, b, c, d) {

		return -c * ((t=t/d-1)*t*t*t - 1) + b;

	},

	easeInOutQuart: function (x, t, b, c, d) {

		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;

		return -c/2 * ((t-=2)*t*t*t - 2) + b;

	},

	easeInQuint: function (x, t, b, c, d) {

		return c*(t/=d)*t*t*t*t + b;

	},

	easeOutQuint: function (x, t, b, c, d) {

		return c*((t=t/d-1)*t*t*t*t + 1) + b;

	},

	easeInOutQuint: function (x, t, b, c, d) {

		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;

		return c/2*((t-=2)*t*t*t*t + 2) + b;

	},

	easeInSine: function (x, t, b, c, d) {

		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;

	},

	easeOutSine: function (x, t, b, c, d) {

		return c * Math.sin(t/d * (Math.PI/2)) + b;

	},

	easeInOutSine: function (x, t, b, c, d) {

		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;

	},

	easeInExpo: function (x, t, b, c, d) {

		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;

	},

	easeOutExpo: function (x, t, b, c, d) {

		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;

	},

	easeInOutExpo: function (x, t, b, c, d) {

		if (t==0) return b;

		if (t==d) return b+c;

		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;

		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;

	},

	easeInCirc: function (x, t, b, c, d) {

		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;

	},

	easeOutCirc: function (x, t, b, c, d) {

		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;

	},

	easeInOutCirc: function (x, t, b, c, d) {

		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;

		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;

	},

	easeInElastic: function (x, t, b, c, d) {

		var s=1.70158;var p=0;var a=c;

		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;

		if (a < Math.abs(c)) { a=c; var s=p/4; }

		else var s = p/(2*Math.PI) * Math.asin (c/a);

		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;

	},

	easeOutElastic: function (x, t, b, c, d) {

		var s=1.70158;var p=0;var a=c;

		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;

		if (a < Math.abs(c)) { a=c; var s=p/4; }

		else var s = p/(2*Math.PI) * Math.asin (c/a);

		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;

	},

	easeInOutElastic: function (x, t, b, c, d) {

		var s=1.70158;var p=0;var a=c;

		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);

		if (a < Math.abs(c)) { a=c; var s=p/4; }

		else var s = p/(2*Math.PI) * Math.asin (c/a);

		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;

		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;

	},

	easeInBack: function (x, t, b, c, d, s) {

		if (s == undefined) s = 1.70158;

		return c*(t/=d)*t*((s+1)*t - s) + b;

	},

	easeOutBack: function (x, t, b, c, d, s) {

		if (s == undefined) s = 1.70158;

		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;

	},

	easeInOutBack: function (x, t, b, c, d, s) {

		if (s == undefined) s = 1.70158; 

		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;

		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;

	},

	easeInBounce: function (x, t, b, c, d) {

		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;

	},

	easeOutBounce: function (x, t, b, c, d) {

		if ((t/=d) < (1/2.75)) {

			return c*(7.5625*t*t) + b;

		} else if (t < (2/2.75)) {

			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;

		} else if (t < (2.5/2.75)) {

			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;

		} else {

			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;

		}

	},

	easeInOutBounce: function (x, t, b, c, d) {

		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;

		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;

	}

});



/*

 * jQuery UI Tabs 1.7.2

 *

 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)

 * Dual licensed under the MIT (MIT-LICENSE.txt)

 * and GPL (GPL-LICENSE.txt) licenses.

 *

 * http://docs.jquery.com/UI/Tabs

 *

 * Depends:

 *	ui.core.js

 */

(function($) {



$.widget("ui.tabs", {



	_init: function() {

		if (this.options.deselectable !== undefined) {

			this.options.collapsible = this.options.deselectable;

		}

		this._tabify(true);

	},



	_setData: function(key, value) {

		if (key == 'selected') {

			if (this.options.collapsible && value == this.options.selected) {

				return;

			}

			this.select(value);

		}

		else {

			this.options[key] = value;

			if (key == 'deselectable') {

				this.options.collapsible = value;

			}

			this._tabify();

		}

	},



	_tabId: function(a) {

		return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') ||

			this.options.idPrefix + $.data(a);

	},



	_sanitizeSelector: function(hash) {

		return hash.replace(/:/g, '\\:'); // we need this because an id may contain a ":"

	},



	_cookie: function() {

		var cookie = this.cookie || (this.cookie = this.options.cookie.name || 'ui-tabs-' + $.data(this.list[0]));

		return $.cookie.apply(null, [cookie].concat($.makeArray(arguments)));

	},



	_ui: function(tab, panel) {

		return {

			tab: tab,

			panel: panel,

			index: this.anchors.index(tab)

		};

	},



	_cleanup: function() {

		// restore all former loading tabs labels

		this.lis.filter('.ui-state-processing').removeClass('ui-state-processing')

				.find('span:data(label.tabs)')

				.each(function() {

					var el = $(this);

					el.html(el.data('label.tabs')).removeData('label.tabs');

				});

	},



	_tabify: function(init) {



		this.list = this.element.children('ul:first');

		this.lis = $('li:has(a[href])', this.list);

		this.anchors = this.lis.map(function() { return $('a', this)[0]; });

		this.panels = $([]);



		var self = this, o = this.options;



		var fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash

		this.anchors.each(function(i, a) {

			var href = $(a).attr('href');



			// For dynamically created HTML that contains a hash as href IE < 8 expands

			// such href to the full page url with hash and then misinterprets tab as ajax.

			// Same consideration applies for an added tab with a fragment identifier

			// since a[href=#fragment-identifier] does unexpectedly not match.

			// Thus normalize href attribute...

			var hrefBase = href.split('#')[0], baseEl;

			if (hrefBase && (hrefBase === location.toString().split('#')[0] ||

					(baseEl = $('base')[0]) && hrefBase === baseEl.href)) {

				href = a.hash;

				a.href = href;

			}



			// inline tab

			if (fragmentId.test(href)) {

				self.panels = self.panels.add(self._sanitizeSelector(href));

			}



			// remote tab

			else if (href != '#') { // prevent loading the page itself if href is just "#"

				$.data(a, 'href.tabs', href); // required for restore on destroy



				// TODO until #3808 is fixed strip fragment identifier from url

				// (IE fails to load from such url)

				$.data(a, 'load.tabs', href.replace(/#.*$/, '')); // mutable data



				var id = self._tabId(a);

				a.href = '#' + id;

				var $panel = $('#' + id);

				if (!$panel.length) {

					$panel = $(o.panelTemplate).attr('id', id).addClass('ui-tabs-panel ui-widget-content ui-corner-bottom')

						.insertAfter(self.panels[i - 1] || self.list);

					$panel.data('destroy.tabs', true);

				}

				self.panels = self.panels.add($panel);

			}



			// invalid tab href

			else {

				o.disabled.push(i);

			}

		});



		// initialization from scratch

		if (init) {



			// attach necessary classes for styling

			this.element.addClass('ui-tabs ui-widget ui-widget-content ui-corner-all');

			this.list.addClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all');

			this.lis.addClass('ui-state-default ui-corner-top');

			this.panels.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom');



			// Selected tab

			// use "selected" option or try to retrieve:

			// 1. from fragment identifier in url

			// 2. from cookie

			// 3. from selected class attribute on <li>

			if (o.selected === undefined) {

				if (location.hash) {

					this.anchors.each(function(i, a) {

						if (a.hash == location.hash) {

							o.selected = i;

							return false; // break

						}

					});

				}

				if (typeof o.selected != 'number' && o.cookie) {

					o.selected = parseInt(self._cookie(), 10);

				}

				if (typeof o.selected != 'number' && this.lis.filter('.ui-tabs-selected').length) {

					o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected'));

				}

				o.selected = o.selected || 0;

			}

			else if (o.selected === null) { // usage of null is deprecated, TODO remove in next release

				o.selected = -1;

			}



			// sanity check - default to first tab...

			o.selected = ((o.selected >= 0 && this.anchors[o.selected]) || o.selected < 0) ? o.selected : 0;



			// Take disabling tabs via class attribute from HTML

			// into account and update option properly.

			// A selected tab cannot become disabled.

			o.disabled = $.unique(o.disabled.concat(

				$.map(this.lis.filter('.ui-state-disabled'),

					function(n, i) { return self.lis.index(n); } )

			)).sort();



			if ($.inArray(o.selected, o.disabled) != -1) {

				o.disabled.splice($.inArray(o.selected, o.disabled), 1);

			}



			// highlight selected tab

			this.panels.addClass('ui-tabs-hide');

			this.lis.removeClass('ui-tabs-selected ui-state-active');

			if (o.selected >= 0 && this.anchors.length) { // check for length avoids error when initializing empty list

				this.panels.eq(o.selected).removeClass('ui-tabs-hide');

				this.lis.eq(o.selected).addClass('ui-tabs-selected ui-state-active');



				// seems to be expected behavior that the show callback is fired

				self.element.queue("tabs", function() {

					self._trigger('show', null, self._ui(self.anchors[o.selected], self.panels[o.selected]));

				});

				

				this.load(o.selected);

			}



			// clean up to avoid memory leaks in certain versions of IE 6

			$(window).bind('unload', function() {

				self.lis.add(self.anchors).unbind('.tabs');

				self.lis = self.anchors = self.panels = null;

			});



		}

		// update selected after add/remove

		else {

			o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected'));

		}



		// update collapsible

		this.element[o.collapsible ? 'addClass' : 'removeClass']('ui-tabs-collapsible');



		// set or update cookie after init and add/remove respectively

		if (o.cookie) {

			this._cookie(o.selected, o.cookie);

		}



		// disable tabs

		for (var i = 0, li; (li = this.lis[i]); i++) {

			$(li)[$.inArray(i, o.disabled) != -1 &&

				!$(li).hasClass('ui-tabs-selected') ? 'addClass' : 'removeClass']('ui-state-disabled');

		}



		// reset cache if switching from cached to not cached

		if (o.cache === false) {

			this.anchors.removeData('cache.tabs');

		}



		// remove all handlers before, tabify may run on existing tabs after add or option change

		this.lis.add(this.anchors).unbind('.tabs');



		if (o.event != 'mouseover') {

			var addState = function(state, el) {

				if (el.is(':not(.ui-state-disabled)')) {

					el.addClass('ui-state-' + state);

				}

			};

			var removeState = function(state, el) {

				el.removeClass('ui-state-' + state);

			};

			this.lis.bind('mouseover.tabs', function() {

				addState('hover', $(this));

			});

			this.lis.bind('mouseout.tabs', function() {

				removeState('hover', $(this));

			});

			this.anchors.bind('focus.tabs', function() {

				addState('focus', $(this).closest('li'));

			});

			this.anchors.bind('blur.tabs', function() {

				removeState('focus', $(this).closest('li'));

			});

		}



		// set up animations

		var hideFx, showFx;

		if (o.fx) {

			if ($.isArray(o.fx)) {

				hideFx = o.fx[0];

				showFx = o.fx[1];

			}

			else {

				hideFx = showFx = o.fx;

			}

		}



		// Reset certain styles left over from animation

		// and prevent IE's ClearType bug...

		function resetStyle($el, fx) {

			$el.css({ display: '' });

			if ($.browser.msie && fx.opacity) {

				$el[0].style.removeAttribute('filter');

			}

		}



		// Show a tab...

		var showTab = showFx ?

			function(clicked, $show) {

				$(clicked).closest('li').removeClass('ui-state-default').addClass('ui-tabs-selected ui-state-active');

				$show.hide().removeClass('ui-tabs-hide') // avoid flicker that way

					.animate(showFx, showFx.duration || 'normal', function() {

						resetStyle($show, showFx);

						self._trigger('show', null, self._ui(clicked, $show[0]));

					});

			} :

			function(clicked, $show) {

				$(clicked).closest('li').removeClass('ui-state-default').addClass('ui-tabs-selected ui-state-active');

				$show.removeClass('ui-tabs-hide');

				self._trigger('show', null, self._ui(clicked, $show[0]));

			};



		// Hide a tab, $show is optional...

		var hideTab = hideFx ?

			function(clicked, $hide) {

				$hide.animate(hideFx, hideFx.duration || 'normal', function() {

					self.lis.removeClass('ui-tabs-selected ui-state-active').addClass('ui-state-default');

					$hide.addClass('ui-tabs-hide');

					resetStyle($hide, hideFx);

					self.element.dequeue("tabs");

				});

			} :

			function(clicked, $hide, $show) {

				self.lis.removeClass('ui-tabs-selected ui-state-active').addClass('ui-state-default');

				$hide.addClass('ui-tabs-hide');

				self.element.dequeue("tabs");

			};



		// attach tab event handler, unbind to avoid duplicates from former tabifying...

		this.anchors.bind(o.event + '.tabs', function() {

			var el = this, $li = $(this).closest('li'), $hide = self.panels.filter(':not(.ui-tabs-hide)'),

					$show = $(self._sanitizeSelector(this.hash));



			// If tab is already selected and not collapsible or tab disabled or

			// or is already loading or click callback returns false stop here.

			// Check if click handler returns false last so that it is not executed

			// for a disabled or loading tab!

			if (($li.hasClass('ui-tabs-selected') && !o.collapsible) ||

				$li.hasClass('ui-state-disabled') ||

				$li.hasClass('ui-state-processing') ||

				self._trigger('select', null, self._ui(this, $show[0])) === false) {

				this.blur();

				return false;

			}



			o.selected = self.anchors.index(this);



			self.abort();



			// if tab may be closed

			if (o.collapsible) {

				if ($li.hasClass('ui-tabs-selected')) {

					o.selected = -1;



					if (o.cookie) {

						self._cookie(o.selected, o.cookie);

					}



					self.element.queue("tabs", function() {

						hideTab(el, $hide);

					}).dequeue("tabs");

					

					this.blur();

					return false;

				}

				else if (!$hide.length) {

					if (o.cookie) {

						self._cookie(o.selected, o.cookie);

					}

					

					self.element.queue("tabs", function() {

						showTab(el, $show);

					});



					self.load(self.anchors.index(this)); // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171

					

					this.blur();

					return false;

				}

			}



			if (o.cookie) {

				self._cookie(o.selected, o.cookie);

			}



			// show new tab

			if ($show.length) {

				if ($hide.length) {

					self.element.queue("tabs", function() {

						hideTab(el, $hide);

					});

				}

				self.element.queue("tabs", function() {

					showTab(el, $show);

				});

				

				self.load(self.anchors.index(this));

			}

			else {

				throw 'jQuery UI Tabs: Mismatching fragment identifier.';

			}



			// Prevent IE from keeping other link focussed when using the back button

			// and remove dotted border from clicked link. This is controlled via CSS

			// in modern browsers; blur() removes focus from address bar in Firefox

			// which can become a usability and annoying problem with tabs('rotate').

			if ($.browser.msie) {

				this.blur();

			}



		});



		// disable click in any case

		this.anchors.bind('click.tabs', function(){return false;});



	},



	destroy: function() {

		var o = this.options;



		this.abort();

		

		this.element.unbind('.tabs')

			.removeClass('ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible')

			.removeData('tabs');



		this.list.removeClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all');



		this.anchors.each(function() {

			var href = $.data(this, 'href.tabs');

			if (href) {

				this.href = href;

			}

			var $this = $(this).unbind('.tabs');

			$.each(['href', 'load', 'cache'], function(i, prefix) {

				$this.removeData(prefix + '.tabs');

			});

		});



		this.lis.unbind('.tabs').add(this.panels).each(function() {

			if ($.data(this, 'destroy.tabs')) {

				$(this).remove();

			}

			else {

				$(this).removeClass([

					'ui-state-default',

					'ui-corner-top',

					'ui-tabs-selected',

					'ui-state-active',

					'ui-state-hover',

					'ui-state-focus',

					'ui-state-disabled',

					'ui-tabs-panel',

					'ui-widget-content',

					'ui-corner-bottom',

					'ui-tabs-hide'

				].join(' '));

			}

		});



		if (o.cookie) {

			this._cookie(null, o.cookie);

		}

	},



	add: function(url, label, index) {

		if (index === undefined) {

			index = this.anchors.length; // append by default

		}



		var self = this, o = this.options,

			$li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)),

			id = !url.indexOf('#') ? url.replace('#', '') : this._tabId($('a', $li)[0]);



		$li.addClass('ui-state-default ui-corner-top').data('destroy.tabs', true);



		// try to find an existing element before creating a new one

		var $panel = $('#' + id);

		if (!$panel.length) {

			$panel = $(o.panelTemplate).attr('id', id).data('destroy.tabs', true);

		}

		$panel.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide');



		if (index >= this.lis.length) {

			$li.appendTo(this.list);

			$panel.appendTo(this.list[0].parentNode);

		}

		else {

			$li.insertBefore(this.lis[index]);

			$panel.insertBefore(this.panels[index]);

		}



		o.disabled = $.map(o.disabled,

			function(n, i) { return n >= index ? ++n : n; });



		this._tabify();



		if (this.anchors.length == 1) { // after tabify

			$li.addClass('ui-tabs-selected ui-state-active');

			$panel.removeClass('ui-tabs-hide');

			this.element.queue("tabs", function() {

				self._trigger('show', null, self._ui(self.anchors[0], self.panels[0]));

			});

				

			this.load(0);

		}



		// callback

		this._trigger('add', null, this._ui(this.anchors[index], this.panels[index]));

	},



	remove: function(index) {

		var o = this.options, $li = this.lis.eq(index).remove(),

			$panel = this.panels.eq(index).remove();



		// If selected tab was removed focus tab to the right or

		// in case the last tab was removed the tab to the left.

		if ($li.hasClass('ui-tabs-selected') && this.anchors.length > 1) {

			this.select(index + (index + 1 < this.anchors.length ? 1 : -1));

		}



		o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }),

			function(n, i) { return n >= index ? --n : n; });



		this._tabify();



		// callback

		this._trigger('remove', null, this._ui($li.find('a')[0], $panel[0]));

	},



	enable: function(index) {

		var o = this.options;

		if ($.inArray(index, o.disabled) == -1) {

			return;

		}



		this.lis.eq(index).removeClass('ui-state-disabled');

		o.disabled = $.grep(o.disabled, function(n, i) { return n != index; });



		// callback

		this._trigger('enable', null, this._ui(this.anchors[index], this.panels[index]));

	},



	disable: function(index) {

		var self = this, o = this.options;

		if (index != o.selected) { // cannot disable already selected tab

			this.lis.eq(index).addClass('ui-state-disabled');



			o.disabled.push(index);

			o.disabled.sort();



			// callback

			this._trigger('disable', null, this._ui(this.anchors[index], this.panels[index]));

		}

	},



	select: function(index) {

		if (typeof index == 'string') {

			index = this.anchors.index(this.anchors.filter('[href$=' + index + ']'));

		}

		else if (index === null) { // usage of null is deprecated, TODO remove in next release

			index = -1;

		}

		if (index == -1 && this.options.collapsible) {

			index = this.options.selected;

		}



		this.anchors.eq(index).trigger(this.options.event + '.tabs');

	},



	load: function(index) {

		var self = this, o = this.options, a = this.anchors.eq(index)[0], url = $.data(a, 'load.tabs');



		this.abort();



		// not remote or from cache

		if (!url || this.element.queue("tabs").length !== 0 && $.data(a, 'cache.tabs')) {

			this.element.dequeue("tabs");

			return;

		}



		// load remote from here on

		this.lis.eq(index).addClass('ui-state-processing');



		if (o.spinner) {

			var span = $('span', a);

			span.data('label.tabs', span.html()).html(o.spinner);

		}



		this.xhr = $.ajax($.extend({}, o.ajaxOptions, {

			url: url,

			success: function(r, s) {

				$(self._sanitizeSelector(a.hash)).html(r);



				// take care of tab labels

				self._cleanup();



				if (o.cache) {

					$.data(a, 'cache.tabs', true); // if loaded once do not load them again

				}



				// callbacks

				self._trigger('load', null, self._ui(self.anchors[index], self.panels[index]));

				try {

					o.ajaxOptions.success(r, s);

				}

				catch (e) {}



				// last, so that load event is fired before show...

				self.element.dequeue("tabs");

			}

		}));

	},



	abort: function() {

		// stop possibly running animations

		this.element.queue([]);

		this.panels.stop(false, true);



		// terminate pending requests from other tabs

		if (this.xhr) {

			this.xhr.abort();

			delete this.xhr;

		}



		// take care of tab labels

		this._cleanup();



	},



	url: function(index, url) {

		this.anchors.eq(index).removeData('cache.tabs').data('load.tabs', url);

	},



	length: function() {

		return this.anchors.length;

	}



});



$.extend($.ui.tabs, {

	version: '1.7.2',

	getter: 'length',

	defaults: {

		ajaxOptions: null,

		cache: false,

		cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }

		collapsible: false,

		disabled: [],

		event: 'click',

		fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }

		idPrefix: 'ui-tabs-',

		panelTemplate: '<div></div>',

		spinner: '<em>Loading&#8230;</em>',

		tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>'

	}

});



/*

 * Tabs Extensions

 */



/*

 * Rotate

 */

$.extend($.ui.tabs.prototype, {

	rotation: null,

	rotate: function(ms, continuing) {



		var self = this, o = this.options;

		

		var rotate = self._rotate || (self._rotate = function(e) {

			clearTimeout(self.rotation);

			self.rotation = setTimeout(function() {

				var t = o.selected;

				self.select( ++t < self.anchors.length ? t : 0 );

			}, ms);

			

			if (e) {

				e.stopPropagation();

			}

		});

		

		var stop = self._unrotate || (self._unrotate = !continuing ?

			function(e) {

				if (e.clientX) { // in case of a true click

					self.rotate(null);

				}

			} :

			function(e) {

				t = o.selected;

				rotate();

			});



		// start rotation

		if (ms) {

			this.element.bind('tabsshow', rotate);

			this.anchors.bind(o.event + '.tabs', stop);

			rotate();

		}

		// stop rotation

		else {

			clearTimeout(self.rotation);

			this.element.unbind('tabsshow', rotate);

			this.anchors.unbind(o.event + '.tabs', stop);

			delete this._rotate;

			delete this._unrotate;

		}

	}

});



})(jQuery);



/*

 * jQuery UI Draggable 1.7.2

 *

 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)

 * Dual licensed under the MIT (MIT-LICENSE.txt)

 * and GPL (GPL-LICENSE.txt) licenses.

 *

 * http://docs.jquery.com/UI/Draggables

 *

 * Depends:

 *	ui.core.js

 */

(function($) {



$.widget("ui.draggable", $.extend({}, $.ui.mouse, {



	_init: function() {



		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))

			this.element[0].style.position = 'relative';



		(this.options.addClasses && this.element.addClass("ui-draggable"));

		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));



		this._mouseInit();



	},



	destroy: function() {

		if(!this.element.data('draggable')) return;

		this.element

			.removeData("draggable")

			.unbind(".draggable")

			.removeClass("ui-draggable"

				+ " ui-draggable-dragging"

				+ " ui-draggable-disabled");

		this._mouseDestroy();

	},



	_mouseCapture: function(event) {



		var o = this.options;



		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))

			return false;



		//Quit if we're not on a valid handle

		this.handle = this._getHandle(event);

		if (!this.handle)

			return false;



		return true;



	},



	_mouseStart: function(event) {



		var o = this.options;



		//Create and append the visible helper

		this.helper = this._createHelper(event);



		//Cache the helper size

		this._cacheHelperProportions();



		//If ddmanager is used for droppables, set the global draggable

		if($.ui.ddmanager)

			$.ui.ddmanager.current = this;



		/*

		 * - Position generation -

		 * This block generates everything position related - it's the core of draggables.

		 */



		//Cache the margins of the original element

		this._cacheMargins();



		//Store the helper's css position

		this.cssPosition = this.helper.css("position");

		this.scrollParent = this.helper.scrollParent();



		//The element's absolute position on the page minus margins

		this.offset = this.element.offset();

		this.offset = {

			top: this.offset.top - this.margins.top,

			left: this.offset.left - this.margins.left

		};



		$.extend(this.offset, {

			click: { //Where the click happened, relative to the element

				left: event.pageX - this.offset.left,

				top: event.pageY - this.offset.top

			},

			parent: this._getParentOffset(),

			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper

		});



		//Generate the original position

		this.originalPosition = this._generatePosition(event);

		this.originalPageX = event.pageX;

		this.originalPageY = event.pageY;



		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied

		if(o.cursorAt)

			this._adjustOffsetFromHelper(o.cursorAt);



		//Set a containment if given in the options

		if(o.containment)

			this._setContainment();



		//Call plugins and callbacks

		this._trigger("start", event);



		//Recache the helper size

		this._cacheHelperProportions();



		//Prepare the droppable offsets

		if ($.ui.ddmanager && !o.dropBehaviour)

			$.ui.ddmanager.prepareOffsets(this, event);



		this.helper.addClass("ui-draggable-dragging");

		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position

		return true;

	},



	_mouseDrag: function(event, noPropagation) {



		//Compute the helpers position

		this.position = this._generatePosition(event);

		this.positionAbs = this._convertPositionTo("absolute");



		//Call plugins and callbacks and use the resulting position if something is returned

		if (!noPropagation) {

			var ui = this._uiHash();

			this._trigger('drag', event, ui);

			this.position = ui.position;

		}



		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';

		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';

		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);



		return false;

	},



	_mouseStop: function(event) {



		//If we are using droppables, inform the manager about the drop

		var dropped = false;

		if ($.ui.ddmanager && !this.options.dropBehaviour)

			dropped = $.ui.ddmanager.drop(this, event);



		//if a drop comes from outside (a sortable)

		if(this.dropped) {

			dropped = this.dropped;

			this.dropped = false;

		}



		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {

			var self = this;

			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {

				self._trigger("stop", event);

				self._clear();

			});

		} else {

			this._trigger("stop", event);

			this._clear();

		}



		return false;

	},



	_getHandle: function(event) {



		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;

		$(this.options.handle, this.element)

			.find("*")

			.andSelf()

			.each(function() {

				if(this == event.target) handle = true;

			});



		return handle;



	},



	_createHelper: function(event) {



		var o = this.options;

		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);



		if(!helper.parents('body').length)

			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));



		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))

			helper.css("position", "absolute");



		return helper;



	},



	_adjustOffsetFromHelper: function(obj) {

		if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left;

		if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;

		if(obj.top != undefined) this.offset.click.top = obj.top + this.margins.top;

		if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;

	},



	_getParentOffset: function() {



		//Get the offsetParent and cache its position

		this.offsetParent = this.helper.offsetParent();

		var po = this.offsetParent.offset();



		// This is a special case where we need to modify a offset calculated on start, since the following happened:

		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent

		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that

		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag

		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {

			po.left += this.scrollParent.scrollLeft();

			po.top += this.scrollParent.scrollTop();

		}



		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information

		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix

			po = { top: 0, left: 0 };



		return {

			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),

			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)

		};



	},



	_getRelativeOffset: function() {



		if(this.cssPosition == "relative") {

			var p = this.element.position();

			return {

				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),

				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()

			};

		} else {

			return { top: 0, left: 0 };

		}



	},



	_cacheMargins: function() {

		this.margins = {

			left: (parseInt(this.element.css("marginLeft"),10) || 0),

			top: (parseInt(this.element.css("marginTop"),10) || 0)

		};

	},



	_cacheHelperProportions: function() {

		this.helperProportions = {

			width: this.helper.outerWidth(),

			height: this.helper.outerHeight()

		};

	},



	_setContainment: function() {



		var o = this.options;

		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;

		if(o.containment == 'document' || o.containment == 'window') this.containment = [

			0 - this.offset.relative.left - this.offset.parent.left,

			0 - this.offset.relative.top - this.offset.parent.top,

			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,

			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top

		];



		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {

			var ce = $(o.containment)[0]; if(!ce) return;

			var co = $(o.containment).offset();

			var over = ($(ce).css("overflow") != 'hidden');



			this.containment = [

				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,

				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,

				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,

				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top

			];

		} else if(o.containment.constructor == Array) {

			this.containment = o.containment;

		}



	},



	_convertPositionTo: function(d, pos) {



		if(!pos) pos = this.position;

		var mod = d == "absolute" ? 1 : -1;

		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);



		return {

			top: (

				pos.top																	// The absolute mouse position

				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent

				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)

				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)

			),

			left: (

				pos.left																// The absolute mouse position

				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent

				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)

				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)

			)

		};



	},



	_generatePosition: function(event) {



		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);



		// This is another very weird special case that only happens for relative elements:

		// 1. If the css position is relative

		// 2. and the scroll parent is the document or similar to the offset parent

		// we have to refresh the relative offset during the scroll so there are no jumps

		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {

			this.offset.relative = this._getRelativeOffset();

		}



		var pageX = event.pageX;

		var pageY = event.pageY;



		/*

		 * - Position constraining -

		 * Constrain the position to a mix of grid, containment.

		 */



		if(this.originalPosition) { //If we are not dragging yet, we won't check for options



			if(this.containment) {

				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;

				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;

				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;

				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;

			}



			if(o.grid) {

				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];

				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;



				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];

				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;

			}



		}



		return {

			top: (

				pageY																// The absolute mouse position

				- this.offset.click.top													// Click offset (relative to the element)

				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent

				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)

				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))

			),

			left: (

				pageX																// The absolute mouse position

				- this.offset.click.left												// Click offset (relative to the element)

				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent

				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)

				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))

			)

		};



	},



	_clear: function() {

		this.helper.removeClass("ui-draggable-dragging");

		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();

		//if($.ui.ddmanager) $.ui.ddmanager.current = null;

		this.helper = null;

		this.cancelHelperRemoval = false;

	},



	// From now on bulk stuff - mainly helpers



	_trigger: function(type, event, ui) {

		ui = ui || this._uiHash();

		$.ui.plugin.call(this, type, [event, ui]);

		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins

		return $.widget.prototype._trigger.call(this, type, event, ui);

	},



	plugins: {},



	_uiHash: function(event) {

		return {

			helper: this.helper,

			position: this.position,

			absolutePosition: this.positionAbs, //deprecated

			offset: this.positionAbs

		};

	}



}));



$.extend($.ui.draggable, {

	version: "1.7.2",

	eventPrefix: "drag",

	defaults: {

		addClasses: true,

		appendTo: "parent",

		axis: false,

		cancel: ":input,option",

		connectToSortable: false,

		containment: false,

		cursor: "auto",

		cursorAt: false,

		delay: 0,

		distance: 1,

		grid: false,

		handle: false,

		helper: "original",

		iframeFix: false,

		opacity: false,

		refreshPositions: false,

		revert: false,

		revertDuration: 500,

		scope: "default",

		scroll: true,

		scrollSensitivity: 20,

		scrollSpeed: 20,

		snap: false,

		snapMode: "both",

		snapTolerance: 20,

		stack: false,

		zIndex: false

	}

});



$.ui.plugin.add("draggable", "connectToSortable", {

	start: function(event, ui) {



		var inst = $(this).data("draggable"), o = inst.options,

			uiSortable = $.extend({}, ui, { item: inst.element });

		inst.sortables = [];

		$(o.connectToSortable).each(function() {

			var sortable = $.data(this, 'sortable');

			if (sortable && !sortable.options.disabled) {

				inst.sortables.push({

					instance: sortable,

					shouldRevert: sortable.options.revert

				});

				sortable._refreshItems();	//Do a one-time refresh at start to refresh the containerCache

				sortable._trigger("activate", event, uiSortable);

			}

		});



	},

	stop: function(event, ui) {



		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper

		var inst = $(this).data("draggable"),

			uiSortable = $.extend({}, ui, { item: inst.element });



		$.each(inst.sortables, function() {

			if(this.instance.isOver) {



				this.instance.isOver = 0;



				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance

				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)



				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'

				if(this.shouldRevert) this.instance.options.revert = true;



				//Trigger the stop of the sortable

				this.instance._mouseStop(event);



				this.instance.options.helper = this.instance.options._helper;



				//If the helper has been the original item, restore properties in the sortable

				if(inst.options.helper == 'original')

					this.instance.currentItem.css({ top: 'auto', left: 'auto' });



			} else {

				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance

				this.instance._trigger("deactivate", event, uiSortable);

			}



		});



	},

	drag: function(event, ui) {



		var inst = $(this).data("draggable"), self = this;



		var checkPos = function(o) {

			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;

			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;

			var itemHeight = o.height, itemWidth = o.width;

			var itemTop = o.top, itemLeft = o.left;



			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);

		};



		$.each(inst.sortables, function(i) {

			

			//Copy over some variables to allow calling the sortable's native _intersectsWith

			this.instance.positionAbs = inst.positionAbs;

			this.instance.helperProportions = inst.helperProportions;

			this.instance.offset.click = inst.offset.click;

			

			if(this.instance._intersectsWith(this.instance.containerCache)) {



				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once

				if(!this.instance.isOver) {



					this.instance.isOver = 1;

					//Now we fake the start of dragging for the sortable instance,

					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem

					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)

					this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);

					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it

					this.instance.options.helper = function() { return ui.helper[0]; };



					event.target = this.instance.currentItem[0];

					this.instance._mouseCapture(event, true);

					this.instance._mouseStart(event, true, true);



					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes

					this.instance.offset.click.top = inst.offset.click.top;

					this.instance.offset.click.left = inst.offset.click.left;

					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;

					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;



					inst._trigger("toSortable", event);

					inst.dropped = this.instance.element; //draggable revert needs that

					//hack so receive/update callbacks work (mostly)

					inst.currentItem = inst.element;

					this.instance.fromOutside = inst;



				}



				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable

				if(this.instance.currentItem) this.instance._mouseDrag(event);



			} else {



				//If it doesn't intersect with the sortable, and it intersected before,

				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval

				if(this.instance.isOver) {



					this.instance.isOver = 0;

					this.instance.cancelHelperRemoval = true;

					

					//Prevent reverting on this forced stop

					this.instance.options.revert = false;

					

					// The out event needs to be triggered independently

					this.instance._trigger('out', event, this.instance._uiHash(this.instance));

					

					this.instance._mouseStop(event, true);

					this.instance.options.helper = this.instance.options._helper;



					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size

					this.instance.currentItem.remove();

					if(this.instance.placeholder) this.instance.placeholder.remove();



					inst._trigger("fromSortable", event);

					inst.dropped = false; //draggable revert needs that

				}



			};



		});



	}

});



$.ui.plugin.add("draggable", "cursor", {

	start: function(event, ui) {

		var t = $('body'), o = $(this).data('draggable').options;

		if (t.css("cursor")) o._cursor = t.css("cursor");

		t.css("cursor", o.cursor);

	},

	stop: function(event, ui) {

		var o = $(this).data('draggable').options;

		if (o._cursor) $('body').css("cursor", o._cursor);

	}

});



$.ui.plugin.add("draggable", "iframeFix", {

	start: function(event, ui) {

		var o = $(this).data('draggable').options;

		$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {

			$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')

			.css({

				width: this.offsetWidth+"px", height: this.offsetHeight+"px",

				position: "absolute", opacity: "0.001", zIndex: 1000

			})

			.css($(this).offset())

			.appendTo("body");

		});

	},

	stop: function(event, ui) {

		$("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers

	}

});



$.ui.plugin.add("draggable", "opacity", {

	start: function(event, ui) {

		var t = $(ui.helper), o = $(this).data('draggable').options;

		if(t.css("opacity")) o._opacity = t.css("opacity");

		t.css('opacity', o.opacity);

	},

	stop: function(event, ui) {

		var o = $(this).data('draggable').options;

		if(o._opacity) $(ui.helper).css('opacity', o._opacity);

	}

});



$.ui.plugin.add("draggable", "scroll", {

	start: function(event, ui) {

		var i = $(this).data("draggable");

		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();

	},

	drag: function(event, ui) {



		var i = $(this).data("draggable"), o = i.options, scrolled = false;



		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {



			if(!o.axis || o.axis != 'x') {

				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)

					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;

				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)

					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;

			}



			if(!o.axis || o.axis != 'y') {

				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)

					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;

				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)

					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;

			}



		} else {



			if(!o.axis || o.axis != 'x') {

				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)

					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);

				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)

					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);

			}



			if(!o.axis || o.axis != 'y') {

				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)

					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);

				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)

					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);

			}



		}



		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)

			$.ui.ddmanager.prepareOffsets(i, event);



	}

});



$.ui.plugin.add("draggable", "snap", {

	start: function(event, ui) {



		var i = $(this).data("draggable"), o = i.options;

		i.snapElements = [];



		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {

			var $t = $(this); var $o = $t.offset();

			if(this != i.element[0]) i.snapElements.push({

				item: this,

				width: $t.outerWidth(), height: $t.outerHeight(),

				top: $o.top, left: $o.left

			});

		});



	},

	drag: function(event, ui) {



		var inst = $(this).data("draggable"), o = inst.options;

		var d = o.snapTolerance;



		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,

			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;



		for (var i = inst.snapElements.length - 1; i >= 0; i--){



			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,

				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;



			//Yes, I know, this is insane ;)

			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {

				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));

				inst.snapElements[i].snapping = false;

				continue;

			}



			if(o.snapMode != 'inner') {

				var ts = Math.abs(t - y2) <= d;

				var bs = Math.abs(b - y1) <= d;

				var ls = Math.abs(l - x2) <= d;

				var rs = Math.abs(r - x1) <= d;

				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;

				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;

				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;

				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;

			}



			var first = (ts || bs || ls || rs);



			if(o.snapMode != 'outer') {

				var ts = Math.abs(t - y1) <= d;

				var bs = Math.abs(b - y2) <= d;

				var ls = Math.abs(l - x1) <= d;

				var rs = Math.abs(r - x2) <= d;

				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;

				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;

				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;

				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;

			}



			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))

				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));

			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);



		};



	}

});



$.ui.plugin.add("draggable", "stack", {

	start: function(event, ui) {



		var o = $(this).data("draggable").options;



		var group = $.makeArray($(o.stack.group)).sort(function(a,b) {

			return (parseInt($(a).css("zIndex"),10) || o.stack.min) - (parseInt($(b).css("zIndex"),10) || o.stack.min);

		});



		$(group).each(function(i) {

			this.style.zIndex = o.stack.min + i;

		});



		this[0].style.zIndex = o.stack.min + group.length;



	}

});



$.ui.plugin.add("draggable", "zIndex", {

	start: function(event, ui) {

		var t = $(ui.helper), o = $(this).data("draggable").options;

		if(t.css("zIndex")) o._zIndex = t.css("zIndex");

		t.css('zIndex', o.zIndex);

	},

	stop: function(event, ui) {

		var o = $(this).data("draggable").options;

		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);

	}

});



})(jQuery);



/*

 * jQuery UI Resizable 1.7.2

 *

 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)

 * Dual licensed under the MIT (MIT-LICENSE.txt)

 * and GPL (GPL-LICENSE.txt) licenses.

 *

 * http://docs.jquery.com/UI/Resizables

 *

 * Depends:

 *	ui.core.js

 */

(function($) {



$.widget("ui.resizable", $.extend({}, $.ui.mouse, {



	_init: function() {



		var self = this, o = this.options;

		this.element.addClass("ui-resizable");



		$.extend(this, {

			_aspectRatio: !!(o.aspectRatio),

			aspectRatio: o.aspectRatio,

			originalElement: this.element,

			_proportionallyResizeElements: [],

			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null

		});



		//Wrap the element if it cannot hold child nodes

		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {



			//Opera fix for relative positioning

			if (/relative/.test(this.element.css('position')) && $.browser.opera)

				this.element.css({ position: 'relative', top: 'auto', left: 'auto' });



			//Create a wrapper element and set the wrapper to the new current internal element

			this.element.wrap(

				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({

					position: this.element.css('position'),

					width: this.element.outerWidth(),

					height: this.element.outerHeight(),

					top: this.element.css('top'),

					left: this.element.css('left')

				})

			);



			//Overwrite the original this.element

			this.element = this.element.parent().data(

				"resizable", this.element.data('resizable')

			);



			this.elementIsWrapper = true;



			//Move margins to the wrapper

			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });

			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});



			//Prevent Safari textarea resize

			this.originalResizeStyle = this.originalElement.css('resize');

			this.originalElement.css('resize', 'none');



			//Push the actual element to our proportionallyResize internal array

			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));



			// avoid IE jump (hard set the margin)

			this.originalElement.css({ margin: this.originalElement.css('margin') });



			// fix handlers offset

			this._proportionallyResize();



		}



		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });

		if(this.handles.constructor == String) {



			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';

			var n = this.handles.split(","); this.handles = {};



			for(var i = 0; i < n.length; i++) {



				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;

				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');



				// increase zIndex of sw, se, ne, nw axis

				//TODO : this modifies original option

				if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });



				//TODO : What's going on here?

				if ('se' == handle) {

					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');

				};



				//Insert into internal handles object and append to element

				this.handles[handle] = '.ui-resizable-'+handle;

				this.element.append(axis);

			}



		}



		this._renderAxis = function(target) {



			target = target || this.element;



			for(var i in this.handles) {



				if(this.handles[i].constructor == String)

					this.handles[i] = $(this.handles[i], this.element).show();



				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)

				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {



					var axis = $(this.handles[i], this.element), padWrapper = 0;



					//Checking the correct pad and border

					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();



					//The padding type i have to apply...

					var padPos = [ 'padding',

						/ne|nw|n/.test(i) ? 'Top' :

						/se|sw|s/.test(i) ? 'Bottom' :

						/^e$/.test(i) ? 'Right' : 'Left' ].join("");



					target.css(padPos, padWrapper);



					this._proportionallyResize();



				}



				//TODO: What's that good for? There's not anything to be executed left

				if(!$(this.handles[i]).length)

					continue;



			}

		};



		//TODO: make renderAxis a prototype function

		this._renderAxis(this.element);



		this._handles = $('.ui-resizable-handle', this.element)

			.disableSelection();



		//Matching axis name

		this._handles.mouseover(function() {

			if (!self.resizing) {

				if (this.className)

					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);

				//Axis, default = se

				self.axis = axis && axis[1] ? axis[1] : 'se';

			}

		});



		//If we want to auto hide the elements

		if (o.autoHide) {

			this._handles.hide();

			$(this.element)

				.addClass("ui-resizable-autohide")

				.hover(function() {

					$(this).removeClass("ui-resizable-autohide");

					self._handles.show();

				},

				function(){

					if (!self.resizing) {

						$(this).addClass("ui-resizable-autohide");

						self._handles.hide();

					}

				});

		}



		//Initialize the mouse interaction

		this._mouseInit();



	},



	destroy: function() {



		this._mouseDestroy();



		var _destroy = function(exp) {

			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")

				.removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();

		};



		//TODO: Unwrap at same DOM position

		if (this.elementIsWrapper) {

			_destroy(this.element);

			var wrapper = this.element;

			wrapper.parent().append(

				this.originalElement.css({

					position: wrapper.css('position'),

					width: wrapper.outerWidth(),

					height: wrapper.outerHeight(),

					top: wrapper.css('top'),

					left: wrapper.css('left')

				})

			).end().remove();

		}



		this.originalElement.css('resize', this.originalResizeStyle);

		_destroy(this.originalElement);



	},



	_mouseCapture: function(event) {



		var handle = false;

		for(var i in this.handles) {

			if($(this.handles[i])[0] == event.target) handle = true;

		}



		return this.options.disabled || !!handle;



	},



	_mouseStart: function(event) {



		var o = this.options, iniPos = this.element.position(), el = this.element;



		this.resizing = true;

		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };



		// bugfix for http://dev.jquery.com/ticket/1749

		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {

			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });

		}



		//Opera fixing relative position

		if ($.browser.opera && (/relative/).test(el.css('position')))

			el.css({ position: 'relative', top: 'auto', left: 'auto' });



		this._renderProxy();



		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));



		if (o.containment) {

			curleft += $(o.containment).scrollLeft() || 0;

			curtop += $(o.containment).scrollTop() || 0;

		}



		//Store needed variables

		this.offset = this.helper.offset();

		this.position = { left: curleft, top: curtop };

		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };

		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };

		this.originalPosition = { left: curleft, top: curtop };

		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };

		this.originalMousePosition = { left: event.pageX, top: event.pageY };



		//Aspect Ratio

		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);



	    var cursor = $('.ui-resizable-' + this.axis).css('cursor');

	    $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);



		el.addClass("ui-resizable-resizing");

		this._propagate("start", event);

		return true;

	},



	_mouseDrag: function(event) {



		//Increase performance, avoid regex

		var el = this.helper, o = this.options, props = {},

			self = this, smp = this.originalMousePosition, a = this.axis;



		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;

		var trigger = this._change[a];

		if (!trigger) return false;



		// Calculate the attrs that will be change

		var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;



		if (this._aspectRatio || event.shiftKey)

			data = this._updateRatio(data, event);



		data = this._respectSize(data, event);



		// plugins callbacks need to be called first

		this._propagate("resize", event);



		el.css({

			top: this.position.top + "px", left: this.position.left + "px",

			width: this.size.width + "px", height: this.size.height + "px"

		});



		if (!this._helper && this._proportionallyResizeElements.length)

			this._proportionallyResize();



		this._updateCache(data);



		// calling the user callback at the end

		this._trigger('resize', event, this.ui());



		return false;

	},



	_mouseStop: function(event) {



		this.resizing = false;

		var o = this.options, self = this;



		if(this._helper) {

			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),

						soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,

							soffsetw = ista ? 0 : self.sizeDiff.width;



			var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },

				left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,

				top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;



			if (!o.animate)

				this.element.css($.extend(s, { top: top, left: left }));



			self.helper.height(self.size.height);

			self.helper.width(self.size.width);



			if (this._helper && !o.animate) this._proportionallyResize();

		}



		$('body').css('cursor', 'auto');



		this.element.removeClass("ui-resizable-resizing");



		this._propagate("stop", event);



		if (this._helper) this.helper.remove();

		return false;



	},



	_updateCache: function(data) {

		var o = this.options;

		this.offset = this.helper.offset();

		if (isNumber(data.left)) this.position.left = data.left;

		if (isNumber(data.top)) this.position.top = data.top;

		if (isNumber(data.height)) this.size.height = data.height;

		if (isNumber(data.width)) this.size.width = data.width;

	},



	_updateRatio: function(data, event) {



		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;



		if (data.height) data.width = (csize.height * this.aspectRatio);

		else if (data.width) data.height = (csize.width / this.aspectRatio);



		if (a == 'sw') {

			data.left = cpos.left + (csize.width - data.width);

			data.top = null;

		}

		if (a == 'nw') {

			data.top = cpos.top + (csize.height - data.height);

			data.left = cpos.left + (csize.width - data.width);

		}



		return data;

	},



	_respectSize: function(data, event) {



		var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,

				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),

					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);



		if (isminw) data.width = o.minWidth;

		if (isminh) data.height = o.minHeight;

		if (ismaxw) data.width = o.maxWidth;

		if (ismaxh) data.height = o.maxHeight;



		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;

		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);



		if (isminw && cw) data.left = dw - o.minWidth;

		if (ismaxw && cw) data.left = dw - o.maxWidth;

		if (isminh && ch)	data.top = dh - o.minHeight;

		if (ismaxh && ch)	data.top = dh - o.maxHeight;



		// fixing jump error on top/left - bug #2330

		var isNotwh = !data.width && !data.height;

		if (isNotwh && !data.left && data.top) data.top = null;

		else if (isNotwh && !data.top && data.left) data.left = null;



		return data;

	},



	_proportionallyResize: function() {



		var o = this.options;

		if (!this._proportionallyResizeElements.length) return;

		var element = this.helper || this.element;



		for (var i=0; i < this._proportionallyResizeElements.length; i++) {



			var prel = this._proportionallyResizeElements[i];



			if (!this.borderDif) {

				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],

					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];



				this.borderDif = $.map(b, function(v, i) {

					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;

					return border + padding;

				});

			}



			if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))

				continue;



			prel.css({

				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,

				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0

			});



		};



	},



	_renderProxy: function() {



		var el = this.element, o = this.options;

		this.elementOffset = el.offset();



		if(this._helper) {



			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');



			// fix ie6 offset TODO: This seems broken

			var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),

			pxyoffset = ( ie6 ? 2 : -1 );



			this.helper.addClass(this._helper).css({

				width: this.element.outerWidth() + pxyoffset,

				height: this.element.outerHeight() + pxyoffset,

				position: 'absolute',

				left: this.elementOffset.left - ie6offset +'px',

				top: this.elementOffset.top - ie6offset +'px',

				zIndex: ++o.zIndex //TODO: Don't modify option

			});



			this.helper

				.appendTo("body")

				.disableSelection();



		} else {

			this.helper = this.element;

		}



	},



	_change: {

		e: function(event, dx, dy) {

			return { width: this.originalSize.width + dx };

		},

		w: function(event, dx, dy) {

			var o = this.options, cs = this.originalSize, sp = this.originalPosition;

			return { left: sp.left + dx, width: cs.width - dx };

		},

		n: function(event, dx, dy) {

			var o = this.options, cs = this.originalSize, sp = this.originalPosition;

			return { top: sp.top + dy, height: cs.height - dy };

		},

		s: function(event, dx, dy) {

			return { height: this.originalSize.height + dy };

		},

		se: function(event, dx, dy) {

			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));

		},

		sw: function(event, dx, dy) {

			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));

		},

		ne: function(event, dx, dy) {

			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));

		},

		nw: function(event, dx, dy) {

			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));

		}

	},



	_propagate: function(n, event) {

		$.ui.plugin.call(this, n, [event, this.ui()]);

		(n != "resize" && this._trigger(n, event, this.ui()));

	},



	plugins: {},



	ui: function() {

		return {

			originalElement: this.originalElement,

			element: this.element,

			helper: this.helper,

			position: this.position,

			size: this.size,

			originalSize: this.originalSize,

			originalPosition: this.originalPosition

		};

	}



}));



$.extend($.ui.resizable, {

	version: "1.7.2",

	eventPrefix: "resize",

	defaults: {

		alsoResize: false,

		animate: false,

		animateDuration: "slow",

		animateEasing: "swing",

		aspectRatio: false,

		autoHide: false,

		cancel: ":input,option",

		containment: false,

		delay: 0,

		distance: 1,

		ghost: false,

		grid: false,

		handles: "e,s,se",

		helper: false,

		maxHeight: null,

		maxWidth: null,

		minHeight: 10,

		minWidth: 10,

		zIndex: 1000

	}

});



/*

 * Resizable Extensions

 */



$.ui.plugin.add("resizable", "alsoResize", {



	start: function(event, ui) {



		var self = $(this).data("resizable"), o = self.options;



		_store = function(exp) {

			$(exp).each(function() {

				$(this).data("resizable-alsoresize", {

					width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),

					left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)

				});

			});

		};



		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {

			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0];	_store(o.alsoResize); }

			else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }

		}else{

			_store(o.alsoResize);

		}

	},



	resize: function(event, ui){

		var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;



		var delta = {

			height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,

			top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0

		},



		_alsoResize = function(exp, c) {

			$(exp).each(function() {

				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];



				$.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {

					var sum = (start[prop]||0) + (delta[prop]||0);

					if (sum && sum >= 0)

						style[prop] = sum || null;

				});



				//Opera fixing relative position

				if (/relative/.test(el.css('position')) && $.browser.opera) {

					self._revertToRelativePosition = true;

					el.css({ position: 'absolute', top: 'auto', left: 'auto' });

				}



				el.css(style);

			});

		};



		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {

			$.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });

		}else{

			_alsoResize(o.alsoResize);

		}

	},



	stop: function(event, ui){

		var self = $(this).data("resizable");



		//Opera fixing relative position

		if (self._revertToRelativePosition && $.browser.opera) {

			self._revertToRelativePosition = false;

			el.css({ position: 'relative' });

		}



		$(this).removeData("resizable-alsoresize-start");

	}

});



$.ui.plugin.add("resizable", "animate", {



	stop: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options;



		var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),

					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,

						soffsetw = ista ? 0 : self.sizeDiff.width;



		var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },

					left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,

						top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;



		self.element.animate(

			$.extend(style, top && left ? { top: top, left: left } : {}), {

				duration: o.animateDuration,

				easing: o.animateEasing,

				step: function() {



					var data = {

						width: parseInt(self.element.css('width'), 10),

						height: parseInt(self.element.css('height'), 10),

						top: parseInt(self.element.css('top'), 10),

						left: parseInt(self.element.css('left'), 10)

					};



					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });



					// propagating resize, and updating values for each animation step

					self._updateCache(data);

					self._propagate("resize", event);



				}

			}

		);

	}



});



$.ui.plugin.add("resizable", "containment", {



	start: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options, el = self.element;

		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;

		if (!ce) return;



		self.containerElement = $(ce);



		if (/document/.test(oc) || oc == document) {

			self.containerOffset = { left: 0, top: 0 };

			self.containerPosition = { left: 0, top: 0 };



			self.parentData = {

				element: $(document), left: 0, top: 0,

				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight

			};

		}



		// i'm a node, so compute top, left, right, bottom

		else {

			var element = $(ce), p = [];

			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });



			self.containerOffset = element.offset();

			self.containerPosition = element.position();

			self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };



			var co = self.containerOffset, ch = self.containerSize.height,	cw = self.containerSize.width,

						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);



			self.parentData = {

				element: ce, left: co.left, top: co.top, width: width, height: height

			};

		}

	},



	resize: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options,

				ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,

				pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;



		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;



		if (cp.left < (self._helper ? co.left : 0)) {

			self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));

			if (pRatio) self.size.height = self.size.width / o.aspectRatio;

			self.position.left = o.helper ? co.left : 0;

		}



		if (cp.top < (self._helper ? co.top : 0)) {

			self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);

			if (pRatio) self.size.width = self.size.height * o.aspectRatio;

			self.position.top = self._helper ? co.top : 0;

		}



		self.offset.left = self.parentData.left+self.position.left;

		self.offset.top = self.parentData.top+self.position.top;



		var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),

					hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );



		var isParent = self.containerElement.get(0) == self.element.parent().get(0),

		    isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));



		if(isParent && isOffsetRelative) woset -= self.parentData.left;



		if (woset + self.size.width >= self.parentData.width) {

			self.size.width = self.parentData.width - woset;

			if (pRatio) self.size.height = self.size.width / self.aspectRatio;

		}



		if (hoset + self.size.height >= self.parentData.height) {

			self.size.height = self.parentData.height - hoset;

			if (pRatio) self.size.width = self.size.height * self.aspectRatio;

		}

	},



	stop: function(event, ui){

		var self = $(this).data("resizable"), o = self.options, cp = self.position,

				co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;



		var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;



		if (self._helper && !o.animate && (/relative/).test(ce.css('position')))

			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });



		if (self._helper && !o.animate && (/static/).test(ce.css('position')))

			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });



	}

});



$.ui.plugin.add("resizable", "ghost", {



	start: function(event, ui) {



		var self = $(this).data("resizable"), o = self.options, cs = self.size;



		self.ghost = self.originalElement.clone();

		self.ghost

			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })

			.addClass('ui-resizable-ghost')

			.addClass(typeof o.ghost == 'string' ? o.ghost : '');



		self.ghost.appendTo(self.helper);



	},



	resize: function(event, ui){

		var self = $(this).data("resizable"), o = self.options;

		if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });

	},



	stop: function(event, ui){

		var self = $(this).data("resizable"), o = self.options;

		if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));

	}



});



$.ui.plugin.add("resizable", "grid", {



	resize: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;

		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;

		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);



		if (/^(se|s|e)$/.test(a)) {

			self.size.width = os.width + ox;

			self.size.height = os.height + oy;

		}

		else if (/^(ne)$/.test(a)) {

			self.size.width = os.width + ox;

			self.size.height = os.height + oy;

			self.position.top = op.top - oy;

		}

		else if (/^(sw)$/.test(a)) {

			self.size.width = os.width + ox;

			self.size.height = os.height + oy;

			self.position.left = op.left - ox;

		}

		else {

			self.size.width = os.width + ox;

			self.size.height = os.height + oy;

			self.position.top = op.top - oy;

			self.position.left = op.left - ox;

		}

	}



});



var num = function(v) {

	return parseInt(v, 10) || 0;

};



var isNumber = function(value) {

	return !isNaN(parseInt(value, 10));

};



})(jQuery);





/*

 * jQuery UI Dialog 1.7.2

 *

 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)

 * Dual licensed under the MIT (MIT-LICENSE.txt)

 * and GPL (GPL-LICENSE.txt) licenses.

 *

 * http://docs.jquery.com/UI/Dialog

 *

 * Depends:

 *	ui.core.js

 *	ui.draggable.js

 *	ui.resizable.js

 */

(function($) {



var setDataSwitch = {

		dragStart: "start.draggable",

		drag: "drag.draggable",

		dragStop: "stop.draggable",

		maxHeight: "maxHeight.resizable",

		minHeight: "minHeight.resizable",

		maxWidth: "maxWidth.resizable",

		minWidth: "minWidth.resizable",

		resizeStart: "start.resizable",

		resize: "drag.resizable",

		resizeStop: "stop.resizable"

	},

	

	uiDialogClasses =

		'ui-dialog ' +

		'ui-widget ' +

		'ui-widget-content ' +

		'ui-corner-all ';



$.widget("ui.dialog", {



	_init: function() {

		this.originalTitle = this.element.attr('title');



		var self = this,

			options = this.options,



			title = options.title || this.originalTitle || '&nbsp;',

			titleId = $.ui.dialog.getTitleId(this.element),



			uiDialog = (this.uiDialog = $('<div/>'))

				.appendTo(document.body)

				.hide()

				.addClass(uiDialogClasses + options.dialogClass)

				.css({

					position: 'absolute',

					overflow: 'hidden',

					zIndex: options.zIndex

				})

				// setting tabIndex makes the div focusable

				// setting outline to 0 prevents a border on focus in Mozilla

				.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {

					(options.closeOnEscape && event.keyCode

						&& event.keyCode == $.ui.keyCode.ESCAPE && self.close(event));

				})

				.attr({

					role: 'dialog',

					'aria-labelledby': titleId

				})

				.mousedown(function(event) {

					self.moveToTop(false, event);

				}),



			uiDialogContent = this.element

				.show()

				.removeAttr('title')

				.addClass(

					'ui-dialog-content ' +

					'ui-widget-content')

				.appendTo(uiDialog),



			uiDialogTitlebar = (this.uiDialogTitlebar = $('<div></div>'))

				.addClass(

					'ui-dialog-titlebar ' +

					'ui-widget-header ' +

					'ui-corner-all ' +

					'ui-helper-clearfix'

				)

				.prependTo(uiDialog),



			uiDialogTitlebarClose = $('<a href="#"/>')

				.addClass(

					'ui-dialog-titlebar-close ' +

					'ui-corner-all'

				)

				.attr('role', 'button')

				.hover(

					function() {

						uiDialogTitlebarClose.addClass('ui-state-hover');

					},

					function() {

						uiDialogTitlebarClose.removeClass('ui-state-hover');

					}

				)

				.focus(function() {

					uiDialogTitlebarClose.addClass('ui-state-focus');

				})

				.blur(function() {

					uiDialogTitlebarClose.removeClass('ui-state-focus');

				})

				.mousedown(function(ev) {

					ev.stopPropagation();

				})

				.click(function(event) {

					self.close(event);

					return false;

				})

				.appendTo(uiDialogTitlebar),



			uiDialogTitlebarCloseText = (this.uiDialogTitlebarCloseText = $('<span/>'))

				.addClass(

					'ui-icon ' +

					'ui-icon-closethick'

				)

				.text(options.closeText)

				.appendTo(uiDialogTitlebarClose),



			uiDialogTitle = $('<span/>')

				.addClass('ui-dialog-title')

				.attr('id', titleId)

				.html(title)

				.prependTo(uiDialogTitlebar);



		uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();



		(options.draggable && $.fn.draggable && this._makeDraggable());

		(options.resizable && $.fn.resizable && this._makeResizable());



		this._createButtons(options.buttons);

		this._isOpen = false;



		(options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe());

		(options.autoOpen && this.open());

		

	},



	destroy: function() {

		(this.overlay && this.overlay.destroy());

		this.uiDialog.hide();

		this.element

			.unbind('.dialog')

			.removeData('dialog')

			.removeClass('ui-dialog-content ui-widget-content')

			.hide().appendTo('body');

		this.uiDialog.remove();



		(this.originalTitle && this.element.attr('title', this.originalTitle));

	},



	close: function(event) {

		var self = this;

		

		if (false === self._trigger('beforeclose', event)) {

			return;

		}



		(self.overlay && self.overlay.destroy());

		self.uiDialog.unbind('keypress.ui-dialog');



		(self.options.hide

			? self.uiDialog.hide(self.options.hide, function() {

				self._trigger('close', event);

			})

			: self.uiDialog.hide() && self._trigger('close', event));



		$.ui.dialog.overlay.resize();



		self._isOpen = false;

		

		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)

		if (self.options.modal) {

			var maxZ = 0;

			$('.ui-dialog').each(function() {

				if (this != self.uiDialog[0]) {

					maxZ = Math.max(maxZ, $(this).css('z-index'));

				}

			});

			$.ui.dialog.maxZ = maxZ;

		}

	},



	isOpen: function() {

		return this._isOpen;

	},



	// the force parameter allows us to move modal dialogs to their correct

	// position on open

	moveToTop: function(force, event) {



		if ((this.options.modal && !force)

			|| (!this.options.stack && !this.options.modal)) {

			return this._trigger('focus', event);

		}

		

		if (this.options.zIndex > $.ui.dialog.maxZ) {

			$.ui.dialog.maxZ = this.options.zIndex;

		}

		(this.overlay && this.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = ++$.ui.dialog.maxZ));



		//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.

		//  http://ui.jquery.com/bugs/ticket/3193

		var saveScroll = { scrollTop: this.element.attr('scrollTop'), scrollLeft: this.element.attr('scrollLeft') };

		this.uiDialog.css('z-index', ++$.ui.dialog.maxZ);

		this.element.attr(saveScroll);

		this._trigger('focus', event);

	},



	open: function() {

		if (this._isOpen) { return; }

		

		



		var options = this.options,

			uiDialog = this.uiDialog;



		this.overlay = options.modal ? new $.ui.dialog.overlay(this) : null;

		(uiDialog.next().length && uiDialog.appendTo('body'));

		this._size();

		this._position(options.position);

		uiDialog.show(options.show);

		this.moveToTop(true);



		// prevent tabbing out of modal dialogs

		(options.modal && uiDialog.bind('keypress.ui-dialog', function(event) {

			if (event.keyCode != $.ui.keyCode.TAB) {

				return;

			}



			var tabbables = $(':tabbable', this),

				first = tabbables.filter(':first')[0],

				last  = tabbables.filter(':last')[0];



			if (event.target == last && !event.shiftKey) {

				setTimeout(function() {

					first.focus();

				}, 1);

			} else if (event.target == first && event.shiftKey) {

				setTimeout(function() {

					last.focus();

				}, 1);

			}

		}));



		// set focus to the first tabbable element in the content area or the first button

		// if there are no tabbable elements, set focus on the dialog itself

		$([])

			.add(uiDialog.find('.ui-dialog-content :tabbable:first'))

			.add(uiDialog.find('.ui-dialog-buttonpane :tabbable:first'))

			.add(uiDialog)

			.filter(':first')

			.focus();



		this._trigger('open');

		this._isOpen = true;

	},



	_createButtons: function(buttons) {

		var self = this,

			hasButtons = false,

			uiDialogButtonPane = $('<div></div>')

				.addClass(

					'ui-dialog-buttonpane ' +

					'ui-widget-content ' +

					'ui-helper-clearfix'

				);



		// if we already have a button pane, remove it

		this.uiDialog.find('.ui-dialog-buttonpane').remove();



		(typeof buttons == 'object' && buttons !== null &&

			$.each(buttons, function() { return !(hasButtons = true); }));

		if (hasButtons) {

			$.each(buttons, function(name, fn) {

				$('<button type="button"></button>')

					.addClass(

						'ui-state-default ' +

						'ui-corner-all'

					)

					.text(name)

					.click(function() { fn.apply(self.element[0], arguments); })

					.hover(

						function() {

							$(this).addClass('ui-state-hover');

						},

						function() {

							$(this).removeClass('ui-state-hover');

						}

					)

					.focus(function() {

						$(this).addClass('ui-state-focus');

					})

					.blur(function() {

						$(this).removeClass('ui-state-focus');

					})

					.appendTo(uiDialogButtonPane);

			});

			uiDialogButtonPane.appendTo(this.uiDialog);

		}

	},



	_makeDraggable: function() {

		var self = this,

			options = this.options,

			heightBeforeDrag;



		this.uiDialog.draggable({

			cancel: '.ui-dialog-content',

			handle: '.ui-dialog-titlebar',

			containment: 'document',

			start: function() {

				heightBeforeDrag = options.height;

				$(this).height($(this).height()).addClass("ui-dialog-dragging");

				(options.dragStart && options.dragStart.apply(self.element[0], arguments));

			},

			drag: function() {

				(options.drag && options.drag.apply(self.element[0], arguments));

			},

			stop: function() {

				$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);

				(options.dragStop && options.dragStop.apply(self.element[0], arguments));

				$.ui.dialog.overlay.resize();

			}

		});

	},



	_makeResizable: function(handles) {

		handles = (handles === undefined ? this.options.resizable : handles);

		var self = this,

			options = this.options,

			resizeHandles = typeof handles == 'string'

				? handles

				: 'n,e,s,w,se,sw,ne,nw';



		this.uiDialog.resizable({

			cancel: '.ui-dialog-content',

			alsoResize: this.element,

			maxWidth: options.maxWidth,

			maxHeight: options.maxHeight,

			minWidth: options.minWidth,

			minHeight: options.minHeight,

			start: function() {

				$(this).addClass("ui-dialog-resizing");

				(options.resizeStart && options.resizeStart.apply(self.element[0], arguments));

			},

			resize: function() {

				(options.resize && options.resize.apply(self.element[0], arguments));

			},

			handles: resizeHandles,

			stop: function() {

				$(this).removeClass("ui-dialog-resizing");

				options.height = $(this).height();

				options.width = $(this).width();

				(options.resizeStop && options.resizeStop.apply(self.element[0], arguments));

				$.ui.dialog.overlay.resize();

			}

		})

		.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');

	},



	_position: function(pos) {

		var wnd = $(window), doc = $(document),

			pTop = doc.scrollTop(), pLeft = doc.scrollLeft(),

			minTop = pTop;



		if ($.inArray(pos, ['center','top','right','bottom','left']) >= 0) {

			pos = [

				pos == 'right' || pos == 'left' ? pos : 'center',

				pos == 'top' || pos == 'bottom' ? pos : 'middle'

			];

		}

		if (pos.constructor != Array) {

			pos = ['center', 'middle'];

		}

		if (pos[0].constructor == Number) {

			pLeft += pos[0];

		} else {

			switch (pos[0]) {

				case 'left':

					pLeft += 0;

					break;

				case 'right':

					pLeft += wnd.width() - this.uiDialog.outerWidth();

					break;

				default:

				case 'center':

					pLeft += (wnd.width() - this.uiDialog.outerWidth()) / 2;

			}

		}

		if (pos[1].constructor == Number) {

			pTop += pos[1];

		} else {

			switch (pos[1]) {

				case 'top':

					

					pTop += 0;

					break;

				case 'bottom':

					pTop += wnd.height() - this.uiDialog.outerHeight();

					break;

				default:

				case 'middle':

					pTop += (wnd.height() - this.uiDialog.outerHeight()) / 2;

			}

		}



		// prevent the dialog from being too high (make sure the titlebar

		// is accessible)

		

		//pTop = Math.max(pTop, minTop);

		// hug, set to 0 so it is always at the top

		pTop = 0;

		this.uiDialog.css({top: pTop, left: pLeft});

	},



	_setData: function(key, value){

		(setDataSwitch[key] && this.uiDialog.data(setDataSwitch[key], value));

		switch (key) {

			case "buttons":

				this._createButtons(value);

				break;

			case "closeText":

				this.uiDialogTitlebarCloseText.text(value);

				break;

			case "dialogClass":

				this.uiDialog

					.removeClass(this.options.dialogClass)

					.addClass(uiDialogClasses + value);

				break;

			case "draggable":

				(value

					? this._makeDraggable()

					: this.uiDialog.draggable('destroy'));

				break;

			case "height":

				this.uiDialog.height(value);

				break;

			case "position":

				this._position(value);

				break;

			case "resizable":

				var uiDialog = this.uiDialog,

					isResizable = this.uiDialog.is(':data(resizable)');



				// currently resizable, becoming non-resizable

				(isResizable && !value && uiDialog.resizable('destroy'));



				// currently resizable, changing handles

				(isResizable && typeof value == 'string' &&

					uiDialog.resizable('option', 'handles', value));



				// currently non-resizable, becoming resizable

				(isResizable || this._makeResizable(value));

				break;

			case "title":

				$(".ui-dialog-title", this.uiDialogTitlebar).html(value || '&nbsp;');

				break;

			case "width":

				this.uiDialog.width(value);

				break;

		}



		$.widget.prototype._setData.apply(this, arguments);

	},



	_size: function() {

		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content

		 * divs will both have width and height set, so we need to reset them

		 */

		var options = this.options;



		// reset content sizing

		this.element.css({

			height: 0,

			minHeight: 0,

			width: 'auto'

		});



		// reset wrapper sizing

		// determine the height of all the non-content elements

		var nonContentHeight = this.uiDialog.css({

				height: 'auto',

				width: options.width

			})

			.height();



		this.element

			.css({

				minHeight: Math.max(options.minHeight - nonContentHeight, 0),

				height: options.height == 'auto'

					? 'auto'

					: Math.max(options.height - nonContentHeight, 0)

			});

	}

});



$.extend($.ui.dialog, {

	version: "1.7.2",

	defaults: {

		autoOpen: true,

		bgiframe: false,

		buttons: {},

		closeOnEscape: true,

		closeText: 'close',

		dialogClass: '',

		draggable: true,

		hide: null,

		height: 'auto',

		maxHeight: false,

		maxWidth: false,

		minHeight: 150,

		minWidth: 150,

		modal: false,

		position: 'center',

		resizable: true,

		show: null,

		stack: true,

		title: '',

		width: 300,

		zIndex: 1000

	},



	getter: 'isOpen',



	uuid: 0,

	maxZ: 0,



	getTitleId: function($el) {

		return 'ui-dialog-title-' + ($el.attr('id') || ++this.uuid);

	},



	overlay: function(dialog) {

		this.$el = $.ui.dialog.overlay.create(dialog);

	}

});



$.extend($.ui.dialog.overlay, {

	instances: [],

	maxZ: 0,

	events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),

		function(event) { return event + '.dialog-overlay'; }).join(' '),

	create: function(dialog) {

		if (this.instances.length === 0) {

			// prevent use of anchors and inputs

			// we use a setTimeout in case the overlay is created from an

			// event that we're going to be cancelling (see #2804)

			setTimeout(function() {

				// handle $(el).dialog().dialog('close') (see #4065)

				if ($.ui.dialog.overlay.instances.length) {

					$(document).bind($.ui.dialog.overlay.events, function(event) {

						var dialogZ = $(event.target).parents('.ui-dialog').css('zIndex') || 0;

						return (dialogZ > $.ui.dialog.overlay.maxZ);

					});

				}

			}, 1);



			// allow closing by pressing the escape key

			$(document).bind('keydown.dialog-overlay', function(event) {

				(dialog.options.closeOnEscape && event.keyCode

						&& event.keyCode == $.ui.keyCode.ESCAPE && dialog.close(event));

			});



			// handle window resize

			$(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);

		}



		var $el = $('<div></div>').appendTo(document.body)

			.addClass('ui-widget-overlay').css({

				width: this.width(),

				height: this.height()

			});



		(dialog.options.bgiframe && $.fn.bgiframe && $el.bgiframe());



		this.instances.push($el);

		return $el;

	},



	destroy: function($el) {

		this.instances.splice($.inArray(this.instances, $el), 1);



		if (this.instances.length === 0) {

			$([document, window]).unbind('.dialog-overlay');

		}



		$el.remove();

		

		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)

		var maxZ = 0;

		$.each(this.instances, function() {

			maxZ = Math.max(maxZ, this.css('z-index'));

		});

		this.maxZ = maxZ;

	},



	height: function() {

		// handle IE 6

		if ($.browser.msie && $.browser.version < 7) {

			var scrollHeight = Math.max(

				document.documentElement.scrollHeight,

				document.body.scrollHeight

			);

			var offsetHeight = Math.max(

				document.documentElement.offsetHeight,

				document.body.offsetHeight

			);



			if (scrollHeight < offsetHeight) {

				return $(window).height() + 'px';

			} else {

				return scrollHeight + 'px';

			}

		// handle "good" browsers

		} else {

			return $(document).height() + 'px';

		}

	},



	width: function() {

		// handle IE 6

		if ($.browser.msie && $.browser.version < 7) {

			var scrollWidth = Math.max(

				document.documentElement.scrollWidth,

				document.body.scrollWidth

			);

			var offsetWidth = Math.max(

				document.documentElement.offsetWidth,

				document.body.offsetWidth

			);



			if (scrollWidth < offsetWidth) {

				return $(window).width() + 'px';

			} else {

				return scrollWidth + 'px';

			}

		// handle "good" browsers

		} else {

			return $(document).width() + 'px';

		}

	},



	resize: function() {

		/* If the dialog is draggable and the user drags it past the

		 * right edge of the window, the document becomes wider so we

		 * need to stretch the overlay. If the user then drags the

		 * dialog back to the left, the document will become narrower,

		 * so we need to shrink the overlay to the appropriate size.

		 * This is handled by shrinking the overlay before setting it

		 * to the full document size.

		 */

		var $overlays = $([]);

		$.each($.ui.dialog.overlay.instances, function() {

			$overlays = $overlays.add(this);

		});



		$overlays.css({

			width: 0,

			height: 0

		}).css({

			width: $.ui.dialog.overlay.width(),

			height: $.ui.dialog.overlay.height()

		});

	}

});



$.extend($.ui.dialog.overlay.prototype, {

	destroy: function() {

		$.ui.dialog.overlay.destroy(this.$el);

	}

});



})(jQuery);



/**

 * jquery.simpletip 1.3.1. A simple tooltip plugin

 * 

 * Copyright (c) 2009 Craig Thompson

 * http://craigsworks.com

 *

 * Licensed under GPLv3

 * http://www.opensource.org/licenses/gpl-3.0.html

 *

 * Launch  : February 2009

 * Version : 1.3.1

 * Released: February 5, 2009 - 11:04am

 */

(function($){



   function Simpletip(elem, conf)

   {

      var self = this;

      elem = jQuery(elem);

      

      var tooltip = jQuery(document.createElement('div'))

                     .addClass(conf.baseClass)

                     .addClass( (conf.fixed) ? conf.fixedClass : '' )

                     .addClass( (conf.persistent) ? conf.persistentClass : '' )

                     .html(conf.content)

                     .appendTo(elem);

      

      if(!conf.hidden) tooltip.show();

      else tooltip.hide();

      

      if(!conf.persistent)

      {

         elem.hover(

            function(event){ self.show(event) },

            function(){ self.hide() }

         );

         

         if(!conf.fixed)

         {

            elem.mousemove( function(event){ 

               if(tooltip.css('display') !== 'none') self.updatePos(event); 

            });

         };

      }

      else

      {

         elem.click(function(event)

         {

            if(event.target === elem.get(0))

            {

               if(tooltip.css('display') !== 'none')

                  self.hide();

               else

                  self.show();

            };

         });

         

         jQuery(window).mousedown(function(event)

         { 

            if(tooltip.css('display') !== 'none')

            {

               var check = (conf.focus) ? jQuery(event.target).parents('.tooltip').andSelf().filter(function(){ return this === tooltip.get(0) }).length : 0;

               if(check === 0) self.hide();

            };

         });

      };

      

      

      jQuery.extend(self,

      {

         getVersion: function()

         {

            return [1, 2, 0];

         },

         

         getParent: function()

         {

            return elem;

         },

         

         getTooltip: function()

         {

            return tooltip;

         },

         

         getPos: function()

         {

            return tooltip.offset();

         },

         

         setPos: function(posX, posY)

         {

            var elemPos = elem.offset();

            

            if(typeof posX == 'string') posX = parseInt(posX) + elemPos.left;

            if(typeof posY == 'string') posY = parseInt(posY) + elemPos.top;

            

            tooltip.css({ left: posX, top: posY });

            

            return self;

         },

         

         show: function(event)

         {

            conf.onBeforeShow.call(self);

            

            self.updatePos( (conf.fixed) ? null : event );

            

            switch(conf.showEffect)

            {

               case 'fade': 
                  tooltip.fadeIn(conf.showTime); break;
               case 'slide': 
                  tooltip.slideDown(conf.showTime, self.updatePos); break;
               case 'custom':
                  conf.showCustom.call(tooltip, conf.showTime); break;
               default:
               case 'none':
                  tooltip.show(); break;
            };

            tooltip.addClass(conf.activeClass);   
            conf.onShow.call(self);           
            return self;
         },        
         hide: function()
         {

            conf.onBeforeHide.call(self); 
            switch(conf.hideEffect)

            {

               case 'fade': 
                  tooltip.fadeOut(conf.hideTime); break;
               case 'slide': 
                  tooltip.slideUp(conf.hideTime); break;
               case 'custom':
                  conf.hideCustom.call(tooltip, conf.hideTime); break;
               default:
               case 'none':
                  tooltip.hide(); break;
            };

            

            tooltip.removeClass(conf.activeClass);  
            conf.onHide.call(self);
            return self;

         },

         

         update: function(content)
         {

            tooltip.html(content);
            conf.content = content; 
            return self;

         },

         

         load: function(uri, data)

         {

            conf.beforeContentLoad.call(self);   
            tooltip.load(uri, data, function(){ conf.onContentLoad.call(self); });
            return self;

         },

         

         boundryCheck: function(posX, posY)

         {

            var newX = posX + tooltip.outerWidth();
            var newY = posY + tooltip.outerHeight();

            

            var windowWidth = jQuery(window).width() + jQuery(window).scrollLeft();
            var windowHeight = jQuery(window).height() + jQuery(window).scrollTop();         
			return [(newX >= windowWidth), (newY >= windowHeight)];
         },

         

         updatePos: function(event)

         {

            var tooltipWidth = tooltip.outerWidth();
            var tooltipHeight = tooltip.outerHeight();
            

            if(!event && conf.fixed)

            {

               if(conf.position.constructor == Array)
               {

                  posX = parseInt(conf.position[0]);
                  posY = parseInt(conf.position[1]);

               }

               else if(jQuery(conf.position).attr('nodeType') === 1)

               {

                  var offset = jQuery(conf.position).offset();
                  posX = offset.left;
                  posY = offset.top;

               }

               else

               {

                  var elemPos = elem.offset();
                  var elemWidth = elem.outerWidth();
                  var elemHeight = elem.outerHeight();

                  

                  switch(conf.position)

                  {

                     case 'top':

                        var posX = elemPos.left - (tooltipWidth / 2) + (elemWidth / 2);
                        var posY = elemPos.top - tooltipHeight;
                        break;

                        

                     case 'bottom':

                        var posX = elemPos.left - (tooltipWidth / 2) + (elemWidth / 2);
                        var posY = elemPos.top + elemHeight;

                        break;

                     

                     case 'left':

                        var posX = elemPos.left - tooltipWidth;
                        var posY = elemPos.top - (tooltipHeight / 2) + (elemHeight / 2);

                        break;

                        

                     case 'right':
                        var posX = elemPos.left + elemWidth;
                        var posY = elemPos.top - (tooltipHeight / 2) + (elemHeight / 2);
                        break;

                     

                     default:
                     case 'default':
                        var posX = (elemWidth / 2) + elemPos.left + 20;
                        var posY = elemPos.top;
                        break;

                  };
               };
            }
            else
            {

               var posX = event.pageX;
               var posY = event.pageY;

            };

            

            if(typeof conf.position != 'object')

            {

               posX = posX + conf.offset[0];
               posY = posY + conf.offset[1];               

               if(conf.boundryCheck)

               {

                  var overflow = self.boundryCheck(posX, posY);                                   
			if(overflow[0]) posX = posX - (tooltipWidth / 2) - (2 * conf.offset[0]);
                  if(overflow[1]) posY = posY - (tooltipHeight / 2) - (2 * conf.offset[1]);

               }

            }

            else

            {

               if(typeof conf.position[0] == "string") posX = String(posX);
               if(typeof conf.position[1] == "string") posY = String(posY);

            };

            

            self.setPos(posX, posY);           
		 return self;
         }
      });
   };

   

   jQuery.fn.simpletip = function(conf)

   { 

      // Check if a simpletip is already present

      var api = jQuery(this).eq(typeof conf == 'number' ? conf : 0).data("simpletip");
      if(api) return api;

      

      // Default configuration

      var defaultConf = {

         // Basics

         content: 'A simple tooltip',
         persistent: false,
         focus: false,
         hidden: true,

         

         // Positioning

         position: 'default',
         offset: [0, 0],
         boundryCheck: true,
         fixed: true,

         

         // Effects

         showEffect: 'fade',
         showTime: 150,
         showCustom: null,
         hideEffect: 'fade',
         hideTime: 150,
         hideCustom: null,

         

         // Selectors and classes

         baseClass: 'tooltip',
         activeClass: 'active',
         fixedClass: 'fixed',
         persistentClass: 'persistent',
         focusClass: 'focus',

         

         // Callbacks

         onBeforeShow: function(){},
         onShow: function(){},
         onBeforeHide: function(){},
         onHide: function(){},
         beforeContentLoad: function(){},
         onContentLoad: function(){}

      };

      jQuery.extend(defaultConf, conf);   

      this.each(function()
      {
         var el = new Simpletip(jQuery(this), defaultConf);
         jQuery(this).data("simpletip", el);  
      });
      return this; 
   };

})();











