%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home1/lightco1/www/media/lib_compojoom/js/
Upload File :
Create Path :
Current File : //home1/lightco1/www/media/lib_compojoom/js/jquery.ui.custom.js

/**

 * generated here: http://jqueryui.com/download/#!folderName=hs&scope=hs&version=1.11.1&themeParams=none&components=1111000010000000000111000000000000000

 */



/*! jQuery UI - v1.11.1 - 2014-10-08

 * http://jqueryui.com

 * Includes: core.js, widget.js, mouse.js, position.js, sortable.js, tabs.js, effect.js

 * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */



(function( factory ) {

	if ( typeof define === "function" && define.amd ) {



		// AMD. Register as an anonymous module.

		define([ "jquery" ], factory );

	} else {



		// Browser globals

		factory( jQuery );

	}

}(function( $ ) {

	/*!

	 * jQuery UI Core 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/category/ui-core/

	 */





// $.ui might exist from components with no dependencies, e.g., $.ui.position

	$.ui = $.ui || {};



	$.extend( $.ui, {

		version: "1.11.1",



		keyCode: {

			BACKSPACE: 8,

			COMMA: 188,

			DELETE: 46,

			DOWN: 40,

			END: 35,

			ENTER: 13,

			ESCAPE: 27,

			HOME: 36,

			LEFT: 37,

			PAGE_DOWN: 34,

			PAGE_UP: 33,

			PERIOD: 190,

			RIGHT: 39,

			SPACE: 32,

			TAB: 9,

			UP: 38

		}

	});



// plugins

	$.fn.extend({

		scrollParent: function( includeHidden ) {

			var position = this.css( "position" ),

				excludeStaticParent = position === "absolute",

				overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,

				scrollParent = this.parents().filter( function() {

					var parent = $( this );

					if ( excludeStaticParent && parent.css( "position" ) === "static" ) {

						return false;

					}

					return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );

				}).eq( 0 );



			return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;

		},



		uniqueId: (function() {

			var uuid = 0;



			return function() {

				return this.each(function() {

					if ( !this.id ) {

						this.id = "ui-id-" + ( ++uuid );

					}

				});

			};

		})(),



		removeUniqueId: function() {

			return this.each(function() {

				if ( /^ui-id-\d+$/.test( this.id ) ) {

					$( this ).removeAttr( "id" );

				}

			});

		}

	});



// selectors

	function focusable( element, isTabIndexNotNaN ) {

		var map, mapName, img,

			nodeName = element.nodeName.toLowerCase();

		if ( "area" === nodeName ) {

			map = element.parentNode;

			mapName = map.name;

			if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {

				return false;

			}

			img = $( "img[usemap='#" + mapName + "']" )[ 0 ];

			return !!img && visible( img );

		}

		return ( /input|select|textarea|button|object/.test( nodeName ) ?

			!element.disabled :

			"a" === nodeName ?

			element.href || isTabIndexNotNaN :

				isTabIndexNotNaN) &&

			// the element and all of its ancestors must be visible

		visible( element );

	}



	function visible( element ) {

		return $.expr.filters.visible( element ) &&

		!$( element ).parents().addBack().filter(function() {

			return $.css( this, "visibility" ) === "hidden";

		}).length;

	}



	$.extend( $.expr[ ":" ], {

		data: $.expr.createPseudo ?

			$.expr.createPseudo(function( dataName ) {

				return function( elem ) {

					return !!$.data( elem, dataName );

				};

			}) :

			// support: jQuery <1.8

			function( elem, i, match ) {

				return !!$.data( elem, match[ 3 ] );

			},



		focusable: function( element ) {

			return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );

		},



		tabbable: function( element ) {

			var tabIndex = $.attr( element, "tabindex" ),

				isTabIndexNaN = isNaN( tabIndex );

			return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );

		}

	});



// support: jQuery <1.8

	if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {

		$.each( [ "Width", "Height" ], function( i, name ) {

			var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],

				type = name.toLowerCase(),

				orig = {

					innerWidth: $.fn.innerWidth,

					innerHeight: $.fn.innerHeight,

					outerWidth: $.fn.outerWidth,

					outerHeight: $.fn.outerHeight

				};



			function reduce( elem, size, border, margin ) {

				$.each( side, function() {

					size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;

					if ( border ) {

						size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;

					}

					if ( margin ) {

						size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;

					}

				});

				return size;

			}



			$.fn[ "inner" + name ] = function( size ) {

				if ( size === undefined ) {

					return orig[ "inner" + name ].call( this );

				}



				return this.each(function() {

					$( this ).css( type, reduce( this, size ) + "px" );

				});

			};



			$.fn[ "outer" + name] = function( size, margin ) {

				if ( typeof size !== "number" ) {

					return orig[ "outer" + name ].call( this, size );

				}



				return this.each(function() {

					$( this).css( type, reduce( this, size, true, margin ) + "px" );

				});

			};

		});

	}



// support: jQuery <1.8

	if ( !$.fn.addBack ) {

		$.fn.addBack = function( selector ) {

			return this.add( selector == null ?

					this.prevObject : this.prevObject.filter( selector )

			);

		};

	}



// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)

	if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {

		$.fn.removeData = (function( removeData ) {

			return function( key ) {

				if ( arguments.length ) {

					return removeData.call( this, $.camelCase( key ) );

				} else {

					return removeData.call( this );

				}

			};

		})( $.fn.removeData );

	}



// deprecated

	$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );



	$.fn.extend({

		focus: (function( orig ) {

			return function( delay, fn ) {

				return typeof delay === "number" ?

					this.each(function() {

						var elem = this;

						setTimeout(function() {

							$( elem ).focus();

							if ( fn ) {

								fn.call( elem );

							}

						}, delay );

					}) :

					orig.apply( this, arguments );

			};

		})( $.fn.focus ),



		disableSelection: (function() {

			var eventType = "onselectstart" in document.createElement( "div" ) ?

				"selectstart" :

				"mousedown";



			return function() {

				return this.bind( eventType + ".ui-disableSelection", function( event ) {

					event.preventDefault();

				});

			};

		})(),



		enableSelection: function() {

			return this.unbind( ".ui-disableSelection" );

		},



		zIndex: function( zIndex ) {

			if ( zIndex !== undefined ) {

				return this.css( "zIndex", zIndex );

			}



			if ( this.length ) {

				var elem = $( this[ 0 ] ), position, value;

				while ( elem.length && elem[ 0 ] !== document ) {

					// Ignore z-index if position is set to a value where z-index is ignored by the browser

					// This makes behavior of this function consistent across browsers

					// WebKit always returns auto if the element is positioned

					position = elem.css( "position" );

					if ( position === "absolute" || position === "relative" || position === "fixed" ) {

						// IE returns 0 when zIndex is not specified

						// other browsers return a string

						// we ignore the case of nested elements with an explicit value of 0

						// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>

						value = parseInt( elem.css( "zIndex" ), 10 );

						if ( !isNaN( value ) && value !== 0 ) {

							return value;

						}

					}

					elem = elem.parent();

				}

			}



			return 0;

		}

	});



// $.ui.plugin is deprecated. Use $.widget() extensions instead.

	$.ui.plugin = {

		add: function( module, option, set ) {

			var i,

				proto = $.ui[ module ].prototype;

			for ( i in set ) {

				proto.plugins[ i ] = proto.plugins[ i ] || [];

				proto.plugins[ i ].push( [ option, set[ i ] ] );

			}

		},

		call: function( instance, name, args, allowDisconnected ) {

			var i,

				set = instance.plugins[ name ];



			if ( !set ) {

				return;

			}



			if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {

				return;

			}



			for ( i = 0; i < set.length; i++ ) {

				if ( instance.options[ set[ i ][ 0 ] ] ) {

					set[ i ][ 1 ].apply( instance.element, args );

				}

			}

		}

	};





	/*!

	 * jQuery UI Widget 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/jQuery.widget/

	 */





	var widget_uuid = 0,

		widget_slice = Array.prototype.slice;



	$.cleanData = (function( orig ) {

		return function( elems ) {

			var events, elem, i;

			for ( i = 0; (elem = elems[i]) != null; i++ ) {

				try {



					// Only trigger remove when necessary to save time

					events = $._data( elem, "events" );

					if ( events && events.remove ) {

						$( elem ).triggerHandler( "remove" );

					}



					// http://bugs.jquery.com/ticket/8235

				} catch( e ) {}

			}

			orig( elems );

		};

	})( $.cleanData );



	$.widget = function( name, base, prototype ) {

		var fullName, existingConstructor, constructor, basePrototype,

		// proxiedPrototype allows the provided prototype to remain unmodified

		// so that it can be used as a mixin for multiple widgets (#8876)

			proxiedPrototype = {},

			namespace = name.split( "." )[ 0 ];



		name = name.split( "." )[ 1 ];

		fullName = namespace + "-" + name;



		if ( !prototype ) {

			prototype = base;

			base = $.Widget;

		}



		// create selector for plugin

		$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {

			return !!$.data( elem, fullName );

		};



		$[ namespace ] = $[ namespace ] || {};

		existingConstructor = $[ namespace ][ name ];

		constructor = $[ namespace ][ name ] = function( options, element ) {

			// allow instantiation without "new" keyword

			if ( !this._createWidget ) {

				return new constructor( options, element );

			}



			// allow instantiation without initializing for simple inheritance

			// must use "new" keyword (the code above always passes args)

			if ( arguments.length ) {

				this._createWidget( options, element );

			}

		};

		// extend with the existing constructor to carry over any static properties

		$.extend( constructor, existingConstructor, {

			version: prototype.version,

			// copy the object used to create the prototype in case we need to

			// redefine the widget later

			_proto: $.extend( {}, prototype ),

			// track widgets that inherit from this widget in case this widget is

			// redefined after a widget inherits from it

			_childConstructors: []

		});



		basePrototype = new base();

		// we need to make the options hash a property directly on the new instance

		// otherwise we'll modify the options hash on the prototype that we're

		// inheriting from

		basePrototype.options = $.widget.extend( {}, basePrototype.options );

		$.each( prototype, function( prop, value ) {

			if ( !$.isFunction( value ) ) {

				proxiedPrototype[ prop ] = value;

				return;

			}

			proxiedPrototype[ prop ] = (function() {

				var _super = function() {

						return base.prototype[ prop ].apply( this, arguments );

					},

					_superApply = function( args ) {

						return base.prototype[ prop ].apply( this, args );

					};

				return function() {

					var __super = this._super,

						__superApply = this._superApply,

						returnValue;



					this._super = _super;

					this._superApply = _superApply;



					returnValue = value.apply( this, arguments );



					this._super = __super;

					this._superApply = __superApply;



					return returnValue;

				};

			})();

		});

		constructor.prototype = $.widget.extend( basePrototype, {

			// TODO: remove support for widgetEventPrefix

			// always use the name + a colon as the prefix, e.g., draggable:start

			// don't prefix for widgets that aren't DOM-based

			widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name

		}, proxiedPrototype, {

			constructor: constructor,

			namespace: namespace,

			widgetName: name,

			widgetFullName: fullName

		});



		// If this widget is being redefined then we need to find all widgets that

		// are inheriting from it and redefine all of them so that they inherit from

		// the new version of this widget. We're essentially trying to replace one

		// level in the prototype chain.

		if ( existingConstructor ) {

			$.each( existingConstructor._childConstructors, function( i, child ) {

				var childPrototype = child.prototype;



				// redefine the child widget using the same prototype that was

				// originally used, but inherit from the new version of the base

				$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );

			});

			// remove the list of existing child constructors from the old constructor

			// so the old child constructors can be garbage collected

			delete existingConstructor._childConstructors;

		} else {

			base._childConstructors.push( constructor );

		}



		$.widget.bridge( name, constructor );



		return constructor;

	};



	$.widget.extend = function( target ) {

		var input = widget_slice.call( arguments, 1 ),

			inputIndex = 0,

			inputLength = input.length,

			key,

			value;

		for ( ; inputIndex < inputLength; inputIndex++ ) {

			for ( key in input[ inputIndex ] ) {

				value = input[ inputIndex ][ key ];

				if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {

					// Clone objects

					if ( $.isPlainObject( value ) ) {

						target[ key ] = $.isPlainObject( target[ key ] ) ?

							$.widget.extend( {}, target[ key ], value ) :

							// Don't extend strings, arrays, etc. with objects

							$.widget.extend( {}, value );

						// Copy everything else by reference

					} else {

						target[ key ] = value;

					}

				}

			}

		}

		return target;

	};



	$.widget.bridge = function( name, object ) {

		var fullName = object.prototype.widgetFullName || name;

		$.fn[ name ] = function( options ) {

			var isMethodCall = typeof options === "string",

				args = widget_slice.call( arguments, 1 ),

				returnValue = this;



			// allow multiple hashes to be passed on init

			options = !isMethodCall && args.length ?

				$.widget.extend.apply( null, [ options ].concat(args) ) :

				options;



			if ( isMethodCall ) {

				this.each(function() {

					var methodValue,

						instance = $.data( this, fullName );

					if ( options === "instance" ) {

						returnValue = instance;

						return false;

					}

					if ( !instance ) {

						return $.error( "cannot call methods on " + name + " prior to initialization; " +

						"attempted to call method '" + options + "'" );

					}

					if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {

						return $.error( "no such method '" + options + "' for " + name + " widget instance" );

					}

					methodValue = instance[ options ].apply( instance, args );

					if ( methodValue !== instance && methodValue !== undefined ) {

						returnValue = methodValue && methodValue.jquery ?

							returnValue.pushStack( methodValue.get() ) :

							methodValue;

						return false;

					}

				});

			} else {

				this.each(function() {

					var instance = $.data( this, fullName );

					if ( instance ) {

						instance.option( options || {} );

						if ( instance._init ) {

							instance._init();

						}

					} else {

						$.data( this, fullName, new object( options, this ) );

					}

				});

			}



			return returnValue;

		};

	};



	$.Widget = function( /* options, element */ ) {};

	$.Widget._childConstructors = [];



	$.Widget.prototype = {

		widgetName: "widget",

		widgetEventPrefix: "",

		defaultElement: "<div>",

		options: {

			disabled: false,



			// callbacks

			create: null

		},

		_createWidget: function( options, element ) {

			element = $( element || this.defaultElement || this )[ 0 ];

			this.element = $( element );

			this.uuid = widget_uuid++;

			this.eventNamespace = "." + this.widgetName + this.uuid;

			this.options = $.widget.extend( {},

				this.options,

				this._getCreateOptions(),

				options );



			this.bindings = $();

			this.hoverable = $();

			this.focusable = $();



			if ( element !== this ) {

				$.data( element, this.widgetFullName, this );

				this._on( true, this.element, {

					remove: function( event ) {

						if ( event.target === element ) {

							this.destroy();

						}

					}

				});

				this.document = $( element.style ?

					// element within the document

					element.ownerDocument :

					// element is window or document

				element.document || element );

				this.window = $( this.document[0].defaultView || this.document[0].parentWindow );

			}



			this._create();

			this._trigger( "create", null, this._getCreateEventData() );

			this._init();

		},

		_getCreateOptions: $.noop,

		_getCreateEventData: $.noop,

		_create: $.noop,

		_init: $.noop,



		destroy: function() {

			this._destroy();

			// we can probably remove the unbind calls in 2.0

			// all event bindings should go through this._on()

			this.element

				.unbind( this.eventNamespace )

				.removeData( this.widgetFullName )

				// support: jquery <1.6.3

				// http://bugs.jquery.com/ticket/9413

				.removeData( $.camelCase( this.widgetFullName ) );

			this.widget()

				.unbind( this.eventNamespace )

				.removeAttr( "aria-disabled" )

				.removeClass(

				this.widgetFullName + "-disabled " +

				"ui-state-disabled" );



			// clean up events and states

			this.bindings.unbind( this.eventNamespace );

			this.hoverable.removeClass( "ui-state-hover" );

			this.focusable.removeClass( "ui-state-focus" );

		},

		_destroy: $.noop,



		widget: function() {

			return this.element;

		},



		option: function( key, value ) {

			var options = key,

				parts,

				curOption,

				i;



			if ( arguments.length === 0 ) {

				// don't return a reference to the internal hash

				return $.widget.extend( {}, this.options );

			}



			if ( typeof key === "string" ) {

				// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }

				options = {};

				parts = key.split( "." );

				key = parts.shift();

				if ( parts.length ) {

					curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );

					for ( i = 0; i < parts.length - 1; i++ ) {

						curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};

						curOption = curOption[ parts[ i ] ];

					}

					key = parts.pop();

					if ( arguments.length === 1 ) {

						return curOption[ key ] === undefined ? null : curOption[ key ];

					}

					curOption[ key ] = value;

				} else {

					if ( arguments.length === 1 ) {

						return this.options[ key ] === undefined ? null : this.options[ key ];

					}

					options[ key ] = value;

				}

			}



			this._setOptions( options );



			return this;

		},

		_setOptions: function( options ) {

			var key;



			for ( key in options ) {

				this._setOption( key, options[ key ] );

			}



			return this;

		},

		_setOption: function( key, value ) {

			this.options[ key ] = value;



			if ( key === "disabled" ) {

				this.widget()

					.toggleClass( this.widgetFullName + "-disabled", !!value );



				// If the widget is becoming disabled, then nothing is interactive

				if ( value ) {

					this.hoverable.removeClass( "ui-state-hover" );

					this.focusable.removeClass( "ui-state-focus" );

				}

			}



			return this;

		},



		enable: function() {

			return this._setOptions({ disabled: false });

		},

		disable: function() {

			return this._setOptions({ disabled: true });

		},



		_on: function( suppressDisabledCheck, element, handlers ) {

			var delegateElement,

				instance = this;



			// no suppressDisabledCheck flag, shuffle arguments

			if ( typeof suppressDisabledCheck !== "boolean" ) {

				handlers = element;

				element = suppressDisabledCheck;

				suppressDisabledCheck = false;

			}



			// no element argument, shuffle and use this.element

			if ( !handlers ) {

				handlers = element;

				element = this.element;

				delegateElement = this.widget();

			} else {

				element = delegateElement = $( element );

				this.bindings = this.bindings.add( element );

			}



			$.each( handlers, function( event, handler ) {

				function handlerProxy() {

					// allow widgets to customize the disabled handling

					// - disabled as an array instead of boolean

					// - disabled class as method for disabling individual parts

					if ( !suppressDisabledCheck &&

						( instance.options.disabled === true ||

						$( this ).hasClass( "ui-state-disabled" ) ) ) {

						return;

					}

					return ( typeof handler === "string" ? instance[ handler ] : handler )

						.apply( instance, arguments );

				}



				// copy the guid so direct unbinding works

				if ( typeof handler !== "string" ) {

					handlerProxy.guid = handler.guid =

						handler.guid || handlerProxy.guid || $.guid++;

				}



				var match = event.match( /^([\w:-]*)\s*(.*)$/ ),

					eventName = match[1] + instance.eventNamespace,

					selector = match[2];

				if ( selector ) {

					delegateElement.delegate( selector, eventName, handlerProxy );

				} else {

					element.bind( eventName, handlerProxy );

				}

			});

		},



		_off: function( element, eventName ) {

			eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;

			element.unbind( eventName ).undelegate( eventName );

		},



		_delay: function( handler, delay ) {

			function handlerProxy() {

				return ( typeof handler === "string" ? instance[ handler ] : handler )

					.apply( instance, arguments );

			}

			var instance = this;

			return setTimeout( handlerProxy, delay || 0 );

		},



		_hoverable: function( element ) {

			this.hoverable = this.hoverable.add( element );

			this._on( element, {

				mouseenter: function( event ) {

					$( event.currentTarget ).addClass( "ui-state-hover" );

				},

				mouseleave: function( event ) {

					$( event.currentTarget ).removeClass( "ui-state-hover" );

				}

			});

		},



		_focusable: function( element ) {

			this.focusable = this.focusable.add( element );

			this._on( element, {

				focusin: function( event ) {

					$( event.currentTarget ).addClass( "ui-state-focus" );

				},

				focusout: function( event ) {

					$( event.currentTarget ).removeClass( "ui-state-focus" );

				}

			});

		},



		_trigger: function( type, event, data ) {

			var prop, orig,

				callback = this.options[ type ];



			data = data || {};

			event = $.Event( event );

			event.type = ( type === this.widgetEventPrefix ?

				type :

			this.widgetEventPrefix + type ).toLowerCase();

			// the original event may come from any element

			// so we need to reset the target on the new event

			event.target = this.element[ 0 ];



			// copy original event properties over to the new event

			orig = event.originalEvent;

			if ( orig ) {

				for ( prop in orig ) {

					if ( !( prop in event ) ) {

						event[ prop ] = orig[ prop ];

					}

				}

			}



			this.element.trigger( event, data );

			return !( $.isFunction( callback ) &&

			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||

			event.isDefaultPrevented() );

		}

	};



	$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {

		$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {

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

				options = { effect: options };

			}

			var hasOptions,

				effectName = !options ?

					method :

					options === true || typeof options === "number" ?

						defaultEffect :

					options.effect || defaultEffect;

			options = options || {};

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

				options = { duration: options };

			}

			hasOptions = !$.isEmptyObject( options );

			options.complete = callback;

			if ( options.delay ) {

				element.delay( options.delay );

			}

			if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {

				element[ method ]( options );

			} else if ( effectName !== method && element[ effectName ] ) {

				element[ effectName ]( options.duration, options.easing, callback );

			} else {

				element.queue(function( next ) {

					$( this )[ method ]();

					if ( callback ) {

						callback.call( element[ 0 ] );

					}

					next();

				});

			}

		};

	});



	var widget = $.widget;





	/*!

	 * jQuery UI Mouse 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/mouse/

	 */





	var mouseHandled = false;

	$( document ).mouseup( function() {

		mouseHandled = false;

	});



	var mouse = $.widget("ui.mouse", {

		version: "1.11.1",

		options: {

			cancel: "input,textarea,button,select,option",

			distance: 1,

			delay: 0

		},

		_mouseInit: function() {

			var that = this;



			this.element

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

					return that._mouseDown(event);

				})

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

					if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {

						$.removeData(event.target, that.widgetName + ".preventClickEvent");

						event.stopImmediatePropagation();

						return false;

					}

				});



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

			if ( this._mouseMoveDelegate ) {

				this.document

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

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

			}

		},



		_mouseDown: function(event) {

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

			if ( mouseHandled ) {

				return;

			}



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

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



			this._mouseDownEvent = event;



			var that = this,

				btnIsLeft = (event.which === 1),

			// event.target.nodeName works around a bug in IE 8 with

			// disabled inputs (#7620)

				elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(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() {

					that.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;

				}

			}



			// Click event may never have fired (Gecko & Opera)

			if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {

				$.removeData(event.target, this.widgetName + ".preventClickEvent");

			}



			// these delegates are required to keep context

			this._mouseMoveDelegate = function(event) {

				return that._mouseMove(event);

			};

			this._mouseUpDelegate = function(event) {

				return that._mouseUp(event);

			};



			this.document

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

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



			event.preventDefault();



			mouseHandled = true;

			return true;

		},



		_mouseMove: function(event) {

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

			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {

				return this._mouseUp(event);



				// Iframe mouseup check - mouseup occurred in another document

			} else if ( !event.which ) {

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

			this.document

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

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



			if (this._mouseStarted) {

				this._mouseStarted = false;



				if (event.target === this._mouseDownEvent.target) {

					$.data(event.target, this.widgetName + ".preventClickEvent", true);

				}



				this._mouseStop(event);

			}



			mouseHandled = false;

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

	});





	/*!

	 * jQuery UI Position 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/position/

	 */



	(function() {



		$.ui = $.ui || {};



		var cachedScrollbarWidth, supportsOffsetFractions,

			max = Math.max,

			abs = Math.abs,

			round = Math.round,

			rhorizontal = /left|center|right/,

			rvertical = /top|center|bottom/,

			roffset = /[\+\-]\d+(\.[\d]+)?%?/,

			rposition = /^\w+/,

			rpercent = /%$/,

			_position = $.fn.position;



		function getOffsets( offsets, width, height ) {

			return [

				parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),

				parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )

			];

		}



		function parseCss( element, property ) {

			return parseInt( $.css( element, property ), 10 ) || 0;

		}



		function getDimensions( elem ) {

			var raw = elem[0];

			if ( raw.nodeType === 9 ) {

				return {

					width: elem.width(),

					height: elem.height(),

					offset: { top: 0, left: 0 }

				};

			}

			if ( $.isWindow( raw ) ) {

				return {

					width: elem.width(),

					height: elem.height(),

					offset: { top: elem.scrollTop(), left: elem.scrollLeft() }

				};

			}

			if ( raw.preventDefault ) {

				return {

					width: 0,

					height: 0,

					offset: { top: raw.pageY, left: raw.pageX }

				};

			}

			return {

				width: elem.outerWidth(),

				height: elem.outerHeight(),

				offset: elem.offset()

			};

		}



		$.position = {

			scrollbarWidth: function() {

				if ( cachedScrollbarWidth !== undefined ) {

					return cachedScrollbarWidth;

				}

				var w1, w2,

					div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),

					innerDiv = div.children()[0];



				$( "body" ).append( div );

				w1 = innerDiv.offsetWidth;

				div.css( "overflow", "scroll" );



				w2 = innerDiv.offsetWidth;



				if ( w1 === w2 ) {

					w2 = div[0].clientWidth;

				}



				div.remove();



				return (cachedScrollbarWidth = w1 - w2);

			},

			getScrollInfo: function( within ) {

				var overflowX = within.isWindow || within.isDocument ? "" :

						within.element.css( "overflow-x" ),

					overflowY = within.isWindow || within.isDocument ? "" :

						within.element.css( "overflow-y" ),

					hasOverflowX = overflowX === "scroll" ||

						( overflowX === "auto" && within.width < within.element[0].scrollWidth ),

					hasOverflowY = overflowY === "scroll" ||

						( overflowY === "auto" && within.height < within.element[0].scrollHeight );

				return {

					width: hasOverflowY ? $.position.scrollbarWidth() : 0,

					height: hasOverflowX ? $.position.scrollbarWidth() : 0

				};

			},

			getWithinInfo: function( element ) {

				var withinElement = $( element || window ),

					isWindow = $.isWindow( withinElement[0] ),

					isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;

				return {

					element: withinElement,

					isWindow: isWindow,

					isDocument: isDocument,

					offset: withinElement.offset() || { left: 0, top: 0 },

					scrollLeft: withinElement.scrollLeft(),

					scrollTop: withinElement.scrollTop(),



					// support: jQuery 1.6.x

					// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows

					width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),

					height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()

				};

			}

		};



		$.fn.position = function( options ) {

			if ( !options || !options.of ) {

				return _position.apply( this, arguments );

			}



			// make a copy, we don't want to modify arguments

			options = $.extend( {}, options );



			var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,

				target = $( options.of ),

				within = $.position.getWithinInfo( options.within ),

				scrollInfo = $.position.getScrollInfo( within ),

				collision = ( options.collision || "flip" ).split( " " ),

				offsets = {};



			dimensions = getDimensions( target );

			if ( target[0].preventDefault ) {

				// force left top to allow flipping

				options.at = "left top";

			}

			targetWidth = dimensions.width;

			targetHeight = dimensions.height;

			targetOffset = dimensions.offset;

			// clone to reuse original targetOffset later

			basePosition = $.extend( {}, targetOffset );



			// force my and at to have valid horizontal and vertical positions

			// if a value is missing or invalid, it will be converted to center

			$.each( [ "my", "at" ], function() {

				var pos = ( options[ this ] || "" ).split( " " ),

					horizontalOffset,

					verticalOffset;



				if ( pos.length === 1) {

					pos = rhorizontal.test( pos[ 0 ] ) ?

						pos.concat( [ "center" ] ) :

						rvertical.test( pos[ 0 ] ) ?

							[ "center" ].concat( pos ) :

							[ "center", "center" ];

				}

				pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";

				pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";



				// calculate offsets

				horizontalOffset = roffset.exec( pos[ 0 ] );

				verticalOffset = roffset.exec( pos[ 1 ] );

				offsets[ this ] = [

					horizontalOffset ? horizontalOffset[ 0 ] : 0,

					verticalOffset ? verticalOffset[ 0 ] : 0

				];



				// reduce to just the positions without the offsets

				options[ this ] = [

					rposition.exec( pos[ 0 ] )[ 0 ],

					rposition.exec( pos[ 1 ] )[ 0 ]

				];

			});



			// normalize collision option

			if ( collision.length === 1 ) {

				collision[ 1 ] = collision[ 0 ];

			}



			if ( options.at[ 0 ] === "right" ) {

				basePosition.left += targetWidth;

			} else if ( options.at[ 0 ] === "center" ) {

				basePosition.left += targetWidth / 2;

			}



			if ( options.at[ 1 ] === "bottom" ) {

				basePosition.top += targetHeight;

			} else if ( options.at[ 1 ] === "center" ) {

				basePosition.top += targetHeight / 2;

			}



			atOffset = getOffsets( offsets.at, targetWidth, targetHeight );

			basePosition.left += atOffset[ 0 ];

			basePosition.top += atOffset[ 1 ];



			return this.each(function() {

				var collisionPosition, using,

					elem = $( this ),

					elemWidth = elem.outerWidth(),

					elemHeight = elem.outerHeight(),

					marginLeft = parseCss( this, "marginLeft" ),

					marginTop = parseCss( this, "marginTop" ),

					collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,

					collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,

					position = $.extend( {}, basePosition ),

					myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );



				if ( options.my[ 0 ] === "right" ) {

					position.left -= elemWidth;

				} else if ( options.my[ 0 ] === "center" ) {

					position.left -= elemWidth / 2;

				}



				if ( options.my[ 1 ] === "bottom" ) {

					position.top -= elemHeight;

				} else if ( options.my[ 1 ] === "center" ) {

					position.top -= elemHeight / 2;

				}



				position.left += myOffset[ 0 ];

				position.top += myOffset[ 1 ];



				// if the browser doesn't support fractions, then round for consistent results

				if ( !supportsOffsetFractions ) {

					position.left = round( position.left );

					position.top = round( position.top );

				}



				collisionPosition = {

					marginLeft: marginLeft,

					marginTop: marginTop

				};



				$.each( [ "left", "top" ], function( i, dir ) {

					if ( $.ui.position[ collision[ i ] ] ) {

						$.ui.position[ collision[ i ] ][ dir ]( position, {

							targetWidth: targetWidth,

							targetHeight: targetHeight,

							elemWidth: elemWidth,

							elemHeight: elemHeight,

							collisionPosition: collisionPosition,

							collisionWidth: collisionWidth,

							collisionHeight: collisionHeight,

							offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],

							my: options.my,

							at: options.at,

							within: within,

							elem: elem

						});

					}

				});



				if ( options.using ) {

					// adds feedback as second argument to using callback, if present

					using = function( props ) {

						var left = targetOffset.left - position.left,

							right = left + targetWidth - elemWidth,

							top = targetOffset.top - position.top,

							bottom = top + targetHeight - elemHeight,

							feedback = {

								target: {

									element: target,

									left: targetOffset.left,

									top: targetOffset.top,

									width: targetWidth,

									height: targetHeight

								},

								element: {

									element: elem,

									left: position.left,

									top: position.top,

									width: elemWidth,

									height: elemHeight

								},

								horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",

								vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"

							};

						if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {

							feedback.horizontal = "center";

						}

						if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {

							feedback.vertical = "middle";

						}

						if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {

							feedback.important = "horizontal";

						} else {

							feedback.important = "vertical";

						}

						options.using.call( this, props, feedback );

					};

				}



				elem.offset( $.extend( position, { using: using } ) );

			});

		};



		$.ui.position = {

			fit: {

				left: function( position, data ) {

					var within = data.within,

						withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,

						outerWidth = within.width,

						collisionPosLeft = position.left - data.collisionPosition.marginLeft,

						overLeft = withinOffset - collisionPosLeft,

						overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,

						newOverRight;



					// element is wider than within

					if ( data.collisionWidth > outerWidth ) {

						// element is initially over the left side of within

						if ( overLeft > 0 && overRight <= 0 ) {

							newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;

							position.left += overLeft - newOverRight;

							// element is initially over right side of within

						} else if ( overRight > 0 && overLeft <= 0 ) {

							position.left = withinOffset;

							// element is initially over both left and right sides of within

						} else {

							if ( overLeft > overRight ) {

								position.left = withinOffset + outerWidth - data.collisionWidth;

							} else {

								position.left = withinOffset;

							}

						}

						// too far left -> align with left edge

					} else if ( overLeft > 0 ) {

						position.left += overLeft;

						// too far right -> align with right edge

					} else if ( overRight > 0 ) {

						position.left -= overRight;

						// adjust based on position and margin

					} else {

						position.left = max( position.left - collisionPosLeft, position.left );

					}

				},

				top: function( position, data ) {

					var within = data.within,

						withinOffset = within.isWindow ? within.scrollTop : within.offset.top,

						outerHeight = data.within.height,

						collisionPosTop = position.top - data.collisionPosition.marginTop,

						overTop = withinOffset - collisionPosTop,

						overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,

						newOverBottom;



					// element is taller than within

					if ( data.collisionHeight > outerHeight ) {

						// element is initially over the top of within

						if ( overTop > 0 && overBottom <= 0 ) {

							newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;

							position.top += overTop - newOverBottom;

							// element is initially over bottom of within

						} else if ( overBottom > 0 && overTop <= 0 ) {

							position.top = withinOffset;

							// element is initially over both top and bottom of within

						} else {

							if ( overTop > overBottom ) {

								position.top = withinOffset + outerHeight - data.collisionHeight;

							} else {

								position.top = withinOffset;

							}

						}

						// too far up -> align with top

					} else if ( overTop > 0 ) {

						position.top += overTop;

						// too far down -> align with bottom edge

					} else if ( overBottom > 0 ) {

						position.top -= overBottom;

						// adjust based on position and margin

					} else {

						position.top = max( position.top - collisionPosTop, position.top );

					}

				}

			},

			flip: {

				left: function( position, data ) {

					var within = data.within,

						withinOffset = within.offset.left + within.scrollLeft,

						outerWidth = within.width,

						offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,

						collisionPosLeft = position.left - data.collisionPosition.marginLeft,

						overLeft = collisionPosLeft - offsetLeft,

						overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,

						myOffset = data.my[ 0 ] === "left" ?

							-data.elemWidth :

							data.my[ 0 ] === "right" ?

								data.elemWidth :

								0,

						atOffset = data.at[ 0 ] === "left" ?

							data.targetWidth :

							data.at[ 0 ] === "right" ?

								-data.targetWidth :

								0,

						offset = -2 * data.offset[ 0 ],

						newOverRight,

						newOverLeft;



					if ( overLeft < 0 ) {

						newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;

						if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {

							position.left += myOffset + atOffset + offset;

						}

					} else if ( overRight > 0 ) {

						newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;

						if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {

							position.left += myOffset + atOffset + offset;

						}

					}

				},

				top: function( position, data ) {

					var within = data.within,

						withinOffset = within.offset.top + within.scrollTop,

						outerHeight = within.height,

						offsetTop = within.isWindow ? within.scrollTop : within.offset.top,

						collisionPosTop = position.top - data.collisionPosition.marginTop,

						overTop = collisionPosTop - offsetTop,

						overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,

						top = data.my[ 1 ] === "top",

						myOffset = top ?

							-data.elemHeight :

							data.my[ 1 ] === "bottom" ?

								data.elemHeight :

								0,

						atOffset = data.at[ 1 ] === "top" ?

							data.targetHeight :

							data.at[ 1 ] === "bottom" ?

								-data.targetHeight :

								0,

						offset = -2 * data.offset[ 1 ],

						newOverTop,

						newOverBottom;

					if ( overTop < 0 ) {

						newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;

						if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {

							position.top += myOffset + atOffset + offset;

						}

					} else if ( overBottom > 0 ) {

						newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;

						if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {

							position.top += myOffset + atOffset + offset;

						}

					}

				}

			},

			flipfit: {

				left: function() {

					$.ui.position.flip.left.apply( this, arguments );

					$.ui.position.fit.left.apply( this, arguments );

				},

				top: function() {

					$.ui.position.flip.top.apply( this, arguments );

					$.ui.position.fit.top.apply( this, arguments );

				}

			}

		};



// fraction support test

		(function() {

			var testElement, testElementParent, testElementStyle, offsetLeft, i,

				body = document.getElementsByTagName( "body" )[ 0 ],

				div = document.createElement( "div" );



			//Create a "fake body" for testing based on method used in jQuery.support

			testElement = document.createElement( body ? "div" : "body" );

			testElementStyle = {

				visibility: "hidden",

				width: 0,

				height: 0,

				border: 0,

				margin: 0,

				background: "none"

			};

			if ( body ) {

				$.extend( testElementStyle, {

					position: "absolute",

					left: "-1000px",

					top: "-1000px"

				});

			}

			for ( i in testElementStyle ) {

				testElement.style[ i ] = testElementStyle[ i ];

			}

			testElement.appendChild( div );

			testElementParent = body || document.documentElement;

			testElementParent.insertBefore( testElement, testElementParent.firstChild );



			div.style.cssText = "position: absolute; left: 10.7432222px;";



			offsetLeft = $( div ).offset().left;

			supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;



			testElement.innerHTML = "";

			testElementParent.removeChild( testElement );

		})();



	})();



	var position = $.ui.position;





	/*!

	 * jQuery UI Sortable 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/sortable/

	 */





	var sortable = $.widget("ui.sortable", $.ui.mouse, {

		version: "1.11.1",

		widgetEventPrefix: "sort",

		ready: false,

		options: {

			appendTo: "parent",

			axis: false,

			connectWith: false,

			containment: false,

			cursor: "auto",

			cursorAt: false,

			dropOnEmpty: true,

			forcePlaceholderSize: false,

			forceHelperSize: false,

			grid: false,

			handle: false,

			helper: "original",

			items: "> *",

			opacity: false,

			placeholder: false,

			revert: false,

			scroll: true,

			scrollSensitivity: 20,

			scrollSpeed: 20,

			scope: "default",

			tolerance: "intersect",

			zIndex: 1000,



			// callbacks

			activate: null,

			beforeStop: null,

			change: null,

			deactivate: null,

			out: null,

			over: null,

			receive: null,

			remove: null,

			sort: null,

			start: null,

			stop: null,

			update: null

		},



		_isOverAxis: function( x, reference, size ) {

			return ( x >= reference ) && ( x < ( reference + size ) );

		},



		_isFloating: function( item ) {

			return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));

		},



		_create: function() {



			var o = this.options;

			this.containerCache = {};

			this.element.addClass("ui-sortable");



			//Get the items

			this.refresh();



			//Let's determine if the items are being displayed horizontally

			this.floating = this.items.length ? o.axis === "x" || this._isFloating(this.items[0].item) : false;



			//Let's determine the parent's offset

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



			//Initialize mouse events for interaction

			this._mouseInit();



			this._setHandleClassName();



			//We're ready to go

			this.ready = true;



		},



		_setOption: function( key, value ) {

			this._super( key, value );



			if ( key === "handle" ) {

				this._setHandleClassName();

			}

		},



		_setHandleClassName: function() {

			this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );

			$.each( this.items, function() {

				( this.instance.options.handle ?

					this.item.find( this.instance.options.handle ) : this.item )

					.addClass( "ui-sortable-handle" );

			});

		},



		_destroy: function() {

			this.element

				.removeClass( "ui-sortable ui-sortable-disabled" )

				.find( ".ui-sortable-handle" )

				.removeClass( "ui-sortable-handle" );

			this._mouseDestroy();



			for ( var i = this.items.length - 1; i >= 0; i-- ) {

				this.items[i].item.removeData(this.widgetName + "-item");

			}



			return this;

		},



		_mouseCapture: function(event, overrideHandle) {

			var currentItem = null,

				validHandle = false,

				that = this;



			if (this.reverting) {

				return false;

			}



			if(this.options.disabled || this.options.type === "static") {

				return false;

			}



			//We have to refresh the items data once first

			this._refreshItems(event);



			//Find out if the clicked node (or one of its parents) is a actual item in this.items

			$(event.target).parents().each(function() {

				if($.data(this, that.widgetName + "-item") === that) {

					currentItem = $(this);

					return false;

				}

			});

			if($.data(event.target, that.widgetName + "-item") === that) {

				currentItem = $(event.target);

			}



			if(!currentItem) {

				return false;

			}

			if(this.options.handle && !overrideHandle) {

				$(this.options.handle, currentItem).find("*").addBack().each(function() {

					if(this === event.target) {

						validHandle = true;

					}

				});

				if(!validHandle) {

					return false;

				}

			}



			this.currentItem = currentItem;

			this._removeCurrentsFromItems();

			return true;



		},



		_mouseStart: function(event, overrideHandle, noActivation) {



			var i, body,

				o = this.options;



			this.currentContainer = this;



			//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture

			this.refreshPositions();



			//Create and append the visible helper

			this.helper = this._createHelper(event);



			//Cache the helper size

			this._cacheHelperProportions();



			/*

			 * - Position generation -

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

			 */



			//Cache the margins of the original element

			this._cacheMargins();



			//Get the next scrolling parent

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



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

			this.offset = this.currentItem.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

			});



			// Only after we got the offset, we can change the helper's position to absolute

			// TODO: Still need to figure out a way to make relative sorting possible

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

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



			//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

			(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));



			//Cache the former DOM position

			this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };



			//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way

			if(this.helper[0] !== this.currentItem[0]) {

				this.currentItem.hide();

			}



			//Create the placeholder

			this._createPlaceholder();



			//Set a containment if given in the options

			if(o.containment) {

				this._setContainment();

			}



			if( o.cursor && o.cursor !== "auto" ) { // cursor option

				body = this.document.find( "body" );



				// support: IE

				this.storedCursor = body.css( "cursor" );

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



				this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );

			}



			if(o.opacity) { // opacity option

				if (this.helper.css("opacity")) {

					this._storedOpacity = this.helper.css("opacity");

				}

				this.helper.css("opacity", o.opacity);

			}



			if(o.zIndex) { // zIndex option

				if (this.helper.css("zIndex")) {

					this._storedZIndex = this.helper.css("zIndex");

				}

				this.helper.css("zIndex", o.zIndex);

			}



			//Prepare scrolling

			if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {

				this.overflowOffset = this.scrollParent.offset();

			}



			//Call callbacks

			this._trigger("start", event, this._uiHash());



			//Recache the helper size

			if(!this._preserveHelperProportions) {

				this._cacheHelperProportions();

			}





			//Post "activate" events to possible containers

			if( !noActivation ) {

				for ( i = this.containers.length - 1; i >= 0; i-- ) {

					this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );

				}

			}



			//Prepare possible droppables

			if($.ui.ddmanager) {

				$.ui.ddmanager.current = this;

			}



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

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

			}



			this.dragging = true;



			this.helper.addClass("ui-sortable-helper");

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

			return true;



		},



		_mouseDrag: function(event) {

			var i, item, itemElement, intersection,

				o = this.options,

				scrolled = false;



			//Compute the helpers position

			this.position = this._generatePosition(event);

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



			if (!this.lastPositionAbs) {

				this.lastPositionAbs = this.positionAbs;

			}



			//Do scrolling

			if(this.options.scroll) {

				if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {



					if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {

						this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;

					} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {

						this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;

					}



					if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {

						this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;

					} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {

						this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;

					}



				} else {



					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(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(this, event);

				}

			}



			//Regenerate the absolute position used for position checks

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



			//Set the helper 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";

			}



			//Rearrange

			for (i = this.items.length - 1; i >= 0; i--) {



				//Cache variables and intersection, continue if no intersection

				item = this.items[i];

				itemElement = item.item[0];

				intersection = this._intersectsWithPointer(item);

				if (!intersection) {

					continue;

				}



				// Only put the placeholder inside the current Container, skip all

				// items from other containers. This works because when moving

				// an item from one container to another the

				// currentContainer is switched before the placeholder is moved.

				//

				// Without this, moving items in "sub-sortables" can cause

				// the placeholder to jitter between the outer and inner container.

				if (item.instance !== this.currentContainer) {

					continue;

				}



				// cannot intersect with itself

				// no useless actions that have been done before

				// no action if the item moved is the parent of the item checked

				if (itemElement !== this.currentItem[0] &&

					this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&

					!$.contains(this.placeholder[0], itemElement) &&

					(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)

				) {



					this.direction = intersection === 1 ? "down" : "up";



					if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {

						this._rearrange(event, item);

					} else {

						break;

					}



					this._trigger("change", event, this._uiHash());

					break;

				}

			}



			//Post events to containers

			this._contactContainers(event);



			//Interconnect with droppables

			if($.ui.ddmanager) {

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

			}



			//Call callbacks

			this._trigger("sort", event, this._uiHash());



			this.lastPositionAbs = this.positionAbs;

			return false;



		},



		_mouseStop: function(event, noPropagation) {



			if(!event) {

				return;

			}



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

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

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

			}



			if(this.options.revert) {

				var that = this,

					cur = this.placeholder.offset(),

					axis = this.options.axis,

					animation = {};



				if ( !axis || axis === "x" ) {

					animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);

				}

				if ( !axis || axis === "y" ) {

					animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);

				}

				this.reverting = true;

				$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {

					that._clear(event);

				});

			} else {

				this._clear(event, noPropagation);

			}



			return false;



		},



		cancel: function() {



			if(this.dragging) {



				this._mouseUp({ target: null });



				if(this.options.helper === "original") {

					this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");

				} else {

					this.currentItem.show();

				}



				//Post deactivating events to containers

				for (var i = this.containers.length - 1; i >= 0; i--){

					this.containers[i]._trigger("deactivate", null, this._uiHash(this));

					if(this.containers[i].containerCache.over) {

						this.containers[i]._trigger("out", null, this._uiHash(this));

						this.containers[i].containerCache.over = 0;

					}

				}



			}



			if (this.placeholder) {

				//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!

				if(this.placeholder[0].parentNode) {

					this.placeholder[0].parentNode.removeChild(this.placeholder[0]);

				}

				if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {

					this.helper.remove();

				}



				$.extend(this, {

					helper: null,

					dragging: false,

					reverting: false,

					_noFinalSort: null

				});



				if(this.domPosition.prev) {

					$(this.domPosition.prev).after(this.currentItem);

				} else {

					$(this.domPosition.parent).prepend(this.currentItem);

				}

			}



			return this;



		},



		serialize: function(o) {



			var items = this._getItemsAsjQuery(o && o.connected),

				str = [];

			o = o || {};



			$(items).each(function() {

				var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));

				if (res) {

					str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));

				}

			});



			if(!str.length && o.key) {

				str.push(o.key + "=");

			}



			return str.join("&");



		},



		toArray: function(o) {



			var items = this._getItemsAsjQuery(o && o.connected),

				ret = [];



			o = o || {};



			items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });

			return ret;



		},



		/* Be careful with the following core functions */

		_intersectsWith: function(item) {



			var x1 = this.positionAbs.left,

				x2 = x1 + this.helperProportions.width,

				y1 = this.positionAbs.top,

				y2 = y1 + this.helperProportions.height,

				l = item.left,

				r = l + item.width,

				t = item.top,

				b = t + item.height,

				dyClick = this.offset.click.top,

				dxClick = this.offset.click.left,

				isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),

				isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),

				isOverElement = isOverElementHeight && isOverElementWidth;



			if ( this.options.tolerance === "pointer" ||

				this.options.forcePointerForContainers ||

				(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])

			) {

				return isOverElement;

			} else {



				return (l < x1 + (this.helperProportions.width / 2) && // Right Half

				x2 - (this.helperProportions.width / 2) < r && // Left Half

				t < y1 + (this.helperProportions.height / 2) && // Bottom Half

				y2 - (this.helperProportions.height / 2) < b ); // Top Half



			}

		},



		_intersectsWithPointer: function(item) {



			var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),

				isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),

				isOverElement = isOverElementHeight && isOverElementWidth,

				verticalDirection = this._getDragVerticalDirection(),

				horizontalDirection = this._getDragHorizontalDirection();



			if (!isOverElement) {

				return false;

			}



			return this.floating ?

				( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )

				: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );



		},



		_intersectsWithSides: function(item) {



			var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),

				isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),

				verticalDirection = this._getDragVerticalDirection(),

				horizontalDirection = this._getDragHorizontalDirection();



			if (this.floating && horizontalDirection) {

				return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));

			} else {

				return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));

			}



		},



		_getDragVerticalDirection: function() {

			var delta = this.positionAbs.top - this.lastPositionAbs.top;

			return delta !== 0 && (delta > 0 ? "down" : "up");

		},



		_getDragHorizontalDirection: function() {

			var delta = this.positionAbs.left - this.lastPositionAbs.left;

			return delta !== 0 && (delta > 0 ? "right" : "left");

		},



		refresh: function(event) {

			this._refreshItems(event);

			this._setHandleClassName();

			this.refreshPositions();

			return this;

		},



		_connectWith: function() {

			var options = this.options;

			return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;

		},



		_getItemsAsjQuery: function(connected) {



			var i, j, cur, inst,

				items = [],

				queries = [],

				connectWith = this._connectWith();



			if(connectWith && connected) {

				for (i = connectWith.length - 1; i >= 0; i--){

					cur = $(connectWith[i]);

					for ( j = cur.length - 1; j >= 0; j--){

						inst = $.data(cur[j], this.widgetFullName);

						if(inst && inst !== this && !inst.options.disabled) {

							queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);

						}

					}

				}

			}



			queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);



			function addItems() {

				items.push( this );

			}

			for (i = queries.length - 1; i >= 0; i--){

				queries[i][0].each( addItems );

			}



			return $(items);



		},



		_removeCurrentsFromItems: function() {



			var list = this.currentItem.find(":data(" + this.widgetName + "-item)");



			this.items = $.grep(this.items, function (item) {

				for (var j=0; j < list.length; j++) {

					if(list[j] === item.item[0]) {

						return false;

					}

				}

				return true;

			});



		},



		_refreshItems: function(event) {



			this.items = [];

			this.containers = [this];



			var i, j, cur, inst, targetData, _queries, item, queriesLength,

				items = this.items,

				queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],

				connectWith = this._connectWith();



			if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down

				for (i = connectWith.length - 1; i >= 0; i--){

					cur = $(connectWith[i]);

					for (j = cur.length - 1; j >= 0; j--){

						inst = $.data(cur[j], this.widgetFullName);

						if(inst && inst !== this && !inst.options.disabled) {

							queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);

							this.containers.push(inst);

						}

					}

				}

			}



			for (i = queries.length - 1; i >= 0; i--) {

				targetData = queries[i][1];

				_queries = queries[i][0];



				for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {

					item = $(_queries[j]);



					item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)



					items.push({

						item: item,

						instance: targetData,

						width: 0, height: 0,

						left: 0, top: 0

					});

				}

			}



		},



		refreshPositions: function(fast) {



			//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change

			if(this.offsetParent && this.helper) {

				this.offset.parent = this._getParentOffset();

			}



			var i, item, t, p;



			for (i = this.items.length - 1; i >= 0; i--){

				item = this.items[i];



				//We ignore calculating positions of all connected containers when we're not over them

				if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {

					continue;

				}



				t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;



				if (!fast) {

					item.width = t.outerWidth();

					item.height = t.outerHeight();

				}



				p = t.offset();

				item.left = p.left;

				item.top = p.top;

			}



			if(this.options.custom && this.options.custom.refreshContainers) {

				this.options.custom.refreshContainers.call(this);

			} else {

				for (i = this.containers.length - 1; i >= 0; i--){

					p = this.containers[i].element.offset();

					this.containers[i].containerCache.left = p.left;

					this.containers[i].containerCache.top = p.top;

					this.containers[i].containerCache.width = this.containers[i].element.outerWidth();

					this.containers[i].containerCache.height = this.containers[i].element.outerHeight();

				}

			}



			return this;

		},



		_createPlaceholder: function(that) {

			that = that || this;

			var className,

				o = that.options;



			if(!o.placeholder || o.placeholder.constructor === String) {

				className = o.placeholder;

				o.placeholder = {

					element: function() {



						var nodeName = that.currentItem[0].nodeName.toLowerCase(),

							element = $( "<" + nodeName + ">", that.document[0] )

								.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")

								.removeClass("ui-sortable-helper");



						if ( nodeName === "tr" ) {

							that.currentItem.children().each(function() {

								$( "<td>&#160;</td>", that.document[0] )

									.attr( "colspan", $( this ).attr( "colspan" ) || 1 )

									.appendTo( element );

							});

						} else if ( nodeName === "img" ) {

							element.attr( "src", that.currentItem.attr( "src" ) );

						}



						if ( !className ) {

							element.css( "visibility", "hidden" );

						}



						return element;

					},

					update: function(container, p) {



						// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that

						// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified

						if(className && !o.forcePlaceholderSize) {

							return;

						}



						//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item

						if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }

						if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }

					}

				};

			}



			//Create the placeholder

			that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));



			//Append it after the actual current item

			that.currentItem.after(that.placeholder);



			//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)

			o.placeholder.update(that, that.placeholder);



		},



		_contactContainers: function(event) {

			var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,

				innermostContainer = null,

				innermostIndex = null;



			// get innermost container that intersects with item

			for (i = this.containers.length - 1; i >= 0; i--) {



				// never consider a container that's located within the item itself

				if($.contains(this.currentItem[0], this.containers[i].element[0])) {

					continue;

				}



				if(this._intersectsWith(this.containers[i].containerCache)) {



					// if we've already found a container and it's more "inner" than this, then continue

					if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {

						continue;

					}



					innermostContainer = this.containers[i];

					innermostIndex = i;



				} else {

					// container doesn't intersect. trigger "out" event if necessary

					if(this.containers[i].containerCache.over) {

						this.containers[i]._trigger("out", event, this._uiHash(this));

						this.containers[i].containerCache.over = 0;

					}

				}



			}



			// if no intersecting containers found, return

			if(!innermostContainer) {

				return;

			}



			// move the item into the container if it's not there already

			if(this.containers.length === 1) {

				if (!this.containers[innermostIndex].containerCache.over) {

					this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));

					this.containers[innermostIndex].containerCache.over = 1;

				}

			} else {



				//When entering a new container, we will find the item with the least distance and append our item near it

				dist = 10000;

				itemWithLeastDistance = null;

				floating = innermostContainer.floating || this._isFloating(this.currentItem);

				posProperty = floating ? "left" : "top";

				sizeProperty = floating ? "width" : "height";

				axis = floating ? "clientX" : "clientY";



				for (j = this.items.length - 1; j >= 0; j--) {

					if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {

						continue;

					}

					if(this.items[j].item[0] === this.currentItem[0]) {

						continue;

					}



					cur = this.items[j].item.offset()[posProperty];

					nearBottom = false;

					if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {

						nearBottom = true;

					}



					if ( Math.abs( event[ axis ] - cur ) < dist ) {

						dist = Math.abs( event[ axis ] - cur );

						itemWithLeastDistance = this.items[ j ];

						this.direction = nearBottom ? "up": "down";

					}

				}



				//Check if dropOnEmpty is enabled

				if(!itemWithLeastDistance && !this.options.dropOnEmpty) {

					return;

				}



				if(this.currentContainer === this.containers[innermostIndex]) {

					return;

				}



				itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);

				this._trigger("change", event, this._uiHash());

				this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));

				this.currentContainer = this.containers[innermostIndex];



				//Update the placeholder

				this.options.placeholder.update(this.currentContainer, this.placeholder);



				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));

				this.containers[innermostIndex].containerCache.over = 1;

			}





		},



		_createHelper: function(event) {



			var o = this.options,

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



			//Add the helper to the DOM if that didn't happen already

			if(!helper.parents("body").length) {

				$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);

			}



			if(helper[0] === this.currentItem[0]) {

				this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };

			}



			if(!helper[0].style.width || o.forceHelperSize) {

				helper.width(this.currentItem.width());

			}

			if(!helper[0].style.height || o.forceHelperSize) {

				helper.height(this.currentItem.height());

			}



			return helper;



		},



		_adjustOffsetFromHelper: function(obj) {

			if (typeof obj === "string") {

				obj = obj.split(" ");

			}

			if ($.isArray(obj)) {

				obj = {left: +obj[0], top: +obj[1] || 0};

			}

			if ("left" in obj) {

				this.offset.click.left = obj.left + this.margins.left;

			}

			if ("right" in obj) {

				this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;

			}

			if ("top" in obj) {

				this.offset.click.top = obj.top + this.margins.top;

			}

			if ("bottom" in obj) {

				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 && $.contains(this.scrollParent[0], this.offsetParent[0])) {

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

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

			}



			// This needs to be actually done for all browsers, since pageX/pageY includes this information

			// with an ugly IE fix

			if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {

				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.currentItem.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.currentItem.css("marginLeft"),10) || 0),

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

			};

		},



		_cacheHelperProportions: function() {

			this.helperProportions = {

				width: this.helper.outerWidth(),

				height: this.helper.outerHeight()

			};

		},



		_setContainment: function() {



			var ce, co, over,

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

				ce = $(o.containment)[0];

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

				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

				];

			}



		},



		_convertPositionTo: function(d, pos) {



			if(!pos) {

				pos = this.position;

			}

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

				scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.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)

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

				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)

				)

			};



		},



		_generatePosition: function(event) {



			var top, left,

				o = this.options,

				pageX = event.pageX,

				pageY = event.pageY,

				scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.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();

			}



			/*

			 * - 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) {

					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;



					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)

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

				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))

				)

			};



		},



		_rearrange: function(event, i, a, hardRefresh) {



			a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));



			//Various things done here to improve the performance:

			// 1. we create a setTimeout, that calls refreshPositions

			// 2. on the instance, we have a counter variable, that get's higher after every append

			// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same

			// 4. this lets only the last addition to the timeout stack through

			this.counter = this.counter ? ++this.counter : 1;

			var counter = this.counter;



			this._delay(function() {

				if(counter === this.counter) {

					this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove

				}

			});



		},



		_clear: function(event, noPropagation) {



			this.reverting = false;

			// We delay all events that have to be triggered to after the point where the placeholder has been removed and

			// everything else normalized again

			var i,

				delayedTriggers = [];



			// We first have to update the dom position of the actual currentItem

			// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)

			if(!this._noFinalSort && this.currentItem.parent().length) {

				this.placeholder.before(this.currentItem);

			}

			this._noFinalSort = null;



			if(this.helper[0] === this.currentItem[0]) {

				for(i in this._storedCSS) {

					if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {

						this._storedCSS[i] = "";

					}

				}

				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");

			} else {

				this.currentItem.show();

			}



			if(this.fromOutside && !noPropagation) {

				delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });

			}

			if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {

				delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed

			}



			// Check if the items Container has Changed and trigger appropriate

			// events.

			if (this !== this.currentContainer) {

				if(!noPropagation) {

					delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });

					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));

					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));

				}

			}





			//Post events to containers

			function delayEvent( type, instance, container ) {

				return function( event ) {

					container._trigger( type, event, instance._uiHash( instance ) );

				};

			}

			for (i = this.containers.length - 1; i >= 0; i--){

				if (!noPropagation) {

					delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );

				}

				if(this.containers[i].containerCache.over) {

					delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );

					this.containers[i].containerCache.over = 0;

				}

			}



			//Do what was originally in plugins

			if ( this.storedCursor ) {

				this.document.find( "body" ).css( "cursor", this.storedCursor );

				this.storedStylesheet.remove();

			}

			if(this._storedOpacity) {

				this.helper.css("opacity", this._storedOpacity);

			}

			if(this._storedZIndex) {

				this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);

			}



			this.dragging = false;

			if(this.cancelHelperRemoval) {

				if(!noPropagation) {

					this._trigger("beforeStop", event, this._uiHash());

					for (i=0; i < delayedTriggers.length; i++) {

						delayedTriggers[i].call(this, event);

					} //Trigger all delayed events

					this._trigger("stop", event, this._uiHash());

				}



				this.fromOutside = false;

				return false;

			}



			if(!noPropagation) {

				this._trigger("beforeStop", event, this._uiHash());

			}



			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!

			this.placeholder[0].parentNode.removeChild(this.placeholder[0]);



			if(this.helper[0] !== this.currentItem[0]) {

				this.helper.remove();

			}

			this.helper = null;



			if(!noPropagation) {

				for (i=0; i < delayedTriggers.length; i++) {

					delayedTriggers[i].call(this, event);

				} //Trigger all delayed events

				this._trigger("stop", event, this._uiHash());

			}



			this.fromOutside = false;

			return true;



		},



		_trigger: function() {

			if ($.Widget.prototype._trigger.apply(this, arguments) === false) {

				this.cancel();

			}

		},



		_uiHash: function(_inst) {

			var inst = _inst || this;

			return {

				helper: inst.helper,

				placeholder: inst.placeholder || $([]),

				position: inst.position,

				originalPosition: inst.originalPosition,

				offset: inst.positionAbs,

				item: inst.currentItem,

				sender: _inst ? _inst.element : null

			};

		}



	});





	/*!

	 * jQuery UI Tabs 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/tabs/

	 */





	var tabs = $.widget( "ui.tabs", {

		version: "1.11.1",

		delay: 300,

		options: {

			active: null,

			collapsible: false,

			event: "click",

			heightStyle: "content",

			hide: null,

			show: null,



			// callbacks

			activate: null,

			beforeActivate: null,

			beforeLoad: null,

			load: null

		},



		_isLocal: (function() {

			var rhash = /#.*$/;



			return function( anchor ) {

				var anchorUrl, locationUrl;



				// support: IE7

				// IE7 doesn't normalize the href property when set via script (#9317)

				anchor = anchor.cloneNode( false );



				anchorUrl = anchor.href.replace( rhash, "" );

				locationUrl = location.href.replace( rhash, "" );



				// decoding may throw an error if the URL isn't UTF-8 (#9518)

				try {

					anchorUrl = decodeURIComponent( anchorUrl );

				} catch ( error ) {}

				try {

					locationUrl = decodeURIComponent( locationUrl );

				} catch ( error ) {}



				return anchor.hash.length > 1 && anchorUrl === locationUrl;

			};

		})(),



		_create: function() {

			var that = this,

				options = this.options;



			this.running = false;



			this.element

				.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )

				.toggleClass( "ui-tabs-collapsible", options.collapsible );



			this._processTabs();

			options.active = this._initialActive();



			// Take disabling tabs via class attribute from HTML

			// into account and update option properly.

			if ( $.isArray( options.disabled ) ) {

				options.disabled = $.unique( options.disabled.concat(

					$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {

						return that.tabs.index( li );

					})

				) ).sort();

			}



			// check for length avoids error when initializing empty list

			if ( this.options.active !== false && this.anchors.length ) {

				this.active = this._findActive( options.active );

			} else {

				this.active = $();

			}



			this._refresh();



			if ( this.active.length ) {

				this.load( options.active );

			}

		},



		_initialActive: function() {

			var active = this.options.active,

				collapsible = this.options.collapsible,

				locationHash = location.hash.substring( 1 );



			if ( active === null ) {

				// check the fragment identifier in the URL

				if ( locationHash ) {

					this.tabs.each(function( i, tab ) {

						if ( $( tab ).attr( "aria-controls" ) === locationHash ) {

							active = i;

							return false;

						}

					});

				}



				// check for a tab marked active via a class

				if ( active === null ) {

					active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );

				}



				// no active tab, set to false

				if ( active === null || active === -1 ) {

					active = this.tabs.length ? 0 : false;

				}

			}



			// handle numbers: negative, out of range

			if ( active !== false ) {

				active = this.tabs.index( this.tabs.eq( active ) );

				if ( active === -1 ) {

					active = collapsible ? false : 0;

				}

			}



			// don't allow collapsible: false and active: false

			if ( !collapsible && active === false && this.anchors.length ) {

				active = 0;

			}



			return active;

		},



		_getCreateEventData: function() {

			return {

				tab: this.active,

				panel: !this.active.length ? $() : this._getPanelForTab( this.active )

			};

		},



		_tabKeydown: function( event ) {

			var focusedTab = $( this.document[0].activeElement ).closest( "li" ),

				selectedIndex = this.tabs.index( focusedTab ),

				goingForward = true;



			if ( this._handlePageNav( event ) ) {

				return;

			}



			switch ( event.keyCode ) {

				case $.ui.keyCode.RIGHT:

				case $.ui.keyCode.DOWN:

					selectedIndex++;

					break;

				case $.ui.keyCode.UP:

				case $.ui.keyCode.LEFT:

					goingForward = false;

					selectedIndex--;

					break;

				case $.ui.keyCode.END:

					selectedIndex = this.anchors.length - 1;

					break;

				case $.ui.keyCode.HOME:

					selectedIndex = 0;

					break;

				case $.ui.keyCode.SPACE:

					// Activate only, no collapsing

					event.preventDefault();

					clearTimeout( this.activating );

					this._activate( selectedIndex );

					return;

				case $.ui.keyCode.ENTER:

					// Toggle (cancel delayed activation, allow collapsing)

					event.preventDefault();

					clearTimeout( this.activating );

					// Determine if we should collapse or activate

					this._activate( selectedIndex === this.options.active ? false : selectedIndex );

					return;

				default:

					return;

			}



			// Focus the appropriate tab, based on which key was pressed

			event.preventDefault();

			clearTimeout( this.activating );

			selectedIndex = this._focusNextTab( selectedIndex, goingForward );



			// Navigating with control key will prevent automatic activation

			if ( !event.ctrlKey ) {

				// Update aria-selected immediately so that AT think the tab is already selected.

				// Otherwise AT may confuse the user by stating that they need to activate the tab,

				// but the tab will already be activated by the time the announcement finishes.

				focusedTab.attr( "aria-selected", "false" );

				this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );



				this.activating = this._delay(function() {

					this.option( "active", selectedIndex );

				}, this.delay );

			}

		},



		_panelKeydown: function( event ) {

			if ( this._handlePageNav( event ) ) {

				return;

			}



			// Ctrl+up moves focus to the current tab

			if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {

				event.preventDefault();

				this.active.focus();

			}

		},



		// Alt+page up/down moves focus to the previous/next tab (and activates)

		_handlePageNav: function( event ) {

			if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {

				this._activate( this._focusNextTab( this.options.active - 1, false ) );

				return true;

			}

			if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {

				this._activate( this._focusNextTab( this.options.active + 1, true ) );

				return true;

			}

		},



		_findNextTab: function( index, goingForward ) {

			var lastTabIndex = this.tabs.length - 1;



			function constrain() {

				if ( index > lastTabIndex ) {

					index = 0;

				}

				if ( index < 0 ) {

					index = lastTabIndex;

				}

				return index;

			}



			while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {

				index = goingForward ? index + 1 : index - 1;

			}



			return index;

		},



		_focusNextTab: function( index, goingForward ) {

			index = this._findNextTab( index, goingForward );

			this.tabs.eq( index ).focus();

			return index;

		},



		_setOption: function( key, value ) {

			if ( key === "active" ) {

				// _activate() will handle invalid values and update this.options

				this._activate( value );

				return;

			}



			if ( key === "disabled" ) {

				// don't use the widget factory's disabled handling

				this._setupDisabled( value );

				return;

			}



			this._super( key, value);



			if ( key === "collapsible" ) {

				this.element.toggleClass( "ui-tabs-collapsible", value );

				// Setting collapsible: false while collapsed; open first panel

				if ( !value && this.options.active === false ) {

					this._activate( 0 );

				}

			}



			if ( key === "event" ) {

				this._setupEvents( value );

			}



			if ( key === "heightStyle" ) {

				this._setupHeightStyle( value );

			}

		},



		_sanitizeSelector: function( hash ) {

			return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";

		},



		refresh: function() {

			var options = this.options,

				lis = this.tablist.children( ":has(a[href])" );



			// get disabled tabs from class attribute from HTML

			// this will get converted to a boolean if needed in _refresh()

			options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {

				return lis.index( tab );

			});



			this._processTabs();



			// was collapsed or no tabs

			if ( options.active === false || !this.anchors.length ) {

				options.active = false;

				this.active = $();

				// was active, but active tab is gone

			} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {

				// all remaining tabs are disabled

				if ( this.tabs.length === options.disabled.length ) {

					options.active = false;

					this.active = $();

					// activate previous tab

				} else {

					this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );

				}

				// was active, active tab still exists

			} else {

				// make sure active index is correct

				options.active = this.tabs.index( this.active );

			}



			this._refresh();

		},



		_refresh: function() {

			this._setupDisabled( this.options.disabled );

			this._setupEvents( this.options.event );

			this._setupHeightStyle( this.options.heightStyle );



			this.tabs.not( this.active ).attr({

				"aria-selected": "false",

				"aria-expanded": "false",

				tabIndex: -1

			});

			this.panels.not( this._getPanelForTab( this.active ) )

				.hide()

				.attr({

					"aria-hidden": "true"

				});



			// Make sure one tab is in the tab order

			if ( !this.active.length ) {

				this.tabs.eq( 0 ).attr( "tabIndex", 0 );

			} else {

				this.active

					.addClass( "ui-tabs-active ui-state-active" )

					.attr({

						"aria-selected": "true",

						"aria-expanded": "true",

						tabIndex: 0

					});

				this._getPanelForTab( this.active )

					.show()

					.attr({

						"aria-hidden": "false"

					});

			}

		},



		_processTabs: function() {

			var that = this;



			this.tablist = this._getList()

				.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )

				.attr( "role", "tablist" )



				// Prevent users from focusing disabled tabs via click

				.delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {

					if ( $( this ).is( ".ui-state-disabled" ) ) {

						event.preventDefault();

					}

				})



				// support: IE <9

				// Preventing the default action in mousedown doesn't prevent IE

				// from focusing the element, so if the anchor gets focused, blur.

				// We don't have to worry about focusing the previously focused

				// element since clicking on a non-focusable element should focus

				// the body anyway.

				.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {

					if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {

						this.blur();

					}

				});



			this.tabs = this.tablist.find( "> li:has(a[href])" )

				.addClass( "ui-state-default ui-corner-top" )

				.attr({

					role: "tab",

					tabIndex: -1

				});



			this.anchors = this.tabs.map(function() {

				return $( "a", this )[ 0 ];

			})

				.addClass( "ui-tabs-anchor" )

				.attr({

					role: "presentation",

					tabIndex: -1

				});



			this.panels = $();



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

				var selector, panel, panelId,

					anchorId = $( anchor ).uniqueId().attr( "id" ),

					tab = $( anchor ).closest( "li" ),

					originalAriaControls = tab.attr( "aria-controls" );



				// inline tab

				if ( that._isLocal( anchor ) ) {

					selector = anchor.hash;

					panelId = selector.substring( 1 );

					panel = that.element.find( that._sanitizeSelector( selector ) );

					// remote tab

				} else {

					// If the tab doesn't already have aria-controls,

					// generate an id by using a throw-away element

					panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;

					selector = "#" + panelId;

					panel = that.element.find( selector );

					if ( !panel.length ) {

						panel = that._createPanel( panelId );

						panel.insertAfter( that.panels[ i - 1 ] || that.tablist );

					}

					panel.attr( "aria-live", "polite" );

				}



				if ( panel.length) {

					that.panels = that.panels.add( panel );

				}

				if ( originalAriaControls ) {

					tab.data( "ui-tabs-aria-controls", originalAriaControls );

				}

				tab.attr({

					"aria-controls": panelId,

					"aria-labelledby": anchorId

				});

				panel.attr( "aria-labelledby", anchorId );

			});



			this.panels

				.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )

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

		},



		// allow overriding how to find the list for rare usage scenarios (#7715)

		_getList: function() {

			return this.tablist || this.element.find( "ol,ul" ).eq( 0 );

		},



		_createPanel: function( id ) {

			return $( "<div>" )

				.attr( "id", id )

				.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )

				.data( "ui-tabs-destroy", true );

		},



		_setupDisabled: function( disabled ) {

			if ( $.isArray( disabled ) ) {

				if ( !disabled.length ) {

					disabled = false;

				} else if ( disabled.length === this.anchors.length ) {

					disabled = true;

				}

			}



			// disable tabs

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

				if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {

					$( li )

						.addClass( "ui-state-disabled" )

						.attr( "aria-disabled", "true" );

				} else {

					$( li )

						.removeClass( "ui-state-disabled" )

						.removeAttr( "aria-disabled" );

				}

			}



			this.options.disabled = disabled;

		},



		_setupEvents: function( event ) {

			var events = {};

			if ( event ) {

				$.each( event.split(" "), function( index, eventName ) {

					events[ eventName ] = "_eventHandler";

				});

			}



			this._off( this.anchors.add( this.tabs ).add( this.panels ) );

			// Always prevent the default action, even when disabled

			this._on( true, this.anchors, {

				click: function( event ) {

					event.preventDefault();

				}

			});

			this._on( this.anchors, events );

			this._on( this.tabs, { keydown: "_tabKeydown" } );

			this._on( this.panels, { keydown: "_panelKeydown" } );



			this._focusable( this.tabs );

			this._hoverable( this.tabs );

		},



		_setupHeightStyle: function( heightStyle ) {

			var maxHeight,

				parent = this.element.parent();



			if ( heightStyle === "fill" ) {

				maxHeight = parent.height();

				maxHeight -= this.element.outerHeight() - this.element.height();



				this.element.siblings( ":visible" ).each(function() {

					var elem = $( this ),

						position = elem.css( "position" );



					if ( position === "absolute" || position === "fixed" ) {

						return;

					}

					maxHeight -= elem.outerHeight( true );

				});



				this.element.children().not( this.panels ).each(function() {

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

				});



				this.panels.each(function() {

					$( this ).height( Math.max( 0, maxHeight -

					$( this ).innerHeight() + $( this ).height() ) );

				})

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

			} else if ( heightStyle === "auto" ) {

				maxHeight = 0;

				this.panels.each(function() {

					maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );

				}).height( maxHeight );

			}

		},



		_eventHandler: function( event ) {

			var options = this.options,

				active = this.active,

				anchor = $( event.currentTarget ),

				tab = anchor.closest( "li" ),

				clickedIsActive = tab[ 0 ] === active[ 0 ],

				collapsing = clickedIsActive && options.collapsible,

				toShow = collapsing ? $() : this._getPanelForTab( tab ),

				toHide = !active.length ? $() : this._getPanelForTab( active ),

				eventData = {

					oldTab: active,

					oldPanel: toHide,

					newTab: collapsing ? $() : tab,

					newPanel: toShow

				};



			event.preventDefault();



			if ( tab.hasClass( "ui-state-disabled" ) ||

					// tab is already loading

				tab.hasClass( "ui-tabs-loading" ) ||

					// can't switch durning an animation

				this.running ||

					// click on active header, but not collapsible

				( clickedIsActive && !options.collapsible ) ||

					// allow canceling activation

				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {

				return;

			}



			options.active = collapsing ? false : this.tabs.index( tab );



			this.active = clickedIsActive ? $() : tab;

			if ( this.xhr ) {

				this.xhr.abort();

			}



			if ( !toHide.length && !toShow.length ) {

				$.error( "jQuery UI Tabs: Mismatching fragment identifier." );

			}



			if ( toShow.length ) {

				this.load( this.tabs.index( tab ), event );

			}

			this._toggle( event, eventData );

		},



		// handles show/hide for selecting tabs

		_toggle: function( event, eventData ) {

			var that = this,

				toShow = eventData.newPanel,

				toHide = eventData.oldPanel;



			this.running = true;



			function complete() {

				that.running = false;

				that._trigger( "activate", event, eventData );

			}



			function show() {

				eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );



				if ( toShow.length && that.options.show ) {

					that._show( toShow, that.options.show, complete );

				} else {

					toShow.show();

					complete();

				}

			}



			// start out by hiding, then showing, then completing

			if ( toHide.length && this.options.hide ) {

				this._hide( toHide, this.options.hide, function() {

					eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );

					show();

				});

			} else {

				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );

				toHide.hide();

				show();

			}



			toHide.attr( "aria-hidden", "true" );

			eventData.oldTab.attr({

				"aria-selected": "false",

				"aria-expanded": "false"

			});

			// If we're switching tabs, remove the old tab from the tab order.

			// If we're opening from collapsed state, remove the previous tab from the tab order.

			// If we're collapsing, then keep the collapsing tab in the tab order.

			if ( toShow.length && toHide.length ) {

				eventData.oldTab.attr( "tabIndex", -1 );

			} else if ( toShow.length ) {

				this.tabs.filter(function() {

					return $( this ).attr( "tabIndex" ) === 0;

				})

					.attr( "tabIndex", -1 );

			}



			toShow.attr( "aria-hidden", "false" );

			eventData.newTab.attr({

				"aria-selected": "true",

				"aria-expanded": "true",

				tabIndex: 0

			});

		},



		_activate: function( index ) {

			var anchor,

				active = this._findActive( index );



			// trying to activate the already active panel

			if ( active[ 0 ] === this.active[ 0 ] ) {

				return;

			}



			// trying to collapse, simulate a click on the current active header

			if ( !active.length ) {

				active = this.active;

			}



			anchor = active.find( ".ui-tabs-anchor" )[ 0 ];

			this._eventHandler({

				target: anchor,

				currentTarget: anchor,

				preventDefault: $.noop

			});

		},



		_findActive: function( index ) {

			return index === false ? $() : this.tabs.eq( index );

		},



		_getIndex: function( index ) {

			// meta-function to give users option to provide a href string instead of a numerical index.

			if ( typeof index === "string" ) {

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

			}



			return index;

		},



		_destroy: function() {

			if ( this.xhr ) {

				this.xhr.abort();

			}



			this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );



			this.tablist

				.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )

				.removeAttr( "role" );



			this.anchors

				.removeClass( "ui-tabs-anchor" )

				.removeAttr( "role" )

				.removeAttr( "tabIndex" )

				.removeUniqueId();



			this.tablist.unbind( this.eventNamespace );



			this.tabs.add( this.panels ).each(function() {

				if ( $.data( this, "ui-tabs-destroy" ) ) {

					$( this ).remove();

				} else {

					$( this )

						.removeClass( "ui-state-default ui-state-active ui-state-disabled " +

						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )

						.removeAttr( "tabIndex" )

						.removeAttr( "aria-live" )

						.removeAttr( "aria-busy" )

						.removeAttr( "aria-selected" )

						.removeAttr( "aria-labelledby" )

						.removeAttr( "aria-hidden" )

						.removeAttr( "aria-expanded" )

						.removeAttr( "role" );

				}

			});



			this.tabs.each(function() {

				var li = $( this ),

					prev = li.data( "ui-tabs-aria-controls" );

				if ( prev ) {

					li

						.attr( "aria-controls", prev )

						.removeData( "ui-tabs-aria-controls" );

				} else {

					li.removeAttr( "aria-controls" );

				}

			});



			this.panels.show();



			if ( this.options.heightStyle !== "content" ) {

				this.panels.css( "height", "" );

			}

		},



		enable: function( index ) {

			var disabled = this.options.disabled;

			if ( disabled === false ) {

				return;

			}



			if ( index === undefined ) {

				disabled = false;

			} else {

				index = this._getIndex( index );

				if ( $.isArray( disabled ) ) {

					disabled = $.map( disabled, function( num ) {

						return num !== index ? num : null;

					});

				} else {

					disabled = $.map( this.tabs, function( li, num ) {

						return num !== index ? num : null;

					});

				}

			}

			this._setupDisabled( disabled );

		},



		disable: function( index ) {

			var disabled = this.options.disabled;

			if ( disabled === true ) {

				return;

			}



			if ( index === undefined ) {

				disabled = true;

			} else {

				index = this._getIndex( index );

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

					return;

				}

				if ( $.isArray( disabled ) ) {

					disabled = $.merge( [ index ], disabled ).sort();

				} else {

					disabled = [ index ];

				}

			}

			this._setupDisabled( disabled );

		},



		load: function( index, event ) {

			index = this._getIndex( index );

			var that = this,

				tab = this.tabs.eq( index ),

				anchor = tab.find( ".ui-tabs-anchor" ),

				panel = this._getPanelForTab( tab ),

				eventData = {

					tab: tab,

					panel: panel

				};



			// not remote

			if ( this._isLocal( anchor[ 0 ] ) ) {

				return;

			}



			this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );



			// support: jQuery <1.8

			// jQuery <1.8 returns false if the request is canceled in beforeSend,

			// but as of 1.8, $.ajax() always returns a jqXHR object.

			if ( this.xhr && this.xhr.statusText !== "canceled" ) {

				tab.addClass( "ui-tabs-loading" );

				panel.attr( "aria-busy", "true" );



				this.xhr

					.success(function( response ) {

						// support: jQuery <1.8

						// http://bugs.jquery.com/ticket/11778

						setTimeout(function() {

							panel.html( response );

							that._trigger( "load", event, eventData );

						}, 1 );

					})

					.complete(function( jqXHR, status ) {

						// support: jQuery <1.8

						// http://bugs.jquery.com/ticket/11778

						setTimeout(function() {

							if ( status === "abort" ) {

								that.panels.stop( false, true );

							}



							tab.removeClass( "ui-tabs-loading" );

							panel.removeAttr( "aria-busy" );



							if ( jqXHR === that.xhr ) {

								delete that.xhr;

							}

						}, 1 );

					});

			}

		},



		_ajaxSettings: function( anchor, event, eventData ) {

			var that = this;

			return {

				url: anchor.attr( "href" ),

				beforeSend: function( jqXHR, settings ) {

					return that._trigger( "beforeLoad", event,

						$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );

				}

			};

		},



		_getPanelForTab: function( tab ) {

			var id = $( tab ).attr( "aria-controls" );

			return this.element.find( this._sanitizeSelector( "#" + id ) );

		}

	});



	/*!

	 * jQuery UI Effects 1.11.1

	 * http://jqueryui.com

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * http://api.jqueryui.com/category/effects-core/

	 */





	var dataSpace = "ui-effects-",



	// Create a local jQuery because jQuery Color relies on it and the

	// global may not exist with AMD and a custom build (#10199)

		jQuery = $;



	$.effects = {

		effect: {}

	};



	/*!

	 * jQuery Color Animations v2.1.2

	 * https://github.com/jquery/jquery-color

	 *

	 * Copyright 2014 jQuery Foundation and other contributors

	 * Released under the MIT license.

	 * http://jquery.org/license

	 *

	 * Date: Wed Jan 16 08:47:09 2013 -0600

	 */

	(function( jQuery, undefined ) {



		var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",



		// plusequals test for += 100 -= 100

			rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,

		// a set of RE's that can match strings and generate color tuples.

			stringParsers = [ {

				re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,

				parse: function( execResult ) {

					return [

						execResult[ 1 ],

						execResult[ 2 ],

						execResult[ 3 ],

						execResult[ 4 ]

					];

				}

			}, {

				re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,

				parse: function( execResult ) {

					return [

						execResult[ 1 ] * 2.55,

						execResult[ 2 ] * 2.55,

						execResult[ 3 ] * 2.55,

						execResult[ 4 ]

					];

				}

			}, {

				// this regex ignores A-F because it's compared against an already lowercased string

				re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,

				parse: function( execResult ) {

					return [

						parseInt( execResult[ 1 ], 16 ),

						parseInt( execResult[ 2 ], 16 ),

						parseInt( execResult[ 3 ], 16 )

					];

				}

			}, {

				// this regex ignores A-F because it's compared against an already lowercased string

				re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,

				parse: function( execResult ) {

					return [

						parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),

						parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),

						parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )

					];

				}

			}, {

				re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,

				space: "hsla",

				parse: function( execResult ) {

					return [

						execResult[ 1 ],

						execResult[ 2 ] / 100,

						execResult[ 3 ] / 100,

						execResult[ 4 ]

					];

				}

			} ],



		// jQuery.Color( )

			color = jQuery.Color = function( color, green, blue, alpha ) {

				return new jQuery.Color.fn.parse( color, green, blue, alpha );

			},

			spaces = {

				rgba: {

					props: {

						red: {

							idx: 0,

							type: "byte"

						},

						green: {

							idx: 1,

							type: "byte"

						},

						blue: {

							idx: 2,

							type: "byte"

						}

					}

				},



				hsla: {

					props: {

						hue: {

							idx: 0,

							type: "degrees"

						},

						saturation: {

							idx: 1,

							type: "percent"

						},

						lightness: {

							idx: 2,

							type: "percent"

						}

					}

				}

			},

			propTypes = {

				"byte": {

					floor: true,

					max: 255

				},

				"percent": {

					max: 1

				},

				"degrees": {

					mod: 360,

					floor: true

				}

			},

			support = color.support = {},



		// element for support tests

			supportElem = jQuery( "<p>" )[ 0 ],



		// colors = jQuery.Color.names

			colors,



		// local aliases of functions called often

			each = jQuery.each;



// determine rgba support immediately

		supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";

		support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;



// define cache name and alpha properties

// for rgba and hsla spaces

		each( spaces, function( spaceName, space ) {

			space.cache = "_" + spaceName;

			space.props.alpha = {

				idx: 3,

				type: "percent",

				def: 1

			};

		});



		function clamp( value, prop, allowEmpty ) {

			var type = propTypes[ prop.type ] || {};



			if ( value == null ) {

				return (allowEmpty || !prop.def) ? null : prop.def;

			}



			// ~~ is an short way of doing floor for positive numbers

			value = type.floor ? ~~value : parseFloat( value );



			// IE will pass in empty strings as value for alpha,

			// which will hit this case

			if ( isNaN( value ) ) {

				return prop.def;

			}



			if ( type.mod ) {

				// we add mod before modding to make sure that negatives values

				// get converted properly: -10 -> 350

				return (value + type.mod) % type.mod;

			}



			// for now all property types without mod have min and max

			return 0 > value ? 0 : type.max < value ? type.max : value;

		}



		function stringParse( string ) {

			var inst = color(),

				rgba = inst._rgba = [];



			string = string.toLowerCase();



			each( stringParsers, function( i, parser ) {

				var parsed,

					match = parser.re.exec( string ),

					values = match && parser.parse( match ),

					spaceName = parser.space || "rgba";



				if ( values ) {

					parsed = inst[ spaceName ]( values );



					// if this was an rgba parse the assignment might happen twice

					// oh well....

					inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];

					rgba = inst._rgba = parsed._rgba;



					// exit each( stringParsers ) here because we matched

					return false;

				}

			});



			// Found a stringParser that handled it

			if ( rgba.length ) {



				// if this came from a parsed string, force "transparent" when alpha is 0

				// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)

				if ( rgba.join() === "0,0,0,0" ) {

					jQuery.extend( rgba, colors.transparent );

				}

				return inst;

			}



			// named colors

			return colors[ string ];

		}



		color.fn = jQuery.extend( color.prototype, {

			parse: function( red, green, blue, alpha ) {

				if ( red === undefined ) {

					this._rgba = [ null, null, null, null ];

					return this;

				}

				if ( red.jquery || red.nodeType ) {

					red = jQuery( red ).css( green );

					green = undefined;

				}



				var inst = this,

					type = jQuery.type( red ),

					rgba = this._rgba = [];



				// more than 1 argument specified - assume ( red, green, blue, alpha )

				if ( green !== undefined ) {

					red = [ red, green, blue, alpha ];

					type = "array";

				}



				if ( type === "string" ) {

					return this.parse( stringParse( red ) || colors._default );

				}



				if ( type === "array" ) {

					each( spaces.rgba.props, function( key, prop ) {

						rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );

					});

					return this;

				}



				if ( type === "object" ) {

					if ( red instanceof color ) {

						each( spaces, function( spaceName, space ) {

							if ( red[ space.cache ] ) {

								inst[ space.cache ] = red[ space.cache ].slice();

							}

						});

					} else {

						each( spaces, function( spaceName, space ) {

							var cache = space.cache;

							each( space.props, function( key, prop ) {



								// if the cache doesn't exist, and we know how to convert

								if ( !inst[ cache ] && space.to ) {



									// if the value was null, we don't need to copy it

									// if the key was alpha, we don't need to copy it either

									if ( key === "alpha" || red[ key ] == null ) {

										return;

									}

									inst[ cache ] = space.to( inst._rgba );

								}



								// this is the only case where we allow nulls for ALL properties.

								// call clamp with alwaysAllowEmpty

								inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );

							});



							// everything defined but alpha?

							if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {

								// use the default of 1

								inst[ cache ][ 3 ] = 1;

								if ( space.from ) {

									inst._rgba = space.from( inst[ cache ] );

								}

							}

						});

					}

					return this;

				}

			},

			is: function( compare ) {

				var is = color( compare ),

					same = true,

					inst = this;



				each( spaces, function( _, space ) {

					var localCache,

						isCache = is[ space.cache ];

					if (isCache) {

						localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];

						each( space.props, function( _, prop ) {

							if ( isCache[ prop.idx ] != null ) {

								same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );

								return same;

							}

						});

					}

					return same;

				});

				return same;

			},

			_space: function() {

				var used = [],

					inst = this;

				each( spaces, function( spaceName, space ) {

					if ( inst[ space.cache ] ) {

						used.push( spaceName );

					}

				});

				return used.pop();

			},

			transition: function( other, distance ) {

				var end = color( other ),

					spaceName = end._space(),

					space = spaces[ spaceName ],

					startColor = this.alpha() === 0 ? color( "transparent" ) : this,

					start = startColor[ space.cache ] || space.to( startColor._rgba ),

					result = start.slice();



				end = end[ space.cache ];

				each( space.props, function( key, prop ) {

					var index = prop.idx,

						startValue = start[ index ],

						endValue = end[ index ],

						type = propTypes[ prop.type ] || {};



					// if null, don't override start value

					if ( endValue === null ) {

						return;

					}

					// if null - use end

					if ( startValue === null ) {

						result[ index ] = endValue;

					} else {

						if ( type.mod ) {

							if ( endValue - startValue > type.mod / 2 ) {

								startValue += type.mod;

							} else if ( startValue - endValue > type.mod / 2 ) {

								startValue -= type.mod;

							}

						}

						result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );

					}

				});

				return this[ spaceName ]( result );

			},

			blend: function( opaque ) {

				// if we are already opaque - return ourself

				if ( this._rgba[ 3 ] === 1 ) {

					return this;

				}



				var rgb = this._rgba.slice(),

					a = rgb.pop(),

					blend = color( opaque )._rgba;



				return color( jQuery.map( rgb, function( v, i ) {

					return ( 1 - a ) * blend[ i ] + a * v;

				}));

			},

			toRgbaString: function() {

				var prefix = "rgba(",

					rgba = jQuery.map( this._rgba, function( v, i ) {

						return v == null ? ( i > 2 ? 1 : 0 ) : v;

					});



				if ( rgba[ 3 ] === 1 ) {

					rgba.pop();

					prefix = "rgb(";

				}



				return prefix + rgba.join() + ")";

			},

			toHslaString: function() {

				var prefix = "hsla(",

					hsla = jQuery.map( this.hsla(), function( v, i ) {

						if ( v == null ) {

							v = i > 2 ? 1 : 0;

						}



						// catch 1 and 2

						if ( i && i < 3 ) {

							v = Math.round( v * 100 ) + "%";

						}

						return v;

					});



				if ( hsla[ 3 ] === 1 ) {

					hsla.pop();

					prefix = "hsl(";

				}

				return prefix + hsla.join() + ")";

			},

			toHexString: function( includeAlpha ) {

				var rgba = this._rgba.slice(),

					alpha = rgba.pop();



				if ( includeAlpha ) {

					rgba.push( ~~( alpha * 255 ) );

				}



				return "#" + jQuery.map( rgba, function( v ) {



					// default to 0 when nulls exist

					v = ( v || 0 ).toString( 16 );

					return v.length === 1 ? "0" + v : v;

				}).join("");

			},

			toString: function() {

				return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();

			}

		});

		color.fn.parse.prototype = color.fn;



// hsla conversions adapted from:

// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021



		function hue2rgb( p, q, h ) {

			h = ( h + 1 ) % 1;

			if ( h * 6 < 1 ) {

				return p + ( q - p ) * h * 6;

			}

			if ( h * 2 < 1) {

				return q;

			}

			if ( h * 3 < 2 ) {

				return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;

			}

			return p;

		}



		spaces.hsla.to = function( rgba ) {

			if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {

				return [ null, null, null, rgba[ 3 ] ];

			}

			var r = rgba[ 0 ] / 255,

				g = rgba[ 1 ] / 255,

				b = rgba[ 2 ] / 255,

				a = rgba[ 3 ],

				max = Math.max( r, g, b ),

				min = Math.min( r, g, b ),

				diff = max - min,

				add = max + min,

				l = add * 0.5,

				h, s;



			if ( min === max ) {

				h = 0;

			} else if ( r === max ) {

				h = ( 60 * ( g - b ) / diff ) + 360;

			} else if ( g === max ) {

				h = ( 60 * ( b - r ) / diff ) + 120;

			} else {

				h = ( 60 * ( r - g ) / diff ) + 240;

			}



			// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%

			// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)

			if ( diff === 0 ) {

				s = 0;

			} else if ( l <= 0.5 ) {

				s = diff / add;

			} else {

				s = diff / ( 2 - add );

			}

			return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];

		};



		spaces.hsla.from = function( hsla ) {

			if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {

				return [ null, null, null, hsla[ 3 ] ];

			}

			var h = hsla[ 0 ] / 360,

				s = hsla[ 1 ],

				l = hsla[ 2 ],

				a = hsla[ 3 ],

				q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,

				p = 2 * l - q;



			return [

				Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),

				Math.round( hue2rgb( p, q, h ) * 255 ),

				Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),

				a

			];

		};



		each( spaces, function( spaceName, space ) {

			var props = space.props,

				cache = space.cache,

				to = space.to,

				from = space.from;



			// makes rgba() and hsla()

			color.fn[ spaceName ] = function( value ) {



				// generate a cache for this space if it doesn't exist

				if ( to && !this[ cache ] ) {

					this[ cache ] = to( this._rgba );

				}

				if ( value === undefined ) {

					return this[ cache ].slice();

				}



				var ret,

					type = jQuery.type( value ),

					arr = ( type === "array" || type === "object" ) ? value : arguments,

					local = this[ cache ].slice();



				each( props, function( key, prop ) {

					var val = arr[ type === "object" ? key : prop.idx ];

					if ( val == null ) {

						val = local[ prop.idx ];

					}

					local[ prop.idx ] = clamp( val, prop );

				});



				if ( from ) {

					ret = color( from( local ) );

					ret[ cache ] = local;

					return ret;

				} else {

					return color( local );

				}

			};



			// makes red() green() blue() alpha() hue() saturation() lightness()

			each( props, function( key, prop ) {

				// alpha is included in more than one space

				if ( color.fn[ key ] ) {

					return;

				}

				color.fn[ key ] = function( value ) {

					var vtype = jQuery.type( value ),

						fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),

						local = this[ fn ](),

						cur = local[ prop.idx ],

						match;



					if ( vtype === "undefined" ) {

						return cur;

					}



					if ( vtype === "function" ) {

						value = value.call( this, cur );

						vtype = jQuery.type( value );

					}

					if ( value == null && prop.empty ) {

						return this;

					}

					if ( vtype === "string" ) {

						match = rplusequals.exec( value );

						if ( match ) {

							value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );

						}

					}

					local[ prop.idx ] = value;

					return this[ fn ]( local );

				};

			});

		});



// add cssHook and .fx.step function for each named hook.

// accept a space separated string of properties

		color.hook = function( hook ) {

			var hooks = hook.split( " " );

			each( hooks, function( i, hook ) {

				jQuery.cssHooks[ hook ] = {

					set: function( elem, value ) {

						var parsed, curElem,

							backgroundColor = "";



						if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {

							value = color( parsed || value );

							if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {

								curElem = hook === "backgroundColor" ? elem.parentNode : elem;

								while (

								(backgroundColor === "" || backgroundColor === "transparent") &&

								curElem && curElem.style

									) {

									try {

										backgroundColor = jQuery.css( curElem, "backgroundColor" );

										curElem = curElem.parentNode;

									} catch ( e ) {

									}

								}



								value = value.blend( backgroundColor && backgroundColor !== "transparent" ?

									backgroundColor :

									"_default" );

							}



							value = value.toRgbaString();

						}

						try {

							elem.style[ hook ] = value;

						} catch( e ) {

							// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'

						}

					}

				};

				jQuery.fx.step[ hook ] = function( fx ) {

					if ( !fx.colorInit ) {

						fx.start = color( fx.elem, hook );

						fx.end = color( fx.end );

						fx.colorInit = true;

					}

					jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );

				};

			});



		};



		color.hook( stepHooks );



		jQuery.cssHooks.borderColor = {

			expand: function( value ) {

				var expanded = {};



				each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {

					expanded[ "border" + part + "Color" ] = value;

				});

				return expanded;

			}

		};



// Basic color names only.

// Usage of any of the other color names requires adding yourself or including

// jquery.color.svg-names.js.

		colors = jQuery.Color.names = {

			// 4.1. Basic color keywords

			aqua: "#00ffff",

			black: "#000000",

			blue: "#0000ff",

			fuchsia: "#ff00ff",

			gray: "#808080",

			green: "#008000",

			lime: "#00ff00",

			maroon: "#800000",

			navy: "#000080",

			olive: "#808000",

			purple: "#800080",

			red: "#ff0000",

			silver: "#c0c0c0",

			teal: "#008080",

			white: "#ffffff",

			yellow: "#ffff00",



			// 4.2.3. "transparent" color keyword

			transparent: [ null, null, null, 0 ],



			_default: "#ffffff"

		};



	})( jQuery );



	/******************************************************************************/

	/****************************** CLASS ANIMATIONS ******************************/

	/******************************************************************************/

	(function() {



		var classAnimationActions = [ "add", "remove", "toggle" ],

			shorthandStyles = {

				border: 1,

				borderBottom: 1,

				borderColor: 1,

				borderLeft: 1,

				borderRight: 1,

				borderTop: 1,

				borderWidth: 1,

				margin: 1,

				padding: 1

			};



		$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {

			$.fx.step[ prop ] = function( fx ) {

				if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {

					jQuery.style( fx.elem, prop, fx.end );

					fx.setAttr = true;

				}

			};

		});



		function getElementStyles( elem ) {

			var key, len,

				style = elem.ownerDocument.defaultView ?

					elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :

					elem.currentStyle,

				styles = {};



			if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {

				len = style.length;

				while ( len-- ) {

					key = style[ len ];

					if ( typeof style[ key ] === "string" ) {

						styles[ $.camelCase( key ) ] = style[ key ];

					}

				}

				// support: Opera, IE <9

			} else {

				for ( key in style ) {

					if ( typeof style[ key ] === "string" ) {

						styles[ key ] = style[ key ];

					}

				}

			}



			return styles;

		}



		function styleDifference( oldStyle, newStyle ) {

			var diff = {},

				name, value;



			for ( name in newStyle ) {

				value = newStyle[ name ];

				if ( oldStyle[ name ] !== value ) {

					if ( !shorthandStyles[ name ] ) {

						if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {

							diff[ name ] = value;

						}

					}

				}

			}



			return diff;

		}



// support: jQuery <1.8

		if ( !$.fn.addBack ) {

			$.fn.addBack = function( selector ) {

				return this.add( selector == null ?

						this.prevObject : this.prevObject.filter( selector )

				);

			};

		}



		$.effects.animateClass = function( value, duration, easing, callback ) {

			var o = $.speed( duration, easing, callback );



			return this.queue( function() {

				var animated = $( this ),

					baseClass = animated.attr( "class" ) || "",

					applyClassChange,

					allAnimations = o.children ? animated.find( "*" ).addBack() : animated;



				// map the animated objects to store the original styles.

				allAnimations = allAnimations.map(function() {

					var el = $( this );

					return {

						el: el,

						start: getElementStyles( this )

					};

				});



				// apply class change

				applyClassChange = function() {

					$.each( classAnimationActions, function(i, action) {

						if ( value[ action ] ) {

							animated[ action + "Class" ]( value[ action ] );

						}

					});

				};

				applyClassChange();



				// map all animated objects again - calculate new styles and diff

				allAnimations = allAnimations.map(function() {

					this.end = getElementStyles( this.el[ 0 ] );

					this.diff = styleDifference( this.start, this.end );

					return this;

				});



				// apply original class

				animated.attr( "class", baseClass );



				// map all animated objects again - this time collecting a promise

				allAnimations = allAnimations.map(function() {

					var styleInfo = this,

						dfd = $.Deferred(),

						opts = $.extend({}, o, {

							queue: false,

							complete: function() {

								dfd.resolve( styleInfo );

							}

						});



					this.el.animate( this.diff, opts );

					return dfd.promise();

				});



				// once all animations have completed:

				$.when.apply( $, allAnimations.get() ).done(function() {



					// set the final class

					applyClassChange();



					// for each animated element,

					// clear all css properties that were animated

					$.each( arguments, function() {

						var el = this.el;

						$.each( this.diff, function(key) {

							el.css( key, "" );

						});

					});



					// this is guarnteed to be there if you use jQuery.speed()

					// it also handles dequeuing the next anim...

					o.complete.call( animated[ 0 ] );

				});

			});

		};



		$.fn.extend({

			addClass: (function( orig ) {

				return function( classNames, speed, easing, callback ) {

					return speed ?

						$.effects.animateClass.call( this,

							{ add: classNames }, speed, easing, callback ) :

						orig.apply( this, arguments );

				};

			})( $.fn.addClass ),



			removeClass: (function( orig ) {

				return function( classNames, speed, easing, callback ) {

					return arguments.length > 1 ?

						$.effects.animateClass.call( this,

							{ remove: classNames }, speed, easing, callback ) :

						orig.apply( this, arguments );

				};

			})( $.fn.removeClass ),



			toggleClass: (function( orig ) {

				return function( classNames, force, speed, easing, callback ) {

					if ( typeof force === "boolean" || force === undefined ) {

						if ( !speed ) {

							// without speed parameter

							return orig.apply( this, arguments );

						} else {

							return $.effects.animateClass.call( this,

								(force ? { add: classNames } : { remove: classNames }),

								speed, easing, callback );

						}

					} else {

						// without force parameter

						return $.effects.animateClass.call( this,

							{ toggle: classNames }, force, speed, easing );

					}

				};

			})( $.fn.toggleClass ),



			switchClass: function( remove, add, speed, easing, callback) {

				return $.effects.animateClass.call( this, {

					add: add,

					remove: remove

				}, speed, easing, callback );

			}

		});



	})();



	/******************************************************************************/

	/*********************************** EFFECTS **********************************/

	/******************************************************************************/



	(function() {



		$.extend( $.effects, {

			version: "1.11.1",



			// Saves a set of properties in a data storage

			save: function( element, set ) {

				for ( var i = 0; i < set.length; i++ ) {

					if ( set[ i ] !== null ) {

						element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );

					}

				}

			},



			// Restores a set of previously saved properties from a data storage

			restore: function( element, set ) {

				var val, i;

				for ( i = 0; i < set.length; i++ ) {

					if ( set[ i ] !== null ) {

						val = element.data( dataSpace + set[ i ] );

						// support: jQuery 1.6.2

						// http://bugs.jquery.com/ticket/9917

						// jQuery 1.6.2 incorrectly returns undefined for any falsy value.

						// We can't differentiate between "" and 0 here, so we just assume

						// empty string since it's likely to be a more common value...

						if ( val === undefined ) {

							val = "";

						}

						element.css( set[ i ], val );

					}

				}

			},



			setMode: function( el, mode ) {

				if (mode === "toggle") {

					mode = el.is( ":hidden" ) ? "show" : "hide";

				}

				return mode;

			},



			// Translates a [top,left] array into a baseline value

			// this should be a little more flexible in the future to handle a string & hash

			getBaseline: function( origin, original ) {

				var y, x;

				switch ( origin[ 0 ] ) {

					case "top": y = 0; break;

					case "middle": y = 0.5; break;

					case "bottom": y = 1; break;

					default: y = origin[ 0 ] / original.height;

				}

				switch ( origin[ 1 ] ) {

					case "left": x = 0; break;

					case "center": x = 0.5; break;

					case "right": x = 1; break;

					default: x = origin[ 1 ] / original.width;

				}

				return {

					x: x,

					y: y

				};

			},



			// Wraps the element around a wrapper that copies position properties

			createWrapper: function( element ) {



				// if the element is already wrapped, return it

				if ( element.parent().is( ".ui-effects-wrapper" )) {

					return element.parent();

				}



				// wrap the element

				var props = {

						width: element.outerWidth(true),

						height: element.outerHeight(true),

						"float": element.css( "float" )

					},

					wrapper = $( "<div></div>" )

						.addClass( "ui-effects-wrapper" )

						.css({

							fontSize: "100%",

							background: "transparent",

							border: "none",

							margin: 0,

							padding: 0

						}),

				// Store the size in case width/height are defined in % - Fixes #5245

					size = {

						width: element.width(),

						height: element.height()

					},

					active = document.activeElement;



				// support: Firefox

				// Firefox incorrectly exposes anonymous content

				// https://bugzilla.mozilla.org/show_bug.cgi?id=561664

				try {

					active.id;

				} catch( e ) {

					active = document.body;

				}



				element.wrap( wrapper );



				// Fixes #7595 - Elements lose focus when wrapped.

				if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {

					$( active ).focus();

				}



				wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element



				// transfer positioning properties to the wrapper

				if ( element.css( "position" ) === "static" ) {

					wrapper.css({ position: "relative" });

					element.css({ position: "relative" });

				} else {

					$.extend( props, {

						position: element.css( "position" ),

						zIndex: element.css( "z-index" )

					});

					$.each([ "top", "left", "bottom", "right" ], function(i, pos) {

						props[ pos ] = element.css( pos );

						if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {

							props[ pos ] = "auto";

						}

					});

					element.css({

						position: "relative",

						top: 0,

						left: 0,

						right: "auto",

						bottom: "auto"

					});

				}

				element.css(size);



				return wrapper.css( props ).show();

			},



			removeWrapper: function( element ) {

				var active = document.activeElement;



				if ( element.parent().is( ".ui-effects-wrapper" ) ) {

					element.parent().replaceWith( element );



					// Fixes #7595 - Elements lose focus when wrapped.

					if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {

						$( active ).focus();

					}

				}



				return element;

			},



			setTransition: function( element, list, factor, value ) {

				value = value || {};

				$.each( list, function( i, x ) {

					var unit = element.cssUnit( x );

					if ( unit[ 0 ] > 0 ) {

						value[ x ] = unit[ 0 ] * factor + unit[ 1 ];

					}

				});

				return value;

			}

		});



// return an effect options object for the given parameters:

		function _normalizeArguments( effect, options, speed, callback ) {



			// allow passing all options as the first parameter

			if ( $.isPlainObject( effect ) ) {

				options = effect;

				effect = effect.effect;

			}



			// convert to an object

			effect = { effect: effect };



			// catch (effect, null, ...)

			if ( options == null ) {

				options = {};

			}



			// catch (effect, callback)

			if ( $.isFunction( options ) ) {

				callback = options;

				speed = null;

				options = {};

			}



			// catch (effect, speed, ?)

			if ( typeof options === "number" || $.fx.speeds[ options ] ) {

				callback = speed;

				speed = options;

				options = {};

			}



			// catch (effect, options, callback)

			if ( $.isFunction( speed ) ) {

				callback = speed;

				speed = null;

			}



			// add options to effect

			if ( options ) {

				$.extend( effect, options );

			}



			speed = speed || options.duration;

			effect.duration = $.fx.off ? 0 :

				typeof speed === "number" ? speed :

					speed in $.fx.speeds ? $.fx.speeds[ speed ] :

						$.fx.speeds._default;



			effect.complete = callback || options.complete;



			return effect;

		}



		function standardAnimationOption( option ) {

			// Valid standard speeds (nothing, number, named speed)

			if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {

				return true;

			}



			// Invalid strings - treat as "normal" speed

			if ( typeof option === "string" && !$.effects.effect[ option ] ) {

				return true;

			}



			// Complete callback

			if ( $.isFunction( option ) ) {

				return true;

			}



			// Options hash (but not naming an effect)

			if ( typeof option === "object" && !option.effect ) {

				return true;

			}



			// Didn't match any standard API

			return false;

		}



		$.fn.extend({

			effect: function( /* effect, options, speed, callback */ ) {

				var args = _normalizeArguments.apply( this, arguments ),

					mode = args.mode,

					queue = args.queue,

					effectMethod = $.effects.effect[ args.effect ];



				if ( $.fx.off || !effectMethod ) {

					// delegate to the original method (e.g., .show()) if possible

					if ( mode ) {

						return this[ mode ]( args.duration, args.complete );

					} else {

						return this.each( function() {

							if ( args.complete ) {

								args.complete.call( this );

							}

						});

					}

				}



				function run( next ) {

					var elem = $( this ),

						complete = args.complete,

						mode = args.mode;



					function done() {

						if ( $.isFunction( complete ) ) {

							complete.call( elem[0] );

						}

						if ( $.isFunction( next ) ) {

							next();

						}

					}



					// If the element already has the correct final state, delegate to

					// the core methods so the internal tracking of "olddisplay" works.

					if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {

						elem[ mode ]();

						done();

					} else {

						effectMethod.call( elem[0], args, done );

					}

				}



				return queue === false ? this.each( run ) : this.queue( queue || "fx", run );

			},



			show: (function( orig ) {

				return function( option ) {

					if ( standardAnimationOption( option ) ) {

						return orig.apply( this, arguments );

					} else {

						var args = _normalizeArguments.apply( this, arguments );

						args.mode = "show";

						return this.effect.call( this, args );

					}

				};

			})( $.fn.show ),



			hide: (function( orig ) {

				return function( option ) {

					if ( standardAnimationOption( option ) ) {

						return orig.apply( this, arguments );

					} else {

						var args = _normalizeArguments.apply( this, arguments );

						args.mode = "hide";

						return this.effect.call( this, args );

					}

				};

			})( $.fn.hide ),



			toggle: (function( orig ) {

				return function( option ) {

					if ( standardAnimationOption( option ) || typeof option === "boolean" ) {

						return orig.apply( this, arguments );

					} else {

						var args = _normalizeArguments.apply( this, arguments );

						args.mode = "toggle";

						return this.effect.call( this, args );

					}

				};

			})( $.fn.toggle ),



			// helper functions

			cssUnit: function(key) {

				var style = this.css( key ),

					val = [];



				$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {

					if ( style.indexOf( unit ) > 0 ) {

						val = [ parseFloat( style ), unit ];

					}

				});

				return val;

			}

		});



	})();



	/******************************************************************************/

	/*********************************** EASING ***********************************/

	/******************************************************************************/



	(function() {



// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)



		var baseEasings = {};



		$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {

			baseEasings[ name ] = function( p ) {

				return Math.pow( p, i + 2 );

			};

		});



		$.extend( baseEasings, {

			Sine: function( p ) {

				return 1 - Math.cos( p * Math.PI / 2 );

			},

			Circ: function( p ) {

				return 1 - Math.sqrt( 1 - p * p );

			},

			Elastic: function( p ) {

				return p === 0 || p === 1 ? p :

				-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );

			},

			Back: function( p ) {

				return p * p * ( 3 * p - 2 );

			},

			Bounce: function( p ) {

				var pow2,

					bounce = 4;



				while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}

				return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );

			}

		});



		$.each( baseEasings, function( name, easeIn ) {

			$.easing[ "easeIn" + name ] = easeIn;

			$.easing[ "easeOut" + name ] = function( p ) {

				return 1 - easeIn( 1 - p );

			};

			$.easing[ "easeInOut" + name ] = function( p ) {

				return p < 0.5 ?

				easeIn( p * 2 ) / 2 :

				1 - easeIn( p * -2 + 2 ) / 2;

			};

		});



	})();



	var effect = $.effects;







}));

Zerion Mini Shell 1.0