blinker / firefox.plugin / data / lib / jquery-ui / jquery-ui.js @ 76dd22bd
History | View | Annotate | Download (459.566 KB)
1 | a03cd52e | Thies Pfeiffer | /*! 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, "'") + "'" : "") + // cell title |
||
5533 | (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions |
||
5534 | (otherMonth && !showOtherMonths ? " " : // 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) ? " " : ""); |
||
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) ? " " : "") + 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( " " );
|
||
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( " " );
|
||
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> </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 + "'>▲</span>" + |
||
15035 | "</a>" +
|
||
15036 | "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
|
||
15037 | "<span class='ui-icon " + this.options.icons.down + "'>▼</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 | })); |