server/php/basic/public_html/static/lib/jquery-ui/jquery-ui.js
changeset 442 adb907bba956
equal deleted inserted replaced
441:4732f078d0fe 442:adb907bba956
       
     1 /*! jQuery UI - v1.11.4 - 2015-03-11
       
     2 * http://jqueryui.com
       
     3 * Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
       
     4 * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
       
     5 
       
     6 (function( factory ) {
       
     7 	if ( typeof define === "function" && define.amd ) {
       
     8 
       
     9 		// AMD. Register as an anonymous module.
       
    10 		define([ "jquery" ], factory );
       
    11 	} else {
       
    12 
       
    13 		// Browser globals
       
    14 		factory( jQuery );
       
    15 	}
       
    16 }(function( $ ) {
       
    17 /*!
       
    18  * jQuery UI Core 1.11.4
       
    19  * http://jqueryui.com
       
    20  *
       
    21  * Copyright jQuery Foundation and other contributors
       
    22  * Released under the MIT license.
       
    23  * http://jquery.org/license
       
    24  *
       
    25  * http://api.jqueryui.com/category/ui-core/
       
    26  */
       
    27 
       
    28 
       
    29 // $.ui might exist from components with no dependencies, e.g., $.ui.position
       
    30 $.ui = $.ui || {};
       
    31 
       
    32 $.extend( $.ui, {
       
    33 	version: "1.11.4",
       
    34 
       
    35 	keyCode: {
       
    36 		BACKSPACE: 8,
       
    37 		COMMA: 188,
       
    38 		DELETE: 46,
       
    39 		DOWN: 40,
       
    40 		END: 35,
       
    41 		ENTER: 13,
       
    42 		ESCAPE: 27,
       
    43 		HOME: 36,
       
    44 		LEFT: 37,
       
    45 		PAGE_DOWN: 34,
       
    46 		PAGE_UP: 33,
       
    47 		PERIOD: 190,
       
    48 		RIGHT: 39,
       
    49 		SPACE: 32,
       
    50 		TAB: 9,
       
    51 		UP: 38
       
    52 	}
       
    53 });
       
    54 
       
    55 // plugins
       
    56 $.fn.extend({
       
    57 	scrollParent: function( includeHidden ) {
       
    58 		var position = this.css( "position" ),
       
    59 			excludeStaticParent = position === "absolute",
       
    60 			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
       
    61 			scrollParent = this.parents().filter( function() {
       
    62 				var parent = $( this );
       
    63 				if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
       
    64 					return false;
       
    65 				}
       
    66 				return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
       
    67 			}).eq( 0 );
       
    68 
       
    69 		return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
       
    70 	},
       
    71 
       
    72 	uniqueId: (function() {
       
    73 		var uuid = 0;
       
    74 
       
    75 		return function() {
       
    76 			return this.each(function() {
       
    77 				if ( !this.id ) {
       
    78 					this.id = "ui-id-" + ( ++uuid );
       
    79 				}
       
    80 			});
       
    81 		};
       
    82 	})(),
       
    83 
       
    84 	removeUniqueId: function() {
       
    85 		return this.each(function() {
       
    86 			if ( /^ui-id-\d+$/.test( this.id ) ) {
       
    87 				$( this ).removeAttr( "id" );
       
    88 			}
       
    89 		});
       
    90 	}
       
    91 });
       
    92 
       
    93 // selectors
       
    94 function focusable( element, isTabIndexNotNaN ) {
       
    95 	var map, mapName, img,
       
    96 		nodeName = element.nodeName.toLowerCase();
       
    97 	if ( "area" === nodeName ) {
       
    98 		map = element.parentNode;
       
    99 		mapName = map.name;
       
   100 		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
       
   101 			return false;
       
   102 		}
       
   103 		img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
       
   104 		return !!img && visible( img );
       
   105 	}
       
   106 	return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
       
   107 		!element.disabled :
       
   108 		"a" === nodeName ?
       
   109 			element.href || isTabIndexNotNaN :
       
   110 			isTabIndexNotNaN) &&
       
   111 		// the element and all of its ancestors must be visible
       
   112 		visible( element );
       
   113 }
       
   114 
       
   115 function visible( element ) {
       
   116 	return $.expr.filters.visible( element ) &&
       
   117 		!$( element ).parents().addBack().filter(function() {
       
   118 			return $.css( this, "visibility" ) === "hidden";
       
   119 		}).length;
       
   120 }
       
   121 
       
   122 $.extend( $.expr[ ":" ], {
       
   123 	data: $.expr.createPseudo ?
       
   124 		$.expr.createPseudo(function( dataName ) {
       
   125 			return function( elem ) {
       
   126 				return !!$.data( elem, dataName );
       
   127 			};
       
   128 		}) :
       
   129 		// support: jQuery <1.8
       
   130 		function( elem, i, match ) {
       
   131 			return !!$.data( elem, match[ 3 ] );
       
   132 		},
       
   133 
       
   134 	focusable: function( element ) {
       
   135 		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
       
   136 	},
       
   137 
       
   138 	tabbable: function( element ) {
       
   139 		var tabIndex = $.attr( element, "tabindex" ),
       
   140 			isTabIndexNaN = isNaN( tabIndex );
       
   141 		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
       
   142 	}
       
   143 });
       
   144 
       
   145 // support: jQuery <1.8
       
   146 if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
       
   147 	$.each( [ "Width", "Height" ], function( i, name ) {
       
   148 		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
       
   149 			type = name.toLowerCase(),
       
   150 			orig = {
       
   151 				innerWidth: $.fn.innerWidth,
       
   152 				innerHeight: $.fn.innerHeight,
       
   153 				outerWidth: $.fn.outerWidth,
       
   154 				outerHeight: $.fn.outerHeight
       
   155 			};
       
   156 
       
   157 		function reduce( elem, size, border, margin ) {
       
   158 			$.each( side, function() {
       
   159 				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
       
   160 				if ( border ) {
       
   161 					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
       
   162 				}
       
   163 				if ( margin ) {
       
   164 					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
       
   165 				}
       
   166 			});
       
   167 			return size;
       
   168 		}
       
   169 
       
   170 		$.fn[ "inner" + name ] = function( size ) {
       
   171 			if ( size === undefined ) {
       
   172 				return orig[ "inner" + name ].call( this );
       
   173 			}
       
   174 
       
   175 			return this.each(function() {
       
   176 				$( this ).css( type, reduce( this, size ) + "px" );
       
   177 			});
       
   178 		};
       
   179 
       
   180 		$.fn[ "outer" + name] = function( size, margin ) {
       
   181 			if ( typeof size !== "number" ) {
       
   182 				return orig[ "outer" + name ].call( this, size );
       
   183 			}
       
   184 
       
   185 			return this.each(function() {
       
   186 				$( this).css( type, reduce( this, size, true, margin ) + "px" );
       
   187 			});
       
   188 		};
       
   189 	});
       
   190 }
       
   191 
       
   192 // support: jQuery <1.8
       
   193 if ( !$.fn.addBack ) {
       
   194 	$.fn.addBack = function( selector ) {
       
   195 		return this.add( selector == null ?
       
   196 			this.prevObject : this.prevObject.filter( selector )
       
   197 		);
       
   198 	};
       
   199 }
       
   200 
       
   201 // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
       
   202 if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
       
   203 	$.fn.removeData = (function( removeData ) {
       
   204 		return function( key ) {
       
   205 			if ( arguments.length ) {
       
   206 				return removeData.call( this, $.camelCase( key ) );
       
   207 			} else {
       
   208 				return removeData.call( this );
       
   209 			}
       
   210 		};
       
   211 	})( $.fn.removeData );
       
   212 }
       
   213 
       
   214 // deprecated
       
   215 $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
       
   216 
       
   217 $.fn.extend({
       
   218 	focus: (function( orig ) {
       
   219 		return function( delay, fn ) {
       
   220 			return typeof delay === "number" ?
       
   221 				this.each(function() {
       
   222 					var elem = this;
       
   223 					setTimeout(function() {
       
   224 						$( elem ).focus();
       
   225 						if ( fn ) {
       
   226 							fn.call( elem );
       
   227 						}
       
   228 					}, delay );
       
   229 				}) :
       
   230 				orig.apply( this, arguments );
       
   231 		};
       
   232 	})( $.fn.focus ),
       
   233 
       
   234 	disableSelection: (function() {
       
   235 		var eventType = "onselectstart" in document.createElement( "div" ) ?
       
   236 			"selectstart" :
       
   237 			"mousedown";
       
   238 
       
   239 		return function() {
       
   240 			return this.bind( eventType + ".ui-disableSelection", function( event ) {
       
   241 				event.preventDefault();
       
   242 			});
       
   243 		};
       
   244 	})(),
       
   245 
       
   246 	enableSelection: function() {
       
   247 		return this.unbind( ".ui-disableSelection" );
       
   248 	},
       
   249 
       
   250 	zIndex: function( zIndex ) {
       
   251 		if ( zIndex !== undefined ) {
       
   252 			return this.css( "zIndex", zIndex );
       
   253 		}
       
   254 
       
   255 		if ( this.length ) {
       
   256 			var elem = $( this[ 0 ] ), position, value;
       
   257 			while ( elem.length && elem[ 0 ] !== document ) {
       
   258 				// Ignore z-index if position is set to a value where z-index is ignored by the browser
       
   259 				// This makes behavior of this function consistent across browsers
       
   260 				// WebKit always returns auto if the element is positioned
       
   261 				position = elem.css( "position" );
       
   262 				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
       
   263 					// IE returns 0 when zIndex is not specified
       
   264 					// other browsers return a string
       
   265 					// we ignore the case of nested elements with an explicit value of 0
       
   266 					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
       
   267 					value = parseInt( elem.css( "zIndex" ), 10 );
       
   268 					if ( !isNaN( value ) && value !== 0 ) {
       
   269 						return value;
       
   270 					}
       
   271 				}
       
   272 				elem = elem.parent();
       
   273 			}
       
   274 		}
       
   275 
       
   276 		return 0;
       
   277 	}
       
   278 });
       
   279 
       
   280 // $.ui.plugin is deprecated. Use $.widget() extensions instead.
       
   281 $.ui.plugin = {
       
   282 	add: function( module, option, set ) {
       
   283 		var i,
       
   284 			proto = $.ui[ module ].prototype;
       
   285 		for ( i in set ) {
       
   286 			proto.plugins[ i ] = proto.plugins[ i ] || [];
       
   287 			proto.plugins[ i ].push( [ option, set[ i ] ] );
       
   288 		}
       
   289 	},
       
   290 	call: function( instance, name, args, allowDisconnected ) {
       
   291 		var i,
       
   292 			set = instance.plugins[ name ];
       
   293 
       
   294 		if ( !set ) {
       
   295 			return;
       
   296 		}
       
   297 
       
   298 		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
       
   299 			return;
       
   300 		}
       
   301 
       
   302 		for ( i = 0; i < set.length; i++ ) {
       
   303 			if ( instance.options[ set[ i ][ 0 ] ] ) {
       
   304 				set[ i ][ 1 ].apply( instance.element, args );
       
   305 			}
       
   306 		}
       
   307 	}
       
   308 };
       
   309 
       
   310 
       
   311 /*!
       
   312  * jQuery UI Widget 1.11.4
       
   313  * http://jqueryui.com
       
   314  *
       
   315  * Copyright jQuery Foundation and other contributors
       
   316  * Released under the MIT license.
       
   317  * http://jquery.org/license
       
   318  *
       
   319  * http://api.jqueryui.com/jQuery.widget/
       
   320  */
       
   321 
       
   322 
       
   323 var widget_uuid = 0,
       
   324 	widget_slice = Array.prototype.slice;
       
   325 
       
   326 $.cleanData = (function( orig ) {
       
   327 	return function( elems ) {
       
   328 		var events, elem, i;
       
   329 		for ( i = 0; (elem = elems[i]) != null; i++ ) {
       
   330 			try {
       
   331 
       
   332 				// Only trigger remove when necessary to save time
       
   333 				events = $._data( elem, "events" );
       
   334 				if ( events && events.remove ) {
       
   335 					$( elem ).triggerHandler( "remove" );
       
   336 				}
       
   337 
       
   338 			// http://bugs.jquery.com/ticket/8235
       
   339 			} catch ( e ) {}
       
   340 		}
       
   341 		orig( elems );
       
   342 	};
       
   343 })( $.cleanData );
       
   344 
       
   345 $.widget = function( name, base, prototype ) {
       
   346 	var fullName, existingConstructor, constructor, basePrototype,
       
   347 		// proxiedPrototype allows the provided prototype to remain unmodified
       
   348 		// so that it can be used as a mixin for multiple widgets (#8876)
       
   349 		proxiedPrototype = {},
       
   350 		namespace = name.split( "." )[ 0 ];
       
   351 
       
   352 	name = name.split( "." )[ 1 ];
       
   353 	fullName = namespace + "-" + name;
       
   354 
       
   355 	if ( !prototype ) {
       
   356 		prototype = base;
       
   357 		base = $.Widget;
       
   358 	}
       
   359 
       
   360 	// create selector for plugin
       
   361 	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
       
   362 		return !!$.data( elem, fullName );
       
   363 	};
       
   364 
       
   365 	$[ namespace ] = $[ namespace ] || {};
       
   366 	existingConstructor = $[ namespace ][ name ];
       
   367 	constructor = $[ namespace ][ name ] = function( options, element ) {
       
   368 		// allow instantiation without "new" keyword
       
   369 		if ( !this._createWidget ) {
       
   370 			return new constructor( options, element );
       
   371 		}
       
   372 
       
   373 		// allow instantiation without initializing for simple inheritance
       
   374 		// must use "new" keyword (the code above always passes args)
       
   375 		if ( arguments.length ) {
       
   376 			this._createWidget( options, element );
       
   377 		}
       
   378 	};
       
   379 	// extend with the existing constructor to carry over any static properties
       
   380 	$.extend( constructor, existingConstructor, {
       
   381 		version: prototype.version,
       
   382 		// copy the object used to create the prototype in case we need to
       
   383 		// redefine the widget later
       
   384 		_proto: $.extend( {}, prototype ),
       
   385 		// track widgets that inherit from this widget in case this widget is
       
   386 		// redefined after a widget inherits from it
       
   387 		_childConstructors: []
       
   388 	});
       
   389 
       
   390 	basePrototype = new base();
       
   391 	// we need to make the options hash a property directly on the new instance
       
   392 	// otherwise we'll modify the options hash on the prototype that we're
       
   393 	// inheriting from
       
   394 	basePrototype.options = $.widget.extend( {}, basePrototype.options );
       
   395 	$.each( prototype, function( prop, value ) {
       
   396 		if ( !$.isFunction( value ) ) {
       
   397 			proxiedPrototype[ prop ] = value;
       
   398 			return;
       
   399 		}
       
   400 		proxiedPrototype[ prop ] = (function() {
       
   401 			var _super = function() {
       
   402 					return base.prototype[ prop ].apply( this, arguments );
       
   403 				},
       
   404 				_superApply = function( args ) {
       
   405 					return base.prototype[ prop ].apply( this, args );
       
   406 				};
       
   407 			return function() {
       
   408 				var __super = this._super,
       
   409 					__superApply = this._superApply,
       
   410 					returnValue;
       
   411 
       
   412 				this._super = _super;
       
   413 				this._superApply = _superApply;
       
   414 
       
   415 				returnValue = value.apply( this, arguments );
       
   416 
       
   417 				this._super = __super;
       
   418 				this._superApply = __superApply;
       
   419 
       
   420 				return returnValue;
       
   421 			};
       
   422 		})();
       
   423 	});
       
   424 	constructor.prototype = $.widget.extend( basePrototype, {
       
   425 		// TODO: remove support for widgetEventPrefix
       
   426 		// always use the name + a colon as the prefix, e.g., draggable:start
       
   427 		// don't prefix for widgets that aren't DOM-based
       
   428 		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
       
   429 	}, proxiedPrototype, {
       
   430 		constructor: constructor,
       
   431 		namespace: namespace,
       
   432 		widgetName: name,
       
   433 		widgetFullName: fullName
       
   434 	});
       
   435 
       
   436 	// If this widget is being redefined then we need to find all widgets that
       
   437 	// are inheriting from it and redefine all of them so that they inherit from
       
   438 	// the new version of this widget. We're essentially trying to replace one
       
   439 	// level in the prototype chain.
       
   440 	if ( existingConstructor ) {
       
   441 		$.each( existingConstructor._childConstructors, function( i, child ) {
       
   442 			var childPrototype = child.prototype;
       
   443 
       
   444 			// redefine the child widget using the same prototype that was
       
   445 			// originally used, but inherit from the new version of the base
       
   446 			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
       
   447 		});
       
   448 		// remove the list of existing child constructors from the old constructor
       
   449 		// so the old child constructors can be garbage collected
       
   450 		delete existingConstructor._childConstructors;
       
   451 	} else {
       
   452 		base._childConstructors.push( constructor );
       
   453 	}
       
   454 
       
   455 	$.widget.bridge( name, constructor );
       
   456 
       
   457 	return constructor;
       
   458 };
       
   459 
       
   460 $.widget.extend = function( target ) {
       
   461 	var input = widget_slice.call( arguments, 1 ),
       
   462 		inputIndex = 0,
       
   463 		inputLength = input.length,
       
   464 		key,
       
   465 		value;
       
   466 	for ( ; inputIndex < inputLength; inputIndex++ ) {
       
   467 		for ( key in input[ inputIndex ] ) {
       
   468 			value = input[ inputIndex ][ key ];
       
   469 			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
       
   470 				// Clone objects
       
   471 				if ( $.isPlainObject( value ) ) {
       
   472 					target[ key ] = $.isPlainObject( target[ key ] ) ?
       
   473 						$.widget.extend( {}, target[ key ], value ) :
       
   474 						// Don't extend strings, arrays, etc. with objects
       
   475 						$.widget.extend( {}, value );
       
   476 				// Copy everything else by reference
       
   477 				} else {
       
   478 					target[ key ] = value;
       
   479 				}
       
   480 			}
       
   481 		}
       
   482 	}
       
   483 	return target;
       
   484 };
       
   485 
       
   486 $.widget.bridge = function( name, object ) {
       
   487 	var fullName = object.prototype.widgetFullName || name;
       
   488 	$.fn[ name ] = function( options ) {
       
   489 		var isMethodCall = typeof options === "string",
       
   490 			args = widget_slice.call( arguments, 1 ),
       
   491 			returnValue = this;
       
   492 
       
   493 		if ( isMethodCall ) {
       
   494 			this.each(function() {
       
   495 				var methodValue,
       
   496 					instance = $.data( this, fullName );
       
   497 				if ( options === "instance" ) {
       
   498 					returnValue = instance;
       
   499 					return false;
       
   500 				}
       
   501 				if ( !instance ) {
       
   502 					return $.error( "cannot call methods on " + name + " prior to initialization; " +
       
   503 						"attempted to call method '" + options + "'" );
       
   504 				}
       
   505 				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
       
   506 					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
       
   507 				}
       
   508 				methodValue = instance[ options ].apply( instance, args );
       
   509 				if ( methodValue !== instance && methodValue !== undefined ) {
       
   510 					returnValue = methodValue && methodValue.jquery ?
       
   511 						returnValue.pushStack( methodValue.get() ) :
       
   512 						methodValue;
       
   513 					return false;
       
   514 				}
       
   515 			});
       
   516 		} else {
       
   517 
       
   518 			// Allow multiple hashes to be passed on init
       
   519 			if ( args.length ) {
       
   520 				options = $.widget.extend.apply( null, [ options ].concat(args) );
       
   521 			}
       
   522 
       
   523 			this.each(function() {
       
   524 				var instance = $.data( this, fullName );
       
   525 				if ( instance ) {
       
   526 					instance.option( options || {} );
       
   527 					if ( instance._init ) {
       
   528 						instance._init();
       
   529 					}
       
   530 				} else {
       
   531 					$.data( this, fullName, new object( options, this ) );
       
   532 				}
       
   533 			});
       
   534 		}
       
   535 
       
   536 		return returnValue;
       
   537 	};
       
   538 };
       
   539 
       
   540 $.Widget = function( /* options, element */ ) {};
       
   541 $.Widget._childConstructors = [];
       
   542 
       
   543 $.Widget.prototype = {
       
   544 	widgetName: "widget",
       
   545 	widgetEventPrefix: "",
       
   546 	defaultElement: "<div>",
       
   547 	options: {
       
   548 		disabled: false,
       
   549 
       
   550 		// callbacks
       
   551 		create: null
       
   552 	},
       
   553 	_createWidget: function( options, element ) {
       
   554 		element = $( element || this.defaultElement || this )[ 0 ];
       
   555 		this.element = $( element );
       
   556 		this.uuid = widget_uuid++;
       
   557 		this.eventNamespace = "." + this.widgetName + this.uuid;
       
   558 
       
   559 		this.bindings = $();
       
   560 		this.hoverable = $();
       
   561 		this.focusable = $();
       
   562 
       
   563 		if ( element !== this ) {
       
   564 			$.data( element, this.widgetFullName, this );
       
   565 			this._on( true, this.element, {
       
   566 				remove: function( event ) {
       
   567 					if ( event.target === element ) {
       
   568 						this.destroy();
       
   569 					}
       
   570 				}
       
   571 			});
       
   572 			this.document = $( element.style ?
       
   573 				// element within the document
       
   574 				element.ownerDocument :
       
   575 				// element is window or document
       
   576 				element.document || element );
       
   577 			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
       
   578 		}
       
   579 
       
   580 		this.options = $.widget.extend( {},
       
   581 			this.options,
       
   582 			this._getCreateOptions(),
       
   583 			options );
       
   584 
       
   585 		this._create();
       
   586 		this._trigger( "create", null, this._getCreateEventData() );
       
   587 		this._init();
       
   588 	},
       
   589 	_getCreateOptions: $.noop,
       
   590 	_getCreateEventData: $.noop,
       
   591 	_create: $.noop,
       
   592 	_init: $.noop,
       
   593 
       
   594 	destroy: function() {
       
   595 		this._destroy();
       
   596 		// we can probably remove the unbind calls in 2.0
       
   597 		// all event bindings should go through this._on()
       
   598 		this.element
       
   599 			.unbind( this.eventNamespace )
       
   600 			.removeData( this.widgetFullName )
       
   601 			// support: jquery <1.6.3
       
   602 			// http://bugs.jquery.com/ticket/9413
       
   603 			.removeData( $.camelCase( this.widgetFullName ) );
       
   604 		this.widget()
       
   605 			.unbind( this.eventNamespace )
       
   606 			.removeAttr( "aria-disabled" )
       
   607 			.removeClass(
       
   608 				this.widgetFullName + "-disabled " +
       
   609 				"ui-state-disabled" );
       
   610 
       
   611 		// clean up events and states
       
   612 		this.bindings.unbind( this.eventNamespace );
       
   613 		this.hoverable.removeClass( "ui-state-hover" );
       
   614 		this.focusable.removeClass( "ui-state-focus" );
       
   615 	},
       
   616 	_destroy: $.noop,
       
   617 
       
   618 	widget: function() {
       
   619 		return this.element;
       
   620 	},
       
   621 
       
   622 	option: function( key, value ) {
       
   623 		var options = key,
       
   624 			parts,
       
   625 			curOption,
       
   626 			i;
       
   627 
       
   628 		if ( arguments.length === 0 ) {
       
   629 			// don't return a reference to the internal hash
       
   630 			return $.widget.extend( {}, this.options );
       
   631 		}
       
   632 
       
   633 		if ( typeof key === "string" ) {
       
   634 			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
       
   635 			options = {};
       
   636 			parts = key.split( "." );
       
   637 			key = parts.shift();
       
   638 			if ( parts.length ) {
       
   639 				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
       
   640 				for ( i = 0; i < parts.length - 1; i++ ) {
       
   641 					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
       
   642 					curOption = curOption[ parts[ i ] ];
       
   643 				}
       
   644 				key = parts.pop();
       
   645 				if ( arguments.length === 1 ) {
       
   646 					return curOption[ key ] === undefined ? null : curOption[ key ];
       
   647 				}
       
   648 				curOption[ key ] = value;
       
   649 			} else {
       
   650 				if ( arguments.length === 1 ) {
       
   651 					return this.options[ key ] === undefined ? null : this.options[ key ];
       
   652 				}
       
   653 				options[ key ] = value;
       
   654 			}
       
   655 		}
       
   656 
       
   657 		this._setOptions( options );
       
   658 
       
   659 		return this;
       
   660 	},
       
   661 	_setOptions: function( options ) {
       
   662 		var key;
       
   663 
       
   664 		for ( key in options ) {
       
   665 			this._setOption( key, options[ key ] );
       
   666 		}
       
   667 
       
   668 		return this;
       
   669 	},
       
   670 	_setOption: function( key, value ) {
       
   671 		this.options[ key ] = value;
       
   672 
       
   673 		if ( key === "disabled" ) {
       
   674 			this.widget()
       
   675 				.toggleClass( this.widgetFullName + "-disabled", !!value );
       
   676 
       
   677 			// If the widget is becoming disabled, then nothing is interactive
       
   678 			if ( value ) {
       
   679 				this.hoverable.removeClass( "ui-state-hover" );
       
   680 				this.focusable.removeClass( "ui-state-focus" );
       
   681 			}
       
   682 		}
       
   683 
       
   684 		return this;
       
   685 	},
       
   686 
       
   687 	enable: function() {
       
   688 		return this._setOptions({ disabled: false });
       
   689 	},
       
   690 	disable: function() {
       
   691 		return this._setOptions({ disabled: true });
       
   692 	},
       
   693 
       
   694 	_on: function( suppressDisabledCheck, element, handlers ) {
       
   695 		var delegateElement,
       
   696 			instance = this;
       
   697 
       
   698 		// no suppressDisabledCheck flag, shuffle arguments
       
   699 		if ( typeof suppressDisabledCheck !== "boolean" ) {
       
   700 			handlers = element;
       
   701 			element = suppressDisabledCheck;
       
   702 			suppressDisabledCheck = false;
       
   703 		}
       
   704 
       
   705 		// no element argument, shuffle and use this.element
       
   706 		if ( !handlers ) {
       
   707 			handlers = element;
       
   708 			element = this.element;
       
   709 			delegateElement = this.widget();
       
   710 		} else {
       
   711 			element = delegateElement = $( element );
       
   712 			this.bindings = this.bindings.add( element );
       
   713 		}
       
   714 
       
   715 		$.each( handlers, function( event, handler ) {
       
   716 			function handlerProxy() {
       
   717 				// allow widgets to customize the disabled handling
       
   718 				// - disabled as an array instead of boolean
       
   719 				// - disabled class as method for disabling individual parts
       
   720 				if ( !suppressDisabledCheck &&
       
   721 						( instance.options.disabled === true ||
       
   722 							$( this ).hasClass( "ui-state-disabled" ) ) ) {
       
   723 					return;
       
   724 				}
       
   725 				return ( typeof handler === "string" ? instance[ handler ] : handler )
       
   726 					.apply( instance, arguments );
       
   727 			}
       
   728 
       
   729 			// copy the guid so direct unbinding works
       
   730 			if ( typeof handler !== "string" ) {
       
   731 				handlerProxy.guid = handler.guid =
       
   732 					handler.guid || handlerProxy.guid || $.guid++;
       
   733 			}
       
   734 
       
   735 			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
       
   736 				eventName = match[1] + instance.eventNamespace,
       
   737 				selector = match[2];
       
   738 			if ( selector ) {
       
   739 				delegateElement.delegate( selector, eventName, handlerProxy );
       
   740 			} else {
       
   741 				element.bind( eventName, handlerProxy );
       
   742 			}
       
   743 		});
       
   744 	},
       
   745 
       
   746 	_off: function( element, eventName ) {
       
   747 		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
       
   748 			this.eventNamespace;
       
   749 		element.unbind( eventName ).undelegate( eventName );
       
   750 
       
   751 		// Clear the stack to avoid memory leaks (#10056)
       
   752 		this.bindings = $( this.bindings.not( element ).get() );
       
   753 		this.focusable = $( this.focusable.not( element ).get() );
       
   754 		this.hoverable = $( this.hoverable.not( element ).get() );
       
   755 	},
       
   756 
       
   757 	_delay: function( handler, delay ) {
       
   758 		function handlerProxy() {
       
   759 			return ( typeof handler === "string" ? instance[ handler ] : handler )
       
   760 				.apply( instance, arguments );
       
   761 		}
       
   762 		var instance = this;
       
   763 		return setTimeout( handlerProxy, delay || 0 );
       
   764 	},
       
   765 
       
   766 	_hoverable: function( element ) {
       
   767 		this.hoverable = this.hoverable.add( element );
       
   768 		this._on( element, {
       
   769 			mouseenter: function( event ) {
       
   770 				$( event.currentTarget ).addClass( "ui-state-hover" );
       
   771 			},
       
   772 			mouseleave: function( event ) {
       
   773 				$( event.currentTarget ).removeClass( "ui-state-hover" );
       
   774 			}
       
   775 		});
       
   776 	},
       
   777 
       
   778 	_focusable: function( element ) {
       
   779 		this.focusable = this.focusable.add( element );
       
   780 		this._on( element, {
       
   781 			focusin: function( event ) {
       
   782 				$( event.currentTarget ).addClass( "ui-state-focus" );
       
   783 			},
       
   784 			focusout: function( event ) {
       
   785 				$( event.currentTarget ).removeClass( "ui-state-focus" );
       
   786 			}
       
   787 		});
       
   788 	},
       
   789 
       
   790 	_trigger: function( type, event, data ) {
       
   791 		var prop, orig,
       
   792 			callback = this.options[ type ];
       
   793 
       
   794 		data = data || {};
       
   795 		event = $.Event( event );
       
   796 		event.type = ( type === this.widgetEventPrefix ?
       
   797 			type :
       
   798 			this.widgetEventPrefix + type ).toLowerCase();
       
   799 		// the original event may come from any element
       
   800 		// so we need to reset the target on the new event
       
   801 		event.target = this.element[ 0 ];
       
   802 
       
   803 		// copy original event properties over to the new event
       
   804 		orig = event.originalEvent;
       
   805 		if ( orig ) {
       
   806 			for ( prop in orig ) {
       
   807 				if ( !( prop in event ) ) {
       
   808 					event[ prop ] = orig[ prop ];
       
   809 				}
       
   810 			}
       
   811 		}
       
   812 
       
   813 		this.element.trigger( event, data );
       
   814 		return !( $.isFunction( callback ) &&
       
   815 			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
       
   816 			event.isDefaultPrevented() );
       
   817 	}
       
   818 };
       
   819 
       
   820 $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
       
   821 	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
       
   822 		if ( typeof options === "string" ) {
       
   823 			options = { effect: options };
       
   824 		}
       
   825 		var hasOptions,
       
   826 			effectName = !options ?
       
   827 				method :
       
   828 				options === true || typeof options === "number" ?
       
   829 					defaultEffect :
       
   830 					options.effect || defaultEffect;
       
   831 		options = options || {};
       
   832 		if ( typeof options === "number" ) {
       
   833 			options = { duration: options };
       
   834 		}
       
   835 		hasOptions = !$.isEmptyObject( options );
       
   836 		options.complete = callback;
       
   837 		if ( options.delay ) {
       
   838 			element.delay( options.delay );
       
   839 		}
       
   840 		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
       
   841 			element[ method ]( options );
       
   842 		} else if ( effectName !== method && element[ effectName ] ) {
       
   843 			element[ effectName ]( options.duration, options.easing, callback );
       
   844 		} else {
       
   845 			element.queue(function( next ) {
       
   846 				$( this )[ method ]();
       
   847 				if ( callback ) {
       
   848 					callback.call( element[ 0 ] );
       
   849 				}
       
   850 				next();
       
   851 			});
       
   852 		}
       
   853 	};
       
   854 });
       
   855 
       
   856 var widget = $.widget;
       
   857 
       
   858 
       
   859 /*!
       
   860  * jQuery UI Mouse 1.11.4
       
   861  * http://jqueryui.com
       
   862  *
       
   863  * Copyright jQuery Foundation and other contributors
       
   864  * Released under the MIT license.
       
   865  * http://jquery.org/license
       
   866  *
       
   867  * http://api.jqueryui.com/mouse/
       
   868  */
       
   869 
       
   870 
       
   871 var mouseHandled = false;
       
   872 $( document ).mouseup( function() {
       
   873 	mouseHandled = false;
       
   874 });
       
   875 
       
   876 var mouse = $.widget("ui.mouse", {
       
   877 	version: "1.11.4",
       
   878 	options: {
       
   879 		cancel: "input,textarea,button,select,option",
       
   880 		distance: 1,
       
   881 		delay: 0
       
   882 	},
       
   883 	_mouseInit: function() {
       
   884 		var that = this;
       
   885 
       
   886 		this.element
       
   887 			.bind("mousedown." + this.widgetName, function(event) {
       
   888 				return that._mouseDown(event);
       
   889 			})
       
   890 			.bind("click." + this.widgetName, function(event) {
       
   891 				if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
       
   892 					$.removeData(event.target, that.widgetName + ".preventClickEvent");
       
   893 					event.stopImmediatePropagation();
       
   894 					return false;
       
   895 				}
       
   896 			});
       
   897 
       
   898 		this.started = false;
       
   899 	},
       
   900 
       
   901 	// TODO: make sure destroying one instance of mouse doesn't mess with
       
   902 	// other instances of mouse
       
   903 	_mouseDestroy: function() {
       
   904 		this.element.unbind("." + this.widgetName);
       
   905 		if ( this._mouseMoveDelegate ) {
       
   906 			this.document
       
   907 				.unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
       
   908 				.unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
       
   909 		}
       
   910 	},
       
   911 
       
   912 	_mouseDown: function(event) {
       
   913 		// don't let more than one widget handle mouseStart
       
   914 		if ( mouseHandled ) {
       
   915 			return;
       
   916 		}
       
   917 
       
   918 		this._mouseMoved = false;
       
   919 
       
   920 		// we may have missed mouseup (out of window)
       
   921 		(this._mouseStarted && this._mouseUp(event));
       
   922 
       
   923 		this._mouseDownEvent = event;
       
   924 
       
   925 		var that = this,
       
   926 			btnIsLeft = (event.which === 1),
       
   927 			// event.target.nodeName works around a bug in IE 8 with
       
   928 			// disabled inputs (#7620)
       
   929 			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
       
   930 		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
       
   931 			return true;
       
   932 		}
       
   933 
       
   934 		this.mouseDelayMet = !this.options.delay;
       
   935 		if (!this.mouseDelayMet) {
       
   936 			this._mouseDelayTimer = setTimeout(function() {
       
   937 				that.mouseDelayMet = true;
       
   938 			}, this.options.delay);
       
   939 		}
       
   940 
       
   941 		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
       
   942 			this._mouseStarted = (this._mouseStart(event) !== false);
       
   943 			if (!this._mouseStarted) {
       
   944 				event.preventDefault();
       
   945 				return true;
       
   946 			}
       
   947 		}
       
   948 
       
   949 		// Click event may never have fired (Gecko & Opera)
       
   950 		if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
       
   951 			$.removeData(event.target, this.widgetName + ".preventClickEvent");
       
   952 		}
       
   953 
       
   954 		// these delegates are required to keep context
       
   955 		this._mouseMoveDelegate = function(event) {
       
   956 			return that._mouseMove(event);
       
   957 		};
       
   958 		this._mouseUpDelegate = function(event) {
       
   959 			return that._mouseUp(event);
       
   960 		};
       
   961 
       
   962 		this.document
       
   963 			.bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
       
   964 			.bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
       
   965 
       
   966 		event.preventDefault();
       
   967 
       
   968 		mouseHandled = true;
       
   969 		return true;
       
   970 	},
       
   971 
       
   972 	_mouseMove: function(event) {
       
   973 		// Only check for mouseups outside the document if you've moved inside the document
       
   974 		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
       
   975 		// fire a mousemove event if content is placed under the cursor. See #7778
       
   976 		// Support: IE <9
       
   977 		if ( this._mouseMoved ) {
       
   978 			// IE mouseup check - mouseup happened when mouse was out of window
       
   979 			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
       
   980 				return this._mouseUp(event);
       
   981 
       
   982 			// Iframe mouseup check - mouseup occurred in another document
       
   983 			} else if ( !event.which ) {
       
   984 				return this._mouseUp( event );
       
   985 			}
       
   986 		}
       
   987 
       
   988 		if ( event.which || event.button ) {
       
   989 			this._mouseMoved = true;
       
   990 		}
       
   991 
       
   992 		if (this._mouseStarted) {
       
   993 			this._mouseDrag(event);
       
   994 			return event.preventDefault();
       
   995 		}
       
   996 
       
   997 		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
       
   998 			this._mouseStarted =
       
   999 				(this._mouseStart(this._mouseDownEvent, event) !== false);
       
  1000 			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
       
  1001 		}
       
  1002 
       
  1003 		return !this._mouseStarted;
       
  1004 	},
       
  1005 
       
  1006 	_mouseUp: function(event) {
       
  1007 		this.document
       
  1008 			.unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
       
  1009 			.unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
       
  1010 
       
  1011 		if (this._mouseStarted) {
       
  1012 			this._mouseStarted = false;
       
  1013 
       
  1014 			if (event.target === this._mouseDownEvent.target) {
       
  1015 				$.data(event.target, this.widgetName + ".preventClickEvent", true);
       
  1016 			}
       
  1017 
       
  1018 			this._mouseStop(event);
       
  1019 		}
       
  1020 
       
  1021 		mouseHandled = false;
       
  1022 		return false;
       
  1023 	},
       
  1024 
       
  1025 	_mouseDistanceMet: function(event) {
       
  1026 		return (Math.max(
       
  1027 				Math.abs(this._mouseDownEvent.pageX - event.pageX),
       
  1028 				Math.abs(this._mouseDownEvent.pageY - event.pageY)
       
  1029 			) >= this.options.distance
       
  1030 		);
       
  1031 	},
       
  1032 
       
  1033 	_mouseDelayMet: function(/* event */) {
       
  1034 		return this.mouseDelayMet;
       
  1035 	},
       
  1036 
       
  1037 	// These are placeholder methods, to be overriden by extending plugin
       
  1038 	_mouseStart: function(/* event */) {},
       
  1039 	_mouseDrag: function(/* event */) {},
       
  1040 	_mouseStop: function(/* event */) {},
       
  1041 	_mouseCapture: function(/* event */) { return true; }
       
  1042 });
       
  1043 
       
  1044 
       
  1045 /*!
       
  1046  * jQuery UI Position 1.11.4
       
  1047  * http://jqueryui.com
       
  1048  *
       
  1049  * Copyright jQuery Foundation and other contributors
       
  1050  * Released under the MIT license.
       
  1051  * http://jquery.org/license
       
  1052  *
       
  1053  * http://api.jqueryui.com/position/
       
  1054  */
       
  1055 
       
  1056 (function() {
       
  1057 
       
  1058 $.ui = $.ui || {};
       
  1059 
       
  1060 var cachedScrollbarWidth, supportsOffsetFractions,
       
  1061 	max = Math.max,
       
  1062 	abs = Math.abs,
       
  1063 	round = Math.round,
       
  1064 	rhorizontal = /left|center|right/,
       
  1065 	rvertical = /top|center|bottom/,
       
  1066 	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
       
  1067 	rposition = /^\w+/,
       
  1068 	rpercent = /%$/,
       
  1069 	_position = $.fn.position;
       
  1070 
       
  1071 function getOffsets( offsets, width, height ) {
       
  1072 	return [
       
  1073 		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
       
  1074 		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
       
  1075 	];
       
  1076 }
       
  1077 
       
  1078 function parseCss( element, property ) {
       
  1079 	return parseInt( $.css( element, property ), 10 ) || 0;
       
  1080 }
       
  1081 
       
  1082 function getDimensions( elem ) {
       
  1083 	var raw = elem[0];
       
  1084 	if ( raw.nodeType === 9 ) {
       
  1085 		return {
       
  1086 			width: elem.width(),
       
  1087 			height: elem.height(),
       
  1088 			offset: { top: 0, left: 0 }
       
  1089 		};
       
  1090 	}
       
  1091 	if ( $.isWindow( raw ) ) {
       
  1092 		return {
       
  1093 			width: elem.width(),
       
  1094 			height: elem.height(),
       
  1095 			offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
       
  1096 		};
       
  1097 	}
       
  1098 	if ( raw.preventDefault ) {
       
  1099 		return {
       
  1100 			width: 0,
       
  1101 			height: 0,
       
  1102 			offset: { top: raw.pageY, left: raw.pageX }
       
  1103 		};
       
  1104 	}
       
  1105 	return {
       
  1106 		width: elem.outerWidth(),
       
  1107 		height: elem.outerHeight(),
       
  1108 		offset: elem.offset()
       
  1109 	};
       
  1110 }
       
  1111 
       
  1112 $.position = {
       
  1113 	scrollbarWidth: function() {
       
  1114 		if ( cachedScrollbarWidth !== undefined ) {
       
  1115 			return cachedScrollbarWidth;
       
  1116 		}
       
  1117 		var w1, w2,
       
  1118 			div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
       
  1119 			innerDiv = div.children()[0];
       
  1120 
       
  1121 		$( "body" ).append( div );
       
  1122 		w1 = innerDiv.offsetWidth;
       
  1123 		div.css( "overflow", "scroll" );
       
  1124 
       
  1125 		w2 = innerDiv.offsetWidth;
       
  1126 
       
  1127 		if ( w1 === w2 ) {
       
  1128 			w2 = div[0].clientWidth;
       
  1129 		}
       
  1130 
       
  1131 		div.remove();
       
  1132 
       
  1133 		return (cachedScrollbarWidth = w1 - w2);
       
  1134 	},
       
  1135 	getScrollInfo: function( within ) {
       
  1136 		var overflowX = within.isWindow || within.isDocument ? "" :
       
  1137 				within.element.css( "overflow-x" ),
       
  1138 			overflowY = within.isWindow || within.isDocument ? "" :
       
  1139 				within.element.css( "overflow-y" ),
       
  1140 			hasOverflowX = overflowX === "scroll" ||
       
  1141 				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
       
  1142 			hasOverflowY = overflowY === "scroll" ||
       
  1143 				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
       
  1144 		return {
       
  1145 			width: hasOverflowY ? $.position.scrollbarWidth() : 0,
       
  1146 			height: hasOverflowX ? $.position.scrollbarWidth() : 0
       
  1147 		};
       
  1148 	},
       
  1149 	getWithinInfo: function( element ) {
       
  1150 		var withinElement = $( element || window ),
       
  1151 			isWindow = $.isWindow( withinElement[0] ),
       
  1152 			isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
       
  1153 		return {
       
  1154 			element: withinElement,
       
  1155 			isWindow: isWindow,
       
  1156 			isDocument: isDocument,
       
  1157 			offset: withinElement.offset() || { left: 0, top: 0 },
       
  1158 			scrollLeft: withinElement.scrollLeft(),
       
  1159 			scrollTop: withinElement.scrollTop(),
       
  1160 
       
  1161 			// support: jQuery 1.6.x
       
  1162 			// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
       
  1163 			width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
       
  1164 			height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
       
  1165 		};
       
  1166 	}
       
  1167 };
       
  1168 
       
  1169 $.fn.position = function( options ) {
       
  1170 	if ( !options || !options.of ) {
       
  1171 		return _position.apply( this, arguments );
       
  1172 	}
       
  1173 
       
  1174 	// make a copy, we don't want to modify arguments
       
  1175 	options = $.extend( {}, options );
       
  1176 
       
  1177 	var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
       
  1178 		target = $( options.of ),
       
  1179 		within = $.position.getWithinInfo( options.within ),
       
  1180 		scrollInfo = $.position.getScrollInfo( within ),
       
  1181 		collision = ( options.collision || "flip" ).split( " " ),
       
  1182 		offsets = {};
       
  1183 
       
  1184 	dimensions = getDimensions( target );
       
  1185 	if ( target[0].preventDefault ) {
       
  1186 		// force left top to allow flipping
       
  1187 		options.at = "left top";
       
  1188 	}
       
  1189 	targetWidth = dimensions.width;
       
  1190 	targetHeight = dimensions.height;
       
  1191 	targetOffset = dimensions.offset;
       
  1192 	// clone to reuse original targetOffset later
       
  1193 	basePosition = $.extend( {}, targetOffset );
       
  1194 
       
  1195 	// force my and at to have valid horizontal and vertical positions
       
  1196 	// if a value is missing or invalid, it will be converted to center
       
  1197 	$.each( [ "my", "at" ], function() {
       
  1198 		var pos = ( options[ this ] || "" ).split( " " ),
       
  1199 			horizontalOffset,
       
  1200 			verticalOffset;
       
  1201 
       
  1202 		if ( pos.length === 1) {
       
  1203 			pos = rhorizontal.test( pos[ 0 ] ) ?
       
  1204 				pos.concat( [ "center" ] ) :
       
  1205 				rvertical.test( pos[ 0 ] ) ?
       
  1206 					[ "center" ].concat( pos ) :
       
  1207 					[ "center", "center" ];
       
  1208 		}
       
  1209 		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
       
  1210 		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
       
  1211 
       
  1212 		// calculate offsets
       
  1213 		horizontalOffset = roffset.exec( pos[ 0 ] );
       
  1214 		verticalOffset = roffset.exec( pos[ 1 ] );
       
  1215 		offsets[ this ] = [
       
  1216 			horizontalOffset ? horizontalOffset[ 0 ] : 0,
       
  1217 			verticalOffset ? verticalOffset[ 0 ] : 0
       
  1218 		];
       
  1219 
       
  1220 		// reduce to just the positions without the offsets
       
  1221 		options[ this ] = [
       
  1222 			rposition.exec( pos[ 0 ] )[ 0 ],
       
  1223 			rposition.exec( pos[ 1 ] )[ 0 ]
       
  1224 		];
       
  1225 	});
       
  1226 
       
  1227 	// normalize collision option
       
  1228 	if ( collision.length === 1 ) {
       
  1229 		collision[ 1 ] = collision[ 0 ];
       
  1230 	}
       
  1231 
       
  1232 	if ( options.at[ 0 ] === "right" ) {
       
  1233 		basePosition.left += targetWidth;
       
  1234 	} else if ( options.at[ 0 ] === "center" ) {
       
  1235 		basePosition.left += targetWidth / 2;
       
  1236 	}
       
  1237 
       
  1238 	if ( options.at[ 1 ] === "bottom" ) {
       
  1239 		basePosition.top += targetHeight;
       
  1240 	} else if ( options.at[ 1 ] === "center" ) {
       
  1241 		basePosition.top += targetHeight / 2;
       
  1242 	}
       
  1243 
       
  1244 	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
       
  1245 	basePosition.left += atOffset[ 0 ];
       
  1246 	basePosition.top += atOffset[ 1 ];
       
  1247 
       
  1248 	return this.each(function() {
       
  1249 		var collisionPosition, using,
       
  1250 			elem = $( this ),
       
  1251 			elemWidth = elem.outerWidth(),
       
  1252 			elemHeight = elem.outerHeight(),
       
  1253 			marginLeft = parseCss( this, "marginLeft" ),
       
  1254 			marginTop = parseCss( this, "marginTop" ),
       
  1255 			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
       
  1256 			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
       
  1257 			position = $.extend( {}, basePosition ),
       
  1258 			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
       
  1259 
       
  1260 		if ( options.my[ 0 ] === "right" ) {
       
  1261 			position.left -= elemWidth;
       
  1262 		} else if ( options.my[ 0 ] === "center" ) {
       
  1263 			position.left -= elemWidth / 2;
       
  1264 		}
       
  1265 
       
  1266 		if ( options.my[ 1 ] === "bottom" ) {
       
  1267 			position.top -= elemHeight;
       
  1268 		} else if ( options.my[ 1 ] === "center" ) {
       
  1269 			position.top -= elemHeight / 2;
       
  1270 		}
       
  1271 
       
  1272 		position.left += myOffset[ 0 ];
       
  1273 		position.top += myOffset[ 1 ];
       
  1274 
       
  1275 		// if the browser doesn't support fractions, then round for consistent results
       
  1276 		if ( !supportsOffsetFractions ) {
       
  1277 			position.left = round( position.left );
       
  1278 			position.top = round( position.top );
       
  1279 		}
       
  1280 
       
  1281 		collisionPosition = {
       
  1282 			marginLeft: marginLeft,
       
  1283 			marginTop: marginTop
       
  1284 		};
       
  1285 
       
  1286 		$.each( [ "left", "top" ], function( i, dir ) {
       
  1287 			if ( $.ui.position[ collision[ i ] ] ) {
       
  1288 				$.ui.position[ collision[ i ] ][ dir ]( position, {
       
  1289 					targetWidth: targetWidth,
       
  1290 					targetHeight: targetHeight,
       
  1291 					elemWidth: elemWidth,
       
  1292 					elemHeight: elemHeight,
       
  1293 					collisionPosition: collisionPosition,
       
  1294 					collisionWidth: collisionWidth,
       
  1295 					collisionHeight: collisionHeight,
       
  1296 					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
       
  1297 					my: options.my,
       
  1298 					at: options.at,
       
  1299 					within: within,
       
  1300 					elem: elem
       
  1301 				});
       
  1302 			}
       
  1303 		});
       
  1304 
       
  1305 		if ( options.using ) {
       
  1306 			// adds feedback as second argument to using callback, if present
       
  1307 			using = function( props ) {
       
  1308 				var left = targetOffset.left - position.left,
       
  1309 					right = left + targetWidth - elemWidth,
       
  1310 					top = targetOffset.top - position.top,
       
  1311 					bottom = top + targetHeight - elemHeight,
       
  1312 					feedback = {
       
  1313 						target: {
       
  1314 							element: target,
       
  1315 							left: targetOffset.left,
       
  1316 							top: targetOffset.top,
       
  1317 							width: targetWidth,
       
  1318 							height: targetHeight
       
  1319 						},
       
  1320 						element: {
       
  1321 							element: elem,
       
  1322 							left: position.left,
       
  1323 							top: position.top,
       
  1324 							width: elemWidth,
       
  1325 							height: elemHeight
       
  1326 						},
       
  1327 						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
       
  1328 						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
       
  1329 					};
       
  1330 				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
       
  1331 					feedback.horizontal = "center";
       
  1332 				}
       
  1333 				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
       
  1334 					feedback.vertical = "middle";
       
  1335 				}
       
  1336 				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
       
  1337 					feedback.important = "horizontal";
       
  1338 				} else {
       
  1339 					feedback.important = "vertical";
       
  1340 				}
       
  1341 				options.using.call( this, props, feedback );
       
  1342 			};
       
  1343 		}
       
  1344 
       
  1345 		elem.offset( $.extend( position, { using: using } ) );
       
  1346 	});
       
  1347 };
       
  1348 
       
  1349 $.ui.position = {
       
  1350 	fit: {
       
  1351 		left: function( position, data ) {
       
  1352 			var within = data.within,
       
  1353 				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
       
  1354 				outerWidth = within.width,
       
  1355 				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
       
  1356 				overLeft = withinOffset - collisionPosLeft,
       
  1357 				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
       
  1358 				newOverRight;
       
  1359 
       
  1360 			// element is wider than within
       
  1361 			if ( data.collisionWidth > outerWidth ) {
       
  1362 				// element is initially over the left side of within
       
  1363 				if ( overLeft > 0 && overRight <= 0 ) {
       
  1364 					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
       
  1365 					position.left += overLeft - newOverRight;
       
  1366 				// element is initially over right side of within
       
  1367 				} else if ( overRight > 0 && overLeft <= 0 ) {
       
  1368 					position.left = withinOffset;
       
  1369 				// element is initially over both left and right sides of within
       
  1370 				} else {
       
  1371 					if ( overLeft > overRight ) {
       
  1372 						position.left = withinOffset + outerWidth - data.collisionWidth;
       
  1373 					} else {
       
  1374 						position.left = withinOffset;
       
  1375 					}
       
  1376 				}
       
  1377 			// too far left -> align with left edge
       
  1378 			} else if ( overLeft > 0 ) {
       
  1379 				position.left += overLeft;
       
  1380 			// too far right -> align with right edge
       
  1381 			} else if ( overRight > 0 ) {
       
  1382 				position.left -= overRight;
       
  1383 			// adjust based on position and margin
       
  1384 			} else {
       
  1385 				position.left = max( position.left - collisionPosLeft, position.left );
       
  1386 			}
       
  1387 		},
       
  1388 		top: function( position, data ) {
       
  1389 			var within = data.within,
       
  1390 				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
       
  1391 				outerHeight = data.within.height,
       
  1392 				collisionPosTop = position.top - data.collisionPosition.marginTop,
       
  1393 				overTop = withinOffset - collisionPosTop,
       
  1394 				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
       
  1395 				newOverBottom;
       
  1396 
       
  1397 			// element is taller than within
       
  1398 			if ( data.collisionHeight > outerHeight ) {
       
  1399 				// element is initially over the top of within
       
  1400 				if ( overTop > 0 && overBottom <= 0 ) {
       
  1401 					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
       
  1402 					position.top += overTop - newOverBottom;
       
  1403 				// element is initially over bottom of within
       
  1404 				} else if ( overBottom > 0 && overTop <= 0 ) {
       
  1405 					position.top = withinOffset;
       
  1406 				// element is initially over both top and bottom of within
       
  1407 				} else {
       
  1408 					if ( overTop > overBottom ) {
       
  1409 						position.top = withinOffset + outerHeight - data.collisionHeight;
       
  1410 					} else {
       
  1411 						position.top = withinOffset;
       
  1412 					}
       
  1413 				}
       
  1414 			// too far up -> align with top
       
  1415 			} else if ( overTop > 0 ) {
       
  1416 				position.top += overTop;
       
  1417 			// too far down -> align with bottom edge
       
  1418 			} else if ( overBottom > 0 ) {
       
  1419 				position.top -= overBottom;
       
  1420 			// adjust based on position and margin
       
  1421 			} else {
       
  1422 				position.top = max( position.top - collisionPosTop, position.top );
       
  1423 			}
       
  1424 		}
       
  1425 	},
       
  1426 	flip: {
       
  1427 		left: function( position, data ) {
       
  1428 			var within = data.within,
       
  1429 				withinOffset = within.offset.left + within.scrollLeft,
       
  1430 				outerWidth = within.width,
       
  1431 				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
       
  1432 				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
       
  1433 				overLeft = collisionPosLeft - offsetLeft,
       
  1434 				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
       
  1435 				myOffset = data.my[ 0 ] === "left" ?
       
  1436 					-data.elemWidth :
       
  1437 					data.my[ 0 ] === "right" ?
       
  1438 						data.elemWidth :
       
  1439 						0,
       
  1440 				atOffset = data.at[ 0 ] === "left" ?
       
  1441 					data.targetWidth :
       
  1442 					data.at[ 0 ] === "right" ?
       
  1443 						-data.targetWidth :
       
  1444 						0,
       
  1445 				offset = -2 * data.offset[ 0 ],
       
  1446 				newOverRight,
       
  1447 				newOverLeft;
       
  1448 
       
  1449 			if ( overLeft < 0 ) {
       
  1450 				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
       
  1451 				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
       
  1452 					position.left += myOffset + atOffset + offset;
       
  1453 				}
       
  1454 			} else if ( overRight > 0 ) {
       
  1455 				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
       
  1456 				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
       
  1457 					position.left += myOffset + atOffset + offset;
       
  1458 				}
       
  1459 			}
       
  1460 		},
       
  1461 		top: function( position, data ) {
       
  1462 			var within = data.within,
       
  1463 				withinOffset = within.offset.top + within.scrollTop,
       
  1464 				outerHeight = within.height,
       
  1465 				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
       
  1466 				collisionPosTop = position.top - data.collisionPosition.marginTop,
       
  1467 				overTop = collisionPosTop - offsetTop,
       
  1468 				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
       
  1469 				top = data.my[ 1 ] === "top",
       
  1470 				myOffset = top ?
       
  1471 					-data.elemHeight :
       
  1472 					data.my[ 1 ] === "bottom" ?
       
  1473 						data.elemHeight :
       
  1474 						0,
       
  1475 				atOffset = data.at[ 1 ] === "top" ?
       
  1476 					data.targetHeight :
       
  1477 					data.at[ 1 ] === "bottom" ?
       
  1478 						-data.targetHeight :
       
  1479 						0,
       
  1480 				offset = -2 * data.offset[ 1 ],
       
  1481 				newOverTop,
       
  1482 				newOverBottom;
       
  1483 			if ( overTop < 0 ) {
       
  1484 				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
       
  1485 				if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
       
  1486 					position.top += myOffset + atOffset + offset;
       
  1487 				}
       
  1488 			} else if ( overBottom > 0 ) {
       
  1489 				newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
       
  1490 				if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
       
  1491 					position.top += myOffset + atOffset + offset;
       
  1492 				}
       
  1493 			}
       
  1494 		}
       
  1495 	},
       
  1496 	flipfit: {
       
  1497 		left: function() {
       
  1498 			$.ui.position.flip.left.apply( this, arguments );
       
  1499 			$.ui.position.fit.left.apply( this, arguments );
       
  1500 		},
       
  1501 		top: function() {
       
  1502 			$.ui.position.flip.top.apply( this, arguments );
       
  1503 			$.ui.position.fit.top.apply( this, arguments );
       
  1504 		}
       
  1505 	}
       
  1506 };
       
  1507 
       
  1508 // fraction support test
       
  1509 (function() {
       
  1510 	var testElement, testElementParent, testElementStyle, offsetLeft, i,
       
  1511 		body = document.getElementsByTagName( "body" )[ 0 ],
       
  1512 		div = document.createElement( "div" );
       
  1513 
       
  1514 	//Create a "fake body" for testing based on method used in jQuery.support
       
  1515 	testElement = document.createElement( body ? "div" : "body" );
       
  1516 	testElementStyle = {
       
  1517 		visibility: "hidden",
       
  1518 		width: 0,
       
  1519 		height: 0,
       
  1520 		border: 0,
       
  1521 		margin: 0,
       
  1522 		background: "none"
       
  1523 	};
       
  1524 	if ( body ) {
       
  1525 		$.extend( testElementStyle, {
       
  1526 			position: "absolute",
       
  1527 			left: "-1000px",
       
  1528 			top: "-1000px"
       
  1529 		});
       
  1530 	}
       
  1531 	for ( i in testElementStyle ) {
       
  1532 		testElement.style[ i ] = testElementStyle[ i ];
       
  1533 	}
       
  1534 	testElement.appendChild( div );
       
  1535 	testElementParent = body || document.documentElement;
       
  1536 	testElementParent.insertBefore( testElement, testElementParent.firstChild );
       
  1537 
       
  1538 	div.style.cssText = "position: absolute; left: 10.7432222px;";
       
  1539 
       
  1540 	offsetLeft = $( div ).offset().left;
       
  1541 	supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
       
  1542 
       
  1543 	testElement.innerHTML = "";
       
  1544 	testElementParent.removeChild( testElement );
       
  1545 })();
       
  1546 
       
  1547 })();
       
  1548 
       
  1549 var position = $.ui.position;
       
  1550 
       
  1551 
       
  1552 /*!
       
  1553  * jQuery UI Accordion 1.11.4
       
  1554  * http://jqueryui.com
       
  1555  *
       
  1556  * Copyright jQuery Foundation and other contributors
       
  1557  * Released under the MIT license.
       
  1558  * http://jquery.org/license
       
  1559  *
       
  1560  * http://api.jqueryui.com/accordion/
       
  1561  */
       
  1562 
       
  1563 
       
  1564 var accordion = $.widget( "ui.accordion", {
       
  1565 	version: "1.11.4",
       
  1566 	options: {
       
  1567 		active: 0,
       
  1568 		animate: {},
       
  1569 		collapsible: false,
       
  1570 		event: "click",
       
  1571 		header: "> li > :first-child,> :not(li):even",
       
  1572 		heightStyle: "auto",
       
  1573 		icons: {
       
  1574 			activeHeader: "ui-icon-triangle-1-s",
       
  1575 			header: "ui-icon-triangle-1-e"
       
  1576 		},
       
  1577 
       
  1578 		// callbacks
       
  1579 		activate: null,
       
  1580 		beforeActivate: null
       
  1581 	},
       
  1582 
       
  1583 	hideProps: {
       
  1584 		borderTopWidth: "hide",
       
  1585 		borderBottomWidth: "hide",
       
  1586 		paddingTop: "hide",
       
  1587 		paddingBottom: "hide",
       
  1588 		height: "hide"
       
  1589 	},
       
  1590 
       
  1591 	showProps: {
       
  1592 		borderTopWidth: "show",
       
  1593 		borderBottomWidth: "show",
       
  1594 		paddingTop: "show",
       
  1595 		paddingBottom: "show",
       
  1596 		height: "show"
       
  1597 	},
       
  1598 
       
  1599 	_create: function() {
       
  1600 		var options = this.options;
       
  1601 		this.prevShow = this.prevHide = $();
       
  1602 		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
       
  1603 			// ARIA
       
  1604 			.attr( "role", "tablist" );
       
  1605 
       
  1606 		// don't allow collapsible: false and active: false / null
       
  1607 		if ( !options.collapsible && (options.active === false || options.active == null) ) {
       
  1608 			options.active = 0;
       
  1609 		}
       
  1610 
       
  1611 		this._processPanels();
       
  1612 		// handle negative values
       
  1613 		if ( options.active < 0 ) {
       
  1614 			options.active += this.headers.length;
       
  1615 		}
       
  1616 		this._refresh();
       
  1617 	},
       
  1618 
       
  1619 	_getCreateEventData: function() {
       
  1620 		return {
       
  1621 			header: this.active,
       
  1622 			panel: !this.active.length ? $() : this.active.next()
       
  1623 		};
       
  1624 	},
       
  1625 
       
  1626 	_createIcons: function() {
       
  1627 		var icons = this.options.icons;
       
  1628 		if ( icons ) {
       
  1629 			$( "<span>" )
       
  1630 				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
       
  1631 				.prependTo( this.headers );
       
  1632 			this.active.children( ".ui-accordion-header-icon" )
       
  1633 				.removeClass( icons.header )
       
  1634 				.addClass( icons.activeHeader );
       
  1635 			this.headers.addClass( "ui-accordion-icons" );
       
  1636 		}
       
  1637 	},
       
  1638 
       
  1639 	_destroyIcons: function() {
       
  1640 		this.headers
       
  1641 			.removeClass( "ui-accordion-icons" )
       
  1642 			.children( ".ui-accordion-header-icon" )
       
  1643 				.remove();
       
  1644 	},
       
  1645 
       
  1646 	_destroy: function() {
       
  1647 		var contents;
       
  1648 
       
  1649 		// clean up main element
       
  1650 		this.element
       
  1651 			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
       
  1652 			.removeAttr( "role" );
       
  1653 
       
  1654 		// clean up headers
       
  1655 		this.headers
       
  1656 			.removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " +
       
  1657 				"ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
       
  1658 			.removeAttr( "role" )
       
  1659 			.removeAttr( "aria-expanded" )
       
  1660 			.removeAttr( "aria-selected" )
       
  1661 			.removeAttr( "aria-controls" )
       
  1662 			.removeAttr( "tabIndex" )
       
  1663 			.removeUniqueId();
       
  1664 
       
  1665 		this._destroyIcons();
       
  1666 
       
  1667 		// clean up content panels
       
  1668 		contents = this.headers.next()
       
  1669 			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
       
  1670 				"ui-accordion-content ui-accordion-content-active ui-state-disabled" )
       
  1671 			.css( "display", "" )
       
  1672 			.removeAttr( "role" )
       
  1673 			.removeAttr( "aria-hidden" )
       
  1674 			.removeAttr( "aria-labelledby" )
       
  1675 			.removeUniqueId();
       
  1676 
       
  1677 		if ( this.options.heightStyle !== "content" ) {
       
  1678 			contents.css( "height", "" );
       
  1679 		}
       
  1680 	},
       
  1681 
       
  1682 	_setOption: function( key, value ) {
       
  1683 		if ( key === "active" ) {
       
  1684 			// _activate() will handle invalid values and update this.options
       
  1685 			this._activate( value );
       
  1686 			return;
       
  1687 		}
       
  1688 
       
  1689 		if ( key === "event" ) {
       
  1690 			if ( this.options.event ) {
       
  1691 				this._off( this.headers, this.options.event );
       
  1692 			}
       
  1693 			this._setupEvents( value );
       
  1694 		}
       
  1695 
       
  1696 		this._super( key, value );
       
  1697 
       
  1698 		// setting collapsible: false while collapsed; open first panel
       
  1699 		if ( key === "collapsible" && !value && this.options.active === false ) {
       
  1700 			this._activate( 0 );
       
  1701 		}
       
  1702 
       
  1703 		if ( key === "icons" ) {
       
  1704 			this._destroyIcons();
       
  1705 			if ( value ) {
       
  1706 				this._createIcons();
       
  1707 			}
       
  1708 		}
       
  1709 
       
  1710 		// #5332 - opacity doesn't cascade to positioned elements in IE
       
  1711 		// so we need to add the disabled class to the headers and panels
       
  1712 		if ( key === "disabled" ) {
       
  1713 			this.element
       
  1714 				.toggleClass( "ui-state-disabled", !!value )
       
  1715 				.attr( "aria-disabled", value );
       
  1716 			this.headers.add( this.headers.next() )
       
  1717 				.toggleClass( "ui-state-disabled", !!value );
       
  1718 		}
       
  1719 	},
       
  1720 
       
  1721 	_keydown: function( event ) {
       
  1722 		if ( event.altKey || event.ctrlKey ) {
       
  1723 			return;
       
  1724 		}
       
  1725 
       
  1726 		var keyCode = $.ui.keyCode,
       
  1727 			length = this.headers.length,
       
  1728 			currentIndex = this.headers.index( event.target ),
       
  1729 			toFocus = false;
       
  1730 
       
  1731 		switch ( event.keyCode ) {
       
  1732 			case keyCode.RIGHT:
       
  1733 			case keyCode.DOWN:
       
  1734 				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
       
  1735 				break;
       
  1736 			case keyCode.LEFT:
       
  1737 			case keyCode.UP:
       
  1738 				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
       
  1739 				break;
       
  1740 			case keyCode.SPACE:
       
  1741 			case keyCode.ENTER:
       
  1742 				this._eventHandler( event );
       
  1743 				break;
       
  1744 			case keyCode.HOME:
       
  1745 				toFocus = this.headers[ 0 ];
       
  1746 				break;
       
  1747 			case keyCode.END:
       
  1748 				toFocus = this.headers[ length - 1 ];
       
  1749 				break;
       
  1750 		}
       
  1751 
       
  1752 		if ( toFocus ) {
       
  1753 			$( event.target ).attr( "tabIndex", -1 );
       
  1754 			$( toFocus ).attr( "tabIndex", 0 );
       
  1755 			toFocus.focus();
       
  1756 			event.preventDefault();
       
  1757 		}
       
  1758 	},
       
  1759 
       
  1760 	_panelKeyDown: function( event ) {
       
  1761 		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
       
  1762 			$( event.currentTarget ).prev().focus();
       
  1763 		}
       
  1764 	},
       
  1765 
       
  1766 	refresh: function() {
       
  1767 		var options = this.options;
       
  1768 		this._processPanels();
       
  1769 
       
  1770 		// was collapsed or no panel
       
  1771 		if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
       
  1772 			options.active = false;
       
  1773 			this.active = $();
       
  1774 		// active false only when collapsible is true
       
  1775 		} else if ( options.active === false ) {
       
  1776 			this._activate( 0 );
       
  1777 		// was active, but active panel is gone
       
  1778 		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
       
  1779 			// all remaining panel are disabled
       
  1780 			if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
       
  1781 				options.active = false;
       
  1782 				this.active = $();
       
  1783 			// activate previous panel
       
  1784 			} else {
       
  1785 				this._activate( Math.max( 0, options.active - 1 ) );
       
  1786 			}
       
  1787 		// was active, active panel still exists
       
  1788 		} else {
       
  1789 			// make sure active index is correct
       
  1790 			options.active = this.headers.index( this.active );
       
  1791 		}
       
  1792 
       
  1793 		this._destroyIcons();
       
  1794 
       
  1795 		this._refresh();
       
  1796 	},
       
  1797 
       
  1798 	_processPanels: function() {
       
  1799 		var prevHeaders = this.headers,
       
  1800 			prevPanels = this.panels;
       
  1801 
       
  1802 		this.headers = this.element.find( this.options.header )
       
  1803 			.addClass( "ui-accordion-header ui-state-default ui-corner-all" );
       
  1804 
       
  1805 		this.panels = this.headers.next()
       
  1806 			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
       
  1807 			.filter( ":not(.ui-accordion-content-active)" )
       
  1808 			.hide();
       
  1809 
       
  1810 		// Avoid memory leaks (#10056)
       
  1811 		if ( prevPanels ) {
       
  1812 			this._off( prevHeaders.not( this.headers ) );
       
  1813 			this._off( prevPanels.not( this.panels ) );
       
  1814 		}
       
  1815 	},
       
  1816 
       
  1817 	_refresh: function() {
       
  1818 		var maxHeight,
       
  1819 			options = this.options,
       
  1820 			heightStyle = options.heightStyle,
       
  1821 			parent = this.element.parent();
       
  1822 
       
  1823 		this.active = this._findActive( options.active )
       
  1824 			.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
       
  1825 			.removeClass( "ui-corner-all" );
       
  1826 		this.active.next()
       
  1827 			.addClass( "ui-accordion-content-active" )
       
  1828 			.show();
       
  1829 
       
  1830 		this.headers
       
  1831 			.attr( "role", "tab" )
       
  1832 			.each(function() {
       
  1833 				var header = $( this ),
       
  1834 					headerId = header.uniqueId().attr( "id" ),
       
  1835 					panel = header.next(),
       
  1836 					panelId = panel.uniqueId().attr( "id" );
       
  1837 				header.attr( "aria-controls", panelId );
       
  1838 				panel.attr( "aria-labelledby", headerId );
       
  1839 			})
       
  1840 			.next()
       
  1841 				.attr( "role", "tabpanel" );
       
  1842 
       
  1843 		this.headers
       
  1844 			.not( this.active )
       
  1845 			.attr({
       
  1846 				"aria-selected": "false",
       
  1847 				"aria-expanded": "false",
       
  1848 				tabIndex: -1
       
  1849 			})
       
  1850 			.next()
       
  1851 				.attr({
       
  1852 					"aria-hidden": "true"
       
  1853 				})
       
  1854 				.hide();
       
  1855 
       
  1856 		// make sure at least one header is in the tab order
       
  1857 		if ( !this.active.length ) {
       
  1858 			this.headers.eq( 0 ).attr( "tabIndex", 0 );
       
  1859 		} else {
       
  1860 			this.active.attr({
       
  1861 				"aria-selected": "true",
       
  1862 				"aria-expanded": "true",
       
  1863 				tabIndex: 0
       
  1864 			})
       
  1865 			.next()
       
  1866 				.attr({
       
  1867 					"aria-hidden": "false"
       
  1868 				});
       
  1869 		}
       
  1870 
       
  1871 		this._createIcons();
       
  1872 
       
  1873 		this._setupEvents( options.event );
       
  1874 
       
  1875 		if ( heightStyle === "fill" ) {
       
  1876 			maxHeight = parent.height();
       
  1877 			this.element.siblings( ":visible" ).each(function() {
       
  1878 				var elem = $( this ),
       
  1879 					position = elem.css( "position" );
       
  1880 
       
  1881 				if ( position === "absolute" || position === "fixed" ) {
       
  1882 					return;
       
  1883 				}
       
  1884 				maxHeight -= elem.outerHeight( true );
       
  1885 			});
       
  1886 
       
  1887 			this.headers.each(function() {
       
  1888 				maxHeight -= $( this ).outerHeight( true );
       
  1889 			});
       
  1890 
       
  1891 			this.headers.next()
       
  1892 				.each(function() {
       
  1893 					$( this ).height( Math.max( 0, maxHeight -
       
  1894 						$( this ).innerHeight() + $( this ).height() ) );
       
  1895 				})
       
  1896 				.css( "overflow", "auto" );
       
  1897 		} else if ( heightStyle === "auto" ) {
       
  1898 			maxHeight = 0;
       
  1899 			this.headers.next()
       
  1900 				.each(function() {
       
  1901 					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
       
  1902 				})
       
  1903 				.height( maxHeight );
       
  1904 		}
       
  1905 	},
       
  1906 
       
  1907 	_activate: function( index ) {
       
  1908 		var active = this._findActive( index )[ 0 ];
       
  1909 
       
  1910 		// trying to activate the already active panel
       
  1911 		if ( active === this.active[ 0 ] ) {
       
  1912 			return;
       
  1913 		}
       
  1914 
       
  1915 		// trying to collapse, simulate a click on the currently active header
       
  1916 		active = active || this.active[ 0 ];
       
  1917 
       
  1918 		this._eventHandler({
       
  1919 			target: active,
       
  1920 			currentTarget: active,
       
  1921 			preventDefault: $.noop
       
  1922 		});
       
  1923 	},
       
  1924 
       
  1925 	_findActive: function( selector ) {
       
  1926 		return typeof selector === "number" ? this.headers.eq( selector ) : $();
       
  1927 	},
       
  1928 
       
  1929 	_setupEvents: function( event ) {
       
  1930 		var events = {
       
  1931 			keydown: "_keydown"
       
  1932 		};
       
  1933 		if ( event ) {
       
  1934 			$.each( event.split( " " ), function( index, eventName ) {
       
  1935 				events[ eventName ] = "_eventHandler";
       
  1936 			});
       
  1937 		}
       
  1938 
       
  1939 		this._off( this.headers.add( this.headers.next() ) );
       
  1940 		this._on( this.headers, events );
       
  1941 		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
       
  1942 		this._hoverable( this.headers );
       
  1943 		this._focusable( this.headers );
       
  1944 	},
       
  1945 
       
  1946 	_eventHandler: function( event ) {
       
  1947 		var options = this.options,
       
  1948 			active = this.active,
       
  1949 			clicked = $( event.currentTarget ),
       
  1950 			clickedIsActive = clicked[ 0 ] === active[ 0 ],
       
  1951 			collapsing = clickedIsActive && options.collapsible,
       
  1952 			toShow = collapsing ? $() : clicked.next(),
       
  1953 			toHide = active.next(),
       
  1954 			eventData = {
       
  1955 				oldHeader: active,
       
  1956 				oldPanel: toHide,
       
  1957 				newHeader: collapsing ? $() : clicked,
       
  1958 				newPanel: toShow
       
  1959 			};
       
  1960 
       
  1961 		event.preventDefault();
       
  1962 
       
  1963 		if (
       
  1964 				// click on active header, but not collapsible
       
  1965 				( clickedIsActive && !options.collapsible ) ||
       
  1966 				// allow canceling activation
       
  1967 				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
       
  1968 			return;
       
  1969 		}
       
  1970 
       
  1971 		options.active = collapsing ? false : this.headers.index( clicked );
       
  1972 
       
  1973 		// when the call to ._toggle() comes after the class changes
       
  1974 		// it causes a very odd bug in IE 8 (see #6720)
       
  1975 		this.active = clickedIsActive ? $() : clicked;
       
  1976 		this._toggle( eventData );
       
  1977 
       
  1978 		// switch classes
       
  1979 		// corner classes on the previously active header stay after the animation
       
  1980 		active.removeClass( "ui-accordion-header-active ui-state-active" );
       
  1981 		if ( options.icons ) {
       
  1982 			active.children( ".ui-accordion-header-icon" )
       
  1983 				.removeClass( options.icons.activeHeader )
       
  1984 				.addClass( options.icons.header );
       
  1985 		}
       
  1986 
       
  1987 		if ( !clickedIsActive ) {
       
  1988 			clicked
       
  1989 				.removeClass( "ui-corner-all" )
       
  1990 				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
       
  1991 			if ( options.icons ) {
       
  1992 				clicked.children( ".ui-accordion-header-icon" )
       
  1993 					.removeClass( options.icons.header )
       
  1994 					.addClass( options.icons.activeHeader );
       
  1995 			}
       
  1996 
       
  1997 			clicked
       
  1998 				.next()
       
  1999 				.addClass( "ui-accordion-content-active" );
       
  2000 		}
       
  2001 	},
       
  2002 
       
  2003 	_toggle: function( data ) {
       
  2004 		var toShow = data.newPanel,
       
  2005 			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
       
  2006 
       
  2007 		// handle activating a panel during the animation for another activation
       
  2008 		this.prevShow.add( this.prevHide ).stop( true, true );
       
  2009 		this.prevShow = toShow;
       
  2010 		this.prevHide = toHide;
       
  2011 
       
  2012 		if ( this.options.animate ) {
       
  2013 			this._animate( toShow, toHide, data );
       
  2014 		} else {
       
  2015 			toHide.hide();
       
  2016 			toShow.show();
       
  2017 			this._toggleComplete( data );
       
  2018 		}
       
  2019 
       
  2020 		toHide.attr({
       
  2021 			"aria-hidden": "true"
       
  2022 		});
       
  2023 		toHide.prev().attr({
       
  2024 			"aria-selected": "false",
       
  2025 			"aria-expanded": "false"
       
  2026 		});
       
  2027 		// if we're switching panels, remove the old header from the tab order
       
  2028 		// if we're opening from collapsed state, remove the previous header from the tab order
       
  2029 		// if we're collapsing, then keep the collapsing header in the tab order
       
  2030 		if ( toShow.length && toHide.length ) {
       
  2031 			toHide.prev().attr({
       
  2032 				"tabIndex": -1,
       
  2033 				"aria-expanded": "false"
       
  2034 			});
       
  2035 		} else if ( toShow.length ) {
       
  2036 			this.headers.filter(function() {
       
  2037 				return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
       
  2038 			})
       
  2039 			.attr( "tabIndex", -1 );
       
  2040 		}
       
  2041 
       
  2042 		toShow
       
  2043 			.attr( "aria-hidden", "false" )
       
  2044 			.prev()
       
  2045 				.attr({
       
  2046 					"aria-selected": "true",
       
  2047 					"aria-expanded": "true",
       
  2048 					tabIndex: 0
       
  2049 				});
       
  2050 	},
       
  2051 
       
  2052 	_animate: function( toShow, toHide, data ) {
       
  2053 		var total, easing, duration,
       
  2054 			that = this,
       
  2055 			adjust = 0,
       
  2056 			boxSizing = toShow.css( "box-sizing" ),
       
  2057 			down = toShow.length &&
       
  2058 				( !toHide.length || ( toShow.index() < toHide.index() ) ),
       
  2059 			animate = this.options.animate || {},
       
  2060 			options = down && animate.down || animate,
       
  2061 			complete = function() {
       
  2062 				that._toggleComplete( data );
       
  2063 			};
       
  2064 
       
  2065 		if ( typeof options === "number" ) {
       
  2066 			duration = options;
       
  2067 		}
       
  2068 		if ( typeof options === "string" ) {
       
  2069 			easing = options;
       
  2070 		}
       
  2071 		// fall back from options to animation in case of partial down settings
       
  2072 		easing = easing || options.easing || animate.easing;
       
  2073 		duration = duration || options.duration || animate.duration;
       
  2074 
       
  2075 		if ( !toHide.length ) {
       
  2076 			return toShow.animate( this.showProps, duration, easing, complete );
       
  2077 		}
       
  2078 		if ( !toShow.length ) {
       
  2079 			return toHide.animate( this.hideProps, duration, easing, complete );
       
  2080 		}
       
  2081 
       
  2082 		total = toShow.show().outerHeight();
       
  2083 		toHide.animate( this.hideProps, {
       
  2084 			duration: duration,
       
  2085 			easing: easing,
       
  2086 			step: function( now, fx ) {
       
  2087 				fx.now = Math.round( now );
       
  2088 			}
       
  2089 		});
       
  2090 		toShow
       
  2091 			.hide()
       
  2092 			.animate( this.showProps, {
       
  2093 				duration: duration,
       
  2094 				easing: easing,
       
  2095 				complete: complete,
       
  2096 				step: function( now, fx ) {
       
  2097 					fx.now = Math.round( now );
       
  2098 					if ( fx.prop !== "height" ) {
       
  2099 						if ( boxSizing === "content-box" ) {
       
  2100 							adjust += fx.now;
       
  2101 						}
       
  2102 					} else if ( that.options.heightStyle !== "content" ) {
       
  2103 						fx.now = Math.round( total - toHide.outerHeight() - adjust );
       
  2104 						adjust = 0;
       
  2105 					}
       
  2106 				}
       
  2107 			});
       
  2108 	},
       
  2109 
       
  2110 	_toggleComplete: function( data ) {
       
  2111 		var toHide = data.oldPanel;
       
  2112 
       
  2113 		toHide
       
  2114 			.removeClass( "ui-accordion-content-active" )
       
  2115 			.prev()
       
  2116 				.removeClass( "ui-corner-top" )
       
  2117 				.addClass( "ui-corner-all" );
       
  2118 
       
  2119 		// Work around for rendering bug in IE (#5421)
       
  2120 		if ( toHide.length ) {
       
  2121 			toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
       
  2122 		}
       
  2123 		this._trigger( "activate", null, data );
       
  2124 	}
       
  2125 });
       
  2126 
       
  2127 
       
  2128 /*!
       
  2129  * jQuery UI Menu 1.11.4
       
  2130  * http://jqueryui.com
       
  2131  *
       
  2132  * Copyright jQuery Foundation and other contributors
       
  2133  * Released under the MIT license.
       
  2134  * http://jquery.org/license
       
  2135  *
       
  2136  * http://api.jqueryui.com/menu/
       
  2137  */
       
  2138 
       
  2139 
       
  2140 var menu = $.widget( "ui.menu", {
       
  2141 	version: "1.11.4",
       
  2142 	defaultElement: "<ul>",
       
  2143 	delay: 300,
       
  2144 	options: {
       
  2145 		icons: {
       
  2146 			submenu: "ui-icon-carat-1-e"
       
  2147 		},
       
  2148 		items: "> *",
       
  2149 		menus: "ul",
       
  2150 		position: {
       
  2151 			my: "left-1 top",
       
  2152 			at: "right top"
       
  2153 		},
       
  2154 		role: "menu",
       
  2155 
       
  2156 		// callbacks
       
  2157 		blur: null,
       
  2158 		focus: null,
       
  2159 		select: null
       
  2160 	},
       
  2161 
       
  2162 	_create: function() {
       
  2163 		this.activeMenu = this.element;
       
  2164 
       
  2165 		// Flag used to prevent firing of the click handler
       
  2166 		// as the event bubbles up through nested menus
       
  2167 		this.mouseHandled = false;
       
  2168 		this.element
       
  2169 			.uniqueId()
       
  2170 			.addClass( "ui-menu ui-widget ui-widget-content" )
       
  2171 			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
       
  2172 			.attr({
       
  2173 				role: this.options.role,
       
  2174 				tabIndex: 0
       
  2175 			});
       
  2176 
       
  2177 		if ( this.options.disabled ) {
       
  2178 			this.element
       
  2179 				.addClass( "ui-state-disabled" )
       
  2180 				.attr( "aria-disabled", "true" );
       
  2181 		}
       
  2182 
       
  2183 		this._on({
       
  2184 			// Prevent focus from sticking to links inside menu after clicking
       
  2185 			// them (focus should always stay on UL during navigation).
       
  2186 			"mousedown .ui-menu-item": function( event ) {
       
  2187 				event.preventDefault();
       
  2188 			},
       
  2189 			"click .ui-menu-item": function( event ) {
       
  2190 				var target = $( event.target );
       
  2191 				if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
       
  2192 					this.select( event );
       
  2193 
       
  2194 					// Only set the mouseHandled flag if the event will bubble, see #9469.
       
  2195 					if ( !event.isPropagationStopped() ) {
       
  2196 						this.mouseHandled = true;
       
  2197 					}
       
  2198 
       
  2199 					// Open submenu on click
       
  2200 					if ( target.has( ".ui-menu" ).length ) {
       
  2201 						this.expand( event );
       
  2202 					} else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
       
  2203 
       
  2204 						// Redirect focus to the menu
       
  2205 						this.element.trigger( "focus", [ true ] );
       
  2206 
       
  2207 						// If the active item is on the top level, let it stay active.
       
  2208 						// Otherwise, blur the active item since it is no longer visible.
       
  2209 						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
       
  2210 							clearTimeout( this.timer );
       
  2211 						}
       
  2212 					}
       
  2213 				}
       
  2214 			},
       
  2215 			"mouseenter .ui-menu-item": function( event ) {
       
  2216 				// Ignore mouse events while typeahead is active, see #10458.
       
  2217 				// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
       
  2218 				// is over an item in the menu
       
  2219 				if ( this.previousFilter ) {
       
  2220 					return;
       
  2221 				}
       
  2222 				var target = $( event.currentTarget );
       
  2223 				// Remove ui-state-active class from siblings of the newly focused menu item
       
  2224 				// to avoid a jump caused by adjacent elements both having a class with a border
       
  2225 				target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" );
       
  2226 				this.focus( event, target );
       
  2227 			},
       
  2228 			mouseleave: "collapseAll",
       
  2229 			"mouseleave .ui-menu": "collapseAll",
       
  2230 			focus: function( event, keepActiveItem ) {
       
  2231 				// If there's already an active item, keep it active
       
  2232 				// If not, activate the first item
       
  2233 				var item = this.active || this.element.find( this.options.items ).eq( 0 );
       
  2234 
       
  2235 				if ( !keepActiveItem ) {
       
  2236 					this.focus( event, item );
       
  2237 				}
       
  2238 			},
       
  2239 			blur: function( event ) {
       
  2240 				this._delay(function() {
       
  2241 					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
       
  2242 						this.collapseAll( event );
       
  2243 					}
       
  2244 				});
       
  2245 			},
       
  2246 			keydown: "_keydown"
       
  2247 		});
       
  2248 
       
  2249 		this.refresh();
       
  2250 
       
  2251 		// Clicks outside of a menu collapse any open menus
       
  2252 		this._on( this.document, {
       
  2253 			click: function( event ) {
       
  2254 				if ( this._closeOnDocumentClick( event ) ) {
       
  2255 					this.collapseAll( event );
       
  2256 				}
       
  2257 
       
  2258 				// Reset the mouseHandled flag
       
  2259 				this.mouseHandled = false;
       
  2260 			}
       
  2261 		});
       
  2262 	},
       
  2263 
       
  2264 	_destroy: function() {
       
  2265 		// Destroy (sub)menus
       
  2266 		this.element
       
  2267 			.removeAttr( "aria-activedescendant" )
       
  2268 			.find( ".ui-menu" ).addBack()
       
  2269 				.removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
       
  2270 				.removeAttr( "role" )
       
  2271 				.removeAttr( "tabIndex" )
       
  2272 				.removeAttr( "aria-labelledby" )
       
  2273 				.removeAttr( "aria-expanded" )
       
  2274 				.removeAttr( "aria-hidden" )
       
  2275 				.removeAttr( "aria-disabled" )
       
  2276 				.removeUniqueId()
       
  2277 				.show();
       
  2278 
       
  2279 		// Destroy menu items
       
  2280 		this.element.find( ".ui-menu-item" )
       
  2281 			.removeClass( "ui-menu-item" )
       
  2282 			.removeAttr( "role" )
       
  2283 			.removeAttr( "aria-disabled" )
       
  2284 			.removeUniqueId()
       
  2285 			.removeClass( "ui-state-hover" )
       
  2286 			.removeAttr( "tabIndex" )
       
  2287 			.removeAttr( "role" )
       
  2288 			.removeAttr( "aria-haspopup" )
       
  2289 			.children().each( function() {
       
  2290 				var elem = $( this );
       
  2291 				if ( elem.data( "ui-menu-submenu-carat" ) ) {
       
  2292 					elem.remove();
       
  2293 				}
       
  2294 			});
       
  2295 
       
  2296 		// Destroy menu dividers
       
  2297 		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
       
  2298 	},
       
  2299 
       
  2300 	_keydown: function( event ) {
       
  2301 		var match, prev, character, skip,
       
  2302 			preventDefault = true;
       
  2303 
       
  2304 		switch ( event.keyCode ) {
       
  2305 		case $.ui.keyCode.PAGE_UP:
       
  2306 			this.previousPage( event );
       
  2307 			break;
       
  2308 		case $.ui.keyCode.PAGE_DOWN:
       
  2309 			this.nextPage( event );
       
  2310 			break;
       
  2311 		case $.ui.keyCode.HOME:
       
  2312 			this._move( "first", "first", event );
       
  2313 			break;
       
  2314 		case $.ui.keyCode.END:
       
  2315 			this._move( "last", "last", event );
       
  2316 			break;
       
  2317 		case $.ui.keyCode.UP:
       
  2318 			this.previous( event );
       
  2319 			break;
       
  2320 		case $.ui.keyCode.DOWN:
       
  2321 			this.next( event );
       
  2322 			break;
       
  2323 		case $.ui.keyCode.LEFT:
       
  2324 			this.collapse( event );
       
  2325 			break;
       
  2326 		case $.ui.keyCode.RIGHT:
       
  2327 			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
       
  2328 				this.expand( event );
       
  2329 			}
       
  2330 			break;
       
  2331 		case $.ui.keyCode.ENTER:
       
  2332 		case $.ui.keyCode.SPACE:
       
  2333 			this._activate( event );
       
  2334 			break;
       
  2335 		case $.ui.keyCode.ESCAPE:
       
  2336 			this.collapse( event );
       
  2337 			break;
       
  2338 		default:
       
  2339 			preventDefault = false;
       
  2340 			prev = this.previousFilter || "";
       
  2341 			character = String.fromCharCode( event.keyCode );
       
  2342 			skip = false;
       
  2343 
       
  2344 			clearTimeout( this.filterTimer );
       
  2345 
       
  2346 			if ( character === prev ) {
       
  2347 				skip = true;
       
  2348 			} else {
       
  2349 				character = prev + character;
       
  2350 			}
       
  2351 
       
  2352 			match = this._filterMenuItems( character );
       
  2353 			match = skip && match.index( this.active.next() ) !== -1 ?
       
  2354 				this.active.nextAll( ".ui-menu-item" ) :
       
  2355 				match;
       
  2356 
       
  2357 			// If no matches on the current filter, reset to the last character pressed
       
  2358 			// to move down the menu to the first item that starts with that character
       
  2359 			if ( !match.length ) {
       
  2360 				character = String.fromCharCode( event.keyCode );
       
  2361 				match = this._filterMenuItems( character );
       
  2362 			}
       
  2363 
       
  2364 			if ( match.length ) {
       
  2365 				this.focus( event, match );
       
  2366 				this.previousFilter = character;
       
  2367 				this.filterTimer = this._delay(function() {
       
  2368 					delete this.previousFilter;
       
  2369 				}, 1000 );
       
  2370 			} else {
       
  2371 				delete this.previousFilter;
       
  2372 			}
       
  2373 		}
       
  2374 
       
  2375 		if ( preventDefault ) {
       
  2376 			event.preventDefault();
       
  2377 		}
       
  2378 	},
       
  2379 
       
  2380 	_activate: function( event ) {
       
  2381 		if ( !this.active.is( ".ui-state-disabled" ) ) {
       
  2382 			if ( this.active.is( "[aria-haspopup='true']" ) ) {
       
  2383 				this.expand( event );
       
  2384 			} else {
       
  2385 				this.select( event );
       
  2386 			}
       
  2387 		}
       
  2388 	},
       
  2389 
       
  2390 	refresh: function() {
       
  2391 		var menus, items,
       
  2392 			that = this,
       
  2393 			icon = this.options.icons.submenu,
       
  2394 			submenus = this.element.find( this.options.menus );
       
  2395 
       
  2396 		this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
       
  2397 
       
  2398 		// Initialize nested menus
       
  2399 		submenus.filter( ":not(.ui-menu)" )
       
  2400 			.addClass( "ui-menu ui-widget ui-widget-content ui-front" )
       
  2401 			.hide()
       
  2402 			.attr({
       
  2403 				role: this.options.role,
       
  2404 				"aria-hidden": "true",
       
  2405 				"aria-expanded": "false"
       
  2406 			})
       
  2407 			.each(function() {
       
  2408 				var menu = $( this ),
       
  2409 					item = menu.parent(),
       
  2410 					submenuCarat = $( "<span>" )
       
  2411 						.addClass( "ui-menu-icon ui-icon " + icon )
       
  2412 						.data( "ui-menu-submenu-carat", true );
       
  2413 
       
  2414 				item
       
  2415 					.attr( "aria-haspopup", "true" )
       
  2416 					.prepend( submenuCarat );
       
  2417 				menu.attr( "aria-labelledby", item.attr( "id" ) );
       
  2418 			});
       
  2419 
       
  2420 		menus = submenus.add( this.element );
       
  2421 		items = menus.find( this.options.items );
       
  2422 
       
  2423 		// Initialize menu-items containing spaces and/or dashes only as dividers
       
  2424 		items.not( ".ui-menu-item" ).each(function() {
       
  2425 			var item = $( this );
       
  2426 			if ( that._isDivider( item ) ) {
       
  2427 				item.addClass( "ui-widget-content ui-menu-divider" );
       
  2428 			}
       
  2429 		});
       
  2430 
       
  2431 		// Don't refresh list items that are already adapted
       
  2432 		items.not( ".ui-menu-item, .ui-menu-divider" )
       
  2433 			.addClass( "ui-menu-item" )
       
  2434 			.uniqueId()
       
  2435 			.attr({
       
  2436 				tabIndex: -1,
       
  2437 				role: this._itemRole()
       
  2438 			});
       
  2439 
       
  2440 		// Add aria-disabled attribute to any disabled menu item
       
  2441 		items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
       
  2442 
       
  2443 		// If the active item has been removed, blur the menu
       
  2444 		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
       
  2445 			this.blur();
       
  2446 		}
       
  2447 	},
       
  2448 
       
  2449 	_itemRole: function() {
       
  2450 		return {
       
  2451 			menu: "menuitem",
       
  2452 			listbox: "option"
       
  2453 		}[ this.options.role ];
       
  2454 	},
       
  2455 
       
  2456 	_setOption: function( key, value ) {
       
  2457 		if ( key === "icons" ) {
       
  2458 			this.element.find( ".ui-menu-icon" )
       
  2459 				.removeClass( this.options.icons.submenu )
       
  2460 				.addClass( value.submenu );
       
  2461 		}
       
  2462 		if ( key === "disabled" ) {
       
  2463 			this.element
       
  2464 				.toggleClass( "ui-state-disabled", !!value )
       
  2465 				.attr( "aria-disabled", value );
       
  2466 		}
       
  2467 		this._super( key, value );
       
  2468 	},
       
  2469 
       
  2470 	focus: function( event, item ) {
       
  2471 		var nested, focused;
       
  2472 		this.blur( event, event && event.type === "focus" );
       
  2473 
       
  2474 		this._scrollIntoView( item );
       
  2475 
       
  2476 		this.active = item.first();
       
  2477 		focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
       
  2478 		// Only update aria-activedescendant if there's a role
       
  2479 		// otherwise we assume focus is managed elsewhere
       
  2480 		if ( this.options.role ) {
       
  2481 			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
       
  2482 		}
       
  2483 
       
  2484 		// Highlight active parent menu item, if any
       
  2485 		this.active
       
  2486 			.parent()
       
  2487 			.closest( ".ui-menu-item" )
       
  2488 			.addClass( "ui-state-active" );
       
  2489 
       
  2490 		if ( event && event.type === "keydown" ) {
       
  2491 			this._close();
       
  2492 		} else {
       
  2493 			this.timer = this._delay(function() {
       
  2494 				this._close();
       
  2495 			}, this.delay );
       
  2496 		}
       
  2497 
       
  2498 		nested = item.children( ".ui-menu" );
       
  2499 		if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
       
  2500 			this._startOpening(nested);
       
  2501 		}
       
  2502 		this.activeMenu = item.parent();
       
  2503 
       
  2504 		this._trigger( "focus", event, { item: item } );
       
  2505 	},
       
  2506 
       
  2507 	_scrollIntoView: function( item ) {
       
  2508 		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
       
  2509 		if ( this._hasScroll() ) {
       
  2510 			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
       
  2511 			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
       
  2512 			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
       
  2513 			scroll = this.activeMenu.scrollTop();
       
  2514 			elementHeight = this.activeMenu.height();
       
  2515 			itemHeight = item.outerHeight();
       
  2516 
       
  2517 			if ( offset < 0 ) {
       
  2518 				this.activeMenu.scrollTop( scroll + offset );
       
  2519 			} else if ( offset + itemHeight > elementHeight ) {
       
  2520 				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
       
  2521 			}
       
  2522 		}
       
  2523 	},
       
  2524 
       
  2525 	blur: function( event, fromFocus ) {
       
  2526 		if ( !fromFocus ) {
       
  2527 			clearTimeout( this.timer );
       
  2528 		}
       
  2529 
       
  2530 		if ( !this.active ) {
       
  2531 			return;
       
  2532 		}
       
  2533 
       
  2534 		this.active.removeClass( "ui-state-focus" );
       
  2535 		this.active = null;
       
  2536 
       
  2537 		this._trigger( "blur", event, { item: this.active } );
       
  2538 	},
       
  2539 
       
  2540 	_startOpening: function( submenu ) {
       
  2541 		clearTimeout( this.timer );
       
  2542 
       
  2543 		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
       
  2544 		// shift in the submenu position when mousing over the carat icon
       
  2545 		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
       
  2546 			return;
       
  2547 		}
       
  2548 
       
  2549 		this.timer = this._delay(function() {
       
  2550 			this._close();
       
  2551 			this._open( submenu );
       
  2552 		}, this.delay );
       
  2553 	},
       
  2554 
       
  2555 	_open: function( submenu ) {
       
  2556 		var position = $.extend({
       
  2557 			of: this.active
       
  2558 		}, this.options.position );
       
  2559 
       
  2560 		clearTimeout( this.timer );
       
  2561 		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
       
  2562 			.hide()
       
  2563 			.attr( "aria-hidden", "true" );
       
  2564 
       
  2565 		submenu
       
  2566 			.show()
       
  2567 			.removeAttr( "aria-hidden" )
       
  2568 			.attr( "aria-expanded", "true" )
       
  2569 			.position( position );
       
  2570 	},
       
  2571 
       
  2572 	collapseAll: function( event, all ) {
       
  2573 		clearTimeout( this.timer );
       
  2574 		this.timer = this._delay(function() {
       
  2575 			// If we were passed an event, look for the submenu that contains the event
       
  2576 			var currentMenu = all ? this.element :
       
  2577 				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
       
  2578 
       
  2579 			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
       
  2580 			if ( !currentMenu.length ) {
       
  2581 				currentMenu = this.element;
       
  2582 			}
       
  2583 
       
  2584 			this._close( currentMenu );
       
  2585 
       
  2586 			this.blur( event );
       
  2587 			this.activeMenu = currentMenu;
       
  2588 		}, this.delay );
       
  2589 	},
       
  2590 
       
  2591 	// With no arguments, closes the currently active menu - if nothing is active
       
  2592 	// it closes all menus.  If passed an argument, it will search for menus BELOW
       
  2593 	_close: function( startMenu ) {
       
  2594 		if ( !startMenu ) {
       
  2595 			startMenu = this.active ? this.active.parent() : this.element;
       
  2596 		}
       
  2597 
       
  2598 		startMenu
       
  2599 			.find( ".ui-menu" )
       
  2600 				.hide()
       
  2601 				.attr( "aria-hidden", "true" )
       
  2602 				.attr( "aria-expanded", "false" )
       
  2603 			.end()
       
  2604 			.find( ".ui-state-active" ).not( ".ui-state-focus" )
       
  2605 				.removeClass( "ui-state-active" );
       
  2606 	},
       
  2607 
       
  2608 	_closeOnDocumentClick: function( event ) {
       
  2609 		return !$( event.target ).closest( ".ui-menu" ).length;
       
  2610 	},
       
  2611 
       
  2612 	_isDivider: function( item ) {
       
  2613 
       
  2614 		// Match hyphen, em dash, en dash
       
  2615 		return !/[^\-\u2014\u2013\s]/.test( item.text() );
       
  2616 	},
       
  2617 
       
  2618 	collapse: function( event ) {
       
  2619 		var newItem = this.active &&
       
  2620 			this.active.parent().closest( ".ui-menu-item", this.element );
       
  2621 		if ( newItem && newItem.length ) {
       
  2622 			this._close();
       
  2623 			this.focus( event, newItem );
       
  2624 		}
       
  2625 	},
       
  2626 
       
  2627 	expand: function( event ) {
       
  2628 		var newItem = this.active &&
       
  2629 			this.active
       
  2630 				.children( ".ui-menu " )
       
  2631 				.find( this.options.items )
       
  2632 				.first();
       
  2633 
       
  2634 		if ( newItem && newItem.length ) {
       
  2635 			this._open( newItem.parent() );
       
  2636 
       
  2637 			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
       
  2638 			this._delay(function() {
       
  2639 				this.focus( event, newItem );
       
  2640 			});
       
  2641 		}
       
  2642 	},
       
  2643 
       
  2644 	next: function( event ) {
       
  2645 		this._move( "next", "first", event );
       
  2646 	},
       
  2647 
       
  2648 	previous: function( event ) {
       
  2649 		this._move( "prev", "last", event );
       
  2650 	},
       
  2651 
       
  2652 	isFirstItem: function() {
       
  2653 		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
       
  2654 	},
       
  2655 
       
  2656 	isLastItem: function() {
       
  2657 		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
       
  2658 	},
       
  2659 
       
  2660 	_move: function( direction, filter, event ) {
       
  2661 		var next;
       
  2662 		if ( this.active ) {
       
  2663 			if ( direction === "first" || direction === "last" ) {
       
  2664 				next = this.active
       
  2665 					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
       
  2666 					.eq( -1 );
       
  2667 			} else {
       
  2668 				next = this.active
       
  2669 					[ direction + "All" ]( ".ui-menu-item" )
       
  2670 					.eq( 0 );
       
  2671 			}
       
  2672 		}
       
  2673 		if ( !next || !next.length || !this.active ) {
       
  2674 			next = this.activeMenu.find( this.options.items )[ filter ]();
       
  2675 		}
       
  2676 
       
  2677 		this.focus( event, next );
       
  2678 	},
       
  2679 
       
  2680 	nextPage: function( event ) {
       
  2681 		var item, base, height;
       
  2682 
       
  2683 		if ( !this.active ) {
       
  2684 			this.next( event );
       
  2685 			return;
       
  2686 		}
       
  2687 		if ( this.isLastItem() ) {
       
  2688 			return;
       
  2689 		}
       
  2690 		if ( this._hasScroll() ) {
       
  2691 			base = this.active.offset().top;
       
  2692 			height = this.element.height();
       
  2693 			this.active.nextAll( ".ui-menu-item" ).each(function() {
       
  2694 				item = $( this );
       
  2695 				return item.offset().top - base - height < 0;
       
  2696 			});
       
  2697 
       
  2698 			this.focus( event, item );
       
  2699 		} else {
       
  2700 			this.focus( event, this.activeMenu.find( this.options.items )
       
  2701 				[ !this.active ? "first" : "last" ]() );
       
  2702 		}
       
  2703 	},
       
  2704 
       
  2705 	previousPage: function( event ) {
       
  2706 		var item, base, height;
       
  2707 		if ( !this.active ) {
       
  2708 			this.next( event );
       
  2709 			return;
       
  2710 		}
       
  2711 		if ( this.isFirstItem() ) {
       
  2712 			return;
       
  2713 		}
       
  2714 		if ( this._hasScroll() ) {
       
  2715 			base = this.active.offset().top;
       
  2716 			height = this.element.height();
       
  2717 			this.active.prevAll( ".ui-menu-item" ).each(function() {
       
  2718 				item = $( this );
       
  2719 				return item.offset().top - base + height > 0;
       
  2720 			});
       
  2721 
       
  2722 			this.focus( event, item );
       
  2723 		} else {
       
  2724 			this.focus( event, this.activeMenu.find( this.options.items ).first() );
       
  2725 		}
       
  2726 	},
       
  2727 
       
  2728 	_hasScroll: function() {
       
  2729 		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
       
  2730 	},
       
  2731 
       
  2732 	select: function( event ) {
       
  2733 		// TODO: It should never be possible to not have an active item at this
       
  2734 		// point, but the tests don't trigger mouseenter before click.
       
  2735 		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
       
  2736 		var ui = { item: this.active };
       
  2737 		if ( !this.active.has( ".ui-menu" ).length ) {
       
  2738 			this.collapseAll( event, true );
       
  2739 		}
       
  2740 		this._trigger( "select", event, ui );
       
  2741 	},
       
  2742 
       
  2743 	_filterMenuItems: function(character) {
       
  2744 		var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
       
  2745 			regex = new RegExp( "^" + escapedCharacter, "i" );
       
  2746 
       
  2747 		return this.activeMenu
       
  2748 			.find( this.options.items )
       
  2749 
       
  2750 			// Only match on items, not dividers or other content (#10571)
       
  2751 			.filter( ".ui-menu-item" )
       
  2752 			.filter(function() {
       
  2753 				return regex.test( $.trim( $( this ).text() ) );
       
  2754 			});
       
  2755 	}
       
  2756 });
       
  2757 
       
  2758 
       
  2759 /*!
       
  2760  * jQuery UI Autocomplete 1.11.4
       
  2761  * http://jqueryui.com
       
  2762  *
       
  2763  * Copyright jQuery Foundation and other contributors
       
  2764  * Released under the MIT license.
       
  2765  * http://jquery.org/license
       
  2766  *
       
  2767  * http://api.jqueryui.com/autocomplete/
       
  2768  */
       
  2769 
       
  2770 
       
  2771 $.widget( "ui.autocomplete", {
       
  2772 	version: "1.11.4",
       
  2773 	defaultElement: "<input>",
       
  2774 	options: {
       
  2775 		appendTo: null,
       
  2776 		autoFocus: false,
       
  2777 		delay: 300,
       
  2778 		minLength: 1,
       
  2779 		position: {
       
  2780 			my: "left top",
       
  2781 			at: "left bottom",
       
  2782 			collision: "none"
       
  2783 		},
       
  2784 		source: null,
       
  2785 
       
  2786 		// callbacks
       
  2787 		change: null,
       
  2788 		close: null,
       
  2789 		focus: null,
       
  2790 		open: null,
       
  2791 		response: null,
       
  2792 		search: null,
       
  2793 		select: null
       
  2794 	},
       
  2795 
       
  2796 	requestIndex: 0,
       
  2797 	pending: 0,
       
  2798 
       
  2799 	_create: function() {
       
  2800 		// Some browsers only repeat keydown events, not keypress events,
       
  2801 		// so we use the suppressKeyPress flag to determine if we've already
       
  2802 		// handled the keydown event. #7269
       
  2803 		// Unfortunately the code for & in keypress is the same as the up arrow,
       
  2804 		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
       
  2805 		// events when we know the keydown event was used to modify the
       
  2806 		// search term. #7799
       
  2807 		var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
       
  2808 			nodeName = this.element[ 0 ].nodeName.toLowerCase(),
       
  2809 			isTextarea = nodeName === "textarea",
       
  2810 			isInput = nodeName === "input";
       
  2811 
       
  2812 		this.isMultiLine =
       
  2813 			// Textareas are always multi-line
       
  2814 			isTextarea ? true :
       
  2815 			// Inputs are always single-line, even if inside a contentEditable element
       
  2816 			// IE also treats inputs as contentEditable
       
  2817 			isInput ? false :
       
  2818 			// All other element types are determined by whether or not they're contentEditable
       
  2819 			this.element.prop( "isContentEditable" );
       
  2820 
       
  2821 		this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
       
  2822 		this.isNewMenu = true;
       
  2823 
       
  2824 		this.element
       
  2825 			.addClass( "ui-autocomplete-input" )
       
  2826 			.attr( "autocomplete", "off" );
       
  2827 
       
  2828 		this._on( this.element, {
       
  2829 			keydown: function( event ) {
       
  2830 				if ( this.element.prop( "readOnly" ) ) {
       
  2831 					suppressKeyPress = true;
       
  2832 					suppressInput = true;
       
  2833 					suppressKeyPressRepeat = true;
       
  2834 					return;
       
  2835 				}
       
  2836 
       
  2837 				suppressKeyPress = false;
       
  2838 				suppressInput = false;
       
  2839 				suppressKeyPressRepeat = false;
       
  2840 				var keyCode = $.ui.keyCode;
       
  2841 				switch ( event.keyCode ) {
       
  2842 				case keyCode.PAGE_UP:
       
  2843 					suppressKeyPress = true;
       
  2844 					this._move( "previousPage", event );
       
  2845 					break;
       
  2846 				case keyCode.PAGE_DOWN:
       
  2847 					suppressKeyPress = true;
       
  2848 					this._move( "nextPage", event );
       
  2849 					break;
       
  2850 				case keyCode.UP:
       
  2851 					suppressKeyPress = true;
       
  2852 					this._keyEvent( "previous", event );
       
  2853 					break;
       
  2854 				case keyCode.DOWN:
       
  2855 					suppressKeyPress = true;
       
  2856 					this._keyEvent( "next", event );
       
  2857 					break;
       
  2858 				case keyCode.ENTER:
       
  2859 					// when menu is open and has focus
       
  2860 					if ( this.menu.active ) {
       
  2861 						// #6055 - Opera still allows the keypress to occur
       
  2862 						// which causes forms to submit
       
  2863 						suppressKeyPress = true;
       
  2864 						event.preventDefault();
       
  2865 						this.menu.select( event );
       
  2866 					}
       
  2867 					break;
       
  2868 				case keyCode.TAB:
       
  2869 					if ( this.menu.active ) {
       
  2870 						this.menu.select( event );
       
  2871 					}
       
  2872 					break;
       
  2873 				case keyCode.ESCAPE:
       
  2874 					if ( this.menu.element.is( ":visible" ) ) {
       
  2875 						if ( !this.isMultiLine ) {
       
  2876 							this._value( this.term );
       
  2877 						}
       
  2878 						this.close( event );
       
  2879 						// Different browsers have different default behavior for escape
       
  2880 						// Single press can mean undo or clear
       
  2881 						// Double press in IE means clear the whole form
       
  2882 						event.preventDefault();
       
  2883 					}
       
  2884 					break;
       
  2885 				default:
       
  2886 					suppressKeyPressRepeat = true;
       
  2887 					// search timeout should be triggered before the input value is changed
       
  2888 					this._searchTimeout( event );
       
  2889 					break;
       
  2890 				}
       
  2891 			},
       
  2892 			keypress: function( event ) {
       
  2893 				if ( suppressKeyPress ) {
       
  2894 					suppressKeyPress = false;
       
  2895 					if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
       
  2896 						event.preventDefault();
       
  2897 					}
       
  2898 					return;
       
  2899 				}
       
  2900 				if ( suppressKeyPressRepeat ) {
       
  2901 					return;
       
  2902 				}
       
  2903 
       
  2904 				// replicate some key handlers to allow them to repeat in Firefox and Opera
       
  2905 				var keyCode = $.ui.keyCode;
       
  2906 				switch ( event.keyCode ) {
       
  2907 				case keyCode.PAGE_UP:
       
  2908 					this._move( "previousPage", event );
       
  2909 					break;
       
  2910 				case keyCode.PAGE_DOWN:
       
  2911 					this._move( "nextPage", event );
       
  2912 					break;
       
  2913 				case keyCode.UP:
       
  2914 					this._keyEvent( "previous", event );
       
  2915 					break;
       
  2916 				case keyCode.DOWN:
       
  2917 					this._keyEvent( "next", event );
       
  2918 					break;
       
  2919 				}
       
  2920 			},
       
  2921 			input: function( event ) {
       
  2922 				if ( suppressInput ) {
       
  2923 					suppressInput = false;
       
  2924 					event.preventDefault();
       
  2925 					return;
       
  2926 				}
       
  2927 				this._searchTimeout( event );
       
  2928 			},
       
  2929 			focus: function() {
       
  2930 				this.selectedItem = null;
       
  2931 				this.previous = this._value();
       
  2932 			},
       
  2933 			blur: function( event ) {
       
  2934 				if ( this.cancelBlur ) {
       
  2935 					delete this.cancelBlur;
       
  2936 					return;
       
  2937 				}
       
  2938 
       
  2939 				clearTimeout( this.searching );
       
  2940 				this.close( event );
       
  2941 				this._change( event );
       
  2942 			}
       
  2943 		});
       
  2944 
       
  2945 		this._initSource();
       
  2946 		this.menu = $( "<ul>" )
       
  2947 			.addClass( "ui-autocomplete ui-front" )
       
  2948 			.appendTo( this._appendTo() )
       
  2949 			.menu({
       
  2950 				// disable ARIA support, the live region takes care of that
       
  2951 				role: null
       
  2952 			})
       
  2953 			.hide()
       
  2954 			.menu( "instance" );
       
  2955 
       
  2956 		this._on( this.menu.element, {
       
  2957 			mousedown: function( event ) {
       
  2958 				// prevent moving focus out of the text field
       
  2959 				event.preventDefault();
       
  2960 
       
  2961 				// IE doesn't prevent moving focus even with event.preventDefault()
       
  2962 				// so we set a flag to know when we should ignore the blur event
       
  2963 				this.cancelBlur = true;
       
  2964 				this._delay(function() {
       
  2965 					delete this.cancelBlur;
       
  2966 				});
       
  2967 
       
  2968 				// clicking on the scrollbar causes focus to shift to the body
       
  2969 				// but we can't detect a mouseup or a click immediately afterward
       
  2970 				// so we have to track the next mousedown and close the menu if
       
  2971 				// the user clicks somewhere outside of the autocomplete
       
  2972 				var menuElement = this.menu.element[ 0 ];
       
  2973 				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
       
  2974 					this._delay(function() {
       
  2975 						var that = this;
       
  2976 						this.document.one( "mousedown", function( event ) {
       
  2977 							if ( event.target !== that.element[ 0 ] &&
       
  2978 									event.target !== menuElement &&
       
  2979 									!$.contains( menuElement, event.target ) ) {
       
  2980 								that.close();
       
  2981 							}
       
  2982 						});
       
  2983 					});
       
  2984 				}
       
  2985 			},
       
  2986 			menufocus: function( event, ui ) {
       
  2987 				var label, item;
       
  2988 				// support: Firefox
       
  2989 				// Prevent accidental activation of menu items in Firefox (#7024 #9118)
       
  2990 				if ( this.isNewMenu ) {
       
  2991 					this.isNewMenu = false;
       
  2992 					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
       
  2993 						this.menu.blur();
       
  2994 
       
  2995 						this.document.one( "mousemove", function() {
       
  2996 							$( event.target ).trigger( event.originalEvent );
       
  2997 						});
       
  2998 
       
  2999 						return;
       
  3000 					}
       
  3001 				}
       
  3002 
       
  3003 				item = ui.item.data( "ui-autocomplete-item" );
       
  3004 				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
       
  3005 					// use value to match what will end up in the input, if it was a key event
       
  3006 					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
       
  3007 						this._value( item.value );
       
  3008 					}
       
  3009 				}
       
  3010 
       
  3011 				// Announce the value in the liveRegion
       
  3012 				label = ui.item.attr( "aria-label" ) || item.value;
       
  3013 				if ( label && $.trim( label ).length ) {
       
  3014 					this.liveRegion.children().hide();
       
  3015 					$( "<div>" ).text( label ).appendTo( this.liveRegion );
       
  3016 				}
       
  3017 			},
       
  3018 			menuselect: function( event, ui ) {
       
  3019 				var item = ui.item.data( "ui-autocomplete-item" ),
       
  3020 					previous = this.previous;
       
  3021 
       
  3022 				// only trigger when focus was lost (click on menu)
       
  3023 				if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
       
  3024 					this.element.focus();
       
  3025 					this.previous = previous;
       
  3026 					// #6109 - IE triggers two focus events and the second
       
  3027 					// is asynchronous, so we need to reset the previous
       
  3028 					// term synchronously and asynchronously :-(
       
  3029 					this._delay(function() {
       
  3030 						this.previous = previous;
       
  3031 						this.selectedItem = item;
       
  3032 					});
       
  3033 				}
       
  3034 
       
  3035 				if ( false !== this._trigger( "select", event, { item: item } ) ) {
       
  3036 					this._value( item.value );
       
  3037 				}
       
  3038 				// reset the term after the select event
       
  3039 				// this allows custom select handling to work properly
       
  3040 				this.term = this._value();
       
  3041 
       
  3042 				this.close( event );
       
  3043 				this.selectedItem = item;
       
  3044 			}
       
  3045 		});
       
  3046 
       
  3047 		this.liveRegion = $( "<span>", {
       
  3048 				role: "status",
       
  3049 				"aria-live": "assertive",
       
  3050 				"aria-relevant": "additions"
       
  3051 			})
       
  3052 			.addClass( "ui-helper-hidden-accessible" )
       
  3053 			.appendTo( this.document[ 0 ].body );
       
  3054 
       
  3055 		// turning off autocomplete prevents the browser from remembering the
       
  3056 		// value when navigating through history, so we re-enable autocomplete
       
  3057 		// if the page is unloaded before the widget is destroyed. #7790
       
  3058 		this._on( this.window, {
       
  3059 			beforeunload: function() {
       
  3060 				this.element.removeAttr( "autocomplete" );
       
  3061 			}
       
  3062 		});
       
  3063 	},
       
  3064 
       
  3065 	_destroy: function() {
       
  3066 		clearTimeout( this.searching );
       
  3067 		this.element
       
  3068 			.removeClass( "ui-autocomplete-input" )
       
  3069 			.removeAttr( "autocomplete" );
       
  3070 		this.menu.element.remove();
       
  3071 		this.liveRegion.remove();
       
  3072 	},
       
  3073 
       
  3074 	_setOption: function( key, value ) {
       
  3075 		this._super( key, value );
       
  3076 		if ( key === "source" ) {
       
  3077 			this._initSource();
       
  3078 		}
       
  3079 		if ( key === "appendTo" ) {
       
  3080 			this.menu.element.appendTo( this._appendTo() );
       
  3081 		}
       
  3082 		if ( key === "disabled" && value && this.xhr ) {
       
  3083 			this.xhr.abort();
       
  3084 		}
       
  3085 	},
       
  3086 
       
  3087 	_appendTo: function() {
       
  3088 		var element = this.options.appendTo;
       
  3089 
       
  3090 		if ( element ) {
       
  3091 			element = element.jquery || element.nodeType ?
       
  3092 				$( element ) :
       
  3093 				this.document.find( element ).eq( 0 );
       
  3094 		}
       
  3095 
       
  3096 		if ( !element || !element[ 0 ] ) {
       
  3097 			element = this.element.closest( ".ui-front" );
       
  3098 		}
       
  3099 
       
  3100 		if ( !element.length ) {
       
  3101 			element = this.document[ 0 ].body;
       
  3102 		}
       
  3103 
       
  3104 		return element;
       
  3105 	},
       
  3106 
       
  3107 	_initSource: function() {
       
  3108 		var array, url,
       
  3109 			that = this;
       
  3110 		if ( $.isArray( this.options.source ) ) {
       
  3111 			array = this.options.source;
       
  3112 			this.source = function( request, response ) {
       
  3113 				response( $.ui.autocomplete.filter( array, request.term ) );
       
  3114 			};
       
  3115 		} else if ( typeof this.options.source === "string" ) {
       
  3116 			url = this.options.source;
       
  3117 			this.source = function( request, response ) {
       
  3118 				if ( that.xhr ) {
       
  3119 					that.xhr.abort();
       
  3120 				}
       
  3121 				that.xhr = $.ajax({
       
  3122 					url: url,
       
  3123 					data: request,
       
  3124 					dataType: "json",
       
  3125 					success: function( data ) {
       
  3126 						response( data );
       
  3127 					},
       
  3128 					error: function() {
       
  3129 						response([]);
       
  3130 					}
       
  3131 				});
       
  3132 			};
       
  3133 		} else {
       
  3134 			this.source = this.options.source;
       
  3135 		}
       
  3136 	},
       
  3137 
       
  3138 	_searchTimeout: function( event ) {
       
  3139 		clearTimeout( this.searching );
       
  3140 		this.searching = this._delay(function() {
       
  3141 
       
  3142 			// Search if the value has changed, or if the user retypes the same value (see #7434)
       
  3143 			var equalValues = this.term === this._value(),
       
  3144 				menuVisible = this.menu.element.is( ":visible" ),
       
  3145 				modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
       
  3146 
       
  3147 			if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
       
  3148 				this.selectedItem = null;
       
  3149 				this.search( null, event );
       
  3150 			}
       
  3151 		}, this.options.delay );
       
  3152 	},
       
  3153 
       
  3154 	search: function( value, event ) {
       
  3155 		value = value != null ? value : this._value();
       
  3156 
       
  3157 		// always save the actual value, not the one passed as an argument
       
  3158 		this.term = this._value();
       
  3159 
       
  3160 		if ( value.length < this.options.minLength ) {
       
  3161 			return this.close( event );
       
  3162 		}
       
  3163 
       
  3164 		if ( this._trigger( "search", event ) === false ) {
       
  3165 			return;
       
  3166 		}
       
  3167 
       
  3168 		return this._search( value );
       
  3169 	},
       
  3170 
       
  3171 	_search: function( value ) {
       
  3172 		this.pending++;
       
  3173 		this.element.addClass( "ui-autocomplete-loading" );
       
  3174 		this.cancelSearch = false;
       
  3175 
       
  3176 		this.source( { term: value }, this._response() );
       
  3177 	},
       
  3178 
       
  3179 	_response: function() {
       
  3180 		var index = ++this.requestIndex;
       
  3181 
       
  3182 		return $.proxy(function( content ) {
       
  3183 			if ( index === this.requestIndex ) {
       
  3184 				this.__response( content );
       
  3185 			}
       
  3186 
       
  3187 			this.pending--;
       
  3188 			if ( !this.pending ) {
       
  3189 				this.element.removeClass( "ui-autocomplete-loading" );
       
  3190 			}
       
  3191 		}, this );
       
  3192 	},
       
  3193 
       
  3194 	__response: function( content ) {
       
  3195 		if ( content ) {
       
  3196 			content = this._normalize( content );
       
  3197 		}
       
  3198 		this._trigger( "response", null, { content: content } );
       
  3199 		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
       
  3200 			this._suggest( content );
       
  3201 			this._trigger( "open" );
       
  3202 		} else {
       
  3203 			// use ._close() instead of .close() so we don't cancel future searches
       
  3204 			this._close();
       
  3205 		}
       
  3206 	},
       
  3207 
       
  3208 	close: function( event ) {
       
  3209 		this.cancelSearch = true;
       
  3210 		this._close( event );
       
  3211 	},
       
  3212 
       
  3213 	_close: function( event ) {
       
  3214 		if ( this.menu.element.is( ":visible" ) ) {
       
  3215 			this.menu.element.hide();
       
  3216 			this.menu.blur();
       
  3217 			this.isNewMenu = true;
       
  3218 			this._trigger( "close", event );
       
  3219 		}
       
  3220 	},
       
  3221 
       
  3222 	_change: function( event ) {
       
  3223 		if ( this.previous !== this._value() ) {
       
  3224 			this._trigger( "change", event, { item: this.selectedItem } );
       
  3225 		}
       
  3226 	},
       
  3227 
       
  3228 	_normalize: function( items ) {
       
  3229 		// assume all items have the right format when the first item is complete
       
  3230 		if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
       
  3231 			return items;
       
  3232 		}
       
  3233 		return $.map( items, function( item ) {
       
  3234 			if ( typeof item === "string" ) {
       
  3235 				return {
       
  3236 					label: item,
       
  3237 					value: item
       
  3238 				};
       
  3239 			}
       
  3240 			return $.extend( {}, item, {
       
  3241 				label: item.label || item.value,
       
  3242 				value: item.value || item.label
       
  3243 			});
       
  3244 		});
       
  3245 	},
       
  3246 
       
  3247 	_suggest: function( items ) {
       
  3248 		var ul = this.menu.element.empty();
       
  3249 		this._renderMenu( ul, items );
       
  3250 		this.isNewMenu = true;
       
  3251 		this.menu.refresh();
       
  3252 
       
  3253 		// size and position menu
       
  3254 		ul.show();
       
  3255 		this._resizeMenu();
       
  3256 		ul.position( $.extend({
       
  3257 			of: this.element
       
  3258 		}, this.options.position ) );
       
  3259 
       
  3260 		if ( this.options.autoFocus ) {
       
  3261 			this.menu.next();
       
  3262 		}
       
  3263 	},
       
  3264 
       
  3265 	_resizeMenu: function() {
       
  3266 		var ul = this.menu.element;
       
  3267 		ul.outerWidth( Math.max(
       
  3268 			// Firefox wraps long text (possibly a rounding bug)
       
  3269 			// so we add 1px to avoid the wrapping (#7513)
       
  3270 			ul.width( "" ).outerWidth() + 1,
       
  3271 			this.element.outerWidth()
       
  3272 		) );
       
  3273 	},
       
  3274 
       
  3275 	_renderMenu: function( ul, items ) {
       
  3276 		var that = this;
       
  3277 		$.each( items, function( index, item ) {
       
  3278 			that._renderItemData( ul, item );
       
  3279 		});
       
  3280 	},
       
  3281 
       
  3282 	_renderItemData: function( ul, item ) {
       
  3283 		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
       
  3284 	},
       
  3285 
       
  3286 	_renderItem: function( ul, item ) {
       
  3287 		return $( "<li>" ).text( item.label ).appendTo( ul );
       
  3288 	},
       
  3289 
       
  3290 	_move: function( direction, event ) {
       
  3291 		if ( !this.menu.element.is( ":visible" ) ) {
       
  3292 			this.search( null, event );
       
  3293 			return;
       
  3294 		}
       
  3295 		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
       
  3296 				this.menu.isLastItem() && /^next/.test( direction ) ) {
       
  3297 
       
  3298 			if ( !this.isMultiLine ) {
       
  3299 				this._value( this.term );
       
  3300 			}
       
  3301 
       
  3302 			this.menu.blur();
       
  3303 			return;
       
  3304 		}
       
  3305 		this.menu[ direction ]( event );
       
  3306 	},
       
  3307 
       
  3308 	widget: function() {
       
  3309 		return this.menu.element;
       
  3310 	},
       
  3311 
       
  3312 	_value: function() {
       
  3313 		return this.valueMethod.apply( this.element, arguments );
       
  3314 	},
       
  3315 
       
  3316 	_keyEvent: function( keyEvent, event ) {
       
  3317 		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
       
  3318 			this._move( keyEvent, event );
       
  3319 
       
  3320 			// prevents moving cursor to beginning/end of the text field in some browsers
       
  3321 			event.preventDefault();
       
  3322 		}
       
  3323 	}
       
  3324 });
       
  3325 
       
  3326 $.extend( $.ui.autocomplete, {
       
  3327 	escapeRegex: function( value ) {
       
  3328 		return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
       
  3329 	},
       
  3330 	filter: function( array, term ) {
       
  3331 		var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
       
  3332 		return $.grep( array, function( value ) {
       
  3333 			return matcher.test( value.label || value.value || value );
       
  3334 		});
       
  3335 	}
       
  3336 });
       
  3337 
       
  3338 // live region extension, adding a `messages` option
       
  3339 // NOTE: This is an experimental API. We are still investigating
       
  3340 // a full solution for string manipulation and internationalization.
       
  3341 $.widget( "ui.autocomplete", $.ui.autocomplete, {
       
  3342 	options: {
       
  3343 		messages: {
       
  3344 			noResults: "No search results.",
       
  3345 			results: function( amount ) {
       
  3346 				return amount + ( amount > 1 ? " results are" : " result is" ) +
       
  3347 					" available, use up and down arrow keys to navigate.";
       
  3348 			}
       
  3349 		}
       
  3350 	},
       
  3351 
       
  3352 	__response: function( content ) {
       
  3353 		var message;
       
  3354 		this._superApply( arguments );
       
  3355 		if ( this.options.disabled || this.cancelSearch ) {
       
  3356 			return;
       
  3357 		}
       
  3358 		if ( content && content.length ) {
       
  3359 			message = this.options.messages.results( content.length );
       
  3360 		} else {
       
  3361 			message = this.options.messages.noResults;
       
  3362 		}
       
  3363 		this.liveRegion.children().hide();
       
  3364 		$( "<div>" ).text( message ).appendTo( this.liveRegion );
       
  3365 	}
       
  3366 });
       
  3367 
       
  3368 var autocomplete = $.ui.autocomplete;
       
  3369 
       
  3370 
       
  3371 /*!
       
  3372  * jQuery UI Button 1.11.4
       
  3373  * http://jqueryui.com
       
  3374  *
       
  3375  * Copyright jQuery Foundation and other contributors
       
  3376  * Released under the MIT license.
       
  3377  * http://jquery.org/license
       
  3378  *
       
  3379  * http://api.jqueryui.com/button/
       
  3380  */
       
  3381 
       
  3382 
       
  3383 var lastActive,
       
  3384 	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
       
  3385 	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
       
  3386 	formResetHandler = function() {
       
  3387 		var form = $( this );
       
  3388 		setTimeout(function() {
       
  3389 			form.find( ":ui-button" ).button( "refresh" );
       
  3390 		}, 1 );
       
  3391 	},
       
  3392 	radioGroup = function( radio ) {
       
  3393 		var name = radio.name,
       
  3394 			form = radio.form,
       
  3395 			radios = $( [] );
       
  3396 		if ( name ) {
       
  3397 			name = name.replace( /'/g, "\\'" );
       
  3398 			if ( form ) {
       
  3399 				radios = $( form ).find( "[name='" + name + "'][type=radio]" );
       
  3400 			} else {
       
  3401 				radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument )
       
  3402 					.filter(function() {
       
  3403 						return !this.form;
       
  3404 					});
       
  3405 			}
       
  3406 		}
       
  3407 		return radios;
       
  3408 	};
       
  3409 
       
  3410 $.widget( "ui.button", {
       
  3411 	version: "1.11.4",
       
  3412 	defaultElement: "<button>",
       
  3413 	options: {
       
  3414 		disabled: null,
       
  3415 		text: true,
       
  3416 		label: null,
       
  3417 		icons: {
       
  3418 			primary: null,
       
  3419 			secondary: null
       
  3420 		}
       
  3421 	},
       
  3422 	_create: function() {
       
  3423 		this.element.closest( "form" )
       
  3424 			.unbind( "reset" + this.eventNamespace )
       
  3425 			.bind( "reset" + this.eventNamespace, formResetHandler );
       
  3426 
       
  3427 		if ( typeof this.options.disabled !== "boolean" ) {
       
  3428 			this.options.disabled = !!this.element.prop( "disabled" );
       
  3429 		} else {
       
  3430 			this.element.prop( "disabled", this.options.disabled );
       
  3431 		}
       
  3432 
       
  3433 		this._determineButtonType();
       
  3434 		this.hasTitle = !!this.buttonElement.attr( "title" );
       
  3435 
       
  3436 		var that = this,
       
  3437 			options = this.options,
       
  3438 			toggleButton = this.type === "checkbox" || this.type === "radio",
       
  3439 			activeClass = !toggleButton ? "ui-state-active" : "";
       
  3440 
       
  3441 		if ( options.label === null ) {
       
  3442 			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
       
  3443 		}
       
  3444 
       
  3445 		this._hoverable( this.buttonElement );
       
  3446 
       
  3447 		this.buttonElement
       
  3448 			.addClass( baseClasses )
       
  3449 			.attr( "role", "button" )
       
  3450 			.bind( "mouseenter" + this.eventNamespace, function() {
       
  3451 				if ( options.disabled ) {
       
  3452 					return;
       
  3453 				}
       
  3454 				if ( this === lastActive ) {
       
  3455 					$( this ).addClass( "ui-state-active" );
       
  3456 				}
       
  3457 			})
       
  3458 			.bind( "mouseleave" + this.eventNamespace, function() {
       
  3459 				if ( options.disabled ) {
       
  3460 					return;
       
  3461 				}
       
  3462 				$( this ).removeClass( activeClass );
       
  3463 			})
       
  3464 			.bind( "click" + this.eventNamespace, function( event ) {
       
  3465 				if ( options.disabled ) {
       
  3466 					event.preventDefault();
       
  3467 					event.stopImmediatePropagation();
       
  3468 				}
       
  3469 			});
       
  3470 
       
  3471 		// Can't use _focusable() because the element that receives focus
       
  3472 		// and the element that gets the ui-state-focus class are different
       
  3473 		this._on({
       
  3474 			focus: function() {
       
  3475 				this.buttonElement.addClass( "ui-state-focus" );
       
  3476 			},
       
  3477 			blur: function() {
       
  3478 				this.buttonElement.removeClass( "ui-state-focus" );
       
  3479 			}
       
  3480 		});
       
  3481 
       
  3482 		if ( toggleButton ) {
       
  3483 			this.element.bind( "change" + this.eventNamespace, function() {
       
  3484 				that.refresh();
       
  3485 			});
       
  3486 		}
       
  3487 
       
  3488 		if ( this.type === "checkbox" ) {
       
  3489 			this.buttonElement.bind( "click" + this.eventNamespace, function() {
       
  3490 				if ( options.disabled ) {
       
  3491 					return false;
       
  3492 				}
       
  3493 			});
       
  3494 		} else if ( this.type === "radio" ) {
       
  3495 			this.buttonElement.bind( "click" + this.eventNamespace, function() {
       
  3496 				if ( options.disabled ) {
       
  3497 					return false;
       
  3498 				}
       
  3499 				$( this ).addClass( "ui-state-active" );
       
  3500 				that.buttonElement.attr( "aria-pressed", "true" );
       
  3501 
       
  3502 				var radio = that.element[ 0 ];
       
  3503 				radioGroup( radio )
       
  3504 					.not( radio )
       
  3505 					.map(function() {
       
  3506 						return $( this ).button( "widget" )[ 0 ];
       
  3507 					})
       
  3508 					.removeClass( "ui-state-active" )
       
  3509 					.attr( "aria-pressed", "false" );
       
  3510 			});
       
  3511 		} else {
       
  3512 			this.buttonElement
       
  3513 				.bind( "mousedown" + this.eventNamespace, function() {
       
  3514 					if ( options.disabled ) {
       
  3515 						return false;
       
  3516 					}
       
  3517 					$( this ).addClass( "ui-state-active" );
       
  3518 					lastActive = this;
       
  3519 					that.document.one( "mouseup", function() {
       
  3520 						lastActive = null;
       
  3521 					});
       
  3522 				})
       
  3523 				.bind( "mouseup" + this.eventNamespace, function() {
       
  3524 					if ( options.disabled ) {
       
  3525 						return false;
       
  3526 					}
       
  3527 					$( this ).removeClass( "ui-state-active" );
       
  3528 				})
       
  3529 				.bind( "keydown" + this.eventNamespace, function(event) {
       
  3530 					if ( options.disabled ) {
       
  3531 						return false;
       
  3532 					}
       
  3533 					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
       
  3534 						$( this ).addClass( "ui-state-active" );
       
  3535 					}
       
  3536 				})
       
  3537 				// see #8559, we bind to blur here in case the button element loses
       
  3538 				// focus between keydown and keyup, it would be left in an "active" state
       
  3539 				.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
       
  3540 					$( this ).removeClass( "ui-state-active" );
       
  3541 				});
       
  3542 
       
  3543 			if ( this.buttonElement.is("a") ) {
       
  3544 				this.buttonElement.keyup(function(event) {
       
  3545 					if ( event.keyCode === $.ui.keyCode.SPACE ) {
       
  3546 						// TODO pass through original event correctly (just as 2nd argument doesn't work)
       
  3547 						$( this ).click();
       
  3548 					}
       
  3549 				});
       
  3550 			}
       
  3551 		}
       
  3552 
       
  3553 		this._setOption( "disabled", options.disabled );
       
  3554 		this._resetButton();
       
  3555 	},
       
  3556 
       
  3557 	_determineButtonType: function() {
       
  3558 		var ancestor, labelSelector, checked;
       
  3559 
       
  3560 		if ( this.element.is("[type=checkbox]") ) {
       
  3561 			this.type = "checkbox";
       
  3562 		} else if ( this.element.is("[type=radio]") ) {
       
  3563 			this.type = "radio";
       
  3564 		} else if ( this.element.is("input") ) {
       
  3565 			this.type = "input";
       
  3566 		} else {
       
  3567 			this.type = "button";
       
  3568 		}
       
  3569 
       
  3570 		if ( this.type === "checkbox" || this.type === "radio" ) {
       
  3571 			// we don't search against the document in case the element
       
  3572 			// is disconnected from the DOM
       
  3573 			ancestor = this.element.parents().last();
       
  3574 			labelSelector = "label[for='" + this.element.attr("id") + "']";
       
  3575 			this.buttonElement = ancestor.find( labelSelector );
       
  3576 			if ( !this.buttonElement.length ) {
       
  3577 				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
       
  3578 				this.buttonElement = ancestor.filter( labelSelector );
       
  3579 				if ( !this.buttonElement.length ) {
       
  3580 					this.buttonElement = ancestor.find( labelSelector );
       
  3581 				}
       
  3582 			}
       
  3583 			this.element.addClass( "ui-helper-hidden-accessible" );
       
  3584 
       
  3585 			checked = this.element.is( ":checked" );
       
  3586 			if ( checked ) {
       
  3587 				this.buttonElement.addClass( "ui-state-active" );
       
  3588 			}
       
  3589 			this.buttonElement.prop( "aria-pressed", checked );
       
  3590 		} else {
       
  3591 			this.buttonElement = this.element;
       
  3592 		}
       
  3593 	},
       
  3594 
       
  3595 	widget: function() {
       
  3596 		return this.buttonElement;
       
  3597 	},
       
  3598 
       
  3599 	_destroy: function() {
       
  3600 		this.element
       
  3601 			.removeClass( "ui-helper-hidden-accessible" );
       
  3602 		this.buttonElement
       
  3603 			.removeClass( baseClasses + " ui-state-active " + typeClasses )
       
  3604 			.removeAttr( "role" )
       
  3605 			.removeAttr( "aria-pressed" )
       
  3606 			.html( this.buttonElement.find(".ui-button-text").html() );
       
  3607 
       
  3608 		if ( !this.hasTitle ) {
       
  3609 			this.buttonElement.removeAttr( "title" );
       
  3610 		}
       
  3611 	},
       
  3612 
       
  3613 	_setOption: function( key, value ) {
       
  3614 		this._super( key, value );
       
  3615 		if ( key === "disabled" ) {
       
  3616 			this.widget().toggleClass( "ui-state-disabled", !!value );
       
  3617 			this.element.prop( "disabled", !!value );
       
  3618 			if ( value ) {
       
  3619 				if ( this.type === "checkbox" || this.type === "radio" ) {
       
  3620 					this.buttonElement.removeClass( "ui-state-focus" );
       
  3621 				} else {
       
  3622 					this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
       
  3623 				}
       
  3624 			}
       
  3625 			return;
       
  3626 		}
       
  3627 		this._resetButton();
       
  3628 	},
       
  3629 
       
  3630 	refresh: function() {
       
  3631 		//See #8237 & #8828
       
  3632 		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
       
  3633 
       
  3634 		if ( isDisabled !== this.options.disabled ) {
       
  3635 			this._setOption( "disabled", isDisabled );
       
  3636 		}
       
  3637 		if ( this.type === "radio" ) {
       
  3638 			radioGroup( this.element[0] ).each(function() {
       
  3639 				if ( $( this ).is( ":checked" ) ) {
       
  3640 					$( this ).button( "widget" )
       
  3641 						.addClass( "ui-state-active" )
       
  3642 						.attr( "aria-pressed", "true" );
       
  3643 				} else {
       
  3644 					$( this ).button( "widget" )
       
  3645 						.removeClass( "ui-state-active" )
       
  3646 						.attr( "aria-pressed", "false" );
       
  3647 				}
       
  3648 			});
       
  3649 		} else if ( this.type === "checkbox" ) {
       
  3650 			if ( this.element.is( ":checked" ) ) {
       
  3651 				this.buttonElement
       
  3652 					.addClass( "ui-state-active" )
       
  3653 					.attr( "aria-pressed", "true" );
       
  3654 			} else {
       
  3655 				this.buttonElement
       
  3656 					.removeClass( "ui-state-active" )
       
  3657 					.attr( "aria-pressed", "false" );
       
  3658 			}
       
  3659 		}
       
  3660 	},
       
  3661 
       
  3662 	_resetButton: function() {
       
  3663 		if ( this.type === "input" ) {
       
  3664 			if ( this.options.label ) {
       
  3665 				this.element.val( this.options.label );
       
  3666 			}
       
  3667 			return;
       
  3668 		}
       
  3669 		var buttonElement = this.buttonElement.removeClass( typeClasses ),
       
  3670 			buttonText = $( "<span></span>", this.document[0] )
       
  3671 				.addClass( "ui-button-text" )
       
  3672 				.html( this.options.label )
       
  3673 				.appendTo( buttonElement.empty() )
       
  3674 				.text(),
       
  3675 			icons = this.options.icons,
       
  3676 			multipleIcons = icons.primary && icons.secondary,
       
  3677 			buttonClasses = [];
       
  3678 
       
  3679 		if ( icons.primary || icons.secondary ) {
       
  3680 			if ( this.options.text ) {
       
  3681 				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
       
  3682 			}
       
  3683 
       
  3684 			if ( icons.primary ) {
       
  3685 				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
       
  3686 			}
       
  3687 
       
  3688 			if ( icons.secondary ) {
       
  3689 				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
       
  3690 			}
       
  3691 
       
  3692 			if ( !this.options.text ) {
       
  3693 				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
       
  3694 
       
  3695 				if ( !this.hasTitle ) {
       
  3696 					buttonElement.attr( "title", $.trim( buttonText ) );
       
  3697 				}
       
  3698 			}
       
  3699 		} else {
       
  3700 			buttonClasses.push( "ui-button-text-only" );
       
  3701 		}
       
  3702 		buttonElement.addClass( buttonClasses.join( " " ) );
       
  3703 	}
       
  3704 });
       
  3705 
       
  3706 $.widget( "ui.buttonset", {
       
  3707 	version: "1.11.4",
       
  3708 	options: {
       
  3709 		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
       
  3710 	},
       
  3711 
       
  3712 	_create: function() {
       
  3713 		this.element.addClass( "ui-buttonset" );
       
  3714 	},
       
  3715 
       
  3716 	_init: function() {
       
  3717 		this.refresh();
       
  3718 	},
       
  3719 
       
  3720 	_setOption: function( key, value ) {
       
  3721 		if ( key === "disabled" ) {
       
  3722 			this.buttons.button( "option", key, value );
       
  3723 		}
       
  3724 
       
  3725 		this._super( key, value );
       
  3726 	},
       
  3727 
       
  3728 	refresh: function() {
       
  3729 		var rtl = this.element.css( "direction" ) === "rtl",
       
  3730 			allButtons = this.element.find( this.options.items ),
       
  3731 			existingButtons = allButtons.filter( ":ui-button" );
       
  3732 
       
  3733 		// Initialize new buttons
       
  3734 		allButtons.not( ":ui-button" ).button();
       
  3735 
       
  3736 		// Refresh existing buttons
       
  3737 		existingButtons.button( "refresh" );
       
  3738 
       
  3739 		this.buttons = allButtons
       
  3740 			.map(function() {
       
  3741 				return $( this ).button( "widget" )[ 0 ];
       
  3742 			})
       
  3743 				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
       
  3744 				.filter( ":first" )
       
  3745 					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
       
  3746 				.end()
       
  3747 				.filter( ":last" )
       
  3748 					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
       
  3749 				.end()
       
  3750 			.end();
       
  3751 	},
       
  3752 
       
  3753 	_destroy: function() {
       
  3754 		this.element.removeClass( "ui-buttonset" );
       
  3755 		this.buttons
       
  3756 			.map(function() {
       
  3757 				return $( this ).button( "widget" )[ 0 ];
       
  3758 			})
       
  3759 				.removeClass( "ui-corner-left ui-corner-right" )
       
  3760 			.end()
       
  3761 			.button( "destroy" );
       
  3762 	}
       
  3763 });
       
  3764 
       
  3765 var button = $.ui.button;
       
  3766 
       
  3767 
       
  3768 /*!
       
  3769  * jQuery UI Datepicker 1.11.4
       
  3770  * http://jqueryui.com
       
  3771  *
       
  3772  * Copyright jQuery Foundation and other contributors
       
  3773  * Released under the MIT license.
       
  3774  * http://jquery.org/license
       
  3775  *
       
  3776  * http://api.jqueryui.com/datepicker/
       
  3777  */
       
  3778 
       
  3779 
       
  3780 $.extend($.ui, { datepicker: { version: "1.11.4" } });
       
  3781 
       
  3782 var datepicker_instActive;
       
  3783 
       
  3784 function datepicker_getZindex( elem ) {
       
  3785 	var position, value;
       
  3786 	while ( elem.length && elem[ 0 ] !== document ) {
       
  3787 		// Ignore z-index if position is set to a value where z-index is ignored by the browser
       
  3788 		// This makes behavior of this function consistent across browsers
       
  3789 		// WebKit always returns auto if the element is positioned
       
  3790 		position = elem.css( "position" );
       
  3791 		if ( position === "absolute" || position === "relative" || position === "fixed" ) {
       
  3792 			// IE returns 0 when zIndex is not specified
       
  3793 			// other browsers return a string
       
  3794 			// we ignore the case of nested elements with an explicit value of 0
       
  3795 			// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
       
  3796 			value = parseInt( elem.css( "zIndex" ), 10 );
       
  3797 			if ( !isNaN( value ) && value !== 0 ) {
       
  3798 				return value;
       
  3799 			}
       
  3800 		}
       
  3801 		elem = elem.parent();
       
  3802 	}
       
  3803 
       
  3804 	return 0;
       
  3805 }
       
  3806 /* Date picker manager.
       
  3807    Use the singleton instance of this class, $.datepicker, to interact with the date picker.
       
  3808    Settings for (groups of) date pickers are maintained in an instance object,
       
  3809    allowing multiple different settings on the same page. */
       
  3810 
       
  3811 function Datepicker() {
       
  3812 	this._curInst = null; // The current instance in use
       
  3813 	this._keyEvent = false; // If the last event was a key event
       
  3814 	this._disabledInputs = []; // List of date picker inputs that have been disabled
       
  3815 	this._datepickerShowing = false; // True if the popup picker is showing , false if not
       
  3816 	this._inDialog = false; // True if showing within a "dialog", false if not
       
  3817 	this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
       
  3818 	this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
       
  3819 	this._appendClass = "ui-datepicker-append"; // The name of the append marker class
       
  3820 	this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
       
  3821 	this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
       
  3822 	this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
       
  3823 	this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
       
  3824 	this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
       
  3825 	this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
       
  3826 	this.regional = []; // Available regional settings, indexed by language code
       
  3827 	this.regional[""] = { // Default regional settings
       
  3828 		closeText: "Done", // Display text for close link
       
  3829 		prevText: "Prev", // Display text for previous month link
       
  3830 		nextText: "Next", // Display text for next month link
       
  3831 		currentText: "Today", // Display text for current month link
       
  3832 		monthNames: ["January","February","March","April","May","June",
       
  3833 			"July","August","September","October","November","December"], // Names of months for drop-down and formatting
       
  3834 		monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
       
  3835 		dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
       
  3836 		dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
       
  3837 		dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
       
  3838 		weekHeader: "Wk", // Column header for week of the year
       
  3839 		dateFormat: "mm/dd/yy", // See format options on parseDate
       
  3840 		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
       
  3841 		isRTL: false, // True if right-to-left language, false if left-to-right
       
  3842 		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
       
  3843 		yearSuffix: "" // Additional text to append to the year in the month headers
       
  3844 	};
       
  3845 	this._defaults = { // Global defaults for all the date picker instances
       
  3846 		showOn: "focus", // "focus" for popup on focus,
       
  3847 			// "button" for trigger button, or "both" for either
       
  3848 		showAnim: "fadeIn", // Name of jQuery animation for popup
       
  3849 		showOptions: {}, // Options for enhanced animations
       
  3850 		defaultDate: null, // Used when field is blank: actual date,
       
  3851 			// +/-number for offset from today, null for today
       
  3852 		appendText: "", // Display text following the input box, e.g. showing the format
       
  3853 		buttonText: "...", // Text for trigger button
       
  3854 		buttonImage: "", // URL for trigger button image
       
  3855 		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
       
  3856 		hideIfNoPrevNext: false, // True to hide next/previous month links
       
  3857 			// if not applicable, false to just disable them
       
  3858 		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
       
  3859 		gotoCurrent: false, // True if today link goes back to current selection instead
       
  3860 		changeMonth: false, // True if month can be selected directly, false if only prev/next
       
  3861 		changeYear: false, // True if year can be selected directly, false if only prev/next
       
  3862 		yearRange: "c-10:c+10", // Range of years to display in drop-down,
       
  3863 			// either relative to today's year (-nn:+nn), relative to currently displayed year
       
  3864 			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
       
  3865 		showOtherMonths: false, // True to show dates in other months, false to leave blank
       
  3866 		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
       
  3867 		showWeek: false, // True to show week of the year, false to not show it
       
  3868 		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
       
  3869 			// takes a Date and returns the number of the week for it
       
  3870 		shortYearCutoff: "+10", // Short year values < this are in the current century,
       
  3871 			// > this are in the previous century,
       
  3872 			// string value starting with "+" for current year + value
       
  3873 		minDate: null, // The earliest selectable date, or null for no limit
       
  3874 		maxDate: null, // The latest selectable date, or null for no limit
       
  3875 		duration: "fast", // Duration of display/closure
       
  3876 		beforeShowDay: null, // Function that takes a date and returns an array with
       
  3877 			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
       
  3878 			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
       
  3879 		beforeShow: null, // Function that takes an input field and
       
  3880 			// returns a set of custom settings for the date picker
       
  3881 		onSelect: null, // Define a callback function when a date is selected
       
  3882 		onChangeMonthYear: null, // Define a callback function when the month or year is changed
       
  3883 		onClose: null, // Define a callback function when the datepicker is closed
       
  3884 		numberOfMonths: 1, // Number of months to show at a time
       
  3885 		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
       
  3886 		stepMonths: 1, // Number of months to step back/forward
       
  3887 		stepBigMonths: 12, // Number of months to step back/forward for the big links
       
  3888 		altField: "", // Selector for an alternate field to store selected dates into
       
  3889 		altFormat: "", // The date format to use for the alternate field
       
  3890 		constrainInput: true, // The input is constrained by the current date format
       
  3891 		showButtonPanel: false, // True to show button panel, false to not show it
       
  3892 		autoSize: false, // True to size the input for the date format, false to leave as is
       
  3893 		disabled: false // The initial disabled state
       
  3894 	};
       
  3895 	$.extend(this._defaults, this.regional[""]);
       
  3896 	this.regional.en = $.extend( true, {}, this.regional[ "" ]);
       
  3897 	this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
       
  3898 	this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
       
  3899 }
       
  3900 
       
  3901 $.extend(Datepicker.prototype, {
       
  3902 	/* Class name added to elements to indicate already configured with a date picker. */
       
  3903 	markerClassName: "hasDatepicker",
       
  3904 
       
  3905 	//Keep track of the maximum number of rows displayed (see #7043)
       
  3906 	maxRows: 4,
       
  3907 
       
  3908 	// TODO rename to "widget" when switching to widget factory
       
  3909 	_widgetDatepicker: function() {
       
  3910 		return this.dpDiv;
       
  3911 	},
       
  3912 
       
  3913 	/* Override the default settings for all instances of the date picker.
       
  3914 	 * @param  settings  object - the new settings to use as defaults (anonymous object)
       
  3915 	 * @return the manager object
       
  3916 	 */
       
  3917 	setDefaults: function(settings) {
       
  3918 		datepicker_extendRemove(this._defaults, settings || {});
       
  3919 		return this;
       
  3920 	},
       
  3921 
       
  3922 	/* Attach the date picker to a jQuery selection.
       
  3923 	 * @param  target	element - the target input field or division or span
       
  3924 	 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
       
  3925 	 */
       
  3926 	_attachDatepicker: function(target, settings) {
       
  3927 		var nodeName, inline, inst;
       
  3928 		nodeName = target.nodeName.toLowerCase();
       
  3929 		inline = (nodeName === "div" || nodeName === "span");
       
  3930 		if (!target.id) {
       
  3931 			this.uuid += 1;
       
  3932 			target.id = "dp" + this.uuid;
       
  3933 		}
       
  3934 		inst = this._newInst($(target), inline);
       
  3935 		inst.settings = $.extend({}, settings || {});
       
  3936 		if (nodeName === "input") {
       
  3937 			this._connectDatepicker(target, inst);
       
  3938 		} else if (inline) {
       
  3939 			this._inlineDatepicker(target, inst);
       
  3940 		}
       
  3941 	},
       
  3942 
       
  3943 	/* Create a new instance object. */
       
  3944 	_newInst: function(target, inline) {
       
  3945 		var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
       
  3946 		return {id: id, input: target, // associated target
       
  3947 			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
       
  3948 			drawMonth: 0, drawYear: 0, // month being drawn
       
  3949 			inline: inline, // is datepicker inline or not
       
  3950 			dpDiv: (!inline ? this.dpDiv : // presentation div
       
  3951 			datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
       
  3952 	},
       
  3953 
       
  3954 	/* Attach the date picker to an input field. */
       
  3955 	_connectDatepicker: function(target, inst) {
       
  3956 		var input = $(target);
       
  3957 		inst.append = $([]);
       
  3958 		inst.trigger = $([]);
       
  3959 		if (input.hasClass(this.markerClassName)) {
       
  3960 			return;
       
  3961 		}
       
  3962 		this._attachments(input, inst);
       
  3963 		input.addClass(this.markerClassName).keydown(this._doKeyDown).
       
  3964 			keypress(this._doKeyPress).keyup(this._doKeyUp);
       
  3965 		this._autoSize(inst);
       
  3966 		$.data(target, "datepicker", inst);
       
  3967 		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
       
  3968 		if( inst.settings.disabled ) {
       
  3969 			this._disableDatepicker( target );
       
  3970 		}
       
  3971 	},
       
  3972 
       
  3973 	/* Make attachments based on settings. */
       
  3974 	_attachments: function(input, inst) {
       
  3975 		var showOn, buttonText, buttonImage,
       
  3976 			appendText = this._get(inst, "appendText"),
       
  3977 			isRTL = this._get(inst, "isRTL");
       
  3978 
       
  3979 		if (inst.append) {
       
  3980 			inst.append.remove();
       
  3981 		}
       
  3982 		if (appendText) {
       
  3983 			inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
       
  3984 			input[isRTL ? "before" : "after"](inst.append);
       
  3985 		}
       
  3986 
       
  3987 		input.unbind("focus", this._showDatepicker);
       
  3988 
       
  3989 		if (inst.trigger) {
       
  3990 			inst.trigger.remove();
       
  3991 		}
       
  3992 
       
  3993 		showOn = this._get(inst, "showOn");
       
  3994 		if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
       
  3995 			input.focus(this._showDatepicker);
       
  3996 		}
       
  3997 		if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
       
  3998 			buttonText = this._get(inst, "buttonText");
       
  3999 			buttonImage = this._get(inst, "buttonImage");
       
  4000 			inst.trigger = $(this._get(inst, "buttonImageOnly") ?
       
  4001 				$("<img/>").addClass(this._triggerClass).
       
  4002 					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
       
  4003 				$("<button type='button'></button>").addClass(this._triggerClass).
       
  4004 					html(!buttonImage ? buttonText : $("<img/>").attr(
       
  4005 					{ src:buttonImage, alt:buttonText, title:buttonText })));
       
  4006 			input[isRTL ? "before" : "after"](inst.trigger);
       
  4007 			inst.trigger.click(function() {
       
  4008 				if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
       
  4009 					$.datepicker._hideDatepicker();
       
  4010 				} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
       
  4011 					$.datepicker._hideDatepicker();
       
  4012 					$.datepicker._showDatepicker(input[0]);
       
  4013 				} else {
       
  4014 					$.datepicker._showDatepicker(input[0]);
       
  4015 				}
       
  4016 				return false;
       
  4017 			});
       
  4018 		}
       
  4019 	},
       
  4020 
       
  4021 	/* Apply the maximum length for the date format. */
       
  4022 	_autoSize: function(inst) {
       
  4023 		if (this._get(inst, "autoSize") && !inst.inline) {
       
  4024 			var findMax, max, maxI, i,
       
  4025 				date = new Date(2009, 12 - 1, 20), // Ensure double digits
       
  4026 				dateFormat = this._get(inst, "dateFormat");
       
  4027 
       
  4028 			if (dateFormat.match(/[DM]/)) {
       
  4029 				findMax = function(names) {
       
  4030 					max = 0;
       
  4031 					maxI = 0;
       
  4032 					for (i = 0; i < names.length; i++) {
       
  4033 						if (names[i].length > max) {
       
  4034 							max = names[i].length;
       
  4035 							maxI = i;
       
  4036 						}
       
  4037 					}
       
  4038 					return maxI;
       
  4039 				};
       
  4040 				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
       
  4041 					"monthNames" : "monthNamesShort"))));
       
  4042 				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
       
  4043 					"dayNames" : "dayNamesShort"))) + 20 - date.getDay());
       
  4044 			}
       
  4045 			inst.input.attr("size", this._formatDate(inst, date).length);
       
  4046 		}
       
  4047 	},
       
  4048 
       
  4049 	/* Attach an inline date picker to a div. */
       
  4050 	_inlineDatepicker: function(target, inst) {
       
  4051 		var divSpan = $(target);
       
  4052 		if (divSpan.hasClass(this.markerClassName)) {
       
  4053 			return;
       
  4054 		}
       
  4055 		divSpan.addClass(this.markerClassName).append(inst.dpDiv);
       
  4056 		$.data(target, "datepicker", inst);
       
  4057 		this._setDate(inst, this._getDefaultDate(inst), true);
       
  4058 		this._updateDatepicker(inst);
       
  4059 		this._updateAlternate(inst);
       
  4060 		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
       
  4061 		if( inst.settings.disabled ) {
       
  4062 			this._disableDatepicker( target );
       
  4063 		}
       
  4064 		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
       
  4065 		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
       
  4066 		inst.dpDiv.css( "display", "block" );
       
  4067 	},
       
  4068 
       
  4069 	/* Pop-up the date picker in a "dialog" box.
       
  4070 	 * @param  input element - ignored
       
  4071 	 * @param  date	string or Date - the initial date to display
       
  4072 	 * @param  onSelect  function - the function to call when a date is selected
       
  4073 	 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
       
  4074 	 * @param  pos int[2] - coordinates for the dialog's position within the screen or
       
  4075 	 *					event - with x/y coordinates or
       
  4076 	 *					leave empty for default (screen centre)
       
  4077 	 * @return the manager object
       
  4078 	 */
       
  4079 	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
       
  4080 		var id, browserWidth, browserHeight, scrollX, scrollY,
       
  4081 			inst = this._dialogInst; // internal instance
       
  4082 
       
  4083 		if (!inst) {
       
  4084 			this.uuid += 1;
       
  4085 			id = "dp" + this.uuid;
       
  4086 			this._dialogInput = $("<input type='text' id='" + id +
       
  4087 				"' style='position: absolute; top: -100px; width: 0px;'/>");
       
  4088 			this._dialogInput.keydown(this._doKeyDown);
       
  4089 			$("body").append(this._dialogInput);
       
  4090 			inst = this._dialogInst = this._newInst(this._dialogInput, false);
       
  4091 			inst.settings = {};
       
  4092 			$.data(this._dialogInput[0], "datepicker", inst);
       
  4093 		}
       
  4094 		datepicker_extendRemove(inst.settings, settings || {});
       
  4095 		date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
       
  4096 		this._dialogInput.val(date);
       
  4097 
       
  4098 		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
       
  4099 		if (!this._pos) {
       
  4100 			browserWidth = document.documentElement.clientWidth;
       
  4101 			browserHeight = document.documentElement.clientHeight;
       
  4102 			scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
       
  4103 			scrollY = document.documentElement.scrollTop || document.body.scrollTop;
       
  4104 			this._pos = // should use actual width/height below
       
  4105 				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
       
  4106 		}
       
  4107 
       
  4108 		// move input on screen for focus, but hidden behind dialog
       
  4109 		this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
       
  4110 		inst.settings.onSelect = onSelect;
       
  4111 		this._inDialog = true;
       
  4112 		this.dpDiv.addClass(this._dialogClass);
       
  4113 		this._showDatepicker(this._dialogInput[0]);
       
  4114 		if ($.blockUI) {
       
  4115 			$.blockUI(this.dpDiv);
       
  4116 		}
       
  4117 		$.data(this._dialogInput[0], "datepicker", inst);
       
  4118 		return this;
       
  4119 	},
       
  4120 
       
  4121 	/* Detach a datepicker from its control.
       
  4122 	 * @param  target	element - the target input field or division or span
       
  4123 	 */
       
  4124 	_destroyDatepicker: function(target) {
       
  4125 		var nodeName,
       
  4126 			$target = $(target),
       
  4127 			inst = $.data(target, "datepicker");
       
  4128 
       
  4129 		if (!$target.hasClass(this.markerClassName)) {
       
  4130 			return;
       
  4131 		}
       
  4132 
       
  4133 		nodeName = target.nodeName.toLowerCase();
       
  4134 		$.removeData(target, "datepicker");
       
  4135 		if (nodeName === "input") {
       
  4136 			inst.append.remove();
       
  4137 			inst.trigger.remove();
       
  4138 			$target.removeClass(this.markerClassName).
       
  4139 				unbind("focus", this._showDatepicker).
       
  4140 				unbind("keydown", this._doKeyDown).
       
  4141 				unbind("keypress", this._doKeyPress).
       
  4142 				unbind("keyup", this._doKeyUp);
       
  4143 		} else if (nodeName === "div" || nodeName === "span") {
       
  4144 			$target.removeClass(this.markerClassName).empty();
       
  4145 		}
       
  4146 
       
  4147 		if ( datepicker_instActive === inst ) {
       
  4148 			datepicker_instActive = null;
       
  4149 		}
       
  4150 	},
       
  4151 
       
  4152 	/* Enable the date picker to a jQuery selection.
       
  4153 	 * @param  target	element - the target input field or division or span
       
  4154 	 */
       
  4155 	_enableDatepicker: function(target) {
       
  4156 		var nodeName, inline,
       
  4157 			$target = $(target),
       
  4158 			inst = $.data(target, "datepicker");
       
  4159 
       
  4160 		if (!$target.hasClass(this.markerClassName)) {
       
  4161 			return;
       
  4162 		}
       
  4163 
       
  4164 		nodeName = target.nodeName.toLowerCase();
       
  4165 		if (nodeName === "input") {
       
  4166 			target.disabled = false;
       
  4167 			inst.trigger.filter("button").
       
  4168 				each(function() { this.disabled = false; }).end().
       
  4169 				filter("img").css({opacity: "1.0", cursor: ""});
       
  4170 		} else if (nodeName === "div" || nodeName === "span") {
       
  4171 			inline = $target.children("." + this._inlineClass);
       
  4172 			inline.children().removeClass("ui-state-disabled");
       
  4173 			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
       
  4174 				prop("disabled", false);
       
  4175 		}
       
  4176 		this._disabledInputs = $.map(this._disabledInputs,
       
  4177 			function(value) { return (value === target ? null : value); }); // delete entry
       
  4178 	},
       
  4179 
       
  4180 	/* Disable the date picker to a jQuery selection.
       
  4181 	 * @param  target	element - the target input field or division or span
       
  4182 	 */
       
  4183 	_disableDatepicker: function(target) {
       
  4184 		var nodeName, inline,
       
  4185 			$target = $(target),
       
  4186 			inst = $.data(target, "datepicker");
       
  4187 
       
  4188 		if (!$target.hasClass(this.markerClassName)) {
       
  4189 			return;
       
  4190 		}
       
  4191 
       
  4192 		nodeName = target.nodeName.toLowerCase();
       
  4193 		if (nodeName === "input") {
       
  4194 			target.disabled = true;
       
  4195 			inst.trigger.filter("button").
       
  4196 				each(function() { this.disabled = true; }).end().
       
  4197 				filter("img").css({opacity: "0.5", cursor: "default"});
       
  4198 		} else if (nodeName === "div" || nodeName === "span") {
       
  4199 			inline = $target.children("." + this._inlineClass);
       
  4200 			inline.children().addClass("ui-state-disabled");
       
  4201 			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
       
  4202 				prop("disabled", true);
       
  4203 		}
       
  4204 		this._disabledInputs = $.map(this._disabledInputs,
       
  4205 			function(value) { return (value === target ? null : value); }); // delete entry
       
  4206 		this._disabledInputs[this._disabledInputs.length] = target;
       
  4207 	},
       
  4208 
       
  4209 	/* Is the first field in a jQuery collection disabled as a datepicker?
       
  4210 	 * @param  target	element - the target input field or division or span
       
  4211 	 * @return boolean - true if disabled, false if enabled
       
  4212 	 */
       
  4213 	_isDisabledDatepicker: function(target) {
       
  4214 		if (!target) {
       
  4215 			return false;
       
  4216 		}
       
  4217 		for (var i = 0; i < this._disabledInputs.length; i++) {
       
  4218 			if (this._disabledInputs[i] === target) {
       
  4219 				return true;
       
  4220 			}
       
  4221 		}
       
  4222 		return false;
       
  4223 	},
       
  4224 
       
  4225 	/* Retrieve the instance data for the target control.
       
  4226 	 * @param  target  element - the target input field or division or span
       
  4227 	 * @return  object - the associated instance data
       
  4228 	 * @throws  error if a jQuery problem getting data
       
  4229 	 */
       
  4230 	_getInst: function(target) {
       
  4231 		try {
       
  4232 			return $.data(target, "datepicker");
       
  4233 		}
       
  4234 		catch (err) {
       
  4235 			throw "Missing instance data for this datepicker";
       
  4236 		}
       
  4237 	},
       
  4238 
       
  4239 	/* Update or retrieve the settings for a date picker attached to an input field or division.
       
  4240 	 * @param  target  element - the target input field or division or span
       
  4241 	 * @param  name	object - the new settings to update or
       
  4242 	 *				string - the name of the setting to change or retrieve,
       
  4243 	 *				when retrieving also "all" for all instance settings or
       
  4244 	 *				"defaults" for all global defaults
       
  4245 	 * @param  value   any - the new value for the setting
       
  4246 	 *				(omit if above is an object or to retrieve a value)
       
  4247 	 */
       
  4248 	_optionDatepicker: function(target, name, value) {
       
  4249 		var settings, date, minDate, maxDate,
       
  4250 			inst = this._getInst(target);
       
  4251 
       
  4252 		if (arguments.length === 2 && typeof name === "string") {
       
  4253 			return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
       
  4254 				(inst ? (name === "all" ? $.extend({}, inst.settings) :
       
  4255 				this._get(inst, name)) : null));
       
  4256 		}
       
  4257 
       
  4258 		settings = name || {};
       
  4259 		if (typeof name === "string") {
       
  4260 			settings = {};
       
  4261 			settings[name] = value;
       
  4262 		}
       
  4263 
       
  4264 		if (inst) {
       
  4265 			if (this._curInst === inst) {
       
  4266 				this._hideDatepicker();
       
  4267 			}
       
  4268 
       
  4269 			date = this._getDateDatepicker(target, true);
       
  4270 			minDate = this._getMinMaxDate(inst, "min");
       
  4271 			maxDate = this._getMinMaxDate(inst, "max");
       
  4272 			datepicker_extendRemove(inst.settings, settings);
       
  4273 			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
       
  4274 			if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
       
  4275 				inst.settings.minDate = this._formatDate(inst, minDate);
       
  4276 			}
       
  4277 			if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
       
  4278 				inst.settings.maxDate = this._formatDate(inst, maxDate);
       
  4279 			}
       
  4280 			if ( "disabled" in settings ) {
       
  4281 				if ( settings.disabled ) {
       
  4282 					this._disableDatepicker(target);
       
  4283 				} else {
       
  4284 					this._enableDatepicker(target);
       
  4285 				}
       
  4286 			}
       
  4287 			this._attachments($(target), inst);
       
  4288 			this._autoSize(inst);
       
  4289 			this._setDate(inst, date);
       
  4290 			this._updateAlternate(inst);
       
  4291 			this._updateDatepicker(inst);
       
  4292 		}
       
  4293 	},
       
  4294 
       
  4295 	// change method deprecated
       
  4296 	_changeDatepicker: function(target, name, value) {
       
  4297 		this._optionDatepicker(target, name, value);
       
  4298 	},
       
  4299 
       
  4300 	/* Redraw the date picker attached to an input field or division.
       
  4301 	 * @param  target  element - the target input field or division or span
       
  4302 	 */
       
  4303 	_refreshDatepicker: function(target) {
       
  4304 		var inst = this._getInst(target);
       
  4305 		if (inst) {
       
  4306 			this._updateDatepicker(inst);
       
  4307 		}
       
  4308 	},
       
  4309 
       
  4310 	/* Set the dates for a jQuery selection.
       
  4311 	 * @param  target element - the target input field or division or span
       
  4312 	 * @param  date	Date - the new date
       
  4313 	 */
       
  4314 	_setDateDatepicker: function(target, date) {
       
  4315 		var inst = this._getInst(target);
       
  4316 		if (inst) {
       
  4317 			this._setDate(inst, date);
       
  4318 			this._updateDatepicker(inst);
       
  4319 			this._updateAlternate(inst);
       
  4320 		}
       
  4321 	},
       
  4322 
       
  4323 	/* Get the date(s) for the first entry in a jQuery selection.
       
  4324 	 * @param  target element - the target input field or division or span
       
  4325 	 * @param  noDefault boolean - true if no default date is to be used
       
  4326 	 * @return Date - the current date
       
  4327 	 */
       
  4328 	_getDateDatepicker: function(target, noDefault) {
       
  4329 		var inst = this._getInst(target);
       
  4330 		if (inst && !inst.inline) {
       
  4331 			this._setDateFromField(inst, noDefault);
       
  4332 		}
       
  4333 		return (inst ? this._getDate(inst) : null);
       
  4334 	},
       
  4335 
       
  4336 	/* Handle keystrokes. */
       
  4337 	_doKeyDown: function(event) {
       
  4338 		var onSelect, dateStr, sel,
       
  4339 			inst = $.datepicker._getInst(event.target),
       
  4340 			handled = true,
       
  4341 			isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
       
  4342 
       
  4343 		inst._keyEvent = true;
       
  4344 		if ($.datepicker._datepickerShowing) {
       
  4345 			switch (event.keyCode) {
       
  4346 				case 9: $.datepicker._hideDatepicker();
       
  4347 						handled = false;
       
  4348 						break; // hide on tab out
       
  4349 				case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
       
  4350 									$.datepicker._currentClass + ")", inst.dpDiv);
       
  4351 						if (sel[0]) {
       
  4352 							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
       
  4353 						}
       
  4354 
       
  4355 						onSelect = $.datepicker._get(inst, "onSelect");
       
  4356 						if (onSelect) {
       
  4357 							dateStr = $.datepicker._formatDate(inst);
       
  4358 
       
  4359 							// trigger custom callback
       
  4360 							onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
       
  4361 						} else {
       
  4362 							$.datepicker._hideDatepicker();
       
  4363 						}
       
  4364 
       
  4365 						return false; // don't submit the form
       
  4366 				case 27: $.datepicker._hideDatepicker();
       
  4367 						break; // hide on escape
       
  4368 				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
       
  4369 							-$.datepicker._get(inst, "stepBigMonths") :
       
  4370 							-$.datepicker._get(inst, "stepMonths")), "M");
       
  4371 						break; // previous month/year on page up/+ ctrl
       
  4372 				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
       
  4373 							+$.datepicker._get(inst, "stepBigMonths") :
       
  4374 							+$.datepicker._get(inst, "stepMonths")), "M");
       
  4375 						break; // next month/year on page down/+ ctrl
       
  4376 				case 35: if (event.ctrlKey || event.metaKey) {
       
  4377 							$.datepicker._clearDate(event.target);
       
  4378 						}
       
  4379 						handled = event.ctrlKey || event.metaKey;
       
  4380 						break; // clear on ctrl or command +end
       
  4381 				case 36: if (event.ctrlKey || event.metaKey) {
       
  4382 							$.datepicker._gotoToday(event.target);
       
  4383 						}
       
  4384 						handled = event.ctrlKey || event.metaKey;
       
  4385 						break; // current on ctrl or command +home
       
  4386 				case 37: if (event.ctrlKey || event.metaKey) {
       
  4387 							$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
       
  4388 						}
       
  4389 						handled = event.ctrlKey || event.metaKey;
       
  4390 						// -1 day on ctrl or command +left
       
  4391 						if (event.originalEvent.altKey) {
       
  4392 							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
       
  4393 								-$.datepicker._get(inst, "stepBigMonths") :
       
  4394 								-$.datepicker._get(inst, "stepMonths")), "M");
       
  4395 						}
       
  4396 						// next month/year on alt +left on Mac
       
  4397 						break;
       
  4398 				case 38: if (event.ctrlKey || event.metaKey) {
       
  4399 							$.datepicker._adjustDate(event.target, -7, "D");
       
  4400 						}
       
  4401 						handled = event.ctrlKey || event.metaKey;
       
  4402 						break; // -1 week on ctrl or command +up
       
  4403 				case 39: if (event.ctrlKey || event.metaKey) {
       
  4404 							$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
       
  4405 						}
       
  4406 						handled = event.ctrlKey || event.metaKey;
       
  4407 						// +1 day on ctrl or command +right
       
  4408 						if (event.originalEvent.altKey) {
       
  4409 							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
       
  4410 								+$.datepicker._get(inst, "stepBigMonths") :
       
  4411 								+$.datepicker._get(inst, "stepMonths")), "M");
       
  4412 						}
       
  4413 						// next month/year on alt +right
       
  4414 						break;
       
  4415 				case 40: if (event.ctrlKey || event.metaKey) {
       
  4416 							$.datepicker._adjustDate(event.target, +7, "D");
       
  4417 						}
       
  4418 						handled = event.ctrlKey || event.metaKey;
       
  4419 						break; // +1 week on ctrl or command +down
       
  4420 				default: handled = false;
       
  4421 			}
       
  4422 		} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
       
  4423 			$.datepicker._showDatepicker(this);
       
  4424 		} else {
       
  4425 			handled = false;
       
  4426 		}
       
  4427 
       
  4428 		if (handled) {
       
  4429 			event.preventDefault();
       
  4430 			event.stopPropagation();
       
  4431 		}
       
  4432 	},
       
  4433 
       
  4434 	/* Filter entered characters - based on date format. */
       
  4435 	_doKeyPress: function(event) {
       
  4436 		var chars, chr,
       
  4437 			inst = $.datepicker._getInst(event.target);
       
  4438 
       
  4439 		if ($.datepicker._get(inst, "constrainInput")) {
       
  4440 			chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
       
  4441 			chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
       
  4442 			return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
       
  4443 		}
       
  4444 	},
       
  4445 
       
  4446 	/* Synchronise manual entry and field/alternate field. */
       
  4447 	_doKeyUp: function(event) {
       
  4448 		var date,
       
  4449 			inst = $.datepicker._getInst(event.target);
       
  4450 
       
  4451 		if (inst.input.val() !== inst.lastVal) {
       
  4452 			try {
       
  4453 				date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
       
  4454 					(inst.input ? inst.input.val() : null),
       
  4455 					$.datepicker._getFormatConfig(inst));
       
  4456 
       
  4457 				if (date) { // only if valid
       
  4458 					$.datepicker._setDateFromField(inst);
       
  4459 					$.datepicker._updateAlternate(inst);
       
  4460 					$.datepicker._updateDatepicker(inst);
       
  4461 				}
       
  4462 			}
       
  4463 			catch (err) {
       
  4464 			}
       
  4465 		}
       
  4466 		return true;
       
  4467 	},
       
  4468 
       
  4469 	/* Pop-up the date picker for a given input field.
       
  4470 	 * If false returned from beforeShow event handler do not show.
       
  4471 	 * @param  input  element - the input field attached to the date picker or
       
  4472 	 *					event - if triggered by focus
       
  4473 	 */
       
  4474 	_showDatepicker: function(input) {
       
  4475 		input = input.target || input;
       
  4476 		if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
       
  4477 			input = $("input", input.parentNode)[0];
       
  4478 		}
       
  4479 
       
  4480 		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
       
  4481 			return;
       
  4482 		}
       
  4483 
       
  4484 		var inst, beforeShow, beforeShowSettings, isFixed,
       
  4485 			offset, showAnim, duration;
       
  4486 
       
  4487 		inst = $.datepicker._getInst(input);
       
  4488 		if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
       
  4489 			$.datepicker._curInst.dpDiv.stop(true, true);
       
  4490 			if ( inst && $.datepicker._datepickerShowing ) {
       
  4491 				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
       
  4492 			}
       
  4493 		}
       
  4494 
       
  4495 		beforeShow = $.datepicker._get(inst, "beforeShow");
       
  4496 		beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
       
  4497 		if(beforeShowSettings === false){
       
  4498 			return;
       
  4499 		}
       
  4500 		datepicker_extendRemove(inst.settings, beforeShowSettings);
       
  4501 
       
  4502 		inst.lastVal = null;
       
  4503 		$.datepicker._lastInput = input;
       
  4504 		$.datepicker._setDateFromField(inst);
       
  4505 
       
  4506 		if ($.datepicker._inDialog) { // hide cursor
       
  4507 			input.value = "";
       
  4508 		}
       
  4509 		if (!$.datepicker._pos) { // position below input
       
  4510 			$.datepicker._pos = $.datepicker._findPos(input);
       
  4511 			$.datepicker._pos[1] += input.offsetHeight; // add the height
       
  4512 		}
       
  4513 
       
  4514 		isFixed = false;
       
  4515 		$(input).parents().each(function() {
       
  4516 			isFixed |= $(this).css("position") === "fixed";
       
  4517 			return !isFixed;
       
  4518 		});
       
  4519 
       
  4520 		offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
       
  4521 		$.datepicker._pos = null;
       
  4522 		//to avoid flashes on Firefox
       
  4523 		inst.dpDiv.empty();
       
  4524 		// determine sizing offscreen
       
  4525 		inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
       
  4526 		$.datepicker._updateDatepicker(inst);
       
  4527 		// fix width for dynamic number of date pickers
       
  4528 		// and adjust position before showing
       
  4529 		offset = $.datepicker._checkOffset(inst, offset, isFixed);
       
  4530 		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
       
  4531 			"static" : (isFixed ? "fixed" : "absolute")), display: "none",
       
  4532 			left: offset.left + "px", top: offset.top + "px"});
       
  4533 
       
  4534 		if (!inst.inline) {
       
  4535 			showAnim = $.datepicker._get(inst, "showAnim");
       
  4536 			duration = $.datepicker._get(inst, "duration");
       
  4537 			inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
       
  4538 			$.datepicker._datepickerShowing = true;
       
  4539 
       
  4540 			if ( $.effects && $.effects.effect[ showAnim ] ) {
       
  4541 				inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
       
  4542 			} else {
       
  4543 				inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
       
  4544 			}
       
  4545 
       
  4546 			if ( $.datepicker._shouldFocusInput( inst ) ) {
       
  4547 				inst.input.focus();
       
  4548 			}
       
  4549 
       
  4550 			$.datepicker._curInst = inst;
       
  4551 		}
       
  4552 	},
       
  4553 
       
  4554 	/* Generate the date picker content. */
       
  4555 	_updateDatepicker: function(inst) {
       
  4556 		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
       
  4557 		datepicker_instActive = inst; // for delegate hover events
       
  4558 		inst.dpDiv.empty().append(this._generateHTML(inst));
       
  4559 		this._attachHandlers(inst);
       
  4560 
       
  4561 		var origyearshtml,
       
  4562 			numMonths = this._getNumberOfMonths(inst),
       
  4563 			cols = numMonths[1],
       
  4564 			width = 17,
       
  4565 			activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
       
  4566 
       
  4567 		if ( activeCell.length > 0 ) {
       
  4568 			datepicker_handleMouseover.apply( activeCell.get( 0 ) );
       
  4569 		}
       
  4570 
       
  4571 		inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
       
  4572 		if (cols > 1) {
       
  4573 			inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
       
  4574 		}
       
  4575 		inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
       
  4576 			"Class"]("ui-datepicker-multi");
       
  4577 		inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
       
  4578 			"Class"]("ui-datepicker-rtl");
       
  4579 
       
  4580 		if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
       
  4581 			inst.input.focus();
       
  4582 		}
       
  4583 
       
  4584 		// deffered render of the years select (to avoid flashes on Firefox)
       
  4585 		if( inst.yearshtml ){
       
  4586 			origyearshtml = inst.yearshtml;
       
  4587 			setTimeout(function(){
       
  4588 				//assure that inst.yearshtml didn't change.
       
  4589 				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
       
  4590 					inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
       
  4591 				}
       
  4592 				origyearshtml = inst.yearshtml = null;
       
  4593 			}, 0);
       
  4594 		}
       
  4595 	},
       
  4596 
       
  4597 	// #6694 - don't focus the input if it's already focused
       
  4598 	// this breaks the change event in IE
       
  4599 	// Support: IE and jQuery <1.9
       
  4600 	_shouldFocusInput: function( inst ) {
       
  4601 		return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
       
  4602 	},
       
  4603 
       
  4604 	/* Check positioning to remain on screen. */
       
  4605 	_checkOffset: function(inst, offset, isFixed) {
       
  4606 		var dpWidth = inst.dpDiv.outerWidth(),
       
  4607 			dpHeight = inst.dpDiv.outerHeight(),
       
  4608 			inputWidth = inst.input ? inst.input.outerWidth() : 0,
       
  4609 			inputHeight = inst.input ? inst.input.outerHeight() : 0,
       
  4610 			viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
       
  4611 			viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
       
  4612 
       
  4613 		offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
       
  4614 		offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
       
  4615 		offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
       
  4616 
       
  4617 		// now check if datepicker is showing outside window viewport - move to a better place if so.
       
  4618 		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
       
  4619 			Math.abs(offset.left + dpWidth - viewWidth) : 0);
       
  4620 		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
       
  4621 			Math.abs(dpHeight + inputHeight) : 0);
       
  4622 
       
  4623 		return offset;
       
  4624 	},
       
  4625 
       
  4626 	/* Find an object's position on the screen. */
       
  4627 	_findPos: function(obj) {
       
  4628 		var position,
       
  4629 			inst = this._getInst(obj),
       
  4630 			isRTL = this._get(inst, "isRTL");
       
  4631 
       
  4632 		while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
       
  4633 			obj = obj[isRTL ? "previousSibling" : "nextSibling"];
       
  4634 		}
       
  4635 
       
  4636 		position = $(obj).offset();
       
  4637 		return [position.left, position.top];
       
  4638 	},
       
  4639 
       
  4640 	/* Hide the date picker from view.
       
  4641 	 * @param  input  element - the input field attached to the date picker
       
  4642 	 */
       
  4643 	_hideDatepicker: function(input) {
       
  4644 		var showAnim, duration, postProcess, onClose,
       
  4645 			inst = this._curInst;
       
  4646 
       
  4647 		if (!inst || (input && inst !== $.data(input, "datepicker"))) {
       
  4648 			return;
       
  4649 		}
       
  4650 
       
  4651 		if (this._datepickerShowing) {
       
  4652 			showAnim = this._get(inst, "showAnim");
       
  4653 			duration = this._get(inst, "duration");
       
  4654 			postProcess = function() {
       
  4655 				$.datepicker._tidyDialog(inst);
       
  4656 			};
       
  4657 
       
  4658 			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
       
  4659 			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
       
  4660 				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
       
  4661 			} else {
       
  4662 				inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
       
  4663 					(showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
       
  4664 			}
       
  4665 
       
  4666 			if (!showAnim) {
       
  4667 				postProcess();
       
  4668 			}
       
  4669 			this._datepickerShowing = false;
       
  4670 
       
  4671 			onClose = this._get(inst, "onClose");
       
  4672 			if (onClose) {
       
  4673 				onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
       
  4674 			}
       
  4675 
       
  4676 			this._lastInput = null;
       
  4677 			if (this._inDialog) {
       
  4678 				this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
       
  4679 				if ($.blockUI) {
       
  4680 					$.unblockUI();
       
  4681 					$("body").append(this.dpDiv);
       
  4682 				}
       
  4683 			}
       
  4684 			this._inDialog = false;
       
  4685 		}
       
  4686 	},
       
  4687 
       
  4688 	/* Tidy up after a dialog display. */
       
  4689 	_tidyDialog: function(inst) {
       
  4690 		inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
       
  4691 	},
       
  4692 
       
  4693 	/* Close date picker if clicked elsewhere. */
       
  4694 	_checkExternalClick: function(event) {
       
  4695 		if (!$.datepicker._curInst) {
       
  4696 			return;
       
  4697 		}
       
  4698 
       
  4699 		var $target = $(event.target),
       
  4700 			inst = $.datepicker._getInst($target[0]);
       
  4701 
       
  4702 		if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
       
  4703 				$target.parents("#" + $.datepicker._mainDivId).length === 0 &&
       
  4704 				!$target.hasClass($.datepicker.markerClassName) &&
       
  4705 				!$target.closest("." + $.datepicker._triggerClass).length &&
       
  4706 				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
       
  4707 			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
       
  4708 				$.datepicker._hideDatepicker();
       
  4709 		}
       
  4710 	},
       
  4711 
       
  4712 	/* Adjust one of the date sub-fields. */
       
  4713 	_adjustDate: function(id, offset, period) {
       
  4714 		var target = $(id),
       
  4715 			inst = this._getInst(target[0]);
       
  4716 
       
  4717 		if (this._isDisabledDatepicker(target[0])) {
       
  4718 			return;
       
  4719 		}
       
  4720 		this._adjustInstDate(inst, offset +
       
  4721 			(period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
       
  4722 			period);
       
  4723 		this._updateDatepicker(inst);
       
  4724 	},
       
  4725 
       
  4726 	/* Action for current link. */
       
  4727 	_gotoToday: function(id) {
       
  4728 		var date,
       
  4729 			target = $(id),
       
  4730 			inst = this._getInst(target[0]);
       
  4731 
       
  4732 		if (this._get(inst, "gotoCurrent") && inst.currentDay) {
       
  4733 			inst.selectedDay = inst.currentDay;
       
  4734 			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
       
  4735 			inst.drawYear = inst.selectedYear = inst.currentYear;
       
  4736 		} else {
       
  4737 			date = new Date();
       
  4738 			inst.selectedDay = date.getDate();
       
  4739 			inst.drawMonth = inst.selectedMonth = date.getMonth();
       
  4740 			inst.drawYear = inst.selectedYear = date.getFullYear();
       
  4741 		}
       
  4742 		this._notifyChange(inst);
       
  4743 		this._adjustDate(target);
       
  4744 	},
       
  4745 
       
  4746 	/* Action for selecting a new month/year. */
       
  4747 	_selectMonthYear: function(id, select, period) {
       
  4748 		var target = $(id),
       
  4749 			inst = this._getInst(target[0]);
       
  4750 
       
  4751 		inst["selected" + (period === "M" ? "Month" : "Year")] =
       
  4752 		inst["draw" + (period === "M" ? "Month" : "Year")] =
       
  4753 			parseInt(select.options[select.selectedIndex].value,10);
       
  4754 
       
  4755 		this._notifyChange(inst);
       
  4756 		this._adjustDate(target);
       
  4757 	},
       
  4758 
       
  4759 	/* Action for selecting a day. */
       
  4760 	_selectDay: function(id, month, year, td) {
       
  4761 		var inst,
       
  4762 			target = $(id);
       
  4763 
       
  4764 		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
       
  4765 			return;
       
  4766 		}
       
  4767 
       
  4768 		inst = this._getInst(target[0]);
       
  4769 		inst.selectedDay = inst.currentDay = $("a", td).html();
       
  4770 		inst.selectedMonth = inst.currentMonth = month;
       
  4771 		inst.selectedYear = inst.currentYear = year;
       
  4772 		this._selectDate(id, this._formatDate(inst,
       
  4773 			inst.currentDay, inst.currentMonth, inst.currentYear));
       
  4774 	},
       
  4775 
       
  4776 	/* Erase the input field and hide the date picker. */
       
  4777 	_clearDate: function(id) {
       
  4778 		var target = $(id);
       
  4779 		this._selectDate(target, "");
       
  4780 	},
       
  4781 
       
  4782 	/* Update the input field with the selected date. */
       
  4783 	_selectDate: function(id, dateStr) {
       
  4784 		var onSelect,
       
  4785 			target = $(id),
       
  4786 			inst = this._getInst(target[0]);
       
  4787 
       
  4788 		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
       
  4789 		if (inst.input) {
       
  4790 			inst.input.val(dateStr);
       
  4791 		}
       
  4792 		this._updateAlternate(inst);
       
  4793 
       
  4794 		onSelect = this._get(inst, "onSelect");
       
  4795 		if (onSelect) {
       
  4796 			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
       
  4797 		} else if (inst.input) {
       
  4798 			inst.input.trigger("change"); // fire the change event
       
  4799 		}
       
  4800 
       
  4801 		if (inst.inline){
       
  4802 			this._updateDatepicker(inst);
       
  4803 		} else {
       
  4804 			this._hideDatepicker();
       
  4805 			this._lastInput = inst.input[0];
       
  4806 			if (typeof(inst.input[0]) !== "object") {
       
  4807 				inst.input.focus(); // restore focus
       
  4808 			}
       
  4809 			this._lastInput = null;
       
  4810 		}
       
  4811 	},
       
  4812 
       
  4813 	/* Update any alternate field to synchronise with the main field. */
       
  4814 	_updateAlternate: function(inst) {
       
  4815 		var altFormat, date, dateStr,
       
  4816 			altField = this._get(inst, "altField");
       
  4817 
       
  4818 		if (altField) { // update alternate field too
       
  4819 			altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
       
  4820 			date = this._getDate(inst);
       
  4821 			dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
       
  4822 			$(altField).each(function() { $(this).val(dateStr); });
       
  4823 		}
       
  4824 	},
       
  4825 
       
  4826 	/* Set as beforeShowDay function to prevent selection of weekends.
       
  4827 	 * @param  date  Date - the date to customise
       
  4828 	 * @return [boolean, string] - is this date selectable?, what is its CSS class?
       
  4829 	 */
       
  4830 	noWeekends: function(date) {
       
  4831 		var day = date.getDay();
       
  4832 		return [(day > 0 && day < 6), ""];
       
  4833 	},
       
  4834 
       
  4835 	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
       
  4836 	 * @param  date  Date - the date to get the week for
       
  4837 	 * @return  number - the number of the week within the year that contains this date
       
  4838 	 */
       
  4839 	iso8601Week: function(date) {
       
  4840 		var time,
       
  4841 			checkDate = new Date(date.getTime());
       
  4842 
       
  4843 		// Find Thursday of this week starting on Monday
       
  4844 		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
       
  4845 
       
  4846 		time = checkDate.getTime();
       
  4847 		checkDate.setMonth(0); // Compare with Jan 1
       
  4848 		checkDate.setDate(1);
       
  4849 		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
       
  4850 	},
       
  4851 
       
  4852 	/* Parse a string value into a date object.
       
  4853 	 * See formatDate below for the possible formats.
       
  4854 	 *
       
  4855 	 * @param  format string - the expected format of the date
       
  4856 	 * @param  value string - the date in the above format
       
  4857 	 * @param  settings Object - attributes include:
       
  4858 	 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
       
  4859 	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
       
  4860 	 *					dayNames		string[7] - names of the days from Sunday (optional)
       
  4861 	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
       
  4862 	 *					monthNames		string[12] - names of the months (optional)
       
  4863 	 * @return  Date - the extracted date value or null if value is blank
       
  4864 	 */
       
  4865 	parseDate: function (format, value, settings) {
       
  4866 		if (format == null || value == null) {
       
  4867 			throw "Invalid arguments";
       
  4868 		}
       
  4869 
       
  4870 		value = (typeof value === "object" ? value.toString() : value + "");
       
  4871 		if (value === "") {
       
  4872 			return null;
       
  4873 		}
       
  4874 
       
  4875 		var iFormat, dim, extra,
       
  4876 			iValue = 0,
       
  4877 			shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
       
  4878 			shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
       
  4879 				new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
       
  4880 			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
       
  4881 			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
       
  4882 			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
       
  4883 			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
       
  4884 			year = -1,
       
  4885 			month = -1,
       
  4886 			day = -1,
       
  4887 			doy = -1,
       
  4888 			literal = false,
       
  4889 			date,
       
  4890 			// Check whether a format character is doubled
       
  4891 			lookAhead = function(match) {
       
  4892 				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
       
  4893 				if (matches) {
       
  4894 					iFormat++;
       
  4895 				}
       
  4896 				return matches;
       
  4897 			},
       
  4898 			// Extract a number from the string value
       
  4899 			getNumber = function(match) {
       
  4900 				var isDoubled = lookAhead(match),
       
  4901 					size = (match === "@" ? 14 : (match === "!" ? 20 :
       
  4902 					(match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
       
  4903 					minSize = (match === "y" ? size : 1),
       
  4904 					digits = new RegExp("^\\d{" + minSize + "," + size + "}"),
       
  4905 					num = value.substring(iValue).match(digits);
       
  4906 				if (!num) {
       
  4907 					throw "Missing number at position " + iValue;
       
  4908 				}
       
  4909 				iValue += num[0].length;
       
  4910 				return parseInt(num[0], 10);
       
  4911 			},
       
  4912 			// Extract a name from the string value and convert to an index
       
  4913 			getName = function(match, shortNames, longNames) {
       
  4914 				var index = -1,
       
  4915 					names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
       
  4916 						return [ [k, v] ];
       
  4917 					}).sort(function (a, b) {
       
  4918 						return -(a[1].length - b[1].length);
       
  4919 					});
       
  4920 
       
  4921 				$.each(names, function (i, pair) {
       
  4922 					var name = pair[1];
       
  4923 					if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
       
  4924 						index = pair[0];
       
  4925 						iValue += name.length;
       
  4926 						return false;
       
  4927 					}
       
  4928 				});
       
  4929 				if (index !== -1) {
       
  4930 					return index + 1;
       
  4931 				} else {
       
  4932 					throw "Unknown name at position " + iValue;
       
  4933 				}
       
  4934 			},
       
  4935 			// Confirm that a literal character matches the string value
       
  4936 			checkLiteral = function() {
       
  4937 				if (value.charAt(iValue) !== format.charAt(iFormat)) {
       
  4938 					throw "Unexpected literal at position " + iValue;
       
  4939 				}
       
  4940 				iValue++;
       
  4941 			};
       
  4942 
       
  4943 		for (iFormat = 0; iFormat < format.length; iFormat++) {
       
  4944 			if (literal) {
       
  4945 				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
       
  4946 					literal = false;
       
  4947 				} else {
       
  4948 					checkLiteral();
       
  4949 				}
       
  4950 			} else {
       
  4951 				switch (format.charAt(iFormat)) {
       
  4952 					case "d":
       
  4953 						day = getNumber("d");
       
  4954 						break;
       
  4955 					case "D":
       
  4956 						getName("D", dayNamesShort, dayNames);
       
  4957 						break;
       
  4958 					case "o":
       
  4959 						doy = getNumber("o");
       
  4960 						break;
       
  4961 					case "m":
       
  4962 						month = getNumber("m");
       
  4963 						break;
       
  4964 					case "M":
       
  4965 						month = getName("M", monthNamesShort, monthNames);
       
  4966 						break;
       
  4967 					case "y":
       
  4968 						year = getNumber("y");
       
  4969 						break;
       
  4970 					case "@":
       
  4971 						date = new Date(getNumber("@"));
       
  4972 						year = date.getFullYear();
       
  4973 						month = date.getMonth() + 1;
       
  4974 						day = date.getDate();
       
  4975 						break;
       
  4976 					case "!":
       
  4977 						date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
       
  4978 						year = date.getFullYear();
       
  4979 						month = date.getMonth() + 1;
       
  4980 						day = date.getDate();
       
  4981 						break;
       
  4982 					case "'":
       
  4983 						if (lookAhead("'")){
       
  4984 							checkLiteral();
       
  4985 						} else {
       
  4986 							literal = true;
       
  4987 						}
       
  4988 						break;
       
  4989 					default:
       
  4990 						checkLiteral();
       
  4991 				}
       
  4992 			}
       
  4993 		}
       
  4994 
       
  4995 		if (iValue < value.length){
       
  4996 			extra = value.substr(iValue);
       
  4997 			if (!/^\s+/.test(extra)) {
       
  4998 				throw "Extra/unparsed characters found in date: " + extra;
       
  4999 			}
       
  5000 		}
       
  5001 
       
  5002 		if (year === -1) {
       
  5003 			year = new Date().getFullYear();
       
  5004 		} else if (year < 100) {
       
  5005 			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
       
  5006 				(year <= shortYearCutoff ? 0 : -100);
       
  5007 		}
       
  5008 
       
  5009 		if (doy > -1) {
       
  5010 			month = 1;
       
  5011 			day = doy;
       
  5012 			do {
       
  5013 				dim = this._getDaysInMonth(year, month - 1);
       
  5014 				if (day <= dim) {
       
  5015 					break;
       
  5016 				}
       
  5017 				month++;
       
  5018 				day -= dim;
       
  5019 			} while (true);
       
  5020 		}
       
  5021 
       
  5022 		date = this._daylightSavingAdjust(new Date(year, month - 1, day));
       
  5023 		if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
       
  5024 			throw "Invalid date"; // E.g. 31/02/00
       
  5025 		}
       
  5026 		return date;
       
  5027 	},
       
  5028 
       
  5029 	/* Standard date formats. */
       
  5030 	ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
       
  5031 	COOKIE: "D, dd M yy",
       
  5032 	ISO_8601: "yy-mm-dd",
       
  5033 	RFC_822: "D, d M y",
       
  5034 	RFC_850: "DD, dd-M-y",
       
  5035 	RFC_1036: "D, d M y",
       
  5036 	RFC_1123: "D, d M yy",
       
  5037 	RFC_2822: "D, d M yy",
       
  5038 	RSS: "D, d M y", // RFC 822
       
  5039 	TICKS: "!",
       
  5040 	TIMESTAMP: "@",
       
  5041 	W3C: "yy-mm-dd", // ISO 8601
       
  5042 
       
  5043 	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
       
  5044 		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
       
  5045 
       
  5046 	/* Format a date object into a string value.
       
  5047 	 * The format can be combinations of the following:
       
  5048 	 * d  - day of month (no leading zero)
       
  5049 	 * dd - day of month (two digit)
       
  5050 	 * o  - day of year (no leading zeros)
       
  5051 	 * oo - day of year (three digit)
       
  5052 	 * D  - day name short
       
  5053 	 * DD - day name long
       
  5054 	 * m  - month of year (no leading zero)
       
  5055 	 * mm - month of year (two digit)
       
  5056 	 * M  - month name short
       
  5057 	 * MM - month name long
       
  5058 	 * y  - year (two digit)
       
  5059 	 * yy - year (four digit)
       
  5060 	 * @ - Unix timestamp (ms since 01/01/1970)
       
  5061 	 * ! - Windows ticks (100ns since 01/01/0001)
       
  5062 	 * "..." - literal text
       
  5063 	 * '' - single quote
       
  5064 	 *
       
  5065 	 * @param  format string - the desired format of the date
       
  5066 	 * @param  date Date - the date value to format
       
  5067 	 * @param  settings Object - attributes include:
       
  5068 	 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
       
  5069 	 *					dayNames		string[7] - names of the days from Sunday (optional)
       
  5070 	 *					monthNamesShort string[12] - abbreviated names of the months (optional)
       
  5071 	 *					monthNames		string[12] - names of the months (optional)
       
  5072 	 * @return  string - the date in the above format
       
  5073 	 */
       
  5074 	formatDate: function (format, date, settings) {
       
  5075 		if (!date) {
       
  5076 			return "";
       
  5077 		}
       
  5078 
       
  5079 		var iFormat,
       
  5080 			dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
       
  5081 			dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
       
  5082 			monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
       
  5083 			monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
       
  5084 			// Check whether a format character is doubled
       
  5085 			lookAhead = function(match) {
       
  5086 				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
       
  5087 				if (matches) {
       
  5088 					iFormat++;
       
  5089 				}
       
  5090 				return matches;
       
  5091 			},
       
  5092 			// Format a number, with leading zero if necessary
       
  5093 			formatNumber = function(match, value, len) {
       
  5094 				var num = "" + value;
       
  5095 				if (lookAhead(match)) {
       
  5096 					while (num.length < len) {
       
  5097 						num = "0" + num;
       
  5098 					}
       
  5099 				}
       
  5100 				return num;
       
  5101 			},
       
  5102 			// Format a name, short or long as requested
       
  5103 			formatName = function(match, value, shortNames, longNames) {
       
  5104 				return (lookAhead(match) ? longNames[value] : shortNames[value]);
       
  5105 			},
       
  5106 			output = "",
       
  5107 			literal = false;
       
  5108 
       
  5109 		if (date) {
       
  5110 			for (iFormat = 0; iFormat < format.length; iFormat++) {
       
  5111 				if (literal) {
       
  5112 					if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
       
  5113 						literal = false;
       
  5114 					} else {
       
  5115 						output += format.charAt(iFormat);
       
  5116 					}
       
  5117 				} else {
       
  5118 					switch (format.charAt(iFormat)) {
       
  5119 						case "d":
       
  5120 							output += formatNumber("d", date.getDate(), 2);
       
  5121 							break;
       
  5122 						case "D":
       
  5123 							output += formatName("D", date.getDay(), dayNamesShort, dayNames);
       
  5124 							break;
       
  5125 						case "o":
       
  5126 							output += formatNumber("o",
       
  5127 								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
       
  5128 							break;
       
  5129 						case "m":
       
  5130 							output += formatNumber("m", date.getMonth() + 1, 2);
       
  5131 							break;
       
  5132 						case "M":
       
  5133 							output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
       
  5134 							break;
       
  5135 						case "y":
       
  5136 							output += (lookAhead("y") ? date.getFullYear() :
       
  5137 								(date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
       
  5138 							break;
       
  5139 						case "@":
       
  5140 							output += date.getTime();
       
  5141 							break;
       
  5142 						case "!":
       
  5143 							output += date.getTime() * 10000 + this._ticksTo1970;
       
  5144 							break;
       
  5145 						case "'":
       
  5146 							if (lookAhead("'")) {
       
  5147 								output += "'";
       
  5148 							} else {
       
  5149 								literal = true;
       
  5150 							}
       
  5151 							break;
       
  5152 						default:
       
  5153 							output += format.charAt(iFormat);
       
  5154 					}
       
  5155 				}
       
  5156 			}
       
  5157 		}
       
  5158 		return output;
       
  5159 	},
       
  5160 
       
  5161 	/* Extract all possible characters from the date format. */
       
  5162 	_possibleChars: function (format) {
       
  5163 		var iFormat,
       
  5164 			chars = "",
       
  5165 			literal = false,
       
  5166 			// Check whether a format character is doubled
       
  5167 			lookAhead = function(match) {
       
  5168 				var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
       
  5169 				if (matches) {
       
  5170 					iFormat++;
       
  5171 				}
       
  5172 				return matches;
       
  5173 			};
       
  5174 
       
  5175 		for (iFormat = 0; iFormat < format.length; iFormat++) {
       
  5176 			if (literal) {
       
  5177 				if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
       
  5178 					literal = false;
       
  5179 				} else {
       
  5180 					chars += format.charAt(iFormat);
       
  5181 				}
       
  5182 			} else {
       
  5183 				switch (format.charAt(iFormat)) {
       
  5184 					case "d": case "m": case "y": case "@":
       
  5185 						chars += "0123456789";
       
  5186 						break;
       
  5187 					case "D": case "M":
       
  5188 						return null; // Accept anything
       
  5189 					case "'":
       
  5190 						if (lookAhead("'")) {
       
  5191 							chars += "'";
       
  5192 						} else {
       
  5193 							literal = true;
       
  5194 						}
       
  5195 						break;
       
  5196 					default:
       
  5197 						chars += format.charAt(iFormat);
       
  5198 				}
       
  5199 			}
       
  5200 		}
       
  5201 		return chars;
       
  5202 	},
       
  5203 
       
  5204 	/* Get a setting value, defaulting if necessary. */
       
  5205 	_get: function(inst, name) {
       
  5206 		return inst.settings[name] !== undefined ?
       
  5207 			inst.settings[name] : this._defaults[name];
       
  5208 	},
       
  5209 
       
  5210 	/* Parse existing date and initialise date picker. */
       
  5211 	_setDateFromField: function(inst, noDefault) {
       
  5212 		if (inst.input.val() === inst.lastVal) {
       
  5213 			return;
       
  5214 		}
       
  5215 
       
  5216 		var dateFormat = this._get(inst, "dateFormat"),
       
  5217 			dates = inst.lastVal = inst.input ? inst.input.val() : null,
       
  5218 			defaultDate = this._getDefaultDate(inst),
       
  5219 			date = defaultDate,
       
  5220 			settings = this._getFormatConfig(inst);
       
  5221 
       
  5222 		try {
       
  5223 			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
       
  5224 		} catch (event) {
       
  5225 			dates = (noDefault ? "" : dates);
       
  5226 		}
       
  5227 		inst.selectedDay = date.getDate();
       
  5228 		inst.drawMonth = inst.selectedMonth = date.getMonth();
       
  5229 		inst.drawYear = inst.selectedYear = date.getFullYear();
       
  5230 		inst.currentDay = (dates ? date.getDate() : 0);
       
  5231 		inst.currentMonth = (dates ? date.getMonth() : 0);
       
  5232 		inst.currentYear = (dates ? date.getFullYear() : 0);
       
  5233 		this._adjustInstDate(inst);
       
  5234 	},
       
  5235 
       
  5236 	/* Retrieve the default date shown on opening. */
       
  5237 	_getDefaultDate: function(inst) {
       
  5238 		return this._restrictMinMax(inst,
       
  5239 			this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
       
  5240 	},
       
  5241 
       
  5242 	/* A date may be specified as an exact value or a relative one. */
       
  5243 	_determineDate: function(inst, date, defaultDate) {
       
  5244 		var offsetNumeric = function(offset) {
       
  5245 				var date = new Date();
       
  5246 				date.setDate(date.getDate() + offset);
       
  5247 				return date;
       
  5248 			},
       
  5249 			offsetString = function(offset) {
       
  5250 				try {
       
  5251 					return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
       
  5252 						offset, $.datepicker._getFormatConfig(inst));
       
  5253 				}
       
  5254 				catch (e) {
       
  5255 					// Ignore
       
  5256 				}
       
  5257 
       
  5258 				var date = (offset.toLowerCase().match(/^c/) ?
       
  5259 					$.datepicker._getDate(inst) : null) || new Date(),
       
  5260 					year = date.getFullYear(),
       
  5261 					month = date.getMonth(),
       
  5262 					day = date.getDate(),
       
  5263 					pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
       
  5264 					matches = pattern.exec(offset);
       
  5265 
       
  5266 				while (matches) {
       
  5267 					switch (matches[2] || "d") {
       
  5268 						case "d" : case "D" :
       
  5269 							day += parseInt(matches[1],10); break;
       
  5270 						case "w" : case "W" :
       
  5271 							day += parseInt(matches[1],10) * 7; break;
       
  5272 						case "m" : case "M" :
       
  5273 							month += parseInt(matches[1],10);
       
  5274 							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
       
  5275 							break;
       
  5276 						case "y": case "Y" :
       
  5277 							year += parseInt(matches[1],10);
       
  5278 							day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
       
  5279 							break;
       
  5280 					}
       
  5281 					matches = pattern.exec(offset);
       
  5282 				}
       
  5283 				return new Date(year, month, day);
       
  5284 			},
       
  5285 			newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
       
  5286 				(typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
       
  5287 
       
  5288 		newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
       
  5289 		if (newDate) {
       
  5290 			newDate.setHours(0);
       
  5291 			newDate.setMinutes(0);
       
  5292 			newDate.setSeconds(0);
       
  5293 			newDate.setMilliseconds(0);
       
  5294 		}
       
  5295 		return this._daylightSavingAdjust(newDate);
       
  5296 	},
       
  5297 
       
  5298 	/* Handle switch to/from daylight saving.
       
  5299 	 * Hours may be non-zero on daylight saving cut-over:
       
  5300 	 * > 12 when midnight changeover, but then cannot generate
       
  5301 	 * midnight datetime, so jump to 1AM, otherwise reset.
       
  5302 	 * @param  date  (Date) the date to check
       
  5303 	 * @return  (Date) the corrected date
       
  5304 	 */
       
  5305 	_daylightSavingAdjust: function(date) {
       
  5306 		if (!date) {
       
  5307 			return null;
       
  5308 		}
       
  5309 		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
       
  5310 		return date;
       
  5311 	},
       
  5312 
       
  5313 	/* Set the date(s) directly. */
       
  5314 	_setDate: function(inst, date, noChange) {
       
  5315 		var clear = !date,
       
  5316 			origMonth = inst.selectedMonth,
       
  5317 			origYear = inst.selectedYear,
       
  5318 			newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
       
  5319 
       
  5320 		inst.selectedDay = inst.currentDay = newDate.getDate();
       
  5321 		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
       
  5322 		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
       
  5323 		if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
       
  5324 			this._notifyChange(inst);
       
  5325 		}
       
  5326 		this._adjustInstDate(inst);
       
  5327 		if (inst.input) {
       
  5328 			inst.input.val(clear ? "" : this._formatDate(inst));
       
  5329 		}
       
  5330 	},
       
  5331 
       
  5332 	/* Retrieve the date(s) directly. */
       
  5333 	_getDate: function(inst) {
       
  5334 		var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
       
  5335 			this._daylightSavingAdjust(new Date(
       
  5336 			inst.currentYear, inst.currentMonth, inst.currentDay)));
       
  5337 			return startDate;
       
  5338 	},
       
  5339 
       
  5340 	/* Attach the onxxx handlers.  These are declared statically so
       
  5341 	 * they work with static code transformers like Caja.
       
  5342 	 */
       
  5343 	_attachHandlers: function(inst) {
       
  5344 		var stepMonths = this._get(inst, "stepMonths"),
       
  5345 			id = "#" + inst.id.replace( /\\\\/g, "\\" );
       
  5346 		inst.dpDiv.find("[data-handler]").map(function () {
       
  5347 			var handler = {
       
  5348 				prev: function () {
       
  5349 					$.datepicker._adjustDate(id, -stepMonths, "M");
       
  5350 				},
       
  5351 				next: function () {
       
  5352 					$.datepicker._adjustDate(id, +stepMonths, "M");
       
  5353 				},
       
  5354 				hide: function () {
       
  5355 					$.datepicker._hideDatepicker();
       
  5356 				},
       
  5357 				today: function () {
       
  5358 					$.datepicker._gotoToday(id);
       
  5359 				},
       
  5360 				selectDay: function () {
       
  5361 					$.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
       
  5362 					return false;
       
  5363 				},
       
  5364 				selectMonth: function () {
       
  5365 					$.datepicker._selectMonthYear(id, this, "M");
       
  5366 					return false;
       
  5367 				},
       
  5368 				selectYear: function () {
       
  5369 					$.datepicker._selectMonthYear(id, this, "Y");
       
  5370 					return false;
       
  5371 				}
       
  5372 			};
       
  5373 			$(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
       
  5374 		});
       
  5375 	},
       
  5376 
       
  5377 	/* Generate the HTML for the current state of the date picker. */
       
  5378 	_generateHTML: function(inst) {
       
  5379 		var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
       
  5380 			controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
       
  5381 			monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
       
  5382 			selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
       
  5383 			cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
       
  5384 			printDate, dRow, tbody, daySettings, otherMonth, unselectable,
       
  5385 			tempDate = new Date(),
       
  5386 			today = this._daylightSavingAdjust(
       
  5387 				new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
       
  5388 			isRTL = this._get(inst, "isRTL"),
       
  5389 			showButtonPanel = this._get(inst, "showButtonPanel"),
       
  5390 			hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
       
  5391 			navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
       
  5392 			numMonths = this._getNumberOfMonths(inst),
       
  5393 			showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
       
  5394 			stepMonths = this._get(inst, "stepMonths"),
       
  5395 			isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
       
  5396 			currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
       
  5397 				new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
       
  5398 			minDate = this._getMinMaxDate(inst, "min"),
       
  5399 			maxDate = this._getMinMaxDate(inst, "max"),
       
  5400 			drawMonth = inst.drawMonth - showCurrentAtPos,
       
  5401 			drawYear = inst.drawYear;
       
  5402 
       
  5403 		if (drawMonth < 0) {
       
  5404 			drawMonth += 12;
       
  5405 			drawYear--;
       
  5406 		}
       
  5407 		if (maxDate) {
       
  5408 			maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
       
  5409 				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
       
  5410 			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
       
  5411 			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
       
  5412 				drawMonth--;
       
  5413 				if (drawMonth < 0) {
       
  5414 					drawMonth = 11;
       
  5415 					drawYear--;
       
  5416 				}
       
  5417 			}
       
  5418 		}
       
  5419 		inst.drawMonth = drawMonth;
       
  5420 		inst.drawYear = drawYear;
       
  5421 
       
  5422 		prevText = this._get(inst, "prevText");
       
  5423 		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
       
  5424 			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
       
  5425 			this._getFormatConfig(inst)));
       
  5426 
       
  5427 		prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
       
  5428 			"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
       
  5429 			" title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
       
  5430 			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
       
  5431 
       
  5432 		nextText = this._get(inst, "nextText");
       
  5433 		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
       
  5434 			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
       
  5435 			this._getFormatConfig(inst)));
       
  5436 
       
  5437 		next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
       
  5438 			"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
       
  5439 			" title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
       
  5440 			(hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
       
  5441 
       
  5442 		currentText = this._get(inst, "currentText");
       
  5443 		gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
       
  5444 		currentText = (!navigationAsDateFormat ? currentText :
       
  5445 			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
       
  5446 
       
  5447 		controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
       
  5448 			this._get(inst, "closeText") + "</button>" : "");
       
  5449 
       
  5450 		buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
       
  5451 			(this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
       
  5452 			">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
       
  5453 
       
  5454 		firstDay = parseInt(this._get(inst, "firstDay"),10);
       
  5455 		firstDay = (isNaN(firstDay) ? 0 : firstDay);
       
  5456 
       
  5457 		showWeek = this._get(inst, "showWeek");
       
  5458 		dayNames = this._get(inst, "dayNames");
       
  5459 		dayNamesMin = this._get(inst, "dayNamesMin");
       
  5460 		monthNames = this._get(inst, "monthNames");
       
  5461 		monthNamesShort = this._get(inst, "monthNamesShort");
       
  5462 		beforeShowDay = this._get(inst, "beforeShowDay");
       
  5463 		showOtherMonths = this._get(inst, "showOtherMonths");
       
  5464 		selectOtherMonths = this._get(inst, "selectOtherMonths");
       
  5465 		defaultDate = this._getDefaultDate(inst);
       
  5466 		html = "";
       
  5467 		dow;
       
  5468 		for (row = 0; row < numMonths[0]; row++) {
       
  5469 			group = "";
       
  5470 			this.maxRows = 4;
       
  5471 			for (col = 0; col < numMonths[1]; col++) {
       
  5472 				selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
       
  5473 				cornerClass = " ui-corner-all";
       
  5474 				calender = "";
       
  5475 				if (isMultiMonth) {
       
  5476 					calender += "<div class='ui-datepicker-group";
       
  5477 					if (numMonths[1] > 1) {
       
  5478 						switch (col) {
       
  5479 							case 0: calender += " ui-datepicker-group-first";
       
  5480 								cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
       
  5481 							case numMonths[1]-1: calender += " ui-datepicker-group-last";
       
  5482 								cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
       
  5483 							default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
       
  5484 						}
       
  5485 					}
       
  5486 					calender += "'>";
       
  5487 				}
       
  5488 				calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
       
  5489 					(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
       
  5490 					(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
       
  5491 					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
       
  5492 					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
       
  5493 					"</div><table class='ui-datepicker-calendar'><thead>" +
       
  5494 					"<tr>";
       
  5495 				thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
       
  5496 				for (dow = 0; dow < 7; dow++) { // days of the week
       
  5497 					day = (dow + firstDay) % 7;
       
  5498 					thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
       
  5499 						"<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
       
  5500 				}
       
  5501 				calender += thead + "</tr></thead><tbody>";
       
  5502 				daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
       
  5503 				if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
       
  5504 					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
       
  5505 				}
       
  5506 				leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
       
  5507 				curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
       
  5508 				numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
       
  5509 				this.maxRows = numRows;
       
  5510 				printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
       
  5511 				for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
       
  5512 					calender += "<tr>";
       
  5513 					tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
       
  5514 						this._get(inst, "calculateWeek")(printDate) + "</td>");
       
  5515 					for (dow = 0; dow < 7; dow++) { // create date picker days
       
  5516 						daySettings = (beforeShowDay ?
       
  5517 							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
       
  5518 						otherMonth = (printDate.getMonth() !== drawMonth);
       
  5519 						unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
       
  5520 							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
       
  5521 						tbody += "<td class='" +
       
  5522 							((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
       
  5523 							(otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
       
  5524 							((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
       
  5525 							(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
       
  5526 							// or defaultDate is current printedDate and defaultDate is selectedDate
       
  5527 							" " + this._dayOverClass : "") + // highlight selected day
       
  5528 							(unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") +  // highlight unselectable days
       
  5529 							(otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
       
  5530 							(printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
       
  5531 							(printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
       
  5532 							((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
       
  5533 							(unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
       
  5534 							(otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
       
  5535 							(unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
       
  5536 							(printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
       
  5537 							(printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
       
  5538 							(otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
       
  5539 							"' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
       
  5540 						printDate.setDate(printDate.getDate() + 1);
       
  5541 						printDate = this._daylightSavingAdjust(printDate);
       
  5542 					}
       
  5543 					calender += tbody + "</tr>";
       
  5544 				}
       
  5545 				drawMonth++;
       
  5546 				if (drawMonth > 11) {
       
  5547 					drawMonth = 0;
       
  5548 					drawYear++;
       
  5549 				}
       
  5550 				calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
       
  5551 							((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
       
  5552 				group += calender;
       
  5553 			}
       
  5554 			html += group;
       
  5555 		}
       
  5556 		html += buttonPanel;
       
  5557 		inst._keyEvent = false;
       
  5558 		return html;
       
  5559 	},
       
  5560 
       
  5561 	/* Generate the month and year header. */
       
  5562 	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
       
  5563 			secondary, monthNames, monthNamesShort) {
       
  5564 
       
  5565 		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
       
  5566 			changeMonth = this._get(inst, "changeMonth"),
       
  5567 			changeYear = this._get(inst, "changeYear"),
       
  5568 			showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
       
  5569 			html = "<div class='ui-datepicker-title'>",
       
  5570 			monthHtml = "";
       
  5571 
       
  5572 		// month selection
       
  5573 		if (secondary || !changeMonth) {
       
  5574 			monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
       
  5575 		} else {
       
  5576 			inMinYear = (minDate && minDate.getFullYear() === drawYear);
       
  5577 			inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
       
  5578 			monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
       
  5579 			for ( month = 0; month < 12; month++) {
       
  5580 				if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
       
  5581 					monthHtml += "<option value='" + month + "'" +
       
  5582 						(month === drawMonth ? " selected='selected'" : "") +
       
  5583 						">" + monthNamesShort[month] + "</option>";
       
  5584 				}
       
  5585 			}
       
  5586 			monthHtml += "</select>";
       
  5587 		}
       
  5588 
       
  5589 		if (!showMonthAfterYear) {
       
  5590 			html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
       
  5591 		}
       
  5592 
       
  5593 		// year selection
       
  5594 		if ( !inst.yearshtml ) {
       
  5595 			inst.yearshtml = "";
       
  5596 			if (secondary || !changeYear) {
       
  5597 				html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
       
  5598 			} else {
       
  5599 				// determine range of years to display
       
  5600 				years = this._get(inst, "yearRange").split(":");
       
  5601 				thisYear = new Date().getFullYear();
       
  5602 				determineYear = function(value) {
       
  5603 					var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
       
  5604 						(value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
       
  5605 						parseInt(value, 10)));
       
  5606 					return (isNaN(year) ? thisYear : year);
       
  5607 				};
       
  5608 				year = determineYear(years[0]);
       
  5609 				endYear = Math.max(year, determineYear(years[1] || ""));
       
  5610 				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
       
  5611 				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
       
  5612 				inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
       
  5613 				for (; year <= endYear; year++) {
       
  5614 					inst.yearshtml += "<option value='" + year + "'" +
       
  5615 						(year === drawYear ? " selected='selected'" : "") +
       
  5616 						">" + year + "</option>";
       
  5617 				}
       
  5618 				inst.yearshtml += "</select>";
       
  5619 
       
  5620 				html += inst.yearshtml;
       
  5621 				inst.yearshtml = null;
       
  5622 			}
       
  5623 		}
       
  5624 
       
  5625 		html += this._get(inst, "yearSuffix");
       
  5626 		if (showMonthAfterYear) {
       
  5627 			html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
       
  5628 		}
       
  5629 		html += "</div>"; // Close datepicker_header
       
  5630 		return html;
       
  5631 	},
       
  5632 
       
  5633 	/* Adjust one of the date sub-fields. */
       
  5634 	_adjustInstDate: function(inst, offset, period) {
       
  5635 		var year = inst.drawYear + (period === "Y" ? offset : 0),
       
  5636 			month = inst.drawMonth + (period === "M" ? offset : 0),
       
  5637 			day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
       
  5638 			date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
       
  5639 
       
  5640 		inst.selectedDay = date.getDate();
       
  5641 		inst.drawMonth = inst.selectedMonth = date.getMonth();
       
  5642 		inst.drawYear = inst.selectedYear = date.getFullYear();
       
  5643 		if (period === "M" || period === "Y") {
       
  5644 			this._notifyChange(inst);
       
  5645 		}
       
  5646 	},
       
  5647 
       
  5648 	/* Ensure a date is within any min/max bounds. */
       
  5649 	_restrictMinMax: function(inst, date) {
       
  5650 		var minDate = this._getMinMaxDate(inst, "min"),
       
  5651 			maxDate = this._getMinMaxDate(inst, "max"),
       
  5652 			newDate = (minDate && date < minDate ? minDate : date);
       
  5653 		return (maxDate && newDate > maxDate ? maxDate : newDate);
       
  5654 	},
       
  5655 
       
  5656 	/* Notify change of month/year. */
       
  5657 	_notifyChange: function(inst) {
       
  5658 		var onChange = this._get(inst, "onChangeMonthYear");
       
  5659 		if (onChange) {
       
  5660 			onChange.apply((inst.input ? inst.input[0] : null),
       
  5661 				[inst.selectedYear, inst.selectedMonth + 1, inst]);
       
  5662 		}
       
  5663 	},
       
  5664 
       
  5665 	/* Determine the number of months to show. */
       
  5666 	_getNumberOfMonths: function(inst) {
       
  5667 		var numMonths = this._get(inst, "numberOfMonths");
       
  5668 		return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
       
  5669 	},
       
  5670 
       
  5671 	/* Determine the current maximum date - ensure no time components are set. */
       
  5672 	_getMinMaxDate: function(inst, minMax) {
       
  5673 		return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
       
  5674 	},
       
  5675 
       
  5676 	/* Find the number of days in a given month. */
       
  5677 	_getDaysInMonth: function(year, month) {
       
  5678 		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
       
  5679 	},
       
  5680 
       
  5681 	/* Find the day of the week of the first of a month. */
       
  5682 	_getFirstDayOfMonth: function(year, month) {
       
  5683 		return new Date(year, month, 1).getDay();
       
  5684 	},
       
  5685 
       
  5686 	/* Determines if we should allow a "next/prev" month display change. */
       
  5687 	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
       
  5688 		var numMonths = this._getNumberOfMonths(inst),
       
  5689 			date = this._daylightSavingAdjust(new Date(curYear,
       
  5690 			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
       
  5691 
       
  5692 		if (offset < 0) {
       
  5693 			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
       
  5694 		}
       
  5695 		return this._isInRange(inst, date);
       
  5696 	},
       
  5697 
       
  5698 	/* Is the given date in the accepted range? */
       
  5699 	_isInRange: function(inst, date) {
       
  5700 		var yearSplit, currentYear,
       
  5701 			minDate = this._getMinMaxDate(inst, "min"),
       
  5702 			maxDate = this._getMinMaxDate(inst, "max"),
       
  5703 			minYear = null,
       
  5704 			maxYear = null,
       
  5705 			years = this._get(inst, "yearRange");
       
  5706 			if (years){
       
  5707 				yearSplit = years.split(":");
       
  5708 				currentYear = new Date().getFullYear();
       
  5709 				minYear = parseInt(yearSplit[0], 10);
       
  5710 				maxYear = parseInt(yearSplit[1], 10);
       
  5711 				if ( yearSplit[0].match(/[+\-].*/) ) {
       
  5712 					minYear += currentYear;
       
  5713 				}
       
  5714 				if ( yearSplit[1].match(/[+\-].*/) ) {
       
  5715 					maxYear += currentYear;
       
  5716 				}
       
  5717 			}
       
  5718 
       
  5719 		return ((!minDate || date.getTime() >= minDate.getTime()) &&
       
  5720 			(!maxDate || date.getTime() <= maxDate.getTime()) &&
       
  5721 			(!minYear || date.getFullYear() >= minYear) &&
       
  5722 			(!maxYear || date.getFullYear() <= maxYear));
       
  5723 	},
       
  5724 
       
  5725 	/* Provide the configuration settings for formatting/parsing. */
       
  5726 	_getFormatConfig: function(inst) {
       
  5727 		var shortYearCutoff = this._get(inst, "shortYearCutoff");
       
  5728 		shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
       
  5729 			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
       
  5730 		return {shortYearCutoff: shortYearCutoff,
       
  5731 			dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
       
  5732 			monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
       
  5733 	},
       
  5734 
       
  5735 	/* Format the given date for display. */
       
  5736 	_formatDate: function(inst, day, month, year) {
       
  5737 		if (!day) {
       
  5738 			inst.currentDay = inst.selectedDay;
       
  5739 			inst.currentMonth = inst.selectedMonth;
       
  5740 			inst.currentYear = inst.selectedYear;
       
  5741 		}
       
  5742 		var date = (day ? (typeof day === "object" ? day :
       
  5743 			this._daylightSavingAdjust(new Date(year, month, day))) :
       
  5744 			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
       
  5745 		return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
       
  5746 	}
       
  5747 });
       
  5748 
       
  5749 /*
       
  5750  * Bind hover events for datepicker elements.
       
  5751  * Done via delegate so the binding only occurs once in the lifetime of the parent div.
       
  5752  * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
       
  5753  */
       
  5754 function datepicker_bindHover(dpDiv) {
       
  5755 	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
       
  5756 	return dpDiv.delegate(selector, "mouseout", function() {
       
  5757 			$(this).removeClass("ui-state-hover");
       
  5758 			if (this.className.indexOf("ui-datepicker-prev") !== -1) {
       
  5759 				$(this).removeClass("ui-datepicker-prev-hover");
       
  5760 			}
       
  5761 			if (this.className.indexOf("ui-datepicker-next") !== -1) {
       
  5762 				$(this).removeClass("ui-datepicker-next-hover");
       
  5763 			}
       
  5764 		})
       
  5765 		.delegate( selector, "mouseover", datepicker_handleMouseover );
       
  5766 }
       
  5767 
       
  5768 function datepicker_handleMouseover() {
       
  5769 	if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
       
  5770 		$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
       
  5771 		$(this).addClass("ui-state-hover");
       
  5772 		if (this.className.indexOf("ui-datepicker-prev") !== -1) {
       
  5773 			$(this).addClass("ui-datepicker-prev-hover");
       
  5774 		}
       
  5775 		if (this.className.indexOf("ui-datepicker-next") !== -1) {
       
  5776 			$(this).addClass("ui-datepicker-next-hover");
       
  5777 		}
       
  5778 	}
       
  5779 }
       
  5780 
       
  5781 /* jQuery extend now ignores nulls! */
       
  5782 function datepicker_extendRemove(target, props) {
       
  5783 	$.extend(target, props);
       
  5784 	for (var name in props) {
       
  5785 		if (props[name] == null) {
       
  5786 			target[name] = props[name];
       
  5787 		}
       
  5788 	}
       
  5789 	return target;
       
  5790 }
       
  5791 
       
  5792 /* Invoke the datepicker functionality.
       
  5793    @param  options  string - a command, optionally followed by additional parameters or
       
  5794 					Object - settings for attaching new datepicker functionality
       
  5795    @return  jQuery object */
       
  5796 $.fn.datepicker = function(options){
       
  5797 
       
  5798 	/* Verify an empty collection wasn't passed - Fixes #6976 */
       
  5799 	if ( !this.length ) {
       
  5800 		return this;
       
  5801 	}
       
  5802 
       
  5803 	/* Initialise the date picker. */
       
  5804 	if (!$.datepicker.initialized) {
       
  5805 		$(document).mousedown($.datepicker._checkExternalClick);
       
  5806 		$.datepicker.initialized = true;
       
  5807 	}
       
  5808 
       
  5809 	/* Append datepicker main container to body if not exist. */
       
  5810 	if ($("#"+$.datepicker._mainDivId).length === 0) {
       
  5811 		$("body").append($.datepicker.dpDiv);
       
  5812 	}
       
  5813 
       
  5814 	var otherArgs = Array.prototype.slice.call(arguments, 1);
       
  5815 	if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
       
  5816 		return $.datepicker["_" + options + "Datepicker"].
       
  5817 			apply($.datepicker, [this[0]].concat(otherArgs));
       
  5818 	}
       
  5819 	if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
       
  5820 		return $.datepicker["_" + options + "Datepicker"].
       
  5821 			apply($.datepicker, [this[0]].concat(otherArgs));
       
  5822 	}
       
  5823 	return this.each(function() {
       
  5824 		typeof options === "string" ?
       
  5825 			$.datepicker["_" + options + "Datepicker"].
       
  5826 				apply($.datepicker, [this].concat(otherArgs)) :
       
  5827 			$.datepicker._attachDatepicker(this, options);
       
  5828 	});
       
  5829 };
       
  5830 
       
  5831 $.datepicker = new Datepicker(); // singleton instance
       
  5832 $.datepicker.initialized = false;
       
  5833 $.datepicker.uuid = new Date().getTime();
       
  5834 $.datepicker.version = "1.11.4";
       
  5835 
       
  5836 var datepicker = $.datepicker;
       
  5837 
       
  5838 
       
  5839 /*!
       
  5840  * jQuery UI Draggable 1.11.4
       
  5841  * http://jqueryui.com
       
  5842  *
       
  5843  * Copyright jQuery Foundation and other contributors
       
  5844  * Released under the MIT license.
       
  5845  * http://jquery.org/license
       
  5846  *
       
  5847  * http://api.jqueryui.com/draggable/
       
  5848  */
       
  5849 
       
  5850 
       
  5851 $.widget("ui.draggable", $.ui.mouse, {
       
  5852 	version: "1.11.4",
       
  5853 	widgetEventPrefix: "drag",
       
  5854 	options: {
       
  5855 		addClasses: true,
       
  5856 		appendTo: "parent",
       
  5857 		axis: false,
       
  5858 		connectToSortable: false,
       
  5859 		containment: false,
       
  5860 		cursor: "auto",
       
  5861 		cursorAt: false,
       
  5862 		grid: false,
       
  5863 		handle: false,
       
  5864 		helper: "original",
       
  5865 		iframeFix: false,
       
  5866 		opacity: false,
       
  5867 		refreshPositions: false,
       
  5868 		revert: false,
       
  5869 		revertDuration: 500,
       
  5870 		scope: "default",
       
  5871 		scroll: true,
       
  5872 		scrollSensitivity: 20,
       
  5873 		scrollSpeed: 20,
       
  5874 		snap: false,
       
  5875 		snapMode: "both",
       
  5876 		snapTolerance: 20,
       
  5877 		stack: false,
       
  5878 		zIndex: false,
       
  5879 
       
  5880 		// callbacks
       
  5881 		drag: null,
       
  5882 		start: null,
       
  5883 		stop: null
       
  5884 	},
       
  5885 	_create: function() {
       
  5886 
       
  5887 		if ( this.options.helper === "original" ) {
       
  5888 			this._setPositionRelative();
       
  5889 		}
       
  5890 		if (this.options.addClasses){
       
  5891 			this.element.addClass("ui-draggable");
       
  5892 		}
       
  5893 		if (this.options.disabled){
       
  5894 			this.element.addClass("ui-draggable-disabled");
       
  5895 		}
       
  5896 		this._setHandleClassName();
       
  5897 
       
  5898 		this._mouseInit();
       
  5899 	},
       
  5900 
       
  5901 	_setOption: function( key, value ) {
       
  5902 		this._super( key, value );
       
  5903 		if ( key === "handle" ) {
       
  5904 			this._removeHandleClassName();
       
  5905 			this._setHandleClassName();
       
  5906 		}
       
  5907 	},
       
  5908 
       
  5909 	_destroy: function() {
       
  5910 		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
       
  5911 			this.destroyOnClear = true;
       
  5912 			return;
       
  5913 		}
       
  5914 		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
       
  5915 		this._removeHandleClassName();
       
  5916 		this._mouseDestroy();
       
  5917 	},
       
  5918 
       
  5919 	_mouseCapture: function(event) {
       
  5920 		var o = this.options;
       
  5921 
       
  5922 		this._blurActiveElement( event );
       
  5923 
       
  5924 		// among others, prevent a drag on a resizable-handle
       
  5925 		if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
       
  5926 			return false;
       
  5927 		}
       
  5928 
       
  5929 		//Quit if we're not on a valid handle
       
  5930 		this.handle = this._getHandle(event);
       
  5931 		if (!this.handle) {
       
  5932 			return false;
       
  5933 		}
       
  5934 
       
  5935 		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
       
  5936 
       
  5937 		return true;
       
  5938 
       
  5939 	},
       
  5940 
       
  5941 	_blockFrames: function( selector ) {
       
  5942 		this.iframeBlocks = this.document.find( selector ).map(function() {
       
  5943 			var iframe = $( this );
       
  5944 
       
  5945 			return $( "<div>" )
       
  5946 				.css( "position", "absolute" )
       
  5947 				.appendTo( iframe.parent() )
       
  5948 				.outerWidth( iframe.outerWidth() )
       
  5949 				.outerHeight( iframe.outerHeight() )
       
  5950 				.offset( iframe.offset() )[ 0 ];
       
  5951 		});
       
  5952 	},
       
  5953 
       
  5954 	_unblockFrames: function() {
       
  5955 		if ( this.iframeBlocks ) {
       
  5956 			this.iframeBlocks.remove();
       
  5957 			delete this.iframeBlocks;
       
  5958 		}
       
  5959 	},
       
  5960 
       
  5961 	_blurActiveElement: function( event ) {
       
  5962 		var document = this.document[ 0 ];
       
  5963 
       
  5964 		// Only need to blur if the event occurred on the draggable itself, see #10527
       
  5965 		if ( !this.handleElement.is( event.target ) ) {
       
  5966 			return;
       
  5967 		}
       
  5968 
       
  5969 		// support: IE9
       
  5970 		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
       
  5971 		try {
       
  5972 
       
  5973 			// Support: IE9, IE10
       
  5974 			// If the <body> is blurred, IE will switch windows, see #9520
       
  5975 			if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
       
  5976 
       
  5977 				// Blur any element that currently has focus, see #4261
       
  5978 				$( document.activeElement ).blur();
       
  5979 			}
       
  5980 		} catch ( error ) {}
       
  5981 	},
       
  5982 
       
  5983 	_mouseStart: function(event) {
       
  5984 
       
  5985 		var o = this.options;
       
  5986 
       
  5987 		//Create and append the visible helper
       
  5988 		this.helper = this._createHelper(event);
       
  5989 
       
  5990 		this.helper.addClass("ui-draggable-dragging");
       
  5991 
       
  5992 		//Cache the helper size
       
  5993 		this._cacheHelperProportions();
       
  5994 
       
  5995 		//If ddmanager is used for droppables, set the global draggable
       
  5996 		if ($.ui.ddmanager) {
       
  5997 			$.ui.ddmanager.current = this;
       
  5998 		}
       
  5999 
       
  6000 		/*
       
  6001 		 * - Position generation -
       
  6002 		 * This block generates everything position related - it's the core of draggables.
       
  6003 		 */
       
  6004 
       
  6005 		//Cache the margins of the original element
       
  6006 		this._cacheMargins();
       
  6007 
       
  6008 		//Store the helper's css position
       
  6009 		this.cssPosition = this.helper.css( "position" );
       
  6010 		this.scrollParent = this.helper.scrollParent( true );
       
  6011 		this.offsetParent = this.helper.offsetParent();
       
  6012 		this.hasFixedAncestor = this.helper.parents().filter(function() {
       
  6013 				return $( this ).css( "position" ) === "fixed";
       
  6014 			}).length > 0;
       
  6015 
       
  6016 		//The element's absolute position on the page minus margins
       
  6017 		this.positionAbs = this.element.offset();
       
  6018 		this._refreshOffsets( event );
       
  6019 
       
  6020 		//Generate the original position
       
  6021 		this.originalPosition = this.position = this._generatePosition( event, false );
       
  6022 		this.originalPageX = event.pageX;
       
  6023 		this.originalPageY = event.pageY;
       
  6024 
       
  6025 		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
       
  6026 		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
       
  6027 
       
  6028 		//Set a containment if given in the options
       
  6029 		this._setContainment();
       
  6030 
       
  6031 		//Trigger event + callbacks
       
  6032 		if (this._trigger("start", event) === false) {
       
  6033 			this._clear();
       
  6034 			return false;
       
  6035 		}
       
  6036 
       
  6037 		//Recache the helper size
       
  6038 		this._cacheHelperProportions();
       
  6039 
       
  6040 		//Prepare the droppable offsets
       
  6041 		if ($.ui.ddmanager && !o.dropBehaviour) {
       
  6042 			$.ui.ddmanager.prepareOffsets(this, event);
       
  6043 		}
       
  6044 
       
  6045 		// Reset helper's right/bottom css if they're set and set explicit width/height instead
       
  6046 		// as this prevents resizing of elements with right/bottom set (see #7772)
       
  6047 		this._normalizeRightBottom();
       
  6048 
       
  6049 		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
       
  6050 
       
  6051 		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
       
  6052 		if ( $.ui.ddmanager ) {
       
  6053 			$.ui.ddmanager.dragStart(this, event);
       
  6054 		}
       
  6055 
       
  6056 		return true;
       
  6057 	},
       
  6058 
       
  6059 	_refreshOffsets: function( event ) {
       
  6060 		this.offset = {
       
  6061 			top: this.positionAbs.top - this.margins.top,
       
  6062 			left: this.positionAbs.left - this.margins.left,
       
  6063 			scroll: false,
       
  6064 			parent: this._getParentOffset(),
       
  6065 			relative: this._getRelativeOffset()
       
  6066 		};
       
  6067 
       
  6068 		this.offset.click = {
       
  6069 			left: event.pageX - this.offset.left,
       
  6070 			top: event.pageY - this.offset.top
       
  6071 		};
       
  6072 	},
       
  6073 
       
  6074 	_mouseDrag: function(event, noPropagation) {
       
  6075 		// reset any necessary cached properties (see #5009)
       
  6076 		if ( this.hasFixedAncestor ) {
       
  6077 			this.offset.parent = this._getParentOffset();
       
  6078 		}
       
  6079 
       
  6080 		//Compute the helpers position
       
  6081 		this.position = this._generatePosition( event, true );
       
  6082 		this.positionAbs = this._convertPositionTo("absolute");
       
  6083 
       
  6084 		//Call plugins and callbacks and use the resulting position if something is returned
       
  6085 		if (!noPropagation) {
       
  6086 			var ui = this._uiHash();
       
  6087 			if (this._trigger("drag", event, ui) === false) {
       
  6088 				this._mouseUp({});
       
  6089 				return false;
       
  6090 			}
       
  6091 			this.position = ui.position;
       
  6092 		}
       
  6093 
       
  6094 		this.helper[ 0 ].style.left = this.position.left + "px";
       
  6095 		this.helper[ 0 ].style.top = this.position.top + "px";
       
  6096 
       
  6097 		if ($.ui.ddmanager) {
       
  6098 			$.ui.ddmanager.drag(this, event);
       
  6099 		}
       
  6100 
       
  6101 		return false;
       
  6102 	},
       
  6103 
       
  6104 	_mouseStop: function(event) {
       
  6105 
       
  6106 		//If we are using droppables, inform the manager about the drop
       
  6107 		var that = this,
       
  6108 			dropped = false;
       
  6109 		if ($.ui.ddmanager && !this.options.dropBehaviour) {
       
  6110 			dropped = $.ui.ddmanager.drop(this, event);
       
  6111 		}
       
  6112 
       
  6113 		//if a drop comes from outside (a sortable)
       
  6114 		if (this.dropped) {
       
  6115 			dropped = this.dropped;
       
  6116 			this.dropped = false;
       
  6117 		}
       
  6118 
       
  6119 		if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
       
  6120 			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
       
  6121 				if (that._trigger("stop", event) !== false) {
       
  6122 					that._clear();
       
  6123 				}
       
  6124 			});
       
  6125 		} else {
       
  6126 			if (this._trigger("stop", event) !== false) {
       
  6127 				this._clear();
       
  6128 			}
       
  6129 		}
       
  6130 
       
  6131 		return false;
       
  6132 	},
       
  6133 
       
  6134 	_mouseUp: function( event ) {
       
  6135 		this._unblockFrames();
       
  6136 
       
  6137 		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
       
  6138 		if ( $.ui.ddmanager ) {
       
  6139 			$.ui.ddmanager.dragStop(this, event);
       
  6140 		}
       
  6141 
       
  6142 		// Only need to focus if the event occurred on the draggable itself, see #10527
       
  6143 		if ( this.handleElement.is( event.target ) ) {
       
  6144 			// The interaction is over; whether or not the click resulted in a drag, focus the element
       
  6145 			this.element.focus();
       
  6146 		}
       
  6147 
       
  6148 		return $.ui.mouse.prototype._mouseUp.call(this, event);
       
  6149 	},
       
  6150 
       
  6151 	cancel: function() {
       
  6152 
       
  6153 		if (this.helper.is(".ui-draggable-dragging")) {
       
  6154 			this._mouseUp({});
       
  6155 		} else {
       
  6156 			this._clear();
       
  6157 		}
       
  6158 
       
  6159 		return this;
       
  6160 
       
  6161 	},
       
  6162 
       
  6163 	_getHandle: function(event) {
       
  6164 		return this.options.handle ?
       
  6165 			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
       
  6166 			true;
       
  6167 	},
       
  6168 
       
  6169 	_setHandleClassName: function() {
       
  6170 		this.handleElement = this.options.handle ?
       
  6171 			this.element.find( this.options.handle ) : this.element;
       
  6172 		this.handleElement.addClass( "ui-draggable-handle" );
       
  6173 	},
       
  6174 
       
  6175 	_removeHandleClassName: function() {
       
  6176 		this.handleElement.removeClass( "ui-draggable-handle" );
       
  6177 	},
       
  6178 
       
  6179 	_createHelper: function(event) {
       
  6180 
       
  6181 		var o = this.options,
       
  6182 			helperIsFunction = $.isFunction( o.helper ),
       
  6183 			helper = helperIsFunction ?
       
  6184 				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
       
  6185 				( o.helper === "clone" ?
       
  6186 					this.element.clone().removeAttr( "id" ) :
       
  6187 					this.element );
       
  6188 
       
  6189 		if (!helper.parents("body").length) {
       
  6190 			helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
       
  6191 		}
       
  6192 
       
  6193 		// http://bugs.jqueryui.com/ticket/9446
       
  6194 		// a helper function can return the original element
       
  6195 		// which wouldn't have been set to relative in _create
       
  6196 		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
       
  6197 			this._setPositionRelative();
       
  6198 		}
       
  6199 
       
  6200 		if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
       
  6201 			helper.css("position", "absolute");
       
  6202 		}
       
  6203 
       
  6204 		return helper;
       
  6205 
       
  6206 	},
       
  6207 
       
  6208 	_setPositionRelative: function() {
       
  6209 		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
       
  6210 			this.element[ 0 ].style.position = "relative";
       
  6211 		}
       
  6212 	},
       
  6213 
       
  6214 	_adjustOffsetFromHelper: function(obj) {
       
  6215 		if (typeof obj === "string") {
       
  6216 			obj = obj.split(" ");
       
  6217 		}
       
  6218 		if ($.isArray(obj)) {
       
  6219 			obj = { left: +obj[0], top: +obj[1] || 0 };
       
  6220 		}
       
  6221 		if ("left" in obj) {
       
  6222 			this.offset.click.left = obj.left + this.margins.left;
       
  6223 		}
       
  6224 		if ("right" in obj) {
       
  6225 			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
       
  6226 		}
       
  6227 		if ("top" in obj) {
       
  6228 			this.offset.click.top = obj.top + this.margins.top;
       
  6229 		}
       
  6230 		if ("bottom" in obj) {
       
  6231 			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
       
  6232 		}
       
  6233 	},
       
  6234 
       
  6235 	_isRootNode: function( element ) {
       
  6236 		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
       
  6237 	},
       
  6238 
       
  6239 	_getParentOffset: function() {
       
  6240 
       
  6241 		//Get the offsetParent and cache its position
       
  6242 		var po = this.offsetParent.offset(),
       
  6243 			document = this.document[ 0 ];
       
  6244 
       
  6245 		// This is a special case where we need to modify a offset calculated on start, since the following happened:
       
  6246 		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
       
  6247 		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
       
  6248 		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
       
  6249 		if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
       
  6250 			po.left += this.scrollParent.scrollLeft();
       
  6251 			po.top += this.scrollParent.scrollTop();
       
  6252 		}
       
  6253 
       
  6254 		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
       
  6255 			po = { top: 0, left: 0 };
       
  6256 		}
       
  6257 
       
  6258 		return {
       
  6259 			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
       
  6260 			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
       
  6261 		};
       
  6262 
       
  6263 	},
       
  6264 
       
  6265 	_getRelativeOffset: function() {
       
  6266 		if ( this.cssPosition !== "relative" ) {
       
  6267 			return { top: 0, left: 0 };
       
  6268 		}
       
  6269 
       
  6270 		var p = this.element.position(),
       
  6271 			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
       
  6272 
       
  6273 		return {
       
  6274 			top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
       
  6275 			left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
       
  6276 		};
       
  6277 
       
  6278 	},
       
  6279 
       
  6280 	_cacheMargins: function() {
       
  6281 		this.margins = {
       
  6282 			left: (parseInt(this.element.css("marginLeft"), 10) || 0),
       
  6283 			top: (parseInt(this.element.css("marginTop"), 10) || 0),
       
  6284 			right: (parseInt(this.element.css("marginRight"), 10) || 0),
       
  6285 			bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
       
  6286 		};
       
  6287 	},
       
  6288 
       
  6289 	_cacheHelperProportions: function() {
       
  6290 		this.helperProportions = {
       
  6291 			width: this.helper.outerWidth(),
       
  6292 			height: this.helper.outerHeight()
       
  6293 		};
       
  6294 	},
       
  6295 
       
  6296 	_setContainment: function() {
       
  6297 
       
  6298 		var isUserScrollable, c, ce,
       
  6299 			o = this.options,
       
  6300 			document = this.document[ 0 ];
       
  6301 
       
  6302 		this.relativeContainer = null;
       
  6303 
       
  6304 		if ( !o.containment ) {
       
  6305 			this.containment = null;
       
  6306 			return;
       
  6307 		}
       
  6308 
       
  6309 		if ( o.containment === "window" ) {
       
  6310 			this.containment = [
       
  6311 				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
       
  6312 				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
       
  6313 				$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
       
  6314 				$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
       
  6315 			];
       
  6316 			return;
       
  6317 		}
       
  6318 
       
  6319 		if ( o.containment === "document") {
       
  6320 			this.containment = [
       
  6321 				0,
       
  6322 				0,
       
  6323 				$( document ).width() - this.helperProportions.width - this.margins.left,
       
  6324 				( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
       
  6325 			];
       
  6326 			return;
       
  6327 		}
       
  6328 
       
  6329 		if ( o.containment.constructor === Array ) {
       
  6330 			this.containment = o.containment;
       
  6331 			return;
       
  6332 		}
       
  6333 
       
  6334 		if ( o.containment === "parent" ) {
       
  6335 			o.containment = this.helper[ 0 ].parentNode;
       
  6336 		}
       
  6337 
       
  6338 		c = $( o.containment );
       
  6339 		ce = c[ 0 ];
       
  6340 
       
  6341 		if ( !ce ) {
       
  6342 			return;
       
  6343 		}
       
  6344 
       
  6345 		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
       
  6346 
       
  6347 		this.containment = [
       
  6348 			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
       
  6349 			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
       
  6350 			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
       
  6351 				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
       
  6352 				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
       
  6353 				this.helperProportions.width -
       
  6354 				this.margins.left -
       
  6355 				this.margins.right,
       
  6356 			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
       
  6357 				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
       
  6358 				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
       
  6359 				this.helperProportions.height -
       
  6360 				this.margins.top -
       
  6361 				this.margins.bottom
       
  6362 		];
       
  6363 		this.relativeContainer = c;
       
  6364 	},
       
  6365 
       
  6366 	_convertPositionTo: function(d, pos) {
       
  6367 
       
  6368 		if (!pos) {
       
  6369 			pos = this.position;
       
  6370 		}
       
  6371 
       
  6372 		var mod = d === "absolute" ? 1 : -1,
       
  6373 			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
       
  6374 
       
  6375 		return {
       
  6376 			top: (
       
  6377 				pos.top	+																// The absolute mouse position
       
  6378 				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
       
  6379 				this.offset.parent.top * mod -										// The offsetParent's offset without borders (offset + border)
       
  6380 				( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
       
  6381 			),
       
  6382 			left: (
       
  6383 				pos.left +																// The absolute mouse position
       
  6384 				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
       
  6385 				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
       
  6386 				( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
       
  6387 			)
       
  6388 		};
       
  6389 
       
  6390 	},
       
  6391 
       
  6392 	_generatePosition: function( event, constrainPosition ) {
       
  6393 
       
  6394 		var containment, co, top, left,
       
  6395 			o = this.options,
       
  6396 			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
       
  6397 			pageX = event.pageX,
       
  6398 			pageY = event.pageY;
       
  6399 
       
  6400 		// Cache the scroll
       
  6401 		if ( !scrollIsRootNode || !this.offset.scroll ) {
       
  6402 			this.offset.scroll = {
       
  6403 				top: this.scrollParent.scrollTop(),
       
  6404 				left: this.scrollParent.scrollLeft()
       
  6405 			};
       
  6406 		}
       
  6407 
       
  6408 		/*
       
  6409 		 * - Position constraining -
       
  6410 		 * Constrain the position to a mix of grid, containment.
       
  6411 		 */
       
  6412 
       
  6413 		// If we are not dragging yet, we won't check for options
       
  6414 		if ( constrainPosition ) {
       
  6415 			if ( this.containment ) {
       
  6416 				if ( this.relativeContainer ){
       
  6417 					co = this.relativeContainer.offset();
       
  6418 					containment = [
       
  6419 						this.containment[ 0 ] + co.left,
       
  6420 						this.containment[ 1 ] + co.top,
       
  6421 						this.containment[ 2 ] + co.left,
       
  6422 						this.containment[ 3 ] + co.top
       
  6423 					];
       
  6424 				} else {
       
  6425 					containment = this.containment;
       
  6426 				}
       
  6427 
       
  6428 				if (event.pageX - this.offset.click.left < containment[0]) {
       
  6429 					pageX = containment[0] + this.offset.click.left;
       
  6430 				}
       
  6431 				if (event.pageY - this.offset.click.top < containment[1]) {
       
  6432 					pageY = containment[1] + this.offset.click.top;
       
  6433 				}
       
  6434 				if (event.pageX - this.offset.click.left > containment[2]) {
       
  6435 					pageX = containment[2] + this.offset.click.left;
       
  6436 				}
       
  6437 				if (event.pageY - this.offset.click.top > containment[3]) {
       
  6438 					pageY = containment[3] + this.offset.click.top;
       
  6439 				}
       
  6440 			}
       
  6441 
       
  6442 			if (o.grid) {
       
  6443 				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
       
  6444 				top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
       
  6445 				pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
       
  6446 
       
  6447 				left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
       
  6448 				pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
       
  6449 			}
       
  6450 
       
  6451 			if ( o.axis === "y" ) {
       
  6452 				pageX = this.originalPageX;
       
  6453 			}
       
  6454 
       
  6455 			if ( o.axis === "x" ) {
       
  6456 				pageY = this.originalPageY;
       
  6457 			}
       
  6458 		}
       
  6459 
       
  6460 		return {
       
  6461 			top: (
       
  6462 				pageY -																	// The absolute mouse position
       
  6463 				this.offset.click.top	-												// Click offset (relative to the element)
       
  6464 				this.offset.relative.top -												// Only for relative positioned nodes: Relative offset from element to offset parent
       
  6465 				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
       
  6466 				( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
       
  6467 			),
       
  6468 			left: (
       
  6469 				pageX -																	// The absolute mouse position
       
  6470 				this.offset.click.left -												// Click offset (relative to the element)
       
  6471 				this.offset.relative.left -												// Only for relative positioned nodes: Relative offset from element to offset parent
       
  6472 				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
       
  6473 				( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
       
  6474 			)
       
  6475 		};
       
  6476 
       
  6477 	},
       
  6478 
       
  6479 	_clear: function() {
       
  6480 		this.helper.removeClass("ui-draggable-dragging");
       
  6481 		if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
       
  6482 			this.helper.remove();
       
  6483 		}
       
  6484 		this.helper = null;
       
  6485 		this.cancelHelperRemoval = false;
       
  6486 		if ( this.destroyOnClear ) {
       
  6487 			this.destroy();
       
  6488 		}
       
  6489 	},
       
  6490 
       
  6491 	_normalizeRightBottom: function() {
       
  6492 		if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
       
  6493 			this.helper.width( this.helper.width() );
       
  6494 			this.helper.css( "right", "auto" );
       
  6495 		}
       
  6496 		if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
       
  6497 			this.helper.height( this.helper.height() );
       
  6498 			this.helper.css( "bottom", "auto" );
       
  6499 		}
       
  6500 	},
       
  6501 
       
  6502 	// From now on bulk stuff - mainly helpers
       
  6503 
       
  6504 	_trigger: function( type, event, ui ) {
       
  6505 		ui = ui || this._uiHash();
       
  6506 		$.ui.plugin.call( this, type, [ event, ui, this ], true );
       
  6507 
       
  6508 		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
       
  6509 		if ( /^(drag|start|stop)/.test( type ) ) {
       
  6510 			this.positionAbs = this._convertPositionTo( "absolute" );
       
  6511 			ui.offset = this.positionAbs;
       
  6512 		}
       
  6513 		return $.Widget.prototype._trigger.call( this, type, event, ui );
       
  6514 	},
       
  6515 
       
  6516 	plugins: {},
       
  6517 
       
  6518 	_uiHash: function() {
       
  6519 		return {
       
  6520 			helper: this.helper,
       
  6521 			position: this.position,
       
  6522 			originalPosition: this.originalPosition,
       
  6523 			offset: this.positionAbs
       
  6524 		};
       
  6525 	}
       
  6526 
       
  6527 });
       
  6528 
       
  6529 $.ui.plugin.add( "draggable", "connectToSortable", {
       
  6530 	start: function( event, ui, draggable ) {
       
  6531 		var uiSortable = $.extend( {}, ui, {
       
  6532 			item: draggable.element
       
  6533 		});
       
  6534 
       
  6535 		draggable.sortables = [];
       
  6536 		$( draggable.options.connectToSortable ).each(function() {
       
  6537 			var sortable = $( this ).sortable( "instance" );
       
  6538 
       
  6539 			if ( sortable && !sortable.options.disabled ) {
       
  6540 				draggable.sortables.push( sortable );
       
  6541 
       
  6542 				// refreshPositions is called at drag start to refresh the containerCache
       
  6543 				// which is used in drag. This ensures it's initialized and synchronized
       
  6544 				// with any changes that might have happened on the page since initialization.
       
  6545 				sortable.refreshPositions();
       
  6546 				sortable._trigger("activate", event, uiSortable);
       
  6547 			}
       
  6548 		});
       
  6549 	},
       
  6550 	stop: function( event, ui, draggable ) {
       
  6551 		var uiSortable = $.extend( {}, ui, {
       
  6552 			item: draggable.element
       
  6553 		});
       
  6554 
       
  6555 		draggable.cancelHelperRemoval = false;
       
  6556 
       
  6557 		$.each( draggable.sortables, function() {
       
  6558 			var sortable = this;
       
  6559 
       
  6560 			if ( sortable.isOver ) {
       
  6561 				sortable.isOver = 0;
       
  6562 
       
  6563 				// Allow this sortable to handle removing the helper
       
  6564 				draggable.cancelHelperRemoval = true;
       
  6565 				sortable.cancelHelperRemoval = false;
       
  6566 
       
  6567 				// Use _storedCSS To restore properties in the sortable,
       
  6568 				// as this also handles revert (#9675) since the draggable
       
  6569 				// may have modified them in unexpected ways (#8809)
       
  6570 				sortable._storedCSS = {
       
  6571 					position: sortable.placeholder.css( "position" ),
       
  6572 					top: sortable.placeholder.css( "top" ),
       
  6573 					left: sortable.placeholder.css( "left" )
       
  6574 				};
       
  6575 
       
  6576 				sortable._mouseStop(event);
       
  6577 
       
  6578 				// Once drag has ended, the sortable should return to using
       
  6579 				// its original helper, not the shared helper from draggable
       
  6580 				sortable.options.helper = sortable.options._helper;
       
  6581 			} else {
       
  6582 				// Prevent this Sortable from removing the helper.
       
  6583 				// However, don't set the draggable to remove the helper
       
  6584 				// either as another connected Sortable may yet handle the removal.
       
  6585 				sortable.cancelHelperRemoval = true;
       
  6586 
       
  6587 				sortable._trigger( "deactivate", event, uiSortable );
       
  6588 			}
       
  6589 		});
       
  6590 	},
       
  6591 	drag: function( event, ui, draggable ) {
       
  6592 		$.each( draggable.sortables, function() {
       
  6593 			var innermostIntersecting = false,
       
  6594 				sortable = this;
       
  6595 
       
  6596 			// Copy over variables that sortable's _intersectsWith uses
       
  6597 			sortable.positionAbs = draggable.positionAbs;
       
  6598 			sortable.helperProportions = draggable.helperProportions;
       
  6599 			sortable.offset.click = draggable.offset.click;
       
  6600 
       
  6601 			if ( sortable._intersectsWith( sortable.containerCache ) ) {
       
  6602 				innermostIntersecting = true;
       
  6603 
       
  6604 				$.each( draggable.sortables, function() {
       
  6605 					// Copy over variables that sortable's _intersectsWith uses
       
  6606 					this.positionAbs = draggable.positionAbs;
       
  6607 					this.helperProportions = draggable.helperProportions;
       
  6608 					this.offset.click = draggable.offset.click;
       
  6609 
       
  6610 					if ( this !== sortable &&
       
  6611 							this._intersectsWith( this.containerCache ) &&
       
  6612 							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
       
  6613 						innermostIntersecting = false;
       
  6614 					}
       
  6615 
       
  6616 					return innermostIntersecting;
       
  6617 				});
       
  6618 			}
       
  6619 
       
  6620 			if ( innermostIntersecting ) {
       
  6621 				// If it intersects, we use a little isOver variable and set it once,
       
  6622 				// so that the move-in stuff gets fired only once.
       
  6623 				if ( !sortable.isOver ) {
       
  6624 					sortable.isOver = 1;
       
  6625 
       
  6626 					// Store draggable's parent in case we need to reappend to it later.
       
  6627 					draggable._parent = ui.helper.parent();
       
  6628 
       
  6629 					sortable.currentItem = ui.helper
       
  6630 						.appendTo( sortable.element )
       
  6631 						.data( "ui-sortable-item", true );
       
  6632 
       
  6633 					// Store helper option to later restore it
       
  6634 					sortable.options._helper = sortable.options.helper;
       
  6635 
       
  6636 					sortable.options.helper = function() {
       
  6637 						return ui.helper[ 0 ];
       
  6638 					};
       
  6639 
       
  6640 					// Fire the start events of the sortable with our passed browser event,
       
  6641 					// and our own helper (so it doesn't create a new one)
       
  6642 					event.target = sortable.currentItem[ 0 ];
       
  6643 					sortable._mouseCapture( event, true );
       
  6644 					sortable._mouseStart( event, true, true );
       
  6645 
       
  6646 					// Because the browser event is way off the new appended portlet,
       
  6647 					// modify necessary variables to reflect the changes
       
  6648 					sortable.offset.click.top = draggable.offset.click.top;
       
  6649 					sortable.offset.click.left = draggable.offset.click.left;
       
  6650 					sortable.offset.parent.left -= draggable.offset.parent.left -
       
  6651 						sortable.offset.parent.left;
       
  6652 					sortable.offset.parent.top -= draggable.offset.parent.top -
       
  6653 						sortable.offset.parent.top;
       
  6654 
       
  6655 					draggable._trigger( "toSortable", event );
       
  6656 
       
  6657 					// Inform draggable that the helper is in a valid drop zone,
       
  6658 					// used solely in the revert option to handle "valid/invalid".
       
  6659 					draggable.dropped = sortable.element;
       
  6660 
       
  6661 					// Need to refreshPositions of all sortables in the case that
       
  6662 					// adding to one sortable changes the location of the other sortables (#9675)
       
  6663 					$.each( draggable.sortables, function() {
       
  6664 						this.refreshPositions();
       
  6665 					});
       
  6666 
       
  6667 					// hack so receive/update callbacks work (mostly)
       
  6668 					draggable.currentItem = draggable.element;
       
  6669 					sortable.fromOutside = draggable;
       
  6670 				}
       
  6671 
       
  6672 				if ( sortable.currentItem ) {
       
  6673 					sortable._mouseDrag( event );
       
  6674 					// Copy the sortable's position because the draggable's can potentially reflect
       
  6675 					// a relative position, while sortable is always absolute, which the dragged
       
  6676 					// element has now become. (#8809)
       
  6677 					ui.position = sortable.position;
       
  6678 				}
       
  6679 			} else {
       
  6680 				// If it doesn't intersect with the sortable, and it intersected before,
       
  6681 				// we fake the drag stop of the sortable, but make sure it doesn't remove
       
  6682 				// the helper by using cancelHelperRemoval.
       
  6683 				if ( sortable.isOver ) {
       
  6684 
       
  6685 					sortable.isOver = 0;
       
  6686 					sortable.cancelHelperRemoval = true;
       
  6687 
       
  6688 					// Calling sortable's mouseStop would trigger a revert,
       
  6689 					// so revert must be temporarily false until after mouseStop is called.
       
  6690 					sortable.options._revert = sortable.options.revert;
       
  6691 					sortable.options.revert = false;
       
  6692 
       
  6693 					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
       
  6694 					sortable._mouseStop( event, true );
       
  6695 
       
  6696 					// restore sortable behaviors that were modfied
       
  6697 					// when the draggable entered the sortable area (#9481)
       
  6698 					sortable.options.revert = sortable.options._revert;
       
  6699 					sortable.options.helper = sortable.options._helper;
       
  6700 
       
  6701 					if ( sortable.placeholder ) {
       
  6702 						sortable.placeholder.remove();
       
  6703 					}
       
  6704 
       
  6705 					// Restore and recalculate the draggable's offset considering the sortable
       
  6706 					// may have modified them in unexpected ways. (#8809, #10669)
       
  6707 					ui.helper.appendTo( draggable._parent );
       
  6708 					draggable._refreshOffsets( event );
       
  6709 					ui.position = draggable._generatePosition( event, true );
       
  6710 
       
  6711 					draggable._trigger( "fromSortable", event );
       
  6712 
       
  6713 					// Inform draggable that the helper is no longer in a valid drop zone
       
  6714 					draggable.dropped = false;
       
  6715 
       
  6716 					// Need to refreshPositions of all sortables just in case removing
       
  6717 					// from one sortable changes the location of other sortables (#9675)
       
  6718 					$.each( draggable.sortables, function() {
       
  6719 						this.refreshPositions();
       
  6720 					});
       
  6721 				}
       
  6722 			}
       
  6723 		});
       
  6724 	}
       
  6725 });
       
  6726 
       
  6727 $.ui.plugin.add("draggable", "cursor", {
       
  6728 	start: function( event, ui, instance ) {
       
  6729 		var t = $( "body" ),
       
  6730 			o = instance.options;
       
  6731 
       
  6732 		if (t.css("cursor")) {
       
  6733 			o._cursor = t.css("cursor");
       
  6734 		}
       
  6735 		t.css("cursor", o.cursor);
       
  6736 	},
       
  6737 	stop: function( event, ui, instance ) {
       
  6738 		var o = instance.options;
       
  6739 		if (o._cursor) {
       
  6740 			$("body").css("cursor", o._cursor);
       
  6741 		}
       
  6742 	}
       
  6743 });
       
  6744 
       
  6745 $.ui.plugin.add("draggable", "opacity", {
       
  6746 	start: function( event, ui, instance ) {
       
  6747 		var t = $( ui.helper ),
       
  6748 			o = instance.options;
       
  6749 		if (t.css("opacity")) {
       
  6750 			o._opacity = t.css("opacity");
       
  6751 		}
       
  6752 		t.css("opacity", o.opacity);
       
  6753 	},
       
  6754 	stop: function( event, ui, instance ) {
       
  6755 		var o = instance.options;
       
  6756 		if (o._opacity) {
       
  6757 			$(ui.helper).css("opacity", o._opacity);
       
  6758 		}
       
  6759 	}
       
  6760 });
       
  6761 
       
  6762 $.ui.plugin.add("draggable", "scroll", {
       
  6763 	start: function( event, ui, i ) {
       
  6764 		if ( !i.scrollParentNotHidden ) {
       
  6765 			i.scrollParentNotHidden = i.helper.scrollParent( false );
       
  6766 		}
       
  6767 
       
  6768 		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
       
  6769 			i.overflowOffset = i.scrollParentNotHidden.offset();
       
  6770 		}
       
  6771 	},
       
  6772 	drag: function( event, ui, i  ) {
       
  6773 
       
  6774 		var o = i.options,
       
  6775 			scrolled = false,
       
  6776 			scrollParent = i.scrollParentNotHidden[ 0 ],
       
  6777 			document = i.document[ 0 ];
       
  6778 
       
  6779 		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
       
  6780 			if ( !o.axis || o.axis !== "x" ) {
       
  6781 				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
       
  6782 					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
       
  6783 				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
       
  6784 					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
       
  6785 				}
       
  6786 			}
       
  6787 
       
  6788 			if ( !o.axis || o.axis !== "y" ) {
       
  6789 				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
       
  6790 					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
       
  6791 				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
       
  6792 					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
       
  6793 				}
       
  6794 			}
       
  6795 
       
  6796 		} else {
       
  6797 
       
  6798 			if (!o.axis || o.axis !== "x") {
       
  6799 				if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
       
  6800 					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
       
  6801 				} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
       
  6802 					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
       
  6803 				}
       
  6804 			}
       
  6805 
       
  6806 			if (!o.axis || o.axis !== "y") {
       
  6807 				if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
       
  6808 					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
       
  6809 				} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
       
  6810 					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
       
  6811 				}
       
  6812 			}
       
  6813 
       
  6814 		}
       
  6815 
       
  6816 		if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
       
  6817 			$.ui.ddmanager.prepareOffsets(i, event);
       
  6818 		}
       
  6819 
       
  6820 	}
       
  6821 });
       
  6822 
       
  6823 $.ui.plugin.add("draggable", "snap", {
       
  6824 	start: function( event, ui, i ) {
       
  6825 
       
  6826 		var o = i.options;
       
  6827 
       
  6828 		i.snapElements = [];
       
  6829 
       
  6830 		$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
       
  6831 			var $t = $(this),
       
  6832 				$o = $t.offset();
       
  6833 			if (this !== i.element[0]) {
       
  6834 				i.snapElements.push({
       
  6835 					item: this,
       
  6836 					width: $t.outerWidth(), height: $t.outerHeight(),
       
  6837 					top: $o.top, left: $o.left
       
  6838 				});
       
  6839 			}
       
  6840 		});
       
  6841 
       
  6842 	},
       
  6843 	drag: function( event, ui, inst ) {
       
  6844 
       
  6845 		var ts, bs, ls, rs, l, r, t, b, i, first,
       
  6846 			o = inst.options,
       
  6847 			d = o.snapTolerance,
       
  6848 			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
       
  6849 			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
       
  6850 
       
  6851 		for (i = inst.snapElements.length - 1; i >= 0; i--){
       
  6852 
       
  6853 			l = inst.snapElements[i].left - inst.margins.left;
       
  6854 			r = l + inst.snapElements[i].width;
       
  6855 			t = inst.snapElements[i].top - inst.margins.top;
       
  6856 			b = t + inst.snapElements[i].height;
       
  6857 
       
  6858 			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
       
  6859 				if (inst.snapElements[i].snapping) {
       
  6860 					(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
       
  6861 				}
       
  6862 				inst.snapElements[i].snapping = false;
       
  6863 				continue;
       
  6864 			}
       
  6865 
       
  6866 			if (o.snapMode !== "inner") {
       
  6867 				ts = Math.abs(t - y2) <= d;
       
  6868 				bs = Math.abs(b - y1) <= d;
       
  6869 				ls = Math.abs(l - x2) <= d;
       
  6870 				rs = Math.abs(r - x1) <= d;
       
  6871 				if (ts) {
       
  6872 					ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
       
  6873 				}
       
  6874 				if (bs) {
       
  6875 					ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
       
  6876 				}
       
  6877 				if (ls) {
       
  6878 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
       
  6879 				}
       
  6880 				if (rs) {
       
  6881 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
       
  6882 				}
       
  6883 			}
       
  6884 
       
  6885 			first = (ts || bs || ls || rs);
       
  6886 
       
  6887 			if (o.snapMode !== "outer") {
       
  6888 				ts = Math.abs(t - y1) <= d;
       
  6889 				bs = Math.abs(b - y2) <= d;
       
  6890 				ls = Math.abs(l - x1) <= d;
       
  6891 				rs = Math.abs(r - x2) <= d;
       
  6892 				if (ts) {
       
  6893 					ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
       
  6894 				}
       
  6895 				if (bs) {
       
  6896 					ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
       
  6897 				}
       
  6898 				if (ls) {
       
  6899 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
       
  6900 				}
       
  6901 				if (rs) {
       
  6902 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
       
  6903 				}
       
  6904 			}
       
  6905 
       
  6906 			if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
       
  6907 				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
       
  6908 			}
       
  6909 			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
       
  6910 
       
  6911 		}
       
  6912 
       
  6913 	}
       
  6914 });
       
  6915 
       
  6916 $.ui.plugin.add("draggable", "stack", {
       
  6917 	start: function( event, ui, instance ) {
       
  6918 		var min,
       
  6919 			o = instance.options,
       
  6920 			group = $.makeArray($(o.stack)).sort(function(a, b) {
       
  6921 				return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
       
  6922 			});
       
  6923 
       
  6924 		if (!group.length) { return; }
       
  6925 
       
  6926 		min = parseInt($(group[0]).css("zIndex"), 10) || 0;
       
  6927 		$(group).each(function(i) {
       
  6928 			$(this).css("zIndex", min + i);
       
  6929 		});
       
  6930 		this.css("zIndex", (min + group.length));
       
  6931 	}
       
  6932 });
       
  6933 
       
  6934 $.ui.plugin.add("draggable", "zIndex", {
       
  6935 	start: function( event, ui, instance ) {
       
  6936 		var t = $( ui.helper ),
       
  6937 			o = instance.options;
       
  6938 
       
  6939 		if (t.css("zIndex")) {
       
  6940 			o._zIndex = t.css("zIndex");
       
  6941 		}
       
  6942 		t.css("zIndex", o.zIndex);
       
  6943 	},
       
  6944 	stop: function( event, ui, instance ) {
       
  6945 		var o = instance.options;
       
  6946 
       
  6947 		if (o._zIndex) {
       
  6948 			$(ui.helper).css("zIndex", o._zIndex);
       
  6949 		}
       
  6950 	}
       
  6951 });
       
  6952 
       
  6953 var draggable = $.ui.draggable;
       
  6954 
       
  6955 
       
  6956 /*!
       
  6957  * jQuery UI Resizable 1.11.4
       
  6958  * http://jqueryui.com
       
  6959  *
       
  6960  * Copyright jQuery Foundation and other contributors
       
  6961  * Released under the MIT license.
       
  6962  * http://jquery.org/license
       
  6963  *
       
  6964  * http://api.jqueryui.com/resizable/
       
  6965  */
       
  6966 
       
  6967 
       
  6968 $.widget("ui.resizable", $.ui.mouse, {
       
  6969 	version: "1.11.4",
       
  6970 	widgetEventPrefix: "resize",
       
  6971 	options: {
       
  6972 		alsoResize: false,
       
  6973 		animate: false,
       
  6974 		animateDuration: "slow",
       
  6975 		animateEasing: "swing",
       
  6976 		aspectRatio: false,
       
  6977 		autoHide: false,
       
  6978 		containment: false,
       
  6979 		ghost: false,
       
  6980 		grid: false,
       
  6981 		handles: "e,s,se",
       
  6982 		helper: false,
       
  6983 		maxHeight: null,
       
  6984 		maxWidth: null,
       
  6985 		minHeight: 10,
       
  6986 		minWidth: 10,
       
  6987 		// See #7960
       
  6988 		zIndex: 90,
       
  6989 
       
  6990 		// callbacks
       
  6991 		resize: null,
       
  6992 		start: null,
       
  6993 		stop: null
       
  6994 	},
       
  6995 
       
  6996 	_num: function( value ) {
       
  6997 		return parseInt( value, 10 ) || 0;
       
  6998 	},
       
  6999 
       
  7000 	_isNumber: function( value ) {
       
  7001 		return !isNaN( parseInt( value, 10 ) );
       
  7002 	},
       
  7003 
       
  7004 	_hasScroll: function( el, a ) {
       
  7005 
       
  7006 		if ( $( el ).css( "overflow" ) === "hidden") {
       
  7007 			return false;
       
  7008 		}
       
  7009 
       
  7010 		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
       
  7011 			has = false;
       
  7012 
       
  7013 		if ( el[ scroll ] > 0 ) {
       
  7014 			return true;
       
  7015 		}
       
  7016 
       
  7017 		// TODO: determine which cases actually cause this to happen
       
  7018 		// if the element doesn't have the scroll set, see if it's possible to
       
  7019 		// set the scroll
       
  7020 		el[ scroll ] = 1;
       
  7021 		has = ( el[ scroll ] > 0 );
       
  7022 		el[ scroll ] = 0;
       
  7023 		return has;
       
  7024 	},
       
  7025 
       
  7026 	_create: function() {
       
  7027 
       
  7028 		var n, i, handle, axis, hname,
       
  7029 			that = this,
       
  7030 			o = this.options;
       
  7031 		this.element.addClass("ui-resizable");
       
  7032 
       
  7033 		$.extend(this, {
       
  7034 			_aspectRatio: !!(o.aspectRatio),
       
  7035 			aspectRatio: o.aspectRatio,
       
  7036 			originalElement: this.element,
       
  7037 			_proportionallyResizeElements: [],
       
  7038 			_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
       
  7039 		});
       
  7040 
       
  7041 		// Wrap the element if it cannot hold child nodes
       
  7042 		if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
       
  7043 
       
  7044 			this.element.wrap(
       
  7045 				$("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
       
  7046 					position: this.element.css("position"),
       
  7047 					width: this.element.outerWidth(),
       
  7048 					height: this.element.outerHeight(),
       
  7049 					top: this.element.css("top"),
       
  7050 					left: this.element.css("left")
       
  7051 				})
       
  7052 			);
       
  7053 
       
  7054 			this.element = this.element.parent().data(
       
  7055 				"ui-resizable", this.element.resizable( "instance" )
       
  7056 			);
       
  7057 
       
  7058 			this.elementIsWrapper = true;
       
  7059 
       
  7060 			this.element.css({
       
  7061 				marginLeft: this.originalElement.css("marginLeft"),
       
  7062 				marginTop: this.originalElement.css("marginTop"),
       
  7063 				marginRight: this.originalElement.css("marginRight"),
       
  7064 				marginBottom: this.originalElement.css("marginBottom")
       
  7065 			});
       
  7066 			this.originalElement.css({
       
  7067 				marginLeft: 0,
       
  7068 				marginTop: 0,
       
  7069 				marginRight: 0,
       
  7070 				marginBottom: 0
       
  7071 			});
       
  7072 			// support: Safari
       
  7073 			// Prevent Safari textarea resize
       
  7074 			this.originalResizeStyle = this.originalElement.css("resize");
       
  7075 			this.originalElement.css("resize", "none");
       
  7076 
       
  7077 			this._proportionallyResizeElements.push( this.originalElement.css({
       
  7078 				position: "static",
       
  7079 				zoom: 1,
       
  7080 				display: "block"
       
  7081 			}) );
       
  7082 
       
  7083 			// support: IE9
       
  7084 			// avoid IE jump (hard set the margin)
       
  7085 			this.originalElement.css({ margin: this.originalElement.css("margin") });
       
  7086 
       
  7087 			this._proportionallyResize();
       
  7088 		}
       
  7089 
       
  7090 		this.handles = o.handles ||
       
  7091 			( !$(".ui-resizable-handle", this.element).length ?
       
  7092 				"e,s,se" : {
       
  7093 					n: ".ui-resizable-n",
       
  7094 					e: ".ui-resizable-e",
       
  7095 					s: ".ui-resizable-s",
       
  7096 					w: ".ui-resizable-w",
       
  7097 					se: ".ui-resizable-se",
       
  7098 					sw: ".ui-resizable-sw",
       
  7099 					ne: ".ui-resizable-ne",
       
  7100 					nw: ".ui-resizable-nw"
       
  7101 				} );
       
  7102 
       
  7103 		this._handles = $();
       
  7104 		if ( this.handles.constructor === String ) {
       
  7105 
       
  7106 			if ( this.handles === "all") {
       
  7107 				this.handles = "n,e,s,w,se,sw,ne,nw";
       
  7108 			}
       
  7109 
       
  7110 			n = this.handles.split(",");
       
  7111 			this.handles = {};
       
  7112 
       
  7113 			for (i = 0; i < n.length; i++) {
       
  7114 
       
  7115 				handle = $.trim(n[i]);
       
  7116 				hname = "ui-resizable-" + handle;
       
  7117 				axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
       
  7118 
       
  7119 				axis.css({ zIndex: o.zIndex });
       
  7120 
       
  7121 				// TODO : What's going on here?
       
  7122 				if ("se" === handle) {
       
  7123 					axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
       
  7124 				}
       
  7125 
       
  7126 				this.handles[handle] = ".ui-resizable-" + handle;
       
  7127 				this.element.append(axis);
       
  7128 			}
       
  7129 
       
  7130 		}
       
  7131 
       
  7132 		this._renderAxis = function(target) {
       
  7133 
       
  7134 			var i, axis, padPos, padWrapper;
       
  7135 
       
  7136 			target = target || this.element;
       
  7137 
       
  7138 			for (i in this.handles) {
       
  7139 
       
  7140 				if (this.handles[i].constructor === String) {
       
  7141 					this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
       
  7142 				} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
       
  7143 					this.handles[ i ] = $( this.handles[ i ] );
       
  7144 					this._on( this.handles[ i ], { "mousedown": that._mouseDown });
       
  7145 				}
       
  7146 
       
  7147 				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
       
  7148 
       
  7149 					axis = $(this.handles[i], this.element);
       
  7150 
       
  7151 					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
       
  7152 
       
  7153 					padPos = [ "padding",
       
  7154 						/ne|nw|n/.test(i) ? "Top" :
       
  7155 						/se|sw|s/.test(i) ? "Bottom" :
       
  7156 						/^e$/.test(i) ? "Right" : "Left" ].join("");
       
  7157 
       
  7158 					target.css(padPos, padWrapper);
       
  7159 
       
  7160 					this._proportionallyResize();
       
  7161 				}
       
  7162 
       
  7163 				this._handles = this._handles.add( this.handles[ i ] );
       
  7164 			}
       
  7165 		};
       
  7166 
       
  7167 		// TODO: make renderAxis a prototype function
       
  7168 		this._renderAxis(this.element);
       
  7169 
       
  7170 		this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
       
  7171 		this._handles.disableSelection();
       
  7172 
       
  7173 		this._handles.mouseover(function() {
       
  7174 			if (!that.resizing) {
       
  7175 				if (this.className) {
       
  7176 					axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
       
  7177 				}
       
  7178 				that.axis = axis && axis[1] ? axis[1] : "se";
       
  7179 			}
       
  7180 		});
       
  7181 
       
  7182 		if (o.autoHide) {
       
  7183 			this._handles.hide();
       
  7184 			$(this.element)
       
  7185 				.addClass("ui-resizable-autohide")
       
  7186 				.mouseenter(function() {
       
  7187 					if (o.disabled) {
       
  7188 						return;
       
  7189 					}
       
  7190 					$(this).removeClass("ui-resizable-autohide");
       
  7191 					that._handles.show();
       
  7192 				})
       
  7193 				.mouseleave(function() {
       
  7194 					if (o.disabled) {
       
  7195 						return;
       
  7196 					}
       
  7197 					if (!that.resizing) {
       
  7198 						$(this).addClass("ui-resizable-autohide");
       
  7199 						that._handles.hide();
       
  7200 					}
       
  7201 				});
       
  7202 		}
       
  7203 
       
  7204 		this._mouseInit();
       
  7205 	},
       
  7206 
       
  7207 	_destroy: function() {
       
  7208 
       
  7209 		this._mouseDestroy();
       
  7210 
       
  7211 		var wrapper,
       
  7212 			_destroy = function(exp) {
       
  7213 				$(exp)
       
  7214 					.removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
       
  7215 					.removeData("resizable")
       
  7216 					.removeData("ui-resizable")
       
  7217 					.unbind(".resizable")
       
  7218 					.find(".ui-resizable-handle")
       
  7219 						.remove();
       
  7220 			};
       
  7221 
       
  7222 		// TODO: Unwrap at same DOM position
       
  7223 		if (this.elementIsWrapper) {
       
  7224 			_destroy(this.element);
       
  7225 			wrapper = this.element;
       
  7226 			this.originalElement.css({
       
  7227 				position: wrapper.css("position"),
       
  7228 				width: wrapper.outerWidth(),
       
  7229 				height: wrapper.outerHeight(),
       
  7230 				top: wrapper.css("top"),
       
  7231 				left: wrapper.css("left")
       
  7232 			}).insertAfter( wrapper );
       
  7233 			wrapper.remove();
       
  7234 		}
       
  7235 
       
  7236 		this.originalElement.css("resize", this.originalResizeStyle);
       
  7237 		_destroy(this.originalElement);
       
  7238 
       
  7239 		return this;
       
  7240 	},
       
  7241 
       
  7242 	_mouseCapture: function(event) {
       
  7243 		var i, handle,
       
  7244 			capture = false;
       
  7245 
       
  7246 		for (i in this.handles) {
       
  7247 			handle = $(this.handles[i])[0];
       
  7248 			if (handle === event.target || $.contains(handle, event.target)) {
       
  7249 				capture = true;
       
  7250 			}
       
  7251 		}
       
  7252 
       
  7253 		return !this.options.disabled && capture;
       
  7254 	},
       
  7255 
       
  7256 	_mouseStart: function(event) {
       
  7257 
       
  7258 		var curleft, curtop, cursor,
       
  7259 			o = this.options,
       
  7260 			el = this.element;
       
  7261 
       
  7262 		this.resizing = true;
       
  7263 
       
  7264 		this._renderProxy();
       
  7265 
       
  7266 		curleft = this._num(this.helper.css("left"));
       
  7267 		curtop = this._num(this.helper.css("top"));
       
  7268 
       
  7269 		if (o.containment) {
       
  7270 			curleft += $(o.containment).scrollLeft() || 0;
       
  7271 			curtop += $(o.containment).scrollTop() || 0;
       
  7272 		}
       
  7273 
       
  7274 		this.offset = this.helper.offset();
       
  7275 		this.position = { left: curleft, top: curtop };
       
  7276 
       
  7277 		this.size = this._helper ? {
       
  7278 				width: this.helper.width(),
       
  7279 				height: this.helper.height()
       
  7280 			} : {
       
  7281 				width: el.width(),
       
  7282 				height: el.height()
       
  7283 			};
       
  7284 
       
  7285 		this.originalSize = this._helper ? {
       
  7286 				width: el.outerWidth(),
       
  7287 				height: el.outerHeight()
       
  7288 			} : {
       
  7289 				width: el.width(),
       
  7290 				height: el.height()
       
  7291 			};
       
  7292 
       
  7293 		this.sizeDiff = {
       
  7294 			width: el.outerWidth() - el.width(),
       
  7295 			height: el.outerHeight() - el.height()
       
  7296 		};
       
  7297 
       
  7298 		this.originalPosition = { left: curleft, top: curtop };
       
  7299 		this.originalMousePosition = { left: event.pageX, top: event.pageY };
       
  7300 
       
  7301 		this.aspectRatio = (typeof o.aspectRatio === "number") ?
       
  7302 			o.aspectRatio :
       
  7303 			((this.originalSize.width / this.originalSize.height) || 1);
       
  7304 
       
  7305 		cursor = $(".ui-resizable-" + this.axis).css("cursor");
       
  7306 		$("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
       
  7307 
       
  7308 		el.addClass("ui-resizable-resizing");
       
  7309 		this._propagate("start", event);
       
  7310 		return true;
       
  7311 	},
       
  7312 
       
  7313 	_mouseDrag: function(event) {
       
  7314 
       
  7315 		var data, props,
       
  7316 			smp = this.originalMousePosition,
       
  7317 			a = this.axis,
       
  7318 			dx = (event.pageX - smp.left) || 0,
       
  7319 			dy = (event.pageY - smp.top) || 0,
       
  7320 			trigger = this._change[a];
       
  7321 
       
  7322 		this._updatePrevProperties();
       
  7323 
       
  7324 		if (!trigger) {
       
  7325 			return false;
       
  7326 		}
       
  7327 
       
  7328 		data = trigger.apply(this, [ event, dx, dy ]);
       
  7329 
       
  7330 		this._updateVirtualBoundaries(event.shiftKey);
       
  7331 		if (this._aspectRatio || event.shiftKey) {
       
  7332 			data = this._updateRatio(data, event);
       
  7333 		}
       
  7334 
       
  7335 		data = this._respectSize(data, event);
       
  7336 
       
  7337 		this._updateCache(data);
       
  7338 
       
  7339 		this._propagate("resize", event);
       
  7340 
       
  7341 		props = this._applyChanges();
       
  7342 
       
  7343 		if ( !this._helper && this._proportionallyResizeElements.length ) {
       
  7344 			this._proportionallyResize();
       
  7345 		}
       
  7346 
       
  7347 		if ( !$.isEmptyObject( props ) ) {
       
  7348 			this._updatePrevProperties();
       
  7349 			this._trigger( "resize", event, this.ui() );
       
  7350 			this._applyChanges();
       
  7351 		}
       
  7352 
       
  7353 		return false;
       
  7354 	},
       
  7355 
       
  7356 	_mouseStop: function(event) {
       
  7357 
       
  7358 		this.resizing = false;
       
  7359 		var pr, ista, soffseth, soffsetw, s, left, top,
       
  7360 			o = this.options, that = this;
       
  7361 
       
  7362 		if (this._helper) {
       
  7363 
       
  7364 			pr = this._proportionallyResizeElements;
       
  7365 			ista = pr.length && (/textarea/i).test(pr[0].nodeName);
       
  7366 			soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
       
  7367 			soffsetw = ista ? 0 : that.sizeDiff.width;
       
  7368 
       
  7369 			s = {
       
  7370 				width: (that.helper.width()  - soffsetw),
       
  7371 				height: (that.helper.height() - soffseth)
       
  7372 			};
       
  7373 			left = (parseInt(that.element.css("left"), 10) +
       
  7374 				(that.position.left - that.originalPosition.left)) || null;
       
  7375 			top = (parseInt(that.element.css("top"), 10) +
       
  7376 				(that.position.top - that.originalPosition.top)) || null;
       
  7377 
       
  7378 			if (!o.animate) {
       
  7379 				this.element.css($.extend(s, { top: top, left: left }));
       
  7380 			}
       
  7381 
       
  7382 			that.helper.height(that.size.height);
       
  7383 			that.helper.width(that.size.width);
       
  7384 
       
  7385 			if (this._helper && !o.animate) {
       
  7386 				this._proportionallyResize();
       
  7387 			}
       
  7388 		}
       
  7389 
       
  7390 		$("body").css("cursor", "auto");
       
  7391 
       
  7392 		this.element.removeClass("ui-resizable-resizing");
       
  7393 
       
  7394 		this._propagate("stop", event);
       
  7395 
       
  7396 		if (this._helper) {
       
  7397 			this.helper.remove();
       
  7398 		}
       
  7399 
       
  7400 		return false;
       
  7401 
       
  7402 	},
       
  7403 
       
  7404 	_updatePrevProperties: function() {
       
  7405 		this.prevPosition = {
       
  7406 			top: this.position.top,
       
  7407 			left: this.position.left
       
  7408 		};
       
  7409 		this.prevSize = {
       
  7410 			width: this.size.width,
       
  7411 			height: this.size.height
       
  7412 		};
       
  7413 	},
       
  7414 
       
  7415 	_applyChanges: function() {
       
  7416 		var props = {};
       
  7417 
       
  7418 		if ( this.position.top !== this.prevPosition.top ) {
       
  7419 			props.top = this.position.top + "px";
       
  7420 		}
       
  7421 		if ( this.position.left !== this.prevPosition.left ) {
       
  7422 			props.left = this.position.left + "px";
       
  7423 		}
       
  7424 		if ( this.size.width !== this.prevSize.width ) {
       
  7425 			props.width = this.size.width + "px";
       
  7426 		}
       
  7427 		if ( this.size.height !== this.prevSize.height ) {
       
  7428 			props.height = this.size.height + "px";
       
  7429 		}
       
  7430 
       
  7431 		this.helper.css( props );
       
  7432 
       
  7433 		return props;
       
  7434 	},
       
  7435 
       
  7436 	_updateVirtualBoundaries: function(forceAspectRatio) {
       
  7437 		var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
       
  7438 			o = this.options;
       
  7439 
       
  7440 		b = {
       
  7441 			minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
       
  7442 			maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
       
  7443 			minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
       
  7444 			maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
       
  7445 		};
       
  7446 
       
  7447 		if (this._aspectRatio || forceAspectRatio) {
       
  7448 			pMinWidth = b.minHeight * this.aspectRatio;
       
  7449 			pMinHeight = b.minWidth / this.aspectRatio;
       
  7450 			pMaxWidth = b.maxHeight * this.aspectRatio;
       
  7451 			pMaxHeight = b.maxWidth / this.aspectRatio;
       
  7452 
       
  7453 			if (pMinWidth > b.minWidth) {
       
  7454 				b.minWidth = pMinWidth;
       
  7455 			}
       
  7456 			if (pMinHeight > b.minHeight) {
       
  7457 				b.minHeight = pMinHeight;
       
  7458 			}
       
  7459 			if (pMaxWidth < b.maxWidth) {
       
  7460 				b.maxWidth = pMaxWidth;
       
  7461 			}
       
  7462 			if (pMaxHeight < b.maxHeight) {
       
  7463 				b.maxHeight = pMaxHeight;
       
  7464 			}
       
  7465 		}
       
  7466 		this._vBoundaries = b;
       
  7467 	},
       
  7468 
       
  7469 	_updateCache: function(data) {
       
  7470 		this.offset = this.helper.offset();
       
  7471 		if (this._isNumber(data.left)) {
       
  7472 			this.position.left = data.left;
       
  7473 		}
       
  7474 		if (this._isNumber(data.top)) {
       
  7475 			this.position.top = data.top;
       
  7476 		}
       
  7477 		if (this._isNumber(data.height)) {
       
  7478 			this.size.height = data.height;
       
  7479 		}
       
  7480 		if (this._isNumber(data.width)) {
       
  7481 			this.size.width = data.width;
       
  7482 		}
       
  7483 	},
       
  7484 
       
  7485 	_updateRatio: function( data ) {
       
  7486 
       
  7487 		var cpos = this.position,
       
  7488 			csize = this.size,
       
  7489 			a = this.axis;
       
  7490 
       
  7491 		if (this._isNumber(data.height)) {
       
  7492 			data.width = (data.height * this.aspectRatio);
       
  7493 		} else if (this._isNumber(data.width)) {
       
  7494 			data.height = (data.width / this.aspectRatio);
       
  7495 		}
       
  7496 
       
  7497 		if (a === "sw") {
       
  7498 			data.left = cpos.left + (csize.width - data.width);
       
  7499 			data.top = null;
       
  7500 		}
       
  7501 		if (a === "nw") {
       
  7502 			data.top = cpos.top + (csize.height - data.height);
       
  7503 			data.left = cpos.left + (csize.width - data.width);
       
  7504 		}
       
  7505 
       
  7506 		return data;
       
  7507 	},
       
  7508 
       
  7509 	_respectSize: function( data ) {
       
  7510 
       
  7511 		var o = this._vBoundaries,
       
  7512 			a = this.axis,
       
  7513 			ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
       
  7514 			ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
       
  7515 			isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
       
  7516 			isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
       
  7517 			dw = this.originalPosition.left + this.originalSize.width,
       
  7518 			dh = this.position.top + this.size.height,
       
  7519 			cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
       
  7520 		if (isminw) {
       
  7521 			data.width = o.minWidth;
       
  7522 		}
       
  7523 		if (isminh) {
       
  7524 			data.height = o.minHeight;
       
  7525 		}
       
  7526 		if (ismaxw) {
       
  7527 			data.width = o.maxWidth;
       
  7528 		}
       
  7529 		if (ismaxh) {
       
  7530 			data.height = o.maxHeight;
       
  7531 		}
       
  7532 
       
  7533 		if (isminw && cw) {
       
  7534 			data.left = dw - o.minWidth;
       
  7535 		}
       
  7536 		if (ismaxw && cw) {
       
  7537 			data.left = dw - o.maxWidth;
       
  7538 		}
       
  7539 		if (isminh && ch) {
       
  7540 			data.top = dh - o.minHeight;
       
  7541 		}
       
  7542 		if (ismaxh && ch) {
       
  7543 			data.top = dh - o.maxHeight;
       
  7544 		}
       
  7545 
       
  7546 		// Fixing jump error on top/left - bug #2330
       
  7547 		if (!data.width && !data.height && !data.left && data.top) {
       
  7548 			data.top = null;
       
  7549 		} else if (!data.width && !data.height && !data.top && data.left) {
       
  7550 			data.left = null;
       
  7551 		}
       
  7552 
       
  7553 		return data;
       
  7554 	},
       
  7555 
       
  7556 	_getPaddingPlusBorderDimensions: function( element ) {
       
  7557 		var i = 0,
       
  7558 			widths = [],
       
  7559 			borders = [
       
  7560 				element.css( "borderTopWidth" ),
       
  7561 				element.css( "borderRightWidth" ),
       
  7562 				element.css( "borderBottomWidth" ),
       
  7563 				element.css( "borderLeftWidth" )
       
  7564 			],
       
  7565 			paddings = [
       
  7566 				element.css( "paddingTop" ),
       
  7567 				element.css( "paddingRight" ),
       
  7568 				element.css( "paddingBottom" ),
       
  7569 				element.css( "paddingLeft" )
       
  7570 			];
       
  7571 
       
  7572 		for ( ; i < 4; i++ ) {
       
  7573 			widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
       
  7574 			widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
       
  7575 		}
       
  7576 
       
  7577 		return {
       
  7578 			height: widths[ 0 ] + widths[ 2 ],
       
  7579 			width: widths[ 1 ] + widths[ 3 ]
       
  7580 		};
       
  7581 	},
       
  7582 
       
  7583 	_proportionallyResize: function() {
       
  7584 
       
  7585 		if (!this._proportionallyResizeElements.length) {
       
  7586 			return;
       
  7587 		}
       
  7588 
       
  7589 		var prel,
       
  7590 			i = 0,
       
  7591 			element = this.helper || this.element;
       
  7592 
       
  7593 		for ( ; i < this._proportionallyResizeElements.length; i++) {
       
  7594 
       
  7595 			prel = this._proportionallyResizeElements[i];
       
  7596 
       
  7597 			// TODO: Seems like a bug to cache this.outerDimensions
       
  7598 			// considering that we are in a loop.
       
  7599 			if (!this.outerDimensions) {
       
  7600 				this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
       
  7601 			}
       
  7602 
       
  7603 			prel.css({
       
  7604 				height: (element.height() - this.outerDimensions.height) || 0,
       
  7605 				width: (element.width() - this.outerDimensions.width) || 0
       
  7606 			});
       
  7607 
       
  7608 		}
       
  7609 
       
  7610 	},
       
  7611 
       
  7612 	_renderProxy: function() {
       
  7613 
       
  7614 		var el = this.element, o = this.options;
       
  7615 		this.elementOffset = el.offset();
       
  7616 
       
  7617 		if (this._helper) {
       
  7618 
       
  7619 			this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
       
  7620 
       
  7621 			this.helper.addClass(this._helper).css({
       
  7622 				width: this.element.outerWidth() - 1,
       
  7623 				height: this.element.outerHeight() - 1,
       
  7624 				position: "absolute",
       
  7625 				left: this.elementOffset.left + "px",
       
  7626 				top: this.elementOffset.top + "px",
       
  7627 				zIndex: ++o.zIndex //TODO: Don't modify option
       
  7628 			});
       
  7629 
       
  7630 			this.helper
       
  7631 				.appendTo("body")
       
  7632 				.disableSelection();
       
  7633 
       
  7634 		} else {
       
  7635 			this.helper = this.element;
       
  7636 		}
       
  7637 
       
  7638 	},
       
  7639 
       
  7640 	_change: {
       
  7641 		e: function(event, dx) {
       
  7642 			return { width: this.originalSize.width + dx };
       
  7643 		},
       
  7644 		w: function(event, dx) {
       
  7645 			var cs = this.originalSize, sp = this.originalPosition;
       
  7646 			return { left: sp.left + dx, width: cs.width - dx };
       
  7647 		},
       
  7648 		n: function(event, dx, dy) {
       
  7649 			var cs = this.originalSize, sp = this.originalPosition;
       
  7650 			return { top: sp.top + dy, height: cs.height - dy };
       
  7651 		},
       
  7652 		s: function(event, dx, dy) {
       
  7653 			return { height: this.originalSize.height + dy };
       
  7654 		},
       
  7655 		se: function(event, dx, dy) {
       
  7656 			return $.extend(this._change.s.apply(this, arguments),
       
  7657 				this._change.e.apply(this, [ event, dx, dy ]));
       
  7658 		},
       
  7659 		sw: function(event, dx, dy) {
       
  7660 			return $.extend(this._change.s.apply(this, arguments),
       
  7661 				this._change.w.apply(this, [ event, dx, dy ]));
       
  7662 		},
       
  7663 		ne: function(event, dx, dy) {
       
  7664 			return $.extend(this._change.n.apply(this, arguments),
       
  7665 				this._change.e.apply(this, [ event, dx, dy ]));
       
  7666 		},
       
  7667 		nw: function(event, dx, dy) {
       
  7668 			return $.extend(this._change.n.apply(this, arguments),
       
  7669 				this._change.w.apply(this, [ event, dx, dy ]));
       
  7670 		}
       
  7671 	},
       
  7672 
       
  7673 	_propagate: function(n, event) {
       
  7674 		$.ui.plugin.call(this, n, [ event, this.ui() ]);
       
  7675 		(n !== "resize" && this._trigger(n, event, this.ui()));
       
  7676 	},
       
  7677 
       
  7678 	plugins: {},
       
  7679 
       
  7680 	ui: function() {
       
  7681 		return {
       
  7682 			originalElement: this.originalElement,
       
  7683 			element: this.element,
       
  7684 			helper: this.helper,
       
  7685 			position: this.position,
       
  7686 			size: this.size,
       
  7687 			originalSize: this.originalSize,
       
  7688 			originalPosition: this.originalPosition
       
  7689 		};
       
  7690 	}
       
  7691 
       
  7692 });
       
  7693 
       
  7694 /*
       
  7695  * Resizable Extensions
       
  7696  */
       
  7697 
       
  7698 $.ui.plugin.add("resizable", "animate", {
       
  7699 
       
  7700 	stop: function( event ) {
       
  7701 		var that = $(this).resizable( "instance" ),
       
  7702 			o = that.options,
       
  7703 			pr = that._proportionallyResizeElements,
       
  7704 			ista = pr.length && (/textarea/i).test(pr[0].nodeName),
       
  7705 			soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
       
  7706 			soffsetw = ista ? 0 : that.sizeDiff.width,
       
  7707 			style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
       
  7708 			left = (parseInt(that.element.css("left"), 10) +
       
  7709 				(that.position.left - that.originalPosition.left)) || null,
       
  7710 			top = (parseInt(that.element.css("top"), 10) +
       
  7711 				(that.position.top - that.originalPosition.top)) || null;
       
  7712 
       
  7713 		that.element.animate(
       
  7714 			$.extend(style, top && left ? { top: top, left: left } : {}), {
       
  7715 				duration: o.animateDuration,
       
  7716 				easing: o.animateEasing,
       
  7717 				step: function() {
       
  7718 
       
  7719 					var data = {
       
  7720 						width: parseInt(that.element.css("width"), 10),
       
  7721 						height: parseInt(that.element.css("height"), 10),
       
  7722 						top: parseInt(that.element.css("top"), 10),
       
  7723 						left: parseInt(that.element.css("left"), 10)
       
  7724 					};
       
  7725 
       
  7726 					if (pr && pr.length) {
       
  7727 						$(pr[0]).css({ width: data.width, height: data.height });
       
  7728 					}
       
  7729 
       
  7730 					// propagating resize, and updating values for each animation step
       
  7731 					that._updateCache(data);
       
  7732 					that._propagate("resize", event);
       
  7733 
       
  7734 				}
       
  7735 			}
       
  7736 		);
       
  7737 	}
       
  7738 
       
  7739 });
       
  7740 
       
  7741 $.ui.plugin.add( "resizable", "containment", {
       
  7742 
       
  7743 	start: function() {
       
  7744 		var element, p, co, ch, cw, width, height,
       
  7745 			that = $( this ).resizable( "instance" ),
       
  7746 			o = that.options,
       
  7747 			el = that.element,
       
  7748 			oc = o.containment,
       
  7749 			ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
       
  7750 
       
  7751 		if ( !ce ) {
       
  7752 			return;
       
  7753 		}
       
  7754 
       
  7755 		that.containerElement = $( ce );
       
  7756 
       
  7757 		if ( /document/.test( oc ) || oc === document ) {
       
  7758 			that.containerOffset = {
       
  7759 				left: 0,
       
  7760 				top: 0
       
  7761 			};
       
  7762 			that.containerPosition = {
       
  7763 				left: 0,
       
  7764 				top: 0
       
  7765 			};
       
  7766 
       
  7767 			that.parentData = {
       
  7768 				element: $( document ),
       
  7769 				left: 0,
       
  7770 				top: 0,
       
  7771 				width: $( document ).width(),
       
  7772 				height: $( document ).height() || document.body.parentNode.scrollHeight
       
  7773 			};
       
  7774 		} else {
       
  7775 			element = $( ce );
       
  7776 			p = [];
       
  7777 			$([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
       
  7778 				p[ i ] = that._num( element.css( "padding" + name ) );
       
  7779 			});
       
  7780 
       
  7781 			that.containerOffset = element.offset();
       
  7782 			that.containerPosition = element.position();
       
  7783 			that.containerSize = {
       
  7784 				height: ( element.innerHeight() - p[ 3 ] ),
       
  7785 				width: ( element.innerWidth() - p[ 1 ] )
       
  7786 			};
       
  7787 
       
  7788 			co = that.containerOffset;
       
  7789 			ch = that.containerSize.height;
       
  7790 			cw = that.containerSize.width;
       
  7791 			width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
       
  7792 			height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
       
  7793 
       
  7794 			that.parentData = {
       
  7795 				element: ce,
       
  7796 				left: co.left,
       
  7797 				top: co.top,
       
  7798 				width: width,
       
  7799 				height: height
       
  7800 			};
       
  7801 		}
       
  7802 	},
       
  7803 
       
  7804 	resize: function( event ) {
       
  7805 		var woset, hoset, isParent, isOffsetRelative,
       
  7806 			that = $( this ).resizable( "instance" ),
       
  7807 			o = that.options,
       
  7808 			co = that.containerOffset,
       
  7809 			cp = that.position,
       
  7810 			pRatio = that._aspectRatio || event.shiftKey,
       
  7811 			cop = {
       
  7812 				top: 0,
       
  7813 				left: 0
       
  7814 			},
       
  7815 			ce = that.containerElement,
       
  7816 			continueResize = true;
       
  7817 
       
  7818 		if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
       
  7819 			cop = co;
       
  7820 		}
       
  7821 
       
  7822 		if ( cp.left < ( that._helper ? co.left : 0 ) ) {
       
  7823 			that.size.width = that.size.width +
       
  7824 				( that._helper ?
       
  7825 					( that.position.left - co.left ) :
       
  7826 					( that.position.left - cop.left ) );
       
  7827 
       
  7828 			if ( pRatio ) {
       
  7829 				that.size.height = that.size.width / that.aspectRatio;
       
  7830 				continueResize = false;
       
  7831 			}
       
  7832 			that.position.left = o.helper ? co.left : 0;
       
  7833 		}
       
  7834 
       
  7835 		if ( cp.top < ( that._helper ? co.top : 0 ) ) {
       
  7836 			that.size.height = that.size.height +
       
  7837 				( that._helper ?
       
  7838 					( that.position.top - co.top ) :
       
  7839 					that.position.top );
       
  7840 
       
  7841 			if ( pRatio ) {
       
  7842 				that.size.width = that.size.height * that.aspectRatio;
       
  7843 				continueResize = false;
       
  7844 			}
       
  7845 			that.position.top = that._helper ? co.top : 0;
       
  7846 		}
       
  7847 
       
  7848 		isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
       
  7849 		isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
       
  7850 
       
  7851 		if ( isParent && isOffsetRelative ) {
       
  7852 			that.offset.left = that.parentData.left + that.position.left;
       
  7853 			that.offset.top = that.parentData.top + that.position.top;
       
  7854 		} else {
       
  7855 			that.offset.left = that.element.offset().left;
       
  7856 			that.offset.top = that.element.offset().top;
       
  7857 		}
       
  7858 
       
  7859 		woset = Math.abs( that.sizeDiff.width +
       
  7860 			(that._helper ?
       
  7861 				that.offset.left - cop.left :
       
  7862 				(that.offset.left - co.left)) );
       
  7863 
       
  7864 		hoset = Math.abs( that.sizeDiff.height +
       
  7865 			(that._helper ?
       
  7866 				that.offset.top - cop.top :
       
  7867 				(that.offset.top - co.top)) );
       
  7868 
       
  7869 		if ( woset + that.size.width >= that.parentData.width ) {
       
  7870 			that.size.width = that.parentData.width - woset;
       
  7871 			if ( pRatio ) {
       
  7872 				that.size.height = that.size.width / that.aspectRatio;
       
  7873 				continueResize = false;
       
  7874 			}
       
  7875 		}
       
  7876 
       
  7877 		if ( hoset + that.size.height >= that.parentData.height ) {
       
  7878 			that.size.height = that.parentData.height - hoset;
       
  7879 			if ( pRatio ) {
       
  7880 				that.size.width = that.size.height * that.aspectRatio;
       
  7881 				continueResize = false;
       
  7882 			}
       
  7883 		}
       
  7884 
       
  7885 		if ( !continueResize ) {
       
  7886 			that.position.left = that.prevPosition.left;
       
  7887 			that.position.top = that.prevPosition.top;
       
  7888 			that.size.width = that.prevSize.width;
       
  7889 			that.size.height = that.prevSize.height;
       
  7890 		}
       
  7891 	},
       
  7892 
       
  7893 	stop: function() {
       
  7894 		var that = $( this ).resizable( "instance" ),
       
  7895 			o = that.options,
       
  7896 			co = that.containerOffset,
       
  7897 			cop = that.containerPosition,
       
  7898 			ce = that.containerElement,
       
  7899 			helper = $( that.helper ),
       
  7900 			ho = helper.offset(),
       
  7901 			w = helper.outerWidth() - that.sizeDiff.width,
       
  7902 			h = helper.outerHeight() - that.sizeDiff.height;
       
  7903 
       
  7904 		if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
       
  7905 			$( this ).css({
       
  7906 				left: ho.left - cop.left - co.left,
       
  7907 				width: w,
       
  7908 				height: h
       
  7909 			});
       
  7910 		}
       
  7911 
       
  7912 		if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
       
  7913 			$( this ).css({
       
  7914 				left: ho.left - cop.left - co.left,
       
  7915 				width: w,
       
  7916 				height: h
       
  7917 			});
       
  7918 		}
       
  7919 	}
       
  7920 });
       
  7921 
       
  7922 $.ui.plugin.add("resizable", "alsoResize", {
       
  7923 
       
  7924 	start: function() {
       
  7925 		var that = $(this).resizable( "instance" ),
       
  7926 			o = that.options;
       
  7927 
       
  7928 		$(o.alsoResize).each(function() {
       
  7929 			var el = $(this);
       
  7930 			el.data("ui-resizable-alsoresize", {
       
  7931 				width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
       
  7932 				left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
       
  7933 			});
       
  7934 		});
       
  7935 	},
       
  7936 
       
  7937 	resize: function(event, ui) {
       
  7938 		var that = $(this).resizable( "instance" ),
       
  7939 			o = that.options,
       
  7940 			os = that.originalSize,
       
  7941 			op = that.originalPosition,
       
  7942 			delta = {
       
  7943 				height: (that.size.height - os.height) || 0,
       
  7944 				width: (that.size.width - os.width) || 0,
       
  7945 				top: (that.position.top - op.top) || 0,
       
  7946 				left: (that.position.left - op.left) || 0
       
  7947 			};
       
  7948 
       
  7949 			$(o.alsoResize).each(function() {
       
  7950 				var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
       
  7951 					css = el.parents(ui.originalElement[0]).length ?
       
  7952 							[ "width", "height" ] :
       
  7953 							[ "width", "height", "top", "left" ];
       
  7954 
       
  7955 				$.each(css, function(i, prop) {
       
  7956 					var sum = (start[prop] || 0) + (delta[prop] || 0);
       
  7957 					if (sum && sum >= 0) {
       
  7958 						style[prop] = sum || null;
       
  7959 					}
       
  7960 				});
       
  7961 
       
  7962 				el.css(style);
       
  7963 			});
       
  7964 	},
       
  7965 
       
  7966 	stop: function() {
       
  7967 		$(this).removeData("resizable-alsoresize");
       
  7968 	}
       
  7969 });
       
  7970 
       
  7971 $.ui.plugin.add("resizable", "ghost", {
       
  7972 
       
  7973 	start: function() {
       
  7974 
       
  7975 		var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
       
  7976 
       
  7977 		that.ghost = that.originalElement.clone();
       
  7978 		that.ghost
       
  7979 			.css({
       
  7980 				opacity: 0.25,
       
  7981 				display: "block",
       
  7982 				position: "relative",
       
  7983 				height: cs.height,
       
  7984 				width: cs.width,
       
  7985 				margin: 0,
       
  7986 				left: 0,
       
  7987 				top: 0
       
  7988 			})
       
  7989 			.addClass("ui-resizable-ghost")
       
  7990 			.addClass(typeof o.ghost === "string" ? o.ghost : "");
       
  7991 
       
  7992 		that.ghost.appendTo(that.helper);
       
  7993 
       
  7994 	},
       
  7995 
       
  7996 	resize: function() {
       
  7997 		var that = $(this).resizable( "instance" );
       
  7998 		if (that.ghost) {
       
  7999 			that.ghost.css({
       
  8000 				position: "relative",
       
  8001 				height: that.size.height,
       
  8002 				width: that.size.width
       
  8003 			});
       
  8004 		}
       
  8005 	},
       
  8006 
       
  8007 	stop: function() {
       
  8008 		var that = $(this).resizable( "instance" );
       
  8009 		if (that.ghost && that.helper) {
       
  8010 			that.helper.get(0).removeChild(that.ghost.get(0));
       
  8011 		}
       
  8012 	}
       
  8013 
       
  8014 });
       
  8015 
       
  8016 $.ui.plugin.add("resizable", "grid", {
       
  8017 
       
  8018 	resize: function() {
       
  8019 		var outerDimensions,
       
  8020 			that = $(this).resizable( "instance" ),
       
  8021 			o = that.options,
       
  8022 			cs = that.size,
       
  8023 			os = that.originalSize,
       
  8024 			op = that.originalPosition,
       
  8025 			a = that.axis,
       
  8026 			grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
       
  8027 			gridX = (grid[0] || 1),
       
  8028 			gridY = (grid[1] || 1),
       
  8029 			ox = Math.round((cs.width - os.width) / gridX) * gridX,
       
  8030 			oy = Math.round((cs.height - os.height) / gridY) * gridY,
       
  8031 			newWidth = os.width + ox,
       
  8032 			newHeight = os.height + oy,
       
  8033 			isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
       
  8034 			isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
       
  8035 			isMinWidth = o.minWidth && (o.minWidth > newWidth),
       
  8036 			isMinHeight = o.minHeight && (o.minHeight > newHeight);
       
  8037 
       
  8038 		o.grid = grid;
       
  8039 
       
  8040 		if (isMinWidth) {
       
  8041 			newWidth += gridX;
       
  8042 		}
       
  8043 		if (isMinHeight) {
       
  8044 			newHeight += gridY;
       
  8045 		}
       
  8046 		if (isMaxWidth) {
       
  8047 			newWidth -= gridX;
       
  8048 		}
       
  8049 		if (isMaxHeight) {
       
  8050 			newHeight -= gridY;
       
  8051 		}
       
  8052 
       
  8053 		if (/^(se|s|e)$/.test(a)) {
       
  8054 			that.size.width = newWidth;
       
  8055 			that.size.height = newHeight;
       
  8056 		} else if (/^(ne)$/.test(a)) {
       
  8057 			that.size.width = newWidth;
       
  8058 			that.size.height = newHeight;
       
  8059 			that.position.top = op.top - oy;
       
  8060 		} else if (/^(sw)$/.test(a)) {
       
  8061 			that.size.width = newWidth;
       
  8062 			that.size.height = newHeight;
       
  8063 			that.position.left = op.left - ox;
       
  8064 		} else {
       
  8065 			if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
       
  8066 				outerDimensions = that._getPaddingPlusBorderDimensions( this );
       
  8067 			}
       
  8068 
       
  8069 			if ( newHeight - gridY > 0 ) {
       
  8070 				that.size.height = newHeight;
       
  8071 				that.position.top = op.top - oy;
       
  8072 			} else {
       
  8073 				newHeight = gridY - outerDimensions.height;
       
  8074 				that.size.height = newHeight;
       
  8075 				that.position.top = op.top + os.height - newHeight;
       
  8076 			}
       
  8077 			if ( newWidth - gridX > 0 ) {
       
  8078 				that.size.width = newWidth;
       
  8079 				that.position.left = op.left - ox;
       
  8080 			} else {
       
  8081 				newWidth = gridX - outerDimensions.width;
       
  8082 				that.size.width = newWidth;
       
  8083 				that.position.left = op.left + os.width - newWidth;
       
  8084 			}
       
  8085 		}
       
  8086 	}
       
  8087 
       
  8088 });
       
  8089 
       
  8090 var resizable = $.ui.resizable;
       
  8091 
       
  8092 
       
  8093 /*!
       
  8094  * jQuery UI Dialog 1.11.4
       
  8095  * http://jqueryui.com
       
  8096  *
       
  8097  * Copyright jQuery Foundation and other contributors
       
  8098  * Released under the MIT license.
       
  8099  * http://jquery.org/license
       
  8100  *
       
  8101  * http://api.jqueryui.com/dialog/
       
  8102  */
       
  8103 
       
  8104 
       
  8105 var dialog = $.widget( "ui.dialog", {
       
  8106 	version: "1.11.4",
       
  8107 	options: {
       
  8108 		appendTo: "body",
       
  8109 		autoOpen: true,
       
  8110 		buttons: [],
       
  8111 		closeOnEscape: true,
       
  8112 		closeText: "Close",
       
  8113 		dialogClass: "",
       
  8114 		draggable: true,
       
  8115 		hide: null,
       
  8116 		height: "auto",
       
  8117 		maxHeight: null,
       
  8118 		maxWidth: null,
       
  8119 		minHeight: 150,
       
  8120 		minWidth: 150,
       
  8121 		modal: false,
       
  8122 		position: {
       
  8123 			my: "center",
       
  8124 			at: "center",
       
  8125 			of: window,
       
  8126 			collision: "fit",
       
  8127 			// Ensure the titlebar is always visible
       
  8128 			using: function( pos ) {
       
  8129 				var topOffset = $( this ).css( pos ).offset().top;
       
  8130 				if ( topOffset < 0 ) {
       
  8131 					$( this ).css( "top", pos.top - topOffset );
       
  8132 				}
       
  8133 			}
       
  8134 		},
       
  8135 		resizable: true,
       
  8136 		show: null,
       
  8137 		title: null,
       
  8138 		width: 300,
       
  8139 
       
  8140 		// callbacks
       
  8141 		beforeClose: null,
       
  8142 		close: null,
       
  8143 		drag: null,
       
  8144 		dragStart: null,
       
  8145 		dragStop: null,
       
  8146 		focus: null,
       
  8147 		open: null,
       
  8148 		resize: null,
       
  8149 		resizeStart: null,
       
  8150 		resizeStop: null
       
  8151 	},
       
  8152 
       
  8153 	sizeRelatedOptions: {
       
  8154 		buttons: true,
       
  8155 		height: true,
       
  8156 		maxHeight: true,
       
  8157 		maxWidth: true,
       
  8158 		minHeight: true,
       
  8159 		minWidth: true,
       
  8160 		width: true
       
  8161 	},
       
  8162 
       
  8163 	resizableRelatedOptions: {
       
  8164 		maxHeight: true,
       
  8165 		maxWidth: true,
       
  8166 		minHeight: true,
       
  8167 		minWidth: true
       
  8168 	},
       
  8169 
       
  8170 	_create: function() {
       
  8171 		this.originalCss = {
       
  8172 			display: this.element[ 0 ].style.display,
       
  8173 			width: this.element[ 0 ].style.width,
       
  8174 			minHeight: this.element[ 0 ].style.minHeight,
       
  8175 			maxHeight: this.element[ 0 ].style.maxHeight,
       
  8176 			height: this.element[ 0 ].style.height
       
  8177 		};
       
  8178 		this.originalPosition = {
       
  8179 			parent: this.element.parent(),
       
  8180 			index: this.element.parent().children().index( this.element )
       
  8181 		};
       
  8182 		this.originalTitle = this.element.attr( "title" );
       
  8183 		this.options.title = this.options.title || this.originalTitle;
       
  8184 
       
  8185 		this._createWrapper();
       
  8186 
       
  8187 		this.element
       
  8188 			.show()
       
  8189 			.removeAttr( "title" )
       
  8190 			.addClass( "ui-dialog-content ui-widget-content" )
       
  8191 			.appendTo( this.uiDialog );
       
  8192 
       
  8193 		this._createTitlebar();
       
  8194 		this._createButtonPane();
       
  8195 
       
  8196 		if ( this.options.draggable && $.fn.draggable ) {
       
  8197 			this._makeDraggable();
       
  8198 		}
       
  8199 		if ( this.options.resizable && $.fn.resizable ) {
       
  8200 			this._makeResizable();
       
  8201 		}
       
  8202 
       
  8203 		this._isOpen = false;
       
  8204 
       
  8205 		this._trackFocus();
       
  8206 	},
       
  8207 
       
  8208 	_init: function() {
       
  8209 		if ( this.options.autoOpen ) {
       
  8210 			this.open();
       
  8211 		}
       
  8212 	},
       
  8213 
       
  8214 	_appendTo: function() {
       
  8215 		var element = this.options.appendTo;
       
  8216 		if ( element && (element.jquery || element.nodeType) ) {
       
  8217 			return $( element );
       
  8218 		}
       
  8219 		return this.document.find( element || "body" ).eq( 0 );
       
  8220 	},
       
  8221 
       
  8222 	_destroy: function() {
       
  8223 		var next,
       
  8224 			originalPosition = this.originalPosition;
       
  8225 
       
  8226 		this._untrackInstance();
       
  8227 		this._destroyOverlay();
       
  8228 
       
  8229 		this.element
       
  8230 			.removeUniqueId()
       
  8231 			.removeClass( "ui-dialog-content ui-widget-content" )
       
  8232 			.css( this.originalCss )
       
  8233 			// Without detaching first, the following becomes really slow
       
  8234 			.detach();
       
  8235 
       
  8236 		this.uiDialog.stop( true, true ).remove();
       
  8237 
       
  8238 		if ( this.originalTitle ) {
       
  8239 			this.element.attr( "title", this.originalTitle );
       
  8240 		}
       
  8241 
       
  8242 		next = originalPosition.parent.children().eq( originalPosition.index );
       
  8243 		// Don't try to place the dialog next to itself (#8613)
       
  8244 		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
       
  8245 			next.before( this.element );
       
  8246 		} else {
       
  8247 			originalPosition.parent.append( this.element );
       
  8248 		}
       
  8249 	},
       
  8250 
       
  8251 	widget: function() {
       
  8252 		return this.uiDialog;
       
  8253 	},
       
  8254 
       
  8255 	disable: $.noop,
       
  8256 	enable: $.noop,
       
  8257 
       
  8258 	close: function( event ) {
       
  8259 		var activeElement,
       
  8260 			that = this;
       
  8261 
       
  8262 		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
       
  8263 			return;
       
  8264 		}
       
  8265 
       
  8266 		this._isOpen = false;
       
  8267 		this._focusedElement = null;
       
  8268 		this._destroyOverlay();
       
  8269 		this._untrackInstance();
       
  8270 
       
  8271 		if ( !this.opener.filter( ":focusable" ).focus().length ) {
       
  8272 
       
  8273 			// support: IE9
       
  8274 			// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
       
  8275 			try {
       
  8276 				activeElement = this.document[ 0 ].activeElement;
       
  8277 
       
  8278 				// Support: IE9, IE10
       
  8279 				// If the <body> is blurred, IE will switch windows, see #4520
       
  8280 				if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
       
  8281 
       
  8282 					// Hiding a focused element doesn't trigger blur in WebKit
       
  8283 					// so in case we have nothing to focus on, explicitly blur the active element
       
  8284 					// https://bugs.webkit.org/show_bug.cgi?id=47182
       
  8285 					$( activeElement ).blur();
       
  8286 				}
       
  8287 			} catch ( error ) {}
       
  8288 		}
       
  8289 
       
  8290 		this._hide( this.uiDialog, this.options.hide, function() {
       
  8291 			that._trigger( "close", event );
       
  8292 		});
       
  8293 	},
       
  8294 
       
  8295 	isOpen: function() {
       
  8296 		return this._isOpen;
       
  8297 	},
       
  8298 
       
  8299 	moveToTop: function() {
       
  8300 		this._moveToTop();
       
  8301 	},
       
  8302 
       
  8303 	_moveToTop: function( event, silent ) {
       
  8304 		var moved = false,
       
  8305 			zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
       
  8306 				return +$( this ).css( "z-index" );
       
  8307 			}).get(),
       
  8308 			zIndexMax = Math.max.apply( null, zIndices );
       
  8309 
       
  8310 		if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
       
  8311 			this.uiDialog.css( "z-index", zIndexMax + 1 );
       
  8312 			moved = true;
       
  8313 		}
       
  8314 
       
  8315 		if ( moved && !silent ) {
       
  8316 			this._trigger( "focus", event );
       
  8317 		}
       
  8318 		return moved;
       
  8319 	},
       
  8320 
       
  8321 	open: function() {
       
  8322 		var that = this;
       
  8323 		if ( this._isOpen ) {
       
  8324 			if ( this._moveToTop() ) {
       
  8325 				this._focusTabbable();
       
  8326 			}
       
  8327 			return;
       
  8328 		}
       
  8329 
       
  8330 		this._isOpen = true;
       
  8331 		this.opener = $( this.document[ 0 ].activeElement );
       
  8332 
       
  8333 		this._size();
       
  8334 		this._position();
       
  8335 		this._createOverlay();
       
  8336 		this._moveToTop( null, true );
       
  8337 
       
  8338 		// Ensure the overlay is moved to the top with the dialog, but only when
       
  8339 		// opening. The overlay shouldn't move after the dialog is open so that
       
  8340 		// modeless dialogs opened after the modal dialog stack properly.
       
  8341 		if ( this.overlay ) {
       
  8342 			this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
       
  8343 		}
       
  8344 
       
  8345 		this._show( this.uiDialog, this.options.show, function() {
       
  8346 			that._focusTabbable();
       
  8347 			that._trigger( "focus" );
       
  8348 		});
       
  8349 
       
  8350 		// Track the dialog immediately upon openening in case a focus event
       
  8351 		// somehow occurs outside of the dialog before an element inside the
       
  8352 		// dialog is focused (#10152)
       
  8353 		this._makeFocusTarget();
       
  8354 
       
  8355 		this._trigger( "open" );
       
  8356 	},
       
  8357 
       
  8358 	_focusTabbable: function() {
       
  8359 		// Set focus to the first match:
       
  8360 		// 1. An element that was focused previously
       
  8361 		// 2. First element inside the dialog matching [autofocus]
       
  8362 		// 3. Tabbable element inside the content element
       
  8363 		// 4. Tabbable element inside the buttonpane
       
  8364 		// 5. The close button
       
  8365 		// 6. The dialog itself
       
  8366 		var hasFocus = this._focusedElement;
       
  8367 		if ( !hasFocus ) {
       
  8368 			hasFocus = this.element.find( "[autofocus]" );
       
  8369 		}
       
  8370 		if ( !hasFocus.length ) {
       
  8371 			hasFocus = this.element.find( ":tabbable" );
       
  8372 		}
       
  8373 		if ( !hasFocus.length ) {
       
  8374 			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
       
  8375 		}
       
  8376 		if ( !hasFocus.length ) {
       
  8377 			hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
       
  8378 		}
       
  8379 		if ( !hasFocus.length ) {
       
  8380 			hasFocus = this.uiDialog;
       
  8381 		}
       
  8382 		hasFocus.eq( 0 ).focus();
       
  8383 	},
       
  8384 
       
  8385 	_keepFocus: function( event ) {
       
  8386 		function checkFocus() {
       
  8387 			var activeElement = this.document[0].activeElement,
       
  8388 				isActive = this.uiDialog[0] === activeElement ||
       
  8389 					$.contains( this.uiDialog[0], activeElement );
       
  8390 			if ( !isActive ) {
       
  8391 				this._focusTabbable();
       
  8392 			}
       
  8393 		}
       
  8394 		event.preventDefault();
       
  8395 		checkFocus.call( this );
       
  8396 		// support: IE
       
  8397 		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
       
  8398 		// so we check again later
       
  8399 		this._delay( checkFocus );
       
  8400 	},
       
  8401 
       
  8402 	_createWrapper: function() {
       
  8403 		this.uiDialog = $("<div>")
       
  8404 			.addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
       
  8405 				this.options.dialogClass )
       
  8406 			.hide()
       
  8407 			.attr({
       
  8408 				// Setting tabIndex makes the div focusable
       
  8409 				tabIndex: -1,
       
  8410 				role: "dialog"
       
  8411 			})
       
  8412 			.appendTo( this._appendTo() );
       
  8413 
       
  8414 		this._on( this.uiDialog, {
       
  8415 			keydown: function( event ) {
       
  8416 				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
       
  8417 						event.keyCode === $.ui.keyCode.ESCAPE ) {
       
  8418 					event.preventDefault();
       
  8419 					this.close( event );
       
  8420 					return;
       
  8421 				}
       
  8422 
       
  8423 				// prevent tabbing out of dialogs
       
  8424 				if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
       
  8425 					return;
       
  8426 				}
       
  8427 				var tabbables = this.uiDialog.find( ":tabbable" ),
       
  8428 					first = tabbables.filter( ":first" ),
       
  8429 					last = tabbables.filter( ":last" );
       
  8430 
       
  8431 				if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
       
  8432 					this._delay(function() {
       
  8433 						first.focus();
       
  8434 					});
       
  8435 					event.preventDefault();
       
  8436 				} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
       
  8437 					this._delay(function() {
       
  8438 						last.focus();
       
  8439 					});
       
  8440 					event.preventDefault();
       
  8441 				}
       
  8442 			},
       
  8443 			mousedown: function( event ) {
       
  8444 				if ( this._moveToTop( event ) ) {
       
  8445 					this._focusTabbable();
       
  8446 				}
       
  8447 			}
       
  8448 		});
       
  8449 
       
  8450 		// We assume that any existing aria-describedby attribute means
       
  8451 		// that the dialog content is marked up properly
       
  8452 		// otherwise we brute force the content as the description
       
  8453 		if ( !this.element.find( "[aria-describedby]" ).length ) {
       
  8454 			this.uiDialog.attr({
       
  8455 				"aria-describedby": this.element.uniqueId().attr( "id" )
       
  8456 			});
       
  8457 		}
       
  8458 	},
       
  8459 
       
  8460 	_createTitlebar: function() {
       
  8461 		var uiDialogTitle;
       
  8462 
       
  8463 		this.uiDialogTitlebar = $( "<div>" )
       
  8464 			.addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" )
       
  8465 			.prependTo( this.uiDialog );
       
  8466 		this._on( this.uiDialogTitlebar, {
       
  8467 			mousedown: function( event ) {
       
  8468 				// Don't prevent click on close button (#8838)
       
  8469 				// Focusing a dialog that is partially scrolled out of view
       
  8470 				// causes the browser to scroll it into view, preventing the click event
       
  8471 				if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
       
  8472 					// Dialog isn't getting focus when dragging (#8063)
       
  8473 					this.uiDialog.focus();
       
  8474 				}
       
  8475 			}
       
  8476 		});
       
  8477 
       
  8478 		// support: IE
       
  8479 		// Use type="button" to prevent enter keypresses in textboxes from closing the
       
  8480 		// dialog in IE (#9312)
       
  8481 		this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
       
  8482 			.button({
       
  8483 				label: this.options.closeText,
       
  8484 				icons: {
       
  8485 					primary: "ui-icon-closethick"
       
  8486 				},
       
  8487 				text: false
       
  8488 			})
       
  8489 			.addClass( "ui-dialog-titlebar-close" )
       
  8490 			.appendTo( this.uiDialogTitlebar );
       
  8491 		this._on( this.uiDialogTitlebarClose, {
       
  8492 			click: function( event ) {
       
  8493 				event.preventDefault();
       
  8494 				this.close( event );
       
  8495 			}
       
  8496 		});
       
  8497 
       
  8498 		uiDialogTitle = $( "<span>" )
       
  8499 			.uniqueId()
       
  8500 			.addClass( "ui-dialog-title" )
       
  8501 			.prependTo( this.uiDialogTitlebar );
       
  8502 		this._title( uiDialogTitle );
       
  8503 
       
  8504 		this.uiDialog.attr({
       
  8505 			"aria-labelledby": uiDialogTitle.attr( "id" )
       
  8506 		});
       
  8507 	},
       
  8508 
       
  8509 	_title: function( title ) {
       
  8510 		if ( !this.options.title ) {
       
  8511 			title.html( "&#160;" );
       
  8512 		}
       
  8513 		title.text( this.options.title );
       
  8514 	},
       
  8515 
       
  8516 	_createButtonPane: function() {
       
  8517 		this.uiDialogButtonPane = $( "<div>" )
       
  8518 			.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
       
  8519 
       
  8520 		this.uiButtonSet = $( "<div>" )
       
  8521 			.addClass( "ui-dialog-buttonset" )
       
  8522 			.appendTo( this.uiDialogButtonPane );
       
  8523 
       
  8524 		this._createButtons();
       
  8525 	},
       
  8526 
       
  8527 	_createButtons: function() {
       
  8528 		var that = this,
       
  8529 			buttons = this.options.buttons;
       
  8530 
       
  8531 		// if we already have a button pane, remove it
       
  8532 		this.uiDialogButtonPane.remove();
       
  8533 		this.uiButtonSet.empty();
       
  8534 
       
  8535 		if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
       
  8536 			this.uiDialog.removeClass( "ui-dialog-buttons" );
       
  8537 			return;
       
  8538 		}
       
  8539 
       
  8540 		$.each( buttons, function( name, props ) {
       
  8541 			var click, buttonOptions;
       
  8542 			props = $.isFunction( props ) ?
       
  8543 				{ click: props, text: name } :
       
  8544 				props;
       
  8545 			// Default to a non-submitting button
       
  8546 			props = $.extend( { type: "button" }, props );
       
  8547 			// Change the context for the click callback to be the main element
       
  8548 			click = props.click;
       
  8549 			props.click = function() {
       
  8550 				click.apply( that.element[ 0 ], arguments );
       
  8551 			};
       
  8552 			buttonOptions = {
       
  8553 				icons: props.icons,
       
  8554 				text: props.showText
       
  8555 			};
       
  8556 			delete props.icons;
       
  8557 			delete props.showText;
       
  8558 			$( "<button></button>", props )
       
  8559 				.button( buttonOptions )
       
  8560 				.appendTo( that.uiButtonSet );
       
  8561 		});
       
  8562 		this.uiDialog.addClass( "ui-dialog-buttons" );
       
  8563 		this.uiDialogButtonPane.appendTo( this.uiDialog );
       
  8564 	},
       
  8565 
       
  8566 	_makeDraggable: function() {
       
  8567 		var that = this,
       
  8568 			options = this.options;
       
  8569 
       
  8570 		function filteredUi( ui ) {
       
  8571 			return {
       
  8572 				position: ui.position,
       
  8573 				offset: ui.offset
       
  8574 			};
       
  8575 		}
       
  8576 
       
  8577 		this.uiDialog.draggable({
       
  8578 			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
       
  8579 			handle: ".ui-dialog-titlebar",
       
  8580 			containment: "document",
       
  8581 			start: function( event, ui ) {
       
  8582 				$( this ).addClass( "ui-dialog-dragging" );
       
  8583 				that._blockFrames();
       
  8584 				that._trigger( "dragStart", event, filteredUi( ui ) );
       
  8585 			},
       
  8586 			drag: function( event, ui ) {
       
  8587 				that._trigger( "drag", event, filteredUi( ui ) );
       
  8588 			},
       
  8589 			stop: function( event, ui ) {
       
  8590 				var left = ui.offset.left - that.document.scrollLeft(),
       
  8591 					top = ui.offset.top - that.document.scrollTop();
       
  8592 
       
  8593 				options.position = {
       
  8594 					my: "left top",
       
  8595 					at: "left" + (left >= 0 ? "+" : "") + left + " " +
       
  8596 						"top" + (top >= 0 ? "+" : "") + top,
       
  8597 					of: that.window
       
  8598 				};
       
  8599 				$( this ).removeClass( "ui-dialog-dragging" );
       
  8600 				that._unblockFrames();
       
  8601 				that._trigger( "dragStop", event, filteredUi( ui ) );
       
  8602 			}
       
  8603 		});
       
  8604 	},
       
  8605 
       
  8606 	_makeResizable: function() {
       
  8607 		var that = this,
       
  8608 			options = this.options,
       
  8609 			handles = options.resizable,
       
  8610 			// .ui-resizable has position: relative defined in the stylesheet
       
  8611 			// but dialogs have to use absolute or fixed positioning
       
  8612 			position = this.uiDialog.css("position"),
       
  8613 			resizeHandles = typeof handles === "string" ?
       
  8614 				handles	:
       
  8615 				"n,e,s,w,se,sw,ne,nw";
       
  8616 
       
  8617 		function filteredUi( ui ) {
       
  8618 			return {
       
  8619 				originalPosition: ui.originalPosition,
       
  8620 				originalSize: ui.originalSize,
       
  8621 				position: ui.position,
       
  8622 				size: ui.size
       
  8623 			};
       
  8624 		}
       
  8625 
       
  8626 		this.uiDialog.resizable({
       
  8627 			cancel: ".ui-dialog-content",
       
  8628 			containment: "document",
       
  8629 			alsoResize: this.element,
       
  8630 			maxWidth: options.maxWidth,
       
  8631 			maxHeight: options.maxHeight,
       
  8632 			minWidth: options.minWidth,
       
  8633 			minHeight: this._minHeight(),
       
  8634 			handles: resizeHandles,
       
  8635 			start: function( event, ui ) {
       
  8636 				$( this ).addClass( "ui-dialog-resizing" );
       
  8637 				that._blockFrames();
       
  8638 				that._trigger( "resizeStart", event, filteredUi( ui ) );
       
  8639 			},
       
  8640 			resize: function( event, ui ) {
       
  8641 				that._trigger( "resize", event, filteredUi( ui ) );
       
  8642 			},
       
  8643 			stop: function( event, ui ) {
       
  8644 				var offset = that.uiDialog.offset(),
       
  8645 					left = offset.left - that.document.scrollLeft(),
       
  8646 					top = offset.top - that.document.scrollTop();
       
  8647 
       
  8648 				options.height = that.uiDialog.height();
       
  8649 				options.width = that.uiDialog.width();
       
  8650 				options.position = {
       
  8651 					my: "left top",
       
  8652 					at: "left" + (left >= 0 ? "+" : "") + left + " " +
       
  8653 						"top" + (top >= 0 ? "+" : "") + top,
       
  8654 					of: that.window
       
  8655 				};
       
  8656 				$( this ).removeClass( "ui-dialog-resizing" );
       
  8657 				that._unblockFrames();
       
  8658 				that._trigger( "resizeStop", event, filteredUi( ui ) );
       
  8659 			}
       
  8660 		})
       
  8661 		.css( "position", position );
       
  8662 	},
       
  8663 
       
  8664 	_trackFocus: function() {
       
  8665 		this._on( this.widget(), {
       
  8666 			focusin: function( event ) {
       
  8667 				this._makeFocusTarget();
       
  8668 				this._focusedElement = $( event.target );
       
  8669 			}
       
  8670 		});
       
  8671 	},
       
  8672 
       
  8673 	_makeFocusTarget: function() {
       
  8674 		this._untrackInstance();
       
  8675 		this._trackingInstances().unshift( this );
       
  8676 	},
       
  8677 
       
  8678 	_untrackInstance: function() {
       
  8679 		var instances = this._trackingInstances(),
       
  8680 			exists = $.inArray( this, instances );
       
  8681 		if ( exists !== -1 ) {
       
  8682 			instances.splice( exists, 1 );
       
  8683 		}
       
  8684 	},
       
  8685 
       
  8686 	_trackingInstances: function() {
       
  8687 		var instances = this.document.data( "ui-dialog-instances" );
       
  8688 		if ( !instances ) {
       
  8689 			instances = [];
       
  8690 			this.document.data( "ui-dialog-instances", instances );
       
  8691 		}
       
  8692 		return instances;
       
  8693 	},
       
  8694 
       
  8695 	_minHeight: function() {
       
  8696 		var options = this.options;
       
  8697 
       
  8698 		return options.height === "auto" ?
       
  8699 			options.minHeight :
       
  8700 			Math.min( options.minHeight, options.height );
       
  8701 	},
       
  8702 
       
  8703 	_position: function() {
       
  8704 		// Need to show the dialog to get the actual offset in the position plugin
       
  8705 		var isVisible = this.uiDialog.is( ":visible" );
       
  8706 		if ( !isVisible ) {
       
  8707 			this.uiDialog.show();
       
  8708 		}
       
  8709 		this.uiDialog.position( this.options.position );
       
  8710 		if ( !isVisible ) {
       
  8711 			this.uiDialog.hide();
       
  8712 		}
       
  8713 	},
       
  8714 
       
  8715 	_setOptions: function( options ) {
       
  8716 		var that = this,
       
  8717 			resize = false,
       
  8718 			resizableOptions = {};
       
  8719 
       
  8720 		$.each( options, function( key, value ) {
       
  8721 			that._setOption( key, value );
       
  8722 
       
  8723 			if ( key in that.sizeRelatedOptions ) {
       
  8724 				resize = true;
       
  8725 			}
       
  8726 			if ( key in that.resizableRelatedOptions ) {
       
  8727 				resizableOptions[ key ] = value;
       
  8728 			}
       
  8729 		});
       
  8730 
       
  8731 		if ( resize ) {
       
  8732 			this._size();
       
  8733 			this._position();
       
  8734 		}
       
  8735 		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
       
  8736 			this.uiDialog.resizable( "option", resizableOptions );
       
  8737 		}
       
  8738 	},
       
  8739 
       
  8740 	_setOption: function( key, value ) {
       
  8741 		var isDraggable, isResizable,
       
  8742 			uiDialog = this.uiDialog;
       
  8743 
       
  8744 		if ( key === "dialogClass" ) {
       
  8745 			uiDialog
       
  8746 				.removeClass( this.options.dialogClass )
       
  8747 				.addClass( value );
       
  8748 		}
       
  8749 
       
  8750 		if ( key === "disabled" ) {
       
  8751 			return;
       
  8752 		}
       
  8753 
       
  8754 		this._super( key, value );
       
  8755 
       
  8756 		if ( key === "appendTo" ) {
       
  8757 			this.uiDialog.appendTo( this._appendTo() );
       
  8758 		}
       
  8759 
       
  8760 		if ( key === "buttons" ) {
       
  8761 			this._createButtons();
       
  8762 		}
       
  8763 
       
  8764 		if ( key === "closeText" ) {
       
  8765 			this.uiDialogTitlebarClose.button({
       
  8766 				// Ensure that we always pass a string
       
  8767 				label: "" + value
       
  8768 			});
       
  8769 		}
       
  8770 
       
  8771 		if ( key === "draggable" ) {
       
  8772 			isDraggable = uiDialog.is( ":data(ui-draggable)" );
       
  8773 			if ( isDraggable && !value ) {
       
  8774 				uiDialog.draggable( "destroy" );
       
  8775 			}
       
  8776 
       
  8777 			if ( !isDraggable && value ) {
       
  8778 				this._makeDraggable();
       
  8779 			}
       
  8780 		}
       
  8781 
       
  8782 		if ( key === "position" ) {
       
  8783 			this._position();
       
  8784 		}
       
  8785 
       
  8786 		if ( key === "resizable" ) {
       
  8787 			// currently resizable, becoming non-resizable
       
  8788 			isResizable = uiDialog.is( ":data(ui-resizable)" );
       
  8789 			if ( isResizable && !value ) {
       
  8790 				uiDialog.resizable( "destroy" );
       
  8791 			}
       
  8792 
       
  8793 			// currently resizable, changing handles
       
  8794 			if ( isResizable && typeof value === "string" ) {
       
  8795 				uiDialog.resizable( "option", "handles", value );
       
  8796 			}
       
  8797 
       
  8798 			// currently non-resizable, becoming resizable
       
  8799 			if ( !isResizable && value !== false ) {
       
  8800 				this._makeResizable();
       
  8801 			}
       
  8802 		}
       
  8803 
       
  8804 		if ( key === "title" ) {
       
  8805 			this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
       
  8806 		}
       
  8807 	},
       
  8808 
       
  8809 	_size: function() {
       
  8810 		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
       
  8811 		// divs will both have width and height set, so we need to reset them
       
  8812 		var nonContentHeight, minContentHeight, maxContentHeight,
       
  8813 			options = this.options;
       
  8814 
       
  8815 		// Reset content sizing
       
  8816 		this.element.show().css({
       
  8817 			width: "auto",
       
  8818 			minHeight: 0,
       
  8819 			maxHeight: "none",
       
  8820 			height: 0
       
  8821 		});
       
  8822 
       
  8823 		if ( options.minWidth > options.width ) {
       
  8824 			options.width = options.minWidth;
       
  8825 		}
       
  8826 
       
  8827 		// reset wrapper sizing
       
  8828 		// determine the height of all the non-content elements
       
  8829 		nonContentHeight = this.uiDialog.css({
       
  8830 				height: "auto",
       
  8831 				width: options.width
       
  8832 			})
       
  8833 			.outerHeight();
       
  8834 		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
       
  8835 		maxContentHeight = typeof options.maxHeight === "number" ?
       
  8836 			Math.max( 0, options.maxHeight - nonContentHeight ) :
       
  8837 			"none";
       
  8838 
       
  8839 		if ( options.height === "auto" ) {
       
  8840 			this.element.css({
       
  8841 				minHeight: minContentHeight,
       
  8842 				maxHeight: maxContentHeight,
       
  8843 				height: "auto"
       
  8844 			});
       
  8845 		} else {
       
  8846 			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
       
  8847 		}
       
  8848 
       
  8849 		if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
       
  8850 			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
       
  8851 		}
       
  8852 	},
       
  8853 
       
  8854 	_blockFrames: function() {
       
  8855 		this.iframeBlocks = this.document.find( "iframe" ).map(function() {
       
  8856 			var iframe = $( this );
       
  8857 
       
  8858 			return $( "<div>" )
       
  8859 				.css({
       
  8860 					position: "absolute",
       
  8861 					width: iframe.outerWidth(),
       
  8862 					height: iframe.outerHeight()
       
  8863 				})
       
  8864 				.appendTo( iframe.parent() )
       
  8865 				.offset( iframe.offset() )[0];
       
  8866 		});
       
  8867 	},
       
  8868 
       
  8869 	_unblockFrames: function() {
       
  8870 		if ( this.iframeBlocks ) {
       
  8871 			this.iframeBlocks.remove();
       
  8872 			delete this.iframeBlocks;
       
  8873 		}
       
  8874 	},
       
  8875 
       
  8876 	_allowInteraction: function( event ) {
       
  8877 		if ( $( event.target ).closest( ".ui-dialog" ).length ) {
       
  8878 			return true;
       
  8879 		}
       
  8880 
       
  8881 		// TODO: Remove hack when datepicker implements
       
  8882 		// the .ui-front logic (#8989)
       
  8883 		return !!$( event.target ).closest( ".ui-datepicker" ).length;
       
  8884 	},
       
  8885 
       
  8886 	_createOverlay: function() {
       
  8887 		if ( !this.options.modal ) {
       
  8888 			return;
       
  8889 		}
       
  8890 
       
  8891 		// We use a delay in case the overlay is created from an
       
  8892 		// event that we're going to be cancelling (#2804)
       
  8893 		var isOpening = true;
       
  8894 		this._delay(function() {
       
  8895 			isOpening = false;
       
  8896 		});
       
  8897 
       
  8898 		if ( !this.document.data( "ui-dialog-overlays" ) ) {
       
  8899 
       
  8900 			// Prevent use of anchors and inputs
       
  8901 			// Using _on() for an event handler shared across many instances is
       
  8902 			// safe because the dialogs stack and must be closed in reverse order
       
  8903 			this._on( this.document, {
       
  8904 				focusin: function( event ) {
       
  8905 					if ( isOpening ) {
       
  8906 						return;
       
  8907 					}
       
  8908 
       
  8909 					if ( !this._allowInteraction( event ) ) {
       
  8910 						event.preventDefault();
       
  8911 						this._trackingInstances()[ 0 ]._focusTabbable();
       
  8912 					}
       
  8913 				}
       
  8914 			});
       
  8915 		}
       
  8916 
       
  8917 		this.overlay = $( "<div>" )
       
  8918 			.addClass( "ui-widget-overlay ui-front" )
       
  8919 			.appendTo( this._appendTo() );
       
  8920 		this._on( this.overlay, {
       
  8921 			mousedown: "_keepFocus"
       
  8922 		});
       
  8923 		this.document.data( "ui-dialog-overlays",
       
  8924 			(this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
       
  8925 	},
       
  8926 
       
  8927 	_destroyOverlay: function() {
       
  8928 		if ( !this.options.modal ) {
       
  8929 			return;
       
  8930 		}
       
  8931 
       
  8932 		if ( this.overlay ) {
       
  8933 			var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
       
  8934 
       
  8935 			if ( !overlays ) {
       
  8936 				this.document
       
  8937 					.unbind( "focusin" )
       
  8938 					.removeData( "ui-dialog-overlays" );
       
  8939 			} else {
       
  8940 				this.document.data( "ui-dialog-overlays", overlays );
       
  8941 			}
       
  8942 
       
  8943 			this.overlay.remove();
       
  8944 			this.overlay = null;
       
  8945 		}
       
  8946 	}
       
  8947 });
       
  8948 
       
  8949 
       
  8950 /*!
       
  8951  * jQuery UI Droppable 1.11.4
       
  8952  * http://jqueryui.com
       
  8953  *
       
  8954  * Copyright jQuery Foundation and other contributors
       
  8955  * Released under the MIT license.
       
  8956  * http://jquery.org/license
       
  8957  *
       
  8958  * http://api.jqueryui.com/droppable/
       
  8959  */
       
  8960 
       
  8961 
       
  8962 $.widget( "ui.droppable", {
       
  8963 	version: "1.11.4",
       
  8964 	widgetEventPrefix: "drop",
       
  8965 	options: {
       
  8966 		accept: "*",
       
  8967 		activeClass: false,
       
  8968 		addClasses: true,
       
  8969 		greedy: false,
       
  8970 		hoverClass: false,
       
  8971 		scope: "default",
       
  8972 		tolerance: "intersect",
       
  8973 
       
  8974 		// callbacks
       
  8975 		activate: null,
       
  8976 		deactivate: null,
       
  8977 		drop: null,
       
  8978 		out: null,
       
  8979 		over: null
       
  8980 	},
       
  8981 	_create: function() {
       
  8982 
       
  8983 		var proportions,
       
  8984 			o = this.options,
       
  8985 			accept = o.accept;
       
  8986 
       
  8987 		this.isover = false;
       
  8988 		this.isout = true;
       
  8989 
       
  8990 		this.accept = $.isFunction( accept ) ? accept : function( d ) {
       
  8991 			return d.is( accept );
       
  8992 		};
       
  8993 
       
  8994 		this.proportions = function( /* valueToWrite */ ) {
       
  8995 			if ( arguments.length ) {
       
  8996 				// Store the droppable's proportions
       
  8997 				proportions = arguments[ 0 ];
       
  8998 			} else {
       
  8999 				// Retrieve or derive the droppable's proportions
       
  9000 				return proportions ?
       
  9001 					proportions :
       
  9002 					proportions = {
       
  9003 						width: this.element[ 0 ].offsetWidth,
       
  9004 						height: this.element[ 0 ].offsetHeight
       
  9005 					};
       
  9006 			}
       
  9007 		};
       
  9008 
       
  9009 		this._addToManager( o.scope );
       
  9010 
       
  9011 		o.addClasses && this.element.addClass( "ui-droppable" );
       
  9012 
       
  9013 	},
       
  9014 
       
  9015 	_addToManager: function( scope ) {
       
  9016 		// Add the reference and positions to the manager
       
  9017 		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
       
  9018 		$.ui.ddmanager.droppables[ scope ].push( this );
       
  9019 	},
       
  9020 
       
  9021 	_splice: function( drop ) {
       
  9022 		var i = 0;
       
  9023 		for ( ; i < drop.length; i++ ) {
       
  9024 			if ( drop[ i ] === this ) {
       
  9025 				drop.splice( i, 1 );
       
  9026 			}
       
  9027 		}
       
  9028 	},
       
  9029 
       
  9030 	_destroy: function() {
       
  9031 		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
       
  9032 
       
  9033 		this._splice( drop );
       
  9034 
       
  9035 		this.element.removeClass( "ui-droppable ui-droppable-disabled" );
       
  9036 	},
       
  9037 
       
  9038 	_setOption: function( key, value ) {
       
  9039 
       
  9040 		if ( key === "accept" ) {
       
  9041 			this.accept = $.isFunction( value ) ? value : function( d ) {
       
  9042 				return d.is( value );
       
  9043 			};
       
  9044 		} else if ( key === "scope" ) {
       
  9045 			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
       
  9046 
       
  9047 			this._splice( drop );
       
  9048 			this._addToManager( value );
       
  9049 		}
       
  9050 
       
  9051 		this._super( key, value );
       
  9052 	},
       
  9053 
       
  9054 	_activate: function( event ) {
       
  9055 		var draggable = $.ui.ddmanager.current;
       
  9056 		if ( this.options.activeClass ) {
       
  9057 			this.element.addClass( this.options.activeClass );
       
  9058 		}
       
  9059 		if ( draggable ){
       
  9060 			this._trigger( "activate", event, this.ui( draggable ) );
       
  9061 		}
       
  9062 	},
       
  9063 
       
  9064 	_deactivate: function( event ) {
       
  9065 		var draggable = $.ui.ddmanager.current;
       
  9066 		if ( this.options.activeClass ) {
       
  9067 			this.element.removeClass( this.options.activeClass );
       
  9068 		}
       
  9069 		if ( draggable ){
       
  9070 			this._trigger( "deactivate", event, this.ui( draggable ) );
       
  9071 		}
       
  9072 	},
       
  9073 
       
  9074 	_over: function( event ) {
       
  9075 
       
  9076 		var draggable = $.ui.ddmanager.current;
       
  9077 
       
  9078 		// Bail if draggable and droppable are same element
       
  9079 		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
       
  9080 			return;
       
  9081 		}
       
  9082 
       
  9083 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
       
  9084 			if ( this.options.hoverClass ) {
       
  9085 				this.element.addClass( this.options.hoverClass );
       
  9086 			}
       
  9087 			this._trigger( "over", event, this.ui( draggable ) );
       
  9088 		}
       
  9089 
       
  9090 	},
       
  9091 
       
  9092 	_out: function( event ) {
       
  9093 
       
  9094 		var draggable = $.ui.ddmanager.current;
       
  9095 
       
  9096 		// Bail if draggable and droppable are same element
       
  9097 		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
       
  9098 			return;
       
  9099 		}
       
  9100 
       
  9101 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
       
  9102 			if ( this.options.hoverClass ) {
       
  9103 				this.element.removeClass( this.options.hoverClass );
       
  9104 			}
       
  9105 			this._trigger( "out", event, this.ui( draggable ) );
       
  9106 		}
       
  9107 
       
  9108 	},
       
  9109 
       
  9110 	_drop: function( event, custom ) {
       
  9111 
       
  9112 		var draggable = custom || $.ui.ddmanager.current,
       
  9113 			childrenIntersection = false;
       
  9114 
       
  9115 		// Bail if draggable and droppable are same element
       
  9116 		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
       
  9117 			return false;
       
  9118 		}
       
  9119 
       
  9120 		this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
       
  9121 			var inst = $( this ).droppable( "instance" );
       
  9122 			if (
       
  9123 				inst.options.greedy &&
       
  9124 				!inst.options.disabled &&
       
  9125 				inst.options.scope === draggable.options.scope &&
       
  9126 				inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
       
  9127 				$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
       
  9128 			) { childrenIntersection = true; return false; }
       
  9129 		});
       
  9130 		if ( childrenIntersection ) {
       
  9131 			return false;
       
  9132 		}
       
  9133 
       
  9134 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
       
  9135 			if ( this.options.activeClass ) {
       
  9136 				this.element.removeClass( this.options.activeClass );
       
  9137 			}
       
  9138 			if ( this.options.hoverClass ) {
       
  9139 				this.element.removeClass( this.options.hoverClass );
       
  9140 			}
       
  9141 			this._trigger( "drop", event, this.ui( draggable ) );
       
  9142 			return this.element;
       
  9143 		}
       
  9144 
       
  9145 		return false;
       
  9146 
       
  9147 	},
       
  9148 
       
  9149 	ui: function( c ) {
       
  9150 		return {
       
  9151 			draggable: ( c.currentItem || c.element ),
       
  9152 			helper: c.helper,
       
  9153 			position: c.position,
       
  9154 			offset: c.positionAbs
       
  9155 		};
       
  9156 	}
       
  9157 
       
  9158 });
       
  9159 
       
  9160 $.ui.intersect = (function() {
       
  9161 	function isOverAxis( x, reference, size ) {
       
  9162 		return ( x >= reference ) && ( x < ( reference + size ) );
       
  9163 	}
       
  9164 
       
  9165 	return function( draggable, droppable, toleranceMode, event ) {
       
  9166 
       
  9167 		if ( !droppable.offset ) {
       
  9168 			return false;
       
  9169 		}
       
  9170 
       
  9171 		var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
       
  9172 			y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
       
  9173 			x2 = x1 + draggable.helperProportions.width,
       
  9174 			y2 = y1 + draggable.helperProportions.height,
       
  9175 			l = droppable.offset.left,
       
  9176 			t = droppable.offset.top,
       
  9177 			r = l + droppable.proportions().width,
       
  9178 			b = t + droppable.proportions().height;
       
  9179 
       
  9180 		switch ( toleranceMode ) {
       
  9181 		case "fit":
       
  9182 			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
       
  9183 		case "intersect":
       
  9184 			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
       
  9185 				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
       
  9186 				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
       
  9187 				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
       
  9188 		case "pointer":
       
  9189 			return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
       
  9190 		case "touch":
       
  9191 			return (
       
  9192 				( y1 >= t && y1 <= b ) || // Top edge touching
       
  9193 				( y2 >= t && y2 <= b ) || // Bottom edge touching
       
  9194 				( y1 < t && y2 > b ) // Surrounded vertically
       
  9195 			) && (
       
  9196 				( x1 >= l && x1 <= r ) || // Left edge touching
       
  9197 				( x2 >= l && x2 <= r ) || // Right edge touching
       
  9198 				( x1 < l && x2 > r ) // Surrounded horizontally
       
  9199 			);
       
  9200 		default:
       
  9201 			return false;
       
  9202 		}
       
  9203 	};
       
  9204 })();
       
  9205 
       
  9206 /*
       
  9207 	This manager tracks offsets of draggables and droppables
       
  9208 */
       
  9209 $.ui.ddmanager = {
       
  9210 	current: null,
       
  9211 	droppables: { "default": [] },
       
  9212 	prepareOffsets: function( t, event ) {
       
  9213 
       
  9214 		var i, j,
       
  9215 			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
       
  9216 			type = event ? event.type : null, // workaround for #2317
       
  9217 			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
       
  9218 
       
  9219 		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
       
  9220 
       
  9221 			// No disabled and non-accepted
       
  9222 			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
       
  9223 				continue;
       
  9224 			}
       
  9225 
       
  9226 			// Filter out elements in the current dragged item
       
  9227 			for ( j = 0; j < list.length; j++ ) {
       
  9228 				if ( list[ j ] === m[ i ].element[ 0 ] ) {
       
  9229 					m[ i ].proportions().height = 0;
       
  9230 					continue droppablesLoop;
       
  9231 				}
       
  9232 			}
       
  9233 
       
  9234 			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
       
  9235 			if ( !m[ i ].visible ) {
       
  9236 				continue;
       
  9237 			}
       
  9238 
       
  9239 			// Activate the droppable if used directly from draggables
       
  9240 			if ( type === "mousedown" ) {
       
  9241 				m[ i ]._activate.call( m[ i ], event );
       
  9242 			}
       
  9243 
       
  9244 			m[ i ].offset = m[ i ].element.offset();
       
  9245 			m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
       
  9246 
       
  9247 		}
       
  9248 
       
  9249 	},
       
  9250 	drop: function( draggable, event ) {
       
  9251 
       
  9252 		var dropped = false;
       
  9253 		// Create a copy of the droppables in case the list changes during the drop (#9116)
       
  9254 		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
       
  9255 
       
  9256 			if ( !this.options ) {
       
  9257 				return;
       
  9258 			}
       
  9259 			if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
       
  9260 				dropped = this._drop.call( this, event ) || dropped;
       
  9261 			}
       
  9262 
       
  9263 			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
       
  9264 				this.isout = true;
       
  9265 				this.isover = false;
       
  9266 				this._deactivate.call( this, event );
       
  9267 			}
       
  9268 
       
  9269 		});
       
  9270 		return dropped;
       
  9271 
       
  9272 	},
       
  9273 	dragStart: function( draggable, event ) {
       
  9274 		// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
       
  9275 		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
       
  9276 			if ( !draggable.options.refreshPositions ) {
       
  9277 				$.ui.ddmanager.prepareOffsets( draggable, event );
       
  9278 			}
       
  9279 		});
       
  9280 	},
       
  9281 	drag: function( draggable, event ) {
       
  9282 
       
  9283 		// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
       
  9284 		if ( draggable.options.refreshPositions ) {
       
  9285 			$.ui.ddmanager.prepareOffsets( draggable, event );
       
  9286 		}
       
  9287 
       
  9288 		// Run through all droppables and check their positions based on specific tolerance options
       
  9289 		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
       
  9290 
       
  9291 			if ( this.options.disabled || this.greedyChild || !this.visible ) {
       
  9292 				return;
       
  9293 			}
       
  9294 
       
  9295 			var parentInstance, scope, parent,
       
  9296 				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
       
  9297 				c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
       
  9298 			if ( !c ) {
       
  9299 				return;
       
  9300 			}
       
  9301 
       
  9302 			if ( this.options.greedy ) {
       
  9303 				// find droppable parents with same scope
       
  9304 				scope = this.options.scope;
       
  9305 				parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
       
  9306 					return $( this ).droppable( "instance" ).options.scope === scope;
       
  9307 				});
       
  9308 
       
  9309 				if ( parent.length ) {
       
  9310 					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
       
  9311 					parentInstance.greedyChild = ( c === "isover" );
       
  9312 				}
       
  9313 			}
       
  9314 
       
  9315 			// we just moved into a greedy child
       
  9316 			if ( parentInstance && c === "isover" ) {
       
  9317 				parentInstance.isover = false;
       
  9318 				parentInstance.isout = true;
       
  9319 				parentInstance._out.call( parentInstance, event );
       
  9320 			}
       
  9321 
       
  9322 			this[ c ] = true;
       
  9323 			this[c === "isout" ? "isover" : "isout"] = false;
       
  9324 			this[c === "isover" ? "_over" : "_out"].call( this, event );
       
  9325 
       
  9326 			// we just moved out of a greedy child
       
  9327 			if ( parentInstance && c === "isout" ) {
       
  9328 				parentInstance.isout = false;
       
  9329 				parentInstance.isover = true;
       
  9330 				parentInstance._over.call( parentInstance, event );
       
  9331 			}
       
  9332 		});
       
  9333 
       
  9334 	},
       
  9335 	dragStop: function( draggable, event ) {
       
  9336 		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
       
  9337 		// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
       
  9338 		if ( !draggable.options.refreshPositions ) {
       
  9339 			$.ui.ddmanager.prepareOffsets( draggable, event );
       
  9340 		}
       
  9341 	}
       
  9342 };
       
  9343 
       
  9344 var droppable = $.ui.droppable;
       
  9345 
       
  9346 
       
  9347 /*!
       
  9348  * jQuery UI Effects 1.11.4
       
  9349  * http://jqueryui.com
       
  9350  *
       
  9351  * Copyright jQuery Foundation and other contributors
       
  9352  * Released under the MIT license.
       
  9353  * http://jquery.org/license
       
  9354  *
       
  9355  * http://api.jqueryui.com/category/effects-core/
       
  9356  */
       
  9357 
       
  9358 
       
  9359 var dataSpace = "ui-effects-",
       
  9360 
       
  9361 	// Create a local jQuery because jQuery Color relies on it and the
       
  9362 	// global may not exist with AMD and a custom build (#10199)
       
  9363 	jQuery = $;
       
  9364 
       
  9365 $.effects = {
       
  9366 	effect: {}
       
  9367 };
       
  9368 
       
  9369 /*!
       
  9370  * jQuery Color Animations v2.1.2
       
  9371  * https://github.com/jquery/jquery-color
       
  9372  *
       
  9373  * Copyright 2014 jQuery Foundation and other contributors
       
  9374  * Released under the MIT license.
       
  9375  * http://jquery.org/license
       
  9376  *
       
  9377  * Date: Wed Jan 16 08:47:09 2013 -0600
       
  9378  */
       
  9379 (function( jQuery, undefined ) {
       
  9380 
       
  9381 	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
       
  9382 
       
  9383 	// plusequals test for += 100 -= 100
       
  9384 	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
       
  9385 	// a set of RE's that can match strings and generate color tuples.
       
  9386 	stringParsers = [ {
       
  9387 			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
       
  9388 			parse: function( execResult ) {
       
  9389 				return [
       
  9390 					execResult[ 1 ],
       
  9391 					execResult[ 2 ],
       
  9392 					execResult[ 3 ],
       
  9393 					execResult[ 4 ]
       
  9394 				];
       
  9395 			}
       
  9396 		}, {
       
  9397 			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
       
  9398 			parse: function( execResult ) {
       
  9399 				return [
       
  9400 					execResult[ 1 ] * 2.55,
       
  9401 					execResult[ 2 ] * 2.55,
       
  9402 					execResult[ 3 ] * 2.55,
       
  9403 					execResult[ 4 ]
       
  9404 				];
       
  9405 			}
       
  9406 		}, {
       
  9407 			// this regex ignores A-F because it's compared against an already lowercased string
       
  9408 			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
       
  9409 			parse: function( execResult ) {
       
  9410 				return [
       
  9411 					parseInt( execResult[ 1 ], 16 ),
       
  9412 					parseInt( execResult[ 2 ], 16 ),
       
  9413 					parseInt( execResult[ 3 ], 16 )
       
  9414 				];
       
  9415 			}
       
  9416 		}, {
       
  9417 			// this regex ignores A-F because it's compared against an already lowercased string
       
  9418 			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
       
  9419 			parse: function( execResult ) {
       
  9420 				return [
       
  9421 					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
       
  9422 					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
       
  9423 					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
       
  9424 				];
       
  9425 			}
       
  9426 		}, {
       
  9427 			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
       
  9428 			space: "hsla",
       
  9429 			parse: function( execResult ) {
       
  9430 				return [
       
  9431 					execResult[ 1 ],
       
  9432 					execResult[ 2 ] / 100,
       
  9433 					execResult[ 3 ] / 100,
       
  9434 					execResult[ 4 ]
       
  9435 				];
       
  9436 			}
       
  9437 		} ],
       
  9438 
       
  9439 	// jQuery.Color( )
       
  9440 	color = jQuery.Color = function( color, green, blue, alpha ) {
       
  9441 		return new jQuery.Color.fn.parse( color, green, blue, alpha );
       
  9442 	},
       
  9443 	spaces = {
       
  9444 		rgba: {
       
  9445 			props: {
       
  9446 				red: {
       
  9447 					idx: 0,
       
  9448 					type: "byte"
       
  9449 				},
       
  9450 				green: {
       
  9451 					idx: 1,
       
  9452 					type: "byte"
       
  9453 				},
       
  9454 				blue: {
       
  9455 					idx: 2,
       
  9456 					type: "byte"
       
  9457 				}
       
  9458 			}
       
  9459 		},
       
  9460 
       
  9461 		hsla: {
       
  9462 			props: {
       
  9463 				hue: {
       
  9464 					idx: 0,
       
  9465 					type: "degrees"
       
  9466 				},
       
  9467 				saturation: {
       
  9468 					idx: 1,
       
  9469 					type: "percent"
       
  9470 				},
       
  9471 				lightness: {
       
  9472 					idx: 2,
       
  9473 					type: "percent"
       
  9474 				}
       
  9475 			}
       
  9476 		}
       
  9477 	},
       
  9478 	propTypes = {
       
  9479 		"byte": {
       
  9480 			floor: true,
       
  9481 			max: 255
       
  9482 		},
       
  9483 		"percent": {
       
  9484 			max: 1
       
  9485 		},
       
  9486 		"degrees": {
       
  9487 			mod: 360,
       
  9488 			floor: true
       
  9489 		}
       
  9490 	},
       
  9491 	support = color.support = {},
       
  9492 
       
  9493 	// element for support tests
       
  9494 	supportElem = jQuery( "<p>" )[ 0 ],
       
  9495 
       
  9496 	// colors = jQuery.Color.names
       
  9497 	colors,
       
  9498 
       
  9499 	// local aliases of functions called often
       
  9500 	each = jQuery.each;
       
  9501 
       
  9502 // determine rgba support immediately
       
  9503 supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
       
  9504 support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
       
  9505 
       
  9506 // define cache name and alpha properties
       
  9507 // for rgba and hsla spaces
       
  9508 each( spaces, function( spaceName, space ) {
       
  9509 	space.cache = "_" + spaceName;
       
  9510 	space.props.alpha = {
       
  9511 		idx: 3,
       
  9512 		type: "percent",
       
  9513 		def: 1
       
  9514 	};
       
  9515 });
       
  9516 
       
  9517 function clamp( value, prop, allowEmpty ) {
       
  9518 	var type = propTypes[ prop.type ] || {};
       
  9519 
       
  9520 	if ( value == null ) {
       
  9521 		return (allowEmpty || !prop.def) ? null : prop.def;
       
  9522 	}
       
  9523 
       
  9524 	// ~~ is an short way of doing floor for positive numbers
       
  9525 	value = type.floor ? ~~value : parseFloat( value );
       
  9526 
       
  9527 	// IE will pass in empty strings as value for alpha,
       
  9528 	// which will hit this case
       
  9529 	if ( isNaN( value ) ) {
       
  9530 		return prop.def;
       
  9531 	}
       
  9532 
       
  9533 	if ( type.mod ) {
       
  9534 		// we add mod before modding to make sure that negatives values
       
  9535 		// get converted properly: -10 -> 350
       
  9536 		return (value + type.mod) % type.mod;
       
  9537 	}
       
  9538 
       
  9539 	// for now all property types without mod have min and max
       
  9540 	return 0 > value ? 0 : type.max < value ? type.max : value;
       
  9541 }
       
  9542 
       
  9543 function stringParse( string ) {
       
  9544 	var inst = color(),
       
  9545 		rgba = inst._rgba = [];
       
  9546 
       
  9547 	string = string.toLowerCase();
       
  9548 
       
  9549 	each( stringParsers, function( i, parser ) {
       
  9550 		var parsed,
       
  9551 			match = parser.re.exec( string ),
       
  9552 			values = match && parser.parse( match ),
       
  9553 			spaceName = parser.space || "rgba";
       
  9554 
       
  9555 		if ( values ) {
       
  9556 			parsed = inst[ spaceName ]( values );
       
  9557 
       
  9558 			// if this was an rgba parse the assignment might happen twice
       
  9559 			// oh well....
       
  9560 			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
       
  9561 			rgba = inst._rgba = parsed._rgba;
       
  9562 
       
  9563 			// exit each( stringParsers ) here because we matched
       
  9564 			return false;
       
  9565 		}
       
  9566 	});
       
  9567 
       
  9568 	// Found a stringParser that handled it
       
  9569 	if ( rgba.length ) {
       
  9570 
       
  9571 		// if this came from a parsed string, force "transparent" when alpha is 0
       
  9572 		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
       
  9573 		if ( rgba.join() === "0,0,0,0" ) {
       
  9574 			jQuery.extend( rgba, colors.transparent );
       
  9575 		}
       
  9576 		return inst;
       
  9577 	}
       
  9578 
       
  9579 	// named colors
       
  9580 	return colors[ string ];
       
  9581 }
       
  9582 
       
  9583 color.fn = jQuery.extend( color.prototype, {
       
  9584 	parse: function( red, green, blue, alpha ) {
       
  9585 		if ( red === undefined ) {
       
  9586 			this._rgba = [ null, null, null, null ];
       
  9587 			return this;
       
  9588 		}
       
  9589 		if ( red.jquery || red.nodeType ) {
       
  9590 			red = jQuery( red ).css( green );
       
  9591 			green = undefined;
       
  9592 		}
       
  9593 
       
  9594 		var inst = this,
       
  9595 			type = jQuery.type( red ),
       
  9596 			rgba = this._rgba = [];
       
  9597 
       
  9598 		// more than 1 argument specified - assume ( red, green, blue, alpha )
       
  9599 		if ( green !== undefined ) {
       
  9600 			red = [ red, green, blue, alpha ];
       
  9601 			type = "array";
       
  9602 		}
       
  9603 
       
  9604 		if ( type === "string" ) {
       
  9605 			return this.parse( stringParse( red ) || colors._default );
       
  9606 		}
       
  9607 
       
  9608 		if ( type === "array" ) {
       
  9609 			each( spaces.rgba.props, function( key, prop ) {
       
  9610 				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
       
  9611 			});
       
  9612 			return this;
       
  9613 		}
       
  9614 
       
  9615 		if ( type === "object" ) {
       
  9616 			if ( red instanceof color ) {
       
  9617 				each( spaces, function( spaceName, space ) {
       
  9618 					if ( red[ space.cache ] ) {
       
  9619 						inst[ space.cache ] = red[ space.cache ].slice();
       
  9620 					}
       
  9621 				});
       
  9622 			} else {
       
  9623 				each( spaces, function( spaceName, space ) {
       
  9624 					var cache = space.cache;
       
  9625 					each( space.props, function( key, prop ) {
       
  9626 
       
  9627 						// if the cache doesn't exist, and we know how to convert
       
  9628 						if ( !inst[ cache ] && space.to ) {
       
  9629 
       
  9630 							// if the value was null, we don't need to copy it
       
  9631 							// if the key was alpha, we don't need to copy it either
       
  9632 							if ( key === "alpha" || red[ key ] == null ) {
       
  9633 								return;
       
  9634 							}
       
  9635 							inst[ cache ] = space.to( inst._rgba );
       
  9636 						}
       
  9637 
       
  9638 						// this is the only case where we allow nulls for ALL properties.
       
  9639 						// call clamp with alwaysAllowEmpty
       
  9640 						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
       
  9641 					});
       
  9642 
       
  9643 					// everything defined but alpha?
       
  9644 					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
       
  9645 						// use the default of 1
       
  9646 						inst[ cache ][ 3 ] = 1;
       
  9647 						if ( space.from ) {
       
  9648 							inst._rgba = space.from( inst[ cache ] );
       
  9649 						}
       
  9650 					}
       
  9651 				});
       
  9652 			}
       
  9653 			return this;
       
  9654 		}
       
  9655 	},
       
  9656 	is: function( compare ) {
       
  9657 		var is = color( compare ),
       
  9658 			same = true,
       
  9659 			inst = this;
       
  9660 
       
  9661 		each( spaces, function( _, space ) {
       
  9662 			var localCache,
       
  9663 				isCache = is[ space.cache ];
       
  9664 			if (isCache) {
       
  9665 				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
       
  9666 				each( space.props, function( _, prop ) {
       
  9667 					if ( isCache[ prop.idx ] != null ) {
       
  9668 						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
       
  9669 						return same;
       
  9670 					}
       
  9671 				});
       
  9672 			}
       
  9673 			return same;
       
  9674 		});
       
  9675 		return same;
       
  9676 	},
       
  9677 	_space: function() {
       
  9678 		var used = [],
       
  9679 			inst = this;
       
  9680 		each( spaces, function( spaceName, space ) {
       
  9681 			if ( inst[ space.cache ] ) {
       
  9682 				used.push( spaceName );
       
  9683 			}
       
  9684 		});
       
  9685 		return used.pop();
       
  9686 	},
       
  9687 	transition: function( other, distance ) {
       
  9688 		var end = color( other ),
       
  9689 			spaceName = end._space(),
       
  9690 			space = spaces[ spaceName ],
       
  9691 			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
       
  9692 			start = startColor[ space.cache ] || space.to( startColor._rgba ),
       
  9693 			result = start.slice();
       
  9694 
       
  9695 		end = end[ space.cache ];
       
  9696 		each( space.props, function( key, prop ) {
       
  9697 			var index = prop.idx,
       
  9698 				startValue = start[ index ],
       
  9699 				endValue = end[ index ],
       
  9700 				type = propTypes[ prop.type ] || {};
       
  9701 
       
  9702 			// if null, don't override start value
       
  9703 			if ( endValue === null ) {
       
  9704 				return;
       
  9705 			}
       
  9706 			// if null - use end
       
  9707 			if ( startValue === null ) {
       
  9708 				result[ index ] = endValue;
       
  9709 			} else {
       
  9710 				if ( type.mod ) {
       
  9711 					if ( endValue - startValue > type.mod / 2 ) {
       
  9712 						startValue += type.mod;
       
  9713 					} else if ( startValue - endValue > type.mod / 2 ) {
       
  9714 						startValue -= type.mod;
       
  9715 					}
       
  9716 				}
       
  9717 				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
       
  9718 			}
       
  9719 		});
       
  9720 		return this[ spaceName ]( result );
       
  9721 	},
       
  9722 	blend: function( opaque ) {
       
  9723 		// if we are already opaque - return ourself
       
  9724 		if ( this._rgba[ 3 ] === 1 ) {
       
  9725 			return this;
       
  9726 		}
       
  9727 
       
  9728 		var rgb = this._rgba.slice(),
       
  9729 			a = rgb.pop(),
       
  9730 			blend = color( opaque )._rgba;
       
  9731 
       
  9732 		return color( jQuery.map( rgb, function( v, i ) {
       
  9733 			return ( 1 - a ) * blend[ i ] + a * v;
       
  9734 		}));
       
  9735 	},
       
  9736 	toRgbaString: function() {
       
  9737 		var prefix = "rgba(",
       
  9738 			rgba = jQuery.map( this._rgba, function( v, i ) {
       
  9739 				return v == null ? ( i > 2 ? 1 : 0 ) : v;
       
  9740 			});
       
  9741 
       
  9742 		if ( rgba[ 3 ] === 1 ) {
       
  9743 			rgba.pop();
       
  9744 			prefix = "rgb(";
       
  9745 		}
       
  9746 
       
  9747 		return prefix + rgba.join() + ")";
       
  9748 	},
       
  9749 	toHslaString: function() {
       
  9750 		var prefix = "hsla(",
       
  9751 			hsla = jQuery.map( this.hsla(), function( v, i ) {
       
  9752 				if ( v == null ) {
       
  9753 					v = i > 2 ? 1 : 0;
       
  9754 				}
       
  9755 
       
  9756 				// catch 1 and 2
       
  9757 				if ( i && i < 3 ) {
       
  9758 					v = Math.round( v * 100 ) + "%";
       
  9759 				}
       
  9760 				return v;
       
  9761 			});
       
  9762 
       
  9763 		if ( hsla[ 3 ] === 1 ) {
       
  9764 			hsla.pop();
       
  9765 			prefix = "hsl(";
       
  9766 		}
       
  9767 		return prefix + hsla.join() + ")";
       
  9768 	},
       
  9769 	toHexString: function( includeAlpha ) {
       
  9770 		var rgba = this._rgba.slice(),
       
  9771 			alpha = rgba.pop();
       
  9772 
       
  9773 		if ( includeAlpha ) {
       
  9774 			rgba.push( ~~( alpha * 255 ) );
       
  9775 		}
       
  9776 
       
  9777 		return "#" + jQuery.map( rgba, function( v ) {
       
  9778 
       
  9779 			// default to 0 when nulls exist
       
  9780 			v = ( v || 0 ).toString( 16 );
       
  9781 			return v.length === 1 ? "0" + v : v;
       
  9782 		}).join("");
       
  9783 	},
       
  9784 	toString: function() {
       
  9785 		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
       
  9786 	}
       
  9787 });
       
  9788 color.fn.parse.prototype = color.fn;
       
  9789 
       
  9790 // hsla conversions adapted from:
       
  9791 // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
       
  9792 
       
  9793 function hue2rgb( p, q, h ) {
       
  9794 	h = ( h + 1 ) % 1;
       
  9795 	if ( h * 6 < 1 ) {
       
  9796 		return p + ( q - p ) * h * 6;
       
  9797 	}
       
  9798 	if ( h * 2 < 1) {
       
  9799 		return q;
       
  9800 	}
       
  9801 	if ( h * 3 < 2 ) {
       
  9802 		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
       
  9803 	}
       
  9804 	return p;
       
  9805 }
       
  9806 
       
  9807 spaces.hsla.to = function( rgba ) {
       
  9808 	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
       
  9809 		return [ null, null, null, rgba[ 3 ] ];
       
  9810 	}
       
  9811 	var r = rgba[ 0 ] / 255,
       
  9812 		g = rgba[ 1 ] / 255,
       
  9813 		b = rgba[ 2 ] / 255,
       
  9814 		a = rgba[ 3 ],
       
  9815 		max = Math.max( r, g, b ),
       
  9816 		min = Math.min( r, g, b ),
       
  9817 		diff = max - min,
       
  9818 		add = max + min,
       
  9819 		l = add * 0.5,
       
  9820 		h, s;
       
  9821 
       
  9822 	if ( min === max ) {
       
  9823 		h = 0;
       
  9824 	} else if ( r === max ) {
       
  9825 		h = ( 60 * ( g - b ) / diff ) + 360;
       
  9826 	} else if ( g === max ) {
       
  9827 		h = ( 60 * ( b - r ) / diff ) + 120;
       
  9828 	} else {
       
  9829 		h = ( 60 * ( r - g ) / diff ) + 240;
       
  9830 	}
       
  9831 
       
  9832 	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
       
  9833 	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
       
  9834 	if ( diff === 0 ) {
       
  9835 		s = 0;
       
  9836 	} else if ( l <= 0.5 ) {
       
  9837 		s = diff / add;
       
  9838 	} else {
       
  9839 		s = diff / ( 2 - add );
       
  9840 	}
       
  9841 	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
       
  9842 };
       
  9843 
       
  9844 spaces.hsla.from = function( hsla ) {
       
  9845 	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
       
  9846 		return [ null, null, null, hsla[ 3 ] ];
       
  9847 	}
       
  9848 	var h = hsla[ 0 ] / 360,
       
  9849 		s = hsla[ 1 ],
       
  9850 		l = hsla[ 2 ],
       
  9851 		a = hsla[ 3 ],
       
  9852 		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
       
  9853 		p = 2 * l - q;
       
  9854 
       
  9855 	return [
       
  9856 		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
       
  9857 		Math.round( hue2rgb( p, q, h ) * 255 ),
       
  9858 		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
       
  9859 		a
       
  9860 	];
       
  9861 };
       
  9862 
       
  9863 each( spaces, function( spaceName, space ) {
       
  9864 	var props = space.props,
       
  9865 		cache = space.cache,
       
  9866 		to = space.to,
       
  9867 		from = space.from;
       
  9868 
       
  9869 	// makes rgba() and hsla()
       
  9870 	color.fn[ spaceName ] = function( value ) {
       
  9871 
       
  9872 		// generate a cache for this space if it doesn't exist
       
  9873 		if ( to && !this[ cache ] ) {
       
  9874 			this[ cache ] = to( this._rgba );
       
  9875 		}
       
  9876 		if ( value === undefined ) {
       
  9877 			return this[ cache ].slice();
       
  9878 		}
       
  9879 
       
  9880 		var ret,
       
  9881 			type = jQuery.type( value ),
       
  9882 			arr = ( type === "array" || type === "object" ) ? value : arguments,
       
  9883 			local = this[ cache ].slice();
       
  9884 
       
  9885 		each( props, function( key, prop ) {
       
  9886 			var val = arr[ type === "object" ? key : prop.idx ];
       
  9887 			if ( val == null ) {
       
  9888 				val = local[ prop.idx ];
       
  9889 			}
       
  9890 			local[ prop.idx ] = clamp( val, prop );
       
  9891 		});
       
  9892 
       
  9893 		if ( from ) {
       
  9894 			ret = color( from( local ) );
       
  9895 			ret[ cache ] = local;
       
  9896 			return ret;
       
  9897 		} else {
       
  9898 			return color( local );
       
  9899 		}
       
  9900 	};
       
  9901 
       
  9902 	// makes red() green() blue() alpha() hue() saturation() lightness()
       
  9903 	each( props, function( key, prop ) {
       
  9904 		// alpha is included in more than one space
       
  9905 		if ( color.fn[ key ] ) {
       
  9906 			return;
       
  9907 		}
       
  9908 		color.fn[ key ] = function( value ) {
       
  9909 			var vtype = jQuery.type( value ),
       
  9910 				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
       
  9911 				local = this[ fn ](),
       
  9912 				cur = local[ prop.idx ],
       
  9913 				match;
       
  9914 
       
  9915 			if ( vtype === "undefined" ) {
       
  9916 				return cur;
       
  9917 			}
       
  9918 
       
  9919 			if ( vtype === "function" ) {
       
  9920 				value = value.call( this, cur );
       
  9921 				vtype = jQuery.type( value );
       
  9922 			}
       
  9923 			if ( value == null && prop.empty ) {
       
  9924 				return this;
       
  9925 			}
       
  9926 			if ( vtype === "string" ) {
       
  9927 				match = rplusequals.exec( value );
       
  9928 				if ( match ) {
       
  9929 					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
       
  9930 				}
       
  9931 			}
       
  9932 			local[ prop.idx ] = value;
       
  9933 			return this[ fn ]( local );
       
  9934 		};
       
  9935 	});
       
  9936 });
       
  9937 
       
  9938 // add cssHook and .fx.step function for each named hook.
       
  9939 // accept a space separated string of properties
       
  9940 color.hook = function( hook ) {
       
  9941 	var hooks = hook.split( " " );
       
  9942 	each( hooks, function( i, hook ) {
       
  9943 		jQuery.cssHooks[ hook ] = {
       
  9944 			set: function( elem, value ) {
       
  9945 				var parsed, curElem,
       
  9946 					backgroundColor = "";
       
  9947 
       
  9948 				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
       
  9949 					value = color( parsed || value );
       
  9950 					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
       
  9951 						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
       
  9952 						while (
       
  9953 							(backgroundColor === "" || backgroundColor === "transparent") &&
       
  9954 							curElem && curElem.style
       
  9955 						) {
       
  9956 							try {
       
  9957 								backgroundColor = jQuery.css( curElem, "backgroundColor" );
       
  9958 								curElem = curElem.parentNode;
       
  9959 							} catch ( e ) {
       
  9960 							}
       
  9961 						}
       
  9962 
       
  9963 						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
       
  9964 							backgroundColor :
       
  9965 							"_default" );
       
  9966 					}
       
  9967 
       
  9968 					value = value.toRgbaString();
       
  9969 				}
       
  9970 				try {
       
  9971 					elem.style[ hook ] = value;
       
  9972 				} catch ( e ) {
       
  9973 					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
       
  9974 				}
       
  9975 			}
       
  9976 		};
       
  9977 		jQuery.fx.step[ hook ] = function( fx ) {
       
  9978 			if ( !fx.colorInit ) {
       
  9979 				fx.start = color( fx.elem, hook );
       
  9980 				fx.end = color( fx.end );
       
  9981 				fx.colorInit = true;
       
  9982 			}
       
  9983 			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
       
  9984 		};
       
  9985 	});
       
  9986 
       
  9987 };
       
  9988 
       
  9989 color.hook( stepHooks );
       
  9990 
       
  9991 jQuery.cssHooks.borderColor = {
       
  9992 	expand: function( value ) {
       
  9993 		var expanded = {};
       
  9994 
       
  9995 		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
       
  9996 			expanded[ "border" + part + "Color" ] = value;
       
  9997 		});
       
  9998 		return expanded;
       
  9999 	}
       
 10000 };
       
 10001 
       
 10002 // Basic color names only.
       
 10003 // Usage of any of the other color names requires adding yourself or including
       
 10004 // jquery.color.svg-names.js.
       
 10005 colors = jQuery.Color.names = {
       
 10006 	// 4.1. Basic color keywords
       
 10007 	aqua: "#00ffff",
       
 10008 	black: "#000000",
       
 10009 	blue: "#0000ff",
       
 10010 	fuchsia: "#ff00ff",
       
 10011 	gray: "#808080",
       
 10012 	green: "#008000",
       
 10013 	lime: "#00ff00",
       
 10014 	maroon: "#800000",
       
 10015 	navy: "#000080",
       
 10016 	olive: "#808000",
       
 10017 	purple: "#800080",
       
 10018 	red: "#ff0000",
       
 10019 	silver: "#c0c0c0",
       
 10020 	teal: "#008080",
       
 10021 	white: "#ffffff",
       
 10022 	yellow: "#ffff00",
       
 10023 
       
 10024 	// 4.2.3. "transparent" color keyword
       
 10025 	transparent: [ null, null, null, 0 ],
       
 10026 
       
 10027 	_default: "#ffffff"
       
 10028 };
       
 10029 
       
 10030 })( jQuery );
       
 10031 
       
 10032 /******************************************************************************/
       
 10033 /****************************** CLASS ANIMATIONS ******************************/
       
 10034 /******************************************************************************/
       
 10035 (function() {
       
 10036 
       
 10037 var classAnimationActions = [ "add", "remove", "toggle" ],
       
 10038 	shorthandStyles = {
       
 10039 		border: 1,
       
 10040 		borderBottom: 1,
       
 10041 		borderColor: 1,
       
 10042 		borderLeft: 1,
       
 10043 		borderRight: 1,
       
 10044 		borderTop: 1,
       
 10045 		borderWidth: 1,
       
 10046 		margin: 1,
       
 10047 		padding: 1
       
 10048 	};
       
 10049 
       
 10050 $.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
       
 10051 	$.fx.step[ prop ] = function( fx ) {
       
 10052 		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
       
 10053 			jQuery.style( fx.elem, prop, fx.end );
       
 10054 			fx.setAttr = true;
       
 10055 		}
       
 10056 	};
       
 10057 });
       
 10058 
       
 10059 function getElementStyles( elem ) {
       
 10060 	var key, len,
       
 10061 		style = elem.ownerDocument.defaultView ?
       
 10062 			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
       
 10063 			elem.currentStyle,
       
 10064 		styles = {};
       
 10065 
       
 10066 	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
       
 10067 		len = style.length;
       
 10068 		while ( len-- ) {
       
 10069 			key = style[ len ];
       
 10070 			if ( typeof style[ key ] === "string" ) {
       
 10071 				styles[ $.camelCase( key ) ] = style[ key ];
       
 10072 			}
       
 10073 		}
       
 10074 	// support: Opera, IE <9
       
 10075 	} else {
       
 10076 		for ( key in style ) {
       
 10077 			if ( typeof style[ key ] === "string" ) {
       
 10078 				styles[ key ] = style[ key ];
       
 10079 			}
       
 10080 		}
       
 10081 	}
       
 10082 
       
 10083 	return styles;
       
 10084 }
       
 10085 
       
 10086 function styleDifference( oldStyle, newStyle ) {
       
 10087 	var diff = {},
       
 10088 		name, value;
       
 10089 
       
 10090 	for ( name in newStyle ) {
       
 10091 		value = newStyle[ name ];
       
 10092 		if ( oldStyle[ name ] !== value ) {
       
 10093 			if ( !shorthandStyles[ name ] ) {
       
 10094 				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
       
 10095 					diff[ name ] = value;
       
 10096 				}
       
 10097 			}
       
 10098 		}
       
 10099 	}
       
 10100 
       
 10101 	return diff;
       
 10102 }
       
 10103 
       
 10104 // support: jQuery <1.8
       
 10105 if ( !$.fn.addBack ) {
       
 10106 	$.fn.addBack = function( selector ) {
       
 10107 		return this.add( selector == null ?
       
 10108 			this.prevObject : this.prevObject.filter( selector )
       
 10109 		);
       
 10110 	};
       
 10111 }
       
 10112 
       
 10113 $.effects.animateClass = function( value, duration, easing, callback ) {
       
 10114 	var o = $.speed( duration, easing, callback );
       
 10115 
       
 10116 	return this.queue( function() {
       
 10117 		var animated = $( this ),
       
 10118 			baseClass = animated.attr( "class" ) || "",
       
 10119 			applyClassChange,
       
 10120 			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
       
 10121 
       
 10122 		// map the animated objects to store the original styles.
       
 10123 		allAnimations = allAnimations.map(function() {
       
 10124 			var el = $( this );
       
 10125 			return {
       
 10126 				el: el,
       
 10127 				start: getElementStyles( this )
       
 10128 			};
       
 10129 		});
       
 10130 
       
 10131 		// apply class change
       
 10132 		applyClassChange = function() {
       
 10133 			$.each( classAnimationActions, function(i, action) {
       
 10134 				if ( value[ action ] ) {
       
 10135 					animated[ action + "Class" ]( value[ action ] );
       
 10136 				}
       
 10137 			});
       
 10138 		};
       
 10139 		applyClassChange();
       
 10140 
       
 10141 		// map all animated objects again - calculate new styles and diff
       
 10142 		allAnimations = allAnimations.map(function() {
       
 10143 			this.end = getElementStyles( this.el[ 0 ] );
       
 10144 			this.diff = styleDifference( this.start, this.end );
       
 10145 			return this;
       
 10146 		});
       
 10147 
       
 10148 		// apply original class
       
 10149 		animated.attr( "class", baseClass );
       
 10150 
       
 10151 		// map all animated objects again - this time collecting a promise
       
 10152 		allAnimations = allAnimations.map(function() {
       
 10153 			var styleInfo = this,
       
 10154 				dfd = $.Deferred(),
       
 10155 				opts = $.extend({}, o, {
       
 10156 					queue: false,
       
 10157 					complete: function() {
       
 10158 						dfd.resolve( styleInfo );
       
 10159 					}
       
 10160 				});
       
 10161 
       
 10162 			this.el.animate( this.diff, opts );
       
 10163 			return dfd.promise();
       
 10164 		});
       
 10165 
       
 10166 		// once all animations have completed:
       
 10167 		$.when.apply( $, allAnimations.get() ).done(function() {
       
 10168 
       
 10169 			// set the final class
       
 10170 			applyClassChange();
       
 10171 
       
 10172 			// for each animated element,
       
 10173 			// clear all css properties that were animated
       
 10174 			$.each( arguments, function() {
       
 10175 				var el = this.el;
       
 10176 				$.each( this.diff, function(key) {
       
 10177 					el.css( key, "" );
       
 10178 				});
       
 10179 			});
       
 10180 
       
 10181 			// this is guarnteed to be there if you use jQuery.speed()
       
 10182 			// it also handles dequeuing the next anim...
       
 10183 			o.complete.call( animated[ 0 ] );
       
 10184 		});
       
 10185 	});
       
 10186 };
       
 10187 
       
 10188 $.fn.extend({
       
 10189 	addClass: (function( orig ) {
       
 10190 		return function( classNames, speed, easing, callback ) {
       
 10191 			return speed ?
       
 10192 				$.effects.animateClass.call( this,
       
 10193 					{ add: classNames }, speed, easing, callback ) :
       
 10194 				orig.apply( this, arguments );
       
 10195 		};
       
 10196 	})( $.fn.addClass ),
       
 10197 
       
 10198 	removeClass: (function( orig ) {
       
 10199 		return function( classNames, speed, easing, callback ) {
       
 10200 			return arguments.length > 1 ?
       
 10201 				$.effects.animateClass.call( this,
       
 10202 					{ remove: classNames }, speed, easing, callback ) :
       
 10203 				orig.apply( this, arguments );
       
 10204 		};
       
 10205 	})( $.fn.removeClass ),
       
 10206 
       
 10207 	toggleClass: (function( orig ) {
       
 10208 		return function( classNames, force, speed, easing, callback ) {
       
 10209 			if ( typeof force === "boolean" || force === undefined ) {
       
 10210 				if ( !speed ) {
       
 10211 					// without speed parameter
       
 10212 					return orig.apply( this, arguments );
       
 10213 				} else {
       
 10214 					return $.effects.animateClass.call( this,
       
 10215 						(force ? { add: classNames } : { remove: classNames }),
       
 10216 						speed, easing, callback );
       
 10217 				}
       
 10218 			} else {
       
 10219 				// without force parameter
       
 10220 				return $.effects.animateClass.call( this,
       
 10221 					{ toggle: classNames }, force, speed, easing );
       
 10222 			}
       
 10223 		};
       
 10224 	})( $.fn.toggleClass ),
       
 10225 
       
 10226 	switchClass: function( remove, add, speed, easing, callback) {
       
 10227 		return $.effects.animateClass.call( this, {
       
 10228 			add: add,
       
 10229 			remove: remove
       
 10230 		}, speed, easing, callback );
       
 10231 	}
       
 10232 });
       
 10233 
       
 10234 })();
       
 10235 
       
 10236 /******************************************************************************/
       
 10237 /*********************************** EFFECTS **********************************/
       
 10238 /******************************************************************************/
       
 10239 
       
 10240 (function() {
       
 10241 
       
 10242 $.extend( $.effects, {
       
 10243 	version: "1.11.4",
       
 10244 
       
 10245 	// Saves a set of properties in a data storage
       
 10246 	save: function( element, set ) {
       
 10247 		for ( var i = 0; i < set.length; i++ ) {
       
 10248 			if ( set[ i ] !== null ) {
       
 10249 				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
       
 10250 			}
       
 10251 		}
       
 10252 	},
       
 10253 
       
 10254 	// Restores a set of previously saved properties from a data storage
       
 10255 	restore: function( element, set ) {
       
 10256 		var val, i;
       
 10257 		for ( i = 0; i < set.length; i++ ) {
       
 10258 			if ( set[ i ] !== null ) {
       
 10259 				val = element.data( dataSpace + set[ i ] );
       
 10260 				// support: jQuery 1.6.2
       
 10261 				// http://bugs.jquery.com/ticket/9917
       
 10262 				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
       
 10263 				// We can't differentiate between "" and 0 here, so we just assume
       
 10264 				// empty string since it's likely to be a more common value...
       
 10265 				if ( val === undefined ) {
       
 10266 					val = "";
       
 10267 				}
       
 10268 				element.css( set[ i ], val );
       
 10269 			}
       
 10270 		}
       
 10271 	},
       
 10272 
       
 10273 	setMode: function( el, mode ) {
       
 10274 		if (mode === "toggle") {
       
 10275 			mode = el.is( ":hidden" ) ? "show" : "hide";
       
 10276 		}
       
 10277 		return mode;
       
 10278 	},
       
 10279 
       
 10280 	// Translates a [top,left] array into a baseline value
       
 10281 	// this should be a little more flexible in the future to handle a string & hash
       
 10282 	getBaseline: function( origin, original ) {
       
 10283 		var y, x;
       
 10284 		switch ( origin[ 0 ] ) {
       
 10285 			case "top": y = 0; break;
       
 10286 			case "middle": y = 0.5; break;
       
 10287 			case "bottom": y = 1; break;
       
 10288 			default: y = origin[ 0 ] / original.height;
       
 10289 		}
       
 10290 		switch ( origin[ 1 ] ) {
       
 10291 			case "left": x = 0; break;
       
 10292 			case "center": x = 0.5; break;
       
 10293 			case "right": x = 1; break;
       
 10294 			default: x = origin[ 1 ] / original.width;
       
 10295 		}
       
 10296 		return {
       
 10297 			x: x,
       
 10298 			y: y
       
 10299 		};
       
 10300 	},
       
 10301 
       
 10302 	// Wraps the element around a wrapper that copies position properties
       
 10303 	createWrapper: function( element ) {
       
 10304 
       
 10305 		// if the element is already wrapped, return it
       
 10306 		if ( element.parent().is( ".ui-effects-wrapper" )) {
       
 10307 			return element.parent();
       
 10308 		}
       
 10309 
       
 10310 		// wrap the element
       
 10311 		var props = {
       
 10312 				width: element.outerWidth(true),
       
 10313 				height: element.outerHeight(true),
       
 10314 				"float": element.css( "float" )
       
 10315 			},
       
 10316 			wrapper = $( "<div></div>" )
       
 10317 				.addClass( "ui-effects-wrapper" )
       
 10318 				.css({
       
 10319 					fontSize: "100%",
       
 10320 					background: "transparent",
       
 10321 					border: "none",
       
 10322 					margin: 0,
       
 10323 					padding: 0
       
 10324 				}),
       
 10325 			// Store the size in case width/height are defined in % - Fixes #5245
       
 10326 			size = {
       
 10327 				width: element.width(),
       
 10328 				height: element.height()
       
 10329 			},
       
 10330 			active = document.activeElement;
       
 10331 
       
 10332 		// support: Firefox
       
 10333 		// Firefox incorrectly exposes anonymous content
       
 10334 		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
       
 10335 		try {
       
 10336 			active.id;
       
 10337 		} catch ( e ) {
       
 10338 			active = document.body;
       
 10339 		}
       
 10340 
       
 10341 		element.wrap( wrapper );
       
 10342 
       
 10343 		// Fixes #7595 - Elements lose focus when wrapped.
       
 10344 		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
       
 10345 			$( active ).focus();
       
 10346 		}
       
 10347 
       
 10348 		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
       
 10349 
       
 10350 		// transfer positioning properties to the wrapper
       
 10351 		if ( element.css( "position" ) === "static" ) {
       
 10352 			wrapper.css({ position: "relative" });
       
 10353 			element.css({ position: "relative" });
       
 10354 		} else {
       
 10355 			$.extend( props, {
       
 10356 				position: element.css( "position" ),
       
 10357 				zIndex: element.css( "z-index" )
       
 10358 			});
       
 10359 			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
       
 10360 				props[ pos ] = element.css( pos );
       
 10361 				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
       
 10362 					props[ pos ] = "auto";
       
 10363 				}
       
 10364 			});
       
 10365 			element.css({
       
 10366 				position: "relative",
       
 10367 				top: 0,
       
 10368 				left: 0,
       
 10369 				right: "auto",
       
 10370 				bottom: "auto"
       
 10371 			});
       
 10372 		}
       
 10373 		element.css(size);
       
 10374 
       
 10375 		return wrapper.css( props ).show();
       
 10376 	},
       
 10377 
       
 10378 	removeWrapper: function( element ) {
       
 10379 		var active = document.activeElement;
       
 10380 
       
 10381 		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
       
 10382 			element.parent().replaceWith( element );
       
 10383 
       
 10384 			// Fixes #7595 - Elements lose focus when wrapped.
       
 10385 			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
       
 10386 				$( active ).focus();
       
 10387 			}
       
 10388 		}
       
 10389 
       
 10390 		return element;
       
 10391 	},
       
 10392 
       
 10393 	setTransition: function( element, list, factor, value ) {
       
 10394 		value = value || {};
       
 10395 		$.each( list, function( i, x ) {
       
 10396 			var unit = element.cssUnit( x );
       
 10397 			if ( unit[ 0 ] > 0 ) {
       
 10398 				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
       
 10399 			}
       
 10400 		});
       
 10401 		return value;
       
 10402 	}
       
 10403 });
       
 10404 
       
 10405 // return an effect options object for the given parameters:
       
 10406 function _normalizeArguments( effect, options, speed, callback ) {
       
 10407 
       
 10408 	// allow passing all options as the first parameter
       
 10409 	if ( $.isPlainObject( effect ) ) {
       
 10410 		options = effect;
       
 10411 		effect = effect.effect;
       
 10412 	}
       
 10413 
       
 10414 	// convert to an object
       
 10415 	effect = { effect: effect };
       
 10416 
       
 10417 	// catch (effect, null, ...)
       
 10418 	if ( options == null ) {
       
 10419 		options = {};
       
 10420 	}
       
 10421 
       
 10422 	// catch (effect, callback)
       
 10423 	if ( $.isFunction( options ) ) {
       
 10424 		callback = options;
       
 10425 		speed = null;
       
 10426 		options = {};
       
 10427 	}
       
 10428 
       
 10429 	// catch (effect, speed, ?)
       
 10430 	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
       
 10431 		callback = speed;
       
 10432 		speed = options;
       
 10433 		options = {};
       
 10434 	}
       
 10435 
       
 10436 	// catch (effect, options, callback)
       
 10437 	if ( $.isFunction( speed ) ) {
       
 10438 		callback = speed;
       
 10439 		speed = null;
       
 10440 	}
       
 10441 
       
 10442 	// add options to effect
       
 10443 	if ( options ) {
       
 10444 		$.extend( effect, options );
       
 10445 	}
       
 10446 
       
 10447 	speed = speed || options.duration;
       
 10448 	effect.duration = $.fx.off ? 0 :
       
 10449 		typeof speed === "number" ? speed :
       
 10450 		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
       
 10451 		$.fx.speeds._default;
       
 10452 
       
 10453 	effect.complete = callback || options.complete;
       
 10454 
       
 10455 	return effect;
       
 10456 }
       
 10457 
       
 10458 function standardAnimationOption( option ) {
       
 10459 	// Valid standard speeds (nothing, number, named speed)
       
 10460 	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
       
 10461 		return true;
       
 10462 	}
       
 10463 
       
 10464 	// Invalid strings - treat as "normal" speed
       
 10465 	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
       
 10466 		return true;
       
 10467 	}
       
 10468 
       
 10469 	// Complete callback
       
 10470 	if ( $.isFunction( option ) ) {
       
 10471 		return true;
       
 10472 	}
       
 10473 
       
 10474 	// Options hash (but not naming an effect)
       
 10475 	if ( typeof option === "object" && !option.effect ) {
       
 10476 		return true;
       
 10477 	}
       
 10478 
       
 10479 	// Didn't match any standard API
       
 10480 	return false;
       
 10481 }
       
 10482 
       
 10483 $.fn.extend({
       
 10484 	effect: function( /* effect, options, speed, callback */ ) {
       
 10485 		var args = _normalizeArguments.apply( this, arguments ),
       
 10486 			mode = args.mode,
       
 10487 			queue = args.queue,
       
 10488 			effectMethod = $.effects.effect[ args.effect ];
       
 10489 
       
 10490 		if ( $.fx.off || !effectMethod ) {
       
 10491 			// delegate to the original method (e.g., .show()) if possible
       
 10492 			if ( mode ) {
       
 10493 				return this[ mode ]( args.duration, args.complete );
       
 10494 			} else {
       
 10495 				return this.each( function() {
       
 10496 					if ( args.complete ) {
       
 10497 						args.complete.call( this );
       
 10498 					}
       
 10499 				});
       
 10500 			}
       
 10501 		}
       
 10502 
       
 10503 		function run( next ) {
       
 10504 			var elem = $( this ),
       
 10505 				complete = args.complete,
       
 10506 				mode = args.mode;
       
 10507 
       
 10508 			function done() {
       
 10509 				if ( $.isFunction( complete ) ) {
       
 10510 					complete.call( elem[0] );
       
 10511 				}
       
 10512 				if ( $.isFunction( next ) ) {
       
 10513 					next();
       
 10514 				}
       
 10515 			}
       
 10516 
       
 10517 			// If the element already has the correct final state, delegate to
       
 10518 			// the core methods so the internal tracking of "olddisplay" works.
       
 10519 			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
       
 10520 				elem[ mode ]();
       
 10521 				done();
       
 10522 			} else {
       
 10523 				effectMethod.call( elem[0], args, done );
       
 10524 			}
       
 10525 		}
       
 10526 
       
 10527 		return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
       
 10528 	},
       
 10529 
       
 10530 	show: (function( orig ) {
       
 10531 		return function( option ) {
       
 10532 			if ( standardAnimationOption( option ) ) {
       
 10533 				return orig.apply( this, arguments );
       
 10534 			} else {
       
 10535 				var args = _normalizeArguments.apply( this, arguments );
       
 10536 				args.mode = "show";
       
 10537 				return this.effect.call( this, args );
       
 10538 			}
       
 10539 		};
       
 10540 	})( $.fn.show ),
       
 10541 
       
 10542 	hide: (function( orig ) {
       
 10543 		return function( option ) {
       
 10544 			if ( standardAnimationOption( option ) ) {
       
 10545 				return orig.apply( this, arguments );
       
 10546 			} else {
       
 10547 				var args = _normalizeArguments.apply( this, arguments );
       
 10548 				args.mode = "hide";
       
 10549 				return this.effect.call( this, args );
       
 10550 			}
       
 10551 		};
       
 10552 	})( $.fn.hide ),
       
 10553 
       
 10554 	toggle: (function( orig ) {
       
 10555 		return function( option ) {
       
 10556 			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
       
 10557 				return orig.apply( this, arguments );
       
 10558 			} else {
       
 10559 				var args = _normalizeArguments.apply( this, arguments );
       
 10560 				args.mode = "toggle";
       
 10561 				return this.effect.call( this, args );
       
 10562 			}
       
 10563 		};
       
 10564 	})( $.fn.toggle ),
       
 10565 
       
 10566 	// helper functions
       
 10567 	cssUnit: function(key) {
       
 10568 		var style = this.css( key ),
       
 10569 			val = [];
       
 10570 
       
 10571 		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
       
 10572 			if ( style.indexOf( unit ) > 0 ) {
       
 10573 				val = [ parseFloat( style ), unit ];
       
 10574 			}
       
 10575 		});
       
 10576 		return val;
       
 10577 	}
       
 10578 });
       
 10579 
       
 10580 })();
       
 10581 
       
 10582 /******************************************************************************/
       
 10583 /*********************************** EASING ***********************************/
       
 10584 /******************************************************************************/
       
 10585 
       
 10586 (function() {
       
 10587 
       
 10588 // based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
       
 10589 
       
 10590 var baseEasings = {};
       
 10591 
       
 10592 $.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
       
 10593 	baseEasings[ name ] = function( p ) {
       
 10594 		return Math.pow( p, i + 2 );
       
 10595 	};
       
 10596 });
       
 10597 
       
 10598 $.extend( baseEasings, {
       
 10599 	Sine: function( p ) {
       
 10600 		return 1 - Math.cos( p * Math.PI / 2 );
       
 10601 	},
       
 10602 	Circ: function( p ) {
       
 10603 		return 1 - Math.sqrt( 1 - p * p );
       
 10604 	},
       
 10605 	Elastic: function( p ) {
       
 10606 		return p === 0 || p === 1 ? p :
       
 10607 			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
       
 10608 	},
       
 10609 	Back: function( p ) {
       
 10610 		return p * p * ( 3 * p - 2 );
       
 10611 	},
       
 10612 	Bounce: function( p ) {
       
 10613 		var pow2,
       
 10614 			bounce = 4;
       
 10615 
       
 10616 		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
       
 10617 		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
       
 10618 	}
       
 10619 });
       
 10620 
       
 10621 $.each( baseEasings, function( name, easeIn ) {
       
 10622 	$.easing[ "easeIn" + name ] = easeIn;
       
 10623 	$.easing[ "easeOut" + name ] = function( p ) {
       
 10624 		return 1 - easeIn( 1 - p );
       
 10625 	};
       
 10626 	$.easing[ "easeInOut" + name ] = function( p ) {
       
 10627 		return p < 0.5 ?
       
 10628 			easeIn( p * 2 ) / 2 :
       
 10629 			1 - easeIn( p * -2 + 2 ) / 2;
       
 10630 	};
       
 10631 });
       
 10632 
       
 10633 })();
       
 10634 
       
 10635 var effect = $.effects;
       
 10636 
       
 10637 
       
 10638 /*!
       
 10639  * jQuery UI Effects Blind 1.11.4
       
 10640  * http://jqueryui.com
       
 10641  *
       
 10642  * Copyright jQuery Foundation and other contributors
       
 10643  * Released under the MIT license.
       
 10644  * http://jquery.org/license
       
 10645  *
       
 10646  * http://api.jqueryui.com/blind-effect/
       
 10647  */
       
 10648 
       
 10649 
       
 10650 var effectBlind = $.effects.effect.blind = function( o, done ) {
       
 10651 	// Create element
       
 10652 	var el = $( this ),
       
 10653 		rvertical = /up|down|vertical/,
       
 10654 		rpositivemotion = /up|left|vertical|horizontal/,
       
 10655 		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
       
 10656 		mode = $.effects.setMode( el, o.mode || "hide" ),
       
 10657 		direction = o.direction || "up",
       
 10658 		vertical = rvertical.test( direction ),
       
 10659 		ref = vertical ? "height" : "width",
       
 10660 		ref2 = vertical ? "top" : "left",
       
 10661 		motion = rpositivemotion.test( direction ),
       
 10662 		animation = {},
       
 10663 		show = mode === "show",
       
 10664 		wrapper, distance, margin;
       
 10665 
       
 10666 	// if already wrapped, the wrapper's properties are my property. #6245
       
 10667 	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
       
 10668 		$.effects.save( el.parent(), props );
       
 10669 	} else {
       
 10670 		$.effects.save( el, props );
       
 10671 	}
       
 10672 	el.show();
       
 10673 	wrapper = $.effects.createWrapper( el ).css({
       
 10674 		overflow: "hidden"
       
 10675 	});
       
 10676 
       
 10677 	distance = wrapper[ ref ]();
       
 10678 	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
       
 10679 
       
 10680 	animation[ ref ] = show ? distance : 0;
       
 10681 	if ( !motion ) {
       
 10682 		el
       
 10683 			.css( vertical ? "bottom" : "right", 0 )
       
 10684 			.css( vertical ? "top" : "left", "auto" )
       
 10685 			.css({ position: "absolute" });
       
 10686 
       
 10687 		animation[ ref2 ] = show ? margin : distance + margin;
       
 10688 	}
       
 10689 
       
 10690 	// start at 0 if we are showing
       
 10691 	if ( show ) {
       
 10692 		wrapper.css( ref, 0 );
       
 10693 		if ( !motion ) {
       
 10694 			wrapper.css( ref2, margin + distance );
       
 10695 		}
       
 10696 	}
       
 10697 
       
 10698 	// Animate
       
 10699 	wrapper.animate( animation, {
       
 10700 		duration: o.duration,
       
 10701 		easing: o.easing,
       
 10702 		queue: false,
       
 10703 		complete: function() {
       
 10704 			if ( mode === "hide" ) {
       
 10705 				el.hide();
       
 10706 			}
       
 10707 			$.effects.restore( el, props );
       
 10708 			$.effects.removeWrapper( el );
       
 10709 			done();
       
 10710 		}
       
 10711 	});
       
 10712 };
       
 10713 
       
 10714 
       
 10715 /*!
       
 10716  * jQuery UI Effects Bounce 1.11.4
       
 10717  * http://jqueryui.com
       
 10718  *
       
 10719  * Copyright jQuery Foundation and other contributors
       
 10720  * Released under the MIT license.
       
 10721  * http://jquery.org/license
       
 10722  *
       
 10723  * http://api.jqueryui.com/bounce-effect/
       
 10724  */
       
 10725 
       
 10726 
       
 10727 var effectBounce = $.effects.effect.bounce = function( o, done ) {
       
 10728 	var el = $( this ),
       
 10729 		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
       
 10730 
       
 10731 		// defaults:
       
 10732 		mode = $.effects.setMode( el, o.mode || "effect" ),
       
 10733 		hide = mode === "hide",
       
 10734 		show = mode === "show",
       
 10735 		direction = o.direction || "up",
       
 10736 		distance = o.distance,
       
 10737 		times = o.times || 5,
       
 10738 
       
 10739 		// number of internal animations
       
 10740 		anims = times * 2 + ( show || hide ? 1 : 0 ),
       
 10741 		speed = o.duration / anims,
       
 10742 		easing = o.easing,
       
 10743 
       
 10744 		// utility:
       
 10745 		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
       
 10746 		motion = ( direction === "up" || direction === "left" ),
       
 10747 		i,
       
 10748 		upAnim,
       
 10749 		downAnim,
       
 10750 
       
 10751 		// we will need to re-assemble the queue to stack our animations in place
       
 10752 		queue = el.queue(),
       
 10753 		queuelen = queue.length;
       
 10754 
       
 10755 	// Avoid touching opacity to prevent clearType and PNG issues in IE
       
 10756 	if ( show || hide ) {
       
 10757 		props.push( "opacity" );
       
 10758 	}
       
 10759 
       
 10760 	$.effects.save( el, props );
       
 10761 	el.show();
       
 10762 	$.effects.createWrapper( el ); // Create Wrapper
       
 10763 
       
 10764 	// default distance for the BIGGEST bounce is the outer Distance / 3
       
 10765 	if ( !distance ) {
       
 10766 		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
       
 10767 	}
       
 10768 
       
 10769 	if ( show ) {
       
 10770 		downAnim = { opacity: 1 };
       
 10771 		downAnim[ ref ] = 0;
       
 10772 
       
 10773 		// if we are showing, force opacity 0 and set the initial position
       
 10774 		// then do the "first" animation
       
 10775 		el.css( "opacity", 0 )
       
 10776 			.css( ref, motion ? -distance * 2 : distance * 2 )
       
 10777 			.animate( downAnim, speed, easing );
       
 10778 	}
       
 10779 
       
 10780 	// start at the smallest distance if we are hiding
       
 10781 	if ( hide ) {
       
 10782 		distance = distance / Math.pow( 2, times - 1 );
       
 10783 	}
       
 10784 
       
 10785 	downAnim = {};
       
 10786 	downAnim[ ref ] = 0;
       
 10787 	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
       
 10788 	for ( i = 0; i < times; i++ ) {
       
 10789 		upAnim = {};
       
 10790 		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
       
 10791 
       
 10792 		el.animate( upAnim, speed, easing )
       
 10793 			.animate( downAnim, speed, easing );
       
 10794 
       
 10795 		distance = hide ? distance * 2 : distance / 2;
       
 10796 	}
       
 10797 
       
 10798 	// Last Bounce when Hiding
       
 10799 	if ( hide ) {
       
 10800 		upAnim = { opacity: 0 };
       
 10801 		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
       
 10802 
       
 10803 		el.animate( upAnim, speed, easing );
       
 10804 	}
       
 10805 
       
 10806 	el.queue(function() {
       
 10807 		if ( hide ) {
       
 10808 			el.hide();
       
 10809 		}
       
 10810 		$.effects.restore( el, props );
       
 10811 		$.effects.removeWrapper( el );
       
 10812 		done();
       
 10813 	});
       
 10814 
       
 10815 	// inject all the animations we just queued to be first in line (after "inprogress")
       
 10816 	if ( queuelen > 1) {
       
 10817 		queue.splice.apply( queue,
       
 10818 			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
       
 10819 	}
       
 10820 	el.dequeue();
       
 10821 
       
 10822 };
       
 10823 
       
 10824 
       
 10825 /*!
       
 10826  * jQuery UI Effects Clip 1.11.4
       
 10827  * http://jqueryui.com
       
 10828  *
       
 10829  * Copyright jQuery Foundation and other contributors
       
 10830  * Released under the MIT license.
       
 10831  * http://jquery.org/license
       
 10832  *
       
 10833  * http://api.jqueryui.com/clip-effect/
       
 10834  */
       
 10835 
       
 10836 
       
 10837 var effectClip = $.effects.effect.clip = function( o, done ) {
       
 10838 	// Create element
       
 10839 	var el = $( this ),
       
 10840 		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
       
 10841 		mode = $.effects.setMode( el, o.mode || "hide" ),
       
 10842 		show = mode === "show",
       
 10843 		direction = o.direction || "vertical",
       
 10844 		vert = direction === "vertical",
       
 10845 		size = vert ? "height" : "width",
       
 10846 		position = vert ? "top" : "left",
       
 10847 		animation = {},
       
 10848 		wrapper, animate, distance;
       
 10849 
       
 10850 	// Save & Show
       
 10851 	$.effects.save( el, props );
       
 10852 	el.show();
       
 10853 
       
 10854 	// Create Wrapper
       
 10855 	wrapper = $.effects.createWrapper( el ).css({
       
 10856 		overflow: "hidden"
       
 10857 	});
       
 10858 	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
       
 10859 	distance = animate[ size ]();
       
 10860 
       
 10861 	// Shift
       
 10862 	if ( show ) {
       
 10863 		animate.css( size, 0 );
       
 10864 		animate.css( position, distance / 2 );
       
 10865 	}
       
 10866 
       
 10867 	// Create Animation Object:
       
 10868 	animation[ size ] = show ? distance : 0;
       
 10869 	animation[ position ] = show ? 0 : distance / 2;
       
 10870 
       
 10871 	// Animate
       
 10872 	animate.animate( animation, {
       
 10873 		queue: false,
       
 10874 		duration: o.duration,
       
 10875 		easing: o.easing,
       
 10876 		complete: function() {
       
 10877 			if ( !show ) {
       
 10878 				el.hide();
       
 10879 			}
       
 10880 			$.effects.restore( el, props );
       
 10881 			$.effects.removeWrapper( el );
       
 10882 			done();
       
 10883 		}
       
 10884 	});
       
 10885 
       
 10886 };
       
 10887 
       
 10888 
       
 10889 /*!
       
 10890  * jQuery UI Effects Drop 1.11.4
       
 10891  * http://jqueryui.com
       
 10892  *
       
 10893  * Copyright jQuery Foundation and other contributors
       
 10894  * Released under the MIT license.
       
 10895  * http://jquery.org/license
       
 10896  *
       
 10897  * http://api.jqueryui.com/drop-effect/
       
 10898  */
       
 10899 
       
 10900 
       
 10901 var effectDrop = $.effects.effect.drop = function( o, done ) {
       
 10902 
       
 10903 	var el = $( this ),
       
 10904 		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
       
 10905 		mode = $.effects.setMode( el, o.mode || "hide" ),
       
 10906 		show = mode === "show",
       
 10907 		direction = o.direction || "left",
       
 10908 		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
       
 10909 		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
       
 10910 		animation = {
       
 10911 			opacity: show ? 1 : 0
       
 10912 		},
       
 10913 		distance;
       
 10914 
       
 10915 	// Adjust
       
 10916 	$.effects.save( el, props );
       
 10917 	el.show();
       
 10918 	$.effects.createWrapper( el );
       
 10919 
       
 10920 	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
       
 10921 
       
 10922 	if ( show ) {
       
 10923 		el
       
 10924 			.css( "opacity", 0 )
       
 10925 			.css( ref, motion === "pos" ? -distance : distance );
       
 10926 	}
       
 10927 
       
 10928 	// Animation
       
 10929 	animation[ ref ] = ( show ?
       
 10930 		( motion === "pos" ? "+=" : "-=" ) :
       
 10931 		( motion === "pos" ? "-=" : "+=" ) ) +
       
 10932 		distance;
       
 10933 
       
 10934 	// Animate
       
 10935 	el.animate( animation, {
       
 10936 		queue: false,
       
 10937 		duration: o.duration,
       
 10938 		easing: o.easing,
       
 10939 		complete: function() {
       
 10940 			if ( mode === "hide" ) {
       
 10941 				el.hide();
       
 10942 			}
       
 10943 			$.effects.restore( el, props );
       
 10944 			$.effects.removeWrapper( el );
       
 10945 			done();
       
 10946 		}
       
 10947 	});
       
 10948 };
       
 10949 
       
 10950 
       
 10951 /*!
       
 10952  * jQuery UI Effects Explode 1.11.4
       
 10953  * http://jqueryui.com
       
 10954  *
       
 10955  * Copyright jQuery Foundation and other contributors
       
 10956  * Released under the MIT license.
       
 10957  * http://jquery.org/license
       
 10958  *
       
 10959  * http://api.jqueryui.com/explode-effect/
       
 10960  */
       
 10961 
       
 10962 
       
 10963 var effectExplode = $.effects.effect.explode = function( o, done ) {
       
 10964 
       
 10965 	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
       
 10966 		cells = rows,
       
 10967 		el = $( this ),
       
 10968 		mode = $.effects.setMode( el, o.mode || "hide" ),
       
 10969 		show = mode === "show",
       
 10970 
       
 10971 		// show and then visibility:hidden the element before calculating offset
       
 10972 		offset = el.show().css( "visibility", "hidden" ).offset(),
       
 10973 
       
 10974 		// width and height of a piece
       
 10975 		width = Math.ceil( el.outerWidth() / cells ),
       
 10976 		height = Math.ceil( el.outerHeight() / rows ),
       
 10977 		pieces = [],
       
 10978 
       
 10979 		// loop
       
 10980 		i, j, left, top, mx, my;
       
 10981 
       
 10982 	// children animate complete:
       
 10983 	function childComplete() {
       
 10984 		pieces.push( this );
       
 10985 		if ( pieces.length === rows * cells ) {
       
 10986 			animComplete();
       
 10987 		}
       
 10988 	}
       
 10989 
       
 10990 	// clone the element for each row and cell.
       
 10991 	for ( i = 0; i < rows ; i++ ) { // ===>
       
 10992 		top = offset.top + i * height;
       
 10993 		my = i - ( rows - 1 ) / 2 ;
       
 10994 
       
 10995 		for ( j = 0; j < cells ; j++ ) { // |||
       
 10996 			left = offset.left + j * width;
       
 10997 			mx = j - ( cells - 1 ) / 2 ;
       
 10998 
       
 10999 			// Create a clone of the now hidden main element that will be absolute positioned
       
 11000 			// within a wrapper div off the -left and -top equal to size of our pieces
       
 11001 			el
       
 11002 				.clone()
       
 11003 				.appendTo( "body" )
       
 11004 				.wrap( "<div></div>" )
       
 11005 				.css({
       
 11006 					position: "absolute",
       
 11007 					visibility: "visible",
       
 11008 					left: -j * width,
       
 11009 					top: -i * height
       
 11010 				})
       
 11011 
       
 11012 			// select the wrapper - make it overflow: hidden and absolute positioned based on
       
 11013 			// where the original was located +left and +top equal to the size of pieces
       
 11014 				.parent()
       
 11015 				.addClass( "ui-effects-explode" )
       
 11016 				.css({
       
 11017 					position: "absolute",
       
 11018 					overflow: "hidden",
       
 11019 					width: width,
       
 11020 					height: height,
       
 11021 					left: left + ( show ? mx * width : 0 ),
       
 11022 					top: top + ( show ? my * height : 0 ),
       
 11023 					opacity: show ? 0 : 1
       
 11024 				}).animate({
       
 11025 					left: left + ( show ? 0 : mx * width ),
       
 11026 					top: top + ( show ? 0 : my * height ),
       
 11027 					opacity: show ? 1 : 0
       
 11028 				}, o.duration || 500, o.easing, childComplete );
       
 11029 		}
       
 11030 	}
       
 11031 
       
 11032 	function animComplete() {
       
 11033 		el.css({
       
 11034 			visibility: "visible"
       
 11035 		});
       
 11036 		$( pieces ).remove();
       
 11037 		if ( !show ) {
       
 11038 			el.hide();
       
 11039 		}
       
 11040 		done();
       
 11041 	}
       
 11042 };
       
 11043 
       
 11044 
       
 11045 /*!
       
 11046  * jQuery UI Effects Fade 1.11.4
       
 11047  * http://jqueryui.com
       
 11048  *
       
 11049  * Copyright jQuery Foundation and other contributors
       
 11050  * Released under the MIT license.
       
 11051  * http://jquery.org/license
       
 11052  *
       
 11053  * http://api.jqueryui.com/fade-effect/
       
 11054  */
       
 11055 
       
 11056 
       
 11057 var effectFade = $.effects.effect.fade = function( o, done ) {
       
 11058 	var el = $( this ),
       
 11059 		mode = $.effects.setMode( el, o.mode || "toggle" );
       
 11060 
       
 11061 	el.animate({
       
 11062 		opacity: mode
       
 11063 	}, {
       
 11064 		queue: false,
       
 11065 		duration: o.duration,
       
 11066 		easing: o.easing,
       
 11067 		complete: done
       
 11068 	});
       
 11069 };
       
 11070 
       
 11071 
       
 11072 /*!
       
 11073  * jQuery UI Effects Fold 1.11.4
       
 11074  * http://jqueryui.com
       
 11075  *
       
 11076  * Copyright jQuery Foundation and other contributors
       
 11077  * Released under the MIT license.
       
 11078  * http://jquery.org/license
       
 11079  *
       
 11080  * http://api.jqueryui.com/fold-effect/
       
 11081  */
       
 11082 
       
 11083 
       
 11084 var effectFold = $.effects.effect.fold = function( o, done ) {
       
 11085 
       
 11086 	// Create element
       
 11087 	var el = $( this ),
       
 11088 		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
       
 11089 		mode = $.effects.setMode( el, o.mode || "hide" ),
       
 11090 		show = mode === "show",
       
 11091 		hide = mode === "hide",
       
 11092 		size = o.size || 15,
       
 11093 		percent = /([0-9]+)%/.exec( size ),
       
 11094 		horizFirst = !!o.horizFirst,
       
 11095 		widthFirst = show !== horizFirst,
       
 11096 		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
       
 11097 		duration = o.duration / 2,
       
 11098 		wrapper, distance,
       
 11099 		animation1 = {},
       
 11100 		animation2 = {};
       
 11101 
       
 11102 	$.effects.save( el, props );
       
 11103 	el.show();
       
 11104 
       
 11105 	// Create Wrapper
       
 11106 	wrapper = $.effects.createWrapper( el ).css({
       
 11107 		overflow: "hidden"
       
 11108 	});
       
 11109 	distance = widthFirst ?
       
 11110 		[ wrapper.width(), wrapper.height() ] :
       
 11111 		[ wrapper.height(), wrapper.width() ];
       
 11112 
       
 11113 	if ( percent ) {
       
 11114 		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
       
 11115 	}
       
 11116 	if ( show ) {
       
 11117 		wrapper.css( horizFirst ? {
       
 11118 			height: 0,
       
 11119 			width: size
       
 11120 		} : {
       
 11121 			height: size,
       
 11122 			width: 0
       
 11123 		});
       
 11124 	}
       
 11125 
       
 11126 	// Animation
       
 11127 	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
       
 11128 	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
       
 11129 
       
 11130 	// Animate
       
 11131 	wrapper
       
 11132 		.animate( animation1, duration, o.easing )
       
 11133 		.animate( animation2, duration, o.easing, function() {
       
 11134 			if ( hide ) {
       
 11135 				el.hide();
       
 11136 			}
       
 11137 			$.effects.restore( el, props );
       
 11138 			$.effects.removeWrapper( el );
       
 11139 			done();
       
 11140 		});
       
 11141 
       
 11142 };
       
 11143 
       
 11144 
       
 11145 /*!
       
 11146  * jQuery UI Effects Highlight 1.11.4
       
 11147  * http://jqueryui.com
       
 11148  *
       
 11149  * Copyright jQuery Foundation and other contributors
       
 11150  * Released under the MIT license.
       
 11151  * http://jquery.org/license
       
 11152  *
       
 11153  * http://api.jqueryui.com/highlight-effect/
       
 11154  */
       
 11155 
       
 11156 
       
 11157 var effectHighlight = $.effects.effect.highlight = function( o, done ) {
       
 11158 	var elem = $( this ),
       
 11159 		props = [ "backgroundImage", "backgroundColor", "opacity" ],
       
 11160 		mode = $.effects.setMode( elem, o.mode || "show" ),
       
 11161 		animation = {
       
 11162 			backgroundColor: elem.css( "backgroundColor" )
       
 11163 		};
       
 11164 
       
 11165 	if (mode === "hide") {
       
 11166 		animation.opacity = 0;
       
 11167 	}
       
 11168 
       
 11169 	$.effects.save( elem, props );
       
 11170 
       
 11171 	elem
       
 11172 		.show()
       
 11173 		.css({
       
 11174 			backgroundImage: "none",
       
 11175 			backgroundColor: o.color || "#ffff99"
       
 11176 		})
       
 11177 		.animate( animation, {
       
 11178 			queue: false,
       
 11179 			duration: o.duration,
       
 11180 			easing: o.easing,
       
 11181 			complete: function() {
       
 11182 				if ( mode === "hide" ) {
       
 11183 					elem.hide();
       
 11184 				}
       
 11185 				$.effects.restore( elem, props );
       
 11186 				done();
       
 11187 			}
       
 11188 		});
       
 11189 };
       
 11190 
       
 11191 
       
 11192 /*!
       
 11193  * jQuery UI Effects Size 1.11.4
       
 11194  * http://jqueryui.com
       
 11195  *
       
 11196  * Copyright jQuery Foundation and other contributors
       
 11197  * Released under the MIT license.
       
 11198  * http://jquery.org/license
       
 11199  *
       
 11200  * http://api.jqueryui.com/size-effect/
       
 11201  */
       
 11202 
       
 11203 
       
 11204 var effectSize = $.effects.effect.size = function( o, done ) {
       
 11205 
       
 11206 	// Create element
       
 11207 	var original, baseline, factor,
       
 11208 		el = $( this ),
       
 11209 		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
       
 11210 
       
 11211 		// Always restore
       
 11212 		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
       
 11213 
       
 11214 		// Copy for children
       
 11215 		props2 = [ "width", "height", "overflow" ],
       
 11216 		cProps = [ "fontSize" ],
       
 11217 		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
       
 11218 		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
       
 11219 
       
 11220 		// Set options
       
 11221 		mode = $.effects.setMode( el, o.mode || "effect" ),
       
 11222 		restore = o.restore || mode !== "effect",
       
 11223 		scale = o.scale || "both",
       
 11224 		origin = o.origin || [ "middle", "center" ],
       
 11225 		position = el.css( "position" ),
       
 11226 		props = restore ? props0 : props1,
       
 11227 		zero = {
       
 11228 			height: 0,
       
 11229 			width: 0,
       
 11230 			outerHeight: 0,
       
 11231 			outerWidth: 0
       
 11232 		};
       
 11233 
       
 11234 	if ( mode === "show" ) {
       
 11235 		el.show();
       
 11236 	}
       
 11237 	original = {
       
 11238 		height: el.height(),
       
 11239 		width: el.width(),
       
 11240 		outerHeight: el.outerHeight(),
       
 11241 		outerWidth: el.outerWidth()
       
 11242 	};
       
 11243 
       
 11244 	if ( o.mode === "toggle" && mode === "show" ) {
       
 11245 		el.from = o.to || zero;
       
 11246 		el.to = o.from || original;
       
 11247 	} else {
       
 11248 		el.from = o.from || ( mode === "show" ? zero : original );
       
 11249 		el.to = o.to || ( mode === "hide" ? zero : original );
       
 11250 	}
       
 11251 
       
 11252 	// Set scaling factor
       
 11253 	factor = {
       
 11254 		from: {
       
 11255 			y: el.from.height / original.height,
       
 11256 			x: el.from.width / original.width
       
 11257 		},
       
 11258 		to: {
       
 11259 			y: el.to.height / original.height,
       
 11260 			x: el.to.width / original.width
       
 11261 		}
       
 11262 	};
       
 11263 
       
 11264 	// Scale the css box
       
 11265 	if ( scale === "box" || scale === "both" ) {
       
 11266 
       
 11267 		// Vertical props scaling
       
 11268 		if ( factor.from.y !== factor.to.y ) {
       
 11269 			props = props.concat( vProps );
       
 11270 			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
       
 11271 			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
       
 11272 		}
       
 11273 
       
 11274 		// Horizontal props scaling
       
 11275 		if ( factor.from.x !== factor.to.x ) {
       
 11276 			props = props.concat( hProps );
       
 11277 			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
       
 11278 			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
       
 11279 		}
       
 11280 	}
       
 11281 
       
 11282 	// Scale the content
       
 11283 	if ( scale === "content" || scale === "both" ) {
       
 11284 
       
 11285 		// Vertical props scaling
       
 11286 		if ( factor.from.y !== factor.to.y ) {
       
 11287 			props = props.concat( cProps ).concat( props2 );
       
 11288 			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
       
 11289 			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
       
 11290 		}
       
 11291 	}
       
 11292 
       
 11293 	$.effects.save( el, props );
       
 11294 	el.show();
       
 11295 	$.effects.createWrapper( el );
       
 11296 	el.css( "overflow", "hidden" ).css( el.from );
       
 11297 
       
 11298 	// Adjust
       
 11299 	if (origin) { // Calculate baseline shifts
       
 11300 		baseline = $.effects.getBaseline( origin, original );
       
 11301 		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
       
 11302 		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
       
 11303 		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
       
 11304 		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
       
 11305 	}
       
 11306 	el.css( el.from ); // set top & left
       
 11307 
       
 11308 	// Animate
       
 11309 	if ( scale === "content" || scale === "both" ) { // Scale the children
       
 11310 
       
 11311 		// Add margins/font-size
       
 11312 		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
       
 11313 		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
       
 11314 		props2 = props0.concat(vProps).concat(hProps);
       
 11315 
       
 11316 		el.find( "*[width]" ).each( function() {
       
 11317 			var child = $( this ),
       
 11318 				c_original = {
       
 11319 					height: child.height(),
       
 11320 					width: child.width(),
       
 11321 					outerHeight: child.outerHeight(),
       
 11322 					outerWidth: child.outerWidth()
       
 11323 				};
       
 11324 			if (restore) {
       
 11325 				$.effects.save(child, props2);
       
 11326 			}
       
 11327 
       
 11328 			child.from = {
       
 11329 				height: c_original.height * factor.from.y,
       
 11330 				width: c_original.width * factor.from.x,
       
 11331 				outerHeight: c_original.outerHeight * factor.from.y,
       
 11332 				outerWidth: c_original.outerWidth * factor.from.x
       
 11333 			};
       
 11334 			child.to = {
       
 11335 				height: c_original.height * factor.to.y,
       
 11336 				width: c_original.width * factor.to.x,
       
 11337 				outerHeight: c_original.height * factor.to.y,
       
 11338 				outerWidth: c_original.width * factor.to.x
       
 11339 			};
       
 11340 
       
 11341 			// Vertical props scaling
       
 11342 			if ( factor.from.y !== factor.to.y ) {
       
 11343 				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
       
 11344 				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
       
 11345 			}
       
 11346 
       
 11347 			// Horizontal props scaling
       
 11348 			if ( factor.from.x !== factor.to.x ) {
       
 11349 				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
       
 11350 				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
       
 11351 			}
       
 11352 
       
 11353 			// Animate children
       
 11354 			child.css( child.from );
       
 11355 			child.animate( child.to, o.duration, o.easing, function() {
       
 11356 
       
 11357 				// Restore children
       
 11358 				if ( restore ) {
       
 11359 					$.effects.restore( child, props2 );
       
 11360 				}
       
 11361 			});
       
 11362 		});
       
 11363 	}
       
 11364 
       
 11365 	// Animate
       
 11366 	el.animate( el.to, {
       
 11367 		queue: false,
       
 11368 		duration: o.duration,
       
 11369 		easing: o.easing,
       
 11370 		complete: function() {
       
 11371 			if ( el.to.opacity === 0 ) {
       
 11372 				el.css( "opacity", el.from.opacity );
       
 11373 			}
       
 11374 			if ( mode === "hide" ) {
       
 11375 				el.hide();
       
 11376 			}
       
 11377 			$.effects.restore( el, props );
       
 11378 			if ( !restore ) {
       
 11379 
       
 11380 				// we need to calculate our new positioning based on the scaling
       
 11381 				if ( position === "static" ) {
       
 11382 					el.css({
       
 11383 						position: "relative",
       
 11384 						top: el.to.top,
       
 11385 						left: el.to.left
       
 11386 					});
       
 11387 				} else {
       
 11388 					$.each([ "top", "left" ], function( idx, pos ) {
       
 11389 						el.css( pos, function( _, str ) {
       
 11390 							var val = parseInt( str, 10 ),
       
 11391 								toRef = idx ? el.to.left : el.to.top;
       
 11392 
       
 11393 							// if original was "auto", recalculate the new value from wrapper
       
 11394 							if ( str === "auto" ) {
       
 11395 								return toRef + "px";
       
 11396 							}
       
 11397 
       
 11398 							return val + toRef + "px";
       
 11399 						});
       
 11400 					});
       
 11401 				}
       
 11402 			}
       
 11403 
       
 11404 			$.effects.removeWrapper( el );
       
 11405 			done();
       
 11406 		}
       
 11407 	});
       
 11408 
       
 11409 };
       
 11410 
       
 11411 
       
 11412 /*!
       
 11413  * jQuery UI Effects Scale 1.11.4
       
 11414  * http://jqueryui.com
       
 11415  *
       
 11416  * Copyright jQuery Foundation and other contributors
       
 11417  * Released under the MIT license.
       
 11418  * http://jquery.org/license
       
 11419  *
       
 11420  * http://api.jqueryui.com/scale-effect/
       
 11421  */
       
 11422 
       
 11423 
       
 11424 var effectScale = $.effects.effect.scale = function( o, done ) {
       
 11425 
       
 11426 	// Create element
       
 11427 	var el = $( this ),
       
 11428 		options = $.extend( true, {}, o ),
       
 11429 		mode = $.effects.setMode( el, o.mode || "effect" ),
       
 11430 		percent = parseInt( o.percent, 10 ) ||
       
 11431 			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
       
 11432 		direction = o.direction || "both",
       
 11433 		origin = o.origin,
       
 11434 		original = {
       
 11435 			height: el.height(),
       
 11436 			width: el.width(),
       
 11437 			outerHeight: el.outerHeight(),
       
 11438 			outerWidth: el.outerWidth()
       
 11439 		},
       
 11440 		factor = {
       
 11441 			y: direction !== "horizontal" ? (percent / 100) : 1,
       
 11442 			x: direction !== "vertical" ? (percent / 100) : 1
       
 11443 		};
       
 11444 
       
 11445 	// We are going to pass this effect to the size effect:
       
 11446 	options.effect = "size";
       
 11447 	options.queue = false;
       
 11448 	options.complete = done;
       
 11449 
       
 11450 	// Set default origin and restore for show/hide
       
 11451 	if ( mode !== "effect" ) {
       
 11452 		options.origin = origin || [ "middle", "center" ];
       
 11453 		options.restore = true;
       
 11454 	}
       
 11455 
       
 11456 	options.from = o.from || ( mode === "show" ? {
       
 11457 		height: 0,
       
 11458 		width: 0,
       
 11459 		outerHeight: 0,
       
 11460 		outerWidth: 0
       
 11461 	} : original );
       
 11462 	options.to = {
       
 11463 		height: original.height * factor.y,
       
 11464 		width: original.width * factor.x,
       
 11465 		outerHeight: original.outerHeight * factor.y,
       
 11466 		outerWidth: original.outerWidth * factor.x
       
 11467 	};
       
 11468 
       
 11469 	// Fade option to support puff
       
 11470 	if ( options.fade ) {
       
 11471 		if ( mode === "show" ) {
       
 11472 			options.from.opacity = 0;
       
 11473 			options.to.opacity = 1;
       
 11474 		}
       
 11475 		if ( mode === "hide" ) {
       
 11476 			options.from.opacity = 1;
       
 11477 			options.to.opacity = 0;
       
 11478 		}
       
 11479 	}
       
 11480 
       
 11481 	// Animate
       
 11482 	el.effect( options );
       
 11483 
       
 11484 };
       
 11485 
       
 11486 
       
 11487 /*!
       
 11488  * jQuery UI Effects Puff 1.11.4
       
 11489  * http://jqueryui.com
       
 11490  *
       
 11491  * Copyright jQuery Foundation and other contributors
       
 11492  * Released under the MIT license.
       
 11493  * http://jquery.org/license
       
 11494  *
       
 11495  * http://api.jqueryui.com/puff-effect/
       
 11496  */
       
 11497 
       
 11498 
       
 11499 var effectPuff = $.effects.effect.puff = function( o, done ) {
       
 11500 	var elem = $( this ),
       
 11501 		mode = $.effects.setMode( elem, o.mode || "hide" ),
       
 11502 		hide = mode === "hide",
       
 11503 		percent = parseInt( o.percent, 10 ) || 150,
       
 11504 		factor = percent / 100,
       
 11505 		original = {
       
 11506 			height: elem.height(),
       
 11507 			width: elem.width(),
       
 11508 			outerHeight: elem.outerHeight(),
       
 11509 			outerWidth: elem.outerWidth()
       
 11510 		};
       
 11511 
       
 11512 	$.extend( o, {
       
 11513 		effect: "scale",
       
 11514 		queue: false,
       
 11515 		fade: true,
       
 11516 		mode: mode,
       
 11517 		complete: done,
       
 11518 		percent: hide ? percent : 100,
       
 11519 		from: hide ?
       
 11520 			original :
       
 11521 			{
       
 11522 				height: original.height * factor,
       
 11523 				width: original.width * factor,
       
 11524 				outerHeight: original.outerHeight * factor,
       
 11525 				outerWidth: original.outerWidth * factor
       
 11526 			}
       
 11527 	});
       
 11528 
       
 11529 	elem.effect( o );
       
 11530 };
       
 11531 
       
 11532 
       
 11533 /*!
       
 11534  * jQuery UI Effects Pulsate 1.11.4
       
 11535  * http://jqueryui.com
       
 11536  *
       
 11537  * Copyright jQuery Foundation and other contributors
       
 11538  * Released under the MIT license.
       
 11539  * http://jquery.org/license
       
 11540  *
       
 11541  * http://api.jqueryui.com/pulsate-effect/
       
 11542  */
       
 11543 
       
 11544 
       
 11545 var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
       
 11546 	var elem = $( this ),
       
 11547 		mode = $.effects.setMode( elem, o.mode || "show" ),
       
 11548 		show = mode === "show",
       
 11549 		hide = mode === "hide",
       
 11550 		showhide = ( show || mode === "hide" ),
       
 11551 
       
 11552 		// showing or hiding leaves of the "last" animation
       
 11553 		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
       
 11554 		duration = o.duration / anims,
       
 11555 		animateTo = 0,
       
 11556 		queue = elem.queue(),
       
 11557 		queuelen = queue.length,
       
 11558 		i;
       
 11559 
       
 11560 	if ( show || !elem.is(":visible")) {
       
 11561 		elem.css( "opacity", 0 ).show();
       
 11562 		animateTo = 1;
       
 11563 	}
       
 11564 
       
 11565 	// anims - 1 opacity "toggles"
       
 11566 	for ( i = 1; i < anims; i++ ) {
       
 11567 		elem.animate({
       
 11568 			opacity: animateTo
       
 11569 		}, duration, o.easing );
       
 11570 		animateTo = 1 - animateTo;
       
 11571 	}
       
 11572 
       
 11573 	elem.animate({
       
 11574 		opacity: animateTo
       
 11575 	}, duration, o.easing);
       
 11576 
       
 11577 	elem.queue(function() {
       
 11578 		if ( hide ) {
       
 11579 			elem.hide();
       
 11580 		}
       
 11581 		done();
       
 11582 	});
       
 11583 
       
 11584 	// We just queued up "anims" animations, we need to put them next in the queue
       
 11585 	if ( queuelen > 1 ) {
       
 11586 		queue.splice.apply( queue,
       
 11587 			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
       
 11588 	}
       
 11589 	elem.dequeue();
       
 11590 };
       
 11591 
       
 11592 
       
 11593 /*!
       
 11594  * jQuery UI Effects Shake 1.11.4
       
 11595  * http://jqueryui.com
       
 11596  *
       
 11597  * Copyright jQuery Foundation and other contributors
       
 11598  * Released under the MIT license.
       
 11599  * http://jquery.org/license
       
 11600  *
       
 11601  * http://api.jqueryui.com/shake-effect/
       
 11602  */
       
 11603 
       
 11604 
       
 11605 var effectShake = $.effects.effect.shake = function( o, done ) {
       
 11606 
       
 11607 	var el = $( this ),
       
 11608 		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
       
 11609 		mode = $.effects.setMode( el, o.mode || "effect" ),
       
 11610 		direction = o.direction || "left",
       
 11611 		distance = o.distance || 20,
       
 11612 		times = o.times || 3,
       
 11613 		anims = times * 2 + 1,
       
 11614 		speed = Math.round( o.duration / anims ),
       
 11615 		ref = (direction === "up" || direction === "down") ? "top" : "left",
       
 11616 		positiveMotion = (direction === "up" || direction === "left"),
       
 11617 		animation = {},
       
 11618 		animation1 = {},
       
 11619 		animation2 = {},
       
 11620 		i,
       
 11621 
       
 11622 		// we will need to re-assemble the queue to stack our animations in place
       
 11623 		queue = el.queue(),
       
 11624 		queuelen = queue.length;
       
 11625 
       
 11626 	$.effects.save( el, props );
       
 11627 	el.show();
       
 11628 	$.effects.createWrapper( el );
       
 11629 
       
 11630 	// Animation
       
 11631 	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
       
 11632 	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
       
 11633 	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
       
 11634 
       
 11635 	// Animate
       
 11636 	el.animate( animation, speed, o.easing );
       
 11637 
       
 11638 	// Shakes
       
 11639 	for ( i = 1; i < times; i++ ) {
       
 11640 		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
       
 11641 	}
       
 11642 	el
       
 11643 		.animate( animation1, speed, o.easing )
       
 11644 		.animate( animation, speed / 2, o.easing )
       
 11645 		.queue(function() {
       
 11646 			if ( mode === "hide" ) {
       
 11647 				el.hide();
       
 11648 			}
       
 11649 			$.effects.restore( el, props );
       
 11650 			$.effects.removeWrapper( el );
       
 11651 			done();
       
 11652 		});
       
 11653 
       
 11654 	// inject all the animations we just queued to be first in line (after "inprogress")
       
 11655 	if ( queuelen > 1) {
       
 11656 		queue.splice.apply( queue,
       
 11657 			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
       
 11658 	}
       
 11659 	el.dequeue();
       
 11660 
       
 11661 };
       
 11662 
       
 11663 
       
 11664 /*!
       
 11665  * jQuery UI Effects Slide 1.11.4
       
 11666  * http://jqueryui.com
       
 11667  *
       
 11668  * Copyright jQuery Foundation and other contributors
       
 11669  * Released under the MIT license.
       
 11670  * http://jquery.org/license
       
 11671  *
       
 11672  * http://api.jqueryui.com/slide-effect/
       
 11673  */
       
 11674 
       
 11675 
       
 11676 var effectSlide = $.effects.effect.slide = function( o, done ) {
       
 11677 
       
 11678 	// Create element
       
 11679 	var el = $( this ),
       
 11680 		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
       
 11681 		mode = $.effects.setMode( el, o.mode || "show" ),
       
 11682 		show = mode === "show",
       
 11683 		direction = o.direction || "left",
       
 11684 		ref = (direction === "up" || direction === "down") ? "top" : "left",
       
 11685 		positiveMotion = (direction === "up" || direction === "left"),
       
 11686 		distance,
       
 11687 		animation = {};
       
 11688 
       
 11689 	// Adjust
       
 11690 	$.effects.save( el, props );
       
 11691 	el.show();
       
 11692 	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
       
 11693 
       
 11694 	$.effects.createWrapper( el ).css({
       
 11695 		overflow: "hidden"
       
 11696 	});
       
 11697 
       
 11698 	if ( show ) {
       
 11699 		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
       
 11700 	}
       
 11701 
       
 11702 	// Animation
       
 11703 	animation[ ref ] = ( show ?
       
 11704 		( positiveMotion ? "+=" : "-=") :
       
 11705 		( positiveMotion ? "-=" : "+=")) +
       
 11706 		distance;
       
 11707 
       
 11708 	// Animate
       
 11709 	el.animate( animation, {
       
 11710 		queue: false,
       
 11711 		duration: o.duration,
       
 11712 		easing: o.easing,
       
 11713 		complete: function() {
       
 11714 			if ( mode === "hide" ) {
       
 11715 				el.hide();
       
 11716 			}
       
 11717 			$.effects.restore( el, props );
       
 11718 			$.effects.removeWrapper( el );
       
 11719 			done();
       
 11720 		}
       
 11721 	});
       
 11722 };
       
 11723 
       
 11724 
       
 11725 /*!
       
 11726  * jQuery UI Effects Transfer 1.11.4
       
 11727  * http://jqueryui.com
       
 11728  *
       
 11729  * Copyright jQuery Foundation and other contributors
       
 11730  * Released under the MIT license.
       
 11731  * http://jquery.org/license
       
 11732  *
       
 11733  * http://api.jqueryui.com/transfer-effect/
       
 11734  */
       
 11735 
       
 11736 
       
 11737 var effectTransfer = $.effects.effect.transfer = function( o, done ) {
       
 11738 	var elem = $( this ),
       
 11739 		target = $( o.to ),
       
 11740 		targetFixed = target.css( "position" ) === "fixed",
       
 11741 		body = $("body"),
       
 11742 		fixTop = targetFixed ? body.scrollTop() : 0,
       
 11743 		fixLeft = targetFixed ? body.scrollLeft() : 0,
       
 11744 		endPosition = target.offset(),
       
 11745 		animation = {
       
 11746 			top: endPosition.top - fixTop,
       
 11747 			left: endPosition.left - fixLeft,
       
 11748 			height: target.innerHeight(),
       
 11749 			width: target.innerWidth()
       
 11750 		},
       
 11751 		startPosition = elem.offset(),
       
 11752 		transfer = $( "<div class='ui-effects-transfer'></div>" )
       
 11753 			.appendTo( document.body )
       
 11754 			.addClass( o.className )
       
 11755 			.css({
       
 11756 				top: startPosition.top - fixTop,
       
 11757 				left: startPosition.left - fixLeft,
       
 11758 				height: elem.innerHeight(),
       
 11759 				width: elem.innerWidth(),
       
 11760 				position: targetFixed ? "fixed" : "absolute"
       
 11761 			})
       
 11762 			.animate( animation, o.duration, o.easing, function() {
       
 11763 				transfer.remove();
       
 11764 				done();
       
 11765 			});
       
 11766 };
       
 11767 
       
 11768 
       
 11769 /*!
       
 11770  * jQuery UI Progressbar 1.11.4
       
 11771  * http://jqueryui.com
       
 11772  *
       
 11773  * Copyright jQuery Foundation and other contributors
       
 11774  * Released under the MIT license.
       
 11775  * http://jquery.org/license
       
 11776  *
       
 11777  * http://api.jqueryui.com/progressbar/
       
 11778  */
       
 11779 
       
 11780 
       
 11781 var progressbar = $.widget( "ui.progressbar", {
       
 11782 	version: "1.11.4",
       
 11783 	options: {
       
 11784 		max: 100,
       
 11785 		value: 0,
       
 11786 
       
 11787 		change: null,
       
 11788 		complete: null
       
 11789 	},
       
 11790 
       
 11791 	min: 0,
       
 11792 
       
 11793 	_create: function() {
       
 11794 		// Constrain initial value
       
 11795 		this.oldValue = this.options.value = this._constrainedValue();
       
 11796 
       
 11797 		this.element
       
 11798 			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
       
 11799 			.attr({
       
 11800 				// Only set static values, aria-valuenow and aria-valuemax are
       
 11801 				// set inside _refreshValue()
       
 11802 				role: "progressbar",
       
 11803 				"aria-valuemin": this.min
       
 11804 			});
       
 11805 
       
 11806 		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
       
 11807 			.appendTo( this.element );
       
 11808 
       
 11809 		this._refreshValue();
       
 11810 	},
       
 11811 
       
 11812 	_destroy: function() {
       
 11813 		this.element
       
 11814 			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
       
 11815 			.removeAttr( "role" )
       
 11816 			.removeAttr( "aria-valuemin" )
       
 11817 			.removeAttr( "aria-valuemax" )
       
 11818 			.removeAttr( "aria-valuenow" );
       
 11819 
       
 11820 		this.valueDiv.remove();
       
 11821 	},
       
 11822 
       
 11823 	value: function( newValue ) {
       
 11824 		if ( newValue === undefined ) {
       
 11825 			return this.options.value;
       
 11826 		}
       
 11827 
       
 11828 		this.options.value = this._constrainedValue( newValue );
       
 11829 		this._refreshValue();
       
 11830 	},
       
 11831 
       
 11832 	_constrainedValue: function( newValue ) {
       
 11833 		if ( newValue === undefined ) {
       
 11834 			newValue = this.options.value;
       
 11835 		}
       
 11836 
       
 11837 		this.indeterminate = newValue === false;
       
 11838 
       
 11839 		// sanitize value
       
 11840 		if ( typeof newValue !== "number" ) {
       
 11841 			newValue = 0;
       
 11842 		}
       
 11843 
       
 11844 		return this.indeterminate ? false :
       
 11845 			Math.min( this.options.max, Math.max( this.min, newValue ) );
       
 11846 	},
       
 11847 
       
 11848 	_setOptions: function( options ) {
       
 11849 		// Ensure "value" option is set after other values (like max)
       
 11850 		var value = options.value;
       
 11851 		delete options.value;
       
 11852 
       
 11853 		this._super( options );
       
 11854 
       
 11855 		this.options.value = this._constrainedValue( value );
       
 11856 		this._refreshValue();
       
 11857 	},
       
 11858 
       
 11859 	_setOption: function( key, value ) {
       
 11860 		if ( key === "max" ) {
       
 11861 			// Don't allow a max less than min
       
 11862 			value = Math.max( this.min, value );
       
 11863 		}
       
 11864 		if ( key === "disabled" ) {
       
 11865 			this.element
       
 11866 				.toggleClass( "ui-state-disabled", !!value )
       
 11867 				.attr( "aria-disabled", value );
       
 11868 		}
       
 11869 		this._super( key, value );
       
 11870 	},
       
 11871 
       
 11872 	_percentage: function() {
       
 11873 		return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
       
 11874 	},
       
 11875 
       
 11876 	_refreshValue: function() {
       
 11877 		var value = this.options.value,
       
 11878 			percentage = this._percentage();
       
 11879 
       
 11880 		this.valueDiv
       
 11881 			.toggle( this.indeterminate || value > this.min )
       
 11882 			.toggleClass( "ui-corner-right", value === this.options.max )
       
 11883 			.width( percentage.toFixed(0) + "%" );
       
 11884 
       
 11885 		this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
       
 11886 
       
 11887 		if ( this.indeterminate ) {
       
 11888 			this.element.removeAttr( "aria-valuenow" );
       
 11889 			if ( !this.overlayDiv ) {
       
 11890 				this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
       
 11891 			}
       
 11892 		} else {
       
 11893 			this.element.attr({
       
 11894 				"aria-valuemax": this.options.max,
       
 11895 				"aria-valuenow": value
       
 11896 			});
       
 11897 			if ( this.overlayDiv ) {
       
 11898 				this.overlayDiv.remove();
       
 11899 				this.overlayDiv = null;
       
 11900 			}
       
 11901 		}
       
 11902 
       
 11903 		if ( this.oldValue !== value ) {
       
 11904 			this.oldValue = value;
       
 11905 			this._trigger( "change" );
       
 11906 		}
       
 11907 		if ( value === this.options.max ) {
       
 11908 			this._trigger( "complete" );
       
 11909 		}
       
 11910 	}
       
 11911 });
       
 11912 
       
 11913 
       
 11914 /*!
       
 11915  * jQuery UI Selectable 1.11.4
       
 11916  * http://jqueryui.com
       
 11917  *
       
 11918  * Copyright jQuery Foundation and other contributors
       
 11919  * Released under the MIT license.
       
 11920  * http://jquery.org/license
       
 11921  *
       
 11922  * http://api.jqueryui.com/selectable/
       
 11923  */
       
 11924 
       
 11925 
       
 11926 var selectable = $.widget("ui.selectable", $.ui.mouse, {
       
 11927 	version: "1.11.4",
       
 11928 	options: {
       
 11929 		appendTo: "body",
       
 11930 		autoRefresh: true,
       
 11931 		distance: 0,
       
 11932 		filter: "*",
       
 11933 		tolerance: "touch",
       
 11934 
       
 11935 		// callbacks
       
 11936 		selected: null,
       
 11937 		selecting: null,
       
 11938 		start: null,
       
 11939 		stop: null,
       
 11940 		unselected: null,
       
 11941 		unselecting: null
       
 11942 	},
       
 11943 	_create: function() {
       
 11944 		var selectees,
       
 11945 			that = this;
       
 11946 
       
 11947 		this.element.addClass("ui-selectable");
       
 11948 
       
 11949 		this.dragged = false;
       
 11950 
       
 11951 		// cache selectee children based on filter
       
 11952 		this.refresh = function() {
       
 11953 			selectees = $(that.options.filter, that.element[0]);
       
 11954 			selectees.addClass("ui-selectee");
       
 11955 			selectees.each(function() {
       
 11956 				var $this = $(this),
       
 11957 					pos = $this.offset();
       
 11958 				$.data(this, "selectable-item", {
       
 11959 					element: this,
       
 11960 					$element: $this,
       
 11961 					left: pos.left,
       
 11962 					top: pos.top,
       
 11963 					right: pos.left + $this.outerWidth(),
       
 11964 					bottom: pos.top + $this.outerHeight(),
       
 11965 					startselected: false,
       
 11966 					selected: $this.hasClass("ui-selected"),
       
 11967 					selecting: $this.hasClass("ui-selecting"),
       
 11968 					unselecting: $this.hasClass("ui-unselecting")
       
 11969 				});
       
 11970 			});
       
 11971 		};
       
 11972 		this.refresh();
       
 11973 
       
 11974 		this.selectees = selectees.addClass("ui-selectee");
       
 11975 
       
 11976 		this._mouseInit();
       
 11977 
       
 11978 		this.helper = $("<div class='ui-selectable-helper'></div>");
       
 11979 	},
       
 11980 
       
 11981 	_destroy: function() {
       
 11982 		this.selectees
       
 11983 			.removeClass("ui-selectee")
       
 11984 			.removeData("selectable-item");
       
 11985 		this.element
       
 11986 			.removeClass("ui-selectable ui-selectable-disabled");
       
 11987 		this._mouseDestroy();
       
 11988 	},
       
 11989 
       
 11990 	_mouseStart: function(event) {
       
 11991 		var that = this,
       
 11992 			options = this.options;
       
 11993 
       
 11994 		this.opos = [ event.pageX, event.pageY ];
       
 11995 
       
 11996 		if (this.options.disabled) {
       
 11997 			return;
       
 11998 		}
       
 11999 
       
 12000 		this.selectees = $(options.filter, this.element[0]);
       
 12001 
       
 12002 		this._trigger("start", event);
       
 12003 
       
 12004 		$(options.appendTo).append(this.helper);
       
 12005 		// position helper (lasso)
       
 12006 		this.helper.css({
       
 12007 			"left": event.pageX,
       
 12008 			"top": event.pageY,
       
 12009 			"width": 0,
       
 12010 			"height": 0
       
 12011 		});
       
 12012 
       
 12013 		if (options.autoRefresh) {
       
 12014 			this.refresh();
       
 12015 		}
       
 12016 
       
 12017 		this.selectees.filter(".ui-selected").each(function() {
       
 12018 			var selectee = $.data(this, "selectable-item");
       
 12019 			selectee.startselected = true;
       
 12020 			if (!event.metaKey && !event.ctrlKey) {
       
 12021 				selectee.$element.removeClass("ui-selected");
       
 12022 				selectee.selected = false;
       
 12023 				selectee.$element.addClass("ui-unselecting");
       
 12024 				selectee.unselecting = true;
       
 12025 				// selectable UNSELECTING callback
       
 12026 				that._trigger("unselecting", event, {
       
 12027 					unselecting: selectee.element
       
 12028 				});
       
 12029 			}
       
 12030 		});
       
 12031 
       
 12032 		$(event.target).parents().addBack().each(function() {
       
 12033 			var doSelect,
       
 12034 				selectee = $.data(this, "selectable-item");
       
 12035 			if (selectee) {
       
 12036 				doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
       
 12037 				selectee.$element
       
 12038 					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
       
 12039 					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
       
 12040 				selectee.unselecting = !doSelect;
       
 12041 				selectee.selecting = doSelect;
       
 12042 				selectee.selected = doSelect;
       
 12043 				// selectable (UN)SELECTING callback
       
 12044 				if (doSelect) {
       
 12045 					that._trigger("selecting", event, {
       
 12046 						selecting: selectee.element
       
 12047 					});
       
 12048 				} else {
       
 12049 					that._trigger("unselecting", event, {
       
 12050 						unselecting: selectee.element
       
 12051 					});
       
 12052 				}
       
 12053 				return false;
       
 12054 			}
       
 12055 		});
       
 12056 
       
 12057 	},
       
 12058 
       
 12059 	_mouseDrag: function(event) {
       
 12060 
       
 12061 		this.dragged = true;
       
 12062 
       
 12063 		if (this.options.disabled) {
       
 12064 			return;
       
 12065 		}
       
 12066 
       
 12067 		var tmp,
       
 12068 			that = this,
       
 12069 			options = this.options,
       
 12070 			x1 = this.opos[0],
       
 12071 			y1 = this.opos[1],
       
 12072 			x2 = event.pageX,
       
 12073 			y2 = event.pageY;
       
 12074 
       
 12075 		if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
       
 12076 		if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
       
 12077 		this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
       
 12078 
       
 12079 		this.selectees.each(function() {
       
 12080 			var selectee = $.data(this, "selectable-item"),
       
 12081 				hit = false;
       
 12082 
       
 12083 			//prevent helper from being selected if appendTo: selectable
       
 12084 			if (!selectee || selectee.element === that.element[0]) {
       
 12085 				return;
       
 12086 			}
       
 12087 
       
 12088 			if (options.tolerance === "touch") {
       
 12089 				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
       
 12090 			} else if (options.tolerance === "fit") {
       
 12091 				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
       
 12092 			}
       
 12093 
       
 12094 			if (hit) {
       
 12095 				// SELECT
       
 12096 				if (selectee.selected) {
       
 12097 					selectee.$element.removeClass("ui-selected");
       
 12098 					selectee.selected = false;
       
 12099 				}
       
 12100 				if (selectee.unselecting) {
       
 12101 					selectee.$element.removeClass("ui-unselecting");
       
 12102 					selectee.unselecting = false;
       
 12103 				}
       
 12104 				if (!selectee.selecting) {
       
 12105 					selectee.$element.addClass("ui-selecting");
       
 12106 					selectee.selecting = true;
       
 12107 					// selectable SELECTING callback
       
 12108 					that._trigger("selecting", event, {
       
 12109 						selecting: selectee.element
       
 12110 					});
       
 12111 				}
       
 12112 			} else {
       
 12113 				// UNSELECT
       
 12114 				if (selectee.selecting) {
       
 12115 					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
       
 12116 						selectee.$element.removeClass("ui-selecting");
       
 12117 						selectee.selecting = false;
       
 12118 						selectee.$element.addClass("ui-selected");
       
 12119 						selectee.selected = true;
       
 12120 					} else {
       
 12121 						selectee.$element.removeClass("ui-selecting");
       
 12122 						selectee.selecting = false;
       
 12123 						if (selectee.startselected) {
       
 12124 							selectee.$element.addClass("ui-unselecting");
       
 12125 							selectee.unselecting = true;
       
 12126 						}
       
 12127 						// selectable UNSELECTING callback
       
 12128 						that._trigger("unselecting", event, {
       
 12129 							unselecting: selectee.element
       
 12130 						});
       
 12131 					}
       
 12132 				}
       
 12133 				if (selectee.selected) {
       
 12134 					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
       
 12135 						selectee.$element.removeClass("ui-selected");
       
 12136 						selectee.selected = false;
       
 12137 
       
 12138 						selectee.$element.addClass("ui-unselecting");
       
 12139 						selectee.unselecting = true;
       
 12140 						// selectable UNSELECTING callback
       
 12141 						that._trigger("unselecting", event, {
       
 12142 							unselecting: selectee.element
       
 12143 						});
       
 12144 					}
       
 12145 				}
       
 12146 			}
       
 12147 		});
       
 12148 
       
 12149 		return false;
       
 12150 	},
       
 12151 
       
 12152 	_mouseStop: function(event) {
       
 12153 		var that = this;
       
 12154 
       
 12155 		this.dragged = false;
       
 12156 
       
 12157 		$(".ui-unselecting", this.element[0]).each(function() {
       
 12158 			var selectee = $.data(this, "selectable-item");
       
 12159 			selectee.$element.removeClass("ui-unselecting");
       
 12160 			selectee.unselecting = false;
       
 12161 			selectee.startselected = false;
       
 12162 			that._trigger("unselected", event, {
       
 12163 				unselected: selectee.element
       
 12164 			});
       
 12165 		});
       
 12166 		$(".ui-selecting", this.element[0]).each(function() {
       
 12167 			var selectee = $.data(this, "selectable-item");
       
 12168 			selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
       
 12169 			selectee.selecting = false;
       
 12170 			selectee.selected = true;
       
 12171 			selectee.startselected = true;
       
 12172 			that._trigger("selected", event, {
       
 12173 				selected: selectee.element
       
 12174 			});
       
 12175 		});
       
 12176 		this._trigger("stop", event);
       
 12177 
       
 12178 		this.helper.remove();
       
 12179 
       
 12180 		return false;
       
 12181 	}
       
 12182 
       
 12183 });
       
 12184 
       
 12185 
       
 12186 /*!
       
 12187  * jQuery UI Selectmenu 1.11.4
       
 12188  * http://jqueryui.com
       
 12189  *
       
 12190  * Copyright jQuery Foundation and other contributors
       
 12191  * Released under the MIT license.
       
 12192  * http://jquery.org/license
       
 12193  *
       
 12194  * http://api.jqueryui.com/selectmenu
       
 12195  */
       
 12196 
       
 12197 
       
 12198 var selectmenu = $.widget( "ui.selectmenu", {
       
 12199 	version: "1.11.4",
       
 12200 	defaultElement: "<select>",
       
 12201 	options: {
       
 12202 		appendTo: null,
       
 12203 		disabled: null,
       
 12204 		icons: {
       
 12205 			button: "ui-icon-triangle-1-s"
       
 12206 		},
       
 12207 		position: {
       
 12208 			my: "left top",
       
 12209 			at: "left bottom",
       
 12210 			collision: "none"
       
 12211 		},
       
 12212 		width: null,
       
 12213 
       
 12214 		// callbacks
       
 12215 		change: null,
       
 12216 		close: null,
       
 12217 		focus: null,
       
 12218 		open: null,
       
 12219 		select: null
       
 12220 	},
       
 12221 
       
 12222 	_create: function() {
       
 12223 		var selectmenuId = this.element.uniqueId().attr( "id" );
       
 12224 		this.ids = {
       
 12225 			element: selectmenuId,
       
 12226 			button: selectmenuId + "-button",
       
 12227 			menu: selectmenuId + "-menu"
       
 12228 		};
       
 12229 
       
 12230 		this._drawButton();
       
 12231 		this._drawMenu();
       
 12232 
       
 12233 		if ( this.options.disabled ) {
       
 12234 			this.disable();
       
 12235 		}
       
 12236 	},
       
 12237 
       
 12238 	_drawButton: function() {
       
 12239 		var that = this;
       
 12240 
       
 12241 		// Associate existing label with the new button
       
 12242 		this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
       
 12243 		this._on( this.label, {
       
 12244 			click: function( event ) {
       
 12245 				this.button.focus();
       
 12246 				event.preventDefault();
       
 12247 			}
       
 12248 		});
       
 12249 
       
 12250 		// Hide original select element
       
 12251 		this.element.hide();
       
 12252 
       
 12253 		// Create button
       
 12254 		this.button = $( "<span>", {
       
 12255 			"class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
       
 12256 			tabindex: this.options.disabled ? -1 : 0,
       
 12257 			id: this.ids.button,
       
 12258 			role: "combobox",
       
 12259 			"aria-expanded": "false",
       
 12260 			"aria-autocomplete": "list",
       
 12261 			"aria-owns": this.ids.menu,
       
 12262 			"aria-haspopup": "true"
       
 12263 		})
       
 12264 			.insertAfter( this.element );
       
 12265 
       
 12266 		$( "<span>", {
       
 12267 			"class": "ui-icon " + this.options.icons.button
       
 12268 		})
       
 12269 			.prependTo( this.button );
       
 12270 
       
 12271 		this.buttonText = $( "<span>", {
       
 12272 			"class": "ui-selectmenu-text"
       
 12273 		})
       
 12274 			.appendTo( this.button );
       
 12275 
       
 12276 		this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
       
 12277 		this._resizeButton();
       
 12278 
       
 12279 		this._on( this.button, this._buttonEvents );
       
 12280 		this.button.one( "focusin", function() {
       
 12281 
       
 12282 			// Delay rendering the menu items until the button receives focus.
       
 12283 			// The menu may have already been rendered via a programmatic open.
       
 12284 			if ( !that.menuItems ) {
       
 12285 				that._refreshMenu();
       
 12286 			}
       
 12287 		});
       
 12288 		this._hoverable( this.button );
       
 12289 		this._focusable( this.button );
       
 12290 	},
       
 12291 
       
 12292 	_drawMenu: function() {
       
 12293 		var that = this;
       
 12294 
       
 12295 		// Create menu
       
 12296 		this.menu = $( "<ul>", {
       
 12297 			"aria-hidden": "true",
       
 12298 			"aria-labelledby": this.ids.button,
       
 12299 			id: this.ids.menu
       
 12300 		});
       
 12301 
       
 12302 		// Wrap menu
       
 12303 		this.menuWrap = $( "<div>", {
       
 12304 			"class": "ui-selectmenu-menu ui-front"
       
 12305 		})
       
 12306 			.append( this.menu )
       
 12307 			.appendTo( this._appendTo() );
       
 12308 
       
 12309 		// Initialize menu widget
       
 12310 		this.menuInstance = this.menu
       
 12311 			.menu({
       
 12312 				role: "listbox",
       
 12313 				select: function( event, ui ) {
       
 12314 					event.preventDefault();
       
 12315 
       
 12316 					// support: IE8
       
 12317 					// If the item was selected via a click, the text selection
       
 12318 					// will be destroyed in IE
       
 12319 					that._setSelection();
       
 12320 
       
 12321 					that._select( ui.item.data( "ui-selectmenu-item" ), event );
       
 12322 				},
       
 12323 				focus: function( event, ui ) {
       
 12324 					var item = ui.item.data( "ui-selectmenu-item" );
       
 12325 
       
 12326 					// Prevent inital focus from firing and check if its a newly focused item
       
 12327 					if ( that.focusIndex != null && item.index !== that.focusIndex ) {
       
 12328 						that._trigger( "focus", event, { item: item } );
       
 12329 						if ( !that.isOpen ) {
       
 12330 							that._select( item, event );
       
 12331 						}
       
 12332 					}
       
 12333 					that.focusIndex = item.index;
       
 12334 
       
 12335 					that.button.attr( "aria-activedescendant",
       
 12336 						that.menuItems.eq( item.index ).attr( "id" ) );
       
 12337 				}
       
 12338 			})
       
 12339 			.menu( "instance" );
       
 12340 
       
 12341 		// Adjust menu styles to dropdown
       
 12342 		this.menu
       
 12343 			.addClass( "ui-corner-bottom" )
       
 12344 			.removeClass( "ui-corner-all" );
       
 12345 
       
 12346 		// Don't close the menu on mouseleave
       
 12347 		this.menuInstance._off( this.menu, "mouseleave" );
       
 12348 
       
 12349 		// Cancel the menu's collapseAll on document click
       
 12350 		this.menuInstance._closeOnDocumentClick = function() {
       
 12351 			return false;
       
 12352 		};
       
 12353 
       
 12354 		// Selects often contain empty items, but never contain dividers
       
 12355 		this.menuInstance._isDivider = function() {
       
 12356 			return false;
       
 12357 		};
       
 12358 	},
       
 12359 
       
 12360 	refresh: function() {
       
 12361 		this._refreshMenu();
       
 12362 		this._setText( this.buttonText, this._getSelectedItem().text() );
       
 12363 		if ( !this.options.width ) {
       
 12364 			this._resizeButton();
       
 12365 		}
       
 12366 	},
       
 12367 
       
 12368 	_refreshMenu: function() {
       
 12369 		this.menu.empty();
       
 12370 
       
 12371 		var item,
       
 12372 			options = this.element.find( "option" );
       
 12373 
       
 12374 		if ( !options.length ) {
       
 12375 			return;
       
 12376 		}
       
 12377 
       
 12378 		this._parseOptions( options );
       
 12379 		this._renderMenu( this.menu, this.items );
       
 12380 
       
 12381 		this.menuInstance.refresh();
       
 12382 		this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" );
       
 12383 
       
 12384 		item = this._getSelectedItem();
       
 12385 
       
 12386 		// Update the menu to have the correct item focused
       
 12387 		this.menuInstance.focus( null, item );
       
 12388 		this._setAria( item.data( "ui-selectmenu-item" ) );
       
 12389 
       
 12390 		// Set disabled state
       
 12391 		this._setOption( "disabled", this.element.prop( "disabled" ) );
       
 12392 	},
       
 12393 
       
 12394 	open: function( event ) {
       
 12395 		if ( this.options.disabled ) {
       
 12396 			return;
       
 12397 		}
       
 12398 
       
 12399 		// If this is the first time the menu is being opened, render the items
       
 12400 		if ( !this.menuItems ) {
       
 12401 			this._refreshMenu();
       
 12402 		} else {
       
 12403 
       
 12404 			// Menu clears focus on close, reset focus to selected item
       
 12405 			this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" );
       
 12406 			this.menuInstance.focus( null, this._getSelectedItem() );
       
 12407 		}
       
 12408 
       
 12409 		this.isOpen = true;
       
 12410 		this._toggleAttr();
       
 12411 		this._resizeMenu();
       
 12412 		this._position();
       
 12413 
       
 12414 		this._on( this.document, this._documentClick );
       
 12415 
       
 12416 		this._trigger( "open", event );
       
 12417 	},
       
 12418 
       
 12419 	_position: function() {
       
 12420 		this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
       
 12421 	},
       
 12422 
       
 12423 	close: function( event ) {
       
 12424 		if ( !this.isOpen ) {
       
 12425 			return;
       
 12426 		}
       
 12427 
       
 12428 		this.isOpen = false;
       
 12429 		this._toggleAttr();
       
 12430 
       
 12431 		this.range = null;
       
 12432 		this._off( this.document );
       
 12433 
       
 12434 		this._trigger( "close", event );
       
 12435 	},
       
 12436 
       
 12437 	widget: function() {
       
 12438 		return this.button;
       
 12439 	},
       
 12440 
       
 12441 	menuWidget: function() {
       
 12442 		return this.menu;
       
 12443 	},
       
 12444 
       
 12445 	_renderMenu: function( ul, items ) {
       
 12446 		var that = this,
       
 12447 			currentOptgroup = "";
       
 12448 
       
 12449 		$.each( items, function( index, item ) {
       
 12450 			if ( item.optgroup !== currentOptgroup ) {
       
 12451 				$( "<li>", {
       
 12452 					"class": "ui-selectmenu-optgroup ui-menu-divider" +
       
 12453 						( item.element.parent( "optgroup" ).prop( "disabled" ) ?
       
 12454 							" ui-state-disabled" :
       
 12455 							"" ),
       
 12456 					text: item.optgroup
       
 12457 				})
       
 12458 					.appendTo( ul );
       
 12459 
       
 12460 				currentOptgroup = item.optgroup;
       
 12461 			}
       
 12462 
       
 12463 			that._renderItemData( ul, item );
       
 12464 		});
       
 12465 	},
       
 12466 
       
 12467 	_renderItemData: function( ul, item ) {
       
 12468 		return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
       
 12469 	},
       
 12470 
       
 12471 	_renderItem: function( ul, item ) {
       
 12472 		var li = $( "<li>" );
       
 12473 
       
 12474 		if ( item.disabled ) {
       
 12475 			li.addClass( "ui-state-disabled" );
       
 12476 		}
       
 12477 		this._setText( li, item.label );
       
 12478 
       
 12479 		return li.appendTo( ul );
       
 12480 	},
       
 12481 
       
 12482 	_setText: function( element, value ) {
       
 12483 		if ( value ) {
       
 12484 			element.text( value );
       
 12485 		} else {
       
 12486 			element.html( "&#160;" );
       
 12487 		}
       
 12488 	},
       
 12489 
       
 12490 	_move: function( direction, event ) {
       
 12491 		var item, next,
       
 12492 			filter = ".ui-menu-item";
       
 12493 
       
 12494 		if ( this.isOpen ) {
       
 12495 			item = this.menuItems.eq( this.focusIndex );
       
 12496 		} else {
       
 12497 			item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
       
 12498 			filter += ":not(.ui-state-disabled)";
       
 12499 		}
       
 12500 
       
 12501 		if ( direction === "first" || direction === "last" ) {
       
 12502 			next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
       
 12503 		} else {
       
 12504 			next = item[ direction + "All" ]( filter ).eq( 0 );
       
 12505 		}
       
 12506 
       
 12507 		if ( next.length ) {
       
 12508 			this.menuInstance.focus( event, next );
       
 12509 		}
       
 12510 	},
       
 12511 
       
 12512 	_getSelectedItem: function() {
       
 12513 		return this.menuItems.eq( this.element[ 0 ].selectedIndex );
       
 12514 	},
       
 12515 
       
 12516 	_toggle: function( event ) {
       
 12517 		this[ this.isOpen ? "close" : "open" ]( event );
       
 12518 	},
       
 12519 
       
 12520 	_setSelection: function() {
       
 12521 		var selection;
       
 12522 
       
 12523 		if ( !this.range ) {
       
 12524 			return;
       
 12525 		}
       
 12526 
       
 12527 		if ( window.getSelection ) {
       
 12528 			selection = window.getSelection();
       
 12529 			selection.removeAllRanges();
       
 12530 			selection.addRange( this.range );
       
 12531 
       
 12532 		// support: IE8
       
 12533 		} else {
       
 12534 			this.range.select();
       
 12535 		}
       
 12536 
       
 12537 		// support: IE
       
 12538 		// Setting the text selection kills the button focus in IE, but
       
 12539 		// restoring the focus doesn't kill the selection.
       
 12540 		this.button.focus();
       
 12541 	},
       
 12542 
       
 12543 	_documentClick: {
       
 12544 		mousedown: function( event ) {
       
 12545 			if ( !this.isOpen ) {
       
 12546 				return;
       
 12547 			}
       
 12548 
       
 12549 			if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) {
       
 12550 				this.close( event );
       
 12551 			}
       
 12552 		}
       
 12553 	},
       
 12554 
       
 12555 	_buttonEvents: {
       
 12556 
       
 12557 		// Prevent text selection from being reset when interacting with the selectmenu (#10144)
       
 12558 		mousedown: function() {
       
 12559 			var selection;
       
 12560 
       
 12561 			if ( window.getSelection ) {
       
 12562 				selection = window.getSelection();
       
 12563 				if ( selection.rangeCount ) {
       
 12564 					this.range = selection.getRangeAt( 0 );
       
 12565 				}
       
 12566 
       
 12567 			// support: IE8
       
 12568 			} else {
       
 12569 				this.range = document.selection.createRange();
       
 12570 			}
       
 12571 		},
       
 12572 
       
 12573 		click: function( event ) {
       
 12574 			this._setSelection();
       
 12575 			this._toggle( event );
       
 12576 		},
       
 12577 
       
 12578 		keydown: function( event ) {
       
 12579 			var preventDefault = true;
       
 12580 			switch ( event.keyCode ) {
       
 12581 				case $.ui.keyCode.TAB:
       
 12582 				case $.ui.keyCode.ESCAPE:
       
 12583 					this.close( event );
       
 12584 					preventDefault = false;
       
 12585 					break;
       
 12586 				case $.ui.keyCode.ENTER:
       
 12587 					if ( this.isOpen ) {
       
 12588 						this._selectFocusedItem( event );
       
 12589 					}
       
 12590 					break;
       
 12591 				case $.ui.keyCode.UP:
       
 12592 					if ( event.altKey ) {
       
 12593 						this._toggle( event );
       
 12594 					} else {
       
 12595 						this._move( "prev", event );
       
 12596 					}
       
 12597 					break;
       
 12598 				case $.ui.keyCode.DOWN:
       
 12599 					if ( event.altKey ) {
       
 12600 						this._toggle( event );
       
 12601 					} else {
       
 12602 						this._move( "next", event );
       
 12603 					}
       
 12604 					break;
       
 12605 				case $.ui.keyCode.SPACE:
       
 12606 					if ( this.isOpen ) {
       
 12607 						this._selectFocusedItem( event );
       
 12608 					} else {
       
 12609 						this._toggle( event );
       
 12610 					}
       
 12611 					break;
       
 12612 				case $.ui.keyCode.LEFT:
       
 12613 					this._move( "prev", event );
       
 12614 					break;
       
 12615 				case $.ui.keyCode.RIGHT:
       
 12616 					this._move( "next", event );
       
 12617 					break;
       
 12618 				case $.ui.keyCode.HOME:
       
 12619 				case $.ui.keyCode.PAGE_UP:
       
 12620 					this._move( "first", event );
       
 12621 					break;
       
 12622 				case $.ui.keyCode.END:
       
 12623 				case $.ui.keyCode.PAGE_DOWN:
       
 12624 					this._move( "last", event );
       
 12625 					break;
       
 12626 				default:
       
 12627 					this.menu.trigger( event );
       
 12628 					preventDefault = false;
       
 12629 			}
       
 12630 
       
 12631 			if ( preventDefault ) {
       
 12632 				event.preventDefault();
       
 12633 			}
       
 12634 		}
       
 12635 	},
       
 12636 
       
 12637 	_selectFocusedItem: function( event ) {
       
 12638 		var item = this.menuItems.eq( this.focusIndex );
       
 12639 		if ( !item.hasClass( "ui-state-disabled" ) ) {
       
 12640 			this._select( item.data( "ui-selectmenu-item" ), event );
       
 12641 		}
       
 12642 	},
       
 12643 
       
 12644 	_select: function( item, event ) {
       
 12645 		var oldIndex = this.element[ 0 ].selectedIndex;
       
 12646 
       
 12647 		// Change native select element
       
 12648 		this.element[ 0 ].selectedIndex = item.index;
       
 12649 		this._setText( this.buttonText, item.label );
       
 12650 		this._setAria( item );
       
 12651 		this._trigger( "select", event, { item: item } );
       
 12652 
       
 12653 		if ( item.index !== oldIndex ) {
       
 12654 			this._trigger( "change", event, { item: item } );
       
 12655 		}
       
 12656 
       
 12657 		this.close( event );
       
 12658 	},
       
 12659 
       
 12660 	_setAria: function( item ) {
       
 12661 		var id = this.menuItems.eq( item.index ).attr( "id" );
       
 12662 
       
 12663 		this.button.attr({
       
 12664 			"aria-labelledby": id,
       
 12665 			"aria-activedescendant": id
       
 12666 		});
       
 12667 		this.menu.attr( "aria-activedescendant", id );
       
 12668 	},
       
 12669 
       
 12670 	_setOption: function( key, value ) {
       
 12671 		if ( key === "icons" ) {
       
 12672 			this.button.find( "span.ui-icon" )
       
 12673 				.removeClass( this.options.icons.button )
       
 12674 				.addClass( value.button );
       
 12675 		}
       
 12676 
       
 12677 		this._super( key, value );
       
 12678 
       
 12679 		if ( key === "appendTo" ) {
       
 12680 			this.menuWrap.appendTo( this._appendTo() );
       
 12681 		}
       
 12682 
       
 12683 		if ( key === "disabled" ) {
       
 12684 			this.menuInstance.option( "disabled", value );
       
 12685 			this.button
       
 12686 				.toggleClass( "ui-state-disabled", value )
       
 12687 				.attr( "aria-disabled", value );
       
 12688 
       
 12689 			this.element.prop( "disabled", value );
       
 12690 			if ( value ) {
       
 12691 				this.button.attr( "tabindex", -1 );
       
 12692 				this.close();
       
 12693 			} else {
       
 12694 				this.button.attr( "tabindex", 0 );
       
 12695 			}
       
 12696 		}
       
 12697 
       
 12698 		if ( key === "width" ) {
       
 12699 			this._resizeButton();
       
 12700 		}
       
 12701 	},
       
 12702 
       
 12703 	_appendTo: function() {
       
 12704 		var element = this.options.appendTo;
       
 12705 
       
 12706 		if ( element ) {
       
 12707 			element = element.jquery || element.nodeType ?
       
 12708 				$( element ) :
       
 12709 				this.document.find( element ).eq( 0 );
       
 12710 		}
       
 12711 
       
 12712 		if ( !element || !element[ 0 ] ) {
       
 12713 			element = this.element.closest( ".ui-front" );
       
 12714 		}
       
 12715 
       
 12716 		if ( !element.length ) {
       
 12717 			element = this.document[ 0 ].body;
       
 12718 		}
       
 12719 
       
 12720 		return element;
       
 12721 	},
       
 12722 
       
 12723 	_toggleAttr: function() {
       
 12724 		this.button
       
 12725 			.toggleClass( "ui-corner-top", this.isOpen )
       
 12726 			.toggleClass( "ui-corner-all", !this.isOpen )
       
 12727 			.attr( "aria-expanded", this.isOpen );
       
 12728 		this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
       
 12729 		this.menu.attr( "aria-hidden", !this.isOpen );
       
 12730 	},
       
 12731 
       
 12732 	_resizeButton: function() {
       
 12733 		var width = this.options.width;
       
 12734 
       
 12735 		if ( !width ) {
       
 12736 			width = this.element.show().outerWidth();
       
 12737 			this.element.hide();
       
 12738 		}
       
 12739 
       
 12740 		this.button.outerWidth( width );
       
 12741 	},
       
 12742 
       
 12743 	_resizeMenu: function() {
       
 12744 		this.menu.outerWidth( Math.max(
       
 12745 			this.button.outerWidth(),
       
 12746 
       
 12747 			// support: IE10
       
 12748 			// IE10 wraps long text (possibly a rounding bug)
       
 12749 			// so we add 1px to avoid the wrapping
       
 12750 			this.menu.width( "" ).outerWidth() + 1
       
 12751 		) );
       
 12752 	},
       
 12753 
       
 12754 	_getCreateOptions: function() {
       
 12755 		return { disabled: this.element.prop( "disabled" ) };
       
 12756 	},
       
 12757 
       
 12758 	_parseOptions: function( options ) {
       
 12759 		var data = [];
       
 12760 		options.each(function( index, item ) {
       
 12761 			var option = $( item ),
       
 12762 				optgroup = option.parent( "optgroup" );
       
 12763 			data.push({
       
 12764 				element: option,
       
 12765 				index: index,
       
 12766 				value: option.val(),
       
 12767 				label: option.text(),
       
 12768 				optgroup: optgroup.attr( "label" ) || "",
       
 12769 				disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
       
 12770 			});
       
 12771 		});
       
 12772 		this.items = data;
       
 12773 	},
       
 12774 
       
 12775 	_destroy: function() {
       
 12776 		this.menuWrap.remove();
       
 12777 		this.button.remove();
       
 12778 		this.element.show();
       
 12779 		this.element.removeUniqueId();
       
 12780 		this.label.attr( "for", this.ids.element );
       
 12781 	}
       
 12782 });
       
 12783 
       
 12784 
       
 12785 /*!
       
 12786  * jQuery UI Slider 1.11.4
       
 12787  * http://jqueryui.com
       
 12788  *
       
 12789  * Copyright jQuery Foundation and other contributors
       
 12790  * Released under the MIT license.
       
 12791  * http://jquery.org/license
       
 12792  *
       
 12793  * http://api.jqueryui.com/slider/
       
 12794  */
       
 12795 
       
 12796 
       
 12797 var slider = $.widget( "ui.slider", $.ui.mouse, {
       
 12798 	version: "1.11.4",
       
 12799 	widgetEventPrefix: "slide",
       
 12800 
       
 12801 	options: {
       
 12802 		animate: false,
       
 12803 		distance: 0,
       
 12804 		max: 100,
       
 12805 		min: 0,
       
 12806 		orientation: "horizontal",
       
 12807 		range: false,
       
 12808 		step: 1,
       
 12809 		value: 0,
       
 12810 		values: null,
       
 12811 
       
 12812 		// callbacks
       
 12813 		change: null,
       
 12814 		slide: null,
       
 12815 		start: null,
       
 12816 		stop: null
       
 12817 	},
       
 12818 
       
 12819 	// number of pages in a slider
       
 12820 	// (how many times can you page up/down to go through the whole range)
       
 12821 	numPages: 5,
       
 12822 
       
 12823 	_create: function() {
       
 12824 		this._keySliding = false;
       
 12825 		this._mouseSliding = false;
       
 12826 		this._animateOff = true;
       
 12827 		this._handleIndex = null;
       
 12828 		this._detectOrientation();
       
 12829 		this._mouseInit();
       
 12830 		this._calculateNewMax();
       
 12831 
       
 12832 		this.element
       
 12833 			.addClass( "ui-slider" +
       
 12834 				" ui-slider-" + this.orientation +
       
 12835 				" ui-widget" +
       
 12836 				" ui-widget-content" +
       
 12837 				" ui-corner-all");
       
 12838 
       
 12839 		this._refresh();
       
 12840 		this._setOption( "disabled", this.options.disabled );
       
 12841 
       
 12842 		this._animateOff = false;
       
 12843 	},
       
 12844 
       
 12845 	_refresh: function() {
       
 12846 		this._createRange();
       
 12847 		this._createHandles();
       
 12848 		this._setupEvents();
       
 12849 		this._refreshValue();
       
 12850 	},
       
 12851 
       
 12852 	_createHandles: function() {
       
 12853 		var i, handleCount,
       
 12854 			options = this.options,
       
 12855 			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
       
 12856 			handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",
       
 12857 			handles = [];
       
 12858 
       
 12859 		handleCount = ( options.values && options.values.length ) || 1;
       
 12860 
       
 12861 		if ( existingHandles.length > handleCount ) {
       
 12862 			existingHandles.slice( handleCount ).remove();
       
 12863 			existingHandles = existingHandles.slice( 0, handleCount );
       
 12864 		}
       
 12865 
       
 12866 		for ( i = existingHandles.length; i < handleCount; i++ ) {
       
 12867 			handles.push( handle );
       
 12868 		}
       
 12869 
       
 12870 		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
       
 12871 
       
 12872 		this.handle = this.handles.eq( 0 );
       
 12873 
       
 12874 		this.handles.each(function( i ) {
       
 12875 			$( this ).data( "ui-slider-handle-index", i );
       
 12876 		});
       
 12877 	},
       
 12878 
       
 12879 	_createRange: function() {
       
 12880 		var options = this.options,
       
 12881 			classes = "";
       
 12882 
       
 12883 		if ( options.range ) {
       
 12884 			if ( options.range === true ) {
       
 12885 				if ( !options.values ) {
       
 12886 					options.values = [ this._valueMin(), this._valueMin() ];
       
 12887 				} else if ( options.values.length && options.values.length !== 2 ) {
       
 12888 					options.values = [ options.values[0], options.values[0] ];
       
 12889 				} else if ( $.isArray( options.values ) ) {
       
 12890 					options.values = options.values.slice(0);
       
 12891 				}
       
 12892 			}
       
 12893 
       
 12894 			if ( !this.range || !this.range.length ) {
       
 12895 				this.range = $( "<div></div>" )
       
 12896 					.appendTo( this.element );
       
 12897 
       
 12898 				classes = "ui-slider-range" +
       
 12899 				// note: this isn't the most fittingly semantic framework class for this element,
       
 12900 				// but worked best visually with a variety of themes
       
 12901 				" ui-widget-header ui-corner-all";
       
 12902 			} else {
       
 12903 				this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
       
 12904 					// Handle range switching from true to min/max
       
 12905 					.css({
       
 12906 						"left": "",
       
 12907 						"bottom": ""
       
 12908 					});
       
 12909 			}
       
 12910 
       
 12911 			this.range.addClass( classes +
       
 12912 				( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
       
 12913 		} else {
       
 12914 			if ( this.range ) {
       
 12915 				this.range.remove();
       
 12916 			}
       
 12917 			this.range = null;
       
 12918 		}
       
 12919 	},
       
 12920 
       
 12921 	_setupEvents: function() {
       
 12922 		this._off( this.handles );
       
 12923 		this._on( this.handles, this._handleEvents );
       
 12924 		this._hoverable( this.handles );
       
 12925 		this._focusable( this.handles );
       
 12926 	},
       
 12927 
       
 12928 	_destroy: function() {
       
 12929 		this.handles.remove();
       
 12930 		if ( this.range ) {
       
 12931 			this.range.remove();
       
 12932 		}
       
 12933 
       
 12934 		this.element
       
 12935 			.removeClass( "ui-slider" +
       
 12936 				" ui-slider-horizontal" +
       
 12937 				" ui-slider-vertical" +
       
 12938 				" ui-widget" +
       
 12939 				" ui-widget-content" +
       
 12940 				" ui-corner-all" );
       
 12941 
       
 12942 		this._mouseDestroy();
       
 12943 	},
       
 12944 
       
 12945 	_mouseCapture: function( event ) {
       
 12946 		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
       
 12947 			that = this,
       
 12948 			o = this.options;
       
 12949 
       
 12950 		if ( o.disabled ) {
       
 12951 			return false;
       
 12952 		}
       
 12953 
       
 12954 		this.elementSize = {
       
 12955 			width: this.element.outerWidth(),
       
 12956 			height: this.element.outerHeight()
       
 12957 		};
       
 12958 		this.elementOffset = this.element.offset();
       
 12959 
       
 12960 		position = { x: event.pageX, y: event.pageY };
       
 12961 		normValue = this._normValueFromMouse( position );
       
 12962 		distance = this._valueMax() - this._valueMin() + 1;
       
 12963 		this.handles.each(function( i ) {
       
 12964 			var thisDistance = Math.abs( normValue - that.values(i) );
       
 12965 			if (( distance > thisDistance ) ||
       
 12966 				( distance === thisDistance &&
       
 12967 					(i === that._lastChangedValue || that.values(i) === o.min ))) {
       
 12968 				distance = thisDistance;
       
 12969 				closestHandle = $( this );
       
 12970 				index = i;
       
 12971 			}
       
 12972 		});
       
 12973 
       
 12974 		allowed = this._start( event, index );
       
 12975 		if ( allowed === false ) {
       
 12976 			return false;
       
 12977 		}
       
 12978 		this._mouseSliding = true;
       
 12979 
       
 12980 		this._handleIndex = index;
       
 12981 
       
 12982 		closestHandle
       
 12983 			.addClass( "ui-state-active" )
       
 12984 			.focus();
       
 12985 
       
 12986 		offset = closestHandle.offset();
       
 12987 		mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
       
 12988 		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
       
 12989 			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
       
 12990 			top: event.pageY - offset.top -
       
 12991 				( closestHandle.height() / 2 ) -
       
 12992 				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
       
 12993 				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
       
 12994 				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
       
 12995 		};
       
 12996 
       
 12997 		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
       
 12998 			this._slide( event, index, normValue );
       
 12999 		}
       
 13000 		this._animateOff = true;
       
 13001 		return true;
       
 13002 	},
       
 13003 
       
 13004 	_mouseStart: function() {
       
 13005 		return true;
       
 13006 	},
       
 13007 
       
 13008 	_mouseDrag: function( event ) {
       
 13009 		var position = { x: event.pageX, y: event.pageY },
       
 13010 			normValue = this._normValueFromMouse( position );
       
 13011 
       
 13012 		this._slide( event, this._handleIndex, normValue );
       
 13013 
       
 13014 		return false;
       
 13015 	},
       
 13016 
       
 13017 	_mouseStop: function( event ) {
       
 13018 		this.handles.removeClass( "ui-state-active" );
       
 13019 		this._mouseSliding = false;
       
 13020 
       
 13021 		this._stop( event, this._handleIndex );
       
 13022 		this._change( event, this._handleIndex );
       
 13023 
       
 13024 		this._handleIndex = null;
       
 13025 		this._clickOffset = null;
       
 13026 		this._animateOff = false;
       
 13027 
       
 13028 		return false;
       
 13029 	},
       
 13030 
       
 13031 	_detectOrientation: function() {
       
 13032 		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
       
 13033 	},
       
 13034 
       
 13035 	_normValueFromMouse: function( position ) {
       
 13036 		var pixelTotal,
       
 13037 			pixelMouse,
       
 13038 			percentMouse,
       
 13039 			valueTotal,
       
 13040 			valueMouse;
       
 13041 
       
 13042 		if ( this.orientation === "horizontal" ) {
       
 13043 			pixelTotal = this.elementSize.width;
       
 13044 			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
       
 13045 		} else {
       
 13046 			pixelTotal = this.elementSize.height;
       
 13047 			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
       
 13048 		}
       
 13049 
       
 13050 		percentMouse = ( pixelMouse / pixelTotal );
       
 13051 		if ( percentMouse > 1 ) {
       
 13052 			percentMouse = 1;
       
 13053 		}
       
 13054 		if ( percentMouse < 0 ) {
       
 13055 			percentMouse = 0;
       
 13056 		}
       
 13057 		if ( this.orientation === "vertical" ) {
       
 13058 			percentMouse = 1 - percentMouse;
       
 13059 		}
       
 13060 
       
 13061 		valueTotal = this._valueMax() - this._valueMin();
       
 13062 		valueMouse = this._valueMin() + percentMouse * valueTotal;
       
 13063 
       
 13064 		return this._trimAlignValue( valueMouse );
       
 13065 	},
       
 13066 
       
 13067 	_start: function( event, index ) {
       
 13068 		var uiHash = {
       
 13069 			handle: this.handles[ index ],
       
 13070 			value: this.value()
       
 13071 		};
       
 13072 		if ( this.options.values && this.options.values.length ) {
       
 13073 			uiHash.value = this.values( index );
       
 13074 			uiHash.values = this.values();
       
 13075 		}
       
 13076 		return this._trigger( "start", event, uiHash );
       
 13077 	},
       
 13078 
       
 13079 	_slide: function( event, index, newVal ) {
       
 13080 		var otherVal,
       
 13081 			newValues,
       
 13082 			allowed;
       
 13083 
       
 13084 		if ( this.options.values && this.options.values.length ) {
       
 13085 			otherVal = this.values( index ? 0 : 1 );
       
 13086 
       
 13087 			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
       
 13088 					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
       
 13089 				) {
       
 13090 				newVal = otherVal;
       
 13091 			}
       
 13092 
       
 13093 			if ( newVal !== this.values( index ) ) {
       
 13094 				newValues = this.values();
       
 13095 				newValues[ index ] = newVal;
       
 13096 				// A slide can be canceled by returning false from the slide callback
       
 13097 				allowed = this._trigger( "slide", event, {
       
 13098 					handle: this.handles[ index ],
       
 13099 					value: newVal,
       
 13100 					values: newValues
       
 13101 				} );
       
 13102 				otherVal = this.values( index ? 0 : 1 );
       
 13103 				if ( allowed !== false ) {
       
 13104 					this.values( index, newVal );
       
 13105 				}
       
 13106 			}
       
 13107 		} else {
       
 13108 			if ( newVal !== this.value() ) {
       
 13109 				// A slide can be canceled by returning false from the slide callback
       
 13110 				allowed = this._trigger( "slide", event, {
       
 13111 					handle: this.handles[ index ],
       
 13112 					value: newVal
       
 13113 				} );
       
 13114 				if ( allowed !== false ) {
       
 13115 					this.value( newVal );
       
 13116 				}
       
 13117 			}
       
 13118 		}
       
 13119 	},
       
 13120 
       
 13121 	_stop: function( event, index ) {
       
 13122 		var uiHash = {
       
 13123 			handle: this.handles[ index ],
       
 13124 			value: this.value()
       
 13125 		};
       
 13126 		if ( this.options.values && this.options.values.length ) {
       
 13127 			uiHash.value = this.values( index );
       
 13128 			uiHash.values = this.values();
       
 13129 		}
       
 13130 
       
 13131 		this._trigger( "stop", event, uiHash );
       
 13132 	},
       
 13133 
       
 13134 	_change: function( event, index ) {
       
 13135 		if ( !this._keySliding && !this._mouseSliding ) {
       
 13136 			var uiHash = {
       
 13137 				handle: this.handles[ index ],
       
 13138 				value: this.value()
       
 13139 			};
       
 13140 			if ( this.options.values && this.options.values.length ) {
       
 13141 				uiHash.value = this.values( index );
       
 13142 				uiHash.values = this.values();
       
 13143 			}
       
 13144 
       
 13145 			//store the last changed value index for reference when handles overlap
       
 13146 			this._lastChangedValue = index;
       
 13147 
       
 13148 			this._trigger( "change", event, uiHash );
       
 13149 		}
       
 13150 	},
       
 13151 
       
 13152 	value: function( newValue ) {
       
 13153 		if ( arguments.length ) {
       
 13154 			this.options.value = this._trimAlignValue( newValue );
       
 13155 			this._refreshValue();
       
 13156 			this._change( null, 0 );
       
 13157 			return;
       
 13158 		}
       
 13159 
       
 13160 		return this._value();
       
 13161 	},
       
 13162 
       
 13163 	values: function( index, newValue ) {
       
 13164 		var vals,
       
 13165 			newValues,
       
 13166 			i;
       
 13167 
       
 13168 		if ( arguments.length > 1 ) {
       
 13169 			this.options.values[ index ] = this._trimAlignValue( newValue );
       
 13170 			this._refreshValue();
       
 13171 			this._change( null, index );
       
 13172 			return;
       
 13173 		}
       
 13174 
       
 13175 		if ( arguments.length ) {
       
 13176 			if ( $.isArray( arguments[ 0 ] ) ) {
       
 13177 				vals = this.options.values;
       
 13178 				newValues = arguments[ 0 ];
       
 13179 				for ( i = 0; i < vals.length; i += 1 ) {
       
 13180 					vals[ i ] = this._trimAlignValue( newValues[ i ] );
       
 13181 					this._change( null, i );
       
 13182 				}
       
 13183 				this._refreshValue();
       
 13184 			} else {
       
 13185 				if ( this.options.values && this.options.values.length ) {
       
 13186 					return this._values( index );
       
 13187 				} else {
       
 13188 					return this.value();
       
 13189 				}
       
 13190 			}
       
 13191 		} else {
       
 13192 			return this._values();
       
 13193 		}
       
 13194 	},
       
 13195 
       
 13196 	_setOption: function( key, value ) {
       
 13197 		var i,
       
 13198 			valsLength = 0;
       
 13199 
       
 13200 		if ( key === "range" && this.options.range === true ) {
       
 13201 			if ( value === "min" ) {
       
 13202 				this.options.value = this._values( 0 );
       
 13203 				this.options.values = null;
       
 13204 			} else if ( value === "max" ) {
       
 13205 				this.options.value = this._values( this.options.values.length - 1 );
       
 13206 				this.options.values = null;
       
 13207 			}
       
 13208 		}
       
 13209 
       
 13210 		if ( $.isArray( this.options.values ) ) {
       
 13211 			valsLength = this.options.values.length;
       
 13212 		}
       
 13213 
       
 13214 		if ( key === "disabled" ) {
       
 13215 			this.element.toggleClass( "ui-state-disabled", !!value );
       
 13216 		}
       
 13217 
       
 13218 		this._super( key, value );
       
 13219 
       
 13220 		switch ( key ) {
       
 13221 			case "orientation":
       
 13222 				this._detectOrientation();
       
 13223 				this.element
       
 13224 					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
       
 13225 					.addClass( "ui-slider-" + this.orientation );
       
 13226 				this._refreshValue();
       
 13227 
       
 13228 				// Reset positioning from previous orientation
       
 13229 				this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
       
 13230 				break;
       
 13231 			case "value":
       
 13232 				this._animateOff = true;
       
 13233 				this._refreshValue();
       
 13234 				this._change( null, 0 );
       
 13235 				this._animateOff = false;
       
 13236 				break;
       
 13237 			case "values":
       
 13238 				this._animateOff = true;
       
 13239 				this._refreshValue();
       
 13240 				for ( i = 0; i < valsLength; i += 1 ) {
       
 13241 					this._change( null, i );
       
 13242 				}
       
 13243 				this._animateOff = false;
       
 13244 				break;
       
 13245 			case "step":
       
 13246 			case "min":
       
 13247 			case "max":
       
 13248 				this._animateOff = true;
       
 13249 				this._calculateNewMax();
       
 13250 				this._refreshValue();
       
 13251 				this._animateOff = false;
       
 13252 				break;
       
 13253 			case "range":
       
 13254 				this._animateOff = true;
       
 13255 				this._refresh();
       
 13256 				this._animateOff = false;
       
 13257 				break;
       
 13258 		}
       
 13259 	},
       
 13260 
       
 13261 	//internal value getter
       
 13262 	// _value() returns value trimmed by min and max, aligned by step
       
 13263 	_value: function() {
       
 13264 		var val = this.options.value;
       
 13265 		val = this._trimAlignValue( val );
       
 13266 
       
 13267 		return val;
       
 13268 	},
       
 13269 
       
 13270 	//internal values getter
       
 13271 	// _values() returns array of values trimmed by min and max, aligned by step
       
 13272 	// _values( index ) returns single value trimmed by min and max, aligned by step
       
 13273 	_values: function( index ) {
       
 13274 		var val,
       
 13275 			vals,
       
 13276 			i;
       
 13277 
       
 13278 		if ( arguments.length ) {
       
 13279 			val = this.options.values[ index ];
       
 13280 			val = this._trimAlignValue( val );
       
 13281 
       
 13282 			return val;
       
 13283 		} else if ( this.options.values && this.options.values.length ) {
       
 13284 			// .slice() creates a copy of the array
       
 13285 			// this copy gets trimmed by min and max and then returned
       
 13286 			vals = this.options.values.slice();
       
 13287 			for ( i = 0; i < vals.length; i += 1) {
       
 13288 				vals[ i ] = this._trimAlignValue( vals[ i ] );
       
 13289 			}
       
 13290 
       
 13291 			return vals;
       
 13292 		} else {
       
 13293 			return [];
       
 13294 		}
       
 13295 	},
       
 13296 
       
 13297 	// returns the step-aligned value that val is closest to, between (inclusive) min and max
       
 13298 	_trimAlignValue: function( val ) {
       
 13299 		if ( val <= this._valueMin() ) {
       
 13300 			return this._valueMin();
       
 13301 		}
       
 13302 		if ( val >= this._valueMax() ) {
       
 13303 			return this._valueMax();
       
 13304 		}
       
 13305 		var step = ( this.options.step > 0 ) ? this.options.step : 1,
       
 13306 			valModStep = (val - this._valueMin()) % step,
       
 13307 			alignValue = val - valModStep;
       
 13308 
       
 13309 		if ( Math.abs(valModStep) * 2 >= step ) {
       
 13310 			alignValue += ( valModStep > 0 ) ? step : ( -step );
       
 13311 		}
       
 13312 
       
 13313 		// Since JavaScript has problems with large floats, round
       
 13314 		// the final value to 5 digits after the decimal point (see #4124)
       
 13315 		return parseFloat( alignValue.toFixed(5) );
       
 13316 	},
       
 13317 
       
 13318 	_calculateNewMax: function() {
       
 13319 		var max = this.options.max,
       
 13320 			min = this._valueMin(),
       
 13321 			step = this.options.step,
       
 13322 			aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;
       
 13323 		max = aboveMin + min;
       
 13324 		this.max = parseFloat( max.toFixed( this._precision() ) );
       
 13325 	},
       
 13326 
       
 13327 	_precision: function() {
       
 13328 		var precision = this._precisionOf( this.options.step );
       
 13329 		if ( this.options.min !== null ) {
       
 13330 			precision = Math.max( precision, this._precisionOf( this.options.min ) );
       
 13331 		}
       
 13332 		return precision;
       
 13333 	},
       
 13334 
       
 13335 	_precisionOf: function( num ) {
       
 13336 		var str = num.toString(),
       
 13337 			decimal = str.indexOf( "." );
       
 13338 		return decimal === -1 ? 0 : str.length - decimal - 1;
       
 13339 	},
       
 13340 
       
 13341 	_valueMin: function() {
       
 13342 		return this.options.min;
       
 13343 	},
       
 13344 
       
 13345 	_valueMax: function() {
       
 13346 		return this.max;
       
 13347 	},
       
 13348 
       
 13349 	_refreshValue: function() {
       
 13350 		var lastValPercent, valPercent, value, valueMin, valueMax,
       
 13351 			oRange = this.options.range,
       
 13352 			o = this.options,
       
 13353 			that = this,
       
 13354 			animate = ( !this._animateOff ) ? o.animate : false,
       
 13355 			_set = {};
       
 13356 
       
 13357 		if ( this.options.values && this.options.values.length ) {
       
 13358 			this.handles.each(function( i ) {
       
 13359 				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
       
 13360 				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
       
 13361 				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
       
 13362 				if ( that.options.range === true ) {
       
 13363 					if ( that.orientation === "horizontal" ) {
       
 13364 						if ( i === 0 ) {
       
 13365 							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
       
 13366 						}
       
 13367 						if ( i === 1 ) {
       
 13368 							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
       
 13369 						}
       
 13370 					} else {
       
 13371 						if ( i === 0 ) {
       
 13372 							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
       
 13373 						}
       
 13374 						if ( i === 1 ) {
       
 13375 							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
       
 13376 						}
       
 13377 					}
       
 13378 				}
       
 13379 				lastValPercent = valPercent;
       
 13380 			});
       
 13381 		} else {
       
 13382 			value = this.value();
       
 13383 			valueMin = this._valueMin();
       
 13384 			valueMax = this._valueMax();
       
 13385 			valPercent = ( valueMax !== valueMin ) ?
       
 13386 					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
       
 13387 					0;
       
 13388 			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
       
 13389 			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
       
 13390 
       
 13391 			if ( oRange === "min" && this.orientation === "horizontal" ) {
       
 13392 				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
       
 13393 			}
       
 13394 			if ( oRange === "max" && this.orientation === "horizontal" ) {
       
 13395 				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
       
 13396 			}
       
 13397 			if ( oRange === "min" && this.orientation === "vertical" ) {
       
 13398 				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
       
 13399 			}
       
 13400 			if ( oRange === "max" && this.orientation === "vertical" ) {
       
 13401 				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
       
 13402 			}
       
 13403 		}
       
 13404 	},
       
 13405 
       
 13406 	_handleEvents: {
       
 13407 		keydown: function( event ) {
       
 13408 			var allowed, curVal, newVal, step,
       
 13409 				index = $( event.target ).data( "ui-slider-handle-index" );
       
 13410 
       
 13411 			switch ( event.keyCode ) {
       
 13412 				case $.ui.keyCode.HOME:
       
 13413 				case $.ui.keyCode.END:
       
 13414 				case $.ui.keyCode.PAGE_UP:
       
 13415 				case $.ui.keyCode.PAGE_DOWN:
       
 13416 				case $.ui.keyCode.UP:
       
 13417 				case $.ui.keyCode.RIGHT:
       
 13418 				case $.ui.keyCode.DOWN:
       
 13419 				case $.ui.keyCode.LEFT:
       
 13420 					event.preventDefault();
       
 13421 					if ( !this._keySliding ) {
       
 13422 						this._keySliding = true;
       
 13423 						$( event.target ).addClass( "ui-state-active" );
       
 13424 						allowed = this._start( event, index );
       
 13425 						if ( allowed === false ) {
       
 13426 							return;
       
 13427 						}
       
 13428 					}
       
 13429 					break;
       
 13430 			}
       
 13431 
       
 13432 			step = this.options.step;
       
 13433 			if ( this.options.values && this.options.values.length ) {
       
 13434 				curVal = newVal = this.values( index );
       
 13435 			} else {
       
 13436 				curVal = newVal = this.value();
       
 13437 			}
       
 13438 
       
 13439 			switch ( event.keyCode ) {
       
 13440 				case $.ui.keyCode.HOME:
       
 13441 					newVal = this._valueMin();
       
 13442 					break;
       
 13443 				case $.ui.keyCode.END:
       
 13444 					newVal = this._valueMax();
       
 13445 					break;
       
 13446 				case $.ui.keyCode.PAGE_UP:
       
 13447 					newVal = this._trimAlignValue(
       
 13448 						curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
       
 13449 					);
       
 13450 					break;
       
 13451 				case $.ui.keyCode.PAGE_DOWN:
       
 13452 					newVal = this._trimAlignValue(
       
 13453 						curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
       
 13454 					break;
       
 13455 				case $.ui.keyCode.UP:
       
 13456 				case $.ui.keyCode.RIGHT:
       
 13457 					if ( curVal === this._valueMax() ) {
       
 13458 						return;
       
 13459 					}
       
 13460 					newVal = this._trimAlignValue( curVal + step );
       
 13461 					break;
       
 13462 				case $.ui.keyCode.DOWN:
       
 13463 				case $.ui.keyCode.LEFT:
       
 13464 					if ( curVal === this._valueMin() ) {
       
 13465 						return;
       
 13466 					}
       
 13467 					newVal = this._trimAlignValue( curVal - step );
       
 13468 					break;
       
 13469 			}
       
 13470 
       
 13471 			this._slide( event, index, newVal );
       
 13472 		},
       
 13473 		keyup: function( event ) {
       
 13474 			var index = $( event.target ).data( "ui-slider-handle-index" );
       
 13475 
       
 13476 			if ( this._keySliding ) {
       
 13477 				this._keySliding = false;
       
 13478 				this._stop( event, index );
       
 13479 				this._change( event, index );
       
 13480 				$( event.target ).removeClass( "ui-state-active" );
       
 13481 			}
       
 13482 		}
       
 13483 	}
       
 13484 });
       
 13485 
       
 13486 
       
 13487 /*!
       
 13488  * jQuery UI Sortable 1.11.4
       
 13489  * http://jqueryui.com
       
 13490  *
       
 13491  * Copyright jQuery Foundation and other contributors
       
 13492  * Released under the MIT license.
       
 13493  * http://jquery.org/license
       
 13494  *
       
 13495  * http://api.jqueryui.com/sortable/
       
 13496  */
       
 13497 
       
 13498 
       
 13499 var sortable = $.widget("ui.sortable", $.ui.mouse, {
       
 13500 	version: "1.11.4",
       
 13501 	widgetEventPrefix: "sort",
       
 13502 	ready: false,
       
 13503 	options: {
       
 13504 		appendTo: "parent",
       
 13505 		axis: false,
       
 13506 		connectWith: false,
       
 13507 		containment: false,
       
 13508 		cursor: "auto",
       
 13509 		cursorAt: false,
       
 13510 		dropOnEmpty: true,
       
 13511 		forcePlaceholderSize: false,
       
 13512 		forceHelperSize: false,
       
 13513 		grid: false,
       
 13514 		handle: false,
       
 13515 		helper: "original",
       
 13516 		items: "> *",
       
 13517 		opacity: false,
       
 13518 		placeholder: false,
       
 13519 		revert: false,
       
 13520 		scroll: true,
       
 13521 		scrollSensitivity: 20,
       
 13522 		scrollSpeed: 20,
       
 13523 		scope: "default",
       
 13524 		tolerance: "intersect",
       
 13525 		zIndex: 1000,
       
 13526 
       
 13527 		// callbacks
       
 13528 		activate: null,
       
 13529 		beforeStop: null,
       
 13530 		change: null,
       
 13531 		deactivate: null,
       
 13532 		out: null,
       
 13533 		over: null,
       
 13534 		receive: null,
       
 13535 		remove: null,
       
 13536 		sort: null,
       
 13537 		start: null,
       
 13538 		stop: null,
       
 13539 		update: null
       
 13540 	},
       
 13541 
       
 13542 	_isOverAxis: function( x, reference, size ) {
       
 13543 		return ( x >= reference ) && ( x < ( reference + size ) );
       
 13544 	},
       
 13545 
       
 13546 	_isFloating: function( item ) {
       
 13547 		return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
       
 13548 	},
       
 13549 
       
 13550 	_create: function() {
       
 13551 		this.containerCache = {};
       
 13552 		this.element.addClass("ui-sortable");
       
 13553 
       
 13554 		//Get the items
       
 13555 		this.refresh();
       
 13556 
       
 13557 		//Let's determine the parent's offset
       
 13558 		this.offset = this.element.offset();
       
 13559 
       
 13560 		//Initialize mouse events for interaction
       
 13561 		this._mouseInit();
       
 13562 
       
 13563 		this._setHandleClassName();
       
 13564 
       
 13565 		//We're ready to go
       
 13566 		this.ready = true;
       
 13567 
       
 13568 	},
       
 13569 
       
 13570 	_setOption: function( key, value ) {
       
 13571 		this._super( key, value );
       
 13572 
       
 13573 		if ( key === "handle" ) {
       
 13574 			this._setHandleClassName();
       
 13575 		}
       
 13576 	},
       
 13577 
       
 13578 	_setHandleClassName: function() {
       
 13579 		this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
       
 13580 		$.each( this.items, function() {
       
 13581 			( this.instance.options.handle ?
       
 13582 				this.item.find( this.instance.options.handle ) : this.item )
       
 13583 				.addClass( "ui-sortable-handle" );
       
 13584 		});
       
 13585 	},
       
 13586 
       
 13587 	_destroy: function() {
       
 13588 		this.element
       
 13589 			.removeClass( "ui-sortable ui-sortable-disabled" )
       
 13590 			.find( ".ui-sortable-handle" )
       
 13591 				.removeClass( "ui-sortable-handle" );
       
 13592 		this._mouseDestroy();
       
 13593 
       
 13594 		for ( var i = this.items.length - 1; i >= 0; i-- ) {
       
 13595 			this.items[i].item.removeData(this.widgetName + "-item");
       
 13596 		}
       
 13597 
       
 13598 		return this;
       
 13599 	},
       
 13600 
       
 13601 	_mouseCapture: function(event, overrideHandle) {
       
 13602 		var currentItem = null,
       
 13603 			validHandle = false,
       
 13604 			that = this;
       
 13605 
       
 13606 		if (this.reverting) {
       
 13607 			return false;
       
 13608 		}
       
 13609 
       
 13610 		if(this.options.disabled || this.options.type === "static") {
       
 13611 			return false;
       
 13612 		}
       
 13613 
       
 13614 		//We have to refresh the items data once first
       
 13615 		this._refreshItems(event);
       
 13616 
       
 13617 		//Find out if the clicked node (or one of its parents) is a actual item in this.items
       
 13618 		$(event.target).parents().each(function() {
       
 13619 			if($.data(this, that.widgetName + "-item") === that) {
       
 13620 				currentItem = $(this);
       
 13621 				return false;
       
 13622 			}
       
 13623 		});
       
 13624 		if($.data(event.target, that.widgetName + "-item") === that) {
       
 13625 			currentItem = $(event.target);
       
 13626 		}
       
 13627 
       
 13628 		if(!currentItem) {
       
 13629 			return false;
       
 13630 		}
       
 13631 		if(this.options.handle && !overrideHandle) {
       
 13632 			$(this.options.handle, currentItem).find("*").addBack().each(function() {
       
 13633 				if(this === event.target) {
       
 13634 					validHandle = true;
       
 13635 				}
       
 13636 			});
       
 13637 			if(!validHandle) {
       
 13638 				return false;
       
 13639 			}
       
 13640 		}
       
 13641 
       
 13642 		this.currentItem = currentItem;
       
 13643 		this._removeCurrentsFromItems();
       
 13644 		return true;
       
 13645 
       
 13646 	},
       
 13647 
       
 13648 	_mouseStart: function(event, overrideHandle, noActivation) {
       
 13649 
       
 13650 		var i, body,
       
 13651 			o = this.options;
       
 13652 
       
 13653 		this.currentContainer = this;
       
 13654 
       
 13655 		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
       
 13656 		this.refreshPositions();
       
 13657 
       
 13658 		//Create and append the visible helper
       
 13659 		this.helper = this._createHelper(event);
       
 13660 
       
 13661 		//Cache the helper size
       
 13662 		this._cacheHelperProportions();
       
 13663 
       
 13664 		/*
       
 13665 		 * - Position generation -
       
 13666 		 * This block generates everything position related - it's the core of draggables.
       
 13667 		 */
       
 13668 
       
 13669 		//Cache the margins of the original element
       
 13670 		this._cacheMargins();
       
 13671 
       
 13672 		//Get the next scrolling parent
       
 13673 		this.scrollParent = this.helper.scrollParent();
       
 13674 
       
 13675 		//The element's absolute position on the page minus margins
       
 13676 		this.offset = this.currentItem.offset();
       
 13677 		this.offset = {
       
 13678 			top: this.offset.top - this.margins.top,
       
 13679 			left: this.offset.left - this.margins.left
       
 13680 		};
       
 13681 
       
 13682 		$.extend(this.offset, {
       
 13683 			click: { //Where the click happened, relative to the element
       
 13684 				left: event.pageX - this.offset.left,
       
 13685 				top: event.pageY - this.offset.top
       
 13686 			},
       
 13687 			parent: this._getParentOffset(),
       
 13688 			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
       
 13689 		});
       
 13690 
       
 13691 		// Only after we got the offset, we can change the helper's position to absolute
       
 13692 		// TODO: Still need to figure out a way to make relative sorting possible
       
 13693 		this.helper.css("position", "absolute");
       
 13694 		this.cssPosition = this.helper.css("position");
       
 13695 
       
 13696 		//Generate the original position
       
 13697 		this.originalPosition = this._generatePosition(event);
       
 13698 		this.originalPageX = event.pageX;
       
 13699 		this.originalPageY = event.pageY;
       
 13700 
       
 13701 		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
       
 13702 		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
       
 13703 
       
 13704 		//Cache the former DOM position
       
 13705 		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
       
 13706 
       
 13707 		//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
       
 13708 		if(this.helper[0] !== this.currentItem[0]) {
       
 13709 			this.currentItem.hide();
       
 13710 		}
       
 13711 
       
 13712 		//Create the placeholder
       
 13713 		this._createPlaceholder();
       
 13714 
       
 13715 		//Set a containment if given in the options
       
 13716 		if(o.containment) {
       
 13717 			this._setContainment();
       
 13718 		}
       
 13719 
       
 13720 		if( o.cursor && o.cursor !== "auto" ) { // cursor option
       
 13721 			body = this.document.find( "body" );
       
 13722 
       
 13723 			// support: IE
       
 13724 			this.storedCursor = body.css( "cursor" );
       
 13725 			body.css( "cursor", o.cursor );
       
 13726 
       
 13727 			this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
       
 13728 		}
       
 13729 
       
 13730 		if(o.opacity) { // opacity option
       
 13731 			if (this.helper.css("opacity")) {
       
 13732 				this._storedOpacity = this.helper.css("opacity");
       
 13733 			}
       
 13734 			this.helper.css("opacity", o.opacity);
       
 13735 		}
       
 13736 
       
 13737 		if(o.zIndex) { // zIndex option
       
 13738 			if (this.helper.css("zIndex")) {
       
 13739 				this._storedZIndex = this.helper.css("zIndex");
       
 13740 			}
       
 13741 			this.helper.css("zIndex", o.zIndex);
       
 13742 		}
       
 13743 
       
 13744 		//Prepare scrolling
       
 13745 		if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
       
 13746 			this.overflowOffset = this.scrollParent.offset();
       
 13747 		}
       
 13748 
       
 13749 		//Call callbacks
       
 13750 		this._trigger("start", event, this._uiHash());
       
 13751 
       
 13752 		//Recache the helper size
       
 13753 		if(!this._preserveHelperProportions) {
       
 13754 			this._cacheHelperProportions();
       
 13755 		}
       
 13756 
       
 13757 
       
 13758 		//Post "activate" events to possible containers
       
 13759 		if( !noActivation ) {
       
 13760 			for ( i = this.containers.length - 1; i >= 0; i-- ) {
       
 13761 				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
       
 13762 			}
       
 13763 		}
       
 13764 
       
 13765 		//Prepare possible droppables
       
 13766 		if($.ui.ddmanager) {
       
 13767 			$.ui.ddmanager.current = this;
       
 13768 		}
       
 13769 
       
 13770 		if ($.ui.ddmanager && !o.dropBehaviour) {
       
 13771 			$.ui.ddmanager.prepareOffsets(this, event);
       
 13772 		}
       
 13773 
       
 13774 		this.dragging = true;
       
 13775 
       
 13776 		this.helper.addClass("ui-sortable-helper");
       
 13777 		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
       
 13778 		return true;
       
 13779 
       
 13780 	},
       
 13781 
       
 13782 	_mouseDrag: function(event) {
       
 13783 		var i, item, itemElement, intersection,
       
 13784 			o = this.options,
       
 13785 			scrolled = false;
       
 13786 
       
 13787 		//Compute the helpers position
       
 13788 		this.position = this._generatePosition(event);
       
 13789 		this.positionAbs = this._convertPositionTo("absolute");
       
 13790 
       
 13791 		if (!this.lastPositionAbs) {
       
 13792 			this.lastPositionAbs = this.positionAbs;
       
 13793 		}
       
 13794 
       
 13795 		//Do scrolling
       
 13796 		if(this.options.scroll) {
       
 13797 			if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
       
 13798 
       
 13799 				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
       
 13800 					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
       
 13801 				} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
       
 13802 					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
       
 13803 				}
       
 13804 
       
 13805 				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
       
 13806 					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
       
 13807 				} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
       
 13808 					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
       
 13809 				}
       
 13810 
       
 13811 			} else {
       
 13812 
       
 13813 				if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
       
 13814 					scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
       
 13815 				} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
       
 13816 					scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
       
 13817 				}
       
 13818 
       
 13819 				if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
       
 13820 					scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
       
 13821 				} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
       
 13822 					scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
       
 13823 				}
       
 13824 
       
 13825 			}
       
 13826 
       
 13827 			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
       
 13828 				$.ui.ddmanager.prepareOffsets(this, event);
       
 13829 			}
       
 13830 		}
       
 13831 
       
 13832 		//Regenerate the absolute position used for position checks
       
 13833 		this.positionAbs = this._convertPositionTo("absolute");
       
 13834 
       
 13835 		//Set the helper position
       
 13836 		if(!this.options.axis || this.options.axis !== "y") {
       
 13837 			this.helper[0].style.left = this.position.left+"px";
       
 13838 		}
       
 13839 		if(!this.options.axis || this.options.axis !== "x") {
       
 13840 			this.helper[0].style.top = this.position.top+"px";
       
 13841 		}
       
 13842 
       
 13843 		//Rearrange
       
 13844 		for (i = this.items.length - 1; i >= 0; i--) {
       
 13845 
       
 13846 			//Cache variables and intersection, continue if no intersection
       
 13847 			item = this.items[i];
       
 13848 			itemElement = item.item[0];
       
 13849 			intersection = this._intersectsWithPointer(item);
       
 13850 			if (!intersection) {
       
 13851 				continue;
       
 13852 			}
       
 13853 
       
 13854 			// Only put the placeholder inside the current Container, skip all
       
 13855 			// items from other containers. This works because when moving
       
 13856 			// an item from one container to another the
       
 13857 			// currentContainer is switched before the placeholder is moved.
       
 13858 			//
       
 13859 			// Without this, moving items in "sub-sortables" can cause
       
 13860 			// the placeholder to jitter between the outer and inner container.
       
 13861 			if (item.instance !== this.currentContainer) {
       
 13862 				continue;
       
 13863 			}
       
 13864 
       
 13865 			// cannot intersect with itself
       
 13866 			// no useless actions that have been done before
       
 13867 			// no action if the item moved is the parent of the item checked
       
 13868 			if (itemElement !== this.currentItem[0] &&
       
 13869 				this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
       
 13870 				!$.contains(this.placeholder[0], itemElement) &&
       
 13871 				(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
       
 13872 			) {
       
 13873 
       
 13874 				this.direction = intersection === 1 ? "down" : "up";
       
 13875 
       
 13876 				if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
       
 13877 					this._rearrange(event, item);
       
 13878 				} else {
       
 13879 					break;
       
 13880 				}
       
 13881 
       
 13882 				this._trigger("change", event, this._uiHash());
       
 13883 				break;
       
 13884 			}
       
 13885 		}
       
 13886 
       
 13887 		//Post events to containers
       
 13888 		this._contactContainers(event);
       
 13889 
       
 13890 		//Interconnect with droppables
       
 13891 		if($.ui.ddmanager) {
       
 13892 			$.ui.ddmanager.drag(this, event);
       
 13893 		}
       
 13894 
       
 13895 		//Call callbacks
       
 13896 		this._trigger("sort", event, this._uiHash());
       
 13897 
       
 13898 		this.lastPositionAbs = this.positionAbs;
       
 13899 		return false;
       
 13900 
       
 13901 	},
       
 13902 
       
 13903 	_mouseStop: function(event, noPropagation) {
       
 13904 
       
 13905 		if(!event) {
       
 13906 			return;
       
 13907 		}
       
 13908 
       
 13909 		//If we are using droppables, inform the manager about the drop
       
 13910 		if ($.ui.ddmanager && !this.options.dropBehaviour) {
       
 13911 			$.ui.ddmanager.drop(this, event);
       
 13912 		}
       
 13913 
       
 13914 		if(this.options.revert) {
       
 13915 			var that = this,
       
 13916 				cur = this.placeholder.offset(),
       
 13917 				axis = this.options.axis,
       
 13918 				animation = {};
       
 13919 
       
 13920 			if ( !axis || axis === "x" ) {
       
 13921 				animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
       
 13922 			}
       
 13923 			if ( !axis || axis === "y" ) {
       
 13924 				animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
       
 13925 			}
       
 13926 			this.reverting = true;
       
 13927 			$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
       
 13928 				that._clear(event);
       
 13929 			});
       
 13930 		} else {
       
 13931 			this._clear(event, noPropagation);
       
 13932 		}
       
 13933 
       
 13934 		return false;
       
 13935 
       
 13936 	},
       
 13937 
       
 13938 	cancel: function() {
       
 13939 
       
 13940 		if(this.dragging) {
       
 13941 
       
 13942 			this._mouseUp({ target: null });
       
 13943 
       
 13944 			if(this.options.helper === "original") {
       
 13945 				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
       
 13946 			} else {
       
 13947 				this.currentItem.show();
       
 13948 			}
       
 13949 
       
 13950 			//Post deactivating events to containers
       
 13951 			for (var i = this.containers.length - 1; i >= 0; i--){
       
 13952 				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
       
 13953 				if(this.containers[i].containerCache.over) {
       
 13954 					this.containers[i]._trigger("out", null, this._uiHash(this));
       
 13955 					this.containers[i].containerCache.over = 0;
       
 13956 				}
       
 13957 			}
       
 13958 
       
 13959 		}
       
 13960 
       
 13961 		if (this.placeholder) {
       
 13962 			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
       
 13963 			if(this.placeholder[0].parentNode) {
       
 13964 				this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
       
 13965 			}
       
 13966 			if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
       
 13967 				this.helper.remove();
       
 13968 			}
       
 13969 
       
 13970 			$.extend(this, {
       
 13971 				helper: null,
       
 13972 				dragging: false,
       
 13973 				reverting: false,
       
 13974 				_noFinalSort: null
       
 13975 			});
       
 13976 
       
 13977 			if(this.domPosition.prev) {
       
 13978 				$(this.domPosition.prev).after(this.currentItem);
       
 13979 			} else {
       
 13980 				$(this.domPosition.parent).prepend(this.currentItem);
       
 13981 			}
       
 13982 		}
       
 13983 
       
 13984 		return this;
       
 13985 
       
 13986 	},
       
 13987 
       
 13988 	serialize: function(o) {
       
 13989 
       
 13990 		var items = this._getItemsAsjQuery(o && o.connected),
       
 13991 			str = [];
       
 13992 		o = o || {};
       
 13993 
       
 13994 		$(items).each(function() {
       
 13995 			var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
       
 13996 			if (res) {
       
 13997 				str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
       
 13998 			}
       
 13999 		});
       
 14000 
       
 14001 		if(!str.length && o.key) {
       
 14002 			str.push(o.key + "=");
       
 14003 		}
       
 14004 
       
 14005 		return str.join("&");
       
 14006 
       
 14007 	},
       
 14008 
       
 14009 	toArray: function(o) {
       
 14010 
       
 14011 		var items = this._getItemsAsjQuery(o && o.connected),
       
 14012 			ret = [];
       
 14013 
       
 14014 		o = o || {};
       
 14015 
       
 14016 		items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
       
 14017 		return ret;
       
 14018 
       
 14019 	},
       
 14020 
       
 14021 	/* Be careful with the following core functions */
       
 14022 	_intersectsWith: function(item) {
       
 14023 
       
 14024 		var x1 = this.positionAbs.left,
       
 14025 			x2 = x1 + this.helperProportions.width,
       
 14026 			y1 = this.positionAbs.top,
       
 14027 			y2 = y1 + this.helperProportions.height,
       
 14028 			l = item.left,
       
 14029 			r = l + item.width,
       
 14030 			t = item.top,
       
 14031 			b = t + item.height,
       
 14032 			dyClick = this.offset.click.top,
       
 14033 			dxClick = this.offset.click.left,
       
 14034 			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
       
 14035 			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
       
 14036 			isOverElement = isOverElementHeight && isOverElementWidth;
       
 14037 
       
 14038 		if ( this.options.tolerance === "pointer" ||
       
 14039 			this.options.forcePointerForContainers ||
       
 14040 			(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
       
 14041 		) {
       
 14042 			return isOverElement;
       
 14043 		} else {
       
 14044 
       
 14045 			return (l < x1 + (this.helperProportions.width / 2) && // Right Half
       
 14046 				x2 - (this.helperProportions.width / 2) < r && // Left Half
       
 14047 				t < y1 + (this.helperProportions.height / 2) && // Bottom Half
       
 14048 				y2 - (this.helperProportions.height / 2) < b ); // Top Half
       
 14049 
       
 14050 		}
       
 14051 	},
       
 14052 
       
 14053 	_intersectsWithPointer: function(item) {
       
 14054 
       
 14055 		var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
       
 14056 			isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
       
 14057 			isOverElement = isOverElementHeight && isOverElementWidth,
       
 14058 			verticalDirection = this._getDragVerticalDirection(),
       
 14059 			horizontalDirection = this._getDragHorizontalDirection();
       
 14060 
       
 14061 		if (!isOverElement) {
       
 14062 			return false;
       
 14063 		}
       
 14064 
       
 14065 		return this.floating ?
       
 14066 			( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
       
 14067 			: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
       
 14068 
       
 14069 	},
       
 14070 
       
 14071 	_intersectsWithSides: function(item) {
       
 14072 
       
 14073 		var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
       
 14074 			isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
       
 14075 			verticalDirection = this._getDragVerticalDirection(),
       
 14076 			horizontalDirection = this._getDragHorizontalDirection();
       
 14077 
       
 14078 		if (this.floating && horizontalDirection) {
       
 14079 			return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
       
 14080 		} else {
       
 14081 			return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
       
 14082 		}
       
 14083 
       
 14084 	},
       
 14085 
       
 14086 	_getDragVerticalDirection: function() {
       
 14087 		var delta = this.positionAbs.top - this.lastPositionAbs.top;
       
 14088 		return delta !== 0 && (delta > 0 ? "down" : "up");
       
 14089 	},
       
 14090 
       
 14091 	_getDragHorizontalDirection: function() {
       
 14092 		var delta = this.positionAbs.left - this.lastPositionAbs.left;
       
 14093 		return delta !== 0 && (delta > 0 ? "right" : "left");
       
 14094 	},
       
 14095 
       
 14096 	refresh: function(event) {
       
 14097 		this._refreshItems(event);
       
 14098 		this._setHandleClassName();
       
 14099 		this.refreshPositions();
       
 14100 		return this;
       
 14101 	},
       
 14102 
       
 14103 	_connectWith: function() {
       
 14104 		var options = this.options;
       
 14105 		return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
       
 14106 	},
       
 14107 
       
 14108 	_getItemsAsjQuery: function(connected) {
       
 14109 
       
 14110 		var i, j, cur, inst,
       
 14111 			items = [],
       
 14112 			queries = [],
       
 14113 			connectWith = this._connectWith();
       
 14114 
       
 14115 		if(connectWith && connected) {
       
 14116 			for (i = connectWith.length - 1; i >= 0; i--){
       
 14117 				cur = $(connectWith[i], this.document[0]);
       
 14118 				for ( j = cur.length - 1; j >= 0; j--){
       
 14119 					inst = $.data(cur[j], this.widgetFullName);
       
 14120 					if(inst && inst !== this && !inst.options.disabled) {
       
 14121 						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]);
       
 14122 					}
       
 14123 				}
       
 14124 			}
       
 14125 		}
       
 14126 
       
 14127 		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]);
       
 14128 
       
 14129 		function addItems() {
       
 14130 			items.push( this );
       
 14131 		}
       
 14132 		for (i = queries.length - 1; i >= 0; i--){
       
 14133 			queries[i][0].each( addItems );
       
 14134 		}
       
 14135 
       
 14136 		return $(items);
       
 14137 
       
 14138 	},
       
 14139 
       
 14140 	_removeCurrentsFromItems: function() {
       
 14141 
       
 14142 		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
       
 14143 
       
 14144 		this.items = $.grep(this.items, function (item) {
       
 14145 			for (var j=0; j < list.length; j++) {
       
 14146 				if(list[j] === item.item[0]) {
       
 14147 					return false;
       
 14148 				}
       
 14149 			}
       
 14150 			return true;
       
 14151 		});
       
 14152 
       
 14153 	},
       
 14154 
       
 14155 	_refreshItems: function(event) {
       
 14156 
       
 14157 		this.items = [];
       
 14158 		this.containers = [this];
       
 14159 
       
 14160 		var i, j, cur, inst, targetData, _queries, item, queriesLength,
       
 14161 			items = this.items,
       
 14162 			queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
       
 14163 			connectWith = this._connectWith();
       
 14164 
       
 14165 		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
       
 14166 			for (i = connectWith.length - 1; i >= 0; i--){
       
 14167 				cur = $(connectWith[i], this.document[0]);
       
 14168 				for (j = cur.length - 1; j >= 0; j--){
       
 14169 					inst = $.data(cur[j], this.widgetFullName);
       
 14170 					if(inst && inst !== this && !inst.options.disabled) {
       
 14171 						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
       
 14172 						this.containers.push(inst);
       
 14173 					}
       
 14174 				}
       
 14175 			}
       
 14176 		}
       
 14177 
       
 14178 		for (i = queries.length - 1; i >= 0; i--) {
       
 14179 			targetData = queries[i][1];
       
 14180 			_queries = queries[i][0];
       
 14181 
       
 14182 			for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
       
 14183 				item = $(_queries[j]);
       
 14184 
       
 14185 				item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
       
 14186 
       
 14187 				items.push({
       
 14188 					item: item,
       
 14189 					instance: targetData,
       
 14190 					width: 0, height: 0,
       
 14191 					left: 0, top: 0
       
 14192 				});
       
 14193 			}
       
 14194 		}
       
 14195 
       
 14196 	},
       
 14197 
       
 14198 	refreshPositions: function(fast) {
       
 14199 
       
 14200 		// Determine whether items are being displayed horizontally
       
 14201 		this.floating = this.items.length ?
       
 14202 			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
       
 14203 			false;
       
 14204 
       
 14205 		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
       
 14206 		if(this.offsetParent && this.helper) {
       
 14207 			this.offset.parent = this._getParentOffset();
       
 14208 		}
       
 14209 
       
 14210 		var i, item, t, p;
       
 14211 
       
 14212 		for (i = this.items.length - 1; i >= 0; i--){
       
 14213 			item = this.items[i];
       
 14214 
       
 14215 			//We ignore calculating positions of all connected containers when we're not over them
       
 14216 			if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
       
 14217 				continue;
       
 14218 			}
       
 14219 
       
 14220 			t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
       
 14221 
       
 14222 			if (!fast) {
       
 14223 				item.width = t.outerWidth();
       
 14224 				item.height = t.outerHeight();
       
 14225 			}
       
 14226 
       
 14227 			p = t.offset();
       
 14228 			item.left = p.left;
       
 14229 			item.top = p.top;
       
 14230 		}
       
 14231 
       
 14232 		if(this.options.custom && this.options.custom.refreshContainers) {
       
 14233 			this.options.custom.refreshContainers.call(this);
       
 14234 		} else {
       
 14235 			for (i = this.containers.length - 1; i >= 0; i--){
       
 14236 				p = this.containers[i].element.offset();
       
 14237 				this.containers[i].containerCache.left = p.left;
       
 14238 				this.containers[i].containerCache.top = p.top;
       
 14239 				this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
       
 14240 				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
       
 14241 			}
       
 14242 		}
       
 14243 
       
 14244 		return this;
       
 14245 	},
       
 14246 
       
 14247 	_createPlaceholder: function(that) {
       
 14248 		that = that || this;
       
 14249 		var className,
       
 14250 			o = that.options;
       
 14251 
       
 14252 		if(!o.placeholder || o.placeholder.constructor === String) {
       
 14253 			className = o.placeholder;
       
 14254 			o.placeholder = {
       
 14255 				element: function() {
       
 14256 
       
 14257 					var nodeName = that.currentItem[0].nodeName.toLowerCase(),
       
 14258 						element = $( "<" + nodeName + ">", that.document[0] )
       
 14259 							.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
       
 14260 							.removeClass("ui-sortable-helper");
       
 14261 
       
 14262 					if ( nodeName === "tbody" ) {
       
 14263 						that._createTrPlaceholder(
       
 14264 							that.currentItem.find( "tr" ).eq( 0 ),
       
 14265 							$( "<tr>", that.document[ 0 ] ).appendTo( element )
       
 14266 						);
       
 14267 					} else if ( nodeName === "tr" ) {
       
 14268 						that._createTrPlaceholder( that.currentItem, element );
       
 14269 					} else if ( nodeName === "img" ) {
       
 14270 						element.attr( "src", that.currentItem.attr( "src" ) );
       
 14271 					}
       
 14272 
       
 14273 					if ( !className ) {
       
 14274 						element.css( "visibility", "hidden" );
       
 14275 					}
       
 14276 
       
 14277 					return element;
       
 14278 				},
       
 14279 				update: function(container, p) {
       
 14280 
       
 14281 					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
       
 14282 					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
       
 14283 					if(className && !o.forcePlaceholderSize) {
       
 14284 						return;
       
 14285 					}
       
 14286 
       
 14287 					//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
       
 14288 					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
       
 14289 					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
       
 14290 				}
       
 14291 			};
       
 14292 		}
       
 14293 
       
 14294 		//Create the placeholder
       
 14295 		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
       
 14296 
       
 14297 		//Append it after the actual current item
       
 14298 		that.currentItem.after(that.placeholder);
       
 14299 
       
 14300 		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
       
 14301 		o.placeholder.update(that, that.placeholder);
       
 14302 
       
 14303 	},
       
 14304 
       
 14305 	_createTrPlaceholder: function( sourceTr, targetTr ) {
       
 14306 		var that = this;
       
 14307 
       
 14308 		sourceTr.children().each(function() {
       
 14309 			$( "<td>&#160;</td>", that.document[ 0 ] )
       
 14310 				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
       
 14311 				.appendTo( targetTr );
       
 14312 		});
       
 14313 	},
       
 14314 
       
 14315 	_contactContainers: function(event) {
       
 14316 		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
       
 14317 			innermostContainer = null,
       
 14318 			innermostIndex = null;
       
 14319 
       
 14320 		// get innermost container that intersects with item
       
 14321 		for (i = this.containers.length - 1; i >= 0; i--) {
       
 14322 
       
 14323 			// never consider a container that's located within the item itself
       
 14324 			if($.contains(this.currentItem[0], this.containers[i].element[0])) {
       
 14325 				continue;
       
 14326 			}
       
 14327 
       
 14328 			if(this._intersectsWith(this.containers[i].containerCache)) {
       
 14329 
       
 14330 				// if we've already found a container and it's more "inner" than this, then continue
       
 14331 				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
       
 14332 					continue;
       
 14333 				}
       
 14334 
       
 14335 				innermostContainer = this.containers[i];
       
 14336 				innermostIndex = i;
       
 14337 
       
 14338 			} else {
       
 14339 				// container doesn't intersect. trigger "out" event if necessary
       
 14340 				if(this.containers[i].containerCache.over) {
       
 14341 					this.containers[i]._trigger("out", event, this._uiHash(this));
       
 14342 					this.containers[i].containerCache.over = 0;
       
 14343 				}
       
 14344 			}
       
 14345 
       
 14346 		}
       
 14347 
       
 14348 		// if no intersecting containers found, return
       
 14349 		if(!innermostContainer) {
       
 14350 			return;
       
 14351 		}
       
 14352 
       
 14353 		// move the item into the container if it's not there already
       
 14354 		if(this.containers.length === 1) {
       
 14355 			if (!this.containers[innermostIndex].containerCache.over) {
       
 14356 				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
       
 14357 				this.containers[innermostIndex].containerCache.over = 1;
       
 14358 			}
       
 14359 		} else {
       
 14360 
       
 14361 			//When entering a new container, we will find the item with the least distance and append our item near it
       
 14362 			dist = 10000;
       
 14363 			itemWithLeastDistance = null;
       
 14364 			floating = innermostContainer.floating || this._isFloating(this.currentItem);
       
 14365 			posProperty = floating ? "left" : "top";
       
 14366 			sizeProperty = floating ? "width" : "height";
       
 14367 			axis = floating ? "clientX" : "clientY";
       
 14368 
       
 14369 			for (j = this.items.length - 1; j >= 0; j--) {
       
 14370 				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
       
 14371 					continue;
       
 14372 				}
       
 14373 				if(this.items[j].item[0] === this.currentItem[0]) {
       
 14374 					continue;
       
 14375 				}
       
 14376 
       
 14377 				cur = this.items[j].item.offset()[posProperty];
       
 14378 				nearBottom = false;
       
 14379 				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
       
 14380 					nearBottom = true;
       
 14381 				}
       
 14382 
       
 14383 				if ( Math.abs( event[ axis ] - cur ) < dist ) {
       
 14384 					dist = Math.abs( event[ axis ] - cur );
       
 14385 					itemWithLeastDistance = this.items[ j ];
       
 14386 					this.direction = nearBottom ? "up": "down";
       
 14387 				}
       
 14388 			}
       
 14389 
       
 14390 			//Check if dropOnEmpty is enabled
       
 14391 			if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
       
 14392 				return;
       
 14393 			}
       
 14394 
       
 14395 			if(this.currentContainer === this.containers[innermostIndex]) {
       
 14396 				if ( !this.currentContainer.containerCache.over ) {
       
 14397 					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
       
 14398 					this.currentContainer.containerCache.over = 1;
       
 14399 				}
       
 14400 				return;
       
 14401 			}
       
 14402 
       
 14403 			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
       
 14404 			this._trigger("change", event, this._uiHash());
       
 14405 			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
       
 14406 			this.currentContainer = this.containers[innermostIndex];
       
 14407 
       
 14408 			//Update the placeholder
       
 14409 			this.options.placeholder.update(this.currentContainer, this.placeholder);
       
 14410 
       
 14411 			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
       
 14412 			this.containers[innermostIndex].containerCache.over = 1;
       
 14413 		}
       
 14414 
       
 14415 
       
 14416 	},
       
 14417 
       
 14418 	_createHelper: function(event) {
       
 14419 
       
 14420 		var o = this.options,
       
 14421 			helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
       
 14422 
       
 14423 		//Add the helper to the DOM if that didn't happen already
       
 14424 		if(!helper.parents("body").length) {
       
 14425 			$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
       
 14426 		}
       
 14427 
       
 14428 		if(helper[0] === this.currentItem[0]) {
       
 14429 			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") };
       
 14430 		}
       
 14431 
       
 14432 		if(!helper[0].style.width || o.forceHelperSize) {
       
 14433 			helper.width(this.currentItem.width());
       
 14434 		}
       
 14435 		if(!helper[0].style.height || o.forceHelperSize) {
       
 14436 			helper.height(this.currentItem.height());
       
 14437 		}
       
 14438 
       
 14439 		return helper;
       
 14440 
       
 14441 	},
       
 14442 
       
 14443 	_adjustOffsetFromHelper: function(obj) {
       
 14444 		if (typeof obj === "string") {
       
 14445 			obj = obj.split(" ");
       
 14446 		}
       
 14447 		if ($.isArray(obj)) {
       
 14448 			obj = {left: +obj[0], top: +obj[1] || 0};
       
 14449 		}
       
 14450 		if ("left" in obj) {
       
 14451 			this.offset.click.left = obj.left + this.margins.left;
       
 14452 		}
       
 14453 		if ("right" in obj) {
       
 14454 			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
       
 14455 		}
       
 14456 		if ("top" in obj) {
       
 14457 			this.offset.click.top = obj.top + this.margins.top;
       
 14458 		}
       
 14459 		if ("bottom" in obj) {
       
 14460 			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
       
 14461 		}
       
 14462 	},
       
 14463 
       
 14464 	_getParentOffset: function() {
       
 14465 
       
 14466 
       
 14467 		//Get the offsetParent and cache its position
       
 14468 		this.offsetParent = this.helper.offsetParent();
       
 14469 		var po = this.offsetParent.offset();
       
 14470 
       
 14471 		// This is a special case where we need to modify a offset calculated on start, since the following happened:
       
 14472 		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
       
 14473 		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
       
 14474 		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
       
 14475 		if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
       
 14476 			po.left += this.scrollParent.scrollLeft();
       
 14477 			po.top += this.scrollParent.scrollTop();
       
 14478 		}
       
 14479 
       
 14480 		// This needs to be actually done for all browsers, since pageX/pageY includes this information
       
 14481 		// with an ugly IE fix
       
 14482 		if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
       
 14483 			po = { top: 0, left: 0 };
       
 14484 		}
       
 14485 
       
 14486 		return {
       
 14487 			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
       
 14488 			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
       
 14489 		};
       
 14490 
       
 14491 	},
       
 14492 
       
 14493 	_getRelativeOffset: function() {
       
 14494 
       
 14495 		if(this.cssPosition === "relative") {
       
 14496 			var p = this.currentItem.position();
       
 14497 			return {
       
 14498 				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
       
 14499 				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
       
 14500 			};
       
 14501 		} else {
       
 14502 			return { top: 0, left: 0 };
       
 14503 		}
       
 14504 
       
 14505 	},
       
 14506 
       
 14507 	_cacheMargins: function() {
       
 14508 		this.margins = {
       
 14509 			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
       
 14510 			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
       
 14511 		};
       
 14512 	},
       
 14513 
       
 14514 	_cacheHelperProportions: function() {
       
 14515 		this.helperProportions = {
       
 14516 			width: this.helper.outerWidth(),
       
 14517 			height: this.helper.outerHeight()
       
 14518 		};
       
 14519 	},
       
 14520 
       
 14521 	_setContainment: function() {
       
 14522 
       
 14523 		var ce, co, over,
       
 14524 			o = this.options;
       
 14525 		if(o.containment === "parent") {
       
 14526 			o.containment = this.helper[0].parentNode;
       
 14527 		}
       
 14528 		if(o.containment === "document" || o.containment === "window") {
       
 14529 			this.containment = [
       
 14530 				0 - this.offset.relative.left - this.offset.parent.left,
       
 14531 				0 - this.offset.relative.top - this.offset.parent.top,
       
 14532 				o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
       
 14533 				(o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
       
 14534 			];
       
 14535 		}
       
 14536 
       
 14537 		if(!(/^(document|window|parent)$/).test(o.containment)) {
       
 14538 			ce = $(o.containment)[0];
       
 14539 			co = $(o.containment).offset();
       
 14540 			over = ($(ce).css("overflow") !== "hidden");
       
 14541 
       
 14542 			this.containment = [
       
 14543 				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
       
 14544 				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
       
 14545 				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,
       
 14546 				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
       
 14547 			];
       
 14548 		}
       
 14549 
       
 14550 	},
       
 14551 
       
 14552 	_convertPositionTo: function(d, pos) {
       
 14553 
       
 14554 		if(!pos) {
       
 14555 			pos = this.position;
       
 14556 		}
       
 14557 		var mod = d === "absolute" ? 1 : -1,
       
 14558 			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
       
 14559 			scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
       
 14560 
       
 14561 		return {
       
 14562 			top: (
       
 14563 				pos.top	+																// The absolute mouse position
       
 14564 				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
       
 14565 				this.offset.parent.top * mod -											// The offsetParent's offset without borders (offset + border)
       
 14566 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
       
 14567 			),
       
 14568 			left: (
       
 14569 				pos.left +																// The absolute mouse position
       
 14570 				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
       
 14571 				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
       
 14572 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
       
 14573 			)
       
 14574 		};
       
 14575 
       
 14576 	},
       
 14577 
       
 14578 	_generatePosition: function(event) {
       
 14579 
       
 14580 		var top, left,
       
 14581 			o = this.options,
       
 14582 			pageX = event.pageX,
       
 14583 			pageY = event.pageY,
       
 14584 			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
       
 14585 
       
 14586 		// This is another very weird special case that only happens for relative elements:
       
 14587 		// 1. If the css position is relative
       
 14588 		// 2. and the scroll parent is the document or similar to the offset parent
       
 14589 		// we have to refresh the relative offset during the scroll so there are no jumps
       
 14590 		if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
       
 14591 			this.offset.relative = this._getRelativeOffset();
       
 14592 		}
       
 14593 
       
 14594 		/*
       
 14595 		 * - Position constraining -
       
 14596 		 * Constrain the position to a mix of grid, containment.
       
 14597 		 */
       
 14598 
       
 14599 		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
       
 14600 
       
 14601 			if(this.containment) {
       
 14602 				if(event.pageX - this.offset.click.left < this.containment[0]) {
       
 14603 					pageX = this.containment[0] + this.offset.click.left;
       
 14604 				}
       
 14605 				if(event.pageY - this.offset.click.top < this.containment[1]) {
       
 14606 					pageY = this.containment[1] + this.offset.click.top;
       
 14607 				}
       
 14608 				if(event.pageX - this.offset.click.left > this.containment[2]) {
       
 14609 					pageX = this.containment[2] + this.offset.click.left;
       
 14610 				}
       
 14611 				if(event.pageY - this.offset.click.top > this.containment[3]) {
       
 14612 					pageY = this.containment[3] + this.offset.click.top;
       
 14613 				}
       
 14614 			}
       
 14615 
       
 14616 			if(o.grid) {
       
 14617 				top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
       
 14618 				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;
       
 14619 
       
 14620 				left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
       
 14621 				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;
       
 14622 			}
       
 14623 
       
 14624 		}
       
 14625 
       
 14626 		return {
       
 14627 			top: (
       
 14628 				pageY -																// The absolute mouse position
       
 14629 				this.offset.click.top -													// Click offset (relative to the element)
       
 14630 				this.offset.relative.top	-											// Only for relative positioned nodes: Relative offset from element to offset parent
       
 14631 				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
       
 14632 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
       
 14633 			),
       
 14634 			left: (
       
 14635 				pageX -																// The absolute mouse position
       
 14636 				this.offset.click.left -												// Click offset (relative to the element)
       
 14637 				this.offset.relative.left	-											// Only for relative positioned nodes: Relative offset from element to offset parent
       
 14638 				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
       
 14639 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
       
 14640 			)
       
 14641 		};
       
 14642 
       
 14643 	},
       
 14644 
       
 14645 	_rearrange: function(event, i, a, hardRefresh) {
       
 14646 
       
 14647 		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));
       
 14648 
       
 14649 		//Various things done here to improve the performance:
       
 14650 		// 1. we create a setTimeout, that calls refreshPositions
       
 14651 		// 2. on the instance, we have a counter variable, that get's higher after every append
       
 14652 		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
       
 14653 		// 4. this lets only the last addition to the timeout stack through
       
 14654 		this.counter = this.counter ? ++this.counter : 1;
       
 14655 		var counter = this.counter;
       
 14656 
       
 14657 		this._delay(function() {
       
 14658 			if(counter === this.counter) {
       
 14659 				this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
       
 14660 			}
       
 14661 		});
       
 14662 
       
 14663 	},
       
 14664 
       
 14665 	_clear: function(event, noPropagation) {
       
 14666 
       
 14667 		this.reverting = false;
       
 14668 		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
       
 14669 		// everything else normalized again
       
 14670 		var i,
       
 14671 			delayedTriggers = [];
       
 14672 
       
 14673 		// We first have to update the dom position of the actual currentItem
       
 14674 		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
       
 14675 		if(!this._noFinalSort && this.currentItem.parent().length) {
       
 14676 			this.placeholder.before(this.currentItem);
       
 14677 		}
       
 14678 		this._noFinalSort = null;
       
 14679 
       
 14680 		if(this.helper[0] === this.currentItem[0]) {
       
 14681 			for(i in this._storedCSS) {
       
 14682 				if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
       
 14683 					this._storedCSS[i] = "";
       
 14684 				}
       
 14685 			}
       
 14686 			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
       
 14687 		} else {
       
 14688 			this.currentItem.show();
       
 14689 		}
       
 14690 
       
 14691 		if(this.fromOutside && !noPropagation) {
       
 14692 			delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
       
 14693 		}
       
 14694 		if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
       
 14695 			delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
       
 14696 		}
       
 14697 
       
 14698 		// Check if the items Container has Changed and trigger appropriate
       
 14699 		// events.
       
 14700 		if (this !== this.currentContainer) {
       
 14701 			if(!noPropagation) {
       
 14702 				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
       
 14703 				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
       
 14704 				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
       
 14705 			}
       
 14706 		}
       
 14707 
       
 14708 
       
 14709 		//Post events to containers
       
 14710 		function delayEvent( type, instance, container ) {
       
 14711 			return function( event ) {
       
 14712 				container._trigger( type, event, instance._uiHash( instance ) );
       
 14713 			};
       
 14714 		}
       
 14715 		for (i = this.containers.length - 1; i >= 0; i--){
       
 14716 			if (!noPropagation) {
       
 14717 				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
       
 14718 			}
       
 14719 			if(this.containers[i].containerCache.over) {
       
 14720 				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
       
 14721 				this.containers[i].containerCache.over = 0;
       
 14722 			}
       
 14723 		}
       
 14724 
       
 14725 		//Do what was originally in plugins
       
 14726 		if ( this.storedCursor ) {
       
 14727 			this.document.find( "body" ).css( "cursor", this.storedCursor );
       
 14728 			this.storedStylesheet.remove();
       
 14729 		}
       
 14730 		if(this._storedOpacity) {
       
 14731 			this.helper.css("opacity", this._storedOpacity);
       
 14732 		}
       
 14733 		if(this._storedZIndex) {
       
 14734 			this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
       
 14735 		}
       
 14736 
       
 14737 		this.dragging = false;
       
 14738 
       
 14739 		if(!noPropagation) {
       
 14740 			this._trigger("beforeStop", event, this._uiHash());
       
 14741 		}
       
 14742 
       
 14743 		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
       
 14744 		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
       
 14745 
       
 14746 		if ( !this.cancelHelperRemoval ) {
       
 14747 			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
       
 14748 				this.helper.remove();
       
 14749 			}
       
 14750 			this.helper = null;
       
 14751 		}
       
 14752 
       
 14753 		if(!noPropagation) {
       
 14754 			for (i=0; i < delayedTriggers.length; i++) {
       
 14755 				delayedTriggers[i].call(this, event);
       
 14756 			} //Trigger all delayed events
       
 14757 			this._trigger("stop", event, this._uiHash());
       
 14758 		}
       
 14759 
       
 14760 		this.fromOutside = false;
       
 14761 		return !this.cancelHelperRemoval;
       
 14762 
       
 14763 	},
       
 14764 
       
 14765 	_trigger: function() {
       
 14766 		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
       
 14767 			this.cancel();
       
 14768 		}
       
 14769 	},
       
 14770 
       
 14771 	_uiHash: function(_inst) {
       
 14772 		var inst = _inst || this;
       
 14773 		return {
       
 14774 			helper: inst.helper,
       
 14775 			placeholder: inst.placeholder || $([]),
       
 14776 			position: inst.position,
       
 14777 			originalPosition: inst.originalPosition,
       
 14778 			offset: inst.positionAbs,
       
 14779 			item: inst.currentItem,
       
 14780 			sender: _inst ? _inst.element : null
       
 14781 		};
       
 14782 	}
       
 14783 
       
 14784 });
       
 14785 
       
 14786 
       
 14787 /*!
       
 14788  * jQuery UI Spinner 1.11.4
       
 14789  * http://jqueryui.com
       
 14790  *
       
 14791  * Copyright jQuery Foundation and other contributors
       
 14792  * Released under the MIT license.
       
 14793  * http://jquery.org/license
       
 14794  *
       
 14795  * http://api.jqueryui.com/spinner/
       
 14796  */
       
 14797 
       
 14798 
       
 14799 function spinner_modifier( fn ) {
       
 14800 	return function() {
       
 14801 		var previous = this.element.val();
       
 14802 		fn.apply( this, arguments );
       
 14803 		this._refresh();
       
 14804 		if ( previous !== this.element.val() ) {
       
 14805 			this._trigger( "change" );
       
 14806 		}
       
 14807 	};
       
 14808 }
       
 14809 
       
 14810 var spinner = $.widget( "ui.spinner", {
       
 14811 	version: "1.11.4",
       
 14812 	defaultElement: "<input>",
       
 14813 	widgetEventPrefix: "spin",
       
 14814 	options: {
       
 14815 		culture: null,
       
 14816 		icons: {
       
 14817 			down: "ui-icon-triangle-1-s",
       
 14818 			up: "ui-icon-triangle-1-n"
       
 14819 		},
       
 14820 		incremental: true,
       
 14821 		max: null,
       
 14822 		min: null,
       
 14823 		numberFormat: null,
       
 14824 		page: 10,
       
 14825 		step: 1,
       
 14826 
       
 14827 		change: null,
       
 14828 		spin: null,
       
 14829 		start: null,
       
 14830 		stop: null
       
 14831 	},
       
 14832 
       
 14833 	_create: function() {
       
 14834 		// handle string values that need to be parsed
       
 14835 		this._setOption( "max", this.options.max );
       
 14836 		this._setOption( "min", this.options.min );
       
 14837 		this._setOption( "step", this.options.step );
       
 14838 
       
 14839 		// Only format if there is a value, prevents the field from being marked
       
 14840 		// as invalid in Firefox, see #9573.
       
 14841 		if ( this.value() !== "" ) {
       
 14842 			// Format the value, but don't constrain.
       
 14843 			this._value( this.element.val(), true );
       
 14844 		}
       
 14845 
       
 14846 		this._draw();
       
 14847 		this._on( this._events );
       
 14848 		this._refresh();
       
 14849 
       
 14850 		// turning off autocomplete prevents the browser from remembering the
       
 14851 		// value when navigating through history, so we re-enable autocomplete
       
 14852 		// if the page is unloaded before the widget is destroyed. #7790
       
 14853 		this._on( this.window, {
       
 14854 			beforeunload: function() {
       
 14855 				this.element.removeAttr( "autocomplete" );
       
 14856 			}
       
 14857 		});
       
 14858 	},
       
 14859 
       
 14860 	_getCreateOptions: function() {
       
 14861 		var options = {},
       
 14862 			element = this.element;
       
 14863 
       
 14864 		$.each( [ "min", "max", "step" ], function( i, option ) {
       
 14865 			var value = element.attr( option );
       
 14866 			if ( value !== undefined && value.length ) {
       
 14867 				options[ option ] = value;
       
 14868 			}
       
 14869 		});
       
 14870 
       
 14871 		return options;
       
 14872 	},
       
 14873 
       
 14874 	_events: {
       
 14875 		keydown: function( event ) {
       
 14876 			if ( this._start( event ) && this._keydown( event ) ) {
       
 14877 				event.preventDefault();
       
 14878 			}
       
 14879 		},
       
 14880 		keyup: "_stop",
       
 14881 		focus: function() {
       
 14882 			this.previous = this.element.val();
       
 14883 		},
       
 14884 		blur: function( event ) {
       
 14885 			if ( this.cancelBlur ) {
       
 14886 				delete this.cancelBlur;
       
 14887 				return;
       
 14888 			}
       
 14889 
       
 14890 			this._stop();
       
 14891 			this._refresh();
       
 14892 			if ( this.previous !== this.element.val() ) {
       
 14893 				this._trigger( "change", event );
       
 14894 			}
       
 14895 		},
       
 14896 		mousewheel: function( event, delta ) {
       
 14897 			if ( !delta ) {
       
 14898 				return;
       
 14899 			}
       
 14900 			if ( !this.spinning && !this._start( event ) ) {
       
 14901 				return false;
       
 14902 			}
       
 14903 
       
 14904 			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
       
 14905 			clearTimeout( this.mousewheelTimer );
       
 14906 			this.mousewheelTimer = this._delay(function() {
       
 14907 				if ( this.spinning ) {
       
 14908 					this._stop( event );
       
 14909 				}
       
 14910 			}, 100 );
       
 14911 			event.preventDefault();
       
 14912 		},
       
 14913 		"mousedown .ui-spinner-button": function( event ) {
       
 14914 			var previous;
       
 14915 
       
 14916 			// We never want the buttons to have focus; whenever the user is
       
 14917 			// interacting with the spinner, the focus should be on the input.
       
 14918 			// If the input is focused then this.previous is properly set from
       
 14919 			// when the input first received focus. If the input is not focused
       
 14920 			// then we need to set this.previous based on the value before spinning.
       
 14921 			previous = this.element[0] === this.document[0].activeElement ?
       
 14922 				this.previous : this.element.val();
       
 14923 			function checkFocus() {
       
 14924 				var isActive = this.element[0] === this.document[0].activeElement;
       
 14925 				if ( !isActive ) {
       
 14926 					this.element.focus();
       
 14927 					this.previous = previous;
       
 14928 					// support: IE
       
 14929 					// IE sets focus asynchronously, so we need to check if focus
       
 14930 					// moved off of the input because the user clicked on the button.
       
 14931 					this._delay(function() {
       
 14932 						this.previous = previous;
       
 14933 					});
       
 14934 				}
       
 14935 			}
       
 14936 
       
 14937 			// ensure focus is on (or stays on) the text field
       
 14938 			event.preventDefault();
       
 14939 			checkFocus.call( this );
       
 14940 
       
 14941 			// support: IE
       
 14942 			// IE doesn't prevent moving focus even with event.preventDefault()
       
 14943 			// so we set a flag to know when we should ignore the blur event
       
 14944 			// and check (again) if focus moved off of the input.
       
 14945 			this.cancelBlur = true;
       
 14946 			this._delay(function() {
       
 14947 				delete this.cancelBlur;
       
 14948 				checkFocus.call( this );
       
 14949 			});
       
 14950 
       
 14951 			if ( this._start( event ) === false ) {
       
 14952 				return;
       
 14953 			}
       
 14954 
       
 14955 			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
       
 14956 		},
       
 14957 		"mouseup .ui-spinner-button": "_stop",
       
 14958 		"mouseenter .ui-spinner-button": function( event ) {
       
 14959 			// button will add ui-state-active if mouse was down while mouseleave and kept down
       
 14960 			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
       
 14961 				return;
       
 14962 			}
       
 14963 
       
 14964 			if ( this._start( event ) === false ) {
       
 14965 				return false;
       
 14966 			}
       
 14967 			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
       
 14968 		},
       
 14969 		// TODO: do we really want to consider this a stop?
       
 14970 		// shouldn't we just stop the repeater and wait until mouseup before
       
 14971 		// we trigger the stop event?
       
 14972 		"mouseleave .ui-spinner-button": "_stop"
       
 14973 	},
       
 14974 
       
 14975 	_draw: function() {
       
 14976 		var uiSpinner = this.uiSpinner = this.element
       
 14977 			.addClass( "ui-spinner-input" )
       
 14978 			.attr( "autocomplete", "off" )
       
 14979 			.wrap( this._uiSpinnerHtml() )
       
 14980 			.parent()
       
 14981 				// add buttons
       
 14982 				.append( this._buttonHtml() );
       
 14983 
       
 14984 		this.element.attr( "role", "spinbutton" );
       
 14985 
       
 14986 		// button bindings
       
 14987 		this.buttons = uiSpinner.find( ".ui-spinner-button" )
       
 14988 			.attr( "tabIndex", -1 )
       
 14989 			.button()
       
 14990 			.removeClass( "ui-corner-all" );
       
 14991 
       
 14992 		// IE 6 doesn't understand height: 50% for the buttons
       
 14993 		// unless the wrapper has an explicit height
       
 14994 		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
       
 14995 				uiSpinner.height() > 0 ) {
       
 14996 			uiSpinner.height( uiSpinner.height() );
       
 14997 		}
       
 14998 
       
 14999 		// disable spinner if element was already disabled
       
 15000 		if ( this.options.disabled ) {
       
 15001 			this.disable();
       
 15002 		}
       
 15003 	},
       
 15004 
       
 15005 	_keydown: function( event ) {
       
 15006 		var options = this.options,
       
 15007 			keyCode = $.ui.keyCode;
       
 15008 
       
 15009 		switch ( event.keyCode ) {
       
 15010 		case keyCode.UP:
       
 15011 			this._repeat( null, 1, event );
       
 15012 			return true;
       
 15013 		case keyCode.DOWN:
       
 15014 			this._repeat( null, -1, event );
       
 15015 			return true;
       
 15016 		case keyCode.PAGE_UP:
       
 15017 			this._repeat( null, options.page, event );
       
 15018 			return true;
       
 15019 		case keyCode.PAGE_DOWN:
       
 15020 			this._repeat( null, -options.page, event );
       
 15021 			return true;
       
 15022 		}
       
 15023 
       
 15024 		return false;
       
 15025 	},
       
 15026 
       
 15027 	_uiSpinnerHtml: function() {
       
 15028 		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
       
 15029 	},
       
 15030 
       
 15031 	_buttonHtml: function() {
       
 15032 		return "" +
       
 15033 			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
       
 15034 				"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
       
 15035 			"</a>" +
       
 15036 			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
       
 15037 				"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
       
 15038 			"</a>";
       
 15039 	},
       
 15040 
       
 15041 	_start: function( event ) {
       
 15042 		if ( !this.spinning && this._trigger( "start", event ) === false ) {
       
 15043 			return false;
       
 15044 		}
       
 15045 
       
 15046 		if ( !this.counter ) {
       
 15047 			this.counter = 1;
       
 15048 		}
       
 15049 		this.spinning = true;
       
 15050 		return true;
       
 15051 	},
       
 15052 
       
 15053 	_repeat: function( i, steps, event ) {
       
 15054 		i = i || 500;
       
 15055 
       
 15056 		clearTimeout( this.timer );
       
 15057 		this.timer = this._delay(function() {
       
 15058 			this._repeat( 40, steps, event );
       
 15059 		}, i );
       
 15060 
       
 15061 		this._spin( steps * this.options.step, event );
       
 15062 	},
       
 15063 
       
 15064 	_spin: function( step, event ) {
       
 15065 		var value = this.value() || 0;
       
 15066 
       
 15067 		if ( !this.counter ) {
       
 15068 			this.counter = 1;
       
 15069 		}
       
 15070 
       
 15071 		value = this._adjustValue( value + step * this._increment( this.counter ) );
       
 15072 
       
 15073 		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
       
 15074 			this._value( value );
       
 15075 			this.counter++;
       
 15076 		}
       
 15077 	},
       
 15078 
       
 15079 	_increment: function( i ) {
       
 15080 		var incremental = this.options.incremental;
       
 15081 
       
 15082 		if ( incremental ) {
       
 15083 			return $.isFunction( incremental ) ?
       
 15084 				incremental( i ) :
       
 15085 				Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
       
 15086 		}
       
 15087 
       
 15088 		return 1;
       
 15089 	},
       
 15090 
       
 15091 	_precision: function() {
       
 15092 		var precision = this._precisionOf( this.options.step );
       
 15093 		if ( this.options.min !== null ) {
       
 15094 			precision = Math.max( precision, this._precisionOf( this.options.min ) );
       
 15095 		}
       
 15096 		return precision;
       
 15097 	},
       
 15098 
       
 15099 	_precisionOf: function( num ) {
       
 15100 		var str = num.toString(),
       
 15101 			decimal = str.indexOf( "." );
       
 15102 		return decimal === -1 ? 0 : str.length - decimal - 1;
       
 15103 	},
       
 15104 
       
 15105 	_adjustValue: function( value ) {
       
 15106 		var base, aboveMin,
       
 15107 			options = this.options;
       
 15108 
       
 15109 		// make sure we're at a valid step
       
 15110 		// - find out where we are relative to the base (min or 0)
       
 15111 		base = options.min !== null ? options.min : 0;
       
 15112 		aboveMin = value - base;
       
 15113 		// - round to the nearest step
       
 15114 		aboveMin = Math.round(aboveMin / options.step) * options.step;
       
 15115 		// - rounding is based on 0, so adjust back to our base
       
 15116 		value = base + aboveMin;
       
 15117 
       
 15118 		// fix precision from bad JS floating point math
       
 15119 		value = parseFloat( value.toFixed( this._precision() ) );
       
 15120 
       
 15121 		// clamp the value
       
 15122 		if ( options.max !== null && value > options.max) {
       
 15123 			return options.max;
       
 15124 		}
       
 15125 		if ( options.min !== null && value < options.min ) {
       
 15126 			return options.min;
       
 15127 		}
       
 15128 
       
 15129 		return value;
       
 15130 	},
       
 15131 
       
 15132 	_stop: function( event ) {
       
 15133 		if ( !this.spinning ) {
       
 15134 			return;
       
 15135 		}
       
 15136 
       
 15137 		clearTimeout( this.timer );
       
 15138 		clearTimeout( this.mousewheelTimer );
       
 15139 		this.counter = 0;
       
 15140 		this.spinning = false;
       
 15141 		this._trigger( "stop", event );
       
 15142 	},
       
 15143 
       
 15144 	_setOption: function( key, value ) {
       
 15145 		if ( key === "culture" || key === "numberFormat" ) {
       
 15146 			var prevValue = this._parse( this.element.val() );
       
 15147 			this.options[ key ] = value;
       
 15148 			this.element.val( this._format( prevValue ) );
       
 15149 			return;
       
 15150 		}
       
 15151 
       
 15152 		if ( key === "max" || key === "min" || key === "step" ) {
       
 15153 			if ( typeof value === "string" ) {
       
 15154 				value = this._parse( value );
       
 15155 			}
       
 15156 		}
       
 15157 		if ( key === "icons" ) {
       
 15158 			this.buttons.first().find( ".ui-icon" )
       
 15159 				.removeClass( this.options.icons.up )
       
 15160 				.addClass( value.up );
       
 15161 			this.buttons.last().find( ".ui-icon" )
       
 15162 				.removeClass( this.options.icons.down )
       
 15163 				.addClass( value.down );
       
 15164 		}
       
 15165 
       
 15166 		this._super( key, value );
       
 15167 
       
 15168 		if ( key === "disabled" ) {
       
 15169 			this.widget().toggleClass( "ui-state-disabled", !!value );
       
 15170 			this.element.prop( "disabled", !!value );
       
 15171 			this.buttons.button( value ? "disable" : "enable" );
       
 15172 		}
       
 15173 	},
       
 15174 
       
 15175 	_setOptions: spinner_modifier(function( options ) {
       
 15176 		this._super( options );
       
 15177 	}),
       
 15178 
       
 15179 	_parse: function( val ) {
       
 15180 		if ( typeof val === "string" && val !== "" ) {
       
 15181 			val = window.Globalize && this.options.numberFormat ?
       
 15182 				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
       
 15183 		}
       
 15184 		return val === "" || isNaN( val ) ? null : val;
       
 15185 	},
       
 15186 
       
 15187 	_format: function( value ) {
       
 15188 		if ( value === "" ) {
       
 15189 			return "";
       
 15190 		}
       
 15191 		return window.Globalize && this.options.numberFormat ?
       
 15192 			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
       
 15193 			value;
       
 15194 	},
       
 15195 
       
 15196 	_refresh: function() {
       
 15197 		this.element.attr({
       
 15198 			"aria-valuemin": this.options.min,
       
 15199 			"aria-valuemax": this.options.max,
       
 15200 			// TODO: what should we do with values that can't be parsed?
       
 15201 			"aria-valuenow": this._parse( this.element.val() )
       
 15202 		});
       
 15203 	},
       
 15204 
       
 15205 	isValid: function() {
       
 15206 		var value = this.value();
       
 15207 
       
 15208 		// null is invalid
       
 15209 		if ( value === null ) {
       
 15210 			return false;
       
 15211 		}
       
 15212 
       
 15213 		// if value gets adjusted, it's invalid
       
 15214 		return value === this._adjustValue( value );
       
 15215 	},
       
 15216 
       
 15217 	// update the value without triggering change
       
 15218 	_value: function( value, allowAny ) {
       
 15219 		var parsed;
       
 15220 		if ( value !== "" ) {
       
 15221 			parsed = this._parse( value );
       
 15222 			if ( parsed !== null ) {
       
 15223 				if ( !allowAny ) {
       
 15224 					parsed = this._adjustValue( parsed );
       
 15225 				}
       
 15226 				value = this._format( parsed );
       
 15227 			}
       
 15228 		}
       
 15229 		this.element.val( value );
       
 15230 		this._refresh();
       
 15231 	},
       
 15232 
       
 15233 	_destroy: function() {
       
 15234 		this.element
       
 15235 			.removeClass( "ui-spinner-input" )
       
 15236 			.prop( "disabled", false )
       
 15237 			.removeAttr( "autocomplete" )
       
 15238 			.removeAttr( "role" )
       
 15239 			.removeAttr( "aria-valuemin" )
       
 15240 			.removeAttr( "aria-valuemax" )
       
 15241 			.removeAttr( "aria-valuenow" );
       
 15242 		this.uiSpinner.replaceWith( this.element );
       
 15243 	},
       
 15244 
       
 15245 	stepUp: spinner_modifier(function( steps ) {
       
 15246 		this._stepUp( steps );
       
 15247 	}),
       
 15248 	_stepUp: function( steps ) {
       
 15249 		if ( this._start() ) {
       
 15250 			this._spin( (steps || 1) * this.options.step );
       
 15251 			this._stop();
       
 15252 		}
       
 15253 	},
       
 15254 
       
 15255 	stepDown: spinner_modifier(function( steps ) {
       
 15256 		this._stepDown( steps );
       
 15257 	}),
       
 15258 	_stepDown: function( steps ) {
       
 15259 		if ( this._start() ) {
       
 15260 			this._spin( (steps || 1) * -this.options.step );
       
 15261 			this._stop();
       
 15262 		}
       
 15263 	},
       
 15264 
       
 15265 	pageUp: spinner_modifier(function( pages ) {
       
 15266 		this._stepUp( (pages || 1) * this.options.page );
       
 15267 	}),
       
 15268 
       
 15269 	pageDown: spinner_modifier(function( pages ) {
       
 15270 		this._stepDown( (pages || 1) * this.options.page );
       
 15271 	}),
       
 15272 
       
 15273 	value: function( newVal ) {
       
 15274 		if ( !arguments.length ) {
       
 15275 			return this._parse( this.element.val() );
       
 15276 		}
       
 15277 		spinner_modifier( this._value ).call( this, newVal );
       
 15278 	},
       
 15279 
       
 15280 	widget: function() {
       
 15281 		return this.uiSpinner;
       
 15282 	}
       
 15283 });
       
 15284 
       
 15285 
       
 15286 /*!
       
 15287  * jQuery UI Tabs 1.11.4
       
 15288  * http://jqueryui.com
       
 15289  *
       
 15290  * Copyright jQuery Foundation and other contributors
       
 15291  * Released under the MIT license.
       
 15292  * http://jquery.org/license
       
 15293  *
       
 15294  * http://api.jqueryui.com/tabs/
       
 15295  */
       
 15296 
       
 15297 
       
 15298 var tabs = $.widget( "ui.tabs", {
       
 15299 	version: "1.11.4",
       
 15300 	delay: 300,
       
 15301 	options: {
       
 15302 		active: null,
       
 15303 		collapsible: false,
       
 15304 		event: "click",
       
 15305 		heightStyle: "content",
       
 15306 		hide: null,
       
 15307 		show: null,
       
 15308 
       
 15309 		// callbacks
       
 15310 		activate: null,
       
 15311 		beforeActivate: null,
       
 15312 		beforeLoad: null,
       
 15313 		load: null
       
 15314 	},
       
 15315 
       
 15316 	_isLocal: (function() {
       
 15317 		var rhash = /#.*$/;
       
 15318 
       
 15319 		return function( anchor ) {
       
 15320 			var anchorUrl, locationUrl;
       
 15321 
       
 15322 			// support: IE7
       
 15323 			// IE7 doesn't normalize the href property when set via script (#9317)
       
 15324 			anchor = anchor.cloneNode( false );
       
 15325 
       
 15326 			anchorUrl = anchor.href.replace( rhash, "" );
       
 15327 			locationUrl = location.href.replace( rhash, "" );
       
 15328 
       
 15329 			// decoding may throw an error if the URL isn't UTF-8 (#9518)
       
 15330 			try {
       
 15331 				anchorUrl = decodeURIComponent( anchorUrl );
       
 15332 			} catch ( error ) {}
       
 15333 			try {
       
 15334 				locationUrl = decodeURIComponent( locationUrl );
       
 15335 			} catch ( error ) {}
       
 15336 
       
 15337 			return anchor.hash.length > 1 && anchorUrl === locationUrl;
       
 15338 		};
       
 15339 	})(),
       
 15340 
       
 15341 	_create: function() {
       
 15342 		var that = this,
       
 15343 			options = this.options;
       
 15344 
       
 15345 		this.running = false;
       
 15346 
       
 15347 		this.element
       
 15348 			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
       
 15349 			.toggleClass( "ui-tabs-collapsible", options.collapsible );
       
 15350 
       
 15351 		this._processTabs();
       
 15352 		options.active = this._initialActive();
       
 15353 
       
 15354 		// Take disabling tabs via class attribute from HTML
       
 15355 		// into account and update option properly.
       
 15356 		if ( $.isArray( options.disabled ) ) {
       
 15357 			options.disabled = $.unique( options.disabled.concat(
       
 15358 				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
       
 15359 					return that.tabs.index( li );
       
 15360 				})
       
 15361 			) ).sort();
       
 15362 		}
       
 15363 
       
 15364 		// check for length avoids error when initializing empty list
       
 15365 		if ( this.options.active !== false && this.anchors.length ) {
       
 15366 			this.active = this._findActive( options.active );
       
 15367 		} else {
       
 15368 			this.active = $();
       
 15369 		}
       
 15370 
       
 15371 		this._refresh();
       
 15372 
       
 15373 		if ( this.active.length ) {
       
 15374 			this.load( options.active );
       
 15375 		}
       
 15376 	},
       
 15377 
       
 15378 	_initialActive: function() {
       
 15379 		var active = this.options.active,
       
 15380 			collapsible = this.options.collapsible,
       
 15381 			locationHash = location.hash.substring( 1 );
       
 15382 
       
 15383 		if ( active === null ) {
       
 15384 			// check the fragment identifier in the URL
       
 15385 			if ( locationHash ) {
       
 15386 				this.tabs.each(function( i, tab ) {
       
 15387 					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
       
 15388 						active = i;
       
 15389 						return false;
       
 15390 					}
       
 15391 				});
       
 15392 			}
       
 15393 
       
 15394 			// check for a tab marked active via a class
       
 15395 			if ( active === null ) {
       
 15396 				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
       
 15397 			}
       
 15398 
       
 15399 			// no active tab, set to false
       
 15400 			if ( active === null || active === -1 ) {
       
 15401 				active = this.tabs.length ? 0 : false;
       
 15402 			}
       
 15403 		}
       
 15404 
       
 15405 		// handle numbers: negative, out of range
       
 15406 		if ( active !== false ) {
       
 15407 			active = this.tabs.index( this.tabs.eq( active ) );
       
 15408 			if ( active === -1 ) {
       
 15409 				active = collapsible ? false : 0;
       
 15410 			}
       
 15411 		}
       
 15412 
       
 15413 		// don't allow collapsible: false and active: false
       
 15414 		if ( !collapsible && active === false && this.anchors.length ) {
       
 15415 			active = 0;
       
 15416 		}
       
 15417 
       
 15418 		return active;
       
 15419 	},
       
 15420 
       
 15421 	_getCreateEventData: function() {
       
 15422 		return {
       
 15423 			tab: this.active,
       
 15424 			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
       
 15425 		};
       
 15426 	},
       
 15427 
       
 15428 	_tabKeydown: function( event ) {
       
 15429 		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
       
 15430 			selectedIndex = this.tabs.index( focusedTab ),
       
 15431 			goingForward = true;
       
 15432 
       
 15433 		if ( this._handlePageNav( event ) ) {
       
 15434 			return;
       
 15435 		}
       
 15436 
       
 15437 		switch ( event.keyCode ) {
       
 15438 			case $.ui.keyCode.RIGHT:
       
 15439 			case $.ui.keyCode.DOWN:
       
 15440 				selectedIndex++;
       
 15441 				break;
       
 15442 			case $.ui.keyCode.UP:
       
 15443 			case $.ui.keyCode.LEFT:
       
 15444 				goingForward = false;
       
 15445 				selectedIndex--;
       
 15446 				break;
       
 15447 			case $.ui.keyCode.END:
       
 15448 				selectedIndex = this.anchors.length - 1;
       
 15449 				break;
       
 15450 			case $.ui.keyCode.HOME:
       
 15451 				selectedIndex = 0;
       
 15452 				break;
       
 15453 			case $.ui.keyCode.SPACE:
       
 15454 				// Activate only, no collapsing
       
 15455 				event.preventDefault();
       
 15456 				clearTimeout( this.activating );
       
 15457 				this._activate( selectedIndex );
       
 15458 				return;
       
 15459 			case $.ui.keyCode.ENTER:
       
 15460 				// Toggle (cancel delayed activation, allow collapsing)
       
 15461 				event.preventDefault();
       
 15462 				clearTimeout( this.activating );
       
 15463 				// Determine if we should collapse or activate
       
 15464 				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
       
 15465 				return;
       
 15466 			default:
       
 15467 				return;
       
 15468 		}
       
 15469 
       
 15470 		// Focus the appropriate tab, based on which key was pressed
       
 15471 		event.preventDefault();
       
 15472 		clearTimeout( this.activating );
       
 15473 		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
       
 15474 
       
 15475 		// Navigating with control/command key will prevent automatic activation
       
 15476 		if ( !event.ctrlKey && !event.metaKey ) {
       
 15477 
       
 15478 			// Update aria-selected immediately so that AT think the tab is already selected.
       
 15479 			// Otherwise AT may confuse the user by stating that they need to activate the tab,
       
 15480 			// but the tab will already be activated by the time the announcement finishes.
       
 15481 			focusedTab.attr( "aria-selected", "false" );
       
 15482 			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
       
 15483 
       
 15484 			this.activating = this._delay(function() {
       
 15485 				this.option( "active", selectedIndex );
       
 15486 			}, this.delay );
       
 15487 		}
       
 15488 	},
       
 15489 
       
 15490 	_panelKeydown: function( event ) {
       
 15491 		if ( this._handlePageNav( event ) ) {
       
 15492 			return;
       
 15493 		}
       
 15494 
       
 15495 		// Ctrl+up moves focus to the current tab
       
 15496 		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
       
 15497 			event.preventDefault();
       
 15498 			this.active.focus();
       
 15499 		}
       
 15500 	},
       
 15501 
       
 15502 	// Alt+page up/down moves focus to the previous/next tab (and activates)
       
 15503 	_handlePageNav: function( event ) {
       
 15504 		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
       
 15505 			this._activate( this._focusNextTab( this.options.active - 1, false ) );
       
 15506 			return true;
       
 15507 		}
       
 15508 		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
       
 15509 			this._activate( this._focusNextTab( this.options.active + 1, true ) );
       
 15510 			return true;
       
 15511 		}
       
 15512 	},
       
 15513 
       
 15514 	_findNextTab: function( index, goingForward ) {
       
 15515 		var lastTabIndex = this.tabs.length - 1;
       
 15516 
       
 15517 		function constrain() {
       
 15518 			if ( index > lastTabIndex ) {
       
 15519 				index = 0;
       
 15520 			}
       
 15521 			if ( index < 0 ) {
       
 15522 				index = lastTabIndex;
       
 15523 			}
       
 15524 			return index;
       
 15525 		}
       
 15526 
       
 15527 		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
       
 15528 			index = goingForward ? index + 1 : index - 1;
       
 15529 		}
       
 15530 
       
 15531 		return index;
       
 15532 	},
       
 15533 
       
 15534 	_focusNextTab: function( index, goingForward ) {
       
 15535 		index = this._findNextTab( index, goingForward );
       
 15536 		this.tabs.eq( index ).focus();
       
 15537 		return index;
       
 15538 	},
       
 15539 
       
 15540 	_setOption: function( key, value ) {
       
 15541 		if ( key === "active" ) {
       
 15542 			// _activate() will handle invalid values and update this.options
       
 15543 			this._activate( value );
       
 15544 			return;
       
 15545 		}
       
 15546 
       
 15547 		if ( key === "disabled" ) {
       
 15548 			// don't use the widget factory's disabled handling
       
 15549 			this._setupDisabled( value );
       
 15550 			return;
       
 15551 		}
       
 15552 
       
 15553 		this._super( key, value);
       
 15554 
       
 15555 		if ( key === "collapsible" ) {
       
 15556 			this.element.toggleClass( "ui-tabs-collapsible", value );
       
 15557 			// Setting collapsible: false while collapsed; open first panel
       
 15558 			if ( !value && this.options.active === false ) {
       
 15559 				this._activate( 0 );
       
 15560 			}
       
 15561 		}
       
 15562 
       
 15563 		if ( key === "event" ) {
       
 15564 			this._setupEvents( value );
       
 15565 		}
       
 15566 
       
 15567 		if ( key === "heightStyle" ) {
       
 15568 			this._setupHeightStyle( value );
       
 15569 		}
       
 15570 	},
       
 15571 
       
 15572 	_sanitizeSelector: function( hash ) {
       
 15573 		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
       
 15574 	},
       
 15575 
       
 15576 	refresh: function() {
       
 15577 		var options = this.options,
       
 15578 			lis = this.tablist.children( ":has(a[href])" );
       
 15579 
       
 15580 		// get disabled tabs from class attribute from HTML
       
 15581 		// this will get converted to a boolean if needed in _refresh()
       
 15582 		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
       
 15583 			return lis.index( tab );
       
 15584 		});
       
 15585 
       
 15586 		this._processTabs();
       
 15587 
       
 15588 		// was collapsed or no tabs
       
 15589 		if ( options.active === false || !this.anchors.length ) {
       
 15590 			options.active = false;
       
 15591 			this.active = $();
       
 15592 		// was active, but active tab is gone
       
 15593 		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
       
 15594 			// all remaining tabs are disabled
       
 15595 			if ( this.tabs.length === options.disabled.length ) {
       
 15596 				options.active = false;
       
 15597 				this.active = $();
       
 15598 			// activate previous tab
       
 15599 			} else {
       
 15600 				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
       
 15601 			}
       
 15602 		// was active, active tab still exists
       
 15603 		} else {
       
 15604 			// make sure active index is correct
       
 15605 			options.active = this.tabs.index( this.active );
       
 15606 		}
       
 15607 
       
 15608 		this._refresh();
       
 15609 	},
       
 15610 
       
 15611 	_refresh: function() {
       
 15612 		this._setupDisabled( this.options.disabled );
       
 15613 		this._setupEvents( this.options.event );
       
 15614 		this._setupHeightStyle( this.options.heightStyle );
       
 15615 
       
 15616 		this.tabs.not( this.active ).attr({
       
 15617 			"aria-selected": "false",
       
 15618 			"aria-expanded": "false",
       
 15619 			tabIndex: -1
       
 15620 		});
       
 15621 		this.panels.not( this._getPanelForTab( this.active ) )
       
 15622 			.hide()
       
 15623 			.attr({
       
 15624 				"aria-hidden": "true"
       
 15625 			});
       
 15626 
       
 15627 		// Make sure one tab is in the tab order
       
 15628 		if ( !this.active.length ) {
       
 15629 			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
       
 15630 		} else {
       
 15631 			this.active
       
 15632 				.addClass( "ui-tabs-active ui-state-active" )
       
 15633 				.attr({
       
 15634 					"aria-selected": "true",
       
 15635 					"aria-expanded": "true",
       
 15636 					tabIndex: 0
       
 15637 				});
       
 15638 			this._getPanelForTab( this.active )
       
 15639 				.show()
       
 15640 				.attr({
       
 15641 					"aria-hidden": "false"
       
 15642 				});
       
 15643 		}
       
 15644 	},
       
 15645 
       
 15646 	_processTabs: function() {
       
 15647 		var that = this,
       
 15648 			prevTabs = this.tabs,
       
 15649 			prevAnchors = this.anchors,
       
 15650 			prevPanels = this.panels;
       
 15651 
       
 15652 		this.tablist = this._getList()
       
 15653 			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
       
 15654 			.attr( "role", "tablist" )
       
 15655 
       
 15656 			// Prevent users from focusing disabled tabs via click
       
 15657 			.delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {
       
 15658 				if ( $( this ).is( ".ui-state-disabled" ) ) {
       
 15659 					event.preventDefault();
       
 15660 				}
       
 15661 			})
       
 15662 
       
 15663 			// support: IE <9
       
 15664 			// Preventing the default action in mousedown doesn't prevent IE
       
 15665 			// from focusing the element, so if the anchor gets focused, blur.
       
 15666 			// We don't have to worry about focusing the previously focused
       
 15667 			// element since clicking on a non-focusable element should focus
       
 15668 			// the body anyway.
       
 15669 			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
       
 15670 				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
       
 15671 					this.blur();
       
 15672 				}
       
 15673 			});
       
 15674 
       
 15675 		this.tabs = this.tablist.find( "> li:has(a[href])" )
       
 15676 			.addClass( "ui-state-default ui-corner-top" )
       
 15677 			.attr({
       
 15678 				role: "tab",
       
 15679 				tabIndex: -1
       
 15680 			});
       
 15681 
       
 15682 		this.anchors = this.tabs.map(function() {
       
 15683 				return $( "a", this )[ 0 ];
       
 15684 			})
       
 15685 			.addClass( "ui-tabs-anchor" )
       
 15686 			.attr({
       
 15687 				role: "presentation",
       
 15688 				tabIndex: -1
       
 15689 			});
       
 15690 
       
 15691 		this.panels = $();
       
 15692 
       
 15693 		this.anchors.each(function( i, anchor ) {
       
 15694 			var selector, panel, panelId,
       
 15695 				anchorId = $( anchor ).uniqueId().attr( "id" ),
       
 15696 				tab = $( anchor ).closest( "li" ),
       
 15697 				originalAriaControls = tab.attr( "aria-controls" );
       
 15698 
       
 15699 			// inline tab
       
 15700 			if ( that._isLocal( anchor ) ) {
       
 15701 				selector = anchor.hash;
       
 15702 				panelId = selector.substring( 1 );
       
 15703 				panel = that.element.find( that._sanitizeSelector( selector ) );
       
 15704 			// remote tab
       
 15705 			} else {
       
 15706 				// If the tab doesn't already have aria-controls,
       
 15707 				// generate an id by using a throw-away element
       
 15708 				panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
       
 15709 				selector = "#" + panelId;
       
 15710 				panel = that.element.find( selector );
       
 15711 				if ( !panel.length ) {
       
 15712 					panel = that._createPanel( panelId );
       
 15713 					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
       
 15714 				}
       
 15715 				panel.attr( "aria-live", "polite" );
       
 15716 			}
       
 15717 
       
 15718 			if ( panel.length) {
       
 15719 				that.panels = that.panels.add( panel );
       
 15720 			}
       
 15721 			if ( originalAriaControls ) {
       
 15722 				tab.data( "ui-tabs-aria-controls", originalAriaControls );
       
 15723 			}
       
 15724 			tab.attr({
       
 15725 				"aria-controls": panelId,
       
 15726 				"aria-labelledby": anchorId
       
 15727 			});
       
 15728 			panel.attr( "aria-labelledby", anchorId );
       
 15729 		});
       
 15730 
       
 15731 		this.panels
       
 15732 			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
       
 15733 			.attr( "role", "tabpanel" );
       
 15734 
       
 15735 		// Avoid memory leaks (#10056)
       
 15736 		if ( prevTabs ) {
       
 15737 			this._off( prevTabs.not( this.tabs ) );
       
 15738 			this._off( prevAnchors.not( this.anchors ) );
       
 15739 			this._off( prevPanels.not( this.panels ) );
       
 15740 		}
       
 15741 	},
       
 15742 
       
 15743 	// allow overriding how to find the list for rare usage scenarios (#7715)
       
 15744 	_getList: function() {
       
 15745 		return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
       
 15746 	},
       
 15747 
       
 15748 	_createPanel: function( id ) {
       
 15749 		return $( "<div>" )
       
 15750 			.attr( "id", id )
       
 15751 			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
       
 15752 			.data( "ui-tabs-destroy", true );
       
 15753 	},
       
 15754 
       
 15755 	_setupDisabled: function( disabled ) {
       
 15756 		if ( $.isArray( disabled ) ) {
       
 15757 			if ( !disabled.length ) {
       
 15758 				disabled = false;
       
 15759 			} else if ( disabled.length === this.anchors.length ) {
       
 15760 				disabled = true;
       
 15761 			}
       
 15762 		}
       
 15763 
       
 15764 		// disable tabs
       
 15765 		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
       
 15766 			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
       
 15767 				$( li )
       
 15768 					.addClass( "ui-state-disabled" )
       
 15769 					.attr( "aria-disabled", "true" );
       
 15770 			} else {
       
 15771 				$( li )
       
 15772 					.removeClass( "ui-state-disabled" )
       
 15773 					.removeAttr( "aria-disabled" );
       
 15774 			}
       
 15775 		}
       
 15776 
       
 15777 		this.options.disabled = disabled;
       
 15778 	},
       
 15779 
       
 15780 	_setupEvents: function( event ) {
       
 15781 		var events = {};
       
 15782 		if ( event ) {
       
 15783 			$.each( event.split(" "), function( index, eventName ) {
       
 15784 				events[ eventName ] = "_eventHandler";
       
 15785 			});
       
 15786 		}
       
 15787 
       
 15788 		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
       
 15789 		// Always prevent the default action, even when disabled
       
 15790 		this._on( true, this.anchors, {
       
 15791 			click: function( event ) {
       
 15792 				event.preventDefault();
       
 15793 			}
       
 15794 		});
       
 15795 		this._on( this.anchors, events );
       
 15796 		this._on( this.tabs, { keydown: "_tabKeydown" } );
       
 15797 		this._on( this.panels, { keydown: "_panelKeydown" } );
       
 15798 
       
 15799 		this._focusable( this.tabs );
       
 15800 		this._hoverable( this.tabs );
       
 15801 	},
       
 15802 
       
 15803 	_setupHeightStyle: function( heightStyle ) {
       
 15804 		var maxHeight,
       
 15805 			parent = this.element.parent();
       
 15806 
       
 15807 		if ( heightStyle === "fill" ) {
       
 15808 			maxHeight = parent.height();
       
 15809 			maxHeight -= this.element.outerHeight() - this.element.height();
       
 15810 
       
 15811 			this.element.siblings( ":visible" ).each(function() {
       
 15812 				var elem = $( this ),
       
 15813 					position = elem.css( "position" );
       
 15814 
       
 15815 				if ( position === "absolute" || position === "fixed" ) {
       
 15816 					return;
       
 15817 				}
       
 15818 				maxHeight -= elem.outerHeight( true );
       
 15819 			});
       
 15820 
       
 15821 			this.element.children().not( this.panels ).each(function() {
       
 15822 				maxHeight -= $( this ).outerHeight( true );
       
 15823 			});
       
 15824 
       
 15825 			this.panels.each(function() {
       
 15826 				$( this ).height( Math.max( 0, maxHeight -
       
 15827 					$( this ).innerHeight() + $( this ).height() ) );
       
 15828 			})
       
 15829 			.css( "overflow", "auto" );
       
 15830 		} else if ( heightStyle === "auto" ) {
       
 15831 			maxHeight = 0;
       
 15832 			this.panels.each(function() {
       
 15833 				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
       
 15834 			}).height( maxHeight );
       
 15835 		}
       
 15836 	},
       
 15837 
       
 15838 	_eventHandler: function( event ) {
       
 15839 		var options = this.options,
       
 15840 			active = this.active,
       
 15841 			anchor = $( event.currentTarget ),
       
 15842 			tab = anchor.closest( "li" ),
       
 15843 			clickedIsActive = tab[ 0 ] === active[ 0 ],
       
 15844 			collapsing = clickedIsActive && options.collapsible,
       
 15845 			toShow = collapsing ? $() : this._getPanelForTab( tab ),
       
 15846 			toHide = !active.length ? $() : this._getPanelForTab( active ),
       
 15847 			eventData = {
       
 15848 				oldTab: active,
       
 15849 				oldPanel: toHide,
       
 15850 				newTab: collapsing ? $() : tab,
       
 15851 				newPanel: toShow
       
 15852 			};
       
 15853 
       
 15854 		event.preventDefault();
       
 15855 
       
 15856 		if ( tab.hasClass( "ui-state-disabled" ) ||
       
 15857 				// tab is already loading
       
 15858 				tab.hasClass( "ui-tabs-loading" ) ||
       
 15859 				// can't switch durning an animation
       
 15860 				this.running ||
       
 15861 				// click on active header, but not collapsible
       
 15862 				( clickedIsActive && !options.collapsible ) ||
       
 15863 				// allow canceling activation
       
 15864 				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
       
 15865 			return;
       
 15866 		}
       
 15867 
       
 15868 		options.active = collapsing ? false : this.tabs.index( tab );
       
 15869 
       
 15870 		this.active = clickedIsActive ? $() : tab;
       
 15871 		if ( this.xhr ) {
       
 15872 			this.xhr.abort();
       
 15873 		}
       
 15874 
       
 15875 		if ( !toHide.length && !toShow.length ) {
       
 15876 			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
       
 15877 		}
       
 15878 
       
 15879 		if ( toShow.length ) {
       
 15880 			this.load( this.tabs.index( tab ), event );
       
 15881 		}
       
 15882 		this._toggle( event, eventData );
       
 15883 	},
       
 15884 
       
 15885 	// handles show/hide for selecting tabs
       
 15886 	_toggle: function( event, eventData ) {
       
 15887 		var that = this,
       
 15888 			toShow = eventData.newPanel,
       
 15889 			toHide = eventData.oldPanel;
       
 15890 
       
 15891 		this.running = true;
       
 15892 
       
 15893 		function complete() {
       
 15894 			that.running = false;
       
 15895 			that._trigger( "activate", event, eventData );
       
 15896 		}
       
 15897 
       
 15898 		function show() {
       
 15899 			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
       
 15900 
       
 15901 			if ( toShow.length && that.options.show ) {
       
 15902 				that._show( toShow, that.options.show, complete );
       
 15903 			} else {
       
 15904 				toShow.show();
       
 15905 				complete();
       
 15906 			}
       
 15907 		}
       
 15908 
       
 15909 		// start out by hiding, then showing, then completing
       
 15910 		if ( toHide.length && this.options.hide ) {
       
 15911 			this._hide( toHide, this.options.hide, function() {
       
 15912 				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
       
 15913 				show();
       
 15914 			});
       
 15915 		} else {
       
 15916 			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
       
 15917 			toHide.hide();
       
 15918 			show();
       
 15919 		}
       
 15920 
       
 15921 		toHide.attr( "aria-hidden", "true" );
       
 15922 		eventData.oldTab.attr({
       
 15923 			"aria-selected": "false",
       
 15924 			"aria-expanded": "false"
       
 15925 		});
       
 15926 		// If we're switching tabs, remove the old tab from the tab order.
       
 15927 		// If we're opening from collapsed state, remove the previous tab from the tab order.
       
 15928 		// If we're collapsing, then keep the collapsing tab in the tab order.
       
 15929 		if ( toShow.length && toHide.length ) {
       
 15930 			eventData.oldTab.attr( "tabIndex", -1 );
       
 15931 		} else if ( toShow.length ) {
       
 15932 			this.tabs.filter(function() {
       
 15933 				return $( this ).attr( "tabIndex" ) === 0;
       
 15934 			})
       
 15935 			.attr( "tabIndex", -1 );
       
 15936 		}
       
 15937 
       
 15938 		toShow.attr( "aria-hidden", "false" );
       
 15939 		eventData.newTab.attr({
       
 15940 			"aria-selected": "true",
       
 15941 			"aria-expanded": "true",
       
 15942 			tabIndex: 0
       
 15943 		});
       
 15944 	},
       
 15945 
       
 15946 	_activate: function( index ) {
       
 15947 		var anchor,
       
 15948 			active = this._findActive( index );
       
 15949 
       
 15950 		// trying to activate the already active panel
       
 15951 		if ( active[ 0 ] === this.active[ 0 ] ) {
       
 15952 			return;
       
 15953 		}
       
 15954 
       
 15955 		// trying to collapse, simulate a click on the current active header
       
 15956 		if ( !active.length ) {
       
 15957 			active = this.active;
       
 15958 		}
       
 15959 
       
 15960 		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
       
 15961 		this._eventHandler({
       
 15962 			target: anchor,
       
 15963 			currentTarget: anchor,
       
 15964 			preventDefault: $.noop
       
 15965 		});
       
 15966 	},
       
 15967 
       
 15968 	_findActive: function( index ) {
       
 15969 		return index === false ? $() : this.tabs.eq( index );
       
 15970 	},
       
 15971 
       
 15972 	_getIndex: function( index ) {
       
 15973 		// meta-function to give users option to provide a href string instead of a numerical index.
       
 15974 		if ( typeof index === "string" ) {
       
 15975 			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
       
 15976 		}
       
 15977 
       
 15978 		return index;
       
 15979 	},
       
 15980 
       
 15981 	_destroy: function() {
       
 15982 		if ( this.xhr ) {
       
 15983 			this.xhr.abort();
       
 15984 		}
       
 15985 
       
 15986 		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
       
 15987 
       
 15988 		this.tablist
       
 15989 			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
       
 15990 			.removeAttr( "role" );
       
 15991 
       
 15992 		this.anchors
       
 15993 			.removeClass( "ui-tabs-anchor" )
       
 15994 			.removeAttr( "role" )
       
 15995 			.removeAttr( "tabIndex" )
       
 15996 			.removeUniqueId();
       
 15997 
       
 15998 		this.tablist.unbind( this.eventNamespace );
       
 15999 
       
 16000 		this.tabs.add( this.panels ).each(function() {
       
 16001 			if ( $.data( this, "ui-tabs-destroy" ) ) {
       
 16002 				$( this ).remove();
       
 16003 			} else {
       
 16004 				$( this )
       
 16005 					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
       
 16006 						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
       
 16007 					.removeAttr( "tabIndex" )
       
 16008 					.removeAttr( "aria-live" )
       
 16009 					.removeAttr( "aria-busy" )
       
 16010 					.removeAttr( "aria-selected" )
       
 16011 					.removeAttr( "aria-labelledby" )
       
 16012 					.removeAttr( "aria-hidden" )
       
 16013 					.removeAttr( "aria-expanded" )
       
 16014 					.removeAttr( "role" );
       
 16015 			}
       
 16016 		});
       
 16017 
       
 16018 		this.tabs.each(function() {
       
 16019 			var li = $( this ),
       
 16020 				prev = li.data( "ui-tabs-aria-controls" );
       
 16021 			if ( prev ) {
       
 16022 				li
       
 16023 					.attr( "aria-controls", prev )
       
 16024 					.removeData( "ui-tabs-aria-controls" );
       
 16025 			} else {
       
 16026 				li.removeAttr( "aria-controls" );
       
 16027 			}
       
 16028 		});
       
 16029 
       
 16030 		this.panels.show();
       
 16031 
       
 16032 		if ( this.options.heightStyle !== "content" ) {
       
 16033 			this.panels.css( "height", "" );
       
 16034 		}
       
 16035 	},
       
 16036 
       
 16037 	enable: function( index ) {
       
 16038 		var disabled = this.options.disabled;
       
 16039 		if ( disabled === false ) {
       
 16040 			return;
       
 16041 		}
       
 16042 
       
 16043 		if ( index === undefined ) {
       
 16044 			disabled = false;
       
 16045 		} else {
       
 16046 			index = this._getIndex( index );
       
 16047 			if ( $.isArray( disabled ) ) {
       
 16048 				disabled = $.map( disabled, function( num ) {
       
 16049 					return num !== index ? num : null;
       
 16050 				});
       
 16051 			} else {
       
 16052 				disabled = $.map( this.tabs, function( li, num ) {
       
 16053 					return num !== index ? num : null;
       
 16054 				});
       
 16055 			}
       
 16056 		}
       
 16057 		this._setupDisabled( disabled );
       
 16058 	},
       
 16059 
       
 16060 	disable: function( index ) {
       
 16061 		var disabled = this.options.disabled;
       
 16062 		if ( disabled === true ) {
       
 16063 			return;
       
 16064 		}
       
 16065 
       
 16066 		if ( index === undefined ) {
       
 16067 			disabled = true;
       
 16068 		} else {
       
 16069 			index = this._getIndex( index );
       
 16070 			if ( $.inArray( index, disabled ) !== -1 ) {
       
 16071 				return;
       
 16072 			}
       
 16073 			if ( $.isArray( disabled ) ) {
       
 16074 				disabled = $.merge( [ index ], disabled ).sort();
       
 16075 			} else {
       
 16076 				disabled = [ index ];
       
 16077 			}
       
 16078 		}
       
 16079 		this._setupDisabled( disabled );
       
 16080 	},
       
 16081 
       
 16082 	load: function( index, event ) {
       
 16083 		index = this._getIndex( index );
       
 16084 		var that = this,
       
 16085 			tab = this.tabs.eq( index ),
       
 16086 			anchor = tab.find( ".ui-tabs-anchor" ),
       
 16087 			panel = this._getPanelForTab( tab ),
       
 16088 			eventData = {
       
 16089 				tab: tab,
       
 16090 				panel: panel
       
 16091 			},
       
 16092 			complete = function( jqXHR, status ) {
       
 16093 				if ( status === "abort" ) {
       
 16094 					that.panels.stop( false, true );
       
 16095 				}
       
 16096 
       
 16097 				tab.removeClass( "ui-tabs-loading" );
       
 16098 				panel.removeAttr( "aria-busy" );
       
 16099 
       
 16100 				if ( jqXHR === that.xhr ) {
       
 16101 					delete that.xhr;
       
 16102 				}
       
 16103 			};
       
 16104 
       
 16105 		// not remote
       
 16106 		if ( this._isLocal( anchor[ 0 ] ) ) {
       
 16107 			return;
       
 16108 		}
       
 16109 
       
 16110 		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
       
 16111 
       
 16112 		// support: jQuery <1.8
       
 16113 		// jQuery <1.8 returns false if the request is canceled in beforeSend,
       
 16114 		// but as of 1.8, $.ajax() always returns a jqXHR object.
       
 16115 		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
       
 16116 			tab.addClass( "ui-tabs-loading" );
       
 16117 			panel.attr( "aria-busy", "true" );
       
 16118 
       
 16119 			this.xhr
       
 16120 				.done(function( response, status, jqXHR ) {
       
 16121 					// support: jQuery <1.8
       
 16122 					// http://bugs.jquery.com/ticket/11778
       
 16123 					setTimeout(function() {
       
 16124 						panel.html( response );
       
 16125 						that._trigger( "load", event, eventData );
       
 16126 
       
 16127 						complete( jqXHR, status );
       
 16128 					}, 1 );
       
 16129 				})
       
 16130 				.fail(function( jqXHR, status ) {
       
 16131 					// support: jQuery <1.8
       
 16132 					// http://bugs.jquery.com/ticket/11778
       
 16133 					setTimeout(function() {
       
 16134 						complete( jqXHR, status );
       
 16135 					}, 1 );
       
 16136 				});
       
 16137 		}
       
 16138 	},
       
 16139 
       
 16140 	_ajaxSettings: function( anchor, event, eventData ) {
       
 16141 		var that = this;
       
 16142 		return {
       
 16143 			url: anchor.attr( "href" ),
       
 16144 			beforeSend: function( jqXHR, settings ) {
       
 16145 				return that._trigger( "beforeLoad", event,
       
 16146 					$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
       
 16147 			}
       
 16148 		};
       
 16149 	},
       
 16150 
       
 16151 	_getPanelForTab: function( tab ) {
       
 16152 		var id = $( tab ).attr( "aria-controls" );
       
 16153 		return this.element.find( this._sanitizeSelector( "#" + id ) );
       
 16154 	}
       
 16155 });
       
 16156 
       
 16157 
       
 16158 /*!
       
 16159  * jQuery UI Tooltip 1.11.4
       
 16160  * http://jqueryui.com
       
 16161  *
       
 16162  * Copyright jQuery Foundation and other contributors
       
 16163  * Released under the MIT license.
       
 16164  * http://jquery.org/license
       
 16165  *
       
 16166  * http://api.jqueryui.com/tooltip/
       
 16167  */
       
 16168 
       
 16169 
       
 16170 var tooltip = $.widget( "ui.tooltip", {
       
 16171 	version: "1.11.4",
       
 16172 	options: {
       
 16173 		content: function() {
       
 16174 			// support: IE<9, Opera in jQuery <1.7
       
 16175 			// .text() can't accept undefined, so coerce to a string
       
 16176 			var title = $( this ).attr( "title" ) || "";
       
 16177 			// Escape title, since we're going from an attribute to raw HTML
       
 16178 			return $( "<a>" ).text( title ).html();
       
 16179 		},
       
 16180 		hide: true,
       
 16181 		// Disabled elements have inconsistent behavior across browsers (#8661)
       
 16182 		items: "[title]:not([disabled])",
       
 16183 		position: {
       
 16184 			my: "left top+15",
       
 16185 			at: "left bottom",
       
 16186 			collision: "flipfit flip"
       
 16187 		},
       
 16188 		show: true,
       
 16189 		tooltipClass: null,
       
 16190 		track: false,
       
 16191 
       
 16192 		// callbacks
       
 16193 		close: null,
       
 16194 		open: null
       
 16195 	},
       
 16196 
       
 16197 	_addDescribedBy: function( elem, id ) {
       
 16198 		var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
       
 16199 		describedby.push( id );
       
 16200 		elem
       
 16201 			.data( "ui-tooltip-id", id )
       
 16202 			.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
       
 16203 	},
       
 16204 
       
 16205 	_removeDescribedBy: function( elem ) {
       
 16206 		var id = elem.data( "ui-tooltip-id" ),
       
 16207 			describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
       
 16208 			index = $.inArray( id, describedby );
       
 16209 
       
 16210 		if ( index !== -1 ) {
       
 16211 			describedby.splice( index, 1 );
       
 16212 		}
       
 16213 
       
 16214 		elem.removeData( "ui-tooltip-id" );
       
 16215 		describedby = $.trim( describedby.join( " " ) );
       
 16216 		if ( describedby ) {
       
 16217 			elem.attr( "aria-describedby", describedby );
       
 16218 		} else {
       
 16219 			elem.removeAttr( "aria-describedby" );
       
 16220 		}
       
 16221 	},
       
 16222 
       
 16223 	_create: function() {
       
 16224 		this._on({
       
 16225 			mouseover: "open",
       
 16226 			focusin: "open"
       
 16227 		});
       
 16228 
       
 16229 		// IDs of generated tooltips, needed for destroy
       
 16230 		this.tooltips = {};
       
 16231 
       
 16232 		// IDs of parent tooltips where we removed the title attribute
       
 16233 		this.parents = {};
       
 16234 
       
 16235 		if ( this.options.disabled ) {
       
 16236 			this._disable();
       
 16237 		}
       
 16238 
       
 16239 		// Append the aria-live region so tooltips announce correctly
       
 16240 		this.liveRegion = $( "<div>" )
       
 16241 			.attr({
       
 16242 				role: "log",
       
 16243 				"aria-live": "assertive",
       
 16244 				"aria-relevant": "additions"
       
 16245 			})
       
 16246 			.addClass( "ui-helper-hidden-accessible" )
       
 16247 			.appendTo( this.document[ 0 ].body );
       
 16248 	},
       
 16249 
       
 16250 	_setOption: function( key, value ) {
       
 16251 		var that = this;
       
 16252 
       
 16253 		if ( key === "disabled" ) {
       
 16254 			this[ value ? "_disable" : "_enable" ]();
       
 16255 			this.options[ key ] = value;
       
 16256 			// disable element style changes
       
 16257 			return;
       
 16258 		}
       
 16259 
       
 16260 		this._super( key, value );
       
 16261 
       
 16262 		if ( key === "content" ) {
       
 16263 			$.each( this.tooltips, function( id, tooltipData ) {
       
 16264 				that._updateContent( tooltipData.element );
       
 16265 			});
       
 16266 		}
       
 16267 	},
       
 16268 
       
 16269 	_disable: function() {
       
 16270 		var that = this;
       
 16271 
       
 16272 		// close open tooltips
       
 16273 		$.each( this.tooltips, function( id, tooltipData ) {
       
 16274 			var event = $.Event( "blur" );
       
 16275 			event.target = event.currentTarget = tooltipData.element[ 0 ];
       
 16276 			that.close( event, true );
       
 16277 		});
       
 16278 
       
 16279 		// remove title attributes to prevent native tooltips
       
 16280 		this.element.find( this.options.items ).addBack().each(function() {
       
 16281 			var element = $( this );
       
 16282 			if ( element.is( "[title]" ) ) {
       
 16283 				element
       
 16284 					.data( "ui-tooltip-title", element.attr( "title" ) )
       
 16285 					.removeAttr( "title" );
       
 16286 			}
       
 16287 		});
       
 16288 	},
       
 16289 
       
 16290 	_enable: function() {
       
 16291 		// restore title attributes
       
 16292 		this.element.find( this.options.items ).addBack().each(function() {
       
 16293 			var element = $( this );
       
 16294 			if ( element.data( "ui-tooltip-title" ) ) {
       
 16295 				element.attr( "title", element.data( "ui-tooltip-title" ) );
       
 16296 			}
       
 16297 		});
       
 16298 	},
       
 16299 
       
 16300 	open: function( event ) {
       
 16301 		var that = this,
       
 16302 			target = $( event ? event.target : this.element )
       
 16303 				// we need closest here due to mouseover bubbling,
       
 16304 				// but always pointing at the same event target
       
 16305 				.closest( this.options.items );
       
 16306 
       
 16307 		// No element to show a tooltip for or the tooltip is already open
       
 16308 		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
       
 16309 			return;
       
 16310 		}
       
 16311 
       
 16312 		if ( target.attr( "title" ) ) {
       
 16313 			target.data( "ui-tooltip-title", target.attr( "title" ) );
       
 16314 		}
       
 16315 
       
 16316 		target.data( "ui-tooltip-open", true );
       
 16317 
       
 16318 		// kill parent tooltips, custom or native, for hover
       
 16319 		if ( event && event.type === "mouseover" ) {
       
 16320 			target.parents().each(function() {
       
 16321 				var parent = $( this ),
       
 16322 					blurEvent;
       
 16323 				if ( parent.data( "ui-tooltip-open" ) ) {
       
 16324 					blurEvent = $.Event( "blur" );
       
 16325 					blurEvent.target = blurEvent.currentTarget = this;
       
 16326 					that.close( blurEvent, true );
       
 16327 				}
       
 16328 				if ( parent.attr( "title" ) ) {
       
 16329 					parent.uniqueId();
       
 16330 					that.parents[ this.id ] = {
       
 16331 						element: this,
       
 16332 						title: parent.attr( "title" )
       
 16333 					};
       
 16334 					parent.attr( "title", "" );
       
 16335 				}
       
 16336 			});
       
 16337 		}
       
 16338 
       
 16339 		this._registerCloseHandlers( event, target );
       
 16340 		this._updateContent( target, event );
       
 16341 	},
       
 16342 
       
 16343 	_updateContent: function( target, event ) {
       
 16344 		var content,
       
 16345 			contentOption = this.options.content,
       
 16346 			that = this,
       
 16347 			eventType = event ? event.type : null;
       
 16348 
       
 16349 		if ( typeof contentOption === "string" ) {
       
 16350 			return this._open( event, target, contentOption );
       
 16351 		}
       
 16352 
       
 16353 		content = contentOption.call( target[0], function( response ) {
       
 16354 
       
 16355 			// IE may instantly serve a cached response for ajax requests
       
 16356 			// delay this call to _open so the other call to _open runs first
       
 16357 			that._delay(function() {
       
 16358 
       
 16359 				// Ignore async response if tooltip was closed already
       
 16360 				if ( !target.data( "ui-tooltip-open" ) ) {
       
 16361 					return;
       
 16362 				}
       
 16363 
       
 16364 				// jQuery creates a special event for focusin when it doesn't
       
 16365 				// exist natively. To improve performance, the native event
       
 16366 				// object is reused and the type is changed. Therefore, we can't
       
 16367 				// rely on the type being correct after the event finished
       
 16368 				// bubbling, so we set it back to the previous value. (#8740)
       
 16369 				if ( event ) {
       
 16370 					event.type = eventType;
       
 16371 				}
       
 16372 				this._open( event, target, response );
       
 16373 			});
       
 16374 		});
       
 16375 		if ( content ) {
       
 16376 			this._open( event, target, content );
       
 16377 		}
       
 16378 	},
       
 16379 
       
 16380 	_open: function( event, target, content ) {
       
 16381 		var tooltipData, tooltip, delayedShow, a11yContent,
       
 16382 			positionOption = $.extend( {}, this.options.position );
       
 16383 
       
 16384 		if ( !content ) {
       
 16385 			return;
       
 16386 		}
       
 16387 
       
 16388 		// Content can be updated multiple times. If the tooltip already
       
 16389 		// exists, then just update the content and bail.
       
 16390 		tooltipData = this._find( target );
       
 16391 		if ( tooltipData ) {
       
 16392 			tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
       
 16393 			return;
       
 16394 		}
       
 16395 
       
 16396 		// if we have a title, clear it to prevent the native tooltip
       
 16397 		// we have to check first to avoid defining a title if none exists
       
 16398 		// (we don't want to cause an element to start matching [title])
       
 16399 		//
       
 16400 		// We use removeAttr only for key events, to allow IE to export the correct
       
 16401 		// accessible attributes. For mouse events, set to empty string to avoid
       
 16402 		// native tooltip showing up (happens only when removing inside mouseover).
       
 16403 		if ( target.is( "[title]" ) ) {
       
 16404 			if ( event && event.type === "mouseover" ) {
       
 16405 				target.attr( "title", "" );
       
 16406 			} else {
       
 16407 				target.removeAttr( "title" );
       
 16408 			}
       
 16409 		}
       
 16410 
       
 16411 		tooltipData = this._tooltip( target );
       
 16412 		tooltip = tooltipData.tooltip;
       
 16413 		this._addDescribedBy( target, tooltip.attr( "id" ) );
       
 16414 		tooltip.find( ".ui-tooltip-content" ).html( content );
       
 16415 
       
 16416 		// Support: Voiceover on OS X, JAWS on IE <= 9
       
 16417 		// JAWS announces deletions even when aria-relevant="additions"
       
 16418 		// Voiceover will sometimes re-read the entire log region's contents from the beginning
       
 16419 		this.liveRegion.children().hide();
       
 16420 		if ( content.clone ) {
       
 16421 			a11yContent = content.clone();
       
 16422 			a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
       
 16423 		} else {
       
 16424 			a11yContent = content;
       
 16425 		}
       
 16426 		$( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
       
 16427 
       
 16428 		function position( event ) {
       
 16429 			positionOption.of = event;
       
 16430 			if ( tooltip.is( ":hidden" ) ) {
       
 16431 				return;
       
 16432 			}
       
 16433 			tooltip.position( positionOption );
       
 16434 		}
       
 16435 		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
       
 16436 			this._on( this.document, {
       
 16437 				mousemove: position
       
 16438 			});
       
 16439 			// trigger once to override element-relative positioning
       
 16440 			position( event );
       
 16441 		} else {
       
 16442 			tooltip.position( $.extend({
       
 16443 				of: target
       
 16444 			}, this.options.position ) );
       
 16445 		}
       
 16446 
       
 16447 		tooltip.hide();
       
 16448 
       
 16449 		this._show( tooltip, this.options.show );
       
 16450 		// Handle tracking tooltips that are shown with a delay (#8644). As soon
       
 16451 		// as the tooltip is visible, position the tooltip using the most recent
       
 16452 		// event.
       
 16453 		if ( this.options.show && this.options.show.delay ) {
       
 16454 			delayedShow = this.delayedShow = setInterval(function() {
       
 16455 				if ( tooltip.is( ":visible" ) ) {
       
 16456 					position( positionOption.of );
       
 16457 					clearInterval( delayedShow );
       
 16458 				}
       
 16459 			}, $.fx.interval );
       
 16460 		}
       
 16461 
       
 16462 		this._trigger( "open", event, { tooltip: tooltip } );
       
 16463 	},
       
 16464 
       
 16465 	_registerCloseHandlers: function( event, target ) {
       
 16466 		var events = {
       
 16467 			keyup: function( event ) {
       
 16468 				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
       
 16469 					var fakeEvent = $.Event(event);
       
 16470 					fakeEvent.currentTarget = target[0];
       
 16471 					this.close( fakeEvent, true );
       
 16472 				}
       
 16473 			}
       
 16474 		};
       
 16475 
       
 16476 		// Only bind remove handler for delegated targets. Non-delegated
       
 16477 		// tooltips will handle this in destroy.
       
 16478 		if ( target[ 0 ] !== this.element[ 0 ] ) {
       
 16479 			events.remove = function() {
       
 16480 				this._removeTooltip( this._find( target ).tooltip );
       
 16481 			};
       
 16482 		}
       
 16483 
       
 16484 		if ( !event || event.type === "mouseover" ) {
       
 16485 			events.mouseleave = "close";
       
 16486 		}
       
 16487 		if ( !event || event.type === "focusin" ) {
       
 16488 			events.focusout = "close";
       
 16489 		}
       
 16490 		this._on( true, target, events );
       
 16491 	},
       
 16492 
       
 16493 	close: function( event ) {
       
 16494 		var tooltip,
       
 16495 			that = this,
       
 16496 			target = $( event ? event.currentTarget : this.element ),
       
 16497 			tooltipData = this._find( target );
       
 16498 
       
 16499 		// The tooltip may already be closed
       
 16500 		if ( !tooltipData ) {
       
 16501 
       
 16502 			// We set ui-tooltip-open immediately upon open (in open()), but only set the
       
 16503 			// additional data once there's actually content to show (in _open()). So even if the
       
 16504 			// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
       
 16505 			// the period between open() and _open().
       
 16506 			target.removeData( "ui-tooltip-open" );
       
 16507 			return;
       
 16508 		}
       
 16509 
       
 16510 		tooltip = tooltipData.tooltip;
       
 16511 
       
 16512 		// disabling closes the tooltip, so we need to track when we're closing
       
 16513 		// to avoid an infinite loop in case the tooltip becomes disabled on close
       
 16514 		if ( tooltipData.closing ) {
       
 16515 			return;
       
 16516 		}
       
 16517 
       
 16518 		// Clear the interval for delayed tracking tooltips
       
 16519 		clearInterval( this.delayedShow );
       
 16520 
       
 16521 		// only set title if we had one before (see comment in _open())
       
 16522 		// If the title attribute has changed since open(), don't restore
       
 16523 		if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
       
 16524 			target.attr( "title", target.data( "ui-tooltip-title" ) );
       
 16525 		}
       
 16526 
       
 16527 		this._removeDescribedBy( target );
       
 16528 
       
 16529 		tooltipData.hiding = true;
       
 16530 		tooltip.stop( true );
       
 16531 		this._hide( tooltip, this.options.hide, function() {
       
 16532 			that._removeTooltip( $( this ) );
       
 16533 		});
       
 16534 
       
 16535 		target.removeData( "ui-tooltip-open" );
       
 16536 		this._off( target, "mouseleave focusout keyup" );
       
 16537 
       
 16538 		// Remove 'remove' binding only on delegated targets
       
 16539 		if ( target[ 0 ] !== this.element[ 0 ] ) {
       
 16540 			this._off( target, "remove" );
       
 16541 		}
       
 16542 		this._off( this.document, "mousemove" );
       
 16543 
       
 16544 		if ( event && event.type === "mouseleave" ) {
       
 16545 			$.each( this.parents, function( id, parent ) {
       
 16546 				$( parent.element ).attr( "title", parent.title );
       
 16547 				delete that.parents[ id ];
       
 16548 			});
       
 16549 		}
       
 16550 
       
 16551 		tooltipData.closing = true;
       
 16552 		this._trigger( "close", event, { tooltip: tooltip } );
       
 16553 		if ( !tooltipData.hiding ) {
       
 16554 			tooltipData.closing = false;
       
 16555 		}
       
 16556 	},
       
 16557 
       
 16558 	_tooltip: function( element ) {
       
 16559 		var tooltip = $( "<div>" )
       
 16560 				.attr( "role", "tooltip" )
       
 16561 				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
       
 16562 					( this.options.tooltipClass || "" ) ),
       
 16563 			id = tooltip.uniqueId().attr( "id" );
       
 16564 
       
 16565 		$( "<div>" )
       
 16566 			.addClass( "ui-tooltip-content" )
       
 16567 			.appendTo( tooltip );
       
 16568 
       
 16569 		tooltip.appendTo( this.document[0].body );
       
 16570 
       
 16571 		return this.tooltips[ id ] = {
       
 16572 			element: element,
       
 16573 			tooltip: tooltip
       
 16574 		};
       
 16575 	},
       
 16576 
       
 16577 	_find: function( target ) {
       
 16578 		var id = target.data( "ui-tooltip-id" );
       
 16579 		return id ? this.tooltips[ id ] : null;
       
 16580 	},
       
 16581 
       
 16582 	_removeTooltip: function( tooltip ) {
       
 16583 		tooltip.remove();
       
 16584 		delete this.tooltips[ tooltip.attr( "id" ) ];
       
 16585 	},
       
 16586 
       
 16587 	_destroy: function() {
       
 16588 		var that = this;
       
 16589 
       
 16590 		// close open tooltips
       
 16591 		$.each( this.tooltips, function( id, tooltipData ) {
       
 16592 			// Delegate to close method to handle common cleanup
       
 16593 			var event = $.Event( "blur" ),
       
 16594 				element = tooltipData.element;
       
 16595 			event.target = event.currentTarget = element[ 0 ];
       
 16596 			that.close( event, true );
       
 16597 
       
 16598 			// Remove immediately; destroying an open tooltip doesn't use the
       
 16599 			// hide animation
       
 16600 			$( "#" + id ).remove();
       
 16601 
       
 16602 			// Restore the title
       
 16603 			if ( element.data( "ui-tooltip-title" ) ) {
       
 16604 				// If the title attribute has changed since open(), don't restore
       
 16605 				if ( !element.attr( "title" ) ) {
       
 16606 					element.attr( "title", element.data( "ui-tooltip-title" ) );
       
 16607 				}
       
 16608 				element.removeData( "ui-tooltip-title" );
       
 16609 			}
       
 16610 		});
       
 16611 		this.liveRegion.remove();
       
 16612 	}
       
 16613 });
       
 16614 
       
 16615 
       
 16616 
       
 16617 }));