Projet

Général

Profil

Paste
Télécharger (426 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / jquery_update / replace / ui / ui / jquery-ui.js @ 503b3f7b

1 503b3f7b Assos Assos
/*! jQuery UI - v1.10.2 - 2013-03-14
2
* http://jqueryui.com
3
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
4
* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
5 85ad3d82 Assos Assos
(function( $, undefined ) {
6
7 503b3f7b Assos Assos
var uuid = 0,
8
        runiqueId = /^ui-id-\d+$/;
9
10
// $.ui might exist from components with no dependencies, e.g., $.ui.position
11 85ad3d82 Assos Assos
$.ui = $.ui || {};
12
13
$.extend( $.ui, {
14 503b3f7b Assos Assos
        version: "1.10.2",
15 85ad3d82 Assos Assos
16
        keyCode: {
17
                BACKSPACE: 8,
18
                COMMA: 188,
19
                DELETE: 46,
20
                DOWN: 40,
21
                END: 35,
22
                ENTER: 13,
23
                ESCAPE: 27,
24
                HOME: 36,
25
                LEFT: 37,
26
                NUMPAD_ADD: 107,
27
                NUMPAD_DECIMAL: 110,
28
                NUMPAD_DIVIDE: 111,
29
                NUMPAD_ENTER: 108,
30
                NUMPAD_MULTIPLY: 106,
31
                NUMPAD_SUBTRACT: 109,
32
                PAGE_DOWN: 34,
33
                PAGE_UP: 33,
34
                PERIOD: 190,
35
                RIGHT: 39,
36
                SPACE: 32,
37
                TAB: 9,
38 503b3f7b Assos Assos
                UP: 38
39 85ad3d82 Assos Assos
        }
40
});
41
42
// plugins
43
$.fn.extend({
44 503b3f7b Assos Assos
        focus: (function( orig ) {
45
                return function( delay, fn ) {
46
                        return typeof delay === "number" ?
47
                                this.each(function() {
48
                                        var elem = this;
49
                                        setTimeout(function() {
50
                                                $( elem ).focus();
51
                                                if ( fn ) {
52
                                                        fn.call( elem );
53
                                                }
54
                                        }, delay );
55
                                }) :
56
                                orig.apply( this, arguments );
57
                };
58
        })( $.fn.focus ),
59 85ad3d82 Assos Assos
60
        scrollParent: function() {
61
                var scrollParent;
62 503b3f7b Assos Assos
                if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
63 85ad3d82 Assos Assos
                        scrollParent = this.parents().filter(function() {
64 503b3f7b Assos Assos
                                return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
65 85ad3d82 Assos Assos
                        }).eq(0);
66
                } else {
67
                        scrollParent = this.parents().filter(function() {
68 503b3f7b Assos Assos
                                return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
69 85ad3d82 Assos Assos
                        }).eq(0);
70
                }
71
72 503b3f7b Assos Assos
                return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
73 85ad3d82 Assos Assos
        },
74
75
        zIndex: function( zIndex ) {
76
                if ( zIndex !== undefined ) {
77
                        return this.css( "zIndex", zIndex );
78
                }
79
80
                if ( this.length ) {
81
                        var elem = $( this[ 0 ] ), position, value;
82
                        while ( elem.length && elem[ 0 ] !== document ) {
83
                                // Ignore z-index if position is set to a value where z-index is ignored by the browser
84
                                // This makes behavior of this function consistent across browsers
85
                                // WebKit always returns auto if the element is positioned
86
                                position = elem.css( "position" );
87
                                if ( position === "absolute" || position === "relative" || position === "fixed" ) {
88
                                        // IE returns 0 when zIndex is not specified
89
                                        // other browsers return a string
90
                                        // we ignore the case of nested elements with an explicit value of 0
91
                                        // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
92
                                        value = parseInt( elem.css( "zIndex" ), 10 );
93
                                        if ( !isNaN( value ) && value !== 0 ) {
94
                                                return value;
95
                                        }
96
                                }
97
                                elem = elem.parent();
98
                        }
99
                }
100
101
                return 0;
102
        },
103
104 503b3f7b Assos Assos
        uniqueId: function() {
105 85ad3d82 Assos Assos
                return this.each(function() {
106 503b3f7b Assos Assos
                        if ( !this.id ) {
107
                                this.id = "ui-id-" + (++uuid);
108
                        }
109 85ad3d82 Assos Assos
                });
110 503b3f7b Assos Assos
        },
111 85ad3d82 Assos Assos
112 503b3f7b Assos Assos
        removeUniqueId: function() {
113 85ad3d82 Assos Assos
                return this.each(function() {
114 503b3f7b Assos Assos
                        if ( runiqueId.test( this.id ) ) {
115
                                $( this ).removeAttr( "id" );
116
                        }
117 85ad3d82 Assos Assos
                });
118 503b3f7b Assos Assos
        }
119 85ad3d82 Assos Assos
});
120
121
// selectors
122 503b3f7b Assos Assos
function focusable( element, isTabIndexNotNaN ) {
123
        var map, mapName, img,
124
                nodeName = element.nodeName.toLowerCase();
125
        if ( "area" === nodeName ) {
126
                map = element.parentNode;
127
                mapName = map.name;
128
                if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
129
                        return false;
130
                }
131
                img = $( "img[usemap=#" + mapName + "]" )[0];
132
                return !!img && visible( img );
133
        }
134
        return ( /input|select|textarea|button|object/.test( nodeName ) ?
135
                !element.disabled :
136
                "a" === nodeName ?
137
                        element.href || isTabIndexNotNaN :
138
                        isTabIndexNotNaN) &&
139
                // the element and all of its ancestors must be visible
140
                visible( element );
141
}
142
143 85ad3d82 Assos Assos
function visible( element ) {
144 503b3f7b Assos Assos
        return $.expr.filters.visible( element ) &&
145
                !$( element ).parents().addBack().filter(function() {
146
                        return $.css( this, "visibility" ) === "hidden";
147
                }).length;
148 85ad3d82 Assos Assos
}
149
150
$.extend( $.expr[ ":" ], {
151 503b3f7b Assos Assos
        data: $.expr.createPseudo ?
152
                $.expr.createPseudo(function( dataName ) {
153
                        return function( elem ) {
154
                                return !!$.data( elem, dataName );
155
                        };
156
                }) :
157
                // support: jQuery <1.8
158
                function( elem, i, match ) {
159
                        return !!$.data( elem, match[ 3 ] );
160
                },
161 85ad3d82 Assos Assos
162
        focusable: function( element ) {
163 503b3f7b Assos Assos
                return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
164 85ad3d82 Assos Assos
        },
165
166
        tabbable: function( element ) {
167 503b3f7b Assos Assos
                var tabIndex = $.attr( element, "tabindex" ),
168
                        isTabIndexNaN = isNaN( tabIndex );
169
                return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
170 85ad3d82 Assos Assos
        }
171
});
172
173 503b3f7b Assos Assos
// support: jQuery <1.8
174
if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
175
        $.each( [ "Width", "Height" ], function( i, name ) {
176
                var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
177
                        type = name.toLowerCase(),
178
                        orig = {
179
                                innerWidth: $.fn.innerWidth,
180
                                innerHeight: $.fn.innerHeight,
181
                                outerWidth: $.fn.outerWidth,
182
                                outerHeight: $.fn.outerHeight
183
                        };
184 85ad3d82 Assos Assos
185 503b3f7b Assos Assos
                function reduce( elem, size, border, margin ) {
186
                        $.each( side, function() {
187
                                size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
188
                                if ( border ) {
189
                                        size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
190
                                }
191
                                if ( margin ) {
192
                                        size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
193
                                }
194
                        });
195
                        return size;
196
                }
197
198
                $.fn[ "inner" + name ] = function( size ) {
199
                        if ( size === undefined ) {
200
                                return orig[ "inner" + name ].call( this );
201
                        }
202
203
                        return this.each(function() {
204
                                $( this ).css( type, reduce( this, size ) + "px" );
205
                        });
206
                };
207
208
                $.fn[ "outer" + name] = function( size, margin ) {
209
                        if ( typeof size !== "number" ) {
210
                                return orig[ "outer" + name ].call( this, size );
211
                        }
212
213
                        return this.each(function() {
214
                                $( this).css( type, reduce( this, size, true, margin ) + "px" );
215
                        });
216
                };
217 85ad3d82 Assos Assos
        });
218 503b3f7b Assos Assos
}
219 85ad3d82 Assos Assos
220 503b3f7b Assos Assos
// support: jQuery <1.8
221
if ( !$.fn.addBack ) {
222
        $.fn.addBack = function( selector ) {
223
                return this.add( selector == null ?
224
                        this.prevObject : this.prevObject.filter( selector )
225
                );
226
        };
227
}
228 85ad3d82 Assos Assos
229 503b3f7b Assos Assos
// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
230
if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
231
        $.fn.removeData = (function( removeData ) {
232
                return function( key ) {
233
                        if ( arguments.length ) {
234
                                return removeData.call( this, $.camelCase( key ) );
235
                        } else {
236
                                return removeData.call( this );
237
                        }
238
                };
239
        })( $.fn.removeData );
240
}
241 85ad3d82 Assos Assos
242
243
244
245
246
// deprecated
247 503b3f7b Assos Assos
$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
248
249
$.support.selectstart = "onselectstart" in document.createElement( "div" );
250
$.fn.extend({
251
        disableSelection: function() {
252
                return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
253
                        ".ui-disableSelection", function( event ) {
254
                                event.preventDefault();
255
                        });
256
        },
257
258
        enableSelection: function() {
259
                return this.unbind( ".ui-disableSelection" );
260
        }
261
});
262
263 85ad3d82 Assos Assos
$.extend( $.ui, {
264
        // $.ui.plugin is deprecated.  Use the proxy pattern instead.
265
        plugin: {
266
                add: function( module, option, set ) {
267 503b3f7b Assos Assos
                        var i,
268
                                proto = $.ui[ module ].prototype;
269
                        for ( i in set ) {
270 85ad3d82 Assos Assos
                                proto.plugins[ i ] = proto.plugins[ i ] || [];
271
                                proto.plugins[ i ].push( [ option, set[ i ] ] );
272
                        }
273
                },
274
                call: function( instance, name, args ) {
275 503b3f7b Assos Assos
                        var i,
276
                                set = instance.plugins[ name ];
277
                        if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
278 85ad3d82 Assos Assos
                                return;
279
                        }
280 503b3f7b Assos Assos
281
                        for ( i = 0; i < set.length; i++ ) {
282 85ad3d82 Assos Assos
                                if ( instance.options[ set[ i ][ 0 ] ] ) {
283
                                        set[ i ][ 1 ].apply( instance.element, args );
284
                                }
285
                        }
286
                }
287
        },
288 503b3f7b Assos Assos
289 85ad3d82 Assos Assos
        // only used by resizable
290
        hasScroll: function( el, a ) {
291 503b3f7b Assos Assos
292 85ad3d82 Assos Assos
                //If overflow is hidden, the element might have extra content, but the user wants to hide it
293
                if ( $( el ).css( "overflow" ) === "hidden") {
294
                        return false;
295
                }
296 503b3f7b Assos Assos
297 85ad3d82 Assos Assos
                var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
298
                        has = false;
299 503b3f7b Assos Assos
300 85ad3d82 Assos Assos
                if ( el[ scroll ] > 0 ) {
301
                        return true;
302
                }
303 503b3f7b Assos Assos
304 85ad3d82 Assos Assos
                // TODO: determine which cases actually cause this to happen
305
                // if the element doesn't have the scroll set, see if it's possible to
306
                // set the scroll
307
                el[ scroll ] = 1;
308
                has = ( el[ scroll ] > 0 );
309
                el[ scroll ] = 0;
310
                return has;
311
        }
312
});
313
314
})( jQuery );
315 503b3f7b Assos Assos
316 85ad3d82 Assos Assos
(function( $, undefined ) {
317
318 503b3f7b Assos Assos
var uuid = 0,
319
        slice = Array.prototype.slice,
320
        _cleanData = $.cleanData;
321
$.cleanData = function( elems ) {
322
        for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
323
                try {
324 85ad3d82 Assos Assos
                        $( elem ).triggerHandler( "remove" );
325 503b3f7b Assos Assos
                // http://bugs.jquery.com/ticket/8235
326
                } catch( e ) {}
327
        }
328
        _cleanData( elems );
329
};
330 85ad3d82 Assos Assos
331
$.widget = function( name, base, prototype ) {
332 503b3f7b Assos Assos
        var fullName, existingConstructor, constructor, basePrototype,
333
                // proxiedPrototype allows the provided prototype to remain unmodified
334
                // so that it can be used as a mixin for multiple widgets (#8876)
335
                proxiedPrototype = {},
336
                namespace = name.split( "." )[ 0 ];
337
338 85ad3d82 Assos Assos
        name = name.split( "." )[ 1 ];
339
        fullName = namespace + "-" + name;
340
341
        if ( !prototype ) {
342
                prototype = base;
343
                base = $.Widget;
344
        }
345
346
        // create selector for plugin
347 503b3f7b Assos Assos
        $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
348
                return !!$.data( elem, fullName );
349 85ad3d82 Assos Assos
        };
350
351
        $[ namespace ] = $[ namespace ] || {};
352 503b3f7b Assos Assos
        existingConstructor = $[ namespace ][ name ];
353
        constructor = $[ namespace ][ name ] = function( options, element ) {
354
                // allow instantiation without "new" keyword
355
                if ( !this._createWidget ) {
356
                        return new constructor( options, element );
357
                }
358
359 85ad3d82 Assos Assos
                // allow instantiation without initializing for simple inheritance
360 503b3f7b Assos Assos
                // must use "new" keyword (the code above always passes args)
361 85ad3d82 Assos Assos
                if ( arguments.length ) {
362
                        this._createWidget( options, element );
363
                }
364
        };
365 503b3f7b Assos Assos
        // extend with the existing constructor to carry over any static properties
366
        $.extend( constructor, existingConstructor, {
367
                version: prototype.version,
368
                // copy the object used to create the prototype in case we need to
369
                // redefine the widget later
370
                _proto: $.extend( {}, prototype ),
371
                // track widgets that inherit from this widget in case this widget is
372
                // redefined after a widget inherits from it
373
                _childConstructors: []
374
        });
375 85ad3d82 Assos Assos
376 503b3f7b Assos Assos
        basePrototype = new base();
377 85ad3d82 Assos Assos
        // we need to make the options hash a property directly on the new instance
378
        // otherwise we'll modify the options hash on the prototype that we're
379
        // inheriting from
380 503b3f7b Assos Assos
        basePrototype.options = $.widget.extend( {}, basePrototype.options );
381
        $.each( prototype, function( prop, value ) {
382
                if ( !$.isFunction( value ) ) {
383
                        proxiedPrototype[ prop ] = value;
384
                        return;
385
                }
386
                proxiedPrototype[ prop ] = (function() {
387
                        var _super = function() {
388
                                        return base.prototype[ prop ].apply( this, arguments );
389
                                },
390
                                _superApply = function( args ) {
391
                                        return base.prototype[ prop ].apply( this, args );
392
                                };
393
                        return function() {
394
                                var __super = this._super,
395
                                        __superApply = this._superApply,
396
                                        returnValue;
397
398
                                this._super = _super;
399
                                this._superApply = _superApply;
400
401
                                returnValue = value.apply( this, arguments );
402
403
                                this._super = __super;
404
                                this._superApply = __superApply;
405
406
                                return returnValue;
407
                        };
408
                })();
409
        });
410
        constructor.prototype = $.widget.extend( basePrototype, {
411
                // TODO: remove support for widgetEventPrefix
412
                // always use the name + a colon as the prefix, e.g., draggable:start
413
                // don't prefix for widgets that aren't DOM-based
414
                widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
415
        }, proxiedPrototype, {
416
                constructor: constructor,
417 85ad3d82 Assos Assos
                namespace: namespace,
418
                widgetName: name,
419 503b3f7b Assos Assos
                widgetFullName: fullName
420
        });
421 85ad3d82 Assos Assos
422 503b3f7b Assos Assos
        // If this widget is being redefined then we need to find all widgets that
423
        // are inheriting from it and redefine all of them so that they inherit from
424
        // the new version of this widget. We're essentially trying to replace one
425
        // level in the prototype chain.
426
        if ( existingConstructor ) {
427
                $.each( existingConstructor._childConstructors, function( i, child ) {
428
                        var childPrototype = child.prototype;
429
430
                        // redefine the child widget using the same prototype that was
431
                        // originally used, but inherit from the new version of the base
432
                        $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
433
                });
434
                // remove the list of existing child constructors from the old constructor
435
                // so the old child constructors can be garbage collected
436
                delete existingConstructor._childConstructors;
437
        } else {
438
                base._childConstructors.push( constructor );
439
        }
440
441
        $.widget.bridge( name, constructor );
442
};
443
444
$.widget.extend = function( target ) {
445
        var input = slice.call( arguments, 1 ),
446
                inputIndex = 0,
447
                inputLength = input.length,
448
                key,
449
                value;
450
        for ( ; inputIndex < inputLength; inputIndex++ ) {
451
                for ( key in input[ inputIndex ] ) {
452
                        value = input[ inputIndex ][ key ];
453
                        if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
454
                                // Clone objects
455
                                if ( $.isPlainObject( value ) ) {
456
                                        target[ key ] = $.isPlainObject( target[ key ] ) ?
457
                                                $.widget.extend( {}, target[ key ], value ) :
458
                                                // Don't extend strings, arrays, etc. with objects
459
                                                $.widget.extend( {}, value );
460
                                // Copy everything else by reference
461
                                } else {
462
                                        target[ key ] = value;
463
                                }
464
                        }
465
                }
466
        }
467
        return target;
468 85ad3d82 Assos Assos
};
469
470
$.widget.bridge = function( name, object ) {
471 503b3f7b Assos Assos
        var fullName = object.prototype.widgetFullName || name;
472 85ad3d82 Assos Assos
        $.fn[ name ] = function( options ) {
473
                var isMethodCall = typeof options === "string",
474 503b3f7b Assos Assos
                        args = slice.call( arguments, 1 ),
475 85ad3d82 Assos Assos
                        returnValue = this;
476
477
                // allow multiple hashes to be passed on init
478
                options = !isMethodCall && args.length ?
479 503b3f7b Assos Assos
                        $.widget.extend.apply( null, [ options ].concat(args) ) :
480 85ad3d82 Assos Assos
                        options;
481
482
                if ( isMethodCall ) {
483
                        this.each(function() {
484 503b3f7b Assos Assos
                                var methodValue,
485
                                        instance = $.data( this, fullName );
486
                                if ( !instance ) {
487
                                        return $.error( "cannot call methods on " + name + " prior to initialization; " +
488
                                                "attempted to call method '" + options + "'" );
489
                                }
490
                                if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
491
                                        return $.error( "no such method '" + options + "' for " + name + " widget instance" );
492
                                }
493
                                methodValue = instance[ options ].apply( instance, args );
494 85ad3d82 Assos Assos
                                if ( methodValue !== instance && methodValue !== undefined ) {
495 503b3f7b Assos Assos
                                        returnValue = methodValue && methodValue.jquery ?
496
                                                returnValue.pushStack( methodValue.get() ) :
497
                                                methodValue;
498 85ad3d82 Assos Assos
                                        return false;
499
                                }
500
                        });
501
                } else {
502
                        this.each(function() {
503 503b3f7b Assos Assos
                                var instance = $.data( this, fullName );
504 85ad3d82 Assos Assos
                                if ( instance ) {
505
                                        instance.option( options || {} )._init();
506
                                } else {
507 503b3f7b Assos Assos
                                        $.data( this, fullName, new object( options, this ) );
508 85ad3d82 Assos Assos
                                }
509
                        });
510
                }
511
512
                return returnValue;
513
        };
514
};
515
516 503b3f7b Assos Assos
$.Widget = function( /* options, element */ ) {};
517
$.Widget._childConstructors = [];
518 85ad3d82 Assos Assos
519
$.Widget.prototype = {
520
        widgetName: "widget",
521
        widgetEventPrefix: "",
522 503b3f7b Assos Assos
        defaultElement: "<div>",
523 85ad3d82 Assos Assos
        options: {
524 503b3f7b Assos Assos
                disabled: false,
525
526
                // callbacks
527
                create: null
528 85ad3d82 Assos Assos
        },
529
        _createWidget: function( options, element ) {
530 503b3f7b Assos Assos
                element = $( element || this.defaultElement || this )[ 0 ];
531 85ad3d82 Assos Assos
                this.element = $( element );
532 503b3f7b Assos Assos
                this.uuid = uuid++;
533
                this.eventNamespace = "." + this.widgetName + this.uuid;
534
                this.options = $.widget.extend( {},
535 85ad3d82 Assos Assos
                        this.options,
536
                        this._getCreateOptions(),
537
                        options );
538
539 503b3f7b Assos Assos
                this.bindings = $();
540
                this.hoverable = $();
541
                this.focusable = $();
542
543
                if ( element !== this ) {
544
                        $.data( element, this.widgetFullName, this );
545
                        this._on( true, this.element, {
546
                                remove: function( event ) {
547
                                        if ( event.target === element ) {
548
                                                this.destroy();
549
                                        }
550
                                }
551
                        });
552
                        this.document = $( element.style ?
553
                                // element within the document
554
                                element.ownerDocument :
555
                                // element is window or document
556
                                element.document || element );
557
                        this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
558
                }
559 85ad3d82 Assos Assos
560
                this._create();
561 503b3f7b Assos Assos
                this._trigger( "create", null, this._getCreateEventData() );
562 85ad3d82 Assos Assos
                this._init();
563
        },
564 503b3f7b Assos Assos
        _getCreateOptions: $.noop,
565
        _getCreateEventData: $.noop,
566
        _create: $.noop,
567
        _init: $.noop,
568 85ad3d82 Assos Assos
569
        destroy: function() {
570 503b3f7b Assos Assos
                this._destroy();
571
                // we can probably remove the unbind calls in 2.0
572
                // all event bindings should go through this._on()
573 85ad3d82 Assos Assos
                this.element
574 503b3f7b Assos Assos
                        .unbind( this.eventNamespace )
575
                        // 1.9 BC for #7810
576
                        // TODO remove dual storage
577
                        .removeData( this.widgetName )
578
                        .removeData( this.widgetFullName )
579
                        // support: jquery <1.6.3
580
                        // http://bugs.jquery.com/ticket/9413
581
                        .removeData( $.camelCase( this.widgetFullName ) );
582 85ad3d82 Assos Assos
                this.widget()
583 503b3f7b Assos Assos
                        .unbind( this.eventNamespace )
584 85ad3d82 Assos Assos
                        .removeAttr( "aria-disabled" )
585
                        .removeClass(
586 503b3f7b Assos Assos
                                this.widgetFullName + "-disabled " +
587 85ad3d82 Assos Assos
                                "ui-state-disabled" );
588 503b3f7b Assos Assos
589
                // clean up events and states
590
                this.bindings.unbind( this.eventNamespace );
591
                this.hoverable.removeClass( "ui-state-hover" );
592
                this.focusable.removeClass( "ui-state-focus" );
593 85ad3d82 Assos Assos
        },
594 503b3f7b Assos Assos
        _destroy: $.noop,
595 85ad3d82 Assos Assos
596
        widget: function() {
597
                return this.element;
598
        },
599
600
        option: function( key, value ) {
601 503b3f7b Assos Assos
                var options = key,
602
                        parts,
603
                        curOption,
604
                        i;
605 85ad3d82 Assos Assos
606
                if ( arguments.length === 0 ) {
607
                        // don't return a reference to the internal hash
608 503b3f7b Assos Assos
                        return $.widget.extend( {}, this.options );
609 85ad3d82 Assos Assos
                }
610
611 503b3f7b Assos Assos
                if ( typeof key === "string" ) {
612
                        // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
613 85ad3d82 Assos Assos
                        options = {};
614 503b3f7b Assos Assos
                        parts = key.split( "." );
615
                        key = parts.shift();
616
                        if ( parts.length ) {
617
                                curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
618
                                for ( i = 0; i < parts.length - 1; i++ ) {
619
                                        curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
620
                                        curOption = curOption[ parts[ i ] ];
621
                                }
622
                                key = parts.pop();
623
                                if ( value === undefined ) {
624
                                        return curOption[ key ] === undefined ? null : curOption[ key ];
625
                                }
626
                                curOption[ key ] = value;
627
                        } else {
628
                                if ( value === undefined ) {
629
                                        return this.options[ key ] === undefined ? null : this.options[ key ];
630
                                }
631
                                options[ key ] = value;
632
                        }
633 85ad3d82 Assos Assos
                }
634
635
                this._setOptions( options );
636
637
                return this;
638
        },
639
        _setOptions: function( options ) {
640 503b3f7b Assos Assos
                var key;
641
642
                for ( key in options ) {
643
                        this._setOption( key, options[ key ] );
644
                }
645 85ad3d82 Assos Assos
646
                return this;
647
        },
648
        _setOption: function( key, value ) {
649
                this.options[ key ] = value;
650
651
                if ( key === "disabled" ) {
652
                        this.widget()
653 503b3f7b Assos Assos
                                .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
654 85ad3d82 Assos Assos
                                .attr( "aria-disabled", value );
655 503b3f7b Assos Assos
                        this.hoverable.removeClass( "ui-state-hover" );
656
                        this.focusable.removeClass( "ui-state-focus" );
657 85ad3d82 Assos Assos
                }
658
659
                return this;
660
        },
661
662
        enable: function() {
663
                return this._setOption( "disabled", false );
664
        },
665
        disable: function() {
666
                return this._setOption( "disabled", true );
667
        },
668
669 503b3f7b Assos Assos
        _on: function( suppressDisabledCheck, element, handlers ) {
670
                var delegateElement,
671
                        instance = this;
672
673
                // no suppressDisabledCheck flag, shuffle arguments
674
                if ( typeof suppressDisabledCheck !== "boolean" ) {
675
                        handlers = element;
676
                        element = suppressDisabledCheck;
677
                        suppressDisabledCheck = false;
678
                }
679
680
                // no element argument, shuffle and use this.element
681
                if ( !handlers ) {
682
                        handlers = element;
683
                        element = this.element;
684
                        delegateElement = this.widget();
685
                } else {
686
                        // accept selectors, DOM elements
687
                        element = delegateElement = $( element );
688
                        this.bindings = this.bindings.add( element );
689
                }
690
691
                $.each( handlers, function( event, handler ) {
692
                        function handlerProxy() {
693
                                // allow widgets to customize the disabled handling
694
                                // - disabled as an array instead of boolean
695
                                // - disabled class as method for disabling individual parts
696
                                if ( !suppressDisabledCheck &&
697
                                                ( instance.options.disabled === true ||
698
                                                        $( this ).hasClass( "ui-state-disabled" ) ) ) {
699
                                        return;
700
                                }
701
                                return ( typeof handler === "string" ? instance[ handler ] : handler )
702
                                        .apply( instance, arguments );
703
                        }
704
705
                        // copy the guid so direct unbinding works
706
                        if ( typeof handler !== "string" ) {
707
                                handlerProxy.guid = handler.guid =
708
                                        handler.guid || handlerProxy.guid || $.guid++;
709
                        }
710
711
                        var match = event.match( /^(\w+)\s*(.*)$/ ),
712
                                eventName = match[1] + instance.eventNamespace,
713
                                selector = match[2];
714
                        if ( selector ) {
715
                                delegateElement.delegate( selector, eventName, handlerProxy );
716
                        } else {
717
                                element.bind( eventName, handlerProxy );
718
                        }
719
                });
720
        },
721
722
        _off: function( element, eventName ) {
723
                eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
724
                element.unbind( eventName ).undelegate( eventName );
725
        },
726
727
        _delay: function( handler, delay ) {
728
                function handlerProxy() {
729
                        return ( typeof handler === "string" ? instance[ handler ] : handler )
730
                                .apply( instance, arguments );
731
                }
732
                var instance = this;
733
                return setTimeout( handlerProxy, delay || 0 );
734
        },
735
736
        _hoverable: function( element ) {
737
                this.hoverable = this.hoverable.add( element );
738
                this._on( element, {
739
                        mouseenter: function( event ) {
740
                                $( event.currentTarget ).addClass( "ui-state-hover" );
741
                        },
742
                        mouseleave: function( event ) {
743
                                $( event.currentTarget ).removeClass( "ui-state-hover" );
744
                        }
745
                });
746
        },
747
748
        _focusable: function( element ) {
749
                this.focusable = this.focusable.add( element );
750
                this._on( element, {
751
                        focusin: function( event ) {
752
                                $( event.currentTarget ).addClass( "ui-state-focus" );
753
                        },
754
                        focusout: function( event ) {
755
                                $( event.currentTarget ).removeClass( "ui-state-focus" );
756
                        }
757
                });
758
        },
759
760 85ad3d82 Assos Assos
        _trigger: function( type, event, data ) {
761 503b3f7b Assos Assos
                var prop, orig,
762
                        callback = this.options[ type ];
763 85ad3d82 Assos Assos
764 503b3f7b Assos Assos
                data = data || {};
765 85ad3d82 Assos Assos
                event = $.Event( event );
766
                event.type = ( type === this.widgetEventPrefix ?
767
                        type :
768
                        this.widgetEventPrefix + type ).toLowerCase();
769 503b3f7b Assos Assos
                // the original event may come from any element
770
                // so we need to reset the target on the new event
771
                event.target = this.element[ 0 ];
772 85ad3d82 Assos Assos
773
                // copy original event properties over to the new event
774 503b3f7b Assos Assos
                orig = event.originalEvent;
775
                if ( orig ) {
776
                        for ( prop in orig ) {
777
                                if ( !( prop in event ) ) {
778
                                        event[ prop ] = orig[ prop ];
779
                                }
780 85ad3d82 Assos Assos
                        }
781
                }
782
783
                this.element.trigger( event, data );
784 503b3f7b Assos Assos
                return !( $.isFunction( callback ) &&
785
                        callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
786 85ad3d82 Assos Assos
                        event.isDefaultPrevented() );
787
        }
788
};
789
790 503b3f7b Assos Assos
$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
791
        $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
792
                if ( typeof options === "string" ) {
793
                        options = { effect: options };
794
                }
795
                var hasOptions,
796
                        effectName = !options ?
797
                                method :
798
                                options === true || typeof options === "number" ?
799
                                        defaultEffect :
800
                                        options.effect || defaultEffect;
801
                options = options || {};
802
                if ( typeof options === "number" ) {
803
                        options = { duration: options };
804
                }
805
                hasOptions = !$.isEmptyObject( options );
806
                options.complete = callback;
807
                if ( options.delay ) {
808
                        element.delay( options.delay );
809
                }
810
                if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
811
                        element[ method ]( options );
812
                } else if ( effectName !== method && element[ effectName ] ) {
813
                        element[ effectName ]( options.duration, options.easing, callback );
814
                } else {
815
                        element.queue(function( next ) {
816
                                $( this )[ method ]();
817
                                if ( callback ) {
818
                                        callback.call( element[ 0 ] );
819
                                }
820
                                next();
821
                        });
822
                }
823
        };
824
});
825
826 85ad3d82 Assos Assos
})( jQuery );
827 503b3f7b Assos Assos
828 85ad3d82 Assos Assos
(function( $, undefined ) {
829
830 503b3f7b Assos Assos
var mouseHandled = false;
831
$( document ).mouseup( function() {
832
        mouseHandled = false;
833
});
834
835 85ad3d82 Assos Assos
$.widget("ui.mouse", {
836 503b3f7b Assos Assos
        version: "1.10.2",
837 85ad3d82 Assos Assos
        options: {
838 503b3f7b Assos Assos
                cancel: "input,textarea,button,select,option",
839 85ad3d82 Assos Assos
                distance: 1,
840
                delay: 0
841
        },
842
        _mouseInit: function() {
843 503b3f7b Assos Assos
                var that = this;
844 85ad3d82 Assos Assos
845
                this.element
846 503b3f7b Assos Assos
                        .bind("mousedown."+this.widgetName, function(event) {
847
                                return that._mouseDown(event);
848 85ad3d82 Assos Assos
                        })
849 503b3f7b Assos Assos
                        .bind("click."+this.widgetName, function(event) {
850
                                if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
851
                                        $.removeData(event.target, that.widgetName + ".preventClickEvent");
852 85ad3d82 Assos Assos
                                        event.stopImmediatePropagation();
853
                                        return false;
854
                                }
855
                        });
856
857
                this.started = false;
858
        },
859
860
        // TODO: make sure destroying one instance of mouse doesn't mess with
861
        // other instances of mouse
862
        _mouseDestroy: function() {
863 503b3f7b Assos Assos
                this.element.unbind("."+this.widgetName);
864
                if ( this._mouseMoveDelegate ) {
865
                        $(document)
866
                                .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
867
                                .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
868
                }
869 85ad3d82 Assos Assos
        },
870
871
        _mouseDown: function(event) {
872
                // don't let more than one widget handle mouseStart
873 503b3f7b Assos Assos
                if( mouseHandled ) { return; }
874 85ad3d82 Assos Assos
875
                // we may have missed mouseup (out of window)
876
                (this._mouseStarted && this._mouseUp(event));
877
878
                this._mouseDownEvent = event;
879
880 503b3f7b Assos Assos
                var that = this,
881
                        btnIsLeft = (event.which === 1),
882
                        // event.target.nodeName works around a bug in IE 8 with
883
                        // disabled inputs (#7620)
884
                        elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
885 85ad3d82 Assos Assos
                if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
886
                        return true;
887
                }
888
889
                this.mouseDelayMet = !this.options.delay;
890
                if (!this.mouseDelayMet) {
891
                        this._mouseDelayTimer = setTimeout(function() {
892 503b3f7b Assos Assos
                                that.mouseDelayMet = true;
893 85ad3d82 Assos Assos
                        }, this.options.delay);
894
                }
895
896
                if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
897
                        this._mouseStarted = (this._mouseStart(event) !== false);
898
                        if (!this._mouseStarted) {
899
                                event.preventDefault();
900
                                return true;
901
                        }
902
                }
903
904
                // Click event may never have fired (Gecko & Opera)
905 503b3f7b Assos Assos
                if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
906
                        $.removeData(event.target, this.widgetName + ".preventClickEvent");
907 85ad3d82 Assos Assos
                }
908
909
                // these delegates are required to keep context
910
                this._mouseMoveDelegate = function(event) {
911 503b3f7b Assos Assos
                        return that._mouseMove(event);
912 85ad3d82 Assos Assos
                };
913
                this._mouseUpDelegate = function(event) {
914 503b3f7b Assos Assos
                        return that._mouseUp(event);
915 85ad3d82 Assos Assos
                };
916
                $(document)
917 503b3f7b Assos Assos
                        .bind("mousemove."+this.widgetName, this._mouseMoveDelegate)
918
                        .bind("mouseup."+this.widgetName, this._mouseUpDelegate);
919 85ad3d82 Assos Assos
920
                event.preventDefault();
921 503b3f7b Assos Assos
922
                mouseHandled = true;
923 85ad3d82 Assos Assos
                return true;
924
        },
925
926
        _mouseMove: function(event) {
927
                // IE mouseup check - mouseup happened when mouse was out of window
928 503b3f7b Assos Assos
                if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
929 85ad3d82 Assos Assos
                        return this._mouseUp(event);
930
                }
931
932
                if (this._mouseStarted) {
933
                        this._mouseDrag(event);
934
                        return event.preventDefault();
935
                }
936
937
                if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
938
                        this._mouseStarted =
939
                                (this._mouseStart(this._mouseDownEvent, event) !== false);
940
                        (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
941
                }
942
943
                return !this._mouseStarted;
944
        },
945
946
        _mouseUp: function(event) {
947
                $(document)
948 503b3f7b Assos Assos
                        .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
949
                        .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
950 85ad3d82 Assos Assos
951
                if (this._mouseStarted) {
952
                        this._mouseStarted = false;
953
954 503b3f7b Assos Assos
                        if (event.target === this._mouseDownEvent.target) {
955
                                $.data(event.target, this.widgetName + ".preventClickEvent", true);
956 85ad3d82 Assos Assos
                        }
957
958
                        this._mouseStop(event);
959
                }
960
961
                return false;
962
        },
963
964
        _mouseDistanceMet: function(event) {
965
                return (Math.max(
966
                                Math.abs(this._mouseDownEvent.pageX - event.pageX),
967
                                Math.abs(this._mouseDownEvent.pageY - event.pageY)
968
                        ) >= this.options.distance
969
                );
970
        },
971
972 503b3f7b Assos Assos
        _mouseDelayMet: function(/* event */) {
973 85ad3d82 Assos Assos
                return this.mouseDelayMet;
974
        },
975
976
        // These are placeholder methods, to be overriden by extending plugin
977 503b3f7b Assos Assos
        _mouseStart: function(/* event */) {},
978
        _mouseDrag: function(/* event */) {},
979
        _mouseStop: function(/* event */) {},
980
        _mouseCapture: function(/* event */) { return true; }
981 85ad3d82 Assos Assos
});
982
983
})(jQuery);
984 503b3f7b Assos Assos
985 85ad3d82 Assos Assos
(function( $, undefined ) {
986
987
$.widget("ui.draggable", $.ui.mouse, {
988 503b3f7b Assos Assos
        version: "1.10.2",
989 85ad3d82 Assos Assos
        widgetEventPrefix: "drag",
990
        options: {
991
                addClasses: true,
992
                appendTo: "parent",
993
                axis: false,
994
                connectToSortable: false,
995
                containment: false,
996
                cursor: "auto",
997
                cursorAt: false,
998
                grid: false,
999
                handle: false,
1000
                helper: "original",
1001
                iframeFix: false,
1002
                opacity: false,
1003
                refreshPositions: false,
1004
                revert: false,
1005
                revertDuration: 500,
1006
                scope: "default",
1007
                scroll: true,
1008
                scrollSensitivity: 20,
1009
                scrollSpeed: 20,
1010
                snap: false,
1011
                snapMode: "both",
1012
                snapTolerance: 20,
1013
                stack: false,
1014 503b3f7b Assos Assos
                zIndex: false,
1015
1016
                // callbacks
1017
                drag: null,
1018
                start: null,
1019
                stop: null
1020 85ad3d82 Assos Assos
        },
1021
        _create: function() {
1022
1023 503b3f7b Assos Assos
                if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
1024
                        this.element[0].style.position = "relative";
1025
                }
1026
                if (this.options.addClasses){
1027
                        this.element.addClass("ui-draggable");
1028
                }
1029
                if (this.options.disabled){
1030
                        this.element.addClass("ui-draggable-disabled");
1031
                }
1032 85ad3d82 Assos Assos
1033
                this._mouseInit();
1034
1035
        },
1036
1037 503b3f7b Assos Assos
        _destroy: function() {
1038
                this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
1039 85ad3d82 Assos Assos
                this._mouseDestroy();
1040
        },
1041
1042
        _mouseCapture: function(event) {
1043
1044
                var o = this.options;
1045
1046
                // among others, prevent a drag on a resizable-handle
1047 503b3f7b Assos Assos
                if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
1048 85ad3d82 Assos Assos
                        return false;
1049 503b3f7b Assos Assos
                }
1050 85ad3d82 Assos Assos
1051
                //Quit if we're not on a valid handle
1052
                this.handle = this._getHandle(event);
1053 503b3f7b Assos Assos
                if (!this.handle) {
1054 85ad3d82 Assos Assos
                        return false;
1055 503b3f7b Assos Assos
                }
1056
1057
                $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
1058
                        $("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
1059
                        .css({
1060
                                width: this.offsetWidth+"px", height: this.offsetHeight+"px",
1061
                                position: "absolute", opacity: "0.001", zIndex: 1000
1062
                        })
1063
                        .css($(this).offset())
1064
                        .appendTo("body");
1065
                });
1066 85ad3d82 Assos Assos
1067
                return true;
1068
1069
        },
1070
1071
        _mouseStart: function(event) {
1072
1073
                var o = this.options;
1074
1075
                //Create and append the visible helper
1076
                this.helper = this._createHelper(event);
1077
1078 503b3f7b Assos Assos
                this.helper.addClass("ui-draggable-dragging");
1079
1080
                //Cache the helper size
1081 85ad3d82 Assos Assos
                this._cacheHelperProportions();
1082
1083
                //If ddmanager is used for droppables, set the global draggable
1084 503b3f7b Assos Assos
                if($.ui.ddmanager) {
1085 85ad3d82 Assos Assos
                        $.ui.ddmanager.current = this;
1086 503b3f7b Assos Assos
                }
1087 85ad3d82 Assos Assos
1088
                /*
1089
                 * - Position generation -
1090
                 * This block generates everything position related - it's the core of draggables.
1091
                 */
1092
1093
                //Cache the margins of the original element
1094
                this._cacheMargins();
1095
1096
                //Store the helper's css position
1097
                this.cssPosition = this.helper.css("position");
1098
                this.scrollParent = this.helper.scrollParent();
1099
1100
                //The element's absolute position on the page minus margins
1101
                this.offset = this.positionAbs = this.element.offset();
1102
                this.offset = {
1103
                        top: this.offset.top - this.margins.top,
1104
                        left: this.offset.left - this.margins.left
1105
                };
1106
1107
                $.extend(this.offset, {
1108
                        click: { //Where the click happened, relative to the element
1109
                                left: event.pageX - this.offset.left,
1110
                                top: event.pageY - this.offset.top
1111
                        },
1112
                        parent: this._getParentOffset(),
1113
                        relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
1114
                });
1115
1116
                //Generate the original position
1117
                this.originalPosition = this.position = this._generatePosition(event);
1118
                this.originalPageX = event.pageX;
1119
                this.originalPageY = event.pageY;
1120
1121 503b3f7b Assos Assos
                //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
1122 85ad3d82 Assos Assos
                (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
1123
1124
                //Set a containment if given in the options
1125 503b3f7b Assos Assos
                if(o.containment) {
1126 85ad3d82 Assos Assos
                        this._setContainment();
1127 503b3f7b Assos Assos
                }
1128 85ad3d82 Assos Assos
1129
                //Trigger event + callbacks
1130
                if(this._trigger("start", event) === false) {
1131
                        this._clear();
1132
                        return false;
1133
                }
1134
1135
                //Recache the helper size
1136
                this._cacheHelperProportions();
1137
1138
                //Prepare the droppable offsets
1139 503b3f7b Assos Assos
                if ($.ui.ddmanager && !o.dropBehaviour) {
1140 85ad3d82 Assos Assos
                        $.ui.ddmanager.prepareOffsets(this, event);
1141 503b3f7b Assos Assos
                }
1142
1143 85ad3d82 Assos Assos
1144
                this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
1145 503b3f7b Assos Assos
1146
                //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
1147
                if ( $.ui.ddmanager ) {
1148
                        $.ui.ddmanager.dragStart(this, event);
1149
                }
1150
1151 85ad3d82 Assos Assos
                return true;
1152
        },
1153
1154
        _mouseDrag: function(event, noPropagation) {
1155
1156
                //Compute the helpers position
1157
                this.position = this._generatePosition(event);
1158
                this.positionAbs = this._convertPositionTo("absolute");
1159
1160
                //Call plugins and callbacks and use the resulting position if something is returned
1161
                if (!noPropagation) {
1162
                        var ui = this._uiHash();
1163 503b3f7b Assos Assos
                        if(this._trigger("drag", event, ui) === false) {
1164 85ad3d82 Assos Assos
                                this._mouseUp({});
1165
                                return false;
1166
                        }
1167
                        this.position = ui.position;
1168
                }
1169
1170 503b3f7b Assos Assos
                if(!this.options.axis || this.options.axis !== "y") {
1171
                        this.helper[0].style.left = this.position.left+"px";
1172
                }
1173
                if(!this.options.axis || this.options.axis !== "x") {
1174
                        this.helper[0].style.top = this.position.top+"px";
1175
                }
1176
                if($.ui.ddmanager) {
1177
                        $.ui.ddmanager.drag(this, event);
1178
                }
1179 85ad3d82 Assos Assos
1180
                return false;
1181
        },
1182
1183
        _mouseStop: function(event) {
1184
1185
                //If we are using droppables, inform the manager about the drop
1186 503b3f7b Assos Assos
                var element,
1187
                        that = this,
1188
                        elementInDom = false,
1189
                        dropped = false;
1190
                if ($.ui.ddmanager && !this.options.dropBehaviour) {
1191 85ad3d82 Assos Assos
                        dropped = $.ui.ddmanager.drop(this, event);
1192 503b3f7b Assos Assos
                }
1193 85ad3d82 Assos Assos
1194
                //if a drop comes from outside (a sortable)
1195
                if(this.dropped) {
1196
                        dropped = this.dropped;
1197
                        this.dropped = false;
1198
                }
1199 503b3f7b Assos Assos
1200
                //if the original element is no longer in the DOM don't bother to continue (see #8269)
1201
                element = this.element[0];
1202
                while ( element && (element = element.parentNode) ) {
1203
                        if (element === document ) {
1204
                                elementInDom = true;
1205
                        }
1206
                }
1207
                if ( !elementInDom && this.options.helper === "original" ) {
1208 85ad3d82 Assos Assos
                        return false;
1209 503b3f7b Assos Assos
                }
1210 85ad3d82 Assos Assos
1211 503b3f7b Assos Assos
                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))) {
1212 85ad3d82 Assos Assos
                        $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
1213 503b3f7b Assos Assos
                                if(that._trigger("stop", event) !== false) {
1214
                                        that._clear();
1215 85ad3d82 Assos Assos
                                }
1216
                        });
1217
                } else {
1218
                        if(this._trigger("stop", event) !== false) {
1219
                                this._clear();
1220
                        }
1221
                }
1222
1223
                return false;
1224
        },
1225 503b3f7b Assos Assos
1226
        _mouseUp: function(event) {
1227
                //Remove frame helpers
1228
                $("div.ui-draggable-iframeFix").each(function() {
1229
                        this.parentNode.removeChild(this);
1230
                });
1231
1232
                //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
1233
                if( $.ui.ddmanager ) {
1234
                        $.ui.ddmanager.dragStop(this, event);
1235
                }
1236
1237
                return $.ui.mouse.prototype._mouseUp.call(this, event);
1238
        },
1239
1240 85ad3d82 Assos Assos
        cancel: function() {
1241 503b3f7b Assos Assos
1242 85ad3d82 Assos Assos
                if(this.helper.is(".ui-draggable-dragging")) {
1243
                        this._mouseUp({});
1244
                } else {
1245
                        this._clear();
1246
                }
1247 503b3f7b Assos Assos
1248 85ad3d82 Assos Assos
                return this;
1249 503b3f7b Assos Assos
1250 85ad3d82 Assos Assos
        },
1251
1252
        _getHandle: function(event) {
1253 503b3f7b Assos Assos
                return this.options.handle ?
1254
                        !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
1255
                        true;
1256 85ad3d82 Assos Assos
        },
1257
1258
        _createHelper: function(event) {
1259
1260 503b3f7b Assos Assos
                var o = this.options,
1261
                        helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
1262 85ad3d82 Assos Assos
1263 503b3f7b Assos Assos
                if(!helper.parents("body").length) {
1264
                        helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
1265
                }
1266 85ad3d82 Assos Assos
1267 503b3f7b Assos Assos
                if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
1268 85ad3d82 Assos Assos
                        helper.css("position", "absolute");
1269 503b3f7b Assos Assos
                }
1270 85ad3d82 Assos Assos
1271
                return helper;
1272
1273
        },
1274
1275
        _adjustOffsetFromHelper: function(obj) {
1276 503b3f7b Assos Assos
                if (typeof obj === "string") {
1277
                        obj = obj.split(" ");
1278 85ad3d82 Assos Assos
                }
1279
                if ($.isArray(obj)) {
1280
                        obj = {left: +obj[0], top: +obj[1] || 0};
1281
                }
1282 503b3f7b Assos Assos
                if ("left" in obj) {
1283 85ad3d82 Assos Assos
                        this.offset.click.left = obj.left + this.margins.left;
1284
                }
1285 503b3f7b Assos Assos
                if ("right" in obj) {
1286 85ad3d82 Assos Assos
                        this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
1287
                }
1288 503b3f7b Assos Assos
                if ("top" in obj) {
1289 85ad3d82 Assos Assos
                        this.offset.click.top = obj.top + this.margins.top;
1290
                }
1291 503b3f7b Assos Assos
                if ("bottom" in obj) {
1292 85ad3d82 Assos Assos
                        this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
1293
                }
1294
        },
1295
1296
        _getParentOffset: function() {
1297
1298
                //Get the offsetParent and cache its position
1299
                this.offsetParent = this.helper.offsetParent();
1300
                var po = this.offsetParent.offset();
1301
1302
                // This is a special case where we need to modify a offset calculated on start, since the following happened:
1303
                // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
1304
                // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
1305
                //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
1306 503b3f7b Assos Assos
                if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
1307 85ad3d82 Assos Assos
                        po.left += this.scrollParent.scrollLeft();
1308
                        po.top += this.scrollParent.scrollTop();
1309
                }
1310
1311 503b3f7b Assos Assos
                //This needs to be actually done for all browsers, since pageX/pageY includes this information
1312
                //Ugly IE fix
1313
                if((this.offsetParent[0] === document.body) ||
1314
                        (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
1315 85ad3d82 Assos Assos
                        po = { top: 0, left: 0 };
1316 503b3f7b Assos Assos
                }
1317 85ad3d82 Assos Assos
1318
                return {
1319
                        top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
1320
                        left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
1321
                };
1322
1323
        },
1324
1325
        _getRelativeOffset: function() {
1326
1327 503b3f7b Assos Assos
                if(this.cssPosition === "relative") {
1328 85ad3d82 Assos Assos
                        var p = this.element.position();
1329
                        return {
1330
                                top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
1331
                                left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
1332
                        };
1333
                } else {
1334
                        return { top: 0, left: 0 };
1335
                }
1336
1337
        },
1338
1339
        _cacheMargins: function() {
1340
                this.margins = {
1341
                        left: (parseInt(this.element.css("marginLeft"),10) || 0),
1342
                        top: (parseInt(this.element.css("marginTop"),10) || 0),
1343
                        right: (parseInt(this.element.css("marginRight"),10) || 0),
1344
                        bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
1345
                };
1346
        },
1347
1348
        _cacheHelperProportions: function() {
1349
                this.helperProportions = {
1350
                        width: this.helper.outerWidth(),
1351
                        height: this.helper.outerHeight()
1352
                };
1353
        },
1354
1355
        _setContainment: function() {
1356
1357 503b3f7b Assos Assos
                var over, c, ce,
1358
                        o = this.options;
1359
1360
                if(o.containment === "parent") {
1361
                        o.containment = this.helper[0].parentNode;
1362
                }
1363
                if(o.containment === "document" || o.containment === "window") {
1364
                        this.containment = [
1365
                                o.containment === "document" ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
1366
                                o.containment === "document" ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
1367
                                (o.containment === "document" ? 0 : $(window).scrollLeft()) + $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,
1368
                                (o.containment === "document" ? 0 : $(window).scrollTop()) + ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
1369
                        ];
1370
                }
1371
1372
                if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor !== Array) {
1373
                        c = $(o.containment);
1374
                        ce = c[0];
1375
1376
                        if(!ce) {
1377
                                return;
1378
                        }
1379 85ad3d82 Assos Assos
1380 503b3f7b Assos Assos
                        over = ($(ce).css("overflow") !== "hidden");
1381 85ad3d82 Assos Assos
1382
                        this.containment = [
1383 503b3f7b Assos Assos
                                (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
1384
                                (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
1385
                                (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderRightWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
1386
                                (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderBottomWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
1387 85ad3d82 Assos Assos
                        ];
1388 503b3f7b Assos Assos
                        this.relative_container = c;
1389
1390
                } else if(o.containment.constructor === Array) {
1391 85ad3d82 Assos Assos
                        this.containment = o.containment;
1392
                }
1393
1394
        },
1395
1396
        _convertPositionTo: function(d, pos) {
1397
1398 503b3f7b Assos Assos
                if(!pos) {
1399
                        pos = this.position;
1400
                }
1401
1402
                var mod = d === "absolute" ? 1 : -1,
1403
                        scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
1404 85ad3d82 Assos Assos
1405
                return {
1406
                        top: (
1407 503b3f7b Assos Assos
                                pos.top        +                                                                                                                                // The absolute mouse position
1408
                                this.offset.relative.top * mod +                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
1409
                                this.offset.parent.top * mod -                                                                                // The offsetParent's offset without borders (offset + border)
1410
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
1411 85ad3d82 Assos Assos
                        ),
1412
                        left: (
1413 503b3f7b Assos Assos
                                pos.left +                                                                                                                                // The absolute mouse position
1414
                                this.offset.relative.left * mod +                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
1415
                                this.offset.parent.left * mod        -                                                                                // The offsetParent's offset without borders (offset + border)
1416
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
1417 85ad3d82 Assos Assos
                        )
1418
                };
1419
1420
        },
1421
1422
        _generatePosition: function(event) {
1423
1424 503b3f7b Assos Assos
                var containment, co, top, left,
1425
                        o = this.options,
1426
                        scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
1427
                        scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName),
1428
                        pageX = event.pageX,
1429
                        pageY = event.pageY;
1430 85ad3d82 Assos Assos
1431
                /*
1432
                 * - Position constraining -
1433
                 * Constrain the position to a mix of grid, containment.
1434
                 */
1435
1436
                if(this.originalPosition) { //If we are not dragging yet, we won't check for options
1437
                        if(this.containment) {
1438 503b3f7b Assos Assos
                        if (this.relative_container){
1439
                                co = this.relative_container.offset();
1440
                                containment = [ this.containment[0] + co.left,
1441
                                        this.containment[1] + co.top,
1442
                                        this.containment[2] + co.left,
1443
                                        this.containment[3] + co.top ];
1444
                        }
1445
                        else {
1446
                                containment = this.containment;
1447
                        }
1448
1449
                                if(event.pageX - this.offset.click.left < containment[0]) {
1450
                                        pageX = containment[0] + this.offset.click.left;
1451
                                }
1452
                                if(event.pageY - this.offset.click.top < containment[1]) {
1453
                                        pageY = containment[1] + this.offset.click.top;
1454
                                }
1455
                                if(event.pageX - this.offset.click.left > containment[2]) {
1456
                                        pageX = containment[2] + this.offset.click.left;
1457
                                }
1458
                                if(event.pageY - this.offset.click.top > containment[3]) {
1459
                                        pageY = containment[3] + this.offset.click.top;
1460
                                }
1461 85ad3d82 Assos Assos
                        }
1462
1463
                        if(o.grid) {
1464 503b3f7b Assos Assos
                                //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
1465
                                top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
1466
                                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;
1467 85ad3d82 Assos Assos
1468 503b3f7b Assos Assos
                                left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
1469
                                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;
1470 85ad3d82 Assos Assos
                        }
1471
1472
                }
1473
1474
                return {
1475
                        top: (
1476 503b3f7b Assos Assos
                                pageY -                                                                                                                                        // The absolute mouse position
1477
                                this.offset.click.top        -                                                                                                // Click offset (relative to the element)
1478
                                this.offset.relative.top -                                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
1479
                                this.offset.parent.top +                                                                                                // The offsetParent's offset without borders (offset + border)
1480
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
1481 85ad3d82 Assos Assos
                        ),
1482
                        left: (
1483 503b3f7b Assos Assos
                                pageX -                                                                                                                                        // The absolute mouse position
1484
                                this.offset.click.left -                                                                                                // Click offset (relative to the element)
1485
                                this.offset.relative.left -                                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
1486
                                this.offset.parent.left +                                                                                                // The offsetParent's offset without borders (offset + border)
1487
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
1488 85ad3d82 Assos Assos
                        )
1489
                };
1490
1491
        },
1492
1493
        _clear: function() {
1494
                this.helper.removeClass("ui-draggable-dragging");
1495 503b3f7b Assos Assos
                if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
1496
                        this.helper.remove();
1497
                }
1498 85ad3d82 Assos Assos
                this.helper = null;
1499
                this.cancelHelperRemoval = false;
1500
        },
1501
1502
        // From now on bulk stuff - mainly helpers
1503
1504
        _trigger: function(type, event, ui) {
1505
                ui = ui || this._uiHash();
1506
                $.ui.plugin.call(this, type, [event, ui]);
1507 503b3f7b Assos Assos
                //The absolute position has to be recalculated after plugins
1508
                if(type === "drag") {
1509
                        this.positionAbs = this._convertPositionTo("absolute");
1510
                }
1511 85ad3d82 Assos Assos
                return $.Widget.prototype._trigger.call(this, type, event, ui);
1512
        },
1513
1514
        plugins: {},
1515
1516 503b3f7b Assos Assos
        _uiHash: function() {
1517 85ad3d82 Assos Assos
                return {
1518
                        helper: this.helper,
1519
                        position: this.position,
1520
                        originalPosition: this.originalPosition,
1521
                        offset: this.positionAbs
1522
                };
1523
        }
1524
1525
});
1526
1527
$.ui.plugin.add("draggable", "connectToSortable", {
1528
        start: function(event, ui) {
1529
1530 503b3f7b Assos Assos
                var inst = $(this).data("ui-draggable"), o = inst.options,
1531 85ad3d82 Assos Assos
                        uiSortable = $.extend({}, ui, { item: inst.element });
1532
                inst.sortables = [];
1533
                $(o.connectToSortable).each(function() {
1534 503b3f7b Assos Assos
                        var sortable = $.data(this, "ui-sortable");
1535 85ad3d82 Assos Assos
                        if (sortable && !sortable.options.disabled) {
1536
                                inst.sortables.push({
1537
                                        instance: sortable,
1538
                                        shouldRevert: sortable.options.revert
1539
                                });
1540
                                sortable.refreshPositions();        // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
1541
                                sortable._trigger("activate", event, uiSortable);
1542
                        }
1543
                });
1544
1545
        },
1546
        stop: function(event, ui) {
1547
1548
                //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
1549 503b3f7b Assos Assos
                var inst = $(this).data("ui-draggable"),
1550 85ad3d82 Assos Assos
                        uiSortable = $.extend({}, ui, { item: inst.element });
1551
1552
                $.each(inst.sortables, function() {
1553
                        if(this.instance.isOver) {
1554
1555
                                this.instance.isOver = 0;
1556
1557
                                inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
1558
                                this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
1559
1560 503b3f7b Assos Assos
                                //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid"
1561
                                if(this.shouldRevert) {
1562
                                        this.instance.options.revert = this.shouldRevert;
1563
                                }
1564 85ad3d82 Assos Assos
1565
                                //Trigger the stop of the sortable
1566
                                this.instance._mouseStop(event);
1567
1568
                                this.instance.options.helper = this.instance.options._helper;
1569
1570
                                //If the helper has been the original item, restore properties in the sortable
1571 503b3f7b Assos Assos
                                if(inst.options.helper === "original") {
1572
                                        this.instance.currentItem.css({ top: "auto", left: "auto" });
1573
                                }
1574 85ad3d82 Assos Assos
1575
                        } else {
1576
                                this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
1577
                                this.instance._trigger("deactivate", event, uiSortable);
1578
                        }
1579
1580
                });
1581
1582
        },
1583
        drag: function(event, ui) {
1584
1585 503b3f7b Assos Assos
                var inst = $(this).data("ui-draggable"), that = this;
1586 85ad3d82 Assos Assos
1587 503b3f7b Assos Assos
                $.each(inst.sortables, function() {
1588 85ad3d82 Assos Assos
1589 503b3f7b Assos Assos
                        var innermostIntersecting = false,
1590
                                thisSortable = this;
1591 85ad3d82 Assos Assos
1592
                        //Copy over some variables to allow calling the sortable's native _intersectsWith
1593
                        this.instance.positionAbs = inst.positionAbs;
1594
                        this.instance.helperProportions = inst.helperProportions;
1595
                        this.instance.offset.click = inst.offset.click;
1596 503b3f7b Assos Assos
1597 85ad3d82 Assos Assos
                        if(this.instance._intersectsWith(this.instance.containerCache)) {
1598 503b3f7b Assos Assos
                                innermostIntersecting = true;
1599
                                $.each(inst.sortables, function () {
1600
                                        this.instance.positionAbs = inst.positionAbs;
1601
                                        this.instance.helperProportions = inst.helperProportions;
1602
                                        this.instance.offset.click = inst.offset.click;
1603
                                        if (this !== thisSortable &&
1604
                                                this.instance._intersectsWith(this.instance.containerCache) &&
1605
                                                $.contains(thisSortable.instance.element[0], this.instance.element[0])
1606
                                        ) {
1607
                                                innermostIntersecting = false;
1608
                                        }
1609
                                        return innermostIntersecting;
1610
                                });
1611
                        }
1612
1613 85ad3d82 Assos Assos
1614 503b3f7b Assos Assos
                        if(innermostIntersecting) {
1615 85ad3d82 Assos Assos
                                //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
1616
                                if(!this.instance.isOver) {
1617
1618
                                        this.instance.isOver = 1;
1619
                                        //Now we fake the start of dragging for the sortable instance,
1620
                                        //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
1621
                                        //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
1622 503b3f7b Assos Assos
                                        this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true);
1623 85ad3d82 Assos Assos
                                        this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
1624
                                        this.instance.options.helper = function() { return ui.helper[0]; };
1625
1626
                                        event.target = this.instance.currentItem[0];
1627
                                        this.instance._mouseCapture(event, true);
1628
                                        this.instance._mouseStart(event, true, true);
1629
1630
                                        //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
1631
                                        this.instance.offset.click.top = inst.offset.click.top;
1632
                                        this.instance.offset.click.left = inst.offset.click.left;
1633
                                        this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
1634
                                        this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
1635
1636
                                        inst._trigger("toSortable", event);
1637
                                        inst.dropped = this.instance.element; //draggable revert needs that
1638
                                        //hack so receive/update callbacks work (mostly)
1639
                                        inst.currentItem = inst.element;
1640
                                        this.instance.fromOutside = inst;
1641
1642
                                }
1643
1644
                                //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
1645 503b3f7b Assos Assos
                                if(this.instance.currentItem) {
1646
                                        this.instance._mouseDrag(event);
1647
                                }
1648 85ad3d82 Assos Assos
1649
                        } else {
1650
1651
                                //If it doesn't intersect with the sortable, and it intersected before,
1652
                                //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
1653
                                if(this.instance.isOver) {
1654
1655
                                        this.instance.isOver = 0;
1656
                                        this.instance.cancelHelperRemoval = true;
1657 503b3f7b Assos Assos
1658 85ad3d82 Assos Assos
                                        //Prevent reverting on this forced stop
1659
                                        this.instance.options.revert = false;
1660 503b3f7b Assos Assos
1661 85ad3d82 Assos Assos
                                        // The out event needs to be triggered independently
1662 503b3f7b Assos Assos
                                        this.instance._trigger("out", event, this.instance._uiHash(this.instance));
1663
1664 85ad3d82 Assos Assos
                                        this.instance._mouseStop(event, true);
1665
                                        this.instance.options.helper = this.instance.options._helper;
1666
1667
                                        //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
1668
                                        this.instance.currentItem.remove();
1669 503b3f7b Assos Assos
                                        if(this.instance.placeholder) {
1670
                                                this.instance.placeholder.remove();
1671
                                        }
1672 85ad3d82 Assos Assos
1673
                                        inst._trigger("fromSortable", event);
1674
                                        inst.dropped = false; //draggable revert needs that
1675
                                }
1676
1677 503b3f7b Assos Assos
                        }
1678 85ad3d82 Assos Assos
1679
                });
1680
1681
        }
1682
});
1683
1684
$.ui.plugin.add("draggable", "cursor", {
1685 503b3f7b Assos Assos
        start: function() {
1686
                var t = $("body"), o = $(this).data("ui-draggable").options;
1687
                if (t.css("cursor")) {
1688
                        o._cursor = t.css("cursor");
1689
                }
1690 85ad3d82 Assos Assos
                t.css("cursor", o.cursor);
1691
        },
1692 503b3f7b Assos Assos
        stop: function() {
1693
                var o = $(this).data("ui-draggable").options;
1694
                if (o._cursor) {
1695
                        $("body").css("cursor", o._cursor);
1696
                }
1697 85ad3d82 Assos Assos
        }
1698
});
1699
1700
$.ui.plugin.add("draggable", "opacity", {
1701
        start: function(event, ui) {
1702 503b3f7b Assos Assos
                var t = $(ui.helper), o = $(this).data("ui-draggable").options;
1703
                if(t.css("opacity")) {
1704
                        o._opacity = t.css("opacity");
1705
                }
1706
                t.css("opacity", o.opacity);
1707 85ad3d82 Assos Assos
        },
1708
        stop: function(event, ui) {
1709 503b3f7b Assos Assos
                var o = $(this).data("ui-draggable").options;
1710
                if(o._opacity) {
1711
                        $(ui.helper).css("opacity", o._opacity);
1712
                }
1713 85ad3d82 Assos Assos
        }
1714
});
1715
1716
$.ui.plugin.add("draggable", "scroll", {
1717 503b3f7b Assos Assos
        start: function() {
1718
                var i = $(this).data("ui-draggable");
1719
                if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
1720
                        i.overflowOffset = i.scrollParent.offset();
1721
                }
1722 85ad3d82 Assos Assos
        },
1723 503b3f7b Assos Assos
        drag: function( event ) {
1724 85ad3d82 Assos Assos
1725 503b3f7b Assos Assos
                var i = $(this).data("ui-draggable"), o = i.options, scrolled = false;
1726 85ad3d82 Assos Assos
1727 503b3f7b Assos Assos
                if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
1728 85ad3d82 Assos Assos
1729 503b3f7b Assos Assos
                        if(!o.axis || o.axis !== "x") {
1730
                                if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
1731 85ad3d82 Assos Assos
                                        i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
1732 503b3f7b Assos Assos
                                } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
1733 85ad3d82 Assos Assos
                                        i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
1734 503b3f7b Assos Assos
                                }
1735 85ad3d82 Assos Assos
                        }
1736
1737 503b3f7b Assos Assos
                        if(!o.axis || o.axis !== "y") {
1738
                                if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
1739 85ad3d82 Assos Assos
                                        i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
1740 503b3f7b Assos Assos
                                } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
1741 85ad3d82 Assos Assos
                                        i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
1742 503b3f7b Assos Assos
                                }
1743 85ad3d82 Assos Assos
                        }
1744
1745
                } else {
1746
1747 503b3f7b Assos Assos
                        if(!o.axis || o.axis !== "x") {
1748
                                if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
1749 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
1750 503b3f7b Assos Assos
                                } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
1751 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
1752 503b3f7b Assos Assos
                                }
1753 85ad3d82 Assos Assos
                        }
1754
1755 503b3f7b Assos Assos
                        if(!o.axis || o.axis !== "y") {
1756
                                if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
1757 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
1758 503b3f7b Assos Assos
                                } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
1759 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
1760 503b3f7b Assos Assos
                                }
1761 85ad3d82 Assos Assos
                        }
1762
1763
                }
1764
1765 503b3f7b Assos Assos
                if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
1766 85ad3d82 Assos Assos
                        $.ui.ddmanager.prepareOffsets(i, event);
1767 503b3f7b Assos Assos
                }
1768 85ad3d82 Assos Assos
1769
        }
1770
});
1771
1772
$.ui.plugin.add("draggable", "snap", {
1773 503b3f7b Assos Assos
        start: function() {
1774
1775
                var i = $(this).data("ui-draggable"),
1776
                        o = i.options;
1777 85ad3d82 Assos Assos
1778
                i.snapElements = [];
1779
1780 503b3f7b Assos Assos
                $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
1781
                        var $t = $(this),
1782
                                $o = $t.offset();
1783
                        if(this !== i.element[0]) {
1784
                                i.snapElements.push({
1785
                                        item: this,
1786
                                        width: $t.outerWidth(), height: $t.outerHeight(),
1787
                                        top: $o.top, left: $o.left
1788
                                });
1789
                        }
1790 85ad3d82 Assos Assos
                });
1791
1792
        },
1793
        drag: function(event, ui) {
1794
1795 503b3f7b Assos Assos
                var ts, bs, ls, rs, l, r, t, b, i, first,
1796
                        inst = $(this).data("ui-draggable"),
1797
                        o = inst.options,
1798
                        d = o.snapTolerance,
1799
                        x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
1800 85ad3d82 Assos Assos
                        y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
1801
1802 503b3f7b Assos Assos
                for (i = inst.snapElements.length - 1; i >= 0; i--){
1803 85ad3d82 Assos Assos
1804 503b3f7b Assos Assos
                        l = inst.snapElements[i].left;
1805
                        r = l + inst.snapElements[i].width;
1806
                        t = inst.snapElements[i].top;
1807
                        b = t + inst.snapElements[i].height;
1808 85ad3d82 Assos Assos
1809
                        //Yes, I know, this is insane ;)
1810
                        if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
1811 503b3f7b Assos Assos
                                if(inst.snapElements[i].snapping) {
1812
                                        (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
1813
                                }
1814 85ad3d82 Assos Assos
                                inst.snapElements[i].snapping = false;
1815
                                continue;
1816
                        }
1817
1818 503b3f7b Assos Assos
                        if(o.snapMode !== "inner") {
1819
                                ts = Math.abs(t - y2) <= d;
1820
                                bs = Math.abs(b - y1) <= d;
1821
                                ls = Math.abs(l - x2) <= d;
1822
                                rs = Math.abs(r - x1) <= d;
1823
                                if(ts) {
1824
                                        ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
1825
                                }
1826
                                if(bs) {
1827
                                        ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
1828
                                }
1829
                                if(ls) {
1830
                                        ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
1831
                                }
1832
                                if(rs) {
1833
                                        ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
1834
                                }
1835 85ad3d82 Assos Assos
                        }
1836
1837 503b3f7b Assos Assos
                        first = (ts || bs || ls || rs);
1838 85ad3d82 Assos Assos
1839 503b3f7b Assos Assos
                        if(o.snapMode !== "outer") {
1840
                                ts = Math.abs(t - y1) <= d;
1841
                                bs = Math.abs(b - y2) <= d;
1842
                                ls = Math.abs(l - x1) <= d;
1843
                                rs = Math.abs(r - x2) <= d;
1844
                                if(ts) {
1845
                                        ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
1846
                                }
1847
                                if(bs) {
1848
                                        ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
1849
                                }
1850
                                if(ls) {
1851
                                        ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
1852
                                }
1853
                                if(rs) {
1854
                                        ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
1855
                                }
1856 85ad3d82 Assos Assos
                        }
1857
1858 503b3f7b Assos Assos
                        if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
1859 85ad3d82 Assos Assos
                                (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
1860 503b3f7b Assos Assos
                        }
1861 85ad3d82 Assos Assos
                        inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
1862
1863 503b3f7b Assos Assos
                }
1864 85ad3d82 Assos Assos
1865
        }
1866
});
1867
1868
$.ui.plugin.add("draggable", "stack", {
1869 503b3f7b Assos Assos
        start: function() {
1870
                var min,
1871
                        o = this.data("ui-draggable").options,
1872
                        group = $.makeArray($(o.stack)).sort(function(a,b) {
1873
                                return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
1874
                        });
1875 85ad3d82 Assos Assos
1876
                if (!group.length) { return; }
1877 503b3f7b Assos Assos
1878
                min = parseInt($(group[0]).css("zIndex"), 10) || 0;
1879 85ad3d82 Assos Assos
                $(group).each(function(i) {
1880 503b3f7b Assos Assos
                        $(this).css("zIndex", min + i);
1881 85ad3d82 Assos Assos
                });
1882 503b3f7b Assos Assos
                this.css("zIndex", (min + group.length));
1883 85ad3d82 Assos Assos
        }
1884
});
1885
1886
$.ui.plugin.add("draggable", "zIndex", {
1887
        start: function(event, ui) {
1888 503b3f7b Assos Assos
                var t = $(ui.helper), o = $(this).data("ui-draggable").options;
1889
                if(t.css("zIndex")) {
1890
                        o._zIndex = t.css("zIndex");
1891
                }
1892
                t.css("zIndex", o.zIndex);
1893 85ad3d82 Assos Assos
        },
1894
        stop: function(event, ui) {
1895 503b3f7b Assos Assos
                var o = $(this).data("ui-draggable").options;
1896
                if(o._zIndex) {
1897
                        $(ui.helper).css("zIndex", o._zIndex);
1898
                }
1899 85ad3d82 Assos Assos
        }
1900
});
1901
1902
})(jQuery);
1903 503b3f7b Assos Assos
1904 85ad3d82 Assos Assos
(function( $, undefined ) {
1905
1906 503b3f7b Assos Assos
function isOverAxis( x, reference, size ) {
1907
        return ( x > reference ) && ( x < ( reference + size ) );
1908
}
1909
1910 85ad3d82 Assos Assos
$.widget("ui.droppable", {
1911 503b3f7b Assos Assos
        version: "1.10.2",
1912 85ad3d82 Assos Assos
        widgetEventPrefix: "drop",
1913
        options: {
1914 503b3f7b Assos Assos
                accept: "*",
1915 85ad3d82 Assos Assos
                activeClass: false,
1916
                addClasses: true,
1917
                greedy: false,
1918
                hoverClass: false,
1919 503b3f7b Assos Assos
                scope: "default",
1920
                tolerance: "intersect",
1921
1922
                // callbacks
1923
                activate: null,
1924
                deactivate: null,
1925
                drop: null,
1926
                out: null,
1927
                over: null
1928 85ad3d82 Assos Assos
        },
1929
        _create: function() {
1930
1931 503b3f7b Assos Assos
                var o = this.options,
1932
                        accept = o.accept;
1933
1934
                this.isover = false;
1935
                this.isout = true;
1936 85ad3d82 Assos Assos
1937
                this.accept = $.isFunction(accept) ? accept : function(d) {
1938
                        return d.is(accept);
1939
                };
1940
1941
                //Store the droppable's proportions
1942
                this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
1943
1944
                // Add the reference and positions to the manager
1945
                $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
1946
                $.ui.ddmanager.droppables[o.scope].push(this);
1947
1948
                (o.addClasses && this.element.addClass("ui-droppable"));
1949
1950
        },
1951
1952 503b3f7b Assos Assos
        _destroy: function() {
1953
                var i = 0,
1954
                        drop = $.ui.ddmanager.droppables[this.options.scope];
1955 85ad3d82 Assos Assos
1956 503b3f7b Assos Assos
                for ( ; i < drop.length; i++ ) {
1957
                        if ( drop[i] === this ) {
1958
                                drop.splice(i, 1);
1959
                        }
1960
                }
1961 85ad3d82 Assos Assos
1962 503b3f7b Assos Assos
                this.element.removeClass("ui-droppable ui-droppable-disabled");
1963 85ad3d82 Assos Assos
        },
1964
1965
        _setOption: function(key, value) {
1966
1967 503b3f7b Assos Assos
                if(key === "accept") {
1968 85ad3d82 Assos Assos
                        this.accept = $.isFunction(value) ? value : function(d) {
1969
                                return d.is(value);
1970
                        };
1971
                }
1972
                $.Widget.prototype._setOption.apply(this, arguments);
1973
        },
1974
1975
        _activate: function(event) {
1976
                var draggable = $.ui.ddmanager.current;
1977 503b3f7b Assos Assos
                if(this.options.activeClass) {
1978
                        this.element.addClass(this.options.activeClass);
1979
                }
1980
                if(draggable){
1981
                        this._trigger("activate", event, this.ui(draggable));
1982
                }
1983 85ad3d82 Assos Assos
        },
1984
1985
        _deactivate: function(event) {
1986
                var draggable = $.ui.ddmanager.current;
1987 503b3f7b Assos Assos
                if(this.options.activeClass) {
1988
                        this.element.removeClass(this.options.activeClass);
1989
                }
1990
                if(draggable){
1991
                        this._trigger("deactivate", event, this.ui(draggable));
1992
                }
1993 85ad3d82 Assos Assos
        },
1994
1995
        _over: function(event) {
1996
1997
                var draggable = $.ui.ddmanager.current;
1998 503b3f7b Assos Assos
1999
                // Bail if draggable and droppable are same element
2000
                if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
2001
                        return;
2002
                }
2003 85ad3d82 Assos Assos
2004
                if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2005 503b3f7b Assos Assos
                        if(this.options.hoverClass) {
2006
                                this.element.addClass(this.options.hoverClass);
2007
                        }
2008
                        this._trigger("over", event, this.ui(draggable));
2009 85ad3d82 Assos Assos
                }
2010
2011
        },
2012
2013
        _out: function(event) {
2014
2015
                var draggable = $.ui.ddmanager.current;
2016 503b3f7b Assos Assos
2017
                // Bail if draggable and droppable are same element
2018
                if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
2019
                        return;
2020
                }
2021 85ad3d82 Assos Assos
2022
                if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2023 503b3f7b Assos Assos
                        if(this.options.hoverClass) {
2024
                                this.element.removeClass(this.options.hoverClass);
2025
                        }
2026
                        this._trigger("out", event, this.ui(draggable));
2027 85ad3d82 Assos Assos
                }
2028
2029
        },
2030
2031
        _drop: function(event,custom) {
2032
2033 503b3f7b Assos Assos
                var draggable = custom || $.ui.ddmanager.current,
2034
                        childrenIntersection = false;
2035
2036
                // Bail if draggable and droppable are same element
2037
                if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
2038
                        return false;
2039
                }
2040 85ad3d82 Assos Assos
2041 503b3f7b Assos Assos
                this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() {
2042
                        var inst = $.data(this, "ui-droppable");
2043 85ad3d82 Assos Assos
                        if(
2044 503b3f7b Assos Assos
                                inst.options.greedy &&
2045
                                !inst.options.disabled &&
2046
                                inst.options.scope === draggable.options.scope &&
2047
                                inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) &&
2048
                                $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
2049 85ad3d82 Assos Assos
                        ) { childrenIntersection = true; return false; }
2050
                });
2051 503b3f7b Assos Assos
                if(childrenIntersection) {
2052
                        return false;
2053
                }
2054 85ad3d82 Assos Assos
2055
                if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2056 503b3f7b Assos Assos
                        if(this.options.activeClass) {
2057
                                this.element.removeClass(this.options.activeClass);
2058
                        }
2059
                        if(this.options.hoverClass) {
2060
                                this.element.removeClass(this.options.hoverClass);
2061
                        }
2062
                        this._trigger("drop", event, this.ui(draggable));
2063 85ad3d82 Assos Assos
                        return this.element;
2064
                }
2065
2066
                return false;
2067
2068
        },
2069
2070
        ui: function(c) {
2071
                return {
2072
                        draggable: (c.currentItem || c.element),
2073
                        helper: c.helper,
2074
                        position: c.position,
2075
                        offset: c.positionAbs
2076
                };
2077
        }
2078
2079
});
2080
2081
$.ui.intersect = function(draggable, droppable, toleranceMode) {
2082
2083 503b3f7b Assos Assos
        if (!droppable.offset) {
2084
                return false;
2085
        }
2086 85ad3d82 Assos Assos
2087 503b3f7b Assos Assos
        var draggableLeft, draggableTop,
2088
                x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
2089
                y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height,
2090
                l = droppable.offset.left, r = l + droppable.proportions.width,
2091 85ad3d82 Assos Assos
                t = droppable.offset.top, b = t + droppable.proportions.height;
2092
2093
        switch (toleranceMode) {
2094 503b3f7b Assos Assos
                case "fit":
2095
                        return (l <= x1 && x2 <= r && t <= y1 && y2 <= b);
2096
                case "intersect":
2097
                        return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half
2098
                                x2 - (draggable.helperProportions.width / 2) < r && // Left Half
2099
                                t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half
2100
                                y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
2101
                case "pointer":
2102
                        draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left);
2103
                        draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top);
2104
                        return isOverAxis( draggableTop, t, droppable.proportions.height ) && isOverAxis( draggableLeft, l, droppable.proportions.width );
2105
                case "touch":
2106 85ad3d82 Assos Assos
                        return (
2107 503b3f7b Assos Assos
                                (y1 >= t && y1 <= b) ||        // Top edge touching
2108
                                (y2 >= t && y2 <= b) ||        // Bottom edge touching
2109
                                (y1 < t && y2 > b)                // Surrounded vertically
2110
                        ) && (
2111
                                (x1 >= l && x1 <= r) ||        // Left edge touching
2112
                                (x2 >= l && x2 <= r) ||        // Right edge touching
2113
                                (x1 < l && x2 > r)                // Surrounded horizontally
2114
                        );
2115 85ad3d82 Assos Assos
                default:
2116
                        return false;
2117
                }
2118
2119
};
2120
2121
/*
2122
        This manager tracks offsets of draggables and droppables
2123
*/
2124
$.ui.ddmanager = {
2125
        current: null,
2126 503b3f7b Assos Assos
        droppables: { "default": [] },
2127 85ad3d82 Assos Assos
        prepareOffsets: function(t, event) {
2128
2129 503b3f7b Assos Assos
                var i, j,
2130
                        m = $.ui.ddmanager.droppables[t.options.scope] || [],
2131
                        type = event ? event.type : null, // workaround for #2317
2132
                        list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack();
2133
2134
                droppablesLoop: for (i = 0; i < m.length; i++) {
2135
2136
                        //No disabled and non-accepted
2137
                        if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) {
2138
                                continue;
2139
                        }
2140 85ad3d82 Assos Assos
2141 503b3f7b Assos Assos
                        // Filter out elements in the current dragged item
2142
                        for (j=0; j < list.length; j++) {
2143
                                if(list[j] === m[i].element[0]) {
2144
                                        m[i].proportions.height = 0;
2145
                                        continue droppablesLoop;
2146
                                }
2147
                        }
2148 85ad3d82 Assos Assos
2149 503b3f7b Assos Assos
                        m[i].visible = m[i].element.css("display") !== "none";
2150
                        if(!m[i].visible) {
2151
                                continue;
2152
                        }
2153 85ad3d82 Assos Assos
2154 503b3f7b Assos Assos
                        //Activate the droppable if used directly from draggables
2155
                        if(type === "mousedown") {
2156
                                m[i]._activate.call(m[i], event);
2157
                        }
2158 85ad3d82 Assos Assos
2159
                        m[i].offset = m[i].element.offset();
2160
                        m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
2161
2162
                }
2163
2164
        },
2165
        drop: function(draggable, event) {
2166
2167
                var dropped = false;
2168 503b3f7b Assos Assos
                // Create a copy of the droppables in case the list changes during the drop (#9116)
2169
                $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() {
2170 85ad3d82 Assos Assos
2171 503b3f7b Assos Assos
                        if(!this.options) {
2172
                                return;
2173
                        }
2174
                        if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) {
2175
                                dropped = this._drop.call(this, event) || dropped;
2176
                        }
2177 85ad3d82 Assos Assos
2178
                        if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
2179 503b3f7b Assos Assos
                                this.isout = true;
2180
                                this.isover = false;
2181 85ad3d82 Assos Assos
                                this._deactivate.call(this, event);
2182
                        }
2183
2184
                });
2185
                return dropped;
2186
2187
        },
2188 503b3f7b Assos Assos
        dragStart: function( draggable, event ) {
2189
                //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
2190
                draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
2191
                        if( !draggable.options.refreshPositions ) {
2192
                                $.ui.ddmanager.prepareOffsets( draggable, event );
2193
                        }
2194
                });
2195
        },
2196 85ad3d82 Assos Assos
        drag: function(draggable, event) {
2197
2198
                //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
2199 503b3f7b Assos Assos
                if(draggable.options.refreshPositions) {
2200
                        $.ui.ddmanager.prepareOffsets(draggable, event);
2201
                }
2202 85ad3d82 Assos Assos
2203
                //Run through all droppables and check their positions based on specific tolerance options
2204
                $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
2205
2206 503b3f7b Assos Assos
                        if(this.options.disabled || this.greedyChild || !this.visible) {
2207
                                return;
2208
                        }
2209 85ad3d82 Assos Assos
2210 503b3f7b Assos Assos
                        var parentInstance, scope, parent,
2211
                                intersects = $.ui.intersect(draggable, this, this.options.tolerance),
2212
                                c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null);
2213
                        if(!c) {
2214
                                return;
2215
                        }
2216 85ad3d82 Assos Assos
2217
                        if (this.options.greedy) {
2218 503b3f7b Assos Assos
                                // find droppable parents with same scope
2219
                                scope = this.options.scope;
2220
                                parent = this.element.parents(":data(ui-droppable)").filter(function () {
2221
                                        return $.data(this, "ui-droppable").options.scope === scope;
2222
                                });
2223
2224 85ad3d82 Assos Assos
                                if (parent.length) {
2225 503b3f7b Assos Assos
                                        parentInstance = $.data(parent[0], "ui-droppable");
2226
                                        parentInstance.greedyChild = (c === "isover");
2227 85ad3d82 Assos Assos
                                }
2228
                        }
2229
2230
                        // we just moved into a greedy child
2231 503b3f7b Assos Assos
                        if (parentInstance && c === "isover") {
2232
                                parentInstance.isover = false;
2233
                                parentInstance.isout = true;
2234 85ad3d82 Assos Assos
                                parentInstance._out.call(parentInstance, event);
2235
                        }
2236
2237 503b3f7b Assos Assos
                        this[c] = true;
2238
                        this[c === "isout" ? "isover" : "isout"] = false;
2239
                        this[c === "isover" ? "_over" : "_out"].call(this, event);
2240 85ad3d82 Assos Assos
2241
                        // we just moved out of a greedy child
2242 503b3f7b Assos Assos
                        if (parentInstance && c === "isout") {
2243
                                parentInstance.isout = false;
2244
                                parentInstance.isover = true;
2245 85ad3d82 Assos Assos
                                parentInstance._over.call(parentInstance, event);
2246
                        }
2247
                });
2248
2249 503b3f7b Assos Assos
        },
2250
        dragStop: function( draggable, event ) {
2251
                draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
2252
                //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
2253
                if( !draggable.options.refreshPositions ) {
2254
                        $.ui.ddmanager.prepareOffsets( draggable, event );
2255
                }
2256 85ad3d82 Assos Assos
        }
2257
};
2258
2259
})(jQuery);
2260 503b3f7b Assos Assos
2261 85ad3d82 Assos Assos
(function( $, undefined ) {
2262
2263 503b3f7b Assos Assos
function num(v) {
2264
        return parseInt(v, 10) || 0;
2265
}
2266
2267
function isNumber(value) {
2268
        return !isNaN(parseInt(value, 10));
2269
}
2270
2271 85ad3d82 Assos Assos
$.widget("ui.resizable", $.ui.mouse, {
2272 503b3f7b Assos Assos
        version: "1.10.2",
2273 85ad3d82 Assos Assos
        widgetEventPrefix: "resize",
2274
        options: {
2275
                alsoResize: false,
2276
                animate: false,
2277
                animateDuration: "slow",
2278
                animateEasing: "swing",
2279
                aspectRatio: false,
2280
                autoHide: false,
2281
                containment: false,
2282
                ghost: false,
2283
                grid: false,
2284
                handles: "e,s,se",
2285
                helper: false,
2286
                maxHeight: null,
2287
                maxWidth: null,
2288
                minHeight: 10,
2289
                minWidth: 10,
2290 503b3f7b Assos Assos
                // See #7960
2291
                zIndex: 90,
2292
2293
                // callbacks
2294
                resize: null,
2295
                start: null,
2296
                stop: null
2297 85ad3d82 Assos Assos
        },
2298
        _create: function() {
2299
2300 503b3f7b Assos Assos
                var n, i, handle, axis, hname,
2301
                        that = this,
2302
                        o = this.options;
2303 85ad3d82 Assos Assos
                this.element.addClass("ui-resizable");
2304
2305
                $.extend(this, {
2306
                        _aspectRatio: !!(o.aspectRatio),
2307
                        aspectRatio: o.aspectRatio,
2308
                        originalElement: this.element,
2309
                        _proportionallyResizeElements: [],
2310 503b3f7b Assos Assos
                        _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
2311 85ad3d82 Assos Assos
                });
2312
2313
                //Wrap the element if it cannot hold child nodes
2314
                if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
2315
2316
                        //Create a wrapper element and set the wrapper to the new current internal element
2317
                        this.element.wrap(
2318 503b3f7b Assos Assos
                                $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
2319
                                        position: this.element.css("position"),
2320 85ad3d82 Assos Assos
                                        width: this.element.outerWidth(),
2321
                                        height: this.element.outerHeight(),
2322 503b3f7b Assos Assos
                                        top: this.element.css("top"),
2323
                                        left: this.element.css("left")
2324 85ad3d82 Assos Assos
                                })
2325
                        );
2326
2327
                        //Overwrite the original this.element
2328
                        this.element = this.element.parent().data(
2329 503b3f7b Assos Assos
                                "ui-resizable", this.element.data("ui-resizable")
2330 85ad3d82 Assos Assos
                        );
2331
2332
                        this.elementIsWrapper = true;
2333
2334
                        //Move margins to the wrapper
2335
                        this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
2336
                        this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
2337
2338
                        //Prevent Safari textarea resize
2339 503b3f7b Assos Assos
                        this.originalResizeStyle = this.originalElement.css("resize");
2340
                        this.originalElement.css("resize", "none");
2341 85ad3d82 Assos Assos
2342
                        //Push the actual element to our proportionallyResize internal array
2343 503b3f7b Assos Assos
                        this._proportionallyResizeElements.push(this.originalElement.css({ position: "static", zoom: 1, display: "block" }));
2344 85ad3d82 Assos Assos
2345
                        // avoid IE jump (hard set the margin)
2346 503b3f7b Assos Assos
                        this.originalElement.css({ margin: this.originalElement.css("margin") });
2347 85ad3d82 Assos Assos
2348
                        // fix handlers offset
2349
                        this._proportionallyResize();
2350
2351
                }
2352
2353 503b3f7b Assos Assos
                this.handles = o.handles || (!$(".ui-resizable-handle", this.element).length ? "e,s,se" : { n: ".ui-resizable-n", e: ".ui-resizable-e", s: ".ui-resizable-s", w: ".ui-resizable-w", se: ".ui-resizable-se", sw: ".ui-resizable-sw", ne: ".ui-resizable-ne", nw: ".ui-resizable-nw" });
2354
                if(this.handles.constructor === String) {
2355
2356
                        if ( this.handles === "all") {
2357
                                this.handles = "n,e,s,w,se,sw,ne,nw";
2358
                        }
2359 85ad3d82 Assos Assos
2360 503b3f7b Assos Assos
                        n = this.handles.split(",");
2361
                        this.handles = {};
2362 85ad3d82 Assos Assos
2363 503b3f7b Assos Assos
                        for(i = 0; i < n.length; i++) {
2364 85ad3d82 Assos Assos
2365 503b3f7b Assos Assos
                                handle = $.trim(n[i]);
2366
                                hname = "ui-resizable-"+handle;
2367
                                axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
2368 85ad3d82 Assos Assos
2369 503b3f7b Assos Assos
                                // Apply zIndex to all handles - see #7960
2370
                                axis.css({ zIndex: o.zIndex });
2371 85ad3d82 Assos Assos
2372
                                //TODO : What's going on here?
2373 503b3f7b Assos Assos
                                if ("se" === handle) {
2374
                                        axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
2375
                                }
2376 85ad3d82 Assos Assos
2377
                                //Insert into internal handles object and append to element
2378 503b3f7b Assos Assos
                                this.handles[handle] = ".ui-resizable-"+handle;
2379 85ad3d82 Assos Assos
                                this.element.append(axis);
2380
                        }
2381
2382
                }
2383
2384
                this._renderAxis = function(target) {
2385
2386 503b3f7b Assos Assos
                        var i, axis, padPos, padWrapper;
2387
2388 85ad3d82 Assos Assos
                        target = target || this.element;
2389
2390 503b3f7b Assos Assos
                        for(i in this.handles) {
2391 85ad3d82 Assos Assos
2392 503b3f7b Assos Assos
                                if(this.handles[i].constructor === String) {
2393 85ad3d82 Assos Assos
                                        this.handles[i] = $(this.handles[i], this.element).show();
2394 503b3f7b Assos Assos
                                }
2395 85ad3d82 Assos Assos
2396
                                //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
2397
                                if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
2398
2399 503b3f7b Assos Assos
                                        axis = $(this.handles[i], this.element);
2400 85ad3d82 Assos Assos
2401
                                        //Checking the correct pad and border
2402
                                        padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
2403
2404
                                        //The padding type i have to apply...
2405 503b3f7b Assos Assos
                                        padPos = [ "padding",
2406
                                                /ne|nw|n/.test(i) ? "Top" :
2407
                                                /se|sw|s/.test(i) ? "Bottom" :
2408
                                                /^e$/.test(i) ? "Right" : "Left" ].join("");
2409 85ad3d82 Assos Assos
2410
                                        target.css(padPos, padWrapper);
2411
2412
                                        this._proportionallyResize();
2413
2414
                                }
2415
2416
                                //TODO: What's that good for? There's not anything to be executed left
2417 503b3f7b Assos Assos
                                if(!$(this.handles[i]).length) {
2418 85ad3d82 Assos Assos
                                        continue;
2419 503b3f7b Assos Assos
                                }
2420 85ad3d82 Assos Assos
                        }
2421
                };
2422
2423
                //TODO: make renderAxis a prototype function
2424
                this._renderAxis(this.element);
2425
2426 503b3f7b Assos Assos
                this._handles = $(".ui-resizable-handle", this.element)
2427 85ad3d82 Assos Assos
                        .disableSelection();
2428
2429
                //Matching axis name
2430
                this._handles.mouseover(function() {
2431 503b3f7b Assos Assos
                        if (!that.resizing) {
2432
                                if (this.className) {
2433
                                        axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
2434
                                }
2435 85ad3d82 Assos Assos
                                //Axis, default = se
2436 503b3f7b Assos Assos
                                that.axis = axis && axis[1] ? axis[1] : "se";
2437 85ad3d82 Assos Assos
                        }
2438
                });
2439
2440
                //If we want to auto hide the elements
2441
                if (o.autoHide) {
2442
                        this._handles.hide();
2443
                        $(this.element)
2444
                                .addClass("ui-resizable-autohide")
2445 503b3f7b Assos Assos
                                .mouseenter(function() {
2446
                                        if (o.disabled) {
2447
                                                return;
2448
                                        }
2449 85ad3d82 Assos Assos
                                        $(this).removeClass("ui-resizable-autohide");
2450 503b3f7b Assos Assos
                                        that._handles.show();
2451
                                })
2452
                                .mouseleave(function(){
2453
                                        if (o.disabled) {
2454
                                                return;
2455
                                        }
2456
                                        if (!that.resizing) {
2457 85ad3d82 Assos Assos
                                                $(this).addClass("ui-resizable-autohide");
2458 503b3f7b Assos Assos
                                                that._handles.hide();
2459 85ad3d82 Assos Assos
                                        }
2460
                                });
2461
                }
2462
2463
                //Initialize the mouse interaction
2464
                this._mouseInit();
2465
2466
        },
2467
2468 503b3f7b Assos Assos
        _destroy: function() {
2469 85ad3d82 Assos Assos
2470
                this._mouseDestroy();
2471
2472 503b3f7b Assos Assos
                var wrapper,
2473
                        _destroy = function(exp) {
2474
                                $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
2475
                                        .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove();
2476
                        };
2477 85ad3d82 Assos Assos
2478
                //TODO: Unwrap at same DOM position
2479
                if (this.elementIsWrapper) {
2480
                        _destroy(this.element);
2481 503b3f7b Assos Assos
                        wrapper = this.element;
2482
                        this.originalElement.css({
2483
                                position: wrapper.css("position"),
2484
                                width: wrapper.outerWidth(),
2485
                                height: wrapper.outerHeight(),
2486
                                top: wrapper.css("top"),
2487
                                left: wrapper.css("left")
2488
                        }).insertAfter( wrapper );
2489
                        wrapper.remove();
2490
                }
2491
2492
                this.originalElement.css("resize", this.originalResizeStyle);
2493 85ad3d82 Assos Assos
                _destroy(this.originalElement);
2494
2495
                return this;
2496
        },
2497
2498
        _mouseCapture: function(event) {
2499 503b3f7b Assos Assos
                var i, handle,
2500
                        capture = false;
2501
2502
                for (i in this.handles) {
2503
                        handle = $(this.handles[i])[0];
2504
                        if (handle === event.target || $.contains(handle, event.target)) {
2505
                                capture = true;
2506 85ad3d82 Assos Assos
                        }
2507
                }
2508
2509 503b3f7b Assos Assos
                return !this.options.disabled && capture;
2510 85ad3d82 Assos Assos
        },
2511
2512
        _mouseStart: function(event) {
2513
2514 503b3f7b Assos Assos
                var curleft, curtop, cursor,
2515
                        o = this.options,
2516
                        iniPos = this.element.position(),
2517
                        el = this.element;
2518 85ad3d82 Assos Assos
2519
                this.resizing = true;
2520
2521
                // bugfix for http://dev.jquery.com/ticket/1749
2522 503b3f7b Assos Assos
                if ( (/absolute/).test( el.css("position") ) ) {
2523
                        el.css({ position: "absolute", top: el.css("top"), left: el.css("left") });
2524
                } else if (el.is(".ui-draggable")) {
2525
                        el.css({ position: "absolute", top: iniPos.top, left: iniPos.left });
2526 85ad3d82 Assos Assos
                }
2527
2528
                this._renderProxy();
2529
2530 503b3f7b Assos Assos
                curleft = num(this.helper.css("left"));
2531
                curtop = num(this.helper.css("top"));
2532 85ad3d82 Assos Assos
2533
                if (o.containment) {
2534
                        curleft += $(o.containment).scrollLeft() || 0;
2535
                        curtop += $(o.containment).scrollTop() || 0;
2536
                }
2537
2538
                //Store needed variables
2539
                this.offset = this.helper.offset();
2540
                this.position = { left: curleft, top: curtop };
2541
                this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
2542
                this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
2543
                this.originalPosition = { left: curleft, top: curtop };
2544
                this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
2545
                this.originalMousePosition = { left: event.pageX, top: event.pageY };
2546
2547
                //Aspect Ratio
2548 503b3f7b Assos Assos
                this.aspectRatio = (typeof o.aspectRatio === "number") ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
2549 85ad3d82 Assos Assos
2550 503b3f7b Assos Assos
                cursor = $(".ui-resizable-" + this.axis).css("cursor");
2551
                $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
2552 85ad3d82 Assos Assos
2553
                el.addClass("ui-resizable-resizing");
2554
                this._propagate("start", event);
2555
                return true;
2556
        },
2557
2558
        _mouseDrag: function(event) {
2559
2560
                //Increase performance, avoid regex
2561 503b3f7b Assos Assos
                var data,
2562
                        el = this.helper, props = {},
2563
                        smp = this.originalMousePosition,
2564
                        a = this.axis,
2565
                        prevTop = this.position.top,
2566
                        prevLeft = this.position.left,
2567
                        prevWidth = this.size.width,
2568
                        prevHeight = this.size.height,
2569
                        dx = (event.pageX-smp.left)||0,
2570
                        dy = (event.pageY-smp.top)||0,
2571
                        trigger = this._change[a];
2572
2573
                if (!trigger) {
2574
                        return false;
2575
                }
2576 85ad3d82 Assos Assos
2577
                // Calculate the attrs that will be change
2578 503b3f7b Assos Assos
                data = trigger.apply(this, [event, dx, dy]);
2579 85ad3d82 Assos Assos
2580 503b3f7b Assos Assos
                // Put this in the mouseDrag handler since the user can start pressing shift while resizing
2581
                this._updateVirtualBoundaries(event.shiftKey);
2582
                if (this._aspectRatio || event.shiftKey) {
2583 85ad3d82 Assos Assos
                        data = this._updateRatio(data, event);
2584 503b3f7b Assos Assos
                }
2585 85ad3d82 Assos Assos
2586
                data = this._respectSize(data, event);
2587
2588 503b3f7b Assos Assos
                this._updateCache(data);
2589
2590 85ad3d82 Assos Assos
                // plugins callbacks need to be called first
2591
                this._propagate("resize", event);
2592
2593 503b3f7b Assos Assos
                if (this.position.top !== prevTop) {
2594
                        props.top = this.position.top + "px";
2595
                }
2596
                if (this.position.left !== prevLeft) {
2597
                        props.left = this.position.left + "px";
2598
                }
2599
                if (this.size.width !== prevWidth) {
2600
                        props.width = this.size.width + "px";
2601
                }
2602
                if (this.size.height !== prevHeight) {
2603
                        props.height = this.size.height + "px";
2604
                }
2605
                el.css(props);
2606 85ad3d82 Assos Assos
2607 503b3f7b Assos Assos
                if (!this._helper && this._proportionallyResizeElements.length) {
2608 85ad3d82 Assos Assos
                        this._proportionallyResize();
2609 503b3f7b Assos Assos
                }
2610 85ad3d82 Assos Assos
2611 503b3f7b Assos Assos
                // Call the user callback if the element was resized
2612
                if ( ! $.isEmptyObject(props) ) {
2613
                        this._trigger("resize", event, this.ui());
2614
                }
2615 85ad3d82 Assos Assos
2616
                return false;
2617
        },
2618
2619
        _mouseStop: function(event) {
2620
2621
                this.resizing = false;
2622 503b3f7b Assos Assos
                var pr, ista, soffseth, soffsetw, s, left, top,
2623
                        o = this.options, that = this;
2624 85ad3d82 Assos Assos
2625
                if(this._helper) {
2626
2627 503b3f7b Assos Assos
                        pr = this._proportionallyResizeElements;
2628
                        ista = pr.length && (/textarea/i).test(pr[0].nodeName);
2629
                        soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height;
2630
                        soffsetw = ista ? 0 : that.sizeDiff.width;
2631
2632
                        s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) };
2633
                        left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null;
2634
                        top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
2635 85ad3d82 Assos Assos
2636 503b3f7b Assos Assos
                        if (!o.animate) {
2637 85ad3d82 Assos Assos
                                this.element.css($.extend(s, { top: top, left: left }));
2638 503b3f7b Assos Assos
                        }
2639 85ad3d82 Assos Assos
2640 503b3f7b Assos Assos
                        that.helper.height(that.size.height);
2641
                        that.helper.width(that.size.width);
2642 85ad3d82 Assos Assos
2643 503b3f7b Assos Assos
                        if (this._helper && !o.animate) {
2644
                                this._proportionallyResize();
2645
                        }
2646 85ad3d82 Assos Assos
                }
2647
2648 503b3f7b Assos Assos
                $("body").css("cursor", "auto");
2649 85ad3d82 Assos Assos
2650
                this.element.removeClass("ui-resizable-resizing");
2651
2652
                this._propagate("stop", event);
2653
2654 503b3f7b Assos Assos
                if (this._helper) {
2655
                        this.helper.remove();
2656
                }
2657
2658 85ad3d82 Assos Assos
                return false;
2659
2660
        },
2661
2662 503b3f7b Assos Assos
        _updateVirtualBoundaries: function(forceAspectRatio) {
2663
                var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
2664
                        o = this.options;
2665
2666
                b = {
2667
                        minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
2668
                        maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
2669
                        minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
2670
                        maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
2671
                };
2672
2673
                if(this._aspectRatio || forceAspectRatio) {
2674
                        // We want to create an enclosing box whose aspect ration is the requested one
2675
                        // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
2676
                        pMinWidth = b.minHeight * this.aspectRatio;
2677
                        pMinHeight = b.minWidth / this.aspectRatio;
2678
                        pMaxWidth = b.maxHeight * this.aspectRatio;
2679
                        pMaxHeight = b.maxWidth / this.aspectRatio;
2680
2681
                        if(pMinWidth > b.minWidth) {
2682
                                b.minWidth = pMinWidth;
2683
                        }
2684
                        if(pMinHeight > b.minHeight) {
2685
                                b.minHeight = pMinHeight;
2686
                        }
2687
                        if(pMaxWidth < b.maxWidth) {
2688
                                b.maxWidth = pMaxWidth;
2689
                        }
2690
                        if(pMaxHeight < b.maxHeight) {
2691
                                b.maxHeight = pMaxHeight;
2692
                        }
2693
                }
2694
                this._vBoundaries = b;
2695
        },
2696
2697 85ad3d82 Assos Assos
        _updateCache: function(data) {
2698
                this.offset = this.helper.offset();
2699 503b3f7b Assos Assos
                if (isNumber(data.left)) {
2700
                        this.position.left = data.left;
2701
                }
2702
                if (isNumber(data.top)) {
2703
                        this.position.top = data.top;
2704
                }
2705
                if (isNumber(data.height)) {
2706
                        this.size.height = data.height;
2707
                }
2708
                if (isNumber(data.width)) {
2709
                        this.size.width = data.width;
2710
                }
2711 85ad3d82 Assos Assos
        },
2712
2713 503b3f7b Assos Assos
        _updateRatio: function( data ) {
2714 85ad3d82 Assos Assos
2715 503b3f7b Assos Assos
                var cpos = this.position,
2716
                        csize = this.size,
2717
                        a = this.axis;
2718 85ad3d82 Assos Assos
2719 503b3f7b Assos Assos
                if (isNumber(data.height)) {
2720
                        data.width = (data.height * this.aspectRatio);
2721
                } else if (isNumber(data.width)) {
2722
                        data.height = (data.width / this.aspectRatio);
2723
                }
2724 85ad3d82 Assos Assos
2725 503b3f7b Assos Assos
                if (a === "sw") {
2726 85ad3d82 Assos Assos
                        data.left = cpos.left + (csize.width - data.width);
2727
                        data.top = null;
2728
                }
2729 503b3f7b Assos Assos
                if (a === "nw") {
2730 85ad3d82 Assos Assos
                        data.top = cpos.top + (csize.height - data.height);
2731
                        data.left = cpos.left + (csize.width - data.width);
2732
                }
2733
2734
                return data;
2735
        },
2736
2737 503b3f7b Assos Assos
        _respectSize: function( data ) {
2738 85ad3d82 Assos Assos
2739 503b3f7b Assos Assos
                var o = this._vBoundaries,
2740
                        a = this.axis,
2741
                        ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
2742
                        isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
2743
                        dw = this.originalPosition.left + this.originalSize.width,
2744
                        dh = this.position.top + this.size.height,
2745
                        cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
2746
                if (isminw) {
2747
                        data.width = o.minWidth;
2748
                }
2749
                if (isminh) {
2750
                        data.height = o.minHeight;
2751
                }
2752
                if (ismaxw) {
2753
                        data.width = o.maxWidth;
2754
                }
2755
                if (ismaxh) {
2756
                        data.height = o.maxHeight;
2757
                }
2758 85ad3d82 Assos Assos
2759 503b3f7b Assos Assos
                if (isminw && cw) {
2760
                        data.left = dw - o.minWidth;
2761
                }
2762
                if (ismaxw && cw) {
2763
                        data.left = dw - o.maxWidth;
2764
                }
2765
                if (isminh && ch) {
2766
                        data.top = dh - o.minHeight;
2767
                }
2768
                if (ismaxh && ch) {
2769
                        data.top = dh - o.maxHeight;
2770
                }
2771 85ad3d82 Assos Assos
2772
                // fixing jump error on top/left - bug #2330
2773 503b3f7b Assos Assos
                if (!data.width && !data.height && !data.left && data.top) {
2774
                        data.top = null;
2775
                } else if (!data.width && !data.height && !data.top && data.left) {
2776
                        data.left = null;
2777
                }
2778 85ad3d82 Assos Assos
2779
                return data;
2780
        },
2781
2782
        _proportionallyResize: function() {
2783
2784 503b3f7b Assos Assos
                if (!this._proportionallyResizeElements.length) {
2785
                        return;
2786
                }
2787
2788
                var i, j, borders, paddings, prel,
2789
                        element = this.helper || this.element;
2790 85ad3d82 Assos Assos
2791 503b3f7b Assos Assos
                for ( i=0; i < this._proportionallyResizeElements.length; i++) {
2792 85ad3d82 Assos Assos
2793 503b3f7b Assos Assos
                        prel = this._proportionallyResizeElements[i];
2794 85ad3d82 Assos Assos
2795
                        if (!this.borderDif) {
2796 503b3f7b Assos Assos
                                this.borderDif = [];
2797
                                borders = [prel.css("borderTopWidth"), prel.css("borderRightWidth"), prel.css("borderBottomWidth"), prel.css("borderLeftWidth")];
2798
                                paddings = [prel.css("paddingTop"), prel.css("paddingRight"), prel.css("paddingBottom"), prel.css("paddingLeft")];
2799 85ad3d82 Assos Assos
2800 503b3f7b Assos Assos
                                for ( j = 0; j < borders.length; j++ ) {
2801
                                        this.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 );
2802
                                }
2803 85ad3d82 Assos Assos
                        }
2804
2805
                        prel.css({
2806
                                height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
2807
                                width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
2808
                        });
2809
2810 503b3f7b Assos Assos
                }
2811 85ad3d82 Assos Assos
2812
        },
2813
2814
        _renderProxy: function() {
2815
2816
                var el = this.element, o = this.options;
2817
                this.elementOffset = el.offset();
2818
2819
                if(this._helper) {
2820
2821 503b3f7b Assos Assos
                        this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
2822 85ad3d82 Assos Assos
2823
                        this.helper.addClass(this._helper).css({
2824 503b3f7b Assos Assos
                                width: this.element.outerWidth() - 1,
2825
                                height: this.element.outerHeight() - 1,
2826
                                position: "absolute",
2827
                                left: this.elementOffset.left +"px",
2828
                                top: this.elementOffset.top +"px",
2829 85ad3d82 Assos Assos
                                zIndex: ++o.zIndex //TODO: Don't modify option
2830
                        });
2831
2832
                        this.helper
2833
                                .appendTo("body")
2834
                                .disableSelection();
2835
2836
                } else {
2837
                        this.helper = this.element;
2838
                }
2839
2840
        },
2841
2842
        _change: {
2843 503b3f7b Assos Assos
                e: function(event, dx) {
2844 85ad3d82 Assos Assos
                        return { width: this.originalSize.width + dx };
2845
                },
2846 503b3f7b Assos Assos
                w: function(event, dx) {
2847
                        var cs = this.originalSize, sp = this.originalPosition;
2848 85ad3d82 Assos Assos
                        return { left: sp.left + dx, width: cs.width - dx };
2849
                },
2850
                n: function(event, dx, dy) {
2851 503b3f7b Assos Assos
                        var cs = this.originalSize, sp = this.originalPosition;
2852 85ad3d82 Assos Assos
                        return { top: sp.top + dy, height: cs.height - dy };
2853
                },
2854
                s: function(event, dx, dy) {
2855
                        return { height: this.originalSize.height + dy };
2856
                },
2857
                se: function(event, dx, dy) {
2858
                        return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
2859
                },
2860
                sw: function(event, dx, dy) {
2861
                        return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
2862
                },
2863
                ne: function(event, dx, dy) {
2864
                        return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
2865
                },
2866
                nw: function(event, dx, dy) {
2867
                        return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
2868
                }
2869
        },
2870
2871
        _propagate: function(n, event) {
2872
                $.ui.plugin.call(this, n, [event, this.ui()]);
2873 503b3f7b Assos Assos
                (n !== "resize" && this._trigger(n, event, this.ui()));
2874 85ad3d82 Assos Assos
        },
2875
2876
        plugins: {},
2877
2878
        ui: function() {
2879
                return {
2880
                        originalElement: this.originalElement,
2881
                        element: this.element,
2882
                        helper: this.helper,
2883
                        position: this.position,
2884
                        size: this.size,
2885
                        originalSize: this.originalSize,
2886
                        originalPosition: this.originalPosition
2887
                };
2888
        }
2889
2890
});
2891
2892
/*
2893
 * Resizable Extensions
2894
 */
2895
2896
$.ui.plugin.add("resizable", "animate", {
2897
2898 503b3f7b Assos Assos
        stop: function( event ) {
2899
                var that = $(this).data("ui-resizable"),
2900
                        o = that.options,
2901
                        pr = that._proportionallyResizeElements,
2902
                        ista = pr.length && (/textarea/i).test(pr[0].nodeName),
2903
                        soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height,
2904
                        soffsetw = ista ? 0 : that.sizeDiff.width,
2905
                        style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
2906
                        left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null,
2907
                        top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
2908
2909
                that.element.animate(
2910 85ad3d82 Assos Assos
                        $.extend(style, top && left ? { top: top, left: left } : {}), {
2911
                                duration: o.animateDuration,
2912
                                easing: o.animateEasing,
2913
                                step: function() {
2914
2915
                                        var data = {
2916 503b3f7b Assos Assos
                                                width: parseInt(that.element.css("width"), 10),
2917
                                                height: parseInt(that.element.css("height"), 10),
2918
                                                top: parseInt(that.element.css("top"), 10),
2919
                                                left: parseInt(that.element.css("left"), 10)
2920 85ad3d82 Assos Assos
                                        };
2921
2922 503b3f7b Assos Assos
                                        if (pr && pr.length) {
2923
                                                $(pr[0]).css({ width: data.width, height: data.height });
2924
                                        }
2925 85ad3d82 Assos Assos
2926
                                        // propagating resize, and updating values for each animation step
2927 503b3f7b Assos Assos
                                        that._updateCache(data);
2928
                                        that._propagate("resize", event);
2929 85ad3d82 Assos Assos
2930
                                }
2931
                        }
2932
                );
2933
        }
2934
2935
});
2936
2937
$.ui.plugin.add("resizable", "containment", {
2938
2939 503b3f7b Assos Assos
        start: function() {
2940
                var element, p, co, ch, cw, width, height,
2941
                        that = $(this).data("ui-resizable"),
2942
                        o = that.options,
2943
                        el = that.element,
2944
                        oc = o.containment,
2945
                        ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
2946 85ad3d82 Assos Assos
2947 503b3f7b Assos Assos
                if (!ce) {
2948
                        return;
2949
                }
2950 85ad3d82 Assos Assos
2951 503b3f7b Assos Assos
                that.containerElement = $(ce);
2952 85ad3d82 Assos Assos
2953 503b3f7b Assos Assos
                if (/document/.test(oc) || oc === document) {
2954
                        that.containerOffset = { left: 0, top: 0 };
2955
                        that.containerPosition = { left: 0, top: 0 };
2956
2957
                        that.parentData = {
2958 85ad3d82 Assos Assos
                                element: $(document), left: 0, top: 0,
2959
                                width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
2960
                        };
2961
                }
2962
2963
                // i'm a node, so compute top, left, right, bottom
2964
                else {
2965 503b3f7b Assos Assos
                        element = $(ce);
2966
                        p = [];
2967 85ad3d82 Assos Assos
                        $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
2968
2969 503b3f7b Assos Assos
                        that.containerOffset = element.offset();
2970
                        that.containerPosition = element.position();
2971
                        that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
2972 85ad3d82 Assos Assos
2973 503b3f7b Assos Assos
                        co = that.containerOffset;
2974
                        ch = that.containerSize.height;
2975
                        cw = that.containerSize.width;
2976
                        width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw );
2977
                        height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
2978 85ad3d82 Assos Assos
2979 503b3f7b Assos Assos
                        that.parentData = {
2980 85ad3d82 Assos Assos
                                element: ce, left: co.left, top: co.top, width: width, height: height
2981
                        };
2982
                }
2983
        },
2984
2985 503b3f7b Assos Assos
        resize: function( event ) {
2986
                var woset, hoset, isParent, isOffsetRelative,
2987
                        that = $(this).data("ui-resizable"),
2988
                        o = that.options,
2989
                        co = that.containerOffset, cp = that.position,
2990
                        pRatio = that._aspectRatio || event.shiftKey,
2991
                        cop = { top:0, left:0 }, ce = that.containerElement;
2992 85ad3d82 Assos Assos
2993 503b3f7b Assos Assos
                if (ce[0] !== document && (/static/).test(ce.css("position"))) {
2994
                        cop = co;
2995
                }
2996 85ad3d82 Assos Assos
2997 503b3f7b Assos Assos
                if (cp.left < (that._helper ? co.left : 0)) {
2998
                        that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
2999
                        if (pRatio) {
3000
                                that.size.height = that.size.width / that.aspectRatio;
3001
                        }
3002
                        that.position.left = o.helper ? co.left : 0;
3003 85ad3d82 Assos Assos
                }
3004
3005 503b3f7b Assos Assos
                if (cp.top < (that._helper ? co.top : 0)) {
3006
                        that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
3007
                        if (pRatio) {
3008
                                that.size.width = that.size.height * that.aspectRatio;
3009
                        }
3010
                        that.position.top = that._helper ? co.top : 0;
3011 85ad3d82 Assos Assos
                }
3012
3013 503b3f7b Assos Assos
                that.offset.left = that.parentData.left+that.position.left;
3014
                that.offset.top = that.parentData.top+that.position.top;
3015 85ad3d82 Assos Assos
3016 503b3f7b Assos Assos
                woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width );
3017
                hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
3018 85ad3d82 Assos Assos
3019 503b3f7b Assos Assos
                isParent = that.containerElement.get(0) === that.element.parent().get(0);
3020
                isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position"));
3021 85ad3d82 Assos Assos
3022 503b3f7b Assos Assos
                if(isParent && isOffsetRelative) {
3023
                        woset -= that.parentData.left;
3024
                }
3025 85ad3d82 Assos Assos
3026 503b3f7b Assos Assos
                if (woset + that.size.width >= that.parentData.width) {
3027
                        that.size.width = that.parentData.width - woset;
3028
                        if (pRatio) {
3029
                                that.size.height = that.size.width / that.aspectRatio;
3030
                        }
3031 85ad3d82 Assos Assos
                }
3032
3033 503b3f7b Assos Assos
                if (hoset + that.size.height >= that.parentData.height) {
3034
                        that.size.height = that.parentData.height - hoset;
3035
                        if (pRatio) {
3036
                                that.size.width = that.size.height * that.aspectRatio;
3037
                        }
3038 85ad3d82 Assos Assos
                }
3039
        },
3040
3041 503b3f7b Assos Assos
        stop: function(){
3042
                var that = $(this).data("ui-resizable"),
3043
                        o = that.options,
3044
                        co = that.containerOffset,
3045
                        cop = that.containerPosition,
3046
                        ce = that.containerElement,
3047
                        helper = $(that.helper),
3048
                        ho = helper.offset(),
3049
                        w = helper.outerWidth() - that.sizeDiff.width,
3050
                        h = helper.outerHeight() - that.sizeDiff.height;
3051 85ad3d82 Assos Assos
3052 503b3f7b Assos Assos
                if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) {
3053 85ad3d82 Assos Assos
                        $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
3054 503b3f7b Assos Assos
                }
3055 85ad3d82 Assos Assos
3056 503b3f7b Assos Assos
                if (that._helper && !o.animate && (/static/).test(ce.css("position"))) {
3057 85ad3d82 Assos Assos
                        $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
3058 503b3f7b Assos Assos
                }
3059
3060
        }
3061
});
3062
3063
$.ui.plugin.add("resizable", "alsoResize", {
3064
3065
        start: function () {
3066
                var that = $(this).data("ui-resizable"),
3067
                        o = that.options,
3068
                        _store = function (exp) {
3069
                                $(exp).each(function() {
3070
                                        var el = $(this);
3071
                                        el.data("ui-resizable-alsoresize", {
3072
                                                width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
3073
                                                left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
3074
                                        });
3075
                                });
3076
                        };
3077
3078
                if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) {
3079
                        if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
3080
                        else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
3081
                }else{
3082
                        _store(o.alsoResize);
3083
                }
3084
        },
3085
3086
        resize: function (event, ui) {
3087
                var that = $(this).data("ui-resizable"),
3088
                        o = that.options,
3089
                        os = that.originalSize,
3090
                        op = that.originalPosition,
3091
                        delta = {
3092
                                height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
3093
                                top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
3094
                        },
3095
3096
                        _alsoResize = function (exp, c) {
3097
                                $(exp).each(function() {
3098
                                        var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
3099
                                                css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ["width", "height"] : ["width", "height", "top", "left"];
3100 85ad3d82 Assos Assos
3101 503b3f7b Assos Assos
                                        $.each(css, function (i, prop) {
3102
                                                var sum = (start[prop]||0) + (delta[prop]||0);
3103
                                                if (sum && sum >= 0) {
3104
                                                        style[prop] = sum || null;
3105
                                                }
3106
                                        });
3107
3108
                                        el.css(style);
3109
                                });
3110
                        };
3111
3112
                if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) {
3113
                        $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
3114
                }else{
3115
                        _alsoResize(o.alsoResize);
3116
                }
3117
        },
3118
3119
        stop: function () {
3120
                $(this).removeData("resizable-alsoresize");
3121 85ad3d82 Assos Assos
        }
3122
});
3123
3124
$.ui.plugin.add("resizable", "ghost", {
3125
3126 503b3f7b Assos Assos
        start: function() {
3127 85ad3d82 Assos Assos
3128 503b3f7b Assos Assos
                var that = $(this).data("ui-resizable"), o = that.options, cs = that.size;
3129 85ad3d82 Assos Assos
3130 503b3f7b Assos Assos
                that.ghost = that.originalElement.clone();
3131
                that.ghost
3132
                        .css({ opacity: 0.25, display: "block", position: "relative", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
3133
                        .addClass("ui-resizable-ghost")
3134
                        .addClass(typeof o.ghost === "string" ? o.ghost : "");
3135 85ad3d82 Assos Assos
3136 503b3f7b Assos Assos
                that.ghost.appendTo(that.helper);
3137 85ad3d82 Assos Assos
3138
        },
3139
3140 503b3f7b Assos Assos
        resize: function(){
3141
                var that = $(this).data("ui-resizable");
3142
                if (that.ghost) {
3143
                        that.ghost.css({ position: "relative", height: that.size.height, width: that.size.width });
3144
                }
3145 85ad3d82 Assos Assos
        },
3146
3147 503b3f7b Assos Assos
        stop: function() {
3148
                var that = $(this).data("ui-resizable");
3149
                if (that.ghost && that.helper) {
3150
                        that.helper.get(0).removeChild(that.ghost.get(0));
3151
                }
3152 85ad3d82 Assos Assos
        }
3153
3154
});
3155
3156
$.ui.plugin.add("resizable", "grid", {
3157
3158 503b3f7b Assos Assos
        resize: function() {
3159
                var that = $(this).data("ui-resizable"),
3160
                        o = that.options,
3161
                        cs = that.size,
3162
                        os = that.originalSize,
3163
                        op = that.originalPosition,
3164
                        a = that.axis,
3165
                        grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid,
3166
                        gridX = (grid[0]||1),
3167
                        gridY = (grid[1]||1),
3168
                        ox = Math.round((cs.width - os.width) / gridX) * gridX,
3169
                        oy = Math.round((cs.height - os.height) / gridY) * gridY,
3170
                        newWidth = os.width + ox,
3171
                        newHeight = os.height + oy,
3172
                        isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
3173
                        isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
3174
                        isMinWidth = o.minWidth && (o.minWidth > newWidth),
3175
                        isMinHeight = o.minHeight && (o.minHeight > newHeight);
3176
3177
                o.grid = grid;
3178
3179
                if (isMinWidth) {
3180
                        newWidth = newWidth + gridX;
3181
                }
3182
                if (isMinHeight) {
3183
                        newHeight = newHeight + gridY;
3184
                }
3185
                if (isMaxWidth) {
3186
                        newWidth = newWidth - gridX;
3187
                }
3188
                if (isMaxHeight) {
3189
                        newHeight = newHeight - gridY;
3190
                }
3191 85ad3d82 Assos Assos
3192
                if (/^(se|s|e)$/.test(a)) {
3193 503b3f7b Assos Assos
                        that.size.width = newWidth;
3194
                        that.size.height = newHeight;
3195
                } else if (/^(ne)$/.test(a)) {
3196
                        that.size.width = newWidth;
3197
                        that.size.height = newHeight;
3198
                        that.position.top = op.top - oy;
3199
                } else if (/^(sw)$/.test(a)) {
3200
                        that.size.width = newWidth;
3201
                        that.size.height = newHeight;
3202
                        that.position.left = op.left - ox;
3203
                } else {
3204
                        that.size.width = newWidth;
3205
                        that.size.height = newHeight;
3206
                        that.position.top = op.top - oy;
3207
                        that.position.left = op.left - ox;
3208 85ad3d82 Assos Assos
                }
3209
        }
3210
3211
});
3212
3213
})(jQuery);
3214 503b3f7b Assos Assos
3215 85ad3d82 Assos Assos
(function( $, undefined ) {
3216
3217
$.widget("ui.selectable", $.ui.mouse, {
3218 503b3f7b Assos Assos
        version: "1.10.2",
3219 85ad3d82 Assos Assos
        options: {
3220 503b3f7b Assos Assos
                appendTo: "body",
3221 85ad3d82 Assos Assos
                autoRefresh: true,
3222
                distance: 0,
3223 503b3f7b Assos Assos
                filter: "*",
3224
                tolerance: "touch",
3225
3226
                // callbacks
3227
                selected: null,
3228
                selecting: null,
3229
                start: null,
3230
                stop: null,
3231
                unselected: null,
3232
                unselecting: null
3233 85ad3d82 Assos Assos
        },
3234
        _create: function() {
3235 503b3f7b Assos Assos
                var selectees,
3236
                        that = this;
3237 85ad3d82 Assos Assos
3238
                this.element.addClass("ui-selectable");
3239
3240
                this.dragged = false;
3241
3242
                // cache selectee children based on filter
3243
                this.refresh = function() {
3244 503b3f7b Assos Assos
                        selectees = $(that.options.filter, that.element[0]);
3245
                        selectees.addClass("ui-selectee");
3246 85ad3d82 Assos Assos
                        selectees.each(function() {
3247 503b3f7b Assos Assos
                                var $this = $(this),
3248
                                        pos = $this.offset();
3249 85ad3d82 Assos Assos
                                $.data(this, "selectable-item", {
3250
                                        element: this,
3251
                                        $element: $this,
3252
                                        left: pos.left,
3253
                                        top: pos.top,
3254
                                        right: pos.left + $this.outerWidth(),
3255
                                        bottom: pos.top + $this.outerHeight(),
3256
                                        startselected: false,
3257 503b3f7b Assos Assos
                                        selected: $this.hasClass("ui-selected"),
3258
                                        selecting: $this.hasClass("ui-selecting"),
3259
                                        unselecting: $this.hasClass("ui-unselecting")
3260 85ad3d82 Assos Assos
                                });
3261
                        });
3262
                };
3263
                this.refresh();
3264
3265
                this.selectees = selectees.addClass("ui-selectee");
3266
3267
                this._mouseInit();
3268
3269
                this.helper = $("<div class='ui-selectable-helper'></div>");
3270
        },
3271
3272 503b3f7b Assos Assos
        _destroy: function() {
3273 85ad3d82 Assos Assos
                this.selectees
3274
                        .removeClass("ui-selectee")
3275
                        .removeData("selectable-item");
3276
                this.element
3277 503b3f7b Assos Assos
                        .removeClass("ui-selectable ui-selectable-disabled");
3278 85ad3d82 Assos Assos
                this._mouseDestroy();
3279
        },
3280
3281
        _mouseStart: function(event) {
3282 503b3f7b Assos Assos
                var that = this,
3283
                        options = this.options;
3284 85ad3d82 Assos Assos
3285
                this.opos = [event.pageX, event.pageY];
3286
3287 503b3f7b Assos Assos
                if (this.options.disabled) {
3288 85ad3d82 Assos Assos
                        return;
3289 503b3f7b Assos Assos
                }
3290 85ad3d82 Assos Assos
3291
                this.selectees = $(options.filter, this.element[0]);
3292
3293
                this._trigger("start", event);
3294
3295
                $(options.appendTo).append(this.helper);
3296
                // position helper (lasso)
3297
                this.helper.css({
3298 503b3f7b Assos Assos
                        "left": event.pageX,
3299
                        "top": event.pageY,
3300 85ad3d82 Assos Assos
                        "width": 0,
3301
                        "height": 0
3302
                });
3303
3304
                if (options.autoRefresh) {
3305
                        this.refresh();
3306
                }
3307
3308 503b3f7b Assos Assos
                this.selectees.filter(".ui-selected").each(function() {
3309 85ad3d82 Assos Assos
                        var selectee = $.data(this, "selectable-item");
3310
                        selectee.startselected = true;
3311 503b3f7b Assos Assos
                        if (!event.metaKey && !event.ctrlKey) {
3312
                                selectee.$element.removeClass("ui-selected");
3313 85ad3d82 Assos Assos
                                selectee.selected = false;
3314 503b3f7b Assos Assos
                                selectee.$element.addClass("ui-unselecting");
3315 85ad3d82 Assos Assos
                                selectee.unselecting = true;
3316
                                // selectable UNSELECTING callback
3317 503b3f7b Assos Assos
                                that._trigger("unselecting", event, {
3318 85ad3d82 Assos Assos
                                        unselecting: selectee.element
3319
                                });
3320
                        }
3321
                });
3322
3323 503b3f7b Assos Assos
                $(event.target).parents().addBack().each(function() {
3324
                        var doSelect,
3325
                                selectee = $.data(this, "selectable-item");
3326 85ad3d82 Assos Assos
                        if (selectee) {
3327 503b3f7b Assos Assos
                                doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
3328 85ad3d82 Assos Assos
                                selectee.$element
3329
                                        .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
3330
                                        .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
3331
                                selectee.unselecting = !doSelect;
3332
                                selectee.selecting = doSelect;
3333
                                selectee.selected = doSelect;
3334
                                // selectable (UN)SELECTING callback
3335
                                if (doSelect) {
3336 503b3f7b Assos Assos
                                        that._trigger("selecting", event, {
3337 85ad3d82 Assos Assos
                                                selecting: selectee.element
3338
                                        });
3339
                                } else {
3340 503b3f7b Assos Assos
                                        that._trigger("unselecting", event, {
3341 85ad3d82 Assos Assos
                                                unselecting: selectee.element
3342
                                        });
3343
                                }
3344
                                return false;
3345
                        }
3346
                });
3347
3348
        },
3349
3350
        _mouseDrag: function(event) {
3351 503b3f7b Assos Assos
3352 85ad3d82 Assos Assos
                this.dragged = true;
3353
3354 503b3f7b Assos Assos
                if (this.options.disabled) {
3355 85ad3d82 Assos Assos
                        return;
3356 503b3f7b Assos Assos
                }
3357 85ad3d82 Assos Assos
3358 503b3f7b Assos Assos
                var tmp,
3359
                        that = this,
3360
                        options = this.options,
3361
                        x1 = this.opos[0],
3362
                        y1 = this.opos[1],
3363
                        x2 = event.pageX,
3364
                        y2 = event.pageY;
3365 85ad3d82 Assos Assos
3366 503b3f7b Assos Assos
                if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
3367
                if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
3368 85ad3d82 Assos Assos
                this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
3369
3370
                this.selectees.each(function() {
3371 503b3f7b Assos Assos
                        var selectee = $.data(this, "selectable-item"),
3372
                                hit = false;
3373
3374 85ad3d82 Assos Assos
                        //prevent helper from being selected if appendTo: selectable
3375 503b3f7b Assos Assos
                        if (!selectee || selectee.element === that.element[0]) {
3376 85ad3d82 Assos Assos
                                return;
3377 503b3f7b Assos Assos
                        }
3378
3379
                        if (options.tolerance === "touch") {
3380 85ad3d82 Assos Assos
                                hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
3381 503b3f7b Assos Assos
                        } else if (options.tolerance === "fit") {
3382 85ad3d82 Assos Assos
                                hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
3383
                        }
3384
3385
                        if (hit) {
3386
                                // SELECT
3387
                                if (selectee.selected) {
3388 503b3f7b Assos Assos
                                        selectee.$element.removeClass("ui-selected");
3389 85ad3d82 Assos Assos
                                        selectee.selected = false;
3390
                                }
3391
                                if (selectee.unselecting) {
3392 503b3f7b Assos Assos
                                        selectee.$element.removeClass("ui-unselecting");
3393 85ad3d82 Assos Assos
                                        selectee.unselecting = false;
3394
                                }
3395
                                if (!selectee.selecting) {
3396 503b3f7b Assos Assos
                                        selectee.$element.addClass("ui-selecting");
3397 85ad3d82 Assos Assos
                                        selectee.selecting = true;
3398
                                        // selectable SELECTING callback
3399 503b3f7b Assos Assos
                                        that._trigger("selecting", event, {
3400 85ad3d82 Assos Assos
                                                selecting: selectee.element
3401
                                        });
3402
                                }
3403
                        } else {
3404
                                // UNSELECT
3405
                                if (selectee.selecting) {
3406 503b3f7b Assos Assos
                                        if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
3407
                                                selectee.$element.removeClass("ui-selecting");
3408 85ad3d82 Assos Assos
                                                selectee.selecting = false;
3409 503b3f7b Assos Assos
                                                selectee.$element.addClass("ui-selected");
3410 85ad3d82 Assos Assos
                                                selectee.selected = true;
3411
                                        } else {
3412 503b3f7b Assos Assos
                                                selectee.$element.removeClass("ui-selecting");
3413 85ad3d82 Assos Assos
                                                selectee.selecting = false;
3414
                                                if (selectee.startselected) {
3415 503b3f7b Assos Assos
                                                        selectee.$element.addClass("ui-unselecting");
3416 85ad3d82 Assos Assos
                                                        selectee.unselecting = true;
3417
                                                }
3418
                                                // selectable UNSELECTING callback
3419 503b3f7b Assos Assos
                                                that._trigger("unselecting", event, {
3420 85ad3d82 Assos Assos
                                                        unselecting: selectee.element
3421
                                                });
3422
                                        }
3423
                                }
3424
                                if (selectee.selected) {
3425 503b3f7b Assos Assos
                                        if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
3426
                                                selectee.$element.removeClass("ui-selected");
3427 85ad3d82 Assos Assos
                                                selectee.selected = false;
3428
3429 503b3f7b Assos Assos
                                                selectee.$element.addClass("ui-unselecting");
3430 85ad3d82 Assos Assos
                                                selectee.unselecting = true;
3431
                                                // selectable UNSELECTING callback
3432 503b3f7b Assos Assos
                                                that._trigger("unselecting", event, {
3433 85ad3d82 Assos Assos
                                                        unselecting: selectee.element
3434
                                                });
3435
                                        }
3436
                                }
3437
                        }
3438
                });
3439
3440
                return false;
3441
        },
3442
3443
        _mouseStop: function(event) {
3444 503b3f7b Assos Assos
                var that = this;
3445 85ad3d82 Assos Assos
3446
                this.dragged = false;
3447
3448 503b3f7b Assos Assos
                $(".ui-unselecting", this.element[0]).each(function() {
3449 85ad3d82 Assos Assos
                        var selectee = $.data(this, "selectable-item");
3450 503b3f7b Assos Assos
                        selectee.$element.removeClass("ui-unselecting");
3451 85ad3d82 Assos Assos
                        selectee.unselecting = false;
3452
                        selectee.startselected = false;
3453 503b3f7b Assos Assos
                        that._trigger("unselected", event, {
3454 85ad3d82 Assos Assos
                                unselected: selectee.element
3455
                        });
3456
                });
3457 503b3f7b Assos Assos
                $(".ui-selecting", this.element[0]).each(function() {
3458 85ad3d82 Assos Assos
                        var selectee = $.data(this, "selectable-item");
3459 503b3f7b Assos Assos
                        selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
3460 85ad3d82 Assos Assos
                        selectee.selecting = false;
3461
                        selectee.selected = true;
3462
                        selectee.startselected = true;
3463 503b3f7b Assos Assos
                        that._trigger("selected", event, {
3464 85ad3d82 Assos Assos
                                selected: selectee.element
3465
                        });
3466
                });
3467
                this._trigger("stop", event);
3468
3469
                this.helper.remove();
3470
3471
                return false;
3472
        }
3473
3474
});
3475
3476
})(jQuery);
3477 503b3f7b Assos Assos
3478 85ad3d82 Assos Assos
(function( $, undefined ) {
3479
3480 503b3f7b Assos Assos
/*jshint loopfunc: true */
3481
3482
function isOverAxis( x, reference, size ) {
3483
        return ( x > reference ) && ( x < ( reference + size ) );
3484
}
3485
3486
function isFloating(item) {
3487
        return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
3488
}
3489
3490 85ad3d82 Assos Assos
$.widget("ui.sortable", $.ui.mouse, {
3491 503b3f7b Assos Assos
        version: "1.10.2",
3492 85ad3d82 Assos Assos
        widgetEventPrefix: "sort",
3493 503b3f7b Assos Assos
        ready: false,
3494 85ad3d82 Assos Assos
        options: {
3495
                appendTo: "parent",
3496
                axis: false,
3497
                connectWith: false,
3498
                containment: false,
3499 503b3f7b Assos Assos
                cursor: "auto",
3500 85ad3d82 Assos Assos
                cursorAt: false,
3501
                dropOnEmpty: true,
3502
                forcePlaceholderSize: false,
3503
                forceHelperSize: false,
3504
                grid: false,
3505
                handle: false,
3506
                helper: "original",
3507 503b3f7b Assos Assos
                items: "> *",
3508 85ad3d82 Assos Assos
                opacity: false,
3509
                placeholder: false,
3510
                revert: false,
3511
                scroll: true,
3512
                scrollSensitivity: 20,
3513
                scrollSpeed: 20,
3514
                scope: "default",
3515
                tolerance: "intersect",
3516 503b3f7b Assos Assos
                zIndex: 1000,
3517
3518
                // callbacks
3519
                activate: null,
3520
                beforeStop: null,
3521
                change: null,
3522
                deactivate: null,
3523
                out: null,
3524
                over: null,
3525
                receive: null,
3526
                remove: null,
3527
                sort: null,
3528
                start: null,
3529
                stop: null,
3530
                update: null
3531 85ad3d82 Assos Assos
        },
3532
        _create: function() {
3533
3534
                var o = this.options;
3535
                this.containerCache = {};
3536
                this.element.addClass("ui-sortable");
3537
3538
                //Get the items
3539
                this.refresh();
3540
3541
                //Let's determine if the items are being displayed horizontally
3542 503b3f7b Assos Assos
                this.floating = this.items.length ? o.axis === "x" || isFloating(this.items[0].item) : false;
3543 85ad3d82 Assos Assos
3544
                //Let's determine the parent's offset
3545
                this.offset = this.element.offset();
3546
3547
                //Initialize mouse events for interaction
3548
                this._mouseInit();
3549
3550 503b3f7b Assos Assos
                //We're ready to go
3551
                this.ready = true;
3552
3553 85ad3d82 Assos Assos
        },
3554
3555 503b3f7b Assos Assos
        _destroy: function() {
3556 85ad3d82 Assos Assos
                this.element
3557 503b3f7b Assos Assos
                        .removeClass("ui-sortable ui-sortable-disabled");
3558 85ad3d82 Assos Assos
                this._mouseDestroy();
3559
3560 503b3f7b Assos Assos
                for ( var i = this.items.length - 1; i >= 0; i-- ) {
3561
                        this.items[i].item.removeData(this.widgetName + "-item");
3562
                }
3563 85ad3d82 Assos Assos
3564
                return this;
3565
        },
3566
3567
        _setOption: function(key, value){
3568
                if ( key === "disabled" ) {
3569
                        this.options[ key ] = value;
3570 503b3f7b Assos Assos
3571
                        this.widget().toggleClass( "ui-sortable-disabled", !!value );
3572 85ad3d82 Assos Assos
                } else {
3573
                        // Don't call widget base _setOption for disable as it adds ui-state-disabled class
3574
                        $.Widget.prototype._setOption.apply(this, arguments);
3575
                }
3576
        },
3577
3578
        _mouseCapture: function(event, overrideHandle) {
3579 503b3f7b Assos Assos
                var currentItem = null,
3580
                        validHandle = false,
3581
                        that = this;
3582 85ad3d82 Assos Assos
3583
                if (this.reverting) {
3584
                        return false;
3585
                }
3586
3587 503b3f7b Assos Assos
                if(this.options.disabled || this.options.type === "static") {
3588
                        return false;
3589
                }
3590 85ad3d82 Assos Assos
3591
                //We have to refresh the items data once first
3592
                this._refreshItems(event);
3593
3594
                //Find out if the clicked node (or one of its parents) is a actual item in this.items
3595 503b3f7b Assos Assos
                $(event.target).parents().each(function() {
3596
                        if($.data(this, that.widgetName + "-item") === that) {
3597 85ad3d82 Assos Assos
                                currentItem = $(this);
3598
                                return false;
3599
                        }
3600
                });
3601 503b3f7b Assos Assos
                if($.data(event.target, that.widgetName + "-item") === that) {
3602
                        currentItem = $(event.target);
3603
                }
3604 85ad3d82 Assos Assos
3605 503b3f7b Assos Assos
                if(!currentItem) {
3606
                        return false;
3607
                }
3608 85ad3d82 Assos Assos
                if(this.options.handle && !overrideHandle) {
3609 503b3f7b Assos Assos
                        $(this.options.handle, currentItem).find("*").addBack().each(function() {
3610
                                if(this === event.target) {
3611
                                        validHandle = true;
3612
                                }
3613
                        });
3614
                        if(!validHandle) {
3615
                                return false;
3616
                        }
3617 85ad3d82 Assos Assos
                }
3618
3619
                this.currentItem = currentItem;
3620
                this._removeCurrentsFromItems();
3621
                return true;
3622
3623
        },
3624
3625
        _mouseStart: function(event, overrideHandle, noActivation) {
3626
3627 503b3f7b Assos Assos
                var i, body,
3628
                        o = this.options;
3629
3630 85ad3d82 Assos Assos
                this.currentContainer = this;
3631
3632
                //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
3633
                this.refreshPositions();
3634
3635
                //Create and append the visible helper
3636
                this.helper = this._createHelper(event);
3637
3638
                //Cache the helper size
3639
                this._cacheHelperProportions();
3640
3641
                /*
3642
                 * - Position generation -
3643
                 * This block generates everything position related - it's the core of draggables.
3644
                 */
3645
3646
                //Cache the margins of the original element
3647
                this._cacheMargins();
3648
3649
                //Get the next scrolling parent
3650
                this.scrollParent = this.helper.scrollParent();
3651
3652
                //The element's absolute position on the page minus margins
3653
                this.offset = this.currentItem.offset();
3654
                this.offset = {
3655
                        top: this.offset.top - this.margins.top,
3656
                        left: this.offset.left - this.margins.left
3657
                };
3658
3659
                $.extend(this.offset, {
3660
                        click: { //Where the click happened, relative to the element
3661
                                left: event.pageX - this.offset.left,
3662
                                top: event.pageY - this.offset.top
3663
                        },
3664
                        parent: this._getParentOffset(),
3665
                        relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
3666
                });
3667
3668 503b3f7b Assos Assos
                // Only after we got the offset, we can change the helper's position to absolute
3669
                // TODO: Still need to figure out a way to make relative sorting possible
3670
                this.helper.css("position", "absolute");
3671
                this.cssPosition = this.helper.css("position");
3672
3673 85ad3d82 Assos Assos
                //Generate the original position
3674
                this.originalPosition = this._generatePosition(event);
3675
                this.originalPageX = event.pageX;
3676
                this.originalPageY = event.pageY;
3677
3678 503b3f7b Assos Assos
                //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
3679 85ad3d82 Assos Assos
                (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
3680
3681
                //Cache the former DOM position
3682
                this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
3683
3684
                //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
3685 503b3f7b Assos Assos
                if(this.helper[0] !== this.currentItem[0]) {
3686 85ad3d82 Assos Assos
                        this.currentItem.hide();
3687
                }
3688
3689
                //Create the placeholder
3690
                this._createPlaceholder();
3691
3692
                //Set a containment if given in the options
3693 503b3f7b Assos Assos
                if(o.containment) {
3694 85ad3d82 Assos Assos
                        this._setContainment();
3695 503b3f7b Assos Assos
                }
3696
3697
                if( o.cursor && o.cursor !== "auto" ) { // cursor option
3698
                        body = this.document.find( "body" );
3699 85ad3d82 Assos Assos
3700 503b3f7b Assos Assos
                        // support: IE
3701
                        this.storedCursor = body.css( "cursor" );
3702
                        body.css( "cursor", o.cursor );
3703
3704
                        this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
3705 85ad3d82 Assos Assos
                }
3706
3707
                if(o.opacity) { // opacity option
3708 503b3f7b Assos Assos
                        if (this.helper.css("opacity")) {
3709
                                this._storedOpacity = this.helper.css("opacity");
3710
                        }
3711 85ad3d82 Assos Assos
                        this.helper.css("opacity", o.opacity);
3712
                }
3713
3714
                if(o.zIndex) { // zIndex option
3715 503b3f7b Assos Assos
                        if (this.helper.css("zIndex")) {
3716
                                this._storedZIndex = this.helper.css("zIndex");
3717
                        }
3718 85ad3d82 Assos Assos
                        this.helper.css("zIndex", o.zIndex);
3719
                }
3720
3721
                //Prepare scrolling
3722 503b3f7b Assos Assos
                if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
3723 85ad3d82 Assos Assos
                        this.overflowOffset = this.scrollParent.offset();
3724 503b3f7b Assos Assos
                }
3725 85ad3d82 Assos Assos
3726
                //Call callbacks
3727
                this._trigger("start", event, this._uiHash());
3728
3729
                //Recache the helper size
3730 503b3f7b Assos Assos
                if(!this._preserveHelperProportions) {
3731 85ad3d82 Assos Assos
                        this._cacheHelperProportions();
3732 503b3f7b Assos Assos
                }
3733 85ad3d82 Assos Assos
3734
3735 503b3f7b Assos Assos
                //Post "activate" events to possible containers
3736
                if( !noActivation ) {
3737
                        for ( i = this.containers.length - 1; i >= 0; i-- ) {
3738
                                this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
3739
                        }
3740 85ad3d82 Assos Assos
                }
3741
3742
                //Prepare possible droppables
3743 503b3f7b Assos Assos
                if($.ui.ddmanager) {
3744 85ad3d82 Assos Assos
                        $.ui.ddmanager.current = this;
3745 503b3f7b Assos Assos
                }
3746 85ad3d82 Assos Assos
3747 503b3f7b Assos Assos
                if ($.ui.ddmanager && !o.dropBehaviour) {
3748 85ad3d82 Assos Assos
                        $.ui.ddmanager.prepareOffsets(this, event);
3749 503b3f7b Assos Assos
                }
3750 85ad3d82 Assos Assos
3751
                this.dragging = true;
3752
3753
                this.helper.addClass("ui-sortable-helper");
3754
                this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
3755
                return true;
3756
3757
        },
3758
3759
        _mouseDrag: function(event) {
3760 503b3f7b Assos Assos
                var i, item, itemElement, intersection,
3761
                        o = this.options,
3762
                        scrolled = false;
3763 85ad3d82 Assos Assos
3764
                //Compute the helpers position
3765
                this.position = this._generatePosition(event);
3766
                this.positionAbs = this._convertPositionTo("absolute");
3767
3768
                if (!this.lastPositionAbs) {
3769
                        this.lastPositionAbs = this.positionAbs;
3770
                }
3771
3772
                //Do scrolling
3773
                if(this.options.scroll) {
3774 503b3f7b Assos Assos
                        if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
3775 85ad3d82 Assos Assos
3776 503b3f7b Assos Assos
                                if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
3777 85ad3d82 Assos Assos
                                        this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
3778 503b3f7b Assos Assos
                                } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
3779 85ad3d82 Assos Assos
                                        this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
3780 503b3f7b Assos Assos
                                }
3781 85ad3d82 Assos Assos
3782 503b3f7b Assos Assos
                                if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
3783 85ad3d82 Assos Assos
                                        this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
3784 503b3f7b Assos Assos
                                } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
3785 85ad3d82 Assos Assos
                                        this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
3786 503b3f7b Assos Assos
                                }
3787 85ad3d82 Assos Assos
3788
                        } else {
3789
3790 503b3f7b Assos Assos
                                if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
3791 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
3792 503b3f7b Assos Assos
                                } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
3793 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
3794 503b3f7b Assos Assos
                                }
3795 85ad3d82 Assos Assos
3796 503b3f7b Assos Assos
                                if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
3797 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
3798 503b3f7b Assos Assos
                                } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
3799 85ad3d82 Assos Assos
                                        scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
3800 503b3f7b Assos Assos
                                }
3801 85ad3d82 Assos Assos
3802
                        }
3803
3804 503b3f7b Assos Assos
                        if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
3805 85ad3d82 Assos Assos
                                $.ui.ddmanager.prepareOffsets(this, event);
3806 503b3f7b Assos Assos
                        }
3807 85ad3d82 Assos Assos
                }
3808
3809
                //Regenerate the absolute position used for position checks
3810
                this.positionAbs = this._convertPositionTo("absolute");
3811
3812
                //Set the helper position
3813 503b3f7b Assos Assos
                if(!this.options.axis || this.options.axis !== "y") {
3814
                        this.helper[0].style.left = this.position.left+"px";
3815
                }
3816
                if(!this.options.axis || this.options.axis !== "x") {
3817
                        this.helper[0].style.top = this.position.top+"px";
3818
                }
3819 85ad3d82 Assos Assos
3820
                //Rearrange
3821 503b3f7b Assos Assos
                for (i = this.items.length - 1; i >= 0; i--) {
3822 85ad3d82 Assos Assos
3823
                        //Cache variables and intersection, continue if no intersection
3824 503b3f7b Assos Assos
                        item = this.items[i];
3825
                        itemElement = item.item[0];
3826
                        intersection = this._intersectsWithPointer(item);
3827
                        if (!intersection) {
3828
                                continue;
3829
                        }
3830
3831
                        // Only put the placeholder inside the current Container, skip all
3832
                        // items form other containers. This works because when moving
3833
                        // an item from one container to another the
3834
                        // currentContainer is switched before the placeholder is moved.
3835
                        //
3836
                        // Without this moving items in "sub-sortables" can cause the placeholder to jitter
3837
                        // beetween the outer and inner container.
3838
                        if (item.instance !== this.currentContainer) {
3839
                                continue;
3840
                        }
3841
3842
                        // cannot intersect with itself
3843
                        // no useless actions that have been done before
3844
                        // no action if the item moved is the parent of the item checked
3845
                        if (itemElement !== this.currentItem[0] &&
3846
                                this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
3847
                                !$.contains(this.placeholder[0], itemElement) &&
3848
                                (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
3849 85ad3d82 Assos Assos
                        ) {
3850
3851 503b3f7b Assos Assos
                                this.direction = intersection === 1 ? "down" : "up";
3852 85ad3d82 Assos Assos
3853 503b3f7b Assos Assos
                                if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
3854 85ad3d82 Assos Assos
                                        this._rearrange(event, item);
3855
                                } else {
3856
                                        break;
3857
                                }
3858
3859
                                this._trigger("change", event, this._uiHash());
3860
                                break;
3861
                        }
3862
                }
3863
3864
                //Post events to containers
3865
                this._contactContainers(event);
3866
3867
                //Interconnect with droppables
3868 503b3f7b Assos Assos
                if($.ui.ddmanager) {
3869
                        $.ui.ddmanager.drag(this, event);
3870
                }
3871 85ad3d82 Assos Assos
3872
                //Call callbacks
3873 503b3f7b Assos Assos
                this._trigger("sort", event, this._uiHash());
3874 85ad3d82 Assos Assos
3875
                this.lastPositionAbs = this.positionAbs;
3876
                return false;
3877
3878
        },
3879
3880
        _mouseStop: function(event, noPropagation) {
3881
3882 503b3f7b Assos Assos
                if(!event) {
3883
                        return;
3884
                }
3885 85ad3d82 Assos Assos
3886
                //If we are using droppables, inform the manager about the drop
3887 503b3f7b Assos Assos
                if ($.ui.ddmanager && !this.options.dropBehaviour) {
3888 85ad3d82 Assos Assos
                        $.ui.ddmanager.drop(this, event);
3889 503b3f7b Assos Assos
                }
3890 85ad3d82 Assos Assos
3891
                if(this.options.revert) {
3892 503b3f7b Assos Assos
                        var that = this,
3893
                                cur = this.placeholder.offset(),
3894
                                axis = this.options.axis,
3895
                                animation = {};
3896 85ad3d82 Assos Assos
3897 503b3f7b Assos Assos
                        if ( !axis || axis === "x" ) {
3898
                                animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);
3899
                        }
3900
                        if ( !axis || axis === "y" ) {
3901
                                animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);
3902
                        }
3903
                        this.reverting = true;
3904
                        $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
3905
                                that._clear(event);
3906 85ad3d82 Assos Assos
                        });
3907
                } else {
3908
                        this._clear(event, noPropagation);
3909
                }
3910
3911
                return false;
3912
3913
        },
3914
3915
        cancel: function() {
3916
3917
                if(this.dragging) {
3918
3919
                        this._mouseUp({ target: null });
3920
3921 503b3f7b Assos Assos
                        if(this.options.helper === "original") {
3922 85ad3d82 Assos Assos
                                this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
3923 503b3f7b Assos Assos
                        } else {
3924 85ad3d82 Assos Assos
                                this.currentItem.show();
3925 503b3f7b Assos Assos
                        }
3926 85ad3d82 Assos Assos
3927
                        //Post deactivating events to containers
3928
                        for (var i = this.containers.length - 1; i >= 0; i--){
3929 503b3f7b Assos Assos
                                this.containers[i]._trigger("deactivate", null, this._uiHash(this));
3930 85ad3d82 Assos Assos
                                if(this.containers[i].containerCache.over) {
3931 503b3f7b Assos Assos
                                        this.containers[i]._trigger("out", null, this._uiHash(this));
3932 85ad3d82 Assos Assos
                                        this.containers[i].containerCache.over = 0;
3933
                                }
3934
                        }
3935
3936
                }
3937
3938
                if (this.placeholder) {
3939
                        //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
3940 503b3f7b Assos Assos
                        if(this.placeholder[0].parentNode) {
3941
                                this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
3942
                        }
3943
                        if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
3944
                                this.helper.remove();
3945
                        }
3946 85ad3d82 Assos Assos
3947
                        $.extend(this, {
3948
                                helper: null,
3949
                                dragging: false,
3950
                                reverting: false,
3951
                                _noFinalSort: null
3952
                        });
3953
3954
                        if(this.domPosition.prev) {
3955
                                $(this.domPosition.prev).after(this.currentItem);
3956
                        } else {
3957
                                $(this.domPosition.parent).prepend(this.currentItem);
3958
                        }
3959
                }
3960
3961
                return this;
3962
3963
        },
3964
3965
        serialize: function(o) {
3966
3967 503b3f7b Assos Assos
                var items = this._getItemsAsjQuery(o && o.connected),
3968
                        str = [];
3969
                o = o || {};
3970 85ad3d82 Assos Assos
3971
                $(items).each(function() {
3972 503b3f7b Assos Assos
                        var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
3973
                        if (res) {
3974
                                str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
3975
                        }
3976 85ad3d82 Assos Assos
                });
3977
3978
                if(!str.length && o.key) {
3979 503b3f7b Assos Assos
                        str.push(o.key + "=");
3980 85ad3d82 Assos Assos
                }
3981
3982 503b3f7b Assos Assos
                return str.join("&");
3983 85ad3d82 Assos Assos
3984
        },
3985
3986
        toArray: function(o) {
3987
3988 503b3f7b Assos Assos
                var items = this._getItemsAsjQuery(o && o.connected),
3989
                        ret = [];
3990
3991
                o = o || {};
3992 85ad3d82 Assos Assos
3993 503b3f7b Assos Assos
                items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
3994 85ad3d82 Assos Assos
                return ret;
3995
3996
        },
3997
3998
        /* Be careful with the following core functions */
3999
        _intersectsWith: function(item) {
4000
4001
                var x1 = this.positionAbs.left,
4002
                        x2 = x1 + this.helperProportions.width,
4003
                        y1 = this.positionAbs.top,
4004 503b3f7b Assos Assos
                        y2 = y1 + this.helperProportions.height,
4005
                        l = item.left,
4006 85ad3d82 Assos Assos
                        r = l + item.width,
4007
                        t = item.top,
4008 503b3f7b Assos Assos
                        b = t + item.height,
4009
                        dyClick = this.offset.click.top,
4010
                        dxClick = this.offset.click.left,
4011
                        isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
4012
4013
                if ( this.options.tolerance === "pointer" ||
4014
                        this.options.forcePointerForContainers ||
4015
                        (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
4016 85ad3d82 Assos Assos
                ) {
4017
                        return isOverElement;
4018
                } else {
4019
4020 503b3f7b Assos Assos
                        return (l < x1 + (this.helperProportions.width / 2) && // Right Half
4021
                                x2 - (this.helperProportions.width / 2) < r && // Left Half
4022
                                t < y1 + (this.helperProportions.height / 2) && // Bottom Half
4023
                                y2 - (this.helperProportions.height / 2) < b ); // Top Half
4024 85ad3d82 Assos Assos
4025
                }
4026
        },
4027
4028
        _intersectsWithPointer: function(item) {
4029
4030 503b3f7b Assos Assos
                var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
4031
                        isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
4032 85ad3d82 Assos Assos
                        isOverElement = isOverElementHeight && isOverElementWidth,
4033
                        verticalDirection = this._getDragVerticalDirection(),
4034
                        horizontalDirection = this._getDragHorizontalDirection();
4035
4036 503b3f7b Assos Assos
                if (!isOverElement) {
4037 85ad3d82 Assos Assos
                        return false;
4038 503b3f7b Assos Assos
                }
4039 85ad3d82 Assos Assos
4040
                return this.floating ?
4041 503b3f7b Assos Assos
                        ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
4042
                        : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
4043 85ad3d82 Assos Assos
4044
        },
4045
4046
        _intersectsWithSides: function(item) {
4047
4048 503b3f7b Assos Assos
                var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
4049
                        isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
4050 85ad3d82 Assos Assos
                        verticalDirection = this._getDragVerticalDirection(),
4051
                        horizontalDirection = this._getDragHorizontalDirection();
4052
4053
                if (this.floating && horizontalDirection) {
4054 503b3f7b Assos Assos
                        return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
4055 85ad3d82 Assos Assos
                } else {
4056 503b3f7b Assos Assos
                        return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
4057 85ad3d82 Assos Assos
                }
4058
4059
        },
4060
4061
        _getDragVerticalDirection: function() {
4062
                var delta = this.positionAbs.top - this.lastPositionAbs.top;
4063 503b3f7b Assos Assos
                return delta !== 0 && (delta > 0 ? "down" : "up");
4064 85ad3d82 Assos Assos
        },
4065
4066
        _getDragHorizontalDirection: function() {
4067
                var delta = this.positionAbs.left - this.lastPositionAbs.left;
4068 503b3f7b Assos Assos
                return delta !== 0 && (delta > 0 ? "right" : "left");
4069 85ad3d82 Assos Assos
        },
4070
4071
        refresh: function(event) {
4072
                this._refreshItems(event);
4073
                this.refreshPositions();
4074
                return this;
4075
        },
4076
4077
        _connectWith: function() {
4078
                var options = this.options;
4079 503b3f7b Assos Assos
                return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
4080 85ad3d82 Assos Assos
        },
4081 503b3f7b Assos Assos
4082 85ad3d82 Assos Assos
        _getItemsAsjQuery: function(connected) {
4083
4084 503b3f7b Assos Assos
                var i, j, cur, inst,
4085
                        items = [],
4086
                        queries = [],
4087
                        connectWith = this._connectWith();
4088 85ad3d82 Assos Assos
4089
                if(connectWith && connected) {
4090 503b3f7b Assos Assos
                        for (i = connectWith.length - 1; i >= 0; i--){
4091
                                cur = $(connectWith[i]);
4092
                                for ( j = cur.length - 1; j >= 0; j--){
4093
                                        inst = $.data(cur[j], this.widgetFullName);
4094
                                        if(inst && inst !== this && !inst.options.disabled) {
4095
                                                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]);
4096 85ad3d82 Assos Assos
                                        }
4097 503b3f7b Assos Assos
                                }
4098
                        }
4099 85ad3d82 Assos Assos
                }
4100
4101 503b3f7b Assos Assos
                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]);
4102 85ad3d82 Assos Assos
4103 503b3f7b Assos Assos
                for (i = queries.length - 1; i >= 0; i--){
4104 85ad3d82 Assos Assos
                        queries[i][0].each(function() {
4105
                                items.push(this);
4106
                        });
4107 503b3f7b Assos Assos
                }
4108 85ad3d82 Assos Assos
4109
                return $(items);
4110
4111
        },
4112
4113
        _removeCurrentsFromItems: function() {
4114
4115 503b3f7b Assos Assos
                var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
4116 85ad3d82 Assos Assos
4117 503b3f7b Assos Assos
                this.items = $.grep(this.items, function (item) {
4118 85ad3d82 Assos Assos
                        for (var j=0; j < list.length; j++) {
4119 503b3f7b Assos Assos
                                if(list[j] === item.item[0]) {
4120
                                        return false;
4121
                                }
4122
                        }
4123
                        return true;
4124
                });
4125 85ad3d82 Assos Assos
4126
        },
4127
4128
        _refreshItems: function(event) {
4129
4130
                this.items = [];
4131
                this.containers = [this];
4132 503b3f7b Assos Assos
4133
                var i, j, cur, inst, targetData, _queries, item, queriesLength,
4134
                        items = this.items,
4135
                        queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
4136
                        connectWith = this._connectWith();
4137
4138
                if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
4139
                        for (i = connectWith.length - 1; i >= 0; i--){
4140
                                cur = $(connectWith[i]);
4141
                                for (j = cur.length - 1; j >= 0; j--){
4142
                                        inst = $.data(cur[j], this.widgetFullName);
4143
                                        if(inst && inst !== this && !inst.options.disabled) {
4144 85ad3d82 Assos Assos
                                                queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
4145
                                                this.containers.push(inst);
4146
                                        }
4147 503b3f7b Assos Assos
                                }
4148
                        }
4149 85ad3d82 Assos Assos
                }
4150
4151 503b3f7b Assos Assos
                for (i = queries.length - 1; i >= 0; i--) {
4152
                        targetData = queries[i][1];
4153
                        _queries = queries[i][0];
4154 85ad3d82 Assos Assos
4155 503b3f7b Assos Assos
                        for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
4156
                                item = $(_queries[j]);
4157 85ad3d82 Assos Assos
4158 503b3f7b Assos Assos
                                item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
4159 85ad3d82 Assos Assos
4160
                                items.push({
4161
                                        item: item,
4162
                                        instance: targetData,
4163
                                        width: 0, height: 0,
4164
                                        left: 0, top: 0
4165
                                });
4166 503b3f7b Assos Assos
                        }
4167
                }
4168 85ad3d82 Assos Assos
4169
        },
4170
4171
        refreshPositions: function(fast) {
4172
4173
                //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
4174
                if(this.offsetParent && this.helper) {
4175
                        this.offset.parent = this._getParentOffset();
4176
                }
4177
4178 503b3f7b Assos Assos
                var i, item, t, p;
4179
4180
                for (i = this.items.length - 1; i >= 0; i--){
4181
                        item = this.items[i];
4182
4183
                        //We ignore calculating positions of all connected containers when we're not over them
4184
                        if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
4185
                                continue;
4186
                        }
4187 85ad3d82 Assos Assos
4188 503b3f7b Assos Assos
                        t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
4189 85ad3d82 Assos Assos
4190
                        if (!fast) {
4191
                                item.width = t.outerWidth();
4192
                                item.height = t.outerHeight();
4193
                        }
4194
4195 503b3f7b Assos Assos
                        p = t.offset();
4196 85ad3d82 Assos Assos
                        item.left = p.left;
4197
                        item.top = p.top;
4198 503b3f7b Assos Assos
                }
4199 85ad3d82 Assos Assos
4200
                if(this.options.custom && this.options.custom.refreshContainers) {
4201
                        this.options.custom.refreshContainers.call(this);
4202
                } else {
4203 503b3f7b Assos Assos
                        for (i = this.containers.length - 1; i >= 0; i--){
4204
                                p = this.containers[i].element.offset();
4205 85ad3d82 Assos Assos
                                this.containers[i].containerCache.left = p.left;
4206
                                this.containers[i].containerCache.top = p.top;
4207
                                this.containers[i].containerCache.width        = this.containers[i].element.outerWidth();
4208
                                this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
4209 503b3f7b Assos Assos
                        }
4210 85ad3d82 Assos Assos
                }
4211
4212
                return this;
4213
        },
4214
4215
        _createPlaceholder: function(that) {
4216 503b3f7b Assos Assos
                that = that || this;
4217
                var className,
4218
                        o = that.options;
4219 85ad3d82 Assos Assos
4220 503b3f7b Assos Assos
                if(!o.placeholder || o.placeholder.constructor === String) {
4221
                        className = o.placeholder;
4222 85ad3d82 Assos Assos
                        o.placeholder = {
4223
                                element: function() {
4224
4225 503b3f7b Assos Assos
                                        var nodeName = that.currentItem[0].nodeName.toLowerCase(),
4226
                                                element = $( that.document[0].createElement( nodeName ) )
4227
                                                        .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
4228
                                                        .removeClass("ui-sortable-helper");
4229
4230
                                        if ( nodeName === "tr" ) {
4231
                                                // Use a high colspan to force the td to expand the full
4232
                                                // width of the table (browsers are smart enough to
4233
                                                // handle this properly)
4234
                                                element.append( "<td colspan='99'>&#160;</td>" );
4235
                                        } else if ( nodeName === "img" ) {
4236
                                                element.attr( "src", that.currentItem.attr( "src" ) );
4237
                                        }
4238 85ad3d82 Assos Assos
4239 503b3f7b Assos Assos
                                        if ( !className ) {
4240
                                                element.css( "visibility", "hidden" );
4241
                                        }
4242 85ad3d82 Assos Assos
4243 503b3f7b Assos Assos
                                        return element;
4244 85ad3d82 Assos Assos
                                },
4245
                                update: function(container, p) {
4246
4247
                                        // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
4248
                                        // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
4249 503b3f7b Assos Assos
                                        if(className && !o.forcePlaceholderSize) {
4250
                                                return;
4251
                                        }
4252 85ad3d82 Assos Assos
4253
                                        //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
4254 503b3f7b Assos Assos
                                        if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
4255
                                        if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
4256 85ad3d82 Assos Assos
                                }
4257
                        };
4258
                }
4259
4260
                //Create the placeholder
4261 503b3f7b Assos Assos
                that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
4262 85ad3d82 Assos Assos
4263
                //Append it after the actual current item
4264 503b3f7b Assos Assos
                that.currentItem.after(that.placeholder);
4265 85ad3d82 Assos Assos
4266
                //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
4267 503b3f7b Assos Assos
                o.placeholder.update(that, that.placeholder);
4268 85ad3d82 Assos Assos
4269
        },
4270
4271
        _contactContainers: function(event) {
4272 503b3f7b Assos Assos
                var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,
4273
                        innermostContainer = null,
4274
                        innermostIndex = null;
4275
4276
                // get innermost container that intersects with item
4277
                for (i = this.containers.length - 1; i >= 0; i--) {
4278
4279
                        // never consider a container that's located within the item itself
4280
                        if($.contains(this.currentItem[0], this.containers[i].element[0])) {
4281 85ad3d82 Assos Assos
                                continue;
4282 503b3f7b Assos Assos
                        }
4283 85ad3d82 Assos Assos
4284
                        if(this._intersectsWith(this.containers[i].containerCache)) {
4285
4286 503b3f7b Assos Assos
                                // if we've already found a container and it's more "inner" than this, then continue
4287
                                if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
4288 85ad3d82 Assos Assos
                                        continue;
4289 503b3f7b Assos Assos
                                }
4290 85ad3d82 Assos Assos
4291 503b3f7b Assos Assos
                                innermostContainer = this.containers[i];
4292 85ad3d82 Assos Assos
                                innermostIndex = i;
4293 503b3f7b Assos Assos
4294 85ad3d82 Assos Assos
                        } else {
4295 503b3f7b Assos Assos
                                // container doesn't intersect. trigger "out" event if necessary
4296 85ad3d82 Assos Assos
                                if(this.containers[i].containerCache.over) {
4297
                                        this.containers[i]._trigger("out", event, this._uiHash(this));
4298
                                        this.containers[i].containerCache.over = 0;
4299
                                }
4300
                        }
4301
4302
                }
4303 503b3f7b Assos Assos
4304
                // if no intersecting containers found, return
4305
                if(!innermostContainer) {
4306
                        return;
4307
                }
4308 85ad3d82 Assos Assos
4309
                // move the item into the container if it's not there already
4310
                if(this.containers.length === 1) {
4311 503b3f7b Assos Assos
                        if (!this.containers[innermostIndex].containerCache.over) {
4312
                                this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
4313
                                this.containers[innermostIndex].containerCache.over = 1;
4314
                        }
4315
                } else {
4316
4317
                        //When entering a new container, we will find the item with the least distance and append our item near it
4318
                        dist = 10000;
4319
                        itemWithLeastDistance = null;
4320
                        floating = innermostContainer.floating || isFloating(this.currentItem);
4321
                        posProperty = floating ? "left" : "top";
4322
                        sizeProperty = floating ? "width" : "height";
4323
                        base = this.positionAbs[posProperty] + this.offset.click[posProperty];
4324
                        for (j = this.items.length - 1; j >= 0; j--) {
4325
                                if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
4326
                                        continue;
4327
                                }
4328
                                if(this.items[j].item[0] === this.currentItem[0]) {
4329
                                        continue;
4330
                                }
4331
                                if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {
4332
                                        continue;
4333
                                }
4334
                                cur = this.items[j].item.offset()[posProperty];
4335
                                nearBottom = false;
4336
                                if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
4337
                                        nearBottom = true;
4338
                                        cur += this.items[j][sizeProperty];
4339
                                }
4340
4341
                                if(Math.abs(cur - base) < dist) {
4342
                                        dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
4343
                                        this.direction = nearBottom ? "up": "down";
4344
                                }
4345
                        }
4346
4347
                        //Check if dropOnEmpty is enabled
4348
                        if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
4349
                                return;
4350
                        }
4351
4352
                        if(this.currentContainer === this.containers[innermostIndex]) {
4353
                                return;
4354
                        }
4355
4356
                        itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
4357
                        this._trigger("change", event, this._uiHash());
4358
                        this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
4359
                        this.currentContainer = this.containers[innermostIndex];
4360
4361
                        //Update the placeholder
4362
                        this.options.placeholder.update(this.currentContainer, this.placeholder);
4363
4364 85ad3d82 Assos Assos
                        this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
4365
                        this.containers[innermostIndex].containerCache.over = 1;
4366 503b3f7b Assos Assos
                }
4367
4368
4369 85ad3d82 Assos Assos
        },
4370
4371
        _createHelper: function(event) {
4372
4373 503b3f7b Assos Assos
                var o = this.options,
4374
                        helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
4375 85ad3d82 Assos Assos
4376 503b3f7b Assos Assos
                //Add the helper to the DOM if that didn't happen already
4377
                if(!helper.parents("body").length) {
4378
                        $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
4379
                }
4380 85ad3d82 Assos Assos
4381 503b3f7b Assos Assos
                if(helper[0] === this.currentItem[0]) {
4382 85ad3d82 Assos Assos
                        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") };
4383 503b3f7b Assos Assos
                }
4384 85ad3d82 Assos Assos
4385 503b3f7b Assos Assos
                if(!helper[0].style.width || o.forceHelperSize) {
4386
                        helper.width(this.currentItem.width());
4387
                }
4388
                if(!helper[0].style.height || o.forceHelperSize) {
4389
                        helper.height(this.currentItem.height());
4390
                }
4391 85ad3d82 Assos Assos
4392
                return helper;
4393
4394
        },
4395
4396
        _adjustOffsetFromHelper: function(obj) {
4397 503b3f7b Assos Assos
                if (typeof obj === "string") {
4398
                        obj = obj.split(" ");
4399 85ad3d82 Assos Assos
                }
4400
                if ($.isArray(obj)) {
4401
                        obj = {left: +obj[0], top: +obj[1] || 0};
4402
                }
4403 503b3f7b Assos Assos
                if ("left" in obj) {
4404 85ad3d82 Assos Assos
                        this.offset.click.left = obj.left + this.margins.left;
4405
                }
4406 503b3f7b Assos Assos
                if ("right" in obj) {
4407 85ad3d82 Assos Assos
                        this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
4408
                }
4409 503b3f7b Assos Assos
                if ("top" in obj) {
4410 85ad3d82 Assos Assos
                        this.offset.click.top = obj.top + this.margins.top;
4411
                }
4412 503b3f7b Assos Assos
                if ("bottom" in obj) {
4413 85ad3d82 Assos Assos
                        this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
4414
                }
4415
        },
4416
4417
        _getParentOffset: function() {
4418
4419
4420
                //Get the offsetParent and cache its position
4421
                this.offsetParent = this.helper.offsetParent();
4422
                var po = this.offsetParent.offset();
4423
4424
                // This is a special case where we need to modify a offset calculated on start, since the following happened:
4425
                // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
4426
                // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
4427
                //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
4428 503b3f7b Assos Assos
                if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
4429 85ad3d82 Assos Assos
                        po.left += this.scrollParent.scrollLeft();
4430
                        po.top += this.scrollParent.scrollTop();
4431
                }
4432
4433 503b3f7b Assos Assos
                // This needs to be actually done for all browsers, since pageX/pageY includes this information
4434
                // with an ugly IE fix
4435
                if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
4436 85ad3d82 Assos Assos
                        po = { top: 0, left: 0 };
4437 503b3f7b Assos Assos
                }
4438 85ad3d82 Assos Assos
4439
                return {
4440
                        top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
4441
                        left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
4442
                };
4443
4444
        },
4445
4446
        _getRelativeOffset: function() {
4447
4448 503b3f7b Assos Assos
                if(this.cssPosition === "relative") {
4449 85ad3d82 Assos Assos
                        var p = this.currentItem.position();
4450
                        return {
4451
                                top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
4452
                                left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
4453
                        };
4454
                } else {
4455
                        return { top: 0, left: 0 };
4456
                }
4457
4458
        },
4459
4460
        _cacheMargins: function() {
4461
                this.margins = {
4462
                        left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
4463
                        top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
4464
                };
4465
        },
4466
4467
        _cacheHelperProportions: function() {
4468
                this.helperProportions = {
4469
                        width: this.helper.outerWidth(),
4470
                        height: this.helper.outerHeight()
4471
                };
4472
        },
4473
4474
        _setContainment: function() {
4475
4476 503b3f7b Assos Assos
                var ce, co, over,
4477
                        o = this.options;
4478
                if(o.containment === "parent") {
4479
                        o.containment = this.helper[0].parentNode;
4480
                }
4481
                if(o.containment === "document" || o.containment === "window") {
4482
                        this.containment = [
4483
                                0 - this.offset.relative.left - this.offset.parent.left,
4484
                                0 - this.offset.relative.top - this.offset.parent.top,
4485
                                $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,
4486
                                ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
4487
                        ];
4488
                }
4489 85ad3d82 Assos Assos
4490
                if(!(/^(document|window|parent)$/).test(o.containment)) {
4491 503b3f7b Assos Assos
                        ce = $(o.containment)[0];
4492
                        co = $(o.containment).offset();
4493
                        over = ($(ce).css("overflow") !== "hidden");
4494 85ad3d82 Assos Assos
4495
                        this.containment = [
4496
                                co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
4497
                                co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
4498
                                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,
4499
                                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
4500
                        ];
4501
                }
4502
4503
        },
4504
4505
        _convertPositionTo: function(d, pos) {
4506
4507 503b3f7b Assos Assos
                if(!pos) {
4508
                        pos = this.position;
4509
                }
4510
                var mod = d === "absolute" ? 1 : -1,
4511
                        scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
4512
                        scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
4513 85ad3d82 Assos Assos
4514
                return {
4515
                        top: (
4516 503b3f7b Assos Assos
                                pos.top        +                                                                                                                                // The absolute mouse position
4517
                                this.offset.relative.top * mod +                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
4518
                                this.offset.parent.top * mod -                                                                                        // The offsetParent's offset without borders (offset + border)
4519
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
4520 85ad3d82 Assos Assos
                        ),
4521
                        left: (
4522 503b3f7b Assos Assos
                                pos.left +                                                                                                                                // The absolute mouse position
4523
                                this.offset.relative.left * mod +                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
4524
                                this.offset.parent.left * mod        -                                                                                // The offsetParent's offset without borders (offset + border)
4525
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
4526 85ad3d82 Assos Assos
                        )
4527
                };
4528
4529
        },
4530
4531
        _generatePosition: function(event) {
4532
4533 503b3f7b Assos Assos
                var top, left,
4534
                        o = this.options,
4535
                        pageX = event.pageX,
4536
                        pageY = event.pageY,
4537
                        scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
4538 85ad3d82 Assos Assos
4539
                // This is another very weird special case that only happens for relative elements:
4540
                // 1. If the css position is relative
4541
                // 2. and the scroll parent is the document or similar to the offset parent
4542
                // we have to refresh the relative offset during the scroll so there are no jumps
4543 503b3f7b Assos Assos
                if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {
4544 85ad3d82 Assos Assos
                        this.offset.relative = this._getRelativeOffset();
4545
                }
4546
4547
                /*
4548
                 * - Position constraining -
4549
                 * Constrain the position to a mix of grid, containment.
4550
                 */
4551
4552
                if(this.originalPosition) { //If we are not dragging yet, we won't check for options
4553
4554
                        if(this.containment) {
4555 503b3f7b Assos Assos
                                if(event.pageX - this.offset.click.left < this.containment[0]) {
4556
                                        pageX = this.containment[0] + this.offset.click.left;
4557
                                }
4558
                                if(event.pageY - this.offset.click.top < this.containment[1]) {
4559
                                        pageY = this.containment[1] + this.offset.click.top;
4560
                                }
4561
                                if(event.pageX - this.offset.click.left > this.containment[2]) {
4562
                                        pageX = this.containment[2] + this.offset.click.left;
4563
                                }
4564
                                if(event.pageY - this.offset.click.top > this.containment[3]) {
4565
                                        pageY = this.containment[3] + this.offset.click.top;
4566
                                }
4567 85ad3d82 Assos Assos
                        }
4568
4569
                        if(o.grid) {
4570 503b3f7b Assos Assos
                                top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
4571
                                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;
4572 85ad3d82 Assos Assos
4573 503b3f7b Assos Assos
                                left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
4574
                                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;
4575 85ad3d82 Assos Assos
                        }
4576
4577
                }
4578
4579
                return {
4580
                        top: (
4581 503b3f7b Assos Assos
                                pageY -                                                                                                                                // The absolute mouse position
4582
                                this.offset.click.top -                                                                                                        // Click offset (relative to the element)
4583
                                this.offset.relative.top        -                                                                                        // Only for relative positioned nodes: Relative offset from element to offset parent
4584
                                this.offset.parent.top +                                                                                                // The offsetParent's offset without borders (offset + border)
4585
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
4586 85ad3d82 Assos Assos
                        ),
4587
                        left: (
4588 503b3f7b Assos Assos
                                pageX -                                                                                                                                // The absolute mouse position
4589
                                this.offset.click.left -                                                                                                // Click offset (relative to the element)
4590
                                this.offset.relative.left        -                                                                                        // Only for relative positioned nodes: Relative offset from element to offset parent
4591
                                this.offset.parent.left +                                                                                                // The offsetParent's offset without borders (offset + border)
4592
                                ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
4593 85ad3d82 Assos Assos
                        )
4594
                };
4595
4596
        },
4597
4598
        _rearrange: function(event, i, a, hardRefresh) {
4599
4600 503b3f7b Assos Assos
                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));
4601 85ad3d82 Assos Assos
4602
                //Various things done here to improve the performance:
4603
                // 1. we create a setTimeout, that calls refreshPositions
4604
                // 2. on the instance, we have a counter variable, that get's higher after every append
4605
                // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
4606
                // 4. this lets only the last addition to the timeout stack through
4607
                this.counter = this.counter ? ++this.counter : 1;
4608 503b3f7b Assos Assos
                var counter = this.counter;
4609 85ad3d82 Assos Assos
4610 503b3f7b Assos Assos
                this._delay(function() {
4611
                        if(counter === this.counter) {
4612
                                this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
4613
                        }
4614
                });
4615 85ad3d82 Assos Assos
4616
        },
4617
4618
        _clear: function(event, noPropagation) {
4619
4620
                this.reverting = false;
4621
                // We delay all events that have to be triggered to after the point where the placeholder has been removed and
4622
                // everything else normalized again
4623 503b3f7b Assos Assos
                var i,
4624
                        delayedTriggers = [];
4625 85ad3d82 Assos Assos
4626
                // We first have to update the dom position of the actual currentItem
4627
                // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
4628 503b3f7b Assos Assos
                if(!this._noFinalSort && this.currentItem.parent().length) {
4629
                        this.placeholder.before(this.currentItem);
4630
                }
4631 85ad3d82 Assos Assos
                this._noFinalSort = null;
4632
4633 503b3f7b Assos Assos
                if(this.helper[0] === this.currentItem[0]) {
4634
                        for(i in this._storedCSS) {
4635
                                if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
4636
                                        this._storedCSS[i] = "";
4637
                                }
4638 85ad3d82 Assos Assos
                        }
4639
                        this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
4640
                } else {
4641
                        this.currentItem.show();
4642
                }
4643
4644 503b3f7b Assos Assos
                if(this.fromOutside && !noPropagation) {
4645
                        delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
4646
                }
4647
                if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
4648
                        delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
4649
                }
4650
4651
                // Check if the items Container has Changed and trigger appropriate
4652
                // events.
4653
                if (this !== this.currentContainer) {
4654
                        if(!noPropagation) {
4655
                                delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
4656
                                delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
4657
                                delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
4658
                        }
4659
                }
4660
4661 85ad3d82 Assos Assos
4662
                //Post events to containers
4663 503b3f7b Assos Assos
                for (i = this.containers.length - 1; i >= 0; i--){
4664
                        if(!noPropagation) {
4665
                                delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
4666
                        }
4667 85ad3d82 Assos Assos
                        if(this.containers[i].containerCache.over) {
4668
                                delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
4669
                                this.containers[i].containerCache.over = 0;
4670
                        }
4671
                }
4672
4673
                //Do what was originally in plugins
4674 503b3f7b Assos Assos
                if ( this.storedCursor ) {
4675
                        this.document.find( "body" ).css( "cursor", this.storedCursor );
4676
                        this.storedStylesheet.remove();
4677
                }
4678
                if(this._storedOpacity) {
4679
                        this.helper.css("opacity", this._storedOpacity);
4680
                }
4681
                if(this._storedZIndex) {
4682
                        this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
4683
                }
4684 85ad3d82 Assos Assos
4685
                this.dragging = false;
4686
                if(this.cancelHelperRemoval) {
4687
                        if(!noPropagation) {
4688
                                this._trigger("beforeStop", event, this._uiHash());
4689 503b3f7b Assos Assos
                                for (i=0; i < delayedTriggers.length; i++) {
4690
                                        delayedTriggers[i].call(this, event);
4691
                                } //Trigger all delayed events
4692 85ad3d82 Assos Assos
                                this._trigger("stop", event, this._uiHash());
4693
                        }
4694 503b3f7b Assos Assos
4695
                        this.fromOutside = false;
4696 85ad3d82 Assos Assos
                        return false;
4697
                }
4698
4699 503b3f7b Assos Assos
                if(!noPropagation) {
4700
                        this._trigger("beforeStop", event, this._uiHash());
4701
                }
4702 85ad3d82 Assos Assos
4703
                //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
4704
                this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
4705
4706 503b3f7b Assos Assos
                if(this.helper[0] !== this.currentItem[0]) {
4707
                        this.helper.remove();
4708
                }
4709
                this.helper = null;
4710 85ad3d82 Assos Assos
4711
                if(!noPropagation) {
4712 503b3f7b Assos Assos
                        for (i=0; i < delayedTriggers.length; i++) {
4713
                                delayedTriggers[i].call(this, event);
4714
                        } //Trigger all delayed events
4715 85ad3d82 Assos Assos
                        this._trigger("stop", event, this._uiHash());
4716
                }
4717
4718
                this.fromOutside = false;
4719
                return true;
4720
4721
        },
4722
4723
        _trigger: function() {
4724
                if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
4725
                        this.cancel();
4726
                }
4727
        },
4728
4729 503b3f7b Assos Assos
        _uiHash: function(_inst) {
4730
                var inst = _inst || this;
4731 85ad3d82 Assos Assos
                return {
4732 503b3f7b Assos Assos
                        helper: inst.helper,
4733
                        placeholder: inst.placeholder || $([]),
4734
                        position: inst.position,
4735
                        originalPosition: inst.originalPosition,
4736
                        offset: inst.positionAbs,
4737
                        item: inst.currentItem,
4738
                        sender: _inst ? _inst.element : null
4739 85ad3d82 Assos Assos
                };
4740
        }
4741
4742
});
4743
4744
})(jQuery);
4745 503b3f7b Assos Assos
4746
(function($, undefined) {
4747
4748
var dataSpace = "ui-effects-";
4749
4750
$.effects = {
4751
        effect: {}
4752
};
4753
4754
/*!
4755
 * jQuery Color Animations v2.1.2
4756
 * https://github.com/jquery/jquery-color
4757 85ad3d82 Assos Assos
 *
4758 503b3f7b Assos Assos
 * Copyright 2013 jQuery Foundation and other contributors
4759
 * Released under the MIT license.
4760 85ad3d82 Assos Assos
 * http://jquery.org/license
4761
 *
4762 503b3f7b Assos Assos
 * Date: Wed Jan 16 08:47:09 2013 -0600
4763 85ad3d82 Assos Assos
 */
4764 503b3f7b Assos Assos
(function( jQuery, undefined ) {
4765
4766
        var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
4767
4768
        // plusequals test for += 100 -= 100
4769
        rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
4770
        // a set of RE's that can match strings and generate color tuples.
4771
        stringParsers = [{
4772
                        re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
4773
                        parse: function( execResult ) {
4774
                                return [
4775
                                        execResult[ 1 ],
4776
                                        execResult[ 2 ],
4777
                                        execResult[ 3 ],
4778
                                        execResult[ 4 ]
4779
                                ];
4780
                        }
4781
                }, {
4782
                        re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
4783
                        parse: function( execResult ) {
4784
                                return [
4785
                                        execResult[ 1 ] * 2.55,
4786
                                        execResult[ 2 ] * 2.55,
4787
                                        execResult[ 3 ] * 2.55,
4788
                                        execResult[ 4 ]
4789
                                ];
4790
                        }
4791
                }, {
4792
                        // this regex ignores A-F because it's compared against an already lowercased string
4793
                        re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
4794
                        parse: function( execResult ) {
4795
                                return [
4796
                                        parseInt( execResult[ 1 ], 16 ),
4797
                                        parseInt( execResult[ 2 ], 16 ),
4798
                                        parseInt( execResult[ 3 ], 16 )
4799
                                ];
4800
                        }
4801
                }, {
4802
                        // this regex ignores A-F because it's compared against an already lowercased string
4803
                        re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
4804
                        parse: function( execResult ) {
4805
                                return [
4806
                                        parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
4807
                                        parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
4808
                                        parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
4809
                                ];
4810
                        }
4811
                }, {
4812
                        re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
4813
                        space: "hsla",
4814
                        parse: function( execResult ) {
4815
                                return [
4816
                                        execResult[ 1 ],
4817
                                        execResult[ 2 ] / 100,
4818
                                        execResult[ 3 ] / 100,
4819
                                        execResult[ 4 ]
4820
                                ];
4821
                        }
4822
                }],
4823
4824
        // jQuery.Color( )
4825
        color = jQuery.Color = function( color, green, blue, alpha ) {
4826
                return new jQuery.Color.fn.parse( color, green, blue, alpha );
4827
        },
4828
        spaces = {
4829
                rgba: {
4830
                        props: {
4831
                                red: {
4832
                                        idx: 0,
4833
                                        type: "byte"
4834
                                },
4835
                                green: {
4836
                                        idx: 1,
4837
                                        type: "byte"
4838
                                },
4839
                                blue: {
4840
                                        idx: 2,
4841
                                        type: "byte"
4842
                                }
4843
                        }
4844
                },
4845
4846
                hsla: {
4847
                        props: {
4848
                                hue: {
4849
                                        idx: 0,
4850
                                        type: "degrees"
4851
                                },
4852
                                saturation: {
4853
                                        idx: 1,
4854
                                        type: "percent"
4855
                                },
4856
                                lightness: {
4857
                                        idx: 2,
4858
                                        type: "percent"
4859
                                }
4860
                        }
4861
                }
4862
        },
4863
        propTypes = {
4864
                "byte": {
4865
                        floor: true,
4866
                        max: 255
4867
                },
4868
                "percent": {
4869
                        max: 1
4870
                },
4871
                "degrees": {
4872
                        mod: 360,
4873
                        floor: true
4874
                }
4875
        },
4876
        support = color.support = {},
4877 85ad3d82 Assos Assos
4878 503b3f7b Assos Assos
        // element for support tests
4879
        supportElem = jQuery( "<p>" )[ 0 ],
4880 85ad3d82 Assos Assos
4881 503b3f7b Assos Assos
        // colors = jQuery.Color.names
4882
        colors,
4883 85ad3d82 Assos Assos
4884 503b3f7b Assos Assos
        // local aliases of functions called often
4885
        each = jQuery.each;
4886 85ad3d82 Assos Assos
4887 503b3f7b Assos Assos
// determine rgba support immediately
4888
supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
4889
support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
4890 85ad3d82 Assos Assos
4891 503b3f7b Assos Assos
// define cache name and alpha properties
4892
// for rgba and hsla spaces
4893
each( spaces, function( spaceName, space ) {
4894
        space.cache = "_" + spaceName;
4895
        space.props.alpha = {
4896
                idx: 3,
4897
                type: "percent",
4898
                def: 1
4899 85ad3d82 Assos Assos
        };
4900
});
4901
4902 503b3f7b Assos Assos
function clamp( value, prop, allowEmpty ) {
4903
        var type = propTypes[ prop.type ] || {};
4904 85ad3d82 Assos Assos
4905 503b3f7b Assos Assos
        if ( value == null ) {
4906
                return (allowEmpty || !prop.def) ? null : prop.def;
4907
        }
4908 85ad3d82 Assos Assos
4909 503b3f7b Assos Assos
        // ~~ is an short way of doing floor for positive numbers
4910
        value = type.floor ? ~~value : parseFloat( value );
4911 85ad3d82 Assos Assos
4912 503b3f7b Assos Assos
        // IE will pass in empty strings as value for alpha,
4913
        // which will hit this case
4914
        if ( isNaN( value ) ) {
4915
                return prop.def;
4916
        }
4917 85ad3d82 Assos Assos
4918 503b3f7b Assos Assos
        if ( type.mod ) {
4919
                // we add mod before modding to make sure that negatives values
4920
                // get converted properly: -10 -> 350
4921
                return (value + type.mod) % type.mod;
4922
        }
4923 85ad3d82 Assos Assos
4924 503b3f7b Assos Assos
        // for now all property types without mod have min and max
4925
        return 0 > value ? 0 : type.max < value ? type.max : value;
4926 85ad3d82 Assos Assos
}
4927
4928 503b3f7b Assos Assos
function stringParse( string ) {
4929
        var inst = color(),
4930
                rgba = inst._rgba = [];
4931 85ad3d82 Assos Assos
4932 503b3f7b Assos Assos
        string = string.toLowerCase();
4933 85ad3d82 Assos Assos
4934 503b3f7b Assos Assos
        each( stringParsers, function( i, parser ) {
4935
                var parsed,
4936
                        match = parser.re.exec( string ),
4937
                        values = match && parser.parse( match ),
4938
                        spaceName = parser.space || "rgba";
4939 85ad3d82 Assos Assos
4940 503b3f7b Assos Assos
                if ( values ) {
4941
                        parsed = inst[ spaceName ]( values );
4942 85ad3d82 Assos Assos
4943 503b3f7b Assos Assos
                        // if this was an rgba parse the assignment might happen twice
4944
                        // oh well....
4945
                        inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
4946
                        rgba = inst._rgba = parsed._rgba;
4947 85ad3d82 Assos Assos
4948 503b3f7b Assos Assos
                        // exit each( stringParsers ) here because we matched
4949
                        return false;
4950
                }
4951
        });
4952 85ad3d82 Assos Assos
4953 503b3f7b Assos Assos
        // Found a stringParser that handled it
4954
        if ( rgba.length ) {
4955 85ad3d82 Assos Assos
4956 503b3f7b Assos Assos
                // if this came from a parsed string, force "transparent" when alpha is 0
4957
                // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
4958
                if ( rgba.join() === "0,0,0,0" ) {
4959
                        jQuery.extend( rgba, colors.transparent );
4960
                }
4961
                return inst;
4962
        }
4963 85ad3d82 Assos Assos
4964 503b3f7b Assos Assos
        // named colors
4965
        return colors[ string ];
4966
}
4967 85ad3d82 Assos Assos
4968 503b3f7b Assos Assos
color.fn = jQuery.extend( color.prototype, {
4969
        parse: function( red, green, blue, alpha ) {
4970
                if ( red === undefined ) {
4971
                        this._rgba = [ null, null, null, null ];
4972
                        return this;
4973 85ad3d82 Assos Assos
                }
4974 503b3f7b Assos Assos
                if ( red.jquery || red.nodeType ) {
4975
                        red = jQuery( red ).css( green );
4976
                        green = undefined;
4977 85ad3d82 Assos Assos
                }
4978
4979 503b3f7b Assos Assos
                var inst = this,
4980
                        type = jQuery.type( red ),
4981
                        rgba = this._rgba = [];
4982
4983
                // more than 1 argument specified - assume ( red, green, blue, alpha )
4984
                if ( green !== undefined ) {
4985
                        red = [ red, green, blue, alpha ];
4986
                        type = "array";
4987 85ad3d82 Assos Assos
                }
4988
4989 503b3f7b Assos Assos
                if ( type === "string" ) {
4990
                        return this.parse( stringParse( red ) || colors._default );
4991
                }
4992 85ad3d82 Assos Assos
4993 503b3f7b Assos Assos
                if ( type === "array" ) {
4994
                        each( spaces.rgba.props, function( key, prop ) {
4995
                                rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
4996
                        });
4997
                        return this;
4998 85ad3d82 Assos Assos
                }
4999
5000 503b3f7b Assos Assos
                if ( type === "object" ) {
5001
                        if ( red instanceof color ) {
5002
                                each( spaces, function( spaceName, space ) {
5003
                                        if ( red[ space.cache ] ) {
5004
                                                inst[ space.cache ] = red[ space.cache ].slice();
5005
                                        }
5006
                                });
5007
                        } else {
5008
                                each( spaces, function( spaceName, space ) {
5009
                                        var cache = space.cache;
5010
                                        each( space.props, function( key, prop ) {
5011 85ad3d82 Assos Assos
5012 503b3f7b Assos Assos
                                                // if the cache doesn't exist, and we know how to convert
5013
                                                if ( !inst[ cache ] && space.to ) {
5014
5015
                                                        // if the value was null, we don't need to copy it
5016
                                                        // if the key was alpha, we don't need to copy it either
5017
                                                        if ( key === "alpha" || red[ key ] == null ) {
5018
                                                                return;
5019
                                                        }
5020
                                                        inst[ cache ] = space.to( inst._rgba );
5021
                                                }
5022 85ad3d82 Assos Assos
5023 503b3f7b Assos Assos
                                                // this is the only case where we allow nulls for ALL properties.
5024
                                                // call clamp with alwaysAllowEmpty
5025
                                                inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
5026
                                        });
5027 85ad3d82 Assos Assos
5028 503b3f7b Assos Assos
                                        // everything defined but alpha?
5029
                                        if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
5030
                                                // use the default of 1
5031
                                                inst[ cache ][ 3 ] = 1;
5032
                                                if ( space.from ) {
5033
                                                        inst._rgba = space.from( inst[ cache ] );
5034
                                                }
5035
                                        }
5036
                                });
5037 85ad3d82 Assos Assos
                        }
5038 503b3f7b Assos Assos
                        return this;
5039
                }
5040
        },
5041
        is: function( compare ) {
5042
                var is = color( compare ),
5043
                        same = true,
5044
                        inst = this;
5045 85ad3d82 Assos Assos
5046 503b3f7b Assos Assos
                each( spaces, function( _, space ) {
5047
                        var localCache,
5048
                                isCache = is[ space.cache ];
5049
                        if (isCache) {
5050
                                localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
5051
                                each( space.props, function( _, prop ) {
5052
                                        if ( isCache[ prop.idx ] != null ) {
5053
                                                same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
5054
                                                return same;
5055
                                        }
5056
                                });
5057
                        }
5058
                        return same;
5059
                });
5060
                return same;
5061
        },
5062
        _space: function() {
5063
                var used = [],
5064
                        inst = this;
5065
                each( spaces, function( spaceName, space ) {
5066
                        if ( inst[ space.cache ] ) {
5067
                                used.push( spaceName );
5068
                        }
5069
                });
5070
                return used.pop();
5071
        },
5072
        transition: function( other, distance ) {
5073
                var end = color( other ),
5074
                        spaceName = end._space(),
5075
                        space = spaces[ spaceName ],
5076
                        startColor = this.alpha() === 0 ? color( "transparent" ) : this,
5077
                        start = startColor[ space.cache ] || space.to( startColor._rgba ),
5078
                        result = start.slice();
5079
5080
                end = end[ space.cache ];
5081
                each( space.props, function( key, prop ) {
5082
                        var index = prop.idx,
5083
                                startValue = start[ index ],
5084
                                endValue = end[ index ],
5085
                                type = propTypes[ prop.type ] || {};
5086
5087
                        // if null, don't override start value
5088
                        if ( endValue === null ) {
5089
                                return;
5090
                        }
5091
                        // if null - use end
5092
                        if ( startValue === null ) {
5093
                                result[ index ] = endValue;
5094 85ad3d82 Assos Assos
                        } else {
5095 503b3f7b Assos Assos
                                if ( type.mod ) {
5096
                                        if ( endValue - startValue > type.mod / 2 ) {
5097
                                                startValue += type.mod;
5098
                                        } else if ( startValue - endValue > type.mod / 2 ) {
5099
                                                startValue -= type.mod;
5100
                                        }
5101
                                }
5102
                                result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
5103 85ad3d82 Assos Assos
                        }
5104
                });
5105 503b3f7b Assos Assos
                return this[ spaceName ]( result );
5106
        },
5107
        blend: function( opaque ) {
5108
                // if we are already opaque - return ourself
5109
                if ( this._rgba[ 3 ] === 1 ) {
5110
                        return this;
5111
                }
5112 85ad3d82 Assos Assos
5113 503b3f7b Assos Assos
                var rgb = this._rgba.slice(),
5114
                        a = rgb.pop(),
5115
                        blend = color( opaque )._rgba;
5116 85ad3d82 Assos Assos
5117 503b3f7b Assos Assos
                return color( jQuery.map( rgb, function( v, i ) {
5118
                        return ( 1 - a ) * blend[ i ] + a * v;
5119
                }));
5120 85ad3d82 Assos Assos
        },
5121 503b3f7b Assos Assos
        toRgbaString: function() {
5122
                var prefix = "rgba(",
5123
                        rgba = jQuery.map( this._rgba, function( v, i ) {
5124
                                return v == null ? ( i > 2 ? 1 : 0 ) : v;
5125
                        });
5126
5127
                if ( rgba[ 3 ] === 1 ) {
5128
                        rgba.pop();
5129
                        prefix = "rgb(";
5130
                }
5131 85ad3d82 Assos Assos
5132 503b3f7b Assos Assos
                return prefix + rgba.join() + ")";
5133 85ad3d82 Assos Assos
        },
5134 503b3f7b Assos Assos
        toHslaString: function() {
5135
                var prefix = "hsla(",
5136
                        hsla = jQuery.map( this.hsla(), function( v, i ) {
5137
                                if ( v == null ) {
5138
                                        v = i > 2 ? 1 : 0;
5139
                                }
5140 85ad3d82 Assos Assos
5141 503b3f7b Assos Assos
                                // catch 1 and 2
5142
                                if ( i && i < 3 ) {
5143
                                        v = Math.round( v * 100 ) + "%";
5144
                                }
5145
                                return v;
5146
                        });
5147
5148
                if ( hsla[ 3 ] === 1 ) {
5149
                        hsla.pop();
5150
                        prefix = "hsl(";
5151
                }
5152
                return prefix + hsla.join() + ")";
5153
        },
5154
        toHexString: function( includeAlpha ) {
5155
                var rgba = this._rgba.slice(),
5156
                        alpha = rgba.pop();
5157
5158
                if ( includeAlpha ) {
5159
                        rgba.push( ~~( alpha * 255 ) );
5160
                }
5161
5162
                return "#" + jQuery.map( rgba, function( v ) {
5163
5164
                        // default to 0 when nulls exist
5165
                        v = ( v || 0 ).toString( 16 );
5166
                        return v.length === 1 ? "0" + v : v;
5167
                }).join("");
5168
        },
5169
        toString: function() {
5170
                return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
5171
        }
5172
});
5173
color.fn.parse.prototype = color.fn;
5174
5175
// hsla conversions adapted from:
5176
// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
5177
5178
function hue2rgb( p, q, h ) {
5179
        h = ( h + 1 ) % 1;
5180
        if ( h * 6 < 1 ) {
5181
                return p + (q - p) * h * 6;
5182
        }
5183
        if ( h * 2 < 1) {
5184
                return q;
5185
        }
5186
        if ( h * 3 < 2 ) {
5187
                return p + (q - p) * ((2/3) - h) * 6;
5188
        }
5189
        return p;
5190
}
5191
5192
spaces.hsla.to = function ( rgba ) {
5193
        if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
5194
                return [ null, null, null, rgba[ 3 ] ];
5195
        }
5196
        var r = rgba[ 0 ] / 255,
5197
                g = rgba[ 1 ] / 255,
5198
                b = rgba[ 2 ] / 255,
5199
                a = rgba[ 3 ],
5200
                max = Math.max( r, g, b ),
5201
                min = Math.min( r, g, b ),
5202
                diff = max - min,
5203
                add = max + min,
5204
                l = add * 0.5,
5205
                h, s;
5206
5207
        if ( min === max ) {
5208
                h = 0;
5209
        } else if ( r === max ) {
5210
                h = ( 60 * ( g - b ) / diff ) + 360;
5211
        } else if ( g === max ) {
5212
                h = ( 60 * ( b - r ) / diff ) + 120;
5213
        } else {
5214
                h = ( 60 * ( r - g ) / diff ) + 240;
5215
        }
5216
5217
        // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
5218
        // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
5219
        if ( diff === 0 ) {
5220
                s = 0;
5221
        } else if ( l <= 0.5 ) {
5222
                s = diff / add;
5223
        } else {
5224
                s = diff / ( 2 - add );
5225
        }
5226
        return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
5227
};
5228
5229
spaces.hsla.from = function ( hsla ) {
5230
        if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
5231
                return [ null, null, null, hsla[ 3 ] ];
5232
        }
5233
        var h = hsla[ 0 ] / 360,
5234
                s = hsla[ 1 ],
5235
                l = hsla[ 2 ],
5236
                a = hsla[ 3 ],
5237
                q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
5238
                p = 2 * l - q;
5239
5240
        return [
5241
                Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
5242
                Math.round( hue2rgb( p, q, h ) * 255 ),
5243
                Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
5244
                a
5245
        ];
5246
};
5247
5248
5249
each( spaces, function( spaceName, space ) {
5250
        var props = space.props,
5251
                cache = space.cache,
5252
                to = space.to,
5253
                from = space.from;
5254
5255
        // makes rgba() and hsla()
5256
        color.fn[ spaceName ] = function( value ) {
5257
5258
                // generate a cache for this space if it doesn't exist
5259
                if ( to && !this[ cache ] ) {
5260
                        this[ cache ] = to( this._rgba );
5261
                }
5262
                if ( value === undefined ) {
5263
                        return this[ cache ].slice();
5264
                }
5265
5266
                var ret,
5267
                        type = jQuery.type( value ),
5268
                        arr = ( type === "array" || type === "object" ) ? value : arguments,
5269
                        local = this[ cache ].slice();
5270
5271
                each( props, function( key, prop ) {
5272
                        var val = arr[ type === "object" ? key : prop.idx ];
5273
                        if ( val == null ) {
5274
                                val = local[ prop.idx ];
5275 85ad3d82 Assos Assos
                        }
5276 503b3f7b Assos Assos
                        local[ prop.idx ] = clamp( val, prop );
5277
                });
5278
5279
                if ( from ) {
5280
                        ret = color( from( local ) );
5281
                        ret[ cache ] = local;
5282
                        return ret;
5283 85ad3d82 Assos Assos
                } else {
5284 503b3f7b Assos Assos
                        return color( local );
5285 85ad3d82 Assos Assos
                }
5286 503b3f7b Assos Assos
        };
5287
5288
        // makes red() green() blue() alpha() hue() saturation() lightness()
5289
        each( props, function( key, prop ) {
5290
                // alpha is included in more than one space
5291
                if ( color.fn[ key ] ) {
5292
                        return;
5293
                }
5294
                color.fn[ key ] = function( value ) {
5295
                        var vtype = jQuery.type( value ),
5296
                                fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
5297
                                local = this[ fn ](),
5298
                                cur = local[ prop.idx ],
5299
                                match;
5300
5301
                        if ( vtype === "undefined" ) {
5302
                                return cur;
5303
                        }
5304
5305
                        if ( vtype === "function" ) {
5306
                                value = value.call( this, cur );
5307
                                vtype = jQuery.type( value );
5308
                        }
5309
                        if ( value == null && prop.empty ) {
5310
                                return this;
5311
                        }
5312
                        if ( vtype === "string" ) {
5313
                                match = rplusequals.exec( value );
5314
                                if ( match ) {
5315
                                        value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
5316
                                }
5317
                        }
5318
                        local[ prop.idx ] = value;
5319
                        return this[ fn ]( local );
5320
                };
5321
        });
5322
});
5323
5324
// add cssHook and .fx.step function for each named hook.
5325
// accept a space separated string of properties
5326
color.hook = function( hook ) {
5327
        var hooks = hook.split( " " );
5328
        each( hooks, function( i, hook ) {
5329
                jQuery.cssHooks[ hook ] = {
5330
                        set: function( elem, value ) {
5331
                                var parsed, curElem,
5332
                                        backgroundColor = "";
5333
5334
                                if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
5335
                                        value = color( parsed || value );
5336
                                        if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
5337
                                                curElem = hook === "backgroundColor" ? elem.parentNode : elem;
5338
                                                while (
5339
                                                        (backgroundColor === "" || backgroundColor === "transparent") &&
5340
                                                        curElem && curElem.style
5341
                                                ) {
5342
                                                        try {
5343
                                                                backgroundColor = jQuery.css( curElem, "backgroundColor" );
5344
                                                                curElem = curElem.parentNode;
5345
                                                        } catch ( e ) {
5346
                                                        }
5347
                                                }
5348
5349
                                                value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
5350
                                                        backgroundColor :
5351
                                                        "_default" );
5352
                                        }
5353
5354
                                        value = value.toRgbaString();
5355
                                }
5356
                                try {
5357
                                        elem.style[ hook ] = value;
5358
                                } catch( e ) {
5359
                                        // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
5360
                                }
5361
                        }
5362
                };
5363
                jQuery.fx.step[ hook ] = function( fx ) {
5364
                        if ( !fx.colorInit ) {
5365
                                fx.start = color( fx.elem, hook );
5366
                                fx.end = color( fx.end );
5367
                                fx.colorInit = true;
5368
                        }
5369
                        jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
5370
                };
5371
        });
5372
5373
};
5374 85ad3d82 Assos Assos
5375 503b3f7b Assos Assos
color.hook( stepHooks );
5376
5377
jQuery.cssHooks.borderColor = {
5378
        expand: function( value ) {
5379
                var expanded = {};
5380
5381
                each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
5382
                        expanded[ "border" + part + "Color" ] = value;
5383
                });
5384
                return expanded;
5385 85ad3d82 Assos Assos
        }
5386 503b3f7b Assos Assos
};
5387
5388
// Basic color names only.
5389
// Usage of any of the other color names requires adding yourself or including
5390
// jquery.color.svg-names.js.
5391
colors = jQuery.Color.names = {
5392
        // 4.1. Basic color keywords
5393
        aqua: "#00ffff",
5394
        black: "#000000",
5395
        blue: "#0000ff",
5396
        fuchsia: "#ff00ff",
5397
        gray: "#808080",
5398
        green: "#008000",
5399
        lime: "#00ff00",
5400
        maroon: "#800000",
5401
        navy: "#000080",
5402
        olive: "#808000",
5403
        purple: "#800080",
5404
        red: "#ff0000",
5405
        silver: "#c0c0c0",
5406
        teal: "#008080",
5407
        white: "#ffffff",
5408
        yellow: "#ffff00",
5409
5410
        // 4.2.3. "transparent" color keyword
5411
        transparent: [ null, null, null, 0 ],
5412
5413
        _default: "#ffffff"
5414
};
5415
5416
})( jQuery );
5417
5418
5419
/******************************************************************************/
5420
/****************************** CLASS ANIMATIONS ******************************/
5421
/******************************************************************************/
5422
(function() {
5423
5424
var classAnimationActions = [ "add", "remove", "toggle" ],
5425
        shorthandStyles = {
5426
                border: 1,
5427
                borderBottom: 1,
5428
                borderColor: 1,
5429
                borderLeft: 1,
5430
                borderRight: 1,
5431
                borderTop: 1,
5432
                borderWidth: 1,
5433
                margin: 1,
5434
                padding: 1
5435
        };
5436
5437
$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
5438
        $.fx.step[ prop ] = function( fx ) {
5439
                if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
5440
                        jQuery.style( fx.elem, prop, fx.end );
5441
                        fx.setAttr = true;
5442
                }
5443
        };
5444 85ad3d82 Assos Assos
});
5445
5446 503b3f7b Assos Assos
function getElementStyles( elem ) {
5447
        var key, len,
5448
                style = elem.ownerDocument.defaultView ?
5449
                        elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
5450
                        elem.currentStyle,
5451
                styles = {};
5452
5453
        if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
5454
                len = style.length;
5455
                while ( len-- ) {
5456
                        key = style[ len ];
5457
                        if ( typeof style[ key ] === "string" ) {
5458
                                styles[ $.camelCase( key ) ] = style[ key ];
5459
                        }
5460
                }
5461
        // support: Opera, IE <9
5462
        } else {
5463
                for ( key in style ) {
5464
                        if ( typeof style[ key ] === "string" ) {
5465
                                styles[ key ] = style[ key ];
5466
                        }
5467
                }
5468
        }
5469
5470
        return styles;
5471
}
5472
5473
5474
function styleDifference( oldStyle, newStyle ) {
5475
        var diff = {},
5476
                name, value;
5477
5478
        for ( name in newStyle ) {
5479
                value = newStyle[ name ];
5480
                if ( oldStyle[ name ] !== value ) {
5481
                        if ( !shorthandStyles[ name ] ) {
5482
                                if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
5483
                                        diff[ name ] = value;
5484
                                }
5485
                        }
5486
                }
5487
        }
5488
5489
        return diff;
5490
}
5491
5492
// support: jQuery <1.8
5493
if ( !$.fn.addBack ) {
5494
        $.fn.addBack = function( selector ) {
5495
                return this.add( selector == null ?
5496
                        this.prevObject : this.prevObject.filter( selector )
5497
                );
5498
        };
5499
}
5500
5501
$.effects.animateClass = function( value, duration, easing, callback ) {
5502
        var o = $.speed( duration, easing, callback );
5503
5504
        return this.queue( function() {
5505
                var animated = $( this ),
5506
                        baseClass = animated.attr( "class" ) || "",
5507
                        applyClassChange,
5508
                        allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
5509
5510
                // map the animated objects to store the original styles.
5511
                allAnimations = allAnimations.map(function() {
5512
                        var el = $( this );
5513
                        return {
5514
                                el: el,
5515
                                start: getElementStyles( this )
5516
                        };
5517
                });
5518
5519
                // apply class change
5520
                applyClassChange = function() {
5521
                        $.each( classAnimationActions, function(i, action) {
5522
                                if ( value[ action ] ) {
5523
                                        animated[ action + "Class" ]( value[ action ] );
5524
                                }
5525
                        });
5526
                };
5527
                applyClassChange();
5528
5529
                // map all animated objects again - calculate new styles and diff
5530
                allAnimations = allAnimations.map(function() {
5531
                        this.end = getElementStyles( this.el[ 0 ] );
5532
                        this.diff = styleDifference( this.start, this.end );
5533
                        return this;
5534
                });
5535
5536
                // apply original class
5537
                animated.attr( "class", baseClass );
5538
5539
                // map all animated objects again - this time collecting a promise
5540
                allAnimations = allAnimations.map(function() {
5541
                        var styleInfo = this,
5542
                                dfd = $.Deferred(),
5543
                                opts = $.extend({}, o, {
5544
                                        queue: false,
5545
                                        complete: function() {
5546
                                                dfd.resolve( styleInfo );
5547
                                        }
5548
                                });
5549
5550
                        this.el.animate( this.diff, opts );
5551
                        return dfd.promise();
5552
                });
5553
5554
                // once all animations have completed:
5555
                $.when.apply( $, allAnimations.get() ).done(function() {
5556
5557
                        // set the final class
5558
                        applyClassChange();
5559
5560
                        // for each animated element,
5561
                        // clear all css properties that were animated
5562
                        $.each( arguments, function() {
5563
                                var el = this.el;
5564
                                $.each( this.diff, function(key) {
5565
                                        el.css( key, "" );
5566
                                });
5567
                        });
5568
5569
                        // this is guarnteed to be there if you use jQuery.speed()
5570
                        // it also handles dequeuing the next anim...
5571
                        o.complete.call( animated[ 0 ] );
5572
                });
5573
        });
5574
};
5575
5576
$.fn.extend({
5577
        addClass: (function( orig ) {
5578
                return function( classNames, speed, easing, callback ) {
5579
                        return speed ?
5580
                                $.effects.animateClass.call( this,
5581
                                        { add: classNames }, speed, easing, callback ) :
5582
                                orig.apply( this, arguments );
5583
                };
5584
        })( $.fn.addClass ),
5585
5586
        removeClass: (function( orig ) {
5587
                return function( classNames, speed, easing, callback ) {
5588
                        return arguments.length > 1 ?
5589
                                $.effects.animateClass.call( this,
5590
                                        { remove: classNames }, speed, easing, callback ) :
5591
                                orig.apply( this, arguments );
5592
                };
5593
        })( $.fn.removeClass ),
5594
5595
        toggleClass: (function( orig ) {
5596
                return function( classNames, force, speed, easing, callback ) {
5597
                        if ( typeof force === "boolean" || force === undefined ) {
5598
                                if ( !speed ) {
5599
                                        // without speed parameter
5600
                                        return orig.apply( this, arguments );
5601
                                } else {
5602
                                        return $.effects.animateClass.call( this,
5603
                                                (force ? { add: classNames } : { remove: classNames }),
5604
                                                speed, easing, callback );
5605
                                }
5606
                        } else {
5607
                                // without force parameter
5608
                                return $.effects.animateClass.call( this,
5609
                                        { toggle: classNames }, force, speed, easing );
5610
                        }
5611
                };
5612
        })( $.fn.toggleClass ),
5613
5614
        switchClass: function( remove, add, speed, easing, callback) {
5615
                return $.effects.animateClass.call( this, {
5616
                        add: add,
5617
                        remove: remove
5618
                }, speed, easing, callback );
5619
        }
5620
});
5621 85ad3d82 Assos Assos
5622 503b3f7b Assos Assos
})();
5623 85ad3d82 Assos Assos
5624
/******************************************************************************/
5625
/*********************************** EFFECTS **********************************/
5626
/******************************************************************************/
5627
5628 503b3f7b Assos Assos
(function() {
5629
5630
$.extend( $.effects, {
5631
        version: "1.10.2",
5632 85ad3d82 Assos Assos
5633
        // Saves a set of properties in a data storage
5634 503b3f7b Assos Assos
        save: function( element, set ) {
5635
                for( var i=0; i < set.length; i++ ) {
5636
                        if ( set[ i ] !== null ) {
5637
                                element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
5638
                        }
5639 85ad3d82 Assos Assos
                }
5640
        },
5641
5642
        // Restores a set of previously saved properties from a data storage
5643 503b3f7b Assos Assos
        restore: function( element, set ) {
5644
                var val, i;
5645
                for( i=0; i < set.length; i++ ) {
5646
                        if ( set[ i ] !== null ) {
5647
                                val = element.data( dataSpace + set[ i ] );
5648
                                // support: jQuery 1.6.2
5649
                                // http://bugs.jquery.com/ticket/9917
5650
                                // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
5651
                                // We can't differentiate between "" and 0 here, so we just assume
5652
                                // empty string since it's likely to be a more common value...
5653
                                if ( val === undefined ) {
5654
                                        val = "";
5655
                                }
5656
                                element.css( set[ i ], val );
5657
                        }
5658 85ad3d82 Assos Assos
                }
5659
        },
5660
5661 503b3f7b Assos Assos
        setMode: function( el, mode ) {
5662
                if (mode === "toggle") {
5663
                        mode = el.is( ":hidden" ) ? "show" : "hide";
5664
                }
5665 85ad3d82 Assos Assos
                return mode;
5666
        },
5667
5668 503b3f7b Assos Assos
        // Translates a [top,left] array into a baseline value
5669
        // this should be a little more flexible in the future to handle a string & hash
5670
        getBaseline: function( origin, original ) {
5671 85ad3d82 Assos Assos
                var y, x;
5672 503b3f7b Assos Assos
                switch ( origin[ 0 ] ) {
5673
                        case "top": y = 0; break;
5674
                        case "middle": y = 0.5; break;
5675
                        case "bottom": y = 1; break;
5676
                        default: y = origin[ 0 ] / original.height;
5677
                }
5678
                switch ( origin[ 1 ] ) {
5679
                        case "left": x = 0; break;
5680
                        case "center": x = 0.5; break;
5681
                        case "right": x = 1; break;
5682
                        default: x = origin[ 1 ] / original.width;
5683
                }
5684
                return {
5685
                        x: x,
5686
                        y: y
5687 85ad3d82 Assos Assos
                };
5688
        },
5689
5690
        // Wraps the element around a wrapper that copies position properties
5691 503b3f7b Assos Assos
        createWrapper: function( element ) {
5692 85ad3d82 Assos Assos
5693
                // if the element is already wrapped, return it
5694 503b3f7b Assos Assos
                if ( element.parent().is( ".ui-effects-wrapper" )) {
5695 85ad3d82 Assos Assos
                        return element.parent();
5696
                }
5697
5698
                // wrap the element
5699
                var props = {
5700
                                width: element.outerWidth(true),
5701
                                height: element.outerHeight(true),
5702 503b3f7b Assos Assos
                                "float": element.css( "float" )
5703 85ad3d82 Assos Assos
                        },
5704 503b3f7b Assos Assos
                        wrapper = $( "<div></div>" )
5705
                                .addClass( "ui-effects-wrapper" )
5706 85ad3d82 Assos Assos
                                .css({
5707 503b3f7b Assos Assos
                                        fontSize: "100%",
5708
                                        background: "transparent",
5709
                                        border: "none",
5710 85ad3d82 Assos Assos
                                        margin: 0,
5711
                                        padding: 0
5712 503b3f7b Assos Assos
                                }),
5713
                        // Store the size in case width/height are defined in % - Fixes #5245
5714
                        size = {
5715
                                width: element.width(),
5716
                                height: element.height()
5717
                        },
5718
                        active = document.activeElement;
5719
5720
                // support: Firefox
5721
                // Firefox incorrectly exposes anonymous content
5722
                // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
5723
                try {
5724
                        active.id;
5725
                } catch( e ) {
5726
                        active = document.body;
5727
                }
5728 85ad3d82 Assos Assos
5729 503b3f7b Assos Assos
                element.wrap( wrapper );
5730
5731
                // Fixes #7595 - Elements lose focus when wrapped.
5732
                if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
5733
                        $( active ).focus();
5734
                }
5735
5736
                wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
5737 85ad3d82 Assos Assos
5738
                // transfer positioning properties to the wrapper
5739 503b3f7b Assos Assos
                if ( element.css( "position" ) === "static" ) {
5740
                        wrapper.css({ position: "relative" });
5741
                        element.css({ position: "relative" });
5742 85ad3d82 Assos Assos
                } else {
5743 503b3f7b Assos Assos
                        $.extend( props, {
5744
                                position: element.css( "position" ),
5745
                                zIndex: element.css( "z-index" )
5746 85ad3d82 Assos Assos
                        });
5747 503b3f7b Assos Assos
                        $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
5748
                                props[ pos ] = element.css( pos );
5749
                                if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
5750
                                        props[ pos ] = "auto";
5751 85ad3d82 Assos Assos
                                }
5752
                        });
5753 503b3f7b Assos Assos
                        element.css({
5754
                                position: "relative",
5755
                                top: 0,
5756
                                left: 0,
5757
                                right: "auto",
5758
                                bottom: "auto"
5759
                        });
5760 85ad3d82 Assos Assos
                }
5761 503b3f7b Assos Assos
                element.css(size);
5762 85ad3d82 Assos Assos
5763 503b3f7b Assos Assos
                return wrapper.css( props ).show();
5764 85ad3d82 Assos Assos
        },
5765
5766 503b3f7b Assos Assos
        removeWrapper: function( element ) {
5767
                var active = document.activeElement;
5768
5769
                if ( element.parent().is( ".ui-effects-wrapper" ) ) {
5770
                        element.parent().replaceWith( element );
5771
5772
                        // Fixes #7595 - Elements lose focus when wrapped.
5773
                        if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
5774
                                $( active ).focus();
5775
                        }
5776
                }
5777
5778
5779 85ad3d82 Assos Assos
                return element;
5780
        },
5781
5782 503b3f7b Assos Assos
        setTransition: function( element, list, factor, value ) {
5783 85ad3d82 Assos Assos
                value = value || {};
5784 503b3f7b Assos Assos
                $.each( list, function( i, x ) {
5785
                        var unit = element.cssUnit( x );
5786
                        if ( unit[ 0 ] > 0 ) {
5787
                                value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
5788
                        }
5789 85ad3d82 Assos Assos
                });
5790
                return value;
5791
        }
5792
});
5793
5794 503b3f7b Assos Assos
// return an effect options object for the given parameters:
5795
function _normalizeArguments( effect, options, speed, callback ) {
5796 85ad3d82 Assos Assos
5797 503b3f7b Assos Assos
        // allow passing all options as the first parameter
5798
        if ( $.isPlainObject( effect ) ) {
5799 85ad3d82 Assos Assos
                options = effect;
5800 503b3f7b Assos Assos
                effect = effect.effect;
5801
        }
5802
5803
        // convert to an object
5804
        effect = { effect: effect };
5805
5806
        // catch (effect, null, ...)
5807
        if ( options == null ) {
5808
                options = {};
5809 85ad3d82 Assos Assos
        }
5810 503b3f7b Assos Assos
5811
        // catch (effect, callback)
5812
        if ( $.isFunction( options ) ) {
5813 85ad3d82 Assos Assos
                callback = options;
5814
                speed = null;
5815
                options = {};
5816
        }
5817 503b3f7b Assos Assos
5818
        // catch (effect, speed, ?)
5819
        if ( typeof options === "number" || $.fx.speeds[ options ] ) {
5820 85ad3d82 Assos Assos
                callback = speed;
5821
                speed = options;
5822
                options = {};
5823
        }
5824 503b3f7b Assos Assos
5825
        // catch (effect, options, callback)
5826
        if ( $.isFunction( speed ) ) {
5827 85ad3d82 Assos Assos
                callback = speed;
5828
                speed = null;
5829
        }
5830
5831 503b3f7b Assos Assos
        // add options to effect
5832
        if ( options ) {
5833
                $.extend( effect, options );
5834
        }
5835 85ad3d82 Assos Assos
5836
        speed = speed || options.duration;
5837 503b3f7b Assos Assos
        effect.duration = $.fx.off ? 0 :
5838
                typeof speed === "number" ? speed :
5839
                speed in $.fx.speeds ? $.fx.speeds[ speed ] :
5840
                $.fx.speeds._default;
5841 85ad3d82 Assos Assos
5842 503b3f7b Assos Assos
        effect.complete = callback || options.complete;
5843 85ad3d82 Assos Assos
5844 503b3f7b Assos Assos
        return effect;
5845 85ad3d82 Assos Assos
}
5846
5847 503b3f7b Assos Assos
function standardAnimationOption( option ) {
5848
        // Valid standard speeds (nothing, number, named speed)
5849
        if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
5850
                return true;
5851
        }
5852
5853
        // Invalid strings - treat as "normal" speed
5854
        if ( typeof option === "string" && !$.effects.effect[ option ] ) {
5855 85ad3d82 Assos Assos
                return true;
5856
        }
5857 503b3f7b Assos Assos
5858
        // Complete callback
5859
        if ( $.isFunction( option ) ) {
5860
                return true;
5861
        }
5862
5863
        // Options hash (but not naming an effect)
5864
        if ( typeof option === "object" && !option.effect ) {
5865 85ad3d82 Assos Assos
                return true;
5866
        }
5867 503b3f7b Assos Assos
5868
        // Didn't match any standard API
5869 85ad3d82 Assos Assos
        return false;
5870
}
5871
5872
$.fn.extend({
5873 503b3f7b Assos Assos
        effect: function( /* effect, options, speed, callback */ ) {
5874
                var args = _normalizeArguments.apply( this, arguments ),
5875
                        mode = args.mode,
5876
                        queue = args.queue,
5877
                        effectMethod = $.effects.effect[ args.effect ];
5878
5879 85ad3d82 Assos Assos
                if ( $.fx.off || !effectMethod ) {
5880
                        // delegate to the original method (e.g., .show()) if possible
5881
                        if ( mode ) {
5882 503b3f7b Assos Assos
                                return this[ mode ]( args.duration, args.complete );
5883 85ad3d82 Assos Assos
                        } else {
5884 503b3f7b Assos Assos
                                return this.each( function() {
5885
                                        if ( args.complete ) {
5886
                                                args.complete.call( this );
5887 85ad3d82 Assos Assos
                                        }
5888
                                });
5889
                        }
5890
                }
5891
5892 503b3f7b Assos Assos
                function run( next ) {
5893
                        var elem = $( this ),
5894
                                complete = args.complete,
5895
                                mode = args.mode;
5896 85ad3d82 Assos Assos
5897 503b3f7b Assos Assos
                        function done() {
5898
                                if ( $.isFunction( complete ) ) {
5899
                                        complete.call( elem[0] );
5900
                                }
5901
                                if ( $.isFunction( next ) ) {
5902
                                        next();
5903
                                }
5904
                        }
5905 85ad3d82 Assos Assos
5906 503b3f7b Assos Assos
                        // If the element already has the correct final state, delegate to
5907
                        // the core methods so the internal tracking of "olddisplay" works.
5908
                        if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
5909
                                elem[ mode ]();
5910
                                done();
5911
                        } else {
5912
                                effectMethod.call( elem[0], args, done );
5913
                        }
5914 85ad3d82 Assos Assos
                }
5915 503b3f7b Assos Assos
5916
                return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
5917 85ad3d82 Assos Assos
        },
5918
5919 503b3f7b Assos Assos
        show: (function( orig ) {
5920
                return function( option ) {
5921
                        if ( standardAnimationOption( option ) ) {
5922
                                return orig.apply( this, arguments );
5923
                        } else {
5924
                                var args = _normalizeArguments.apply( this, arguments );
5925
                                args.mode = "show";
5926
                                return this.effect.call( this, args );
5927
                        }
5928
                };
5929
        })( $.fn.show ),
5930
5931
        hide: (function( orig ) {
5932
                return function( option ) {
5933
                        if ( standardAnimationOption( option ) ) {
5934
                                return orig.apply( this, arguments );
5935
                        } else {
5936
                                var args = _normalizeArguments.apply( this, arguments );
5937
                                args.mode = "hide";
5938
                                return this.effect.call( this, args );
5939
                        }
5940
                };
5941
        })( $.fn.hide ),
5942
5943
        toggle: (function( orig ) {
5944
                return function( option ) {
5945
                        if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
5946
                                return orig.apply( this, arguments );
5947
                        } else {
5948
                                var args = _normalizeArguments.apply( this, arguments );
5949
                                args.mode = "toggle";
5950
                                return this.effect.call( this, args );
5951
                        }
5952
                };
5953
        })( $.fn.toggle ),
5954
5955 85ad3d82 Assos Assos
        // helper functions
5956
        cssUnit: function(key) {
5957 503b3f7b Assos Assos
                var style = this.css( key ),
5958
                        val = [];
5959
5960
                $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
5961
                        if ( style.indexOf( unit ) > 0 ) {
5962
                                val = [ parseFloat( style ), unit ];
5963
                        }
5964 85ad3d82 Assos Assos
                });
5965
                return val;
5966
        }
5967
});
5968
5969 503b3f7b Assos Assos
})();
5970 85ad3d82 Assos Assos
5971
/******************************************************************************/
5972
/*********************************** EASING ***********************************/
5973
/******************************************************************************/
5974
5975 503b3f7b Assos Assos
(function() {
5976 85ad3d82 Assos Assos
5977 503b3f7b Assos Assos
// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
5978 85ad3d82 Assos Assos
5979 503b3f7b Assos Assos
var baseEasings = {};
5980
5981
$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
5982
        baseEasings[ name ] = function( p ) {
5983
                return Math.pow( p, i + 2 );
5984
        };
5985
});
5986
5987
$.extend( baseEasings, {
5988
        Sine: function ( p ) {
5989
                return 1 - Math.cos( p * Math.PI / 2 );
5990 85ad3d82 Assos Assos
        },
5991 503b3f7b Assos Assos
        Circ: function ( p ) {
5992
                return 1 - Math.sqrt( 1 - p * p );
5993 85ad3d82 Assos Assos
        },
5994 503b3f7b Assos Assos
        Elastic: function( p ) {
5995
                return p === 0 || p === 1 ? p :
5996
                        -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
5997 85ad3d82 Assos Assos
        },
5998 503b3f7b Assos Assos
        Back: function( p ) {
5999
                return p * p * ( 3 * p - 2 );
6000 85ad3d82 Assos Assos
        },
6001 503b3f7b Assos Assos
        Bounce: function ( p ) {
6002
                var pow2,
6003
                        bounce = 4;
6004
6005
                while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
6006
                return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
6007 85ad3d82 Assos Assos
        }
6008
});
6009
6010 503b3f7b Assos Assos
$.each( baseEasings, function( name, easeIn ) {
6011
        $.easing[ "easeIn" + name ] = easeIn;
6012
        $.easing[ "easeOut" + name ] = function( p ) {
6013
                return 1 - easeIn( 1 - p );
6014
        };
6015
        $.easing[ "easeInOut" + name ] = function( p ) {
6016
                return p < 0.5 ?
6017
                        easeIn( p * 2 ) / 2 :
6018
                        1 - easeIn( p * -2 + 2 ) / 2;
6019
        };
6020
});
6021
6022
})();
6023 85ad3d82 Assos Assos
6024
})(jQuery);
6025 503b3f7b Assos Assos
6026 85ad3d82 Assos Assos
(function( $, undefined ) {
6027
6028 503b3f7b Assos Assos
var uid = 0,
6029
        hideProps = {},
6030
        showProps = {};
6031 85ad3d82 Assos Assos
6032 503b3f7b Assos Assos
hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
6033
        hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
6034
showProps.height = showProps.paddingTop = showProps.paddingBottom =
6035
        showProps.borderTopWidth = showProps.borderBottomWidth = "show";
6036 85ad3d82 Assos Assos
6037 503b3f7b Assos Assos
$.widget( "ui.accordion", {
6038
        version: "1.10.2",
6039
        options: {
6040
                active: 0,
6041
                animate: {},
6042
                collapsible: false,
6043
                event: "click",
6044
                header: "> li > :first-child,> :not(li):even",
6045
                heightStyle: "auto",
6046
                icons: {
6047
                        activeHeader: "ui-icon-triangle-1-s",
6048
                        header: "ui-icon-triangle-1-e"
6049
                },
6050 85ad3d82 Assos Assos
6051 503b3f7b Assos Assos
                // callbacks
6052
                activate: null,
6053
                beforeActivate: null
6054
        },
6055 85ad3d82 Assos Assos
6056 503b3f7b Assos Assos
        _create: function() {
6057
                var options = this.options;
6058
                this.prevShow = this.prevHide = $();
6059
                this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
6060
                        // ARIA
6061
                        .attr( "role", "tablist" );
6062 85ad3d82 Assos Assos
6063 503b3f7b Assos Assos
                // don't allow collapsible: false and active: false / null
6064
                if ( !options.collapsible && (options.active === false || options.active == null) ) {
6065
                        options.active = 0;
6066
                }
6067 85ad3d82 Assos Assos
6068 503b3f7b Assos Assos
                this._processPanels();
6069
                // handle negative values
6070
                if ( options.active < 0 ) {
6071
                        options.active += this.headers.length;
6072
                }
6073
                this._refresh();
6074
        },
6075
6076
        _getCreateEventData: function() {
6077
                return {
6078
                        header: this.active,
6079
                        panel: !this.active.length ? $() : this.active.next(),
6080
                        content: !this.active.length ? $() : this.active.next()
6081
                };
6082
        },
6083
6084
        _createIcons: function() {
6085
                var icons = this.options.icons;
6086
                if ( icons ) {
6087
                        $( "<span>" )
6088
                                .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
6089
                                .prependTo( this.headers );
6090
                        this.active.children( ".ui-accordion-header-icon" )
6091
                                .removeClass( icons.header )
6092
                                .addClass( icons.activeHeader );
6093
                        this.headers.addClass( "ui-accordion-icons" );
6094
                }
6095
        },
6096 85ad3d82 Assos Assos
6097 503b3f7b Assos Assos
        _destroyIcons: function() {
6098
                this.headers
6099
                        .removeClass( "ui-accordion-icons" )
6100
                        .children( ".ui-accordion-header-icon" )
6101
                                .remove();
6102
        },
6103 85ad3d82 Assos Assos
6104 503b3f7b Assos Assos
        _destroy: function() {
6105
                var contents;
6106 85ad3d82 Assos Assos
6107 503b3f7b Assos Assos
                // clean up main element
6108
                this.element
6109
                        .removeClass( "ui-accordion ui-widget ui-helper-reset" )
6110
                        .removeAttr( "role" );
6111 85ad3d82 Assos Assos
6112 503b3f7b Assos Assos
                // clean up headers
6113
                this.headers
6114
                        .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
6115
                        .removeAttr( "role" )
6116
                        .removeAttr( "aria-selected" )
6117
                        .removeAttr( "aria-controls" )
6118
                        .removeAttr( "tabIndex" )
6119
                        .each(function() {
6120
                                if ( /^ui-accordion/.test( this.id ) ) {
6121
                                        this.removeAttribute( "id" );
6122
                                }
6123 85ad3d82 Assos Assos
                        });
6124 503b3f7b Assos Assos
                this._destroyIcons();
6125
6126
                // clean up content panels
6127
                contents = this.headers.next()
6128
                        .css( "display", "" )
6129
                        .removeAttr( "role" )
6130
                        .removeAttr( "aria-expanded" )
6131
                        .removeAttr( "aria-hidden" )
6132
                        .removeAttr( "aria-labelledby" )
6133
                        .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
6134
                        .each(function() {
6135
                                if ( /^ui-accordion/.test( this.id ) ) {
6136
                                        this.removeAttribute( "id" );
6137
                                }
6138 85ad3d82 Assos Assos
                        });
6139 503b3f7b Assos Assos
                if ( this.options.heightStyle !== "content" ) {
6140
                        contents.css( "height", "" );
6141
                }
6142
        },
6143 85ad3d82 Assos Assos
6144 503b3f7b Assos Assos
        _setOption: function( key, value ) {
6145
                if ( key === "active" ) {
6146
                        // _activate() will handle invalid values and update this.options
6147
                        this._activate( value );
6148
                        return;
6149
                }
6150 85ad3d82 Assos Assos
6151 503b3f7b Assos Assos
                if ( key === "event" ) {
6152
                        if ( this.options.event ) {
6153
                                this._off( this.headers, this.options.event );
6154
                        }
6155
                        this._setupEvents( value );
6156
                }
6157 85ad3d82 Assos Assos
6158 503b3f7b Assos Assos
                this._super( key, value );
6159 85ad3d82 Assos Assos
6160 503b3f7b Assos Assos
                // setting collapsible: false while collapsed; open first panel
6161
                if ( key === "collapsible" && !value && this.options.active === false ) {
6162
                        this._activate( 0 );
6163
                }
6164 85ad3d82 Assos Assos
6165 503b3f7b Assos Assos
                if ( key === "icons" ) {
6166
                        this._destroyIcons();
6167
                        if ( value ) {
6168
                                this._createIcons();
6169
                        }
6170
                }
6171 85ad3d82 Assos Assos
6172 503b3f7b Assos Assos
                // #5332 - opacity doesn't cascade to positioned elements in IE
6173
                // so we need to add the disabled class to the headers and panels
6174
                if ( key === "disabled" ) {
6175
                        this.headers.add( this.headers.next() )
6176
                                .toggleClass( "ui-state-disabled", !!value );
6177
                }
6178
        },
6179 85ad3d82 Assos Assos
6180 503b3f7b Assos Assos
        _keydown: function( event ) {
6181
                /*jshint maxcomplexity:15*/
6182
                if ( event.altKey || event.ctrlKey ) {
6183
                        return;
6184
                }
6185 85ad3d82 Assos Assos
6186 503b3f7b Assos Assos
                var keyCode = $.ui.keyCode,
6187
                        length = this.headers.length,
6188
                        currentIndex = this.headers.index( event.target ),
6189
                        toFocus = false;
6190 85ad3d82 Assos Assos
6191 503b3f7b Assos Assos
                switch ( event.keyCode ) {
6192
                        case keyCode.RIGHT:
6193
                        case keyCode.DOWN:
6194
                                toFocus = this.headers[ ( currentIndex + 1 ) % length ];
6195
                                break;
6196
                        case keyCode.LEFT:
6197
                        case keyCode.UP:
6198
                                toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
6199
                                break;
6200
                        case keyCode.SPACE:
6201
                        case keyCode.ENTER:
6202
                                this._eventHandler( event );
6203
                                break;
6204
                        case keyCode.HOME:
6205
                                toFocus = this.headers[ 0 ];
6206
                                break;
6207
                        case keyCode.END:
6208
                                toFocus = this.headers[ length - 1 ];
6209
                                break;
6210
                }
6211 85ad3d82 Assos Assos
6212 503b3f7b Assos Assos
                if ( toFocus ) {
6213
                        $( event.target ).attr( "tabIndex", -1 );
6214
                        $( toFocus ).attr( "tabIndex", 0 );
6215
                        toFocus.focus();
6216
                        event.preventDefault();
6217
                }
6218
        },
6219 85ad3d82 Assos Assos
6220 503b3f7b Assos Assos
        _panelKeyDown : function( event ) {
6221
                if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
6222
                        $( event.currentTarget ).prev().focus();
6223
                }
6224
        },
6225 85ad3d82 Assos Assos
6226 503b3f7b Assos Assos
        refresh: function() {
6227
                var options = this.options;
6228
                this._processPanels();
6229
6230
                // was collapsed or no panel
6231
                if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
6232
                        options.active = false;
6233
                        this.active = $();
6234
                // active false only when collapsible is true
6235
                } if ( options.active === false ) {
6236
                        this._activate( 0 );
6237
                // was active, but active panel is gone
6238
                } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
6239
                        // all remaining panel are disabled
6240
                        if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
6241
                                options.active = false;
6242
                                this.active = $();
6243
                        // activate previous panel
6244
                        } else {
6245
                                this._activate( Math.max( 0, options.active - 1 ) );
6246
                        }
6247
                // was active, active panel still exists
6248
                } else {
6249
                        // make sure active index is correct
6250
                        options.active = this.headers.index( this.active );
6251
                }
6252 85ad3d82 Assos Assos
6253 503b3f7b Assos Assos
                this._destroyIcons();
6254 85ad3d82 Assos Assos
6255 503b3f7b Assos Assos
                this._refresh();
6256
        },
6257 85ad3d82 Assos Assos
6258 503b3f7b Assos Assos
        _processPanels: function() {
6259
                this.headers = this.element.find( this.options.header )
6260
                        .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
6261 85ad3d82 Assos Assos
6262 503b3f7b Assos Assos
                this.headers.next()
6263
                        .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
6264
                        .filter(":not(.ui-accordion-content-active)")
6265
                        .hide();
6266
        },
6267 85ad3d82 Assos Assos
6268 503b3f7b Assos Assos
        _refresh: function() {
6269
                var maxHeight,
6270
                        options = this.options,
6271
                        heightStyle = options.heightStyle,
6272
                        parent = this.element.parent(),
6273
                        accordionId = this.accordionId = "ui-accordion-" +
6274
                                (this.element.attr( "id" ) || ++uid);
6275
6276
                this.active = this._findActive( options.active )
6277
                        .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
6278
                        .removeClass( "ui-corner-all" );
6279
                this.active.next()
6280
                        .addClass( "ui-accordion-content-active" )
6281
                        .show();
6282 85ad3d82 Assos Assos
6283 503b3f7b Assos Assos
                this.headers
6284
                        .attr( "role", "tab" )
6285
                        .each(function( i ) {
6286
                                var header = $( this ),
6287
                                        headerId = header.attr( "id" ),
6288
                                        panel = header.next(),
6289
                                        panelId = panel.attr( "id" );
6290
                                if ( !headerId ) {
6291
                                        headerId = accordionId + "-header-" + i;
6292
                                        header.attr( "id", headerId );
6293
                                }
6294
                                if ( !panelId ) {
6295
                                        panelId = accordionId + "-panel-" + i;
6296
                                        panel.attr( "id", panelId );
6297
                                }
6298
                                header.attr( "aria-controls", panelId );
6299
                                panel.attr( "aria-labelledby", headerId );
6300
                        })
6301
                        .next()
6302
                                .attr( "role", "tabpanel" );
6303 85ad3d82 Assos Assos
6304 503b3f7b Assos Assos
                this.headers
6305
                        .not( this.active )
6306
                        .attr({
6307
                                "aria-selected": "false",
6308
                                tabIndex: -1
6309
                        })
6310
                        .next()
6311
                                .attr({
6312
                                        "aria-expanded": "false",
6313
                                        "aria-hidden": "true"
6314
                                })
6315
                                .hide();
6316 85ad3d82 Assos Assos
6317 503b3f7b Assos Assos
                // make sure at least one header is in the tab order
6318
                if ( !this.active.length ) {
6319
                        this.headers.eq( 0 ).attr( "tabIndex", 0 );
6320
                } else {
6321
                        this.active.attr({
6322
                                "aria-selected": "true",
6323
                                tabIndex: 0
6324
                        })
6325
                        .next()
6326
                                .attr({
6327
                                        "aria-expanded": "true",
6328
                                        "aria-hidden": "false"
6329
                                });
6330
                }
6331 85ad3d82 Assos Assos
6332 503b3f7b Assos Assos
                this._createIcons();
6333 85ad3d82 Assos Assos
6334 503b3f7b Assos Assos
                this._setupEvents( options.event );
6335 85ad3d82 Assos Assos
6336 503b3f7b Assos Assos
                if ( heightStyle === "fill" ) {
6337
                        maxHeight = parent.height();
6338
                        this.element.siblings( ":visible" ).each(function() {
6339
                                var elem = $( this ),
6340
                                        position = elem.css( "position" );
6341
6342
                                if ( position === "absolute" || position === "fixed" ) {
6343
                                        return;
6344
                                }
6345
                                maxHeight -= elem.outerHeight( true );
6346
                        });
6347
6348
                        this.headers.each(function() {
6349
                                maxHeight -= $( this ).outerHeight( true );
6350
                        });
6351
6352
                        this.headers.next()
6353
                                .each(function() {
6354
                                        $( this ).height( Math.max( 0, maxHeight -
6355
                                                $( this ).innerHeight() + $( this ).height() ) );
6356 85ad3d82 Assos Assos
                                })
6357 503b3f7b Assos Assos
                                .css( "overflow", "auto" );
6358
                } else if ( heightStyle === "auto" ) {
6359
                        maxHeight = 0;
6360
                        this.headers.next()
6361
                                .each(function() {
6362
                                        maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
6363
                                })
6364
                                .height( maxHeight );
6365 85ad3d82 Assos Assos
                }
6366 503b3f7b Assos Assos
        },
6367 85ad3d82 Assos Assos
6368 503b3f7b Assos Assos
        _activate: function( index ) {
6369
                var active = this._findActive( index )[ 0 ];
6370 85ad3d82 Assos Assos
6371 503b3f7b Assos Assos
                // trying to activate the already active panel
6372
                if ( active === this.active[ 0 ] ) {
6373
                        return;
6374
                }
6375 85ad3d82 Assos Assos
6376 503b3f7b Assos Assos
                // trying to collapse, simulate a click on the currently active header
6377
                active = active || this.active[ 0 ];
6378 85ad3d82 Assos Assos
6379 503b3f7b Assos Assos
                this._eventHandler({
6380
                        target: active,
6381
                        currentTarget: active,
6382
                        preventDefault: $.noop
6383
                });
6384
        },
6385 85ad3d82 Assos Assos
6386 503b3f7b Assos Assos
        _findActive: function( selector ) {
6387
                return typeof selector === "number" ? this.headers.eq( selector ) : $();
6388
        },
6389 85ad3d82 Assos Assos
6390 503b3f7b Assos Assos
        _setupEvents: function( event ) {
6391
                var events = {
6392
                        keydown: "_keydown"
6393
                };
6394
                if ( event ) {
6395
                        $.each( event.split(" "), function( index, eventName ) {
6396
                                events[ eventName ] = "_eventHandler";
6397
                        });
6398
                }
6399 85ad3d82 Assos Assos
6400 503b3f7b Assos Assos
                this._off( this.headers.add( this.headers.next() ) );
6401
                this._on( this.headers, events );
6402
                this._on( this.headers.next(), { keydown: "_panelKeyDown" });
6403
                this._hoverable( this.headers );
6404
                this._focusable( this.headers );
6405
        },
6406 85ad3d82 Assos Assos
6407 503b3f7b Assos Assos
        _eventHandler: function( event ) {
6408
                var options = this.options,
6409
                        active = this.active,
6410
                        clicked = $( event.currentTarget ),
6411
                        clickedIsActive = clicked[ 0 ] === active[ 0 ],
6412
                        collapsing = clickedIsActive && options.collapsible,
6413
                        toShow = collapsing ? $() : clicked.next(),
6414
                        toHide = active.next(),
6415
                        eventData = {
6416
                                oldHeader: active,
6417
                                oldPanel: toHide,
6418
                                newHeader: collapsing ? $() : clicked,
6419
                                newPanel: toShow
6420
                        };
6421 85ad3d82 Assos Assos
6422 503b3f7b Assos Assos
                event.preventDefault();
6423 85ad3d82 Assos Assos
6424 503b3f7b Assos Assos
                if (
6425
                                // click on active header, but not collapsible
6426
                                ( clickedIsActive && !options.collapsible ) ||
6427
                                // allow canceling activation
6428
                                ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
6429
                        return;
6430
                }
6431 85ad3d82 Assos Assos
6432 503b3f7b Assos Assos
                options.active = collapsing ? false : this.headers.index( clicked );
6433 85ad3d82 Assos Assos
6434 503b3f7b Assos Assos
                // when the call to ._toggle() comes after the class changes
6435
                // it causes a very odd bug in IE 8 (see #6720)
6436
                this.active = clickedIsActive ? $() : clicked;
6437
                this._toggle( eventData );
6438 85ad3d82 Assos Assos
6439 503b3f7b Assos Assos
                // switch classes
6440
                // corner classes on the previously active header stay after the animation
6441
                active.removeClass( "ui-accordion-header-active ui-state-active" );
6442
                if ( options.icons ) {
6443
                        active.children( ".ui-accordion-header-icon" )
6444
                                .removeClass( options.icons.activeHeader )
6445
                                .addClass( options.icons.header );
6446
                }
6447 85ad3d82 Assos Assos
6448 503b3f7b Assos Assos
                if ( !clickedIsActive ) {
6449
                        clicked
6450
                                .removeClass( "ui-corner-all" )
6451
                                .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
6452
                        if ( options.icons ) {
6453
                                clicked.children( ".ui-accordion-header-icon" )
6454
                                        .removeClass( options.icons.header )
6455
                                        .addClass( options.icons.activeHeader );
6456
                        }
6457 85ad3d82 Assos Assos
6458 503b3f7b Assos Assos
                        clicked
6459
                                .next()
6460
                                .addClass( "ui-accordion-content-active" );
6461
                }
6462
        },
6463 85ad3d82 Assos Assos
6464 503b3f7b Assos Assos
        _toggle: function( data ) {
6465
                var toShow = data.newPanel,
6466
                        toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
6467 85ad3d82 Assos Assos
6468 503b3f7b Assos Assos
                // handle activating a panel during the animation for another activation
6469
                this.prevShow.add( this.prevHide ).stop( true, true );
6470
                this.prevShow = toShow;
6471
                this.prevHide = toHide;
6472 85ad3d82 Assos Assos
6473 503b3f7b Assos Assos
                if ( this.options.animate ) {
6474
                        this._animate( toShow, toHide, data );
6475
                } else {
6476
                        toHide.hide();
6477
                        toShow.show();
6478
                        this._toggleComplete( data );
6479 85ad3d82 Assos Assos
                }
6480
6481 503b3f7b Assos Assos
                toHide.attr({
6482
                        "aria-expanded": "false",
6483
                        "aria-hidden": "true"
6484
                });
6485
                toHide.prev().attr( "aria-selected", "false" );
6486
                // if we're switching panels, remove the old header from the tab order
6487
                // if we're opening from collapsed state, remove the previous header from the tab order
6488
                // if we're collapsing, then keep the collapsing header in the tab order
6489
                if ( toShow.length && toHide.length ) {
6490
                        toHide.prev().attr( "tabIndex", -1 );
6491
                } else if ( toShow.length ) {
6492
                        this.headers.filter(function() {
6493
                                return $( this ).attr( "tabIndex" ) === 0;
6494 85ad3d82 Assos Assos
                        })
6495 503b3f7b Assos Assos
                        .attr( "tabIndex", -1 );
6496
                }
6497 85ad3d82 Assos Assos
6498 503b3f7b Assos Assos
                toShow
6499
                        .attr({
6500
                                "aria-expanded": "true",
6501
                                "aria-hidden": "false"
6502
                        })
6503
                        .prev()
6504
                                .attr({
6505
                                        "aria-selected": "true",
6506
                                        tabIndex: 0
6507
                                });
6508
        },
6509 85ad3d82 Assos Assos
6510 503b3f7b Assos Assos
        _animate: function( toShow, toHide, data ) {
6511
                var total, easing, duration,
6512
                        that = this,
6513
                        adjust = 0,
6514
                        down = toShow.length &&
6515
                                ( !toHide.length || ( toShow.index() < toHide.index() ) ),
6516
                        animate = this.options.animate || {},
6517
                        options = down && animate.down || animate,
6518
                        complete = function() {
6519
                                that._toggleComplete( data );
6520
                        };
6521 85ad3d82 Assos Assos
6522 503b3f7b Assos Assos
                if ( typeof options === "number" ) {
6523
                        duration = options;
6524 85ad3d82 Assos Assos
                }
6525 503b3f7b Assos Assos
                if ( typeof options === "string" ) {
6526
                        easing = options;
6527 85ad3d82 Assos Assos
                }
6528 503b3f7b Assos Assos
                // fall back from options to animation in case of partial down settings
6529
                easing = easing || options.easing || animate.easing;
6530
                duration = duration || options.duration || animate.duration;
6531 85ad3d82 Assos Assos
6532 503b3f7b Assos Assos
                if ( !toHide.length ) {
6533
                        return toShow.animate( showProps, duration, easing, complete );
6534
                }
6535
                if ( !toShow.length ) {
6536
                        return toHide.animate( hideProps, duration, easing, complete );
6537 85ad3d82 Assos Assos
                }
6538
6539 503b3f7b Assos Assos
                total = toShow.show().outerHeight();
6540
                toHide.animate( hideProps, {
6541
                        duration: duration,
6542
                        easing: easing,
6543
                        step: function( now, fx ) {
6544
                                fx.now = Math.round( now );
6545 85ad3d82 Assos Assos
                        }
6546
                });
6547 503b3f7b Assos Assos
                toShow
6548
                        .hide()
6549
                        .animate( showProps, {
6550
                                duration: duration,
6551
                                easing: easing,
6552
                                complete: complete,
6553
                                step: function( now, fx ) {
6554
                                        fx.now = Math.round( now );
6555
                                        if ( fx.prop !== "height" ) {
6556
                                                adjust += fx.now;
6557
                                        } else if ( that.options.heightStyle !== "content" ) {
6558
                                                fx.now = Math.round( total - toHide.outerHeight() - adjust );
6559
                                                adjust = 0;
6560
                                        }
6561 85ad3d82 Assos Assos
                                }
6562 503b3f7b Assos Assos
                        });
6563
        },
6564 85ad3d82 Assos Assos
6565 503b3f7b Assos Assos
        _toggleComplete: function( data ) {
6566
                var toHide = data.oldPanel;
6567 85ad3d82 Assos Assos
6568 503b3f7b Assos Assos
                toHide
6569
                        .removeClass( "ui-accordion-content-active" )
6570
                        .prev()
6571
                                .removeClass( "ui-corner-top" )
6572
                                .addClass( "ui-corner-all" );
6573 85ad3d82 Assos Assos
6574 503b3f7b Assos Assos
                // Work around for rendering bug in IE (#5421)
6575
                if ( toHide.length ) {
6576
                        toHide.parent()[0].className = toHide.parent()[0].className;
6577
                }
6578 85ad3d82 Assos Assos
6579 503b3f7b Assos Assos
                this._trigger( "activate", null, data );
6580
        }
6581
});
6582 85ad3d82 Assos Assos
6583 503b3f7b Assos Assos
})( jQuery );
6584 85ad3d82 Assos Assos
6585 503b3f7b Assos Assos
(function( $, undefined ) {
6586 85ad3d82 Assos Assos
6587 503b3f7b Assos Assos
// used to prevent race conditions with remote data sources
6588
var requestIndex = 0;
6589 85ad3d82 Assos Assos
6590 503b3f7b Assos Assos
$.widget( "ui.autocomplete", {
6591
        version: "1.10.2",
6592
        defaultElement: "<input>",
6593
        options: {
6594
                appendTo: null,
6595
                autoFocus: false,
6596
                delay: 300,
6597
                minLength: 1,
6598
                position: {
6599
                        my: "left top",
6600
                        at: "left bottom",
6601
                        collision: "none"
6602
                },
6603
                source: null,
6604 85ad3d82 Assos Assos
6605 503b3f7b Assos Assos
                // callbacks
6606
                change: null,
6607
                close: null,
6608
                focus: null,
6609
                open: null,
6610
                response: null,
6611
                search: null,
6612
                select: null
6613
        },
6614 85ad3d82 Assos Assos
6615 503b3f7b Assos Assos
        pending: 0,
6616 85ad3d82 Assos Assos
6617 503b3f7b Assos Assos
        _create: function() {
6618
                // Some browsers only repeat keydown events, not keypress events,
6619
                // so we use the suppressKeyPress flag to determine if we've already
6620
                // handled the keydown event. #7269
6621
                // Unfortunately the code for & in keypress is the same as the up arrow,
6622
                // so we use the suppressKeyPressRepeat flag to avoid handling keypress
6623
                // events when we know the keydown event was used to modify the
6624
                // search term. #7799
6625
                var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
6626
                        nodeName = this.element[0].nodeName.toLowerCase(),
6627
                        isTextarea = nodeName === "textarea",
6628
                        isInput = nodeName === "input";
6629
6630
                this.isMultiLine =
6631
                        // Textareas are always multi-line
6632
                        isTextarea ? true :
6633
                        // Inputs are always single-line, even if inside a contentEditable element
6634
                        // IE also treats inputs as contentEditable
6635
                        isInput ? false :
6636
                        // All other element types are determined by whether or not they're contentEditable
6637
                        this.element.prop( "isContentEditable" );
6638
6639
                this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
6640
                this.isNewMenu = true;
6641 85ad3d82 Assos Assos
6642 503b3f7b Assos Assos
                this.element
6643
                        .addClass( "ui-autocomplete-input" )
6644
                        .attr( "autocomplete", "off" );
6645
6646
                this._on( this.element, {
6647
                        keydown: function( event ) {
6648
                                /*jshint maxcomplexity:15*/
6649
                                if ( this.element.prop( "readOnly" ) ) {
6650
                                        suppressKeyPress = true;
6651
                                        suppressInput = true;
6652
                                        suppressKeyPressRepeat = true;
6653
                                        return;
6654
                                }
6655 85ad3d82 Assos Assos
6656 503b3f7b Assos Assos
                                suppressKeyPress = false;
6657
                                suppressInput = false;
6658
                                suppressKeyPressRepeat = false;
6659
                                var keyCode = $.ui.keyCode;
6660
                                switch( event.keyCode ) {
6661
                                case keyCode.PAGE_UP:
6662
                                        suppressKeyPress = true;
6663
                                        this._move( "previousPage", event );
6664
                                        break;
6665
                                case keyCode.PAGE_DOWN:
6666
                                        suppressKeyPress = true;
6667
                                        this._move( "nextPage", event );
6668
                                        break;
6669
                                case keyCode.UP:
6670
                                        suppressKeyPress = true;
6671
                                        this._keyEvent( "previous", event );
6672
                                        break;
6673
                                case keyCode.DOWN:
6674
                                        suppressKeyPress = true;
6675
                                        this._keyEvent( "next", event );
6676
                                        break;
6677
                                case keyCode.ENTER:
6678
                                case keyCode.NUMPAD_ENTER:
6679
                                        // when menu is open and has focus
6680
                                        if ( this.menu.active ) {
6681
                                                // #6055 - Opera still allows the keypress to occur
6682
                                                // which causes forms to submit
6683
                                                suppressKeyPress = true;
6684
                                                event.preventDefault();
6685
                                                this.menu.select( event );
6686
                                        }
6687
                                        break;
6688
                                case keyCode.TAB:
6689
                                        if ( this.menu.active ) {
6690
                                                this.menu.select( event );
6691
                                        }
6692
                                        break;
6693
                                case keyCode.ESCAPE:
6694
                                        if ( this.menu.element.is( ":visible" ) ) {
6695
                                                this._value( this.term );
6696
                                                this.close( event );
6697
                                                // Different browsers have different default behavior for escape
6698
                                                // Single press can mean undo or clear
6699
                                                // Double press in IE means clear the whole form
6700
                                                event.preventDefault();
6701
                                        }
6702
                                        break;
6703
                                default:
6704
                                        suppressKeyPressRepeat = true;
6705
                                        // search timeout should be triggered before the input value is changed
6706
                                        this._searchTimeout( event );
6707
                                        break;
6708
                                }
6709
                        },
6710
                        keypress: function( event ) {
6711
                                if ( suppressKeyPress ) {
6712
                                        suppressKeyPress = false;
6713
                                        event.preventDefault();
6714
                                        return;
6715
                                }
6716
                                if ( suppressKeyPressRepeat ) {
6717
                                        return;
6718
                                }
6719
6720
                                // replicate some key handlers to allow them to repeat in Firefox and Opera
6721
                                var keyCode = $.ui.keyCode;
6722
                                switch( event.keyCode ) {
6723
                                case keyCode.PAGE_UP:
6724
                                        this._move( "previousPage", event );
6725
                                        break;
6726
                                case keyCode.PAGE_DOWN:
6727
                                        this._move( "nextPage", event );
6728
                                        break;
6729
                                case keyCode.UP:
6730
                                        this._keyEvent( "previous", event );
6731
                                        break;
6732
                                case keyCode.DOWN:
6733
                                        this._keyEvent( "next", event );
6734
                                        break;
6735
                                }
6736
                        },
6737
                        input: function( event ) {
6738
                                if ( suppressInput ) {
6739
                                        suppressInput = false;
6740
                                        event.preventDefault();
6741
                                        return;
6742
                                }
6743
                                this._searchTimeout( event );
6744
                        },
6745
                        focus: function() {
6746
                                this.selectedItem = null;
6747
                                this.previous = this._value();
6748
                        },
6749
                        blur: function( event ) {
6750
                                if ( this.cancelBlur ) {
6751
                                        delete this.cancelBlur;
6752
                                        return;
6753
                                }
6754 85ad3d82 Assos Assos
6755 503b3f7b Assos Assos
                                clearTimeout( this.searching );
6756
                                this.close( event );
6757
                                this._change( event );
6758 85ad3d82 Assos Assos
                        }
6759 503b3f7b Assos Assos
                });
6760 85ad3d82 Assos Assos
6761 503b3f7b Assos Assos
                this._initSource();
6762
                this.menu = $( "<ul>" )
6763
                        .addClass( "ui-autocomplete ui-front" )
6764
                        .appendTo( this._appendTo() )
6765
                        .menu({
6766
                                // custom key handling for now
6767
                                input: $(),
6768
                                // disable ARIA support, the live region takes care of that
6769
                                role: null
6770
                        })
6771
                        .hide()
6772
                        .data( "ui-menu" );
6773 85ad3d82 Assos Assos
6774 503b3f7b Assos Assos
                this._on( this.menu.element, {
6775
                        mousedown: function( event ) {
6776
                                // prevent moving focus out of the text field
6777
                                event.preventDefault();
6778 85ad3d82 Assos Assos
6779 503b3f7b Assos Assos
                                // IE doesn't prevent moving focus even with event.preventDefault()
6780
                                // so we set a flag to know when we should ignore the blur event
6781
                                this.cancelBlur = true;
6782
                                this._delay(function() {
6783
                                        delete this.cancelBlur;
6784
                                });
6785
6786
                                // clicking on the scrollbar causes focus to shift to the body
6787
                                // but we can't detect a mouseup or a click immediately afterward
6788
                                // so we have to track the next mousedown and close the menu if
6789
                                // the user clicks somewhere outside of the autocomplete
6790
                                var menuElement = this.menu.element[ 0 ];
6791
                                if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
6792
                                        this._delay(function() {
6793
                                                var that = this;
6794
                                                this.document.one( "mousedown", function( event ) {
6795
                                                        if ( event.target !== that.element[ 0 ] &&
6796
                                                                        event.target !== menuElement &&
6797
                                                                        !$.contains( menuElement, event.target ) ) {
6798
                                                                that.close();
6799
                                                        }
6800
                                                });
6801
                                        });
6802
                                }
6803
                        },
6804
                        menufocus: function( event, ui ) {
6805
                                // support: Firefox
6806
                                // Prevent accidental activation of menu items in Firefox (#7024 #9118)
6807
                                if ( this.isNewMenu ) {
6808
                                        this.isNewMenu = false;
6809
                                        if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
6810
                                                this.menu.blur();
6811
6812
                                                this.document.one( "mousemove", function() {
6813
                                                        $( event.target ).trigger( event.originalEvent );
6814
                                                });
6815 85ad3d82 Assos Assos
6816 503b3f7b Assos Assos
                                                return;
6817
                                        }
6818
                                }
6819 85ad3d82 Assos Assos
6820 503b3f7b Assos Assos
                                var item = ui.item.data( "ui-autocomplete-item" );
6821
                                if ( false !== this._trigger( "focus", event, { item: item } ) ) {
6822
                                        // use value to match what will end up in the input, if it was a key event
6823
                                        if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
6824
                                                this._value( item.value );
6825
                                        }
6826
                                } else {
6827
                                        // Normally the input is populated with the item's value as the
6828
                                        // menu is navigated, causing screen readers to notice a change and
6829
                                        // announce the item. Since the focus event was canceled, this doesn't
6830
                                        // happen, so we update the live region so that screen readers can
6831
                                        // still notice the change and announce it.
6832
                                        this.liveRegion.text( item.value );
6833
                                }
6834
                        },
6835
                        menuselect: function( event, ui ) {
6836
                                var item = ui.item.data( "ui-autocomplete-item" ),
6837
                                        previous = this.previous;
6838
6839
                                // only trigger when focus was lost (click on menu)
6840
                                if ( this.element[0] !== this.document[0].activeElement ) {
6841
                                        this.element.focus();
6842
                                        this.previous = previous;
6843
                                        // #6109 - IE triggers two focus events and the second
6844
                                        // is asynchronous, so we need to reset the previous
6845
                                        // term synchronously and asynchronously :-(
6846
                                        this._delay(function() {
6847
                                                this.previous = previous;
6848
                                                this.selectedItem = item;
6849
                                        });
6850
                                }
6851 85ad3d82 Assos Assos
6852 503b3f7b Assos Assos
                                if ( false !== this._trigger( "select", event, { item: item } ) ) {
6853
                                        this._value( item.value );
6854
                                }
6855
                                // reset the term after the select event
6856
                                // this allows custom select handling to work properly
6857
                                this.term = this._value();
6858 85ad3d82 Assos Assos
6859 503b3f7b Assos Assos
                                this.close( event );
6860
                                this.selectedItem = item;
6861
                        }
6862 85ad3d82 Assos Assos
                });
6863
6864 503b3f7b Assos Assos
                this.liveRegion = $( "<span>", {
6865
                                role: "status",
6866
                                "aria-live": "polite"
6867
                        })
6868
                        .addClass( "ui-helper-hidden-accessible" )
6869
                        .insertAfter( this.element );
6870 85ad3d82 Assos Assos
6871 503b3f7b Assos Assos
                // turning off autocomplete prevents the browser from remembering the
6872
                // value when navigating through history, so we re-enable autocomplete
6873
                // if the page is unloaded before the widget is destroyed. #7790
6874
                this._on( this.window, {
6875
                        beforeunload: function() {
6876
                                this.element.removeAttr( "autocomplete" );
6877
                        }
6878
                });
6879
        },
6880 85ad3d82 Assos Assos
6881 503b3f7b Assos Assos
        _destroy: function() {
6882
                clearTimeout( this.searching );
6883
                this.element
6884
                        .removeClass( "ui-autocomplete-input" )
6885
                        .removeAttr( "autocomplete" );
6886
                this.menu.element.remove();
6887
                this.liveRegion.remove();
6888
        },
6889 85ad3d82 Assos Assos
6890 503b3f7b Assos Assos
        _setOption: function( key, value ) {
6891
                this._super( key, value );
6892
                if ( key === "source" ) {
6893
                        this._initSource();
6894
                }
6895
                if ( key === "appendTo" ) {
6896
                        this.menu.element.appendTo( this._appendTo() );
6897
                }
6898
                if ( key === "disabled" && value && this.xhr ) {
6899
                        this.xhr.abort();
6900
                }
6901
        },
6902 85ad3d82 Assos Assos
6903 503b3f7b Assos Assos
        _appendTo: function() {
6904
                var element = this.options.appendTo;
6905 85ad3d82 Assos Assos
6906 503b3f7b Assos Assos
                if ( element ) {
6907
                        element = element.jquery || element.nodeType ?
6908
                                $( element ) :
6909
                                this.document.find( element ).eq( 0 );
6910
                }
6911 85ad3d82 Assos Assos
6912 503b3f7b Assos Assos
                if ( !element ) {
6913
                        element = this.element.closest( ".ui-front" );
6914
                }
6915 85ad3d82 Assos Assos
6916 503b3f7b Assos Assos
                if ( !element.length ) {
6917
                        element = this.document[0].body;
6918
                }
6919 85ad3d82 Assos Assos
6920 503b3f7b Assos Assos
                return element;
6921
        },
6922 85ad3d82 Assos Assos
6923 503b3f7b Assos Assos
        _initSource: function() {
6924
                var array, url,
6925
                        that = this;
6926
                if ( $.isArray(this.options.source) ) {
6927
                        array = this.options.source;
6928
                        this.source = function( request, response ) {
6929
                                response( $.ui.autocomplete.filter( array, request.term ) );
6930
                        };
6931
                } else if ( typeof this.options.source === "string" ) {
6932
                        url = this.options.source;
6933
                        this.source = function( request, response ) {
6934
                                if ( that.xhr ) {
6935
                                        that.xhr.abort();
6936
                                }
6937
                                that.xhr = $.ajax({
6938
                                        url: url,
6939
                                        data: request,
6940
                                        dataType: "json",
6941
                                        success: function( data ) {
6942
                                                response( data );
6943
                                        },
6944
                                        error: function() {
6945
                                                response( [] );
6946
                                        }
6947 85ad3d82 Assos Assos
                                });
6948 503b3f7b Assos Assos
                        };
6949
                } else {
6950
                        this.source = this.options.source;
6951 85ad3d82 Assos Assos
                }
6952
        },
6953
6954 503b3f7b Assos Assos
        _searchTimeout: function( event ) {
6955
                clearTimeout( this.searching );
6956
                this.searching = this._delay(function() {
6957
                        // only search if the value has changed
6958
                        if ( this.term !== this._value() ) {
6959
                                this.selectedItem = null;
6960
                                this.search( null, event );
6961
                        }
6962
                }, this.options.delay );
6963
        },
6964 85ad3d82 Assos Assos
6965 503b3f7b Assos Assos
        search: function( value, event ) {
6966
                value = value != null ? value : this._value();
6967 85ad3d82 Assos Assos
6968 503b3f7b Assos Assos
                // always save the actual value, not the one passed as an argument
6969
                this.term = this._value();
6970 85ad3d82 Assos Assos
6971 503b3f7b Assos Assos
                if ( value.length < this.options.minLength ) {
6972
                        return this.close( event );
6973 85ad3d82 Assos Assos
                }
6974
6975 503b3f7b Assos Assos
                if ( this._trigger( "search", event ) === false ) {
6976
                        return;
6977
                }
6978 85ad3d82 Assos Assos
6979 503b3f7b Assos Assos
                return this._search( value );
6980
        },
6981 85ad3d82 Assos Assos
6982 503b3f7b Assos Assos
        _search: function( value ) {
6983
                this.pending++;
6984
                this.element.addClass( "ui-autocomplete-loading" );
6985
                this.cancelSearch = false;
6986 85ad3d82 Assos Assos
6987 503b3f7b Assos Assos
                this.source( { term: value }, this._response() );
6988
        },
6989 85ad3d82 Assos Assos
6990 503b3f7b Assos Assos
        _response: function() {
6991
                var that = this,
6992
                        index = ++requestIndex;
6993 85ad3d82 Assos Assos
6994 503b3f7b Assos Assos
                return function( content ) {
6995
                        if ( index === requestIndex ) {
6996
                                that.__response( content );
6997
                        }
6998 85ad3d82 Assos Assos
6999 503b3f7b Assos Assos
                        that.pending--;
7000
                        if ( !that.pending ) {
7001
                                that.element.removeClass( "ui-autocomplete-loading" );
7002
                        }
7003
                };
7004 85ad3d82 Assos Assos
        },
7005
7006 503b3f7b Assos Assos
        __response: function( content ) {
7007
                if ( content ) {
7008
                        content = this._normalize( content );
7009
                }
7010
                this._trigger( "response", null, { content: content } );
7011
                if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
7012
                        this._suggest( content );
7013
                        this._trigger( "open" );
7014
                } else {
7015
                        // use ._close() instead of .close() so we don't cancel future searches
7016
                        this._close();
7017 85ad3d82 Assos Assos
                }
7018
        },
7019
7020 503b3f7b Assos Assos
        close: function( event ) {
7021
                this.cancelSearch = true;
7022
                this._close( event );
7023 85ad3d82 Assos Assos
        },
7024
7025 503b3f7b Assos Assos
        _close: function( event ) {
7026
                if ( this.menu.element.is( ":visible" ) ) {
7027
                        this.menu.element.hide();
7028
                        this.menu.blur();
7029
                        this.isNewMenu = true;
7030
                        this._trigger( "close", event );
7031 85ad3d82 Assos Assos
                }
7032 503b3f7b Assos Assos
        },
7033 85ad3d82 Assos Assos
7034 503b3f7b Assos Assos
        _change: function( event ) {
7035
                if ( this.previous !== this._value() ) {
7036
                        this._trigger( "change", event, { item: this.selectedItem } );
7037
                }
7038 85ad3d82 Assos Assos
        },
7039
7040 503b3f7b Assos Assos
        _normalize: function( items ) {
7041
                // assume all items have the right format when the first item is complete
7042
                if ( items.length && items[0].label && items[0].value ) {
7043
                        return items;
7044 85ad3d82 Assos Assos
                }
7045 503b3f7b Assos Assos
                return $.map( items, function( item ) {
7046
                        if ( typeof item === "string" ) {
7047
                                return {
7048
                                        label: item,
7049
                                        value: item
7050
                                };
7051 85ad3d82 Assos Assos
                        }
7052 503b3f7b Assos Assos
                        return $.extend({
7053
                                label: item.label || item.value,
7054
                                value: item.value || item.label
7055
                        }, item );
7056
                });
7057 85ad3d82 Assos Assos
        },
7058
7059 503b3f7b Assos Assos
        _suggest: function( items ) {
7060
                var ul = this.menu.element.empty();
7061
                this._renderMenu( ul, items );
7062
                this.isNewMenu = true;
7063
                this.menu.refresh();
7064 85ad3d82 Assos Assos
7065 503b3f7b Assos Assos
                // size and position menu
7066
                ul.show();
7067
                this._resizeMenu();
7068
                ul.position( $.extend({
7069
                        of: this.element
7070
                }, this.options.position ));
7071 85ad3d82 Assos Assos
7072 503b3f7b Assos Assos
                if ( this.options.autoFocus ) {
7073
                        this.menu.next();
7074 85ad3d82 Assos Assos
                }
7075 503b3f7b Assos Assos
        },
7076 85ad3d82 Assos Assos
7077 503b3f7b Assos Assos
        _resizeMenu: function() {
7078
                var ul = this.menu.element;
7079
                ul.outerWidth( Math.max(
7080
                        // Firefox wraps long text (possibly a rounding bug)
7081
                        // so we add 1px to avoid the wrapping (#7513)
7082
                        ul.width( "" ).outerWidth() + 1,
7083
                        this.element.outerWidth()
7084
                ) );
7085
        },
7086 85ad3d82 Assos Assos
7087 503b3f7b Assos Assos
        _renderMenu: function( ul, items ) {
7088
                var that = this;
7089
                $.each( items, function( index, item ) {
7090
                        that._renderItemData( ul, item );
7091
                });
7092 85ad3d82 Assos Assos
        },
7093
7094 503b3f7b Assos Assos
        _renderItemData: function( ul, item ) {
7095
                return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
7096
        },
7097 85ad3d82 Assos Assos
7098 503b3f7b Assos Assos
        _renderItem: function( ul, item ) {
7099
                return $( "<li>" )
7100
                        .append( $( "<a>" ).text( item.label ) )
7101
                        .appendTo( ul );
7102
        },
7103 85ad3d82 Assos Assos
7104 503b3f7b Assos Assos
        _move: function( direction, event ) {
7105
                if ( !this.menu.element.is( ":visible" ) ) {
7106
                        this.search( null, event );
7107
                        return;
7108 85ad3d82 Assos Assos
                }
7109 503b3f7b Assos Assos
                if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
7110
                                this.menu.isLastItem() && /^next/.test( direction ) ) {
7111
                        this._value( this.term );
7112
                        this.menu.blur();
7113
                        return;
7114
                }
7115
                this.menu[ direction ]( event );
7116 85ad3d82 Assos Assos
        },
7117
7118 503b3f7b Assos Assos
        widget: function() {
7119
                return this.menu.element;
7120 85ad3d82 Assos Assos
        },
7121
7122 503b3f7b Assos Assos
        _value: function() {
7123
                return this.valueMethod.apply( this.element, arguments );
7124 85ad3d82 Assos Assos
        },
7125
7126 503b3f7b Assos Assos
        _keyEvent: function( keyEvent, event ) {
7127
                if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
7128
                        this._move( keyEvent, event );
7129 85ad3d82 Assos Assos
7130 503b3f7b Assos Assos
                        // prevents moving cursor to beginning/end of the text field in some browsers
7131
                        event.preventDefault();
7132 85ad3d82 Assos Assos
                }
7133 503b3f7b Assos Assos
        }
7134
});
7135
7136
$.extend( $.ui.autocomplete, {
7137
        escapeRegex: function( value ) {
7138
                return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
7139
        },
7140
        filter: function(array, term) {
7141
                var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
7142
                return $.grep( array, function(value) {
7143
                        return matcher.test( value.label || value.value || value );
7144
                });
7145
        }
7146
});
7147 85ad3d82 Assos Assos
7148
7149 503b3f7b Assos Assos
// live region extension, adding a `messages` option
7150
// NOTE: This is an experimental API. We are still investigating
7151
// a full solution for string manipulation and internationalization.
7152
$.widget( "ui.autocomplete", $.ui.autocomplete, {
7153
        options: {
7154
                messages: {
7155
                        noResults: "No search results.",
7156
                        results: function( amount ) {
7157
                                return amount + ( amount > 1 ? " results are" : " result is" ) +
7158
                                        " available, use up and down arrow keys to navigate.";
7159
                        }
7160
                }
7161
        },
7162 85ad3d82 Assos Assos
7163 503b3f7b Assos Assos
        __response: function( content ) {
7164
                var message;
7165
                this._superApply( arguments );
7166
                if ( this.options.disabled || this.cancelSearch ) {
7167 85ad3d82 Assos Assos
                        return;
7168
                }
7169 503b3f7b Assos Assos
                if ( content && content.length ) {
7170
                        message = this.options.messages.results( content.length );
7171
                } else {
7172
                        message = this.options.messages.noResults;
7173
                }
7174
                this.liveRegion.text( message );
7175
        }
7176
});
7177 85ad3d82 Assos Assos
7178 503b3f7b Assos Assos
}( jQuery ));
7179 85ad3d82 Assos Assos
7180 503b3f7b Assos Assos
(function( $, undefined ) {
7181 85ad3d82 Assos Assos
7182 503b3f7b Assos Assos
var lastActive, startXPos, startYPos, clickDragged,
7183
        baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
7184
        stateClasses = "ui-state-hover ui-state-active ",
7185
        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",
7186
        formResetHandler = function() {
7187
                var buttons = $( this ).find( ":ui-button" );
7188
                setTimeout(function() {
7189
                        buttons.button( "refresh" );
7190
                }, 1 );
7191
        },
7192
        radioGroup = function( radio ) {
7193
                var name = radio.name,
7194
                        form = radio.form,
7195
                        radios = $( [] );
7196
                if ( name ) {
7197
                        name = name.replace( /'/g, "\\'" );
7198
                        if ( form ) {
7199
                                radios = $( form ).find( "[name='" + name + "']" );
7200
                        } else {
7201
                                radios = $( "[name='" + name + "']", radio.ownerDocument )
7202
                                        .filter(function() {
7203
                                                return !this.form;
7204
                                        });
7205
                        }
7206 85ad3d82 Assos Assos
                }
7207 503b3f7b Assos Assos
                return radios;
7208
        };
7209 85ad3d82 Assos Assos
7210 503b3f7b Assos Assos
$.widget( "ui.button", {
7211
        version: "1.10.2",
7212
        defaultElement: "<button>",
7213
        options: {
7214
                disabled: null,
7215
                text: true,
7216
                label: null,
7217
                icons: {
7218
                        primary: null,
7219
                        secondary: null
7220
                }
7221 85ad3d82 Assos Assos
        },
7222 503b3f7b Assos Assos
        _create: function() {
7223
                this.element.closest( "form" )
7224
                        .unbind( "reset" + this.eventNamespace )
7225
                        .bind( "reset" + this.eventNamespace, formResetHandler );
7226 85ad3d82 Assos Assos
7227 503b3f7b Assos Assos
                if ( typeof this.options.disabled !== "boolean" ) {
7228
                        this.options.disabled = !!this.element.prop( "disabled" );
7229
                } else {
7230
                        this.element.prop( "disabled", this.options.disabled );
7231
                }
7232 85ad3d82 Assos Assos
7233 503b3f7b Assos Assos
                this._determineButtonType();
7234
                this.hasTitle = !!this.buttonElement.attr( "title" );
7235 85ad3d82 Assos Assos
7236 503b3f7b Assos Assos
                var that = this,
7237
                        options = this.options,
7238
                        toggleButton = this.type === "checkbox" || this.type === "radio",
7239
                        activeClass = !toggleButton ? "ui-state-active" : "",
7240
                        focusClass = "ui-state-focus";
7241 85ad3d82 Assos Assos
7242 503b3f7b Assos Assos
                if ( options.label === null ) {
7243
                        options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
7244
                }
7245 85ad3d82 Assos Assos
7246 503b3f7b Assos Assos
                this._hoverable( this.buttonElement );
7247 85ad3d82 Assos Assos
7248 503b3f7b Assos Assos
                this.buttonElement
7249
                        .addClass( baseClasses )
7250
                        .attr( "role", "button" )
7251
                        .bind( "mouseenter" + this.eventNamespace, function() {
7252
                                if ( options.disabled ) {
7253
                                        return;
7254
                                }
7255
                                if ( this === lastActive ) {
7256
                                        $( this ).addClass( "ui-state-active" );
7257
                                }
7258
                        })
7259
                        .bind( "mouseleave" + this.eventNamespace, function() {
7260
                                if ( options.disabled ) {
7261
                                        return;
7262
                                }
7263
                                $( this ).removeClass( activeClass );
7264
                        })
7265
                        .bind( "click" + this.eventNamespace, function( event ) {
7266
                                if ( options.disabled ) {
7267
                                        event.preventDefault();
7268
                                        event.stopImmediatePropagation();
7269
                                }
7270
                        });
7271 85ad3d82 Assos Assos
7272 503b3f7b Assos Assos
                this.element
7273
                        .bind( "focus" + this.eventNamespace, function() {
7274
                                // no need to check disabled, focus won't be triggered anyway
7275
                                that.buttonElement.addClass( focusClass );
7276
                        })
7277
                        .bind( "blur" + this.eventNamespace, function() {
7278
                                that.buttonElement.removeClass( focusClass );
7279
                        });
7280 85ad3d82 Assos Assos
7281 503b3f7b Assos Assos
                if ( toggleButton ) {
7282
                        this.element.bind( "change" + this.eventNamespace, function() {
7283
                                if ( clickDragged ) {
7284
                                        return;
7285
                                }
7286
                                that.refresh();
7287
                        });
7288
                        // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
7289
                        // prevents issue where button state changes but checkbox/radio checked state
7290
                        // does not in Firefox (see ticket #6970)
7291
                        this.buttonElement
7292
                                .bind( "mousedown" + this.eventNamespace, function( event ) {
7293
                                        if ( options.disabled ) {
7294
                                                return;
7295
                                        }
7296
                                        clickDragged = false;
7297
                                        startXPos = event.pageX;
7298
                                        startYPos = event.pageY;
7299
                                })
7300
                                .bind( "mouseup" + this.eventNamespace, function( event ) {
7301
                                        if ( options.disabled ) {
7302
                                                return;
7303
                                        }
7304
                                        if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
7305
                                                clickDragged = true;
7306
                                        }
7307
                        });
7308
                }
7309 85ad3d82 Assos Assos
7310 503b3f7b Assos Assos
                if ( this.type === "checkbox" ) {
7311
                        this.buttonElement.bind( "click" + this.eventNamespace, function() {
7312
                                if ( options.disabled || clickDragged ) {
7313
                                        return false;
7314
                                }
7315
                        });
7316
                } else if ( this.type === "radio" ) {
7317
                        this.buttonElement.bind( "click" + this.eventNamespace, function() {
7318
                                if ( options.disabled || clickDragged ) {
7319
                                        return false;
7320
                                }
7321
                                $( this ).addClass( "ui-state-active" );
7322
                                that.buttonElement.attr( "aria-pressed", "true" );
7323 85ad3d82 Assos Assos
7324 503b3f7b Assos Assos
                                var radio = that.element[ 0 ];
7325
                                radioGroup( radio )
7326
                                        .not( radio )
7327
                                        .map(function() {
7328
                                                return $( this ).button( "widget" )[ 0 ];
7329
                                        })
7330
                                        .removeClass( "ui-state-active" )
7331
                                        .attr( "aria-pressed", "false" );
7332
                        });
7333
                } else {
7334
                        this.buttonElement
7335
                                .bind( "mousedown" + this.eventNamespace, function() {
7336
                                        if ( options.disabled ) {
7337
                                                return false;
7338
                                        }
7339
                                        $( this ).addClass( "ui-state-active" );
7340
                                        lastActive = this;
7341
                                        that.document.one( "mouseup", function() {
7342
                                                lastActive = null;
7343 85ad3d82 Assos Assos
                                        });
7344 503b3f7b Assos Assos
                                })
7345
                                .bind( "mouseup" + this.eventNamespace, function() {
7346
                                        if ( options.disabled ) {
7347
                                                return false;
7348
                                        }
7349
                                        $( this ).removeClass( "ui-state-active" );
7350
                                })
7351
                                .bind( "keydown" + this.eventNamespace, function(event) {
7352
                                        if ( options.disabled ) {
7353
                                                return false;
7354
                                        }
7355
                                        if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
7356
                                                $( this ).addClass( "ui-state-active" );
7357
                                        }
7358
                                })
7359
                                // see #8559, we bind to blur here in case the button element loses
7360
                                // focus between keydown and keyup, it would be left in an "active" state
7361
                                .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
7362
                                        $( this ).removeClass( "ui-state-active" );
7363
                                });
7364 85ad3d82 Assos Assos
7365 503b3f7b Assos Assos
                        if ( this.buttonElement.is("a") ) {
7366
                                this.buttonElement.keyup(function(event) {
7367
                                        if ( event.keyCode === $.ui.keyCode.SPACE ) {
7368
                                                // TODO pass through original event correctly (just as 2nd argument doesn't work)
7369
                                                $( this ).click();
7370
                                        }
7371
                                });
7372 85ad3d82 Assos Assos
                        }
7373
                }
7374
7375 503b3f7b Assos Assos
                // TODO: pull out $.Widget's handling for the disabled option into
7376
                // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
7377
                // be overridden by individual plugins
7378
                this._setOption( "disabled", options.disabled );
7379
                this._resetButton();
7380 85ad3d82 Assos Assos
        },
7381
7382 503b3f7b Assos Assos
        _determineButtonType: function() {
7383
                var ancestor, labelSelector, checked;
7384 85ad3d82 Assos Assos
7385 503b3f7b Assos Assos
                if ( this.element.is("[type=checkbox]") ) {
7386
                        this.type = "checkbox";
7387
                } else if ( this.element.is("[type=radio]") ) {
7388
                        this.type = "radio";
7389
                } else if ( this.element.is("input") ) {
7390
                        this.type = "input";
7391
                } else {
7392
                        this.type = "button";
7393 85ad3d82 Assos Assos
                }
7394
7395 503b3f7b Assos Assos
                if ( this.type === "checkbox" || this.type === "radio" ) {
7396
                        // we don't search against the document in case the element
7397
                        // is disconnected from the DOM
7398
                        ancestor = this.element.parents().last();
7399
                        labelSelector = "label[for='" + this.element.attr("id") + "']";
7400
                        this.buttonElement = ancestor.find( labelSelector );
7401
                        if ( !this.buttonElement.length ) {
7402
                                ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
7403
                                this.buttonElement = ancestor.filter( labelSelector );
7404
                                if ( !this.buttonElement.length ) {
7405
                                        this.buttonElement = ancestor.find( labelSelector );
7406
                                }
7407
                        }
7408
                        this.element.addClass( "ui-helper-hidden-accessible" );
7409 85ad3d82 Assos Assos
7410 503b3f7b Assos Assos
                        checked = this.element.is( ":checked" );
7411
                        if ( checked ) {
7412
                                this.buttonElement.addClass( "ui-state-active" );
7413 85ad3d82 Assos Assos
                        }
7414 503b3f7b Assos Assos
                        this.buttonElement.prop( "aria-pressed", checked );
7415
                } else {
7416
                        this.buttonElement = this.element;
7417 85ad3d82 Assos Assos
                }
7418 503b3f7b Assos Assos
        },
7419 85ad3d82 Assos Assos
7420 503b3f7b Assos Assos
        widget: function() {
7421
                return this.buttonElement;
7422
        },
7423 85ad3d82 Assos Assos
7424 503b3f7b Assos Assos
        _destroy: function() {
7425
                this.element
7426
                        .removeClass( "ui-helper-hidden-accessible" );
7427
                this.buttonElement
7428
                        .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
7429
                        .removeAttr( "role" )
7430
                        .removeAttr( "aria-pressed" )
7431
                        .html( this.buttonElement.find(".ui-button-text").html() );
7432 85ad3d82 Assos Assos
7433 503b3f7b Assos Assos
                if ( !this.hasTitle ) {
7434
                        this.buttonElement.removeAttr( "title" );
7435
                }
7436 85ad3d82 Assos Assos
        },
7437
7438 503b3f7b Assos Assos
        _setOption: function( key, value ) {
7439
                this._super( key, value );
7440
                if ( key === "disabled" ) {
7441
                        if ( value ) {
7442
                                this.element.prop( "disabled", true );
7443
                        } else {
7444
                                this.element.prop( "disabled", false );
7445
                        }
7446
                        return;
7447
                }
7448
                this._resetButton();
7449
        },
7450 85ad3d82 Assos Assos
7451 503b3f7b Assos Assos
        refresh: function() {
7452
                //See #8237 & #8828
7453
                var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
7454 85ad3d82 Assos Assos
7455 503b3f7b Assos Assos
                if ( isDisabled !== this.options.disabled ) {
7456
                        this._setOption( "disabled", isDisabled );
7457
                }
7458
                if ( this.type === "radio" ) {
7459
                        radioGroup( this.element[0] ).each(function() {
7460
                                if ( $( this ).is( ":checked" ) ) {
7461
                                        $( this ).button( "widget" )
7462
                                                .addClass( "ui-state-active" )
7463
                                                .attr( "aria-pressed", "true" );
7464
                                } else {
7465
                                        $( this ).button( "widget" )
7466
                                                .removeClass( "ui-state-active" )
7467
                                                .attr( "aria-pressed", "false" );
7468 85ad3d82 Assos Assos
                                }
7469 503b3f7b Assos Assos
                        });
7470
                } else if ( this.type === "checkbox" ) {
7471
                        if ( this.element.is( ":checked" ) ) {
7472
                                this.buttonElement
7473
                                        .addClass( "ui-state-active" )
7474
                                        .attr( "aria-pressed", "true" );
7475
                        } else {
7476
                                this.buttonElement
7477
                                        .removeClass( "ui-state-active" )
7478
                                        .attr( "aria-pressed", "false" );
7479
                        }
7480
                }
7481
        },
7482 85ad3d82 Assos Assos
7483 503b3f7b Assos Assos
        _resetButton: function() {
7484
                if ( this.type === "input" ) {
7485
                        if ( this.options.label ) {
7486
                                this.element.val( this.options.label );
7487
                        }
7488
                        return;
7489
                }
7490
                var buttonElement = this.buttonElement.removeClass( typeClasses ),
7491
                        buttonText = $( "<span></span>", this.document[0] )
7492
                                .addClass( "ui-button-text" )
7493
                                .html( this.options.label )
7494
                                .appendTo( buttonElement.empty() )
7495
                                .text(),
7496
                        icons = this.options.icons,
7497
                        multipleIcons = icons.primary && icons.secondary,
7498
                        buttonClasses = [];
7499 85ad3d82 Assos Assos
7500 503b3f7b Assos Assos
                if ( icons.primary || icons.secondary ) {
7501
                        if ( this.options.text ) {
7502
                                buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
7503
                        }
7504 85ad3d82 Assos Assos
7505 503b3f7b Assos Assos
                        if ( icons.primary ) {
7506
                                buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
7507
                        }
7508 85ad3d82 Assos Assos
7509 503b3f7b Assos Assos
                        if ( icons.secondary ) {
7510
                                buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
7511
                        }
7512 85ad3d82 Assos Assos
7513 503b3f7b Assos Assos
                        if ( !this.options.text ) {
7514
                                buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
7515 85ad3d82 Assos Assos
7516 503b3f7b Assos Assos
                                if ( !this.hasTitle ) {
7517
                                        buttonElement.attr( "title", $.trim( buttonText ) );
7518 85ad3d82 Assos Assos
                                }
7519 503b3f7b Assos Assos
                        }
7520
                } else {
7521
                        buttonClasses.push( "ui-button-text-only" );
7522 85ad3d82 Assos Assos
                }
7523 503b3f7b Assos Assos
                buttonElement.addClass( buttonClasses.join( " " ) );
7524
        }
7525
});
7526 85ad3d82 Assos Assos
7527 503b3f7b Assos Assos
$.widget( "ui.buttonset", {
7528
        version: "1.10.2",
7529
        options: {
7530
                items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
7531 85ad3d82 Assos Assos
        },
7532
7533 503b3f7b Assos Assos
        _create: function() {
7534
                this.element.addClass( "ui-buttonset" );
7535 85ad3d82 Assos Assos
        },
7536
7537 503b3f7b Assos Assos
        _init: function() {
7538
                this.refresh();
7539 85ad3d82 Assos Assos
        },
7540
7541 503b3f7b Assos Assos
        _setOption: function( key, value ) {
7542
                if ( key === "disabled" ) {
7543
                        this.buttons.button( "option", key, value );
7544 85ad3d82 Assos Assos
                }
7545
7546 503b3f7b Assos Assos
                this._super( key, value );
7547 85ad3d82 Assos Assos
        },
7548
7549 503b3f7b Assos Assos
        refresh: function() {
7550
                var rtl = this.element.css( "direction" ) === "rtl";
7551 85ad3d82 Assos Assos
7552 503b3f7b Assos Assos
                this.buttons = this.element.find( this.options.items )
7553
                        .filter( ":ui-button" )
7554
                                .button( "refresh" )
7555
                        .end()
7556
                        .not( ":ui-button" )
7557
                                .button()
7558
                        .end()
7559
                        .map(function() {
7560
                                return $( this ).button( "widget" )[ 0 ];
7561
                        })
7562
                                .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
7563
                                .filter( ":first" )
7564
                                        .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
7565
                                .end()
7566
                                .filter( ":last" )
7567
                                        .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
7568
                                .end()
7569
                        .end();
7570 85ad3d82 Assos Assos
        },
7571
7572 503b3f7b Assos Assos
        _destroy: function() {
7573
                this.element.removeClass( "ui-buttonset" );
7574
                this.buttons
7575
                        .map(function() {
7576
                                return $( this ).button( "widget" )[ 0 ];
7577
                        })
7578
                                .removeClass( "ui-corner-left ui-corner-right" )
7579
                        .end()
7580
                        .button( "destroy" );
7581
        }
7582
});
7583 85ad3d82 Assos Assos
7584 503b3f7b Assos Assos
}( jQuery ) );
7585 85ad3d82 Assos Assos
7586 503b3f7b Assos Assos
(function( $, undefined ) {
7587 85ad3d82 Assos Assos
7588 503b3f7b Assos Assos
$.extend($.ui, { datepicker: { version: "1.10.2" } });
7589 85ad3d82 Assos Assos
7590 503b3f7b Assos Assos
var PROP_NAME = "datepicker",
7591
        dpuuid = new Date().getTime(),
7592
        instActive;
7593
7594
/* Date picker manager.
7595
   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
7596
   Settings for (groups of) date pickers are maintained in an instance object,
7597
   allowing multiple different settings on the same page. */
7598
7599
function Datepicker() {
7600
        this._curInst = null; // The current instance in use
7601
        this._keyEvent = false; // If the last event was a key event
7602
        this._disabledInputs = []; // List of date picker inputs that have been disabled
7603
        this._datepickerShowing = false; // True if the popup picker is showing , false if not
7604
        this._inDialog = false; // True if showing within a "dialog", false if not
7605
        this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
7606
        this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
7607
        this._appendClass = "ui-datepicker-append"; // The name of the append marker class
7608
        this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
7609
        this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
7610
        this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
7611
        this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
7612
        this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
7613
        this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
7614
        this.regional = []; // Available regional settings, indexed by language code
7615
        this.regional[""] = { // Default regional settings
7616
                closeText: "Done", // Display text for close link
7617
                prevText: "Prev", // Display text for previous month link
7618
                nextText: "Next", // Display text for next month link
7619
                currentText: "Today", // Display text for current month link
7620
                monthNames: ["January","February","March","April","May","June",
7621
                        "July","August","September","October","November","December"], // Names of months for drop-down and formatting
7622
                monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
7623
                dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
7624
                dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
7625
                dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
7626
                weekHeader: "Wk", // Column header for week of the year
7627
                dateFormat: "mm/dd/yy", // See format options on parseDate
7628
                firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
7629
                isRTL: false, // True if right-to-left language, false if left-to-right
7630
                showMonthAfterYear: false, // True if the year select precedes month, false for month then year
7631
                yearSuffix: "" // Additional text to append to the year in the month headers
7632
        };
7633
        this._defaults = { // Global defaults for all the date picker instances
7634
                showOn: "focus", // "focus" for popup on focus,
7635
                        // "button" for trigger button, or "both" for either
7636
                showAnim: "fadeIn", // Name of jQuery animation for popup
7637
                showOptions: {}, // Options for enhanced animations
7638
                defaultDate: null, // Used when field is blank: actual date,
7639
                        // +/-number for offset from today, null for today
7640
                appendText: "", // Display text following the input box, e.g. showing the format
7641
                buttonText: "...", // Text for trigger button
7642
                buttonImage: "", // URL for trigger button image
7643
                buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
7644
                hideIfNoPrevNext: false, // True to hide next/previous month links
7645
                        // if not applicable, false to just disable them
7646
                navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
7647
                gotoCurrent: false, // True if today link goes back to current selection instead
7648
                changeMonth: false, // True if month can be selected directly, false if only prev/next
7649
                changeYear: false, // True if year can be selected directly, false if only prev/next
7650
                yearRange: "c-10:c+10", // Range of years to display in drop-down,
7651
                        // either relative to today's year (-nn:+nn), relative to currently displayed year
7652
                        // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
7653
                showOtherMonths: false, // True to show dates in other months, false to leave blank
7654
                selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
7655
                showWeek: false, // True to show week of the year, false to not show it
7656
                calculateWeek: this.iso8601Week, // How to calculate the week of the year,
7657
                        // takes a Date and returns the number of the week for it
7658
                shortYearCutoff: "+10", // Short year values < this are in the current century,
7659
                        // > this are in the previous century,
7660
                        // string value starting with "+" for current year + value
7661
                minDate: null, // The earliest selectable date, or null for no limit
7662
                maxDate: null, // The latest selectable date, or null for no limit
7663
                duration: "fast", // Duration of display/closure
7664
                beforeShowDay: null, // Function that takes a date and returns an array with
7665
                        // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
7666
                        // [2] = cell title (optional), e.g. $.datepicker.noWeekends
7667
                beforeShow: null, // Function that takes an input field and
7668
                        // returns a set of custom settings for the date picker
7669
                onSelect: null, // Define a callback function when a date is selected
7670
                onChangeMonthYear: null, // Define a callback function when the month or year is changed
7671
                onClose: null, // Define a callback function when the datepicker is closed
7672
                numberOfMonths: 1, // Number of months to show at a time
7673
                showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
7674
                stepMonths: 1, // Number of months to step back/forward
7675
                stepBigMonths: 12, // Number of months to step back/forward for the big links
7676
                altField: "", // Selector for an alternate field to store selected dates into
7677
                altFormat: "", // The date format to use for the alternate field
7678
                constrainInput: true, // The input is constrained by the current date format
7679
                showButtonPanel: false, // True to show button panel, false to not show it
7680
                autoSize: false, // True to size the input for the date format, false to leave as is
7681
                disabled: false // The initial disabled state
7682
        };
7683
        $.extend(this._defaults, this.regional[""]);
7684
        this.dpDiv = bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
7685
}
7686
7687
$.extend(Datepicker.prototype, {
7688
        /* Class name added to elements to indicate already configured with a date picker. */
7689
        markerClassName: "hasDatepicker",
7690
7691
        //Keep track of the maximum number of rows displayed (see #7043)
7692
        maxRows: 4,
7693
7694
        // TODO rename to "widget" when switching to widget factory
7695
        _widgetDatepicker: function() {
7696
                return this.dpDiv;
7697 85ad3d82 Assos Assos
        },
7698
7699 503b3f7b Assos Assos
        /* Override the default settings for all instances of the date picker.
7700
         * @param  settings  object - the new settings to use as defaults (anonymous object)
7701
         * @return the manager object
7702
         */
7703
        setDefaults: function(settings) {
7704
                extendRemove(this._defaults, settings || {});
7705
                return this;
7706 85ad3d82 Assos Assos
        },
7707
7708 503b3f7b Assos Assos
        /* Attach the date picker to a jQuery selection.
7709
         * @param  target        element - the target input field or division or span
7710
         * @param  settings  object - the new settings to use for this date picker instance (anonymous)
7711
         */
7712
        _attachDatepicker: function(target, settings) {
7713
                var nodeName, inline, inst;
7714
                nodeName = target.nodeName.toLowerCase();
7715
                inline = (nodeName === "div" || nodeName === "span");
7716
                if (!target.id) {
7717
                        this.uuid += 1;
7718
                        target.id = "dp" + this.uuid;
7719
                }
7720
                inst = this._newInst($(target), inline);
7721
                inst.settings = $.extend({}, settings || {});
7722
                if (nodeName === "input") {
7723
                        this._connectDatepicker(target, inst);
7724
                } else if (inline) {
7725
                        this._inlineDatepicker(target, inst);
7726
                }
7727 85ad3d82 Assos Assos
        },
7728
7729 503b3f7b Assos Assos
        /* Create a new instance object. */
7730
        _newInst: function(target, inline) {
7731
                var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
7732
                return {id: id, input: target, // associated target
7733
                        selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
7734
                        drawMonth: 0, drawYear: 0, // month being drawn
7735
                        inline: inline, // is datepicker inline or not
7736
                        dpDiv: (!inline ? this.dpDiv : // presentation div
7737
                        bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
7738 85ad3d82 Assos Assos
        },
7739
7740 503b3f7b Assos Assos
        /* Attach the date picker to an input field. */
7741
        _connectDatepicker: function(target, inst) {
7742
                var input = $(target);
7743
                inst.append = $([]);
7744
                inst.trigger = $([]);
7745
                if (input.hasClass(this.markerClassName)) {
7746 85ad3d82 Assos Assos
                        return;
7747
                }
7748 503b3f7b Assos Assos
                this._attachments(input, inst);
7749
                input.addClass(this.markerClassName).keydown(this._doKeyDown).
7750
                        keypress(this._doKeyPress).keyup(this._doKeyUp);
7751
                this._autoSize(inst);
7752
                $.data(target, PROP_NAME, inst);
7753
                //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
7754
                if( inst.settings.disabled ) {
7755
                        this._disableDatepicker( target );
7756 85ad3d82 Assos Assos
                }
7757
        },
7758
7759 503b3f7b Assos Assos
        /* Make attachments based on settings. */
7760
        _attachments: function(input, inst) {
7761
                var showOn, buttonText, buttonImage,
7762
                        appendText = this._get(inst, "appendText"),
7763
                        isRTL = this._get(inst, "isRTL");
7764 85ad3d82 Assos Assos
7765 503b3f7b Assos Assos
                if (inst.append) {
7766
                        inst.append.remove();
7767
                }
7768
                if (appendText) {
7769
                        inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
7770
                        input[isRTL ? "before" : "after"](inst.append);
7771
                }
7772 85ad3d82 Assos Assos
7773 503b3f7b Assos Assos
                input.unbind("focus", this._showDatepicker);
7774 85ad3d82 Assos Assos
7775 503b3f7b Assos Assos
                if (inst.trigger) {
7776
                        inst.trigger.remove();
7777
                }
7778 85ad3d82 Assos Assos
7779 503b3f7b Assos Assos
                showOn = this._get(inst, "showOn");
7780
                if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
7781
                        input.focus(this._showDatepicker);
7782
                }
7783
                if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
7784
                        buttonText = this._get(inst, "buttonText");
7785
                        buttonImage = this._get(inst, "buttonImage");
7786
                        inst.trigger = $(this._get(inst, "buttonImageOnly") ?
7787
                                $("<img/>").addClass(this._triggerClass).
7788
                                        attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
7789
                                $("<button type='button'></button>").addClass(this._triggerClass).
7790
                                        html(!buttonImage ? buttonText : $("<img/>").attr(
7791
                                        { src:buttonImage, alt:buttonText, title:buttonText })));
7792
                        input[isRTL ? "before" : "after"](inst.trigger);
7793
                        inst.trigger.click(function() {
7794
                                if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
7795
                                        $.datepicker._hideDatepicker();
7796
                                } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
7797
                                        $.datepicker._hideDatepicker();
7798
                                        $.datepicker._showDatepicker(input[0]);
7799
                                } else {
7800
                                        $.datepicker._showDatepicker(input[0]);
7801 85ad3d82 Assos Assos
                                }
7802 503b3f7b Assos Assos
                                return false;
7803 85ad3d82 Assos Assos
                        });
7804 503b3f7b Assos Assos
                }
7805 85ad3d82 Assos Assos
        },
7806
7807 503b3f7b Assos Assos
        /* Apply the maximum length for the date format. */
7808
        _autoSize: function(inst) {
7809
                if (this._get(inst, "autoSize") && !inst.inline) {
7810
                        var findMax, max, maxI, i,
7811
                                date = new Date(2009, 12 - 1, 20), // Ensure double digits
7812
                                dateFormat = this._get(inst, "dateFormat");
7813
7814
                        if (dateFormat.match(/[DM]/)) {
7815
                                findMax = function(names) {
7816
                                        max = 0;
7817
                                        maxI = 0;
7818
                                        for (i = 0; i < names.length; i++) {
7819
                                                if (names[i].length > max) {
7820
                                                        max = names[i].length;
7821
                                                        maxI = i;
7822
                                                }
7823
                                        }
7824
                                        return maxI;
7825
                                };
7826
                                date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
7827
                                        "monthNames" : "monthNamesShort"))));
7828
                                date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
7829
                                        "dayNames" : "dayNamesShort"))) + 20 - date.getDay());
7830 85ad3d82 Assos Assos
                        }
7831 503b3f7b Assos Assos
                        inst.input.attr("size", this._formatDate(inst, date).length);
7832 85ad3d82 Assos Assos
                }
7833
        },
7834
7835 503b3f7b Assos Assos
        /* Attach an inline date picker to a div. */
7836
        _inlineDatepicker: function(target, inst) {
7837
                var divSpan = $(target);
7838
                if (divSpan.hasClass(this.markerClassName)) {
7839
                        return;
7840
                }
7841
                divSpan.addClass(this.markerClassName).append(inst.dpDiv);
7842
                $.data(target, PROP_NAME, inst);
7843
                this._setDate(inst, this._getDefaultDate(inst), true);
7844
                this._updateDatepicker(inst);
7845
                this._updateAlternate(inst);
7846
                //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
7847
                if( inst.settings.disabled ) {
7848
                        this._disableDatepicker( target );
7849
                }
7850
                // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
7851
                // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
7852
                inst.dpDiv.css( "display", "block" );
7853 85ad3d82 Assos Assos
        },
7854
7855 503b3f7b Assos Assos
        /* Pop-up the date picker in a "dialog" box.
7856
         * @param  input element - ignored
7857
         * @param  date        string or Date - the initial date to display
7858
         * @param  onSelect  function - the function to call when a date is selected
7859
         * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
7860
         * @param  pos int[2] - coordinates for the dialog's position within the screen or
7861
         *                                        event - with x/y coordinates or
7862
         *                                        leave empty for default (screen centre)
7863
         * @return the manager object
7864
         */
7865
        _dialogDatepicker: function(input, date, onSelect, settings, pos) {
7866
                var id, browserWidth, browserHeight, scrollX, scrollY,
7867
                        inst = this._dialogInst; // internal instance
7868 85ad3d82 Assos Assos
7869 503b3f7b Assos Assos
                if (!inst) {
7870
                        this.uuid += 1;
7871
                        id = "dp" + this.uuid;
7872
                        this._dialogInput = $("<input type='text' id='" + id +
7873
                                "' style='position: absolute; top: -100px; width: 0px;'/>");
7874
                        this._dialogInput.keydown(this._doKeyDown);
7875
                        $("body").append(this._dialogInput);
7876
                        inst = this._dialogInst = this._newInst(this._dialogInput, false);
7877
                        inst.settings = {};
7878
                        $.data(this._dialogInput[0], PROP_NAME, inst);
7879
                }
7880
                extendRemove(inst.settings, settings || {});
7881
                date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
7882
                this._dialogInput.val(date);
7883
7884
                this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
7885
                if (!this._pos) {
7886
                        browserWidth = document.documentElement.clientWidth;
7887
                        browserHeight = document.documentElement.clientHeight;
7888
                        scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
7889
                        scrollY = document.documentElement.scrollTop || document.body.scrollTop;
7890
                        this._pos = // should use actual width/height below
7891
                                [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
7892
                }
7893
7894
                // move input on screen for focus, but hidden behind dialog
7895
                this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
7896
                inst.settings.onSelect = onSelect;
7897
                this._inDialog = true;
7898
                this.dpDiv.addClass(this._dialogClass);
7899
                this._showDatepicker(this._dialogInput[0]);
7900
                if ($.blockUI) {
7901
                        $.blockUI(this.dpDiv);
7902
                }
7903
                $.data(this._dialogInput[0], PROP_NAME, inst);
7904
                return this;
7905 85ad3d82 Assos Assos
        },
7906
7907 503b3f7b Assos Assos
        /* Detach a datepicker from its control.
7908
         * @param  target        element - the target input field or division or span
7909
         */
7910
        _destroyDatepicker: function(target) {
7911
                var nodeName,
7912
                        $target = $(target),
7913
                        inst = $.data(target, PROP_NAME);
7914
7915
                if (!$target.hasClass(this.markerClassName)) {
7916
                        return;
7917
                }
7918
7919
                nodeName = target.nodeName.toLowerCase();
7920
                $.removeData(target, PROP_NAME);
7921
                if (nodeName === "input") {
7922
                        inst.append.remove();
7923
                        inst.trigger.remove();
7924
                        $target.removeClass(this.markerClassName).
7925
                                unbind("focus", this._showDatepicker).
7926
                                unbind("keydown", this._doKeyDown).
7927
                                unbind("keypress", this._doKeyPress).
7928
                                unbind("keyup", this._doKeyUp);
7929
                } else if (nodeName === "div" || nodeName === "span") {
7930
                        $target.removeClass(this.markerClassName).empty();
7931
                }
7932 85ad3d82 Assos Assos
        },
7933
7934 503b3f7b Assos Assos
        /* Enable the date picker to a jQuery selection.
7935
         * @param  target        element - the target input field or division or span
7936
         */
7937
        _enableDatepicker: function(target) {
7938
                var nodeName, inline,
7939
                        $target = $(target),
7940
                        inst = $.data(target, PROP_NAME);
7941
7942
                if (!$target.hasClass(this.markerClassName)) {
7943
                        return;
7944
                }
7945
7946
                nodeName = target.nodeName.toLowerCase();
7947
                if (nodeName === "input") {
7948
                        target.disabled = false;
7949
                        inst.trigger.filter("button").
7950
                                each(function() { this.disabled = false; }).end().
7951
                                filter("img").css({opacity: "1.0", cursor: ""});
7952
                } else if (nodeName === "div" || nodeName === "span") {
7953
                        inline = $target.children("." + this._inlineClass);
7954
                        inline.children().removeClass("ui-state-disabled");
7955
                        inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
7956
                                prop("disabled", false);
7957
                }
7958
                this._disabledInputs = $.map(this._disabledInputs,
7959
                        function(value) { return (value === target ? null : value); }); // delete entry
7960 85ad3d82 Assos Assos
        },
7961
7962 503b3f7b Assos Assos
        /* Disable the date picker to a jQuery selection.
7963
         * @param  target        element - the target input field or division or span
7964
         */
7965
        _disableDatepicker: function(target) {
7966
                var nodeName, inline,
7967
                        $target = $(target),
7968
                        inst = $.data(target, PROP_NAME);
7969
7970
                if (!$target.hasClass(this.markerClassName)) {
7971 85ad3d82 Assos Assos
                        return;
7972
                }
7973 503b3f7b Assos Assos
7974
                nodeName = target.nodeName.toLowerCase();
7975
                if (nodeName === "input") {
7976
                        target.disabled = true;
7977
                        inst.trigger.filter("button").
7978
                                each(function() { this.disabled = true; }).end().
7979
                                filter("img").css({opacity: "0.5", cursor: "default"});
7980
                } else if (nodeName === "div" || nodeName === "span") {
7981
                        inline = $target.children("." + this._inlineClass);
7982
                        inline.children().addClass("ui-state-disabled");
7983
                        inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
7984
                                prop("disabled", true);
7985 85ad3d82 Assos Assos
                }
7986 503b3f7b Assos Assos
                this._disabledInputs = $.map(this._disabledInputs,
7987
                        function(value) { return (value === target ? null : value); }); // delete entry
7988
                this._disabledInputs[this._disabledInputs.length] = target;
7989 85ad3d82 Assos Assos
        },
7990
7991 503b3f7b Assos Assos
        /* Is the first field in a jQuery collection disabled as a datepicker?
7992
         * @param  target        element - the target input field or division or span
7993
         * @return boolean - true if disabled, false if enabled
7994
         */
7995
        _isDisabledDatepicker: function(target) {
7996
                if (!target) {
7997
                        return false;
7998
                }
7999
                for (var i = 0; i < this._disabledInputs.length; i++) {
8000
                        if (this._disabledInputs[i] === target) {
8001
                                return true;
8002 85ad3d82 Assos Assos
                        }
8003 503b3f7b Assos Assos
                }
8004
                return false;
8005
        },
8006 85ad3d82 Assos Assos
8007 503b3f7b Assos Assos
        /* Retrieve the instance data for the target control.
8008
         * @param  target  element - the target input field or division or span
8009
         * @return  object - the associated instance data
8010
         * @throws  error if a jQuery problem getting data
8011
         */
8012
        _getInst: function(target) {
8013
                try {
8014
                        return $.data(target, PROP_NAME);
8015
                }
8016
                catch (err) {
8017
                        throw "Missing instance data for this datepicker";
8018 85ad3d82 Assos Assos
                }
8019
        },
8020
8021 503b3f7b Assos Assos
        /* Update or retrieve the settings for a date picker attached to an input field or division.
8022
         * @param  target  element - the target input field or division or span
8023
         * @param  name        object - the new settings to update or
8024
         *                                string - the name of the setting to change or retrieve,
8025
         *                                when retrieving also "all" for all instance settings or
8026
         *                                "defaults" for all global defaults
8027
         * @param  value   any - the new value for the setting
8028
         *                                (omit if above is an object or to retrieve a value)
8029
         */
8030
        _optionDatepicker: function(target, name, value) {
8031
                var settings, date, minDate, maxDate,
8032
                        inst = this._getInst(target);
8033 85ad3d82 Assos Assos
8034 503b3f7b Assos Assos
                if (arguments.length === 2 && typeof name === "string") {
8035
                        return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
8036
                                (inst ? (name === "all" ? $.extend({}, inst.settings) :
8037
                                this._get(inst, name)) : null));
8038
                }
8039
8040
                settings = name || {};
8041
                if (typeof name === "string") {
8042
                        settings = {};
8043
                        settings[name] = value;
8044
                }
8045 85ad3d82 Assos Assos
8046 503b3f7b Assos Assos
                if (inst) {
8047
                        if (this._curInst === inst) {
8048
                                this._hideDatepicker();
8049 85ad3d82 Assos Assos
                        }
8050 503b3f7b Assos Assos
8051
                        date = this._getDateDatepicker(target, true);
8052
                        minDate = this._getMinMaxDate(inst, "min");
8053
                        maxDate = this._getMinMaxDate(inst, "max");
8054
                        extendRemove(inst.settings, settings);
8055
                        // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
8056
                        if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
8057
                                inst.settings.minDate = this._formatDate(inst, minDate);
8058
                        }
8059
                        if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
8060
                                inst.settings.maxDate = this._formatDate(inst, maxDate);
8061
                        }
8062
                        if ( "disabled" in settings ) {
8063
                                if ( settings.disabled ) {
8064
                                        this._disableDatepicker(target);
8065
                                } else {
8066
                                        this._enableDatepicker(target);
8067
                                }
8068
                        }
8069
                        this._attachments($(target), inst);
8070
                        this._autoSize(inst);
8071
                        this._setDate(inst, date);
8072
                        this._updateAlternate(inst);
8073
                        this._updateDatepicker(inst);
8074 85ad3d82 Assos Assos
                }
8075
        },
8076
8077 503b3f7b Assos Assos
        // change method deprecated
8078
        _changeDatepicker: function(target, name, value) {
8079
                this._optionDatepicker(target, name, value);
8080 85ad3d82 Assos Assos
        },
8081
8082 503b3f7b Assos Assos
        /* Redraw the date picker attached to an input field or division.
8083
         * @param  target  element - the target input field or division or span
8084
         */
8085
        _refreshDatepicker: function(target) {
8086
                var inst = this._getInst(target);
8087
                if (inst) {
8088
                        this._updateDatepicker(inst);
8089
                }
8090
        },
8091 85ad3d82 Assos Assos
8092 503b3f7b Assos Assos
        /* Set the dates for a jQuery selection.
8093
         * @param  target element - the target input field or division or span
8094
         * @param  date        Date - the new date
8095
         */
8096
        _setDateDatepicker: function(target, date) {
8097
                var inst = this._getInst(target);
8098
                if (inst) {
8099
                        this._setDate(inst, date);
8100
                        this._updateDatepicker(inst);
8101
                        this._updateAlternate(inst);
8102
                }
8103
        },
8104 85ad3d82 Assos Assos
8105 503b3f7b Assos Assos
        /* Get the date(s) for the first entry in a jQuery selection.
8106
         * @param  target element - the target input field or division or span
8107
         * @param  noDefault boolean - true if no default date is to be used
8108
         * @return Date - the current date
8109
         */
8110
        _getDateDatepicker: function(target, noDefault) {
8111
                var inst = this._getInst(target);
8112
                if (inst && !inst.inline) {
8113
                        this._setDateFromField(inst, noDefault);
8114
                }
8115
                return (inst ? this._getDate(inst) : null);
8116 85ad3d82 Assos Assos
        },
8117 503b3f7b Assos Assos
8118
        /* Handle keystrokes. */
8119
        _doKeyDown: function(event) {
8120
                var onSelect, dateStr, sel,
8121
                        inst = $.datepicker._getInst(event.target),
8122
                        handled = true,
8123
                        isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
8124
8125
                inst._keyEvent = true;
8126
                if ($.datepicker._datepickerShowing) {
8127
                        switch (event.keyCode) {
8128
                                case 9: $.datepicker._hideDatepicker();
8129
                                                handled = false;
8130
                                                break; // hide on tab out
8131
                                case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
8132
                                                                        $.datepicker._currentClass + ")", inst.dpDiv);
8133
                                                if (sel[0]) {
8134
                                                        $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
8135
                                                }
8136
8137
                                                onSelect = $.datepicker._get(inst, "onSelect");
8138
                                                if (onSelect) {
8139
                                                        dateStr = $.datepicker._formatDate(inst);
8140
8141
                                                        // trigger custom callback
8142
                                                        onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
8143
                                                } else {
8144
                                                        $.datepicker._hideDatepicker();
8145
                                                }
8146
8147
                                                return false; // don't submit the form
8148
                                case 27: $.datepicker._hideDatepicker();
8149
                                                break; // hide on escape
8150
                                case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8151
                                                        -$.datepicker._get(inst, "stepBigMonths") :
8152
                                                        -$.datepicker._get(inst, "stepMonths")), "M");
8153
                                                break; // previous month/year on page up/+ ctrl
8154
                                case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8155
                                                        +$.datepicker._get(inst, "stepBigMonths") :
8156
                                                        +$.datepicker._get(inst, "stepMonths")), "M");
8157
                                                break; // next month/year on page down/+ ctrl
8158
                                case 35: if (event.ctrlKey || event.metaKey) {
8159
                                                        $.datepicker._clearDate(event.target);
8160
                                                }
8161
                                                handled = event.ctrlKey || event.metaKey;
8162
                                                break; // clear on ctrl or command +end
8163
                                case 36: if (event.ctrlKey || event.metaKey) {
8164
                                                        $.datepicker._gotoToday(event.target);
8165
                                                }
8166
                                                handled = event.ctrlKey || event.metaKey;
8167
                                                break; // current on ctrl or command +home
8168
                                case 37: if (event.ctrlKey || event.metaKey) {
8169
                                                        $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
8170
                                                }
8171
                                                handled = event.ctrlKey || event.metaKey;
8172
                                                // -1 day on ctrl or command +left
8173
                                                if (event.originalEvent.altKey) {
8174
                                                        $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8175
                                                                -$.datepicker._get(inst, "stepBigMonths") :
8176
                                                                -$.datepicker._get(inst, "stepMonths")), "M");
8177
                                                }
8178
                                                // next month/year on alt +left on Mac
8179
                                                break;
8180
                                case 38: if (event.ctrlKey || event.metaKey) {
8181
                                                        $.datepicker._adjustDate(event.target, -7, "D");
8182
                                                }
8183
                                                handled = event.ctrlKey || event.metaKey;
8184
                                                break; // -1 week on ctrl or command +up
8185
                                case 39: if (event.ctrlKey || event.metaKey) {
8186
                                                        $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
8187
                                                }
8188
                                                handled = event.ctrlKey || event.metaKey;
8189
                                                // +1 day on ctrl or command +right
8190
                                                if (event.originalEvent.altKey) {
8191
                                                        $.datepicker._adjustDate(event.target, (event.ctrlKey ?
8192
                                                                +$.datepicker._get(inst, "stepBigMonths") :
8193
                                                                +$.datepicker._get(inst, "stepMonths")), "M");
8194
                                                }
8195
                                                // next month/year on alt +right
8196
                                                break;
8197
                                case 40: if (event.ctrlKey || event.metaKey) {
8198
                                                        $.datepicker._adjustDate(event.target, +7, "D");
8199
                                                }
8200
                                                handled = event.ctrlKey || event.metaKey;
8201
                                                break; // +1 week on ctrl or command +down
8202
                                default: handled = false;
8203 85ad3d82 Assos Assos
                        }
8204 503b3f7b Assos Assos
                } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
8205
                        $.datepicker._showDatepicker(this);
8206
                } else {
8207
                        handled = false;
8208 85ad3d82 Assos Assos
                }
8209
8210 503b3f7b Assos Assos
                if (handled) {
8211
                        event.preventDefault();
8212
                        event.stopPropagation();
8213 85ad3d82 Assos Assos
                }
8214
        },
8215
8216 503b3f7b Assos Assos
        /* Filter entered characters - based on date format. */
8217
        _doKeyPress: function(event) {
8218
                var chars, chr,
8219
                        inst = $.datepicker._getInst(event.target);
8220
8221
                if ($.datepicker._get(inst, "constrainInput")) {
8222
                        chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
8223
                        chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
8224
                        return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
8225 85ad3d82 Assos Assos
                }
8226 503b3f7b Assos Assos
        },
8227 85ad3d82 Assos Assos
8228 503b3f7b Assos Assos
        /* Synchronise manual entry and field/alternate field. */
8229
        _doKeyUp: function(event) {
8230
                var date,
8231
                        inst = $.datepicker._getInst(event.target);
8232 85ad3d82 Assos Assos
8233 503b3f7b Assos Assos
                if (inst.input.val() !== inst.lastVal) {
8234
                        try {
8235
                                date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
8236
                                        (inst.input ? inst.input.val() : null),
8237
                                        $.datepicker._getFormatConfig(inst));
8238 85ad3d82 Assos Assos
8239 503b3f7b Assos Assos
                                if (date) { // only if valid
8240
                                        $.datepicker._setDateFromField(inst);
8241
                                        $.datepicker._updateAlternate(inst);
8242
                                        $.datepicker._updateDatepicker(inst);
8243
                                }
8244
                        }
8245
                        catch (err) {
8246
                        }
8247 85ad3d82 Assos Assos
                }
8248 503b3f7b Assos Assos
                return true;
8249
        },
8250 85ad3d82 Assos Assos
8251 503b3f7b Assos Assos
        /* Pop-up the date picker for a given input field.
8252
         * If false returned from beforeShow event handler do not show.
8253
         * @param  input  element - the input field attached to the date picker or
8254
         *                                        event - if triggered by focus
8255
         */
8256
        _showDatepicker: function(input) {
8257
                input = input.target || input;
8258
                if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
8259
                        input = $("input", input.parentNode)[0];
8260 85ad3d82 Assos Assos
                }
8261
8262 503b3f7b Assos Assos
                if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
8263
                        return;
8264
                }
8265 85ad3d82 Assos Assos
8266 503b3f7b Assos Assos
                var inst, beforeShow, beforeShowSettings, isFixed,
8267
                        offset, showAnim, duration;
8268
8269
                inst = $.datepicker._getInst(input);
8270
                if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
8271
                        $.datepicker._curInst.dpDiv.stop(true, true);
8272
                        if ( inst && $.datepicker._datepickerShowing ) {
8273
                                $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
8274
                        }
8275 85ad3d82 Assos Assos
                }
8276
8277 503b3f7b Assos Assos
                beforeShow = $.datepicker._get(inst, "beforeShow");
8278
                beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
8279
                if(beforeShowSettings === false){
8280
                        return;
8281
                }
8282
                extendRemove(inst.settings, beforeShowSettings);
8283 85ad3d82 Assos Assos
8284 503b3f7b Assos Assos
                inst.lastVal = null;
8285
                $.datepicker._lastInput = input;
8286
                $.datepicker._setDateFromField(inst);
8287 85ad3d82 Assos Assos
8288 503b3f7b Assos Assos
                if ($.datepicker._inDialog) { // hide cursor
8289
                        input.value = "";
8290
                }
8291
                if (!$.datepicker._pos) { // position below input
8292
                        $.datepicker._pos = $.datepicker._findPos(input);
8293
                        $.datepicker._pos[1] += input.offsetHeight; // add the height
8294 85ad3d82 Assos Assos
                }
8295
8296 503b3f7b Assos Assos
                isFixed = false;
8297
                $(input).parents().each(function() {
8298
                        isFixed |= $(this).css("position") === "fixed";
8299
                        return !isFixed;
8300
                });
8301 85ad3d82 Assos Assos
8302 503b3f7b Assos Assos
                offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
8303
                $.datepicker._pos = null;
8304
                //to avoid flashes on Firefox
8305
                inst.dpDiv.empty();
8306
                // determine sizing offscreen
8307
                inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
8308
                $.datepicker._updateDatepicker(inst);
8309
                // fix width for dynamic number of date pickers
8310
                // and adjust position before showing
8311
                offset = $.datepicker._checkOffset(inst, offset, isFixed);
8312
                inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
8313
                        "static" : (isFixed ? "fixed" : "absolute")), display: "none",
8314
                        left: offset.left + "px", top: offset.top + "px"});
8315
8316
                if (!inst.inline) {
8317
                        showAnim = $.datepicker._get(inst, "showAnim");
8318
                        duration = $.datepicker._get(inst, "duration");
8319
                        inst.dpDiv.zIndex($(input).zIndex()+1);
8320
                        $.datepicker._datepickerShowing = true;
8321
8322
                        if ( $.effects && $.effects.effect[ showAnim ] ) {
8323
                                inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
8324 85ad3d82 Assos Assos
                        } else {
8325 503b3f7b Assos Assos
                                inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
8326 85ad3d82 Assos Assos
                        }
8327
8328 503b3f7b Assos Assos
                        if (inst.input.is(":visible") && !inst.input.is(":disabled")) {
8329
                                inst.input.focus();
8330 85ad3d82 Assos Assos
                        }
8331 503b3f7b Assos Assos
                        $.datepicker._curInst = inst;
8332 85ad3d82 Assos Assos
                }
8333
        },
8334
8335 503b3f7b Assos Assos
        /* Generate the date picker content. */
8336
        _updateDatepicker: function(inst) {
8337
                this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
8338
                instActive = inst; // for delegate hover events
8339
                inst.dpDiv.empty().append(this._generateHTML(inst));
8340
                this._attachHandlers(inst);
8341
                inst.dpDiv.find("." + this._dayOverClass + " a").mouseover();
8342
8343
                var origyearshtml,
8344
                        numMonths = this._getNumberOfMonths(inst),
8345
                        cols = numMonths[1],
8346
                        width = 17;
8347
8348
                inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
8349
                if (cols > 1) {
8350
                        inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
8351
                }
8352
                inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
8353
                        "Class"]("ui-datepicker-multi");
8354
                inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
8355
                        "Class"]("ui-datepicker-rtl");
8356
8357
                // #6694 - don't focus the input if it's already focused
8358
                // this breaks the change event in IE
8359
                if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
8360
                        inst.input.is(":visible") && !inst.input.is(":disabled") && inst.input[0] !== document.activeElement) {
8361
                        inst.input.focus();
8362
                }
8363 85ad3d82 Assos Assos
8364 503b3f7b Assos Assos
                // deffered render of the years select (to avoid flashes on Firefox)
8365
                if( inst.yearshtml ){
8366
                        origyearshtml = inst.yearshtml;
8367
                        setTimeout(function(){
8368
                                //assure that inst.yearshtml didn't change.
8369
                                if( origyearshtml === inst.yearshtml && inst.yearshtml ){
8370
                                        inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
8371
                                }
8372
                                origyearshtml = inst.yearshtml = null;
8373
                        }, 0);
8374 85ad3d82 Assos Assos
                }
8375 503b3f7b Assos Assos
        },
8376 85ad3d82 Assos Assos
8377 503b3f7b Assos Assos
        /* Retrieve the size of left and top borders for an element.
8378
         * @param  elem  (jQuery object) the element of interest
8379
         * @return  (number[2]) the left and top borders
8380
         */
8381
        _getBorders: function(elem) {
8382
                var convert = function(value) {
8383
                        return {thin: 1, medium: 2, thick: 3}[value] || value;
8384
                };
8385
                return [parseFloat(convert(elem.css("border-left-width"))),
8386
                        parseFloat(convert(elem.css("border-top-width")))];
8387 85ad3d82 Assos Assos
        },
8388
8389 503b3f7b Assos Assos
        /* Check positioning to remain on screen. */
8390
        _checkOffset: function(inst, offset, isFixed) {
8391
                var dpWidth = inst.dpDiv.outerWidth(),
8392
                        dpHeight = inst.dpDiv.outerHeight(),
8393
                        inputWidth = inst.input ? inst.input.outerWidth() : 0,
8394
                        inputHeight = inst.input ? inst.input.outerHeight() : 0,
8395
                        viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
8396
                        viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
8397
8398
                offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
8399
                offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
8400
                offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
8401
8402
                // now check if datepicker is showing outside window viewport - move to a better place if so.
8403
                offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
8404
                        Math.abs(offset.left + dpWidth - viewWidth) : 0);
8405
                offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
8406
                        Math.abs(dpHeight + inputHeight) : 0);
8407
8408
                return offset;
8409 85ad3d82 Assos Assos
        },
8410
8411 503b3f7b Assos Assos
        /* Find an object's position on the screen. */
8412
        _findPos: function(obj) {
8413
                var position,
8414
                        inst = this._getInst(obj),
8415
                        isRTL = this._get(inst, "isRTL");
8416
8417
                while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
8418
                        obj = obj[isRTL ? "previousSibling" : "nextSibling"];
8419 85ad3d82 Assos Assos
                }
8420 503b3f7b Assos Assos
8421
                position = $(obj).offset();
8422
                return [position.left, position.top];
8423 85ad3d82 Assos Assos
        },
8424
8425 503b3f7b Assos Assos
        /* Hide the date picker from view.
8426
         * @param  input  element - the input field attached to the date picker
8427
         */
8428
        _hideDatepicker: function(input) {
8429
                var showAnim, duration, postProcess, onClose,
8430
                        inst = this._curInst;
8431
8432
                if (!inst || (input && inst !== $.data(input, PROP_NAME))) {
8433 85ad3d82 Assos Assos
                        return;
8434
                }
8435
8436 503b3f7b Assos Assos
                if (this._datepickerShowing) {
8437
                        showAnim = this._get(inst, "showAnim");
8438
                        duration = this._get(inst, "duration");
8439
                        postProcess = function() {
8440
                                $.datepicker._tidyDialog(inst);
8441
                        };
8442 85ad3d82 Assos Assos
8443 503b3f7b Assos Assos
                        // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
8444
                        if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
8445
                                inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
8446
                        } else {
8447
                                inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
8448
                                        (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
8449 85ad3d82 Assos Assos
                        }
8450
8451 503b3f7b Assos Assos
                        if (!showAnim) {
8452
                                postProcess();
8453 85ad3d82 Assos Assos
                        }
8454 503b3f7b Assos Assos
                        this._datepickerShowing = false;
8455 85ad3d82 Assos Assos
8456 503b3f7b Assos Assos
                        onClose = this._get(inst, "onClose");
8457
                        if (onClose) {
8458
                                onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
8459
                        }
8460 85ad3d82 Assos Assos
8461 503b3f7b Assos Assos
                        this._lastInput = null;
8462
                        if (this._inDialog) {
8463
                                this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
8464
                                if ($.blockUI) {
8465
                                        $.unblockUI();
8466
                                        $("body").append(this.dpDiv);
8467 85ad3d82 Assos Assos
                                }
8468
                        }
8469 503b3f7b Assos Assos
                        this._inDialog = false;
8470 85ad3d82 Assos Assos
                }
8471
        },
8472
8473 503b3f7b Assos Assos
        /* Tidy up after a dialog display. */
8474
        _tidyDialog: function(inst) {
8475
                inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
8476 85ad3d82 Assos Assos
        },
8477
8478 503b3f7b Assos Assos
        /* Close date picker if clicked elsewhere. */
8479
        _checkExternalClick: function(event) {
8480
                if (!$.datepicker._curInst) {
8481
                        return;
8482 85ad3d82 Assos Assos
                }
8483
8484 503b3f7b Assos Assos
                var $target = $(event.target),
8485
                        inst = $.datepicker._getInst($target[0]);
8486 85ad3d82 Assos Assos
8487 503b3f7b Assos Assos
                if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
8488
                                $target.parents("#" + $.datepicker._mainDivId).length === 0 &&
8489
                                !$target.hasClass($.datepicker.markerClassName) &&
8490
                                !$target.closest("." + $.datepicker._triggerClass).length &&
8491
                                $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
8492
                        ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
8493
                                $.datepicker._hideDatepicker();
8494
                }
8495
        },
8496 85ad3d82 Assos Assos
8497 503b3f7b Assos Assos
        /* Adjust one of the date sub-fields. */
8498
        _adjustDate: function(id, offset, period) {
8499
                var target = $(id),
8500
                        inst = this._getInst(target[0]);
8501 85ad3d82 Assos Assos
8502 503b3f7b Assos Assos
                if (this._isDisabledDatepicker(target[0])) {
8503
                        return;
8504
                }
8505
                this._adjustInstDate(inst, offset +
8506
                        (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
8507
                        period);
8508
                this._updateDatepicker(inst);
8509
        },
8510 85ad3d82 Assos Assos
8511 503b3f7b Assos Assos
        /* Action for current link. */
8512
        _gotoToday: function(id) {
8513
                var date,
8514
                        target = $(id),
8515
                        inst = this._getInst(target[0]);
8516 85ad3d82 Assos Assos
8517 503b3f7b Assos Assos
                if (this._get(inst, "gotoCurrent") && inst.currentDay) {
8518
                        inst.selectedDay = inst.currentDay;
8519
                        inst.drawMonth = inst.selectedMonth = inst.currentMonth;
8520
                        inst.drawYear = inst.selectedYear = inst.currentYear;
8521
                } else {
8522
                        date = new Date();
8523
                        inst.selectedDay = date.getDate();
8524
                        inst.drawMonth = inst.selectedMonth = date.getMonth();
8525
                        inst.drawYear = inst.selectedYear = date.getFullYear();
8526
                }
8527
                this._notifyChange(inst);
8528
                this._adjustDate(target);
8529
        },
8530 85ad3d82 Assos Assos
8531 503b3f7b Assos Assos
        /* Action for selecting a new month/year. */
8532
        _selectMonthYear: function(id, select, period) {
8533
                var target = $(id),
8534
                        inst = this._getInst(target[0]);
8535 85ad3d82 Assos Assos
8536 503b3f7b Assos Assos
                inst["selected" + (period === "M" ? "Month" : "Year")] =
8537
                inst["draw" + (period === "M" ? "Month" : "Year")] =
8538
                        parseInt(select.options[select.selectedIndex].value,10);
8539 85ad3d82 Assos Assos
8540 503b3f7b Assos Assos
                this._notifyChange(inst);
8541
                this._adjustDate(target);
8542 85ad3d82 Assos Assos
        },
8543
8544 503b3f7b Assos Assos
        /* Action for selecting a day. */
8545
        _selectDay: function(id, month, year, td) {
8546
                var inst,
8547
                        target = $(id);
8548 85ad3d82 Assos Assos
8549 503b3f7b Assos Assos
                if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
8550
                        return;
8551 85ad3d82 Assos Assos
                }
8552
8553 503b3f7b Assos Assos
                inst = this._getInst(target[0]);
8554
                inst.selectedDay = inst.currentDay = $("a", td).html();
8555
                inst.selectedMonth = inst.currentMonth = month;
8556
                inst.selectedYear = inst.currentYear = year;
8557
                this._selectDate(id, this._formatDate(inst,
8558
                        inst.currentDay, inst.currentMonth, inst.currentYear));
8559 85ad3d82 Assos Assos
        },
8560
8561 503b3f7b Assos Assos
        /* Erase the input field and hide the date picker. */
8562
        _clearDate: function(id) {
8563
                var target = $(id);
8564
                this._selectDate(target, "");
8565 85ad3d82 Assos Assos
        },
8566
8567 503b3f7b Assos Assos
        /* Update the input field with the selected date. */
8568
        _selectDate: function(id, dateStr) {
8569
                var onSelect,
8570
                        target = $(id),
8571
                        inst = this._getInst(target[0]);
8572
8573
                dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
8574
                if (inst.input) {
8575
                        inst.input.val(dateStr);
8576 85ad3d82 Assos Assos
                }
8577 503b3f7b Assos Assos
                this._updateAlternate(inst);
8578
8579
                onSelect = this._get(inst, "onSelect");
8580
                if (onSelect) {
8581
                        onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
8582
                } else if (inst.input) {
8583
                        inst.input.trigger("change"); // fire the change event
8584 85ad3d82 Assos Assos
                }
8585
8586 503b3f7b Assos Assos
                if (inst.inline){
8587
                        this._updateDatepicker(inst);
8588
                } else {
8589
                        this._hideDatepicker();
8590
                        this._lastInput = inst.input[0];
8591
                        if (typeof(inst.input[0]) !== "object") {
8592
                                inst.input.focus(); // restore focus
8593 85ad3d82 Assos Assos
                        }
8594 503b3f7b Assos Assos
                        this._lastInput = null;
8595 85ad3d82 Assos Assos
                }
8596
        },
8597
8598 503b3f7b Assos Assos
        /* Update any alternate field to synchronise with the main field. */
8599
        _updateAlternate: function(inst) {
8600
                var altFormat, date, dateStr,
8601
                        altField = this._get(inst, "altField");
8602 85ad3d82 Assos Assos
8603 503b3f7b Assos Assos
                if (altField) { // update alternate field too
8604
                        altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
8605
                        date = this._getDate(inst);
8606
                        dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
8607
                        $(altField).each(function() { $(this).val(dateStr); });
8608 85ad3d82 Assos Assos
                }
8609 503b3f7b Assos Assos
        },
8610 85ad3d82 Assos Assos
8611 503b3f7b Assos Assos
        /* Set as beforeShowDay function to prevent selection of weekends.
8612
         * @param  date  Date - the date to customise
8613
         * @return [boolean, string] - is this date selectable?, what is its CSS class?
8614
         */
8615
        noWeekends: function(date) {
8616
                var day = date.getDay();
8617
                return [(day > 0 && day < 6), ""];
8618
        },
8619 85ad3d82 Assos Assos
8620 503b3f7b Assos Assos
        /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
8621
         * @param  date  Date - the date to get the week for
8622
         * @return  number - the number of the week within the year that contains this date
8623
         */
8624
        iso8601Week: function(date) {
8625
                var time,
8626
                        checkDate = new Date(date.getTime());
8627 85ad3d82 Assos Assos
8628 503b3f7b Assos Assos
                // Find Thursday of this week starting on Monday
8629
                checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
8630
8631
                time = checkDate.getTime();
8632
                checkDate.setMonth(0); // Compare with Jan 1
8633
                checkDate.setDate(1);
8634
                return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
8635 85ad3d82 Assos Assos
        },
8636
8637 503b3f7b Assos Assos
        /* Parse a string value into a date object.
8638
         * See formatDate below for the possible formats.
8639
         *
8640
         * @param  format string - the expected format of the date
8641
         * @param  value string - the date in the above format
8642
         * @param  settings Object - attributes include:
8643
         *                                        shortYearCutoff  number - the cutoff year for determining the century (optional)
8644
         *                                        dayNamesShort        string[7] - abbreviated names of the days from Sunday (optional)
8645
         *                                        dayNames                string[7] - names of the days from Sunday (optional)
8646
         *                                        monthNamesShort string[12] - abbreviated names of the months (optional)
8647
         *                                        monthNames                string[12] - names of the months (optional)
8648
         * @return  Date - the extracted date value or null if value is blank
8649
         */
8650
        parseDate: function (format, value, settings) {
8651
                if (format == null || value == null) {
8652
                        throw "Invalid arguments";
8653 85ad3d82 Assos Assos
                }
8654 503b3f7b Assos Assos
8655
                value = (typeof value === "object" ? value.toString() : value + "");
8656
                if (value === "") {
8657
                        return null;
8658 85ad3d82 Assos Assos
                }
8659
8660 503b3f7b Assos Assos
                var iFormat, dim, extra,
8661
                        iValue = 0,
8662
                        shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
8663
                        shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
8664
                                new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
8665
                        dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
8666
                        dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
8667
                        monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
8668
                        monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
8669
                        year = -1,
8670
                        month = -1,
8671
                        day = -1,
8672
                        doy = -1,
8673
                        literal = false,
8674
                        date,
8675
                        // Check whether a format character is doubled
8676
                        lookAhead = function(match) {
8677
                                var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
8678
                                if (matches) {
8679
                                        iFormat++;
8680
                                }
8681
                                return matches;
8682
                        },
8683
                        // Extract a number from the string value
8684
                        getNumber = function(match) {
8685
                                var isDoubled = lookAhead(match),
8686
                                        size = (match === "@" ? 14 : (match === "!" ? 20 :
8687
                                        (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
8688
                                        digits = new RegExp("^\\d{1," + size + "}"),
8689
                                        num = value.substring(iValue).match(digits);
8690
                                if (!num) {
8691
                                        throw "Missing number at position " + iValue;
8692
                                }
8693
                                iValue += num[0].length;
8694
                                return parseInt(num[0], 10);
8695
                        },
8696
                        // Extract a name from the string value and convert to an index
8697
                        getName = function(match, shortNames, longNames) {
8698
                                var index = -1,
8699
                                        names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
8700
                                                return [ [k, v] ];
8701
                                        }).sort(function (a, b) {
8702
                                                return -(a[1].length - b[1].length);
8703
                                        });
8704
8705
                                $.each(names, function (i, pair) {
8706
                                        var name = pair[1];
8707
                                        if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
8708
                                                index = pair[0];
8709
                                                iValue += name.length;
8710
                                                return false;
8711
                                        }
8712
                                });
8713
                                if (index !== -1) {
8714
                                        return index + 1;
8715
                                } else {
8716
                                        throw "Unknown name at position " + iValue;
8717
                                }
8718
                        },
8719
                        // Confirm that a literal character matches the string value
8720
                        checkLiteral = function() {
8721
                                if (value.charAt(iValue) !== format.charAt(iFormat)) {
8722
                                        throw "Unexpected literal at position " + iValue;
8723
                                }
8724
                                iValue++;
8725
                        };
8726
8727
                for (iFormat = 0; iFormat < format.length; iFormat++) {
8728
                        if (literal) {
8729
                                if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
8730
                                        literal = false;
8731
                                } else {
8732
                                        checkLiteral();
8733
                                }
8734
                        } else {
8735
                                switch (format.charAt(iFormat)) {
8736
                                        case "d":
8737
                                                day = getNumber("d");
8738
                                                break;
8739
                                        case "D":
8740
                                                getName("D", dayNamesShort, dayNames);
8741
                                                break;
8742
                                        case "o":
8743
                                                doy = getNumber("o");
8744
                                                break;
8745
                                        case "m":
8746
                                                month = getNumber("m");
8747
                                                break;
8748
                                        case "M":
8749
                                                month = getName("M", monthNamesShort, monthNames);
8750
                                                break;
8751
                                        case "y":
8752
                                                year = getNumber("y");
8753
                                                break;
8754
                                        case "@":
8755
                                                date = new Date(getNumber("@"));
8756
                                                year = date.getFullYear();
8757
                                                month = date.getMonth() + 1;
8758
                                                day = date.getDate();
8759
                                                break;
8760
                                        case "!":
8761
                                                date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
8762
                                                year = date.getFullYear();
8763
                                                month = date.getMonth() + 1;
8764
                                                day = date.getDate();
8765
                                                break;
8766
                                        case "'":
8767
                                                if (lookAhead("'")){
8768
                                                        checkLiteral();
8769
                                                } else {
8770
                                                        literal = true;
8771
                                                }
8772
                                                break;
8773
                                        default:
8774
                                                checkLiteral();
8775
                                }
8776
                        }
8777 85ad3d82 Assos Assos
                }
8778 503b3f7b Assos Assos
8779
                if (iValue < value.length){
8780
                        extra = value.substr(iValue);
8781
                        if (!/^\s+/.test(extra)) {
8782
                                throw "Extra/unparsed characters found in date: " + extra;
8783
                        }
8784 85ad3d82 Assos Assos
                }
8785 503b3f7b Assos Assos
8786
                if (year === -1) {
8787
                        year = new Date().getFullYear();
8788
                } else if (year < 100) {
8789
                        year += new Date().getFullYear() - new Date().getFullYear() % 100 +
8790
                                (year <= shortYearCutoff ? 0 : -100);
8791 85ad3d82 Assos Assos
                }
8792
8793 503b3f7b Assos Assos
                if (doy > -1) {
8794
                        month = 1;
8795
                        day = doy;
8796
                        do {
8797
                                dim = this._getDaysInMonth(year, month - 1);
8798
                                if (day <= dim) {
8799
                                        break;
8800
                                }
8801
                                month++;
8802
                                day -= dim;
8803
                        } while (true);
8804 85ad3d82 Assos Assos
                }
8805 503b3f7b Assos Assos
8806
                date = this._daylightSavingAdjust(new Date(year, month - 1, day));
8807
                if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
8808
                        throw "Invalid date"; // E.g. 31/02/00
8809 85ad3d82 Assos Assos
                }
8810 503b3f7b Assos Assos
                return date;
8811 85ad3d82 Assos Assos
        },
8812
8813 503b3f7b Assos Assos
        /* Standard date formats. */
8814
        ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
8815
        COOKIE: "D, dd M yy",
8816
        ISO_8601: "yy-mm-dd",
8817
        RFC_822: "D, d M y",
8818
        RFC_850: "DD, dd-M-y",
8819
        RFC_1036: "D, d M y",
8820
        RFC_1123: "D, d M yy",
8821
        RFC_2822: "D, d M yy",
8822
        RSS: "D, d M y", // RFC 822
8823
        TICKS: "!",
8824
        TIMESTAMP: "@",
8825
        W3C: "yy-mm-dd", // ISO 8601
8826
8827
        _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
8828
                Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
8829
8830
        /* Format a date object into a string value.
8831
         * The format can be combinations of the following:
8832
         * d  - day of month (no leading zero)
8833
         * dd - day of month (two digit)
8834
         * o  - day of year (no leading zeros)
8835
         * oo - day of year (three digit)
8836
         * D  - day name short
8837
         * DD - day name long
8838
         * m  - month of year (no leading zero)
8839
         * mm - month of year (two digit)
8840
         * M  - month name short
8841
         * MM - month name long
8842
         * y  - year (two digit)
8843
         * yy - year (four digit)
8844
         * @ - Unix timestamp (ms since 01/01/1970)
8845
         * ! - Windows ticks (100ns since 01/01/0001)
8846
         * "..." - literal text
8847
         * '' - single quote
8848
         *
8849
         * @param  format string - the desired format of the date
8850
         * @param  date Date - the date value to format
8851
         * @param  settings Object - attributes include:
8852
         *                                        dayNamesShort        string[7] - abbreviated names of the days from Sunday (optional)
8853
         *                                        dayNames                string[7] - names of the days from Sunday (optional)
8854
         *                                        monthNamesShort string[12] - abbreviated names of the months (optional)
8855
         *                                        monthNames                string[12] - names of the months (optional)
8856
         * @return  string - the date in the above format
8857
         */
8858
        formatDate: function (format, date, settings) {
8859
                if (!date) {
8860
                        return "";
8861
                }
8862
8863
                var iFormat,
8864
                        dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
8865
                        dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
8866
                        monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
8867
                        monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
8868
                        // Check whether a format character is doubled
8869
                        lookAhead = function(match) {
8870
                                var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
8871
                                if (matches) {
8872
                                        iFormat++;
8873
                                }
8874
                                return matches;
8875
                        },
8876
                        // Format a number, with leading zero if necessary
8877
                        formatNumber = function(match, value, len) {
8878
                                var num = "" + value;
8879
                                if (lookAhead(match)) {
8880
                                        while (num.length < len) {
8881
                                                num = "0" + num;
8882
                                        }
8883
                                }
8884
                                return num;
8885
                        },
8886
                        // Format a name, short or long as requested
8887
                        formatName = function(match, value, shortNames, longNames) {
8888
                                return (lookAhead(match) ? longNames[value] : shortNames[value]);
8889
                        },
8890
                        output = "",
8891
                        literal = false;
8892
8893
                if (date) {
8894
                        for (iFormat = 0; iFormat < format.length; iFormat++) {
8895
                                if (literal) {
8896
                                        if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
8897
                                                literal = false;
8898
                                        } else {
8899
                                                output += format.charAt(iFormat);
8900
                                        }
8901
                                } else {
8902
                                        switch (format.charAt(iFormat)) {
8903
                                                case "d":
8904
                                                        output += formatNumber("d", date.getDate(), 2);
8905
                                                        break;
8906
                                                case "D":
8907
                                                        output += formatName("D", date.getDay(), dayNamesShort, dayNames);
8908
                                                        break;
8909
                                                case "o":
8910
                                                        output += formatNumber("o",
8911
                                                                Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
8912
                                                        break;
8913
                                                case "m":
8914
                                                        output += formatNumber("m", date.getMonth() + 1, 2);
8915
                                                        break;
8916
                                                case "M":
8917
                                                        output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
8918
                                                        break;
8919
                                                case "y":
8920
                                                        output += (lookAhead("y") ? date.getFullYear() :
8921
                                                                (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
8922
                                                        break;
8923
                                                case "@":
8924
                                                        output += date.getTime();
8925
                                                        break;
8926
                                                case "!":
8927
                                                        output += date.getTime() * 10000 + this._ticksTo1970;
8928
                                                        break;
8929
                                                case "'":
8930
                                                        if (lookAhead("'")) {
8931
                                                                output += "'";
8932
                                                        } else {
8933
                                                                literal = true;
8934
                                                        }
8935
                                                        break;
8936
                                                default:
8937
                                                        output += format.charAt(iFormat);
8938
                                        }
8939
                                }
8940
                        }
8941 85ad3d82 Assos Assos
                }
8942 503b3f7b Assos Assos
                return output;
8943 85ad3d82 Assos Assos
        },
8944
8945 503b3f7b Assos Assos
        /* Extract all possible characters from the date format. */
8946
        _possibleChars: function (format) {
8947
                var iFormat,
8948
                        chars = "",
8949
                        literal = false,
8950
                        // Check whether a format character is doubled
8951
                        lookAhead = function(match) {
8952
                                var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
8953
                                if (matches) {
8954
                                        iFormat++;
8955
                                }
8956
                                return matches;
8957
                        };
8958
8959
                for (iFormat = 0; iFormat < format.length; iFormat++) {
8960
                        if (literal) {
8961
                                if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
8962
                                        literal = false;
8963
                                } else {
8964
                                        chars += format.charAt(iFormat);
8965
                                }
8966
                        } else {
8967
                                switch (format.charAt(iFormat)) {
8968
                                        case "d": case "m": case "y": case "@":
8969
                                                chars += "0123456789";
8970
                                                break;
8971
                                        case "D": case "M":
8972
                                                return null; // Accept anything
8973
                                        case "'":
8974
                                                if (lookAhead("'")) {
8975
                                                        chars += "'";
8976
                                                } else {
8977
                                                        literal = true;
8978
                                                }
8979
                                                break;
8980
                                        default:
8981
                                                chars += format.charAt(iFormat);
8982
                                }
8983 85ad3d82 Assos Assos
                        }
8984
                }
8985 503b3f7b Assos Assos
                return chars;
8986 85ad3d82 Assos Assos
        },
8987
8988 503b3f7b Assos Assos
        /* Get a setting value, defaulting if necessary. */
8989
        _get: function(inst, name) {
8990
                return inst.settings[name] !== undefined ?
8991
                        inst.settings[name] : this._defaults[name];
8992 85ad3d82 Assos Assos
        },
8993
8994 503b3f7b Assos Assos
        /* Parse existing date and initialise date picker. */
8995
        _setDateFromField: function(inst, noDefault) {
8996
                if (inst.input.val() === inst.lastVal) {
8997
                        return;
8998 85ad3d82 Assos Assos
                }
8999
9000 503b3f7b Assos Assos
                var dateFormat = this._get(inst, "dateFormat"),
9001
                        dates = inst.lastVal = inst.input ? inst.input.val() : null,
9002
                        defaultDate = this._getDefaultDate(inst),
9003
                        date = defaultDate,
9004
                        settings = this._getFormatConfig(inst);
9005
9006
                try {
9007
                        date = this.parseDate(dateFormat, dates, settings) || defaultDate;
9008
                } catch (event) {
9009
                        dates = (noDefault ? "" : dates);
9010 85ad3d82 Assos Assos
                }
9011 503b3f7b Assos Assos
                inst.selectedDay = date.getDate();
9012
                inst.drawMonth = inst.selectedMonth = date.getMonth();
9013
                inst.drawYear = inst.selectedYear = date.getFullYear();
9014
                inst.currentDay = (dates ? date.getDate() : 0);
9015
                inst.currentMonth = (dates ? date.getMonth() : 0);
9016
                inst.currentYear = (dates ? date.getFullYear() : 0);
9017
                this._adjustInstDate(inst);
9018 85ad3d82 Assos Assos
        },
9019
9020 503b3f7b Assos Assos
        /* Retrieve the default date shown on opening. */
9021
        _getDefaultDate: function(inst) {
9022
                return this._restrictMinMax(inst,
9023
                        this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
9024 85ad3d82 Assos Assos
        },
9025
9026 503b3f7b Assos Assos
        /* A date may be specified as an exact value or a relative one. */
9027
        _determineDate: function(inst, date, defaultDate) {
9028
                var offsetNumeric = function(offset) {
9029
                                var date = new Date();
9030
                                date.setDate(date.getDate() + offset);
9031
                                return date;
9032
                        },
9033
                        offsetString = function(offset) {
9034
                                try {
9035
                                        return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
9036
                                                offset, $.datepicker._getFormatConfig(inst));
9037
                                }
9038
                                catch (e) {
9039
                                        // Ignore
9040
                                }
9041
9042
                                var date = (offset.toLowerCase().match(/^c/) ?
9043
                                        $.datepicker._getDate(inst) : null) || new Date(),
9044
                                        year = date.getFullYear(),
9045
                                        month = date.getMonth(),
9046
                                        day = date.getDate(),
9047
                                        pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
9048
                                        matches = pattern.exec(offset);
9049
9050
                                while (matches) {
9051
                                        switch (matches[2] || "d") {
9052
                                                case "d" : case "D" :
9053
                                                        day += parseInt(matches[1],10); break;
9054
                                                case "w" : case "W" :
9055
                                                        day += parseInt(matches[1],10) * 7; break;
9056
                                                case "m" : case "M" :
9057
                                                        month += parseInt(matches[1],10);
9058
                                                        day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
9059
                                                        break;
9060
                                                case "y": case "Y" :
9061
                                                        year += parseInt(matches[1],10);
9062
                                                        day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
9063
                                                        break;
9064
                                        }
9065
                                        matches = pattern.exec(offset);
9066
                                }
9067
                                return new Date(year, month, day);
9068
                        },
9069
                        newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
9070
                                (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
9071
9072
                newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
9073
                if (newDate) {
9074
                        newDate.setHours(0);
9075
                        newDate.setMinutes(0);
9076
                        newDate.setSeconds(0);
9077
                        newDate.setMilliseconds(0);
9078
                }
9079
                return this._daylightSavingAdjust(newDate);
9080
        },
9081
9082
        /* Handle switch to/from daylight saving.
9083
         * Hours may be non-zero on daylight saving cut-over:
9084
         * > 12 when midnight changeover, but then cannot generate
9085
         * midnight datetime, so jump to 1AM, otherwise reset.
9086
         * @param  date  (Date) the date to check
9087
         * @return  (Date) the corrected date
9088
         */
9089
        _daylightSavingAdjust: function(date) {
9090
                if (!date) {
9091
                        return null;
9092
                }
9093
                date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
9094
                return date;
9095
        },
9096
9097
        /* Set the date(s) directly. */
9098
        _setDate: function(inst, date, noChange) {
9099
                var clear = !date,
9100
                        origMonth = inst.selectedMonth,
9101
                        origYear = inst.selectedYear,
9102
                        newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
9103
9104
                inst.selectedDay = inst.currentDay = newDate.getDate();
9105
                inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
9106
                inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
9107
                if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
9108
                        this._notifyChange(inst);
9109
                }
9110
                this._adjustInstDate(inst);
9111
                if (inst.input) {
9112
                        inst.input.val(clear ? "" : this._formatDate(inst));
9113
                }
9114
        },
9115
9116
        /* Retrieve the date(s) directly. */
9117
        _getDate: function(inst) {
9118
                var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
9119
                        this._daylightSavingAdjust(new Date(
9120
                        inst.currentYear, inst.currentMonth, inst.currentDay)));
9121
                        return startDate;
9122
        },
9123
9124
        /* Attach the onxxx handlers.  These are declared statically so
9125
         * they work with static code transformers like Caja.
9126
         */
9127
        _attachHandlers: function(inst) {
9128
                var stepMonths = this._get(inst, "stepMonths"),
9129
                        id = "#" + inst.id.replace( /\\\\/g, "\\" );
9130
                inst.dpDiv.find("[data-handler]").map(function () {
9131
                        var handler = {
9132
                                prev: function () {
9133
                                        window["DP_jQuery_" + dpuuid].datepicker._adjustDate(id, -stepMonths, "M");
9134
                                },
9135
                                next: function () {
9136
                                        window["DP_jQuery_" + dpuuid].datepicker._adjustDate(id, +stepMonths, "M");
9137
                                },
9138
                                hide: function () {
9139
                                        window["DP_jQuery_" + dpuuid].datepicker._hideDatepicker();
9140
                                },
9141
                                today: function () {
9142
                                        window["DP_jQuery_" + dpuuid].datepicker._gotoToday(id);
9143
                                },
9144
                                selectDay: function () {
9145
                                        window["DP_jQuery_" + dpuuid].datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
9146
                                        return false;
9147
                                },
9148
                                selectMonth: function () {
9149
                                        window["DP_jQuery_" + dpuuid].datepicker._selectMonthYear(id, this, "M");
9150
                                        return false;
9151
                                },
9152
                                selectYear: function () {
9153
                                        window["DP_jQuery_" + dpuuid].datepicker._selectMonthYear(id, this, "Y");
9154
                                        return false;
9155
                                }
9156
                        };
9157
                        $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
9158
                });
9159
        },
9160
9161
        /* Generate the HTML for the current state of the date picker. */
9162
        _generateHTML: function(inst) {
9163
                var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
9164
                        controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
9165
                        monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
9166
                        selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
9167
                        cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
9168
                        printDate, dRow, tbody, daySettings, otherMonth, unselectable,
9169
                        tempDate = new Date(),
9170
                        today = this._daylightSavingAdjust(
9171
                                new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
9172
                        isRTL = this._get(inst, "isRTL"),
9173
                        showButtonPanel = this._get(inst, "showButtonPanel"),
9174
                        hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
9175
                        navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
9176
                        numMonths = this._getNumberOfMonths(inst),
9177
                        showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
9178
                        stepMonths = this._get(inst, "stepMonths"),
9179
                        isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
9180
                        currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
9181
                                new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
9182
                        minDate = this._getMinMaxDate(inst, "min"),
9183
                        maxDate = this._getMinMaxDate(inst, "max"),
9184
                        drawMonth = inst.drawMonth - showCurrentAtPos,
9185
                        drawYear = inst.drawYear;
9186
9187
                if (drawMonth < 0) {
9188
                        drawMonth += 12;
9189
                        drawYear--;
9190
                }
9191
                if (maxDate) {
9192
                        maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
9193
                                maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
9194
                        maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
9195
                        while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
9196
                                drawMonth--;
9197
                                if (drawMonth < 0) {
9198
                                        drawMonth = 11;
9199
                                        drawYear--;
9200
                                }
9201 85ad3d82 Assos Assos
                        }
9202
                }
9203 503b3f7b Assos Assos
                inst.drawMonth = drawMonth;
9204
                inst.drawYear = drawYear;
9205
9206
                prevText = this._get(inst, "prevText");
9207
                prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
9208
                        this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
9209
                        this._getFormatConfig(inst)));
9210
9211
                prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
9212
                        "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
9213
                        " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
9214
                        (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>"));
9215
9216
                nextText = this._get(inst, "nextText");
9217
                nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
9218
                        this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
9219
                        this._getFormatConfig(inst)));
9220
9221
                next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
9222
                        "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
9223
                        " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
9224
                        (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>"));
9225
9226
                currentText = this._get(inst, "currentText");
9227
                gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
9228
                currentText = (!navigationAsDateFormat ? currentText :
9229
                        this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
9230
9231
                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'>" +
9232
                        this._get(inst, "closeText") + "</button>" : "");
9233
9234
                buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
9235
                        (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'" +
9236
                        ">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
9237
9238
                firstDay = parseInt(this._get(inst, "firstDay"),10);
9239
                firstDay = (isNaN(firstDay) ? 0 : firstDay);
9240
9241
                showWeek = this._get(inst, "showWeek");
9242
                dayNames = this._get(inst, "dayNames");
9243
                dayNamesMin = this._get(inst, "dayNamesMin");
9244
                monthNames = this._get(inst, "monthNames");
9245
                monthNamesShort = this._get(inst, "monthNamesShort");
9246
                beforeShowDay = this._get(inst, "beforeShowDay");
9247
                showOtherMonths = this._get(inst, "showOtherMonths");
9248
                selectOtherMonths = this._get(inst, "selectOtherMonths");
9249
                defaultDate = this._getDefaultDate(inst);
9250
                html = "";
9251
                dow;
9252
                for (row = 0; row < numMonths[0]; row++) {
9253
                        group = "";
9254
                        this.maxRows = 4;
9255
                        for (col = 0; col < numMonths[1]; col++) {
9256
                                selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
9257
                                cornerClass = " ui-corner-all";
9258
                                calender = "";
9259
                                if (isMultiMonth) {
9260
                                        calender += "<div class='ui-datepicker-group";
9261
                                        if (numMonths[1] > 1) {
9262
                                                switch (col) {
9263
                                                        case 0: calender += " ui-datepicker-group-first";
9264
                                                                cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
9265
                                                        case numMonths[1]-1: calender += " ui-datepicker-group-last";
9266
                                                                cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
9267
                                                        default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
9268
                                                }
9269
                                        }
9270
                                        calender += "'>";
9271
                                }
9272
                                calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
9273
                                        (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
9274
                                        (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
9275
                                        this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
9276
                                        row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
9277
                                        "</div><table class='ui-datepicker-calendar'><thead>" +
9278
                                        "<tr>";
9279
                                thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
9280
                                for (dow = 0; dow < 7; dow++) { // days of the week
9281
                                        day = (dow + firstDay) % 7;
9282
                                        thead += "<th" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
9283
                                                "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
9284
                                }
9285
                                calender += thead + "</tr></thead><tbody>";
9286
                                daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
9287
                                if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
9288
                                        inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
9289
                                }
9290
                                leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
9291
                                curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
9292
                                numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
9293
                                this.maxRows = numRows;
9294
                                printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
9295
                                for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
9296
                                        calender += "<tr>";
9297
                                        tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
9298
                                                this._get(inst, "calculateWeek")(printDate) + "</td>");
9299
                                        for (dow = 0; dow < 7; dow++) { // create date picker days
9300
                                                daySettings = (beforeShowDay ?
9301
                                                        beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
9302
                                                otherMonth = (printDate.getMonth() !== drawMonth);
9303
                                                unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
9304
                                                        (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
9305
                                                tbody += "<td class='" +
9306
                                                        ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
9307
                                                        (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
9308
                                                        ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
9309
                                                        (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
9310
                                                        // or defaultDate is current printedDate and defaultDate is selectedDate
9311
                                                        " " + this._dayOverClass : "") + // highlight selected day
9312
                                                        (unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") +  // highlight unselectable days
9313
                                                        (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
9314
                                                        (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
9315
                                                        (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
9316
                                                        ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
9317
                                                        (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
9318
                                                        (otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
9319
                                                        (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
9320
                                                        (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
9321
                                                        (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
9322
                                                        (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
9323
                                                        "' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
9324
                                                printDate.setDate(printDate.getDate() + 1);
9325
                                                printDate = this._daylightSavingAdjust(printDate);
9326
                                        }
9327
                                        calender += tbody + "</tr>";
9328
                                }
9329
                                drawMonth++;
9330
                                if (drawMonth > 11) {
9331
                                        drawMonth = 0;
9332
                                        drawYear++;
9333
                                }
9334
                                calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
9335
                                                        ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
9336
                                group += calender;
9337
                        }
9338
                        html += group;
9339
                }
9340
                html += buttonPanel;
9341
                inst._keyEvent = false;
9342
                return html;
9343
        },
9344
9345
        /* Generate the month and year header. */
9346
        _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
9347
                        secondary, monthNames, monthNamesShort) {
9348
9349
                var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
9350
                        changeMonth = this._get(inst, "changeMonth"),
9351
                        changeYear = this._get(inst, "changeYear"),
9352
                        showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
9353
                        html = "<div class='ui-datepicker-title'>",
9354
                        monthHtml = "";
9355
9356
                // month selection
9357
                if (secondary || !changeMonth) {
9358
                        monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
9359
                } else {
9360
                        inMinYear = (minDate && minDate.getFullYear() === drawYear);
9361
                        inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
9362
                        monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
9363
                        for ( month = 0; month < 12; month++) {
9364
                                if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
9365
                                        monthHtml += "<option value='" + month + "'" +
9366
                                                (month === drawMonth ? " selected='selected'" : "") +
9367
                                                ">" + monthNamesShort[month] + "</option>";
9368
                                }
9369
                        }
9370
                        monthHtml += "</select>";
9371
                }
9372
9373
                if (!showMonthAfterYear) {
9374
                        html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
9375
                }
9376
9377
                // year selection
9378
                if ( !inst.yearshtml ) {
9379
                        inst.yearshtml = "";
9380
                        if (secondary || !changeYear) {
9381
                                html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
9382
                        } else {
9383
                                // determine range of years to display
9384
                                years = this._get(inst, "yearRange").split(":");
9385
                                thisYear = new Date().getFullYear();
9386
                                determineYear = function(value) {
9387
                                        var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
9388
                                                (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
9389
                                                parseInt(value, 10)));
9390
                                        return (isNaN(year) ? thisYear : year);
9391
                                };
9392
                                year = determineYear(years[0]);
9393
                                endYear = Math.max(year, determineYear(years[1] || ""));
9394
                                year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
9395
                                endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
9396
                                inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
9397
                                for (; year <= endYear; year++) {
9398
                                        inst.yearshtml += "<option value='" + year + "'" +
9399
                                                (year === drawYear ? " selected='selected'" : "") +
9400
                                                ">" + year + "</option>";
9401
                                }
9402
                                inst.yearshtml += "</select>";
9403
9404
                                html += inst.yearshtml;
9405
                                inst.yearshtml = null;
9406
                        }
9407
                }
9408
9409
                html += this._get(inst, "yearSuffix");
9410
                if (showMonthAfterYear) {
9411
                        html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
9412
                }
9413
                html += "</div>"; // Close datepicker_header
9414
                return html;
9415
        },
9416
9417
        /* Adjust one of the date sub-fields. */
9418
        _adjustInstDate: function(inst, offset, period) {
9419
                var year = inst.drawYear + (period === "Y" ? offset : 0),
9420
                        month = inst.drawMonth + (period === "M" ? offset : 0),
9421
                        day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
9422
                        date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
9423
9424
                inst.selectedDay = date.getDate();
9425
                inst.drawMonth = inst.selectedMonth = date.getMonth();
9426
                inst.drawYear = inst.selectedYear = date.getFullYear();
9427
                if (period === "M" || period === "Y") {
9428
                        this._notifyChange(inst);
9429
                }
9430
        },
9431
9432
        /* Ensure a date is within any min/max bounds. */
9433
        _restrictMinMax: function(inst, date) {
9434
                var minDate = this._getMinMaxDate(inst, "min"),
9435
                        maxDate = this._getMinMaxDate(inst, "max"),
9436
                        newDate = (minDate && date < minDate ? minDate : date);
9437
                return (maxDate && newDate > maxDate ? maxDate : newDate);
9438
        },
9439
9440
        /* Notify change of month/year. */
9441
        _notifyChange: function(inst) {
9442
                var onChange = this._get(inst, "onChangeMonthYear");
9443
                if (onChange) {
9444
                        onChange.apply((inst.input ? inst.input[0] : null),
9445
                                [inst.selectedYear, inst.selectedMonth + 1, inst]);
9446
                }
9447
        },
9448
9449
        /* Determine the number of months to show. */
9450
        _getNumberOfMonths: function(inst) {
9451
                var numMonths = this._get(inst, "numberOfMonths");
9452
                return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
9453
        },
9454
9455
        /* Determine the current maximum date - ensure no time components are set. */
9456
        _getMinMaxDate: function(inst, minMax) {
9457
                return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
9458
        },
9459
9460
        /* Find the number of days in a given month. */
9461
        _getDaysInMonth: function(year, month) {
9462
                return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
9463
        },
9464
9465
        /* Find the day of the week of the first of a month. */
9466
        _getFirstDayOfMonth: function(year, month) {
9467
                return new Date(year, month, 1).getDay();
9468
        },
9469
9470
        /* Determines if we should allow a "next/prev" month display change. */
9471
        _canAdjustMonth: function(inst, offset, curYear, curMonth) {
9472
                var numMonths = this._getNumberOfMonths(inst),
9473
                        date = this._daylightSavingAdjust(new Date(curYear,
9474
                        curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
9475
9476
                if (offset < 0) {
9477
                        date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
9478 85ad3d82 Assos Assos
                }
9479 503b3f7b Assos Assos
                return this._isInRange(inst, date);
9480
        },
9481
9482
        /* Is the given date in the accepted range? */
9483
        _isInRange: function(inst, date) {
9484
                var yearSplit, currentYear,
9485
                        minDate = this._getMinMaxDate(inst, "min"),
9486
                        maxDate = this._getMinMaxDate(inst, "max"),
9487
                        minYear = null,
9488
                        maxYear = null,
9489
                        years = this._get(inst, "yearRange");
9490
                        if (years){
9491
                                yearSplit = years.split(":");
9492
                                currentYear = new Date().getFullYear();
9493
                                minYear = parseInt(yearSplit[0], 10);
9494
                                maxYear = parseInt(yearSplit[1], 10);
9495
                                if ( yearSplit[0].match(/[+\-].*/) ) {
9496
                                        minYear += currentYear;
9497
                                }
9498
                                if ( yearSplit[1].match(/[+\-].*/) ) {
9499
                                        maxYear += currentYear;
9500
                                }
9501
                        }
9502
9503
                return ((!minDate || date.getTime() >= minDate.getTime()) &&
9504
                        (!maxDate || date.getTime() <= maxDate.getTime()) &&
9505
                        (!minYear || date.getFullYear() >= minYear) &&
9506
                        (!maxYear || date.getFullYear() <= maxYear));
9507
        },
9508
9509
        /* Provide the configuration settings for formatting/parsing. */
9510
        _getFormatConfig: function(inst) {
9511
                var shortYearCutoff = this._get(inst, "shortYearCutoff");
9512
                shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
9513
                        new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
9514
                return {shortYearCutoff: shortYearCutoff,
9515
                        dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
9516
                        monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
9517 85ad3d82 Assos Assos
        },
9518
9519 503b3f7b Assos Assos
        /* Format the given date for display. */
9520
        _formatDate: function(inst, day, month, year) {
9521
                if (!day) {
9522
                        inst.currentDay = inst.selectedDay;
9523
                        inst.currentMonth = inst.selectedMonth;
9524
                        inst.currentYear = inst.selectedYear;
9525
                }
9526
                var date = (day ? (typeof day === "object" ? day :
9527
                        this._daylightSavingAdjust(new Date(year, month, day))) :
9528
                        this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
9529
                return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
9530
        }
9531
});
9532
9533
/*
9534
 * Bind hover events for datepicker elements.
9535
 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
9536
 * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
9537
 */
9538
function bindHover(dpDiv) {
9539
        var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
9540
        return dpDiv.delegate(selector, "mouseout", function() {
9541
                        $(this).removeClass("ui-state-hover");
9542
                        if (this.className.indexOf("ui-datepicker-prev") !== -1) {
9543
                                $(this).removeClass("ui-datepicker-prev-hover");
9544
                        }
9545
                        if (this.className.indexOf("ui-datepicker-next") !== -1) {
9546
                                $(this).removeClass("ui-datepicker-next-hover");
9547
                        }
9548
                })
9549
                .delegate(selector, "mouseover", function(){
9550
                        if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
9551
                                $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
9552
                                $(this).addClass("ui-state-hover");
9553
                                if (this.className.indexOf("ui-datepicker-prev") !== -1) {
9554
                                        $(this).addClass("ui-datepicker-prev-hover");
9555
                                }
9556
                                if (this.className.indexOf("ui-datepicker-next") !== -1) {
9557
                                        $(this).addClass("ui-datepicker-next-hover");
9558
                                }
9559
                        }
9560
                });
9561
}
9562
9563
/* jQuery extend now ignores nulls! */
9564
function extendRemove(target, props) {
9565
        $.extend(target, props);
9566
        for (var name in props) {
9567
                if (props[name] == null) {
9568
                        target[name] = props[name];
9569
                }
9570
        }
9571
        return target;
9572
}
9573
9574
/* Invoke the datepicker functionality.
9575
   @param  options  string - a command, optionally followed by additional parameters or
9576
                                        Object - settings for attaching new datepicker functionality
9577
   @return  jQuery object */
9578
$.fn.datepicker = function(options){
9579
9580
        /* Verify an empty collection wasn't passed - Fixes #6976 */
9581
        if ( !this.length ) {
9582
                return this;
9583
        }
9584
9585
        /* Initialise the date picker. */
9586
        if (!$.datepicker.initialized) {
9587
                $(document).mousedown($.datepicker._checkExternalClick);
9588
                $.datepicker.initialized = true;
9589
        }
9590
9591
        /* Append datepicker main container to body if not exist. */
9592
        if ($("#"+$.datepicker._mainDivId).length === 0) {
9593
                $("body").append($.datepicker.dpDiv);
9594
        }
9595
9596
        var otherArgs = Array.prototype.slice.call(arguments, 1);
9597
        if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
9598
                return $.datepicker["_" + options + "Datepicker"].
9599
                        apply($.datepicker, [this[0]].concat(otherArgs));
9600
        }
9601
        if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
9602
                return $.datepicker["_" + options + "Datepicker"].
9603
                        apply($.datepicker, [this[0]].concat(otherArgs));
9604
        }
9605
        return this.each(function() {
9606
                typeof options === "string" ?
9607
                        $.datepicker["_" + options + "Datepicker"].
9608
                                apply($.datepicker, [this].concat(otherArgs)) :
9609
                        $.datepicker._attachDatepicker(this, options);
9610
        });
9611
};
9612
9613
$.datepicker = new Datepicker(); // singleton instance
9614
$.datepicker.initialized = false;
9615
$.datepicker.uuid = new Date().getTime();
9616
$.datepicker.version = "1.10.2";
9617
9618
// Workaround for #4055
9619
// Add another global to avoid noConflict issues with inline event handlers
9620
window["DP_jQuery_" + dpuuid] = $;
9621
9622
})(jQuery);
9623
9624
(function( $, undefined ) {
9625
9626
var sizeRelatedOptions = {
9627
                buttons: true,
9628
                height: true,
9629
                maxHeight: true,
9630
                maxWidth: true,
9631
                minHeight: true,
9632
                minWidth: true,
9633
                width: true
9634
        },
9635
        resizableRelatedOptions = {
9636
                maxHeight: true,
9637
                maxWidth: true,
9638
                minHeight: true,
9639
                minWidth: true
9640
        };
9641
9642
$.widget( "ui.dialog", {
9643
        version: "1.10.2",
9644
        options: {
9645
                appendTo: "body",
9646
                autoOpen: true,
9647
                buttons: [],
9648
                closeOnEscape: true,
9649
                closeText: "close",
9650
                dialogClass: "",
9651
                draggable: true,
9652
                hide: null,
9653
                height: "auto",
9654
                maxHeight: null,
9655
                maxWidth: null,
9656
                minHeight: 150,
9657
                minWidth: 150,
9658
                modal: false,
9659
                position: {
9660
                        my: "center",
9661
                        at: "center",
9662
                        of: window,
9663
                        collision: "fit",
9664
                        // Ensure the titlebar is always visible
9665
                        using: function( pos ) {
9666
                                var topOffset = $( this ).css( pos ).offset().top;
9667
                                if ( topOffset < 0 ) {
9668
                                        $( this ).css( "top", pos.top - topOffset );
9669
                                }
9670
                        }
9671
                },
9672
                resizable: true,
9673
                show: null,
9674
                title: null,
9675
                width: 300,
9676
9677
                // callbacks
9678
                beforeClose: null,
9679
                close: null,
9680
                drag: null,
9681
                dragStart: null,
9682
                dragStop: null,
9683
                focus: null,
9684
                open: null,
9685
                resize: null,
9686
                resizeStart: null,
9687
                resizeStop: null
9688
        },
9689
9690
        _create: function() {
9691
                this.originalCss = {
9692
                        display: this.element[0].style.display,
9693
                        width: this.element[0].style.width,
9694
                        minHeight: this.element[0].style.minHeight,
9695
                        maxHeight: this.element[0].style.maxHeight,
9696
                        height: this.element[0].style.height
9697
                };
9698
                this.originalPosition = {
9699
                        parent: this.element.parent(),
9700
                        index: this.element.parent().children().index( this.element )
9701
                };
9702
                this.originalTitle = this.element.attr("title");
9703
                this.options.title = this.options.title || this.originalTitle;
9704
9705
                this._createWrapper();
9706
9707
                this.element
9708
                        .show()
9709
                        .removeAttr("title")
9710
                        .addClass("ui-dialog-content ui-widget-content")
9711
                        .appendTo( this.uiDialog );
9712
9713
                this._createTitlebar();
9714
                this._createButtonPane();
9715
9716
                if ( this.options.draggable && $.fn.draggable ) {
9717
                        this._makeDraggable();
9718
                }
9719
                if ( this.options.resizable && $.fn.resizable ) {
9720
                        this._makeResizable();
9721
                }
9722
9723
                this._isOpen = false;
9724
        },
9725
9726
        _init: function() {
9727
                if ( this.options.autoOpen ) {
9728
                        this.open();
9729
                }
9730
        },
9731
9732
        _appendTo: function() {
9733
                var element = this.options.appendTo;
9734
                if ( element && (element.jquery || element.nodeType) ) {
9735
                        return $( element );
9736
                }
9737
                return this.document.find( element || "body" ).eq( 0 );
9738
        },
9739
9740
        _destroy: function() {
9741
                var next,
9742
                        originalPosition = this.originalPosition;
9743
9744
                this._destroyOverlay();
9745
9746
                this.element
9747
                        .removeUniqueId()
9748
                        .removeClass("ui-dialog-content ui-widget-content")
9749
                        .css( this.originalCss )
9750
                        // Without detaching first, the following becomes really slow
9751
                        .detach();
9752
9753
                this.uiDialog.stop( true, true ).remove();
9754
9755
                if ( this.originalTitle ) {
9756
                        this.element.attr( "title", this.originalTitle );
9757
                }
9758
9759
                next = originalPosition.parent.children().eq( originalPosition.index );
9760
                // Don't try to place the dialog next to itself (#8613)
9761
                if ( next.length && next[0] !== this.element[0] ) {
9762
                        next.before( this.element );
9763
                } else {
9764
                        originalPosition.parent.append( this.element );
9765
                }
9766
        },
9767
9768
        widget: function() {
9769
                return this.uiDialog;
9770
        },
9771
9772
        disable: $.noop,
9773
        enable: $.noop,
9774
9775
        close: function( event ) {
9776
                var that = this;
9777
9778
                if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
9779
                        return;
9780
                }
9781
9782
                this._isOpen = false;
9783
                this._destroyOverlay();
9784
9785
                if ( !this.opener.filter(":focusable").focus().length ) {
9786
                        // Hiding a focused element doesn't trigger blur in WebKit
9787
                        // so in case we have nothing to focus on, explicitly blur the active element
9788
                        // https://bugs.webkit.org/show_bug.cgi?id=47182
9789
                        $( this.document[0].activeElement ).blur();
9790
                }
9791
9792
                this._hide( this.uiDialog, this.options.hide, function() {
9793
                        that._trigger( "close", event );
9794
                });
9795
        },
9796
9797
        isOpen: function() {
9798
                return this._isOpen;
9799
        },
9800
9801
        moveToTop: function() {
9802
                this._moveToTop();
9803
        },
9804
9805
        _moveToTop: function( event, silent ) {
9806
                var moved = !!this.uiDialog.nextAll(":visible").insertBefore( this.uiDialog ).length;
9807
                if ( moved && !silent ) {
9808
                        this._trigger( "focus", event );
9809
                }
9810
                return moved;
9811
        },
9812
9813
        open: function() {
9814
                var that = this;
9815
                if ( this._isOpen ) {
9816
                        if ( this._moveToTop() ) {
9817
                                this._focusTabbable();
9818
                        }
9819
                        return;
9820
                }
9821
9822
                this._isOpen = true;
9823
                this.opener = $( this.document[0].activeElement );
9824
9825
                this._size();
9826
                this._position();
9827
                this._createOverlay();
9828
                this._moveToTop( null, true );
9829
                this._show( this.uiDialog, this.options.show, function() {
9830
                        that._focusTabbable();
9831
                        that._trigger("focus");
9832
                });
9833
9834
                this._trigger("open");
9835
        },
9836
9837
        _focusTabbable: function() {
9838
                // Set focus to the first match:
9839
                // 1. First element inside the dialog matching [autofocus]
9840
                // 2. Tabbable element inside the content element
9841
                // 3. Tabbable element inside the buttonpane
9842
                // 4. The close button
9843
                // 5. The dialog itself
9844
                var hasFocus = this.element.find("[autofocus]");
9845
                if ( !hasFocus.length ) {
9846
                        hasFocus = this.element.find(":tabbable");
9847
                }
9848
                if ( !hasFocus.length ) {
9849
                        hasFocus = this.uiDialogButtonPane.find(":tabbable");
9850
                }
9851
                if ( !hasFocus.length ) {
9852
                        hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
9853
                }
9854
                if ( !hasFocus.length ) {
9855
                        hasFocus = this.uiDialog;
9856
                }
9857
                hasFocus.eq( 0 ).focus();
9858
        },
9859
9860
        _keepFocus: function( event ) {
9861
                function checkFocus() {
9862
                        var activeElement = this.document[0].activeElement,
9863
                                isActive = this.uiDialog[0] === activeElement ||
9864
                                        $.contains( this.uiDialog[0], activeElement );
9865
                        if ( !isActive ) {
9866
                                this._focusTabbable();
9867
                        }
9868
                }
9869
                event.preventDefault();
9870
                checkFocus.call( this );
9871
                // support: IE
9872
                // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
9873
                // so we check again later
9874
                this._delay( checkFocus );
9875
        },
9876
9877
        _createWrapper: function() {
9878
                this.uiDialog = $("<div>")
9879
                        .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
9880
                                this.options.dialogClass )
9881
                        .hide()
9882
                        .attr({
9883
                                // Setting tabIndex makes the div focusable
9884
                                tabIndex: -1,
9885
                                role: "dialog"
9886
                        })
9887
                        .appendTo( this._appendTo() );
9888
9889
                this._on( this.uiDialog, {
9890
                        keydown: function( event ) {
9891
                                if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
9892
                                                event.keyCode === $.ui.keyCode.ESCAPE ) {
9893
                                        event.preventDefault();
9894
                                        this.close( event );
9895
                                        return;
9896
                                }
9897
9898
                                // prevent tabbing out of dialogs
9899
                                if ( event.keyCode !== $.ui.keyCode.TAB ) {
9900
                                        return;
9901
                                }
9902
                                var tabbables = this.uiDialog.find(":tabbable"),
9903
                                        first = tabbables.filter(":first"),
9904
                                        last  = tabbables.filter(":last");
9905
9906
                                if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
9907
                                        first.focus( 1 );
9908
                                        event.preventDefault();
9909
                                } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
9910
                                        last.focus( 1 );
9911
                                        event.preventDefault();
9912
                                }
9913
                        },
9914
                        mousedown: function( event ) {
9915
                                if ( this._moveToTop( event ) ) {
9916
                                        this._focusTabbable();
9917
                                }
9918
                        }
9919
                });
9920
9921
                // We assume that any existing aria-describedby attribute means
9922
                // that the dialog content is marked up properly
9923
                // otherwise we brute force the content as the description
9924
                if ( !this.element.find("[aria-describedby]").length ) {
9925
                        this.uiDialog.attr({
9926
                                "aria-describedby": this.element.uniqueId().attr("id")
9927
                        });
9928
                }
9929
        },
9930
9931
        _createTitlebar: function() {
9932
                var uiDialogTitle;
9933
9934
                this.uiDialogTitlebar = $("<div>")
9935
                        .addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix")
9936
                        .prependTo( this.uiDialog );
9937
                this._on( this.uiDialogTitlebar, {
9938
                        mousedown: function( event ) {
9939
                                // Don't prevent click on close button (#8838)
9940
                                // Focusing a dialog that is partially scrolled out of view
9941
                                // causes the browser to scroll it into view, preventing the click event
9942
                                if ( !$( event.target ).closest(".ui-dialog-titlebar-close") ) {
9943
                                        // Dialog isn't getting focus when dragging (#8063)
9944
                                        this.uiDialog.focus();
9945
                                }
9946
                        }
9947
                });
9948
9949
                this.uiDialogTitlebarClose = $("<button></button>")
9950
                        .button({
9951
                                label: this.options.closeText,
9952
                                icons: {
9953
                                        primary: "ui-icon-closethick"
9954
                                },
9955
                                text: false
9956
                        })
9957
                        .addClass("ui-dialog-titlebar-close")
9958
                        .appendTo( this.uiDialogTitlebar );
9959
                this._on( this.uiDialogTitlebarClose, {
9960
                        click: function( event ) {
9961
                                event.preventDefault();
9962
                                this.close( event );
9963
                        }
9964
                });
9965
9966
                uiDialogTitle = $("<span>")
9967
                        .uniqueId()
9968
                        .addClass("ui-dialog-title")
9969
                        .prependTo( this.uiDialogTitlebar );
9970
                this._title( uiDialogTitle );
9971
9972
                this.uiDialog.attr({
9973
                        "aria-labelledby": uiDialogTitle.attr("id")
9974
                });
9975
        },
9976
9977
        _title: function( title ) {
9978
                if ( !this.options.title ) {
9979
                        title.html("&#160;");
9980
                }
9981
                title.text( this.options.title );
9982
        },
9983
9984
        _createButtonPane: function() {
9985
                this.uiDialogButtonPane = $("<div>")
9986
                        .addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");
9987
9988
                this.uiButtonSet = $("<div>")
9989
                        .addClass("ui-dialog-buttonset")
9990
                        .appendTo( this.uiDialogButtonPane );
9991
9992
                this._createButtons();
9993
        },
9994
9995
        _createButtons: function() {
9996
                var that = this,
9997
                        buttons = this.options.buttons;
9998
9999
                // if we already have a button pane, remove it
10000
                this.uiDialogButtonPane.remove();
10001
                this.uiButtonSet.empty();
10002
10003
                if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
10004
                        this.uiDialog.removeClass("ui-dialog-buttons");
10005
                        return;
10006
                }
10007
10008
                $.each( buttons, function( name, props ) {
10009
                        var click, buttonOptions;
10010
                        props = $.isFunction( props ) ?
10011
                                { click: props, text: name } :
10012
                                props;
10013
                        // Default to a non-submitting button
10014
                        props = $.extend( { type: "button" }, props );
10015
                        // Change the context for the click callback to be the main element
10016
                        click = props.click;
10017
                        props.click = function() {
10018
                                click.apply( that.element[0], arguments );
10019
                        };
10020
                        buttonOptions = {
10021
                                icons: props.icons,
10022
                                text: props.showText
10023
                        };
10024
                        delete props.icons;
10025
                        delete props.showText;
10026
                        $( "<button></button>", props )
10027
                                .button( buttonOptions )
10028
                                .appendTo( that.uiButtonSet );
10029
                });
10030
                this.uiDialog.addClass("ui-dialog-buttons");
10031
                this.uiDialogButtonPane.appendTo( this.uiDialog );
10032
        },
10033
10034
        _makeDraggable: function() {
10035
                var that = this,
10036
                        options = this.options;
10037
10038
                function filteredUi( ui ) {
10039
                        return {
10040
                                position: ui.position,
10041
                                offset: ui.offset
10042
                        };
10043
                }
10044
10045
                this.uiDialog.draggable({
10046
                        cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
10047
                        handle: ".ui-dialog-titlebar",
10048
                        containment: "document",
10049
                        start: function( event, ui ) {
10050
                                $( this ).addClass("ui-dialog-dragging");
10051
                                that._blockFrames();
10052
                                that._trigger( "dragStart", event, filteredUi( ui ) );
10053
                        },
10054
                        drag: function( event, ui ) {
10055
                                that._trigger( "drag", event, filteredUi( ui ) );
10056
                        },
10057
                        stop: function( event, ui ) {
10058
                                options.position = [
10059
                                        ui.position.left - that.document.scrollLeft(),
10060
                                        ui.position.top - that.document.scrollTop()
10061
                                ];
10062
                                $( this ).removeClass("ui-dialog-dragging");
10063
                                that._unblockFrames();
10064
                                that._trigger( "dragStop", event, filteredUi( ui ) );
10065
                        }
10066
                });
10067
        },
10068
10069
        _makeResizable: function() {
10070
                var that = this,
10071
                        options = this.options,
10072
                        handles = options.resizable,
10073
                        // .ui-resizable has position: relative defined in the stylesheet
10074
                        // but dialogs have to use absolute or fixed positioning
10075
                        position = this.uiDialog.css("position"),
10076
                        resizeHandles = typeof handles === "string" ?
10077
                                handles        :
10078
                                "n,e,s,w,se,sw,ne,nw";
10079
10080
                function filteredUi( ui ) {
10081
                        return {
10082
                                originalPosition: ui.originalPosition,
10083
                                originalSize: ui.originalSize,
10084
                                position: ui.position,
10085
                                size: ui.size
10086
                        };
10087
                }
10088
10089
                this.uiDialog.resizable({
10090
                        cancel: ".ui-dialog-content",
10091
                        containment: "document",
10092
                        alsoResize: this.element,
10093
                        maxWidth: options.maxWidth,
10094
                        maxHeight: options.maxHeight,
10095
                        minWidth: options.minWidth,
10096
                        minHeight: this._minHeight(),
10097
                        handles: resizeHandles,
10098
                        start: function( event, ui ) {
10099
                                $( this ).addClass("ui-dialog-resizing");
10100
                                that._blockFrames();
10101
                                that._trigger( "resizeStart", event, filteredUi( ui ) );
10102
                        },
10103
                        resize: function( event, ui ) {
10104
                                that._trigger( "resize", event, filteredUi( ui ) );
10105
                        },
10106
                        stop: function( event, ui ) {
10107
                                options.height = $( this ).height();
10108
                                options.width = $( this ).width();
10109
                                $( this ).removeClass("ui-dialog-resizing");
10110
                                that._unblockFrames();
10111
                                that._trigger( "resizeStop", event, filteredUi( ui ) );
10112
                        }
10113
                })
10114
                .css( "position", position );
10115
        },
10116
10117
        _minHeight: function() {
10118
                var options = this.options;
10119
10120
                return options.height === "auto" ?
10121
                        options.minHeight :
10122
                        Math.min( options.minHeight, options.height );
10123
        },
10124
10125
        _position: function() {
10126
                // Need to show the dialog to get the actual offset in the position plugin
10127
                var isVisible = this.uiDialog.is(":visible");
10128
                if ( !isVisible ) {
10129
                        this.uiDialog.show();
10130
                }
10131
                this.uiDialog.position( this.options.position );
10132
                if ( !isVisible ) {
10133
                        this.uiDialog.hide();
10134
                }
10135
        },
10136
10137
        _setOptions: function( options ) {
10138
                var that = this,
10139
                        resize = false,
10140
                        resizableOptions = {};
10141
10142
                $.each( options, function( key, value ) {
10143
                        that._setOption( key, value );
10144
10145
                        if ( key in sizeRelatedOptions ) {
10146
                                resize = true;
10147
                        }
10148
                        if ( key in resizableRelatedOptions ) {
10149
                                resizableOptions[ key ] = value;
10150
                        }
10151
                });
10152
10153
                if ( resize ) {
10154
                        this._size();
10155
                        this._position();
10156
                }
10157
                if ( this.uiDialog.is(":data(ui-resizable)") ) {
10158
                        this.uiDialog.resizable( "option", resizableOptions );
10159
                }
10160
        },
10161
10162
        _setOption: function( key, value ) {
10163
                /*jshint maxcomplexity:15*/
10164
                var isDraggable, isResizable,
10165
                        uiDialog = this.uiDialog;
10166
10167
                if ( key === "dialogClass" ) {
10168
                        uiDialog
10169
                                .removeClass( this.options.dialogClass )
10170
                                .addClass( value );
10171
                }
10172
10173
                if ( key === "disabled" ) {
10174
                        return;
10175
                }
10176
10177
                this._super( key, value );
10178
10179
                if ( key === "appendTo" ) {
10180
                        this.uiDialog.appendTo( this._appendTo() );
10181
                }
10182
10183
                if ( key === "buttons" ) {
10184
                        this._createButtons();
10185
                }
10186
10187
                if ( key === "closeText" ) {
10188
                        this.uiDialogTitlebarClose.button({
10189
                                // Ensure that we always pass a string
10190
                                label: "" + value
10191
                        });
10192
                }
10193
10194
                if ( key === "draggable" ) {
10195
                        isDraggable = uiDialog.is(":data(ui-draggable)");
10196
                        if ( isDraggable && !value ) {
10197
                                uiDialog.draggable("destroy");
10198
                        }
10199
10200
                        if ( !isDraggable && value ) {
10201
                                this._makeDraggable();
10202
                        }
10203
                }
10204
10205
                if ( key === "position" ) {
10206
                        this._position();
10207
                }
10208
10209
                if ( key === "resizable" ) {
10210
                        // currently resizable, becoming non-resizable
10211
                        isResizable = uiDialog.is(":data(ui-resizable)");
10212
                        if ( isResizable && !value ) {
10213
                                uiDialog.resizable("destroy");
10214
                        }
10215
10216
                        // currently resizable, changing handles
10217
                        if ( isResizable && typeof value === "string" ) {
10218
                                uiDialog.resizable( "option", "handles", value );
10219
                        }
10220
10221
                        // currently non-resizable, becoming resizable
10222
                        if ( !isResizable && value !== false ) {
10223
                                this._makeResizable();
10224
                        }
10225
                }
10226
10227
                if ( key === "title" ) {
10228
                        this._title( this.uiDialogTitlebar.find(".ui-dialog-title") );
10229
                }
10230
        },
10231
10232
        _size: function() {
10233
                // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
10234
                // divs will both have width and height set, so we need to reset them
10235
                var nonContentHeight, minContentHeight, maxContentHeight,
10236
                        options = this.options;
10237
10238
                // Reset content sizing
10239
                this.element.show().css({
10240
                        width: "auto",
10241
                        minHeight: 0,
10242
                        maxHeight: "none",
10243
                        height: 0
10244
                });
10245
10246
                if ( options.minWidth > options.width ) {
10247
                        options.width = options.minWidth;
10248
                }
10249
10250
                // reset wrapper sizing
10251
                // determine the height of all the non-content elements
10252
                nonContentHeight = this.uiDialog.css({
10253
                                height: "auto",
10254
                                width: options.width
10255
                        })
10256
                        .outerHeight();
10257
                minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
10258
                maxContentHeight = typeof options.maxHeight === "number" ?
10259
                        Math.max( 0, options.maxHeight - nonContentHeight ) :
10260
                        "none";
10261
10262
                if ( options.height === "auto" ) {
10263
                        this.element.css({
10264
                                minHeight: minContentHeight,
10265
                                maxHeight: maxContentHeight,
10266
                                height: "auto"
10267
                        });
10268
                } else {
10269
                        this.element.height( Math.max( 0, options.height - nonContentHeight ) );
10270
                }
10271
10272
                if (this.uiDialog.is(":data(ui-resizable)") ) {
10273
                        this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
10274
                }
10275
        },
10276
10277
        _blockFrames: function() {
10278
                this.iframeBlocks = this.document.find( "iframe" ).map(function() {
10279
                        var iframe = $( this );
10280
10281
                        return $( "<div>" )
10282
                                .css({
10283
                                        position: "absolute",
10284
                                        width: iframe.outerWidth(),
10285
                                        height: iframe.outerHeight()
10286
                                })
10287
                                .appendTo( iframe.parent() )
10288
                                .offset( iframe.offset() )[0];
10289
                });
10290
        },
10291
10292
        _unblockFrames: function() {
10293
                if ( this.iframeBlocks ) {
10294
                        this.iframeBlocks.remove();
10295
                        delete this.iframeBlocks;
10296
                }
10297
        },
10298
10299
        _allowInteraction: function( event ) {
10300
                if ( $( event.target ).closest(".ui-dialog").length ) {
10301
                        return true;
10302
                }
10303
10304
                // TODO: Remove hack when datepicker implements
10305
                // the .ui-front logic (#8989)
10306
                return !!$( event.target ).closest(".ui-datepicker").length;
10307
        },
10308
10309
        _createOverlay: function() {
10310
                if ( !this.options.modal ) {
10311
                        return;
10312
                }
10313
10314
                var that = this,
10315
                        widgetFullName = this.widgetFullName;
10316
                if ( !$.ui.dialog.overlayInstances ) {
10317
                        // Prevent use of anchors and inputs.
10318
                        // We use a delay in case the overlay is created from an
10319
                        // event that we're going to be cancelling. (#2804)
10320
                        this._delay(function() {
10321
                                // Handle .dialog().dialog("close") (#4065)
10322
                                if ( $.ui.dialog.overlayInstances ) {
10323
                                        this.document.bind( "focusin.dialog", function( event ) {
10324
                                                if ( !that._allowInteraction( event ) ) {
10325
                                                        event.preventDefault();
10326
                                                        $(".ui-dialog:visible:last .ui-dialog-content")
10327
                                                                .data( widgetFullName )._focusTabbable();
10328
                                                }
10329
                                        });
10330
                                }
10331
                        });
10332
                }
10333
10334
                this.overlay = $("<div>")
10335
                        .addClass("ui-widget-overlay ui-front")
10336
                        .appendTo( this._appendTo() );
10337
                this._on( this.overlay, {
10338
                        mousedown: "_keepFocus"
10339
                });
10340
                $.ui.dialog.overlayInstances++;
10341
        },
10342
10343
        _destroyOverlay: function() {
10344
                if ( !this.options.modal ) {
10345
                        return;
10346
                }
10347
10348
                if ( this.overlay ) {
10349
                        $.ui.dialog.overlayInstances--;
10350
10351
                        if ( !$.ui.dialog.overlayInstances ) {
10352
                                this.document.unbind( "focusin.dialog" );
10353
                        }
10354
                        this.overlay.remove();
10355
                        this.overlay = null;
10356
                }
10357
        }
10358
});
10359
10360
$.ui.dialog.overlayInstances = 0;
10361
10362
// DEPRECATED
10363
if ( $.uiBackCompat !== false ) {
10364
        // position option with array notation
10365
        // just override with old implementation
10366
        $.widget( "ui.dialog", $.ui.dialog, {
10367
                _position: function() {
10368
                        var position = this.options.position,
10369
                                myAt = [],
10370
                                offset = [ 0, 0 ],
10371
                                isVisible;
10372
10373
                        if ( position ) {
10374
                                if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
10375
                                        myAt = position.split ? position.split(" ") : [ position[0], position[1] ];
10376
                                        if ( myAt.length === 1 ) {
10377
                                                myAt[1] = myAt[0];
10378
                                        }
10379
10380
                                        $.each( [ "left", "top" ], function( i, offsetPosition ) {
10381
                                                if ( +myAt[ i ] === myAt[ i ] ) {
10382
                                                        offset[ i ] = myAt[ i ];
10383
                                                        myAt[ i ] = offsetPosition;
10384
                                                }
10385
                                        });
10386
10387
                                        position = {
10388
                                                my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
10389
                                                        myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
10390
                                                at: myAt.join(" ")
10391
                                        };
10392
                                }
10393
10394
                                position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
10395
                        } else {
10396
                                position = $.ui.dialog.prototype.options.position;
10397
                        }
10398
10399
                        // need to show the dialog to get the actual offset in the position plugin
10400
                        isVisible = this.uiDialog.is(":visible");
10401
                        if ( !isVisible ) {
10402
                                this.uiDialog.show();
10403
                        }
10404
                        this.uiDialog.position( position );
10405
                        if ( !isVisible ) {
10406
                                this.uiDialog.hide();
10407
                        }
10408
                }
10409
        });
10410
}
10411
10412
}( jQuery ) );
10413
10414
(function( $, undefined ) {
10415
10416
var rvertical = /up|down|vertical/,
10417
        rpositivemotion = /up|left|vertical|horizontal/;
10418
10419
$.effects.effect.blind = function( o, done ) {
10420
        // Create element
10421
        var el = $( this ),
10422
                props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10423
                mode = $.effects.setMode( el, o.mode || "hide" ),
10424
                direction = o.direction || "up",
10425
                vertical = rvertical.test( direction ),
10426
                ref = vertical ? "height" : "width",
10427
                ref2 = vertical ? "top" : "left",
10428
                motion = rpositivemotion.test( direction ),
10429
                animation = {},
10430
                show = mode === "show",
10431
                wrapper, distance, margin;
10432
10433
        // if already wrapped, the wrapper's properties are my property. #6245
10434
        if ( el.parent().is( ".ui-effects-wrapper" ) ) {
10435
                $.effects.save( el.parent(), props );
10436
        } else {
10437
                $.effects.save( el, props );
10438
        }
10439
        el.show();
10440
        wrapper = $.effects.createWrapper( el ).css({
10441
                overflow: "hidden"
10442
        });
10443
10444
        distance = wrapper[ ref ]();
10445
        margin = parseFloat( wrapper.css( ref2 ) ) || 0;
10446
10447
        animation[ ref ] = show ? distance : 0;
10448
        if ( !motion ) {
10449
                el
10450
                        .css( vertical ? "bottom" : "right", 0 )
10451
                        .css( vertical ? "top" : "left", "auto" )
10452
                        .css({ position: "absolute" });
10453
10454
                animation[ ref2 ] = show ? margin : distance + margin;
10455
        }
10456
10457
        // start at 0 if we are showing
10458
        if ( show ) {
10459
                wrapper.css( ref, 0 );
10460
                if ( ! motion ) {
10461
                        wrapper.css( ref2, margin + distance );
10462
                }
10463
        }
10464
10465
        // Animate
10466
        wrapper.animate( animation, {
10467
                duration: o.duration,
10468
                easing: o.easing,
10469
                queue: false,
10470
                complete: function() {
10471
                        if ( mode === "hide" ) {
10472
                                el.hide();
10473
                        }
10474
                        $.effects.restore( el, props );
10475
                        $.effects.removeWrapper( el );
10476
                        done();
10477
                }
10478
        });
10479
10480
};
10481
10482
})(jQuery);
10483
10484
(function( $, undefined ) {
10485
10486
$.effects.effect.bounce = function( o, done ) {
10487
        var el = $( this ),
10488
                props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10489
10490
                // defaults:
10491
                mode = $.effects.setMode( el, o.mode || "effect" ),
10492
                hide = mode === "hide",
10493
                show = mode === "show",
10494
                direction = o.direction || "up",
10495
                distance = o.distance,
10496
                times = o.times || 5,
10497
10498
                // number of internal animations
10499
                anims = times * 2 + ( show || hide ? 1 : 0 ),
10500
                speed = o.duration / anims,
10501
                easing = o.easing,
10502
10503
                // utility:
10504
                ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10505
                motion = ( direction === "up" || direction === "left" ),
10506
                i,
10507
                upAnim,
10508
                downAnim,
10509
10510
                // we will need to re-assemble the queue to stack our animations in place
10511
                queue = el.queue(),
10512
                queuelen = queue.length;
10513
10514
        // Avoid touching opacity to prevent clearType and PNG issues in IE
10515
        if ( show || hide ) {
10516
                props.push( "opacity" );
10517
        }
10518
10519
        $.effects.save( el, props );
10520
        el.show();
10521
        $.effects.createWrapper( el ); // Create Wrapper
10522
10523
        // default distance for the BIGGEST bounce is the outer Distance / 3
10524
        if ( !distance ) {
10525
                distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
10526
        }
10527
10528
        if ( show ) {
10529
                downAnim = { opacity: 1 };
10530
                downAnim[ ref ] = 0;
10531
10532
                // if we are showing, force opacity 0 and set the initial position
10533
                // then do the "first" animation
10534
                el.css( "opacity", 0 )
10535
                        .css( ref, motion ? -distance * 2 : distance * 2 )
10536
                        .animate( downAnim, speed, easing );
10537
        }
10538
10539
        // start at the smallest distance if we are hiding
10540
        if ( hide ) {
10541
                distance = distance / Math.pow( 2, times - 1 );
10542
        }
10543
10544
        downAnim = {};
10545
        downAnim[ ref ] = 0;
10546
        // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
10547
        for ( i = 0; i < times; i++ ) {
10548
                upAnim = {};
10549
                upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
10550
10551
                el.animate( upAnim, speed, easing )
10552
                        .animate( downAnim, speed, easing );
10553
10554
                distance = hide ? distance * 2 : distance / 2;
10555
        }
10556
10557
        // Last Bounce when Hiding
10558
        if ( hide ) {
10559
                upAnim = { opacity: 0 };
10560
                upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
10561
10562
                el.animate( upAnim, speed, easing );
10563
        }
10564
10565
        el.queue(function() {
10566
                if ( hide ) {
10567
                        el.hide();
10568
                }
10569
                $.effects.restore( el, props );
10570
                $.effects.removeWrapper( el );
10571
                done();
10572
        });
10573
10574
        // inject all the animations we just queued to be first in line (after "inprogress")
10575
        if ( queuelen > 1) {
10576
                queue.splice.apply( queue,
10577
                        [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
10578
        }
10579
        el.dequeue();
10580
10581
};
10582
10583
})(jQuery);
10584
10585
(function( $, undefined ) {
10586
10587
$.effects.effect.clip = function( o, done ) {
10588
        // Create element
10589
        var el = $( this ),
10590
                props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10591
                mode = $.effects.setMode( el, o.mode || "hide" ),
10592
                show = mode === "show",
10593
                direction = o.direction || "vertical",
10594
                vert = direction === "vertical",
10595
                size = vert ? "height" : "width",
10596
                position = vert ? "top" : "left",
10597
                animation = {},
10598
                wrapper, animate, distance;
10599
10600
        // Save & Show
10601
        $.effects.save( el, props );
10602
        el.show();
10603
10604
        // Create Wrapper
10605
        wrapper = $.effects.createWrapper( el ).css({
10606
                overflow: "hidden"
10607
        });
10608
        animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
10609
        distance = animate[ size ]();
10610
10611
        // Shift
10612
        if ( show ) {
10613
                animate.css( size, 0 );
10614
                animate.css( position, distance / 2 );
10615
        }
10616
10617
        // Create Animation Object:
10618
        animation[ size ] = show ? distance : 0;
10619
        animation[ position ] = show ? 0 : distance / 2;
10620
10621
        // Animate
10622
        animate.animate( animation, {
10623
                queue: false,
10624
                duration: o.duration,
10625
                easing: o.easing,
10626
                complete: function() {
10627
                        if ( !show ) {
10628
                                el.hide();
10629
                        }
10630
                        $.effects.restore( el, props );
10631
                        $.effects.removeWrapper( el );
10632
                        done();
10633
                }
10634
        });
10635
10636
};
10637
10638
})(jQuery);
10639
10640
(function( $, undefined ) {
10641
10642
$.effects.effect.drop = function( o, done ) {
10643
10644
        var el = $( this ),
10645
                props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
10646
                mode = $.effects.setMode( el, o.mode || "hide" ),
10647
                show = mode === "show",
10648
                direction = o.direction || "left",
10649
                ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10650
                motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
10651
                animation = {
10652
                        opacity: show ? 1 : 0
10653
                },
10654
                distance;
10655
10656
        // Adjust
10657
        $.effects.save( el, props );
10658
        el.show();
10659
        $.effects.createWrapper( el );
10660
10661
        distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
10662
10663
        if ( show ) {
10664
                el
10665
                        .css( "opacity", 0 )
10666
                        .css( ref, motion === "pos" ? -distance : distance );
10667
        }
10668
10669
        // Animation
10670
        animation[ ref ] = ( show ?
10671
                ( motion === "pos" ? "+=" : "-=" ) :
10672
                ( motion === "pos" ? "-=" : "+=" ) ) +
10673
                distance;
10674
10675
        // Animate
10676
        el.animate( animation, {
10677
                queue: false,
10678
                duration: o.duration,
10679
                easing: o.easing,
10680
                complete: function() {
10681
                        if ( mode === "hide" ) {
10682
                                el.hide();
10683
                        }
10684
                        $.effects.restore( el, props );
10685
                        $.effects.removeWrapper( el );
10686
                        done();
10687
                }
10688
        });
10689
};
10690
10691
})(jQuery);
10692
10693
(function( $, undefined ) {
10694
10695
$.effects.effect.explode = function( o, done ) {
10696
10697
        var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
10698
                cells = rows,
10699
                el = $( this ),
10700
                mode = $.effects.setMode( el, o.mode || "hide" ),
10701
                show = mode === "show",
10702
10703
                // show and then visibility:hidden the element before calculating offset
10704
                offset = el.show().css( "visibility", "hidden" ).offset(),
10705
10706
                // width and height of a piece
10707
                width = Math.ceil( el.outerWidth() / cells ),
10708
                height = Math.ceil( el.outerHeight() / rows ),
10709
                pieces = [],
10710
10711
                // loop
10712
                i, j, left, top, mx, my;
10713
10714
        // children animate complete:
10715
        function childComplete() {
10716
                pieces.push( this );
10717
                if ( pieces.length === rows * cells ) {
10718
                        animComplete();
10719
                }
10720
        }
10721
10722
        // clone the element for each row and cell.
10723
        for( i = 0; i < rows ; i++ ) { // ===>
10724
                top = offset.top + i * height;
10725
                my = i - ( rows - 1 ) / 2 ;
10726
10727
                for( j = 0; j < cells ; j++ ) { // |||
10728
                        left = offset.left + j * width;
10729
                        mx = j - ( cells - 1 ) / 2 ;
10730
10731
                        // Create a clone of the now hidden main element that will be absolute positioned
10732
                        // within a wrapper div off the -left and -top equal to size of our pieces
10733
                        el
10734
                                .clone()
10735
                                .appendTo( "body" )
10736
                                .wrap( "<div></div>" )
10737
                                .css({
10738
                                        position: "absolute",
10739
                                        visibility: "visible",
10740
                                        left: -j * width,
10741
                                        top: -i * height
10742
                                })
10743
10744
                        // select the wrapper - make it overflow: hidden and absolute positioned based on
10745
                        // where the original was located +left and +top equal to the size of pieces
10746
                                .parent()
10747
                                .addClass( "ui-effects-explode" )
10748
                                .css({
10749
                                        position: "absolute",
10750
                                        overflow: "hidden",
10751
                                        width: width,
10752
                                        height: height,
10753
                                        left: left + ( show ? mx * width : 0 ),
10754
                                        top: top + ( show ? my * height : 0 ),
10755
                                        opacity: show ? 0 : 1
10756
                                }).animate({
10757
                                        left: left + ( show ? 0 : mx * width ),
10758
                                        top: top + ( show ? 0 : my * height ),
10759
                                        opacity: show ? 1 : 0
10760
                                }, o.duration || 500, o.easing, childComplete );
10761
                }
10762
        }
10763
10764
        function animComplete() {
10765
                el.css({
10766
                        visibility: "visible"
10767
                });
10768
                $( pieces ).remove();
10769
                if ( !show ) {
10770
                        el.hide();
10771
                }
10772
                done();
10773
        }
10774
};
10775
10776
})(jQuery);
10777
10778
(function( $, undefined ) {
10779
10780
$.effects.effect.fade = function( o, done ) {
10781
        var el = $( this ),
10782
                mode = $.effects.setMode( el, o.mode || "toggle" );
10783
10784
        el.animate({
10785
                opacity: mode
10786
        }, {
10787
                queue: false,
10788
                duration: o.duration,
10789
                easing: o.easing,
10790
                complete: done
10791
        });
10792
};
10793
10794
})( jQuery );
10795
10796
(function( $, undefined ) {
10797
10798
$.effects.effect.fold = function( o, done ) {
10799
10800
        // Create element
10801
        var el = $( this ),
10802
                props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10803
                mode = $.effects.setMode( el, o.mode || "hide" ),
10804
                show = mode === "show",
10805
                hide = mode === "hide",
10806
                size = o.size || 15,
10807
                percent = /([0-9]+)%/.exec( size ),
10808
                horizFirst = !!o.horizFirst,
10809
                widthFirst = show !== horizFirst,
10810
                ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
10811
                duration = o.duration / 2,
10812
                wrapper, distance,
10813
                animation1 = {},
10814
                animation2 = {};
10815
10816
        $.effects.save( el, props );
10817
        el.show();
10818
10819
        // Create Wrapper
10820
        wrapper = $.effects.createWrapper( el ).css({
10821
                overflow: "hidden"
10822
        });
10823
        distance = widthFirst ?
10824
                [ wrapper.width(), wrapper.height() ] :
10825
                [ wrapper.height(), wrapper.width() ];
10826
10827
        if ( percent ) {
10828
                size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
10829
        }
10830
        if ( show ) {
10831
                wrapper.css( horizFirst ? {
10832
                        height: 0,
10833
                        width: size
10834
                } : {
10835
                        height: size,
10836
                        width: 0
10837
                });
10838
        }
10839
10840
        // Animation
10841
        animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
10842
        animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
10843
10844
        // Animate
10845
        wrapper
10846
                .animate( animation1, duration, o.easing )
10847
                .animate( animation2, duration, o.easing, function() {
10848
                        if ( hide ) {
10849
                                el.hide();
10850
                        }
10851
                        $.effects.restore( el, props );
10852
                        $.effects.removeWrapper( el );
10853
                        done();
10854
                });
10855
10856
};
10857
10858
})(jQuery);
10859
10860
(function( $, undefined ) {
10861
10862
$.effects.effect.highlight = function( o, done ) {
10863
        var elem = $( this ),
10864
                props = [ "backgroundImage", "backgroundColor", "opacity" ],
10865
                mode = $.effects.setMode( elem, o.mode || "show" ),
10866
                animation = {
10867
                        backgroundColor: elem.css( "backgroundColor" )
10868
                };
10869
10870
        if (mode === "hide") {
10871
                animation.opacity = 0;
10872
        }
10873
10874
        $.effects.save( elem, props );
10875
10876
        elem
10877
                .show()
10878
                .css({
10879
                        backgroundImage: "none",
10880
                        backgroundColor: o.color || "#ffff99"
10881
                })
10882
                .animate( animation, {
10883
                        queue: false,
10884
                        duration: o.duration,
10885
                        easing: o.easing,
10886
                        complete: function() {
10887
                                if ( mode === "hide" ) {
10888
                                        elem.hide();
10889
                                }
10890
                                $.effects.restore( elem, props );
10891
                                done();
10892
                        }
10893
                });
10894
};
10895
10896
})(jQuery);
10897
10898
(function( $, undefined ) {
10899
10900
$.effects.effect.pulsate = function( o, done ) {
10901
        var elem = $( this ),
10902
                mode = $.effects.setMode( elem, o.mode || "show" ),
10903
                show = mode === "show",
10904
                hide = mode === "hide",
10905
                showhide = ( show || mode === "hide" ),
10906
10907
                // showing or hiding leaves of the "last" animation
10908
                anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
10909
                duration = o.duration / anims,
10910
                animateTo = 0,
10911
                queue = elem.queue(),
10912
                queuelen = queue.length,
10913
                i;
10914
10915
        if ( show || !elem.is(":visible")) {
10916
                elem.css( "opacity", 0 ).show();
10917
                animateTo = 1;
10918
        }
10919
10920
        // anims - 1 opacity "toggles"
10921
        for ( i = 1; i < anims; i++ ) {
10922
                elem.animate({
10923
                        opacity: animateTo
10924
                }, duration, o.easing );
10925
                animateTo = 1 - animateTo;
10926
        }
10927
10928
        elem.animate({
10929
                opacity: animateTo
10930
        }, duration, o.easing);
10931
10932
        elem.queue(function() {
10933
                if ( hide ) {
10934
                        elem.hide();
10935
                }
10936
                done();
10937
        });
10938
10939
        // We just queued up "anims" animations, we need to put them next in the queue
10940
        if ( queuelen > 1 ) {
10941
                queue.splice.apply( queue,
10942
                        [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
10943
        }
10944
        elem.dequeue();
10945
};
10946
10947
})(jQuery);
10948
10949
(function( $, undefined ) {
10950
10951
$.effects.effect.puff = function( o, done ) {
10952
        var elem = $( this ),
10953
                mode = $.effects.setMode( elem, o.mode || "hide" ),
10954
                hide = mode === "hide",
10955
                percent = parseInt( o.percent, 10 ) || 150,
10956
                factor = percent / 100,
10957
                original = {
10958
                        height: elem.height(),
10959
                        width: elem.width(),
10960
                        outerHeight: elem.outerHeight(),
10961
                        outerWidth: elem.outerWidth()
10962
                };
10963
10964
        $.extend( o, {
10965
                effect: "scale",
10966
                queue: false,
10967
                fade: true,
10968
                mode: mode,
10969
                complete: done,
10970
                percent: hide ? percent : 100,
10971
                from: hide ?
10972
                        original :
10973
                        {
10974
                                height: original.height * factor,
10975
                                width: original.width * factor,
10976
                                outerHeight: original.outerHeight * factor,
10977
                                outerWidth: original.outerWidth * factor
10978
                        }
10979
        });
10980
10981
        elem.effect( o );
10982
};
10983
10984
$.effects.effect.scale = function( o, done ) {
10985
10986
        // Create element
10987
        var el = $( this ),
10988
                options = $.extend( true, {}, o ),
10989
                mode = $.effects.setMode( el, o.mode || "effect" ),
10990
                percent = parseInt( o.percent, 10 ) ||
10991
                        ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
10992
                direction = o.direction || "both",
10993
                origin = o.origin,
10994
                original = {
10995
                        height: el.height(),
10996
                        width: el.width(),
10997
                        outerHeight: el.outerHeight(),
10998
                        outerWidth: el.outerWidth()
10999
                },
11000
                factor = {
11001
                        y: direction !== "horizontal" ? (percent / 100) : 1,
11002
                        x: direction !== "vertical" ? (percent / 100) : 1
11003
                };
11004
11005
        // We are going to pass this effect to the size effect:
11006
        options.effect = "size";
11007
        options.queue = false;
11008
        options.complete = done;
11009
11010
        // Set default origin and restore for show/hide
11011
        if ( mode !== "effect" ) {
11012
                options.origin = origin || ["middle","center"];
11013
                options.restore = true;
11014
        }
11015
11016
        options.from = o.from || ( mode === "show" ? {
11017
                height: 0,
11018
                width: 0,
11019
                outerHeight: 0,
11020
                outerWidth: 0
11021
        } : original );
11022
        options.to = {
11023
                height: original.height * factor.y,
11024
                width: original.width * factor.x,
11025
                outerHeight: original.outerHeight * factor.y,
11026
                outerWidth: original.outerWidth * factor.x
11027
        };
11028
11029
        // Fade option to support puff
11030
        if ( options.fade ) {
11031
                if ( mode === "show" ) {
11032
                        options.from.opacity = 0;
11033
                        options.to.opacity = 1;
11034
                }
11035
                if ( mode === "hide" ) {
11036
                        options.from.opacity = 1;
11037
                        options.to.opacity = 0;
11038
                }
11039
        }
11040
11041
        // Animate
11042
        el.effect( options );
11043
11044
};
11045
11046
$.effects.effect.size = function( o, done ) {
11047
11048
        // Create element
11049
        var original, baseline, factor,
11050
                el = $( this ),
11051
                props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
11052
11053
                // Always restore
11054
                props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
11055
11056
                // Copy for children
11057
                props2 = [ "width", "height", "overflow" ],
11058
                cProps = [ "fontSize" ],
11059
                vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
11060
                hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
11061
11062
                // Set options
11063
                mode = $.effects.setMode( el, o.mode || "effect" ),
11064
                restore = o.restore || mode !== "effect",
11065
                scale = o.scale || "both",
11066
                origin = o.origin || [ "middle", "center" ],
11067
                position = el.css( "position" ),
11068
                props = restore ? props0 : props1,
11069
                zero = {
11070
                        height: 0,
11071
                        width: 0,
11072
                        outerHeight: 0,
11073
                        outerWidth: 0
11074
                };
11075
11076
        if ( mode === "show" ) {
11077
                el.show();
11078
        }
11079
        original = {
11080
                height: el.height(),
11081
                width: el.width(),
11082
                outerHeight: el.outerHeight(),
11083
                outerWidth: el.outerWidth()
11084
        };
11085
11086
        if ( o.mode === "toggle" && mode === "show" ) {
11087
                el.from = o.to || zero;
11088
                el.to = o.from || original;
11089
        } else {
11090
                el.from = o.from || ( mode === "show" ? zero : original );
11091
                el.to = o.to || ( mode === "hide" ? zero : original );
11092
        }
11093
11094
        // Set scaling factor
11095
        factor = {
11096
                from: {
11097
                        y: el.from.height / original.height,
11098
                        x: el.from.width / original.width
11099
                },
11100
                to: {
11101
                        y: el.to.height / original.height,
11102
                        x: el.to.width / original.width
11103
                }
11104
        };
11105
11106
        // Scale the css box
11107
        if ( scale === "box" || scale === "both" ) {
11108
11109
                // Vertical props scaling
11110
                if ( factor.from.y !== factor.to.y ) {
11111
                        props = props.concat( vProps );
11112
                        el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
11113
                        el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
11114
                }
11115
11116
                // Horizontal props scaling
11117
                if ( factor.from.x !== factor.to.x ) {
11118
                        props = props.concat( hProps );
11119
                        el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
11120
                        el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
11121
                }
11122
        }
11123
11124
        // Scale the content
11125
        if ( scale === "content" || scale === "both" ) {
11126
11127
                // Vertical props scaling
11128
                if ( factor.from.y !== factor.to.y ) {
11129
                        props = props.concat( cProps ).concat( props2 );
11130
                        el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
11131
                        el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
11132
                }
11133
        }
11134
11135
        $.effects.save( el, props );
11136
        el.show();
11137
        $.effects.createWrapper( el );
11138
        el.css( "overflow", "hidden" ).css( el.from );
11139
11140
        // Adjust
11141
        if (origin) { // Calculate baseline shifts
11142
                baseline = $.effects.getBaseline( origin, original );
11143
                el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
11144
                el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
11145
                el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
11146
                el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
11147
        }
11148
        el.css( el.from ); // set top & left
11149
11150
        // Animate
11151
        if ( scale === "content" || scale === "both" ) { // Scale the children
11152
11153
                // Add margins/font-size
11154
                vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
11155
                hProps = hProps.concat([ "marginLeft", "marginRight" ]);
11156
                props2 = props0.concat(vProps).concat(hProps);
11157
11158
                el.find( "*[width]" ).each( function(){
11159
                        var child = $( this ),
11160
                                c_original = {
11161
                                        height: child.height(),
11162
                                        width: child.width(),
11163
                                        outerHeight: child.outerHeight(),
11164
                                        outerWidth: child.outerWidth()
11165
                                };
11166
                        if (restore) {
11167
                                $.effects.save(child, props2);
11168
                        }
11169
11170
                        child.from = {
11171
                                height: c_original.height * factor.from.y,
11172
                                width: c_original.width * factor.from.x,
11173
                                outerHeight: c_original.outerHeight * factor.from.y,
11174
                                outerWidth: c_original.outerWidth * factor.from.x
11175
                        };
11176
                        child.to = {
11177
                                height: c_original.height * factor.to.y,
11178
                                width: c_original.width * factor.to.x,
11179
                                outerHeight: c_original.height * factor.to.y,
11180
                                outerWidth: c_original.width * factor.to.x
11181
                        };
11182
11183
                        // Vertical props scaling
11184
                        if ( factor.from.y !== factor.to.y ) {
11185
                                child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
11186
                                child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
11187
                        }
11188
11189
                        // Horizontal props scaling
11190
                        if ( factor.from.x !== factor.to.x ) {
11191
                                child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
11192
                                child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
11193
                        }
11194
11195
                        // Animate children
11196
                        child.css( child.from );
11197
                        child.animate( child.to, o.duration, o.easing, function() {
11198
11199
                                // Restore children
11200
                                if ( restore ) {
11201
                                        $.effects.restore( child, props2 );
11202
                                }
11203
                        });
11204
                });
11205
        }
11206
11207
        // Animate
11208
        el.animate( el.to, {
11209
                queue: false,
11210
                duration: o.duration,
11211
                easing: o.easing,
11212
                complete: function() {
11213
                        if ( el.to.opacity === 0 ) {
11214
                                el.css( "opacity", el.from.opacity );
11215
                        }
11216
                        if( mode === "hide" ) {
11217
                                el.hide();
11218
                        }
11219
                        $.effects.restore( el, props );
11220
                        if ( !restore ) {
11221
11222
                                // we need to calculate our new positioning based on the scaling
11223
                                if ( position === "static" ) {
11224
                                        el.css({
11225
                                                position: "relative",
11226
                                                top: el.to.top,
11227
                                                left: el.to.left
11228
                                        });
11229
                                } else {
11230
                                        $.each([ "top", "left" ], function( idx, pos ) {
11231
                                                el.css( pos, function( _, str ) {
11232
                                                        var val = parseInt( str, 10 ),
11233
                                                                toRef = idx ? el.to.left : el.to.top;
11234
11235
                                                        // if original was "auto", recalculate the new value from wrapper
11236
                                                        if ( str === "auto" ) {
11237
                                                                return toRef + "px";
11238
                                                        }
11239
11240
                                                        return val + toRef + "px";
11241
                                                });
11242
                                        });
11243
                                }
11244
                        }
11245
11246
                        $.effects.removeWrapper( el );
11247
                        done();
11248
                }
11249
        });
11250
11251
};
11252
11253
})(jQuery);
11254
11255
(function( $, undefined ) {
11256
11257
$.effects.effect.shake = function( o, done ) {
11258
11259
        var el = $( this ),
11260
                props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
11261
                mode = $.effects.setMode( el, o.mode || "effect" ),
11262
                direction = o.direction || "left",
11263
                distance = o.distance || 20,
11264
                times = o.times || 3,
11265
                anims = times * 2 + 1,
11266
                speed = Math.round(o.duration/anims),
11267
                ref = (direction === "up" || direction === "down") ? "top" : "left",
11268
                positiveMotion = (direction === "up" || direction === "left"),
11269
                animation = {},
11270
                animation1 = {},
11271
                animation2 = {},
11272
                i,
11273
11274
                // we will need to re-assemble the queue to stack our animations in place
11275
                queue = el.queue(),
11276
                queuelen = queue.length;
11277
11278
        $.effects.save( el, props );
11279
        el.show();
11280
        $.effects.createWrapper( el );
11281
11282
        // Animation
11283
        animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
11284
        animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
11285
        animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
11286
11287
        // Animate
11288
        el.animate( animation, speed, o.easing );
11289
11290
        // Shakes
11291
        for ( i = 1; i < times; i++ ) {
11292
                el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
11293
        }
11294
        el
11295
                .animate( animation1, speed, o.easing )
11296
                .animate( animation, speed / 2, o.easing )
11297
                .queue(function() {
11298
                        if ( mode === "hide" ) {
11299
                                el.hide();
11300
                        }
11301
                        $.effects.restore( el, props );
11302
                        $.effects.removeWrapper( el );
11303
                        done();
11304
                });
11305
11306
        // inject all the animations we just queued to be first in line (after "inprogress")
11307
        if ( queuelen > 1) {
11308
                queue.splice.apply( queue,
11309
                        [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
11310
        }
11311
        el.dequeue();
11312
11313
};
11314
11315
})(jQuery);
11316
11317
(function( $, undefined ) {
11318
11319
$.effects.effect.slide = function( o, done ) {
11320
11321
        // Create element
11322
        var el = $( this ),
11323
                props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
11324
                mode = $.effects.setMode( el, o.mode || "show" ),
11325
                show = mode === "show",
11326
                direction = o.direction || "left",
11327
                ref = (direction === "up" || direction === "down") ? "top" : "left",
11328
                positiveMotion = (direction === "up" || direction === "left"),
11329
                distance,
11330
                animation = {};
11331
11332
        // Adjust
11333
        $.effects.save( el, props );
11334
        el.show();
11335
        distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
11336
11337
        $.effects.createWrapper( el ).css({
11338
                overflow: "hidden"
11339
        });
11340
11341
        if ( show ) {
11342
                el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
11343
        }
11344
11345
        // Animation
11346
        animation[ ref ] = ( show ?
11347
                ( positiveMotion ? "+=" : "-=") :
11348
                ( positiveMotion ? "-=" : "+=")) +
11349
                distance;
11350
11351
        // Animate
11352
        el.animate( animation, {
11353
                queue: false,
11354
                duration: o.duration,
11355
                easing: o.easing,
11356
                complete: function() {
11357
                        if ( mode === "hide" ) {
11358
                                el.hide();
11359
                        }
11360
                        $.effects.restore( el, props );
11361
                        $.effects.removeWrapper( el );
11362
                        done();
11363
                }
11364
        });
11365
};
11366
11367
})(jQuery);
11368
11369
(function( $, undefined ) {
11370
11371
$.effects.effect.transfer = function( o, done ) {
11372
        var elem = $( this ),
11373
                target = $( o.to ),
11374
                targetFixed = target.css( "position" ) === "fixed",
11375
                body = $("body"),
11376
                fixTop = targetFixed ? body.scrollTop() : 0,
11377
                fixLeft = targetFixed ? body.scrollLeft() : 0,
11378
                endPosition = target.offset(),
11379
                animation = {
11380
                        top: endPosition.top - fixTop ,
11381
                        left: endPosition.left - fixLeft ,
11382
                        height: target.innerHeight(),
11383
                        width: target.innerWidth()
11384
                },
11385
                startPosition = elem.offset(),
11386
                transfer = $( "<div class='ui-effects-transfer'></div>" )
11387
                        .appendTo( document.body )
11388
                        .addClass( o.className )
11389
                        .css({
11390
                                top: startPosition.top - fixTop ,
11391
                                left: startPosition.left - fixLeft ,
11392
                                height: elem.innerHeight(),
11393
                                width: elem.innerWidth(),
11394
                                position: targetFixed ? "fixed" : "absolute"
11395
                        })
11396
                        .animate( animation, o.duration, o.easing, function() {
11397
                                transfer.remove();
11398
                                done();
11399
                        });
11400
};
11401
11402
})(jQuery);
11403
11404
(function( $, undefined ) {
11405
11406
$.widget( "ui.menu", {
11407
        version: "1.10.2",
11408
        defaultElement: "<ul>",
11409
        delay: 300,
11410
        options: {
11411
                icons: {
11412
                        submenu: "ui-icon-carat-1-e"
11413
                },
11414
                menus: "ul",
11415
                position: {
11416
                        my: "left top",
11417
                        at: "right top"
11418
                },
11419
                role: "menu",
11420
11421
                // callbacks
11422
                blur: null,
11423
                focus: null,
11424
                select: null
11425 85ad3d82 Assos Assos
        },
11426
11427 503b3f7b Assos Assos
        _create: function() {
11428
                this.activeMenu = this.element;
11429
                // flag used to prevent firing of the click handler
11430
                // as the event bubbles up through nested menus
11431
                this.mouseHandled = false;
11432
                this.element
11433
                        .uniqueId()
11434
                        .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
11435
                        .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
11436
                        .attr({
11437
                                role: this.options.role,
11438
                                tabIndex: 0
11439
                        })
11440
                        // need to catch all clicks on disabled menu
11441
                        // not possible through _on
11442
                        .bind( "click" + this.eventNamespace, $.proxy(function( event ) {
11443
                                if ( this.options.disabled ) {
11444
                                        event.preventDefault();
11445 85ad3d82 Assos Assos
                                }
11446 503b3f7b Assos Assos
                        }, this ));
11447 85ad3d82 Assos Assos
11448 503b3f7b Assos Assos
                if ( this.options.disabled ) {
11449
                        this.element
11450
                                .addClass( "ui-state-disabled" )
11451
                                .attr( "aria-disabled", "true" );
11452 85ad3d82 Assos Assos
                }
11453 503b3f7b Assos Assos
11454
                this._on({
11455
                        // Prevent focus from sticking to links inside menu after clicking
11456
                        // them (focus should always stay on UL during navigation).
11457
                        "mousedown .ui-menu-item > a": function( event ) {
11458
                                event.preventDefault();
11459
                        },
11460
                        "click .ui-state-disabled > a": function( event ) {
11461
                                event.preventDefault();
11462
                        },
11463
                        "click .ui-menu-item:has(a)": function( event ) {
11464
                                var target = $( event.target ).closest( ".ui-menu-item" );
11465
                                if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
11466
                                        this.mouseHandled = true;
11467
11468
                                        this.select( event );
11469
                                        // Open submenu on click
11470
                                        if ( target.has( ".ui-menu" ).length ) {
11471
                                                this.expand( event );
11472
                                        } else if ( !this.element.is( ":focus" ) ) {
11473
                                                // Redirect focus to the menu
11474
                                                this.element.trigger( "focus", [ true ] );
11475
11476
                                                // If the active item is on the top level, let it stay active.
11477
                                                // Otherwise, blur the active item since it is no longer visible.
11478
                                                if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
11479
                                                        clearTimeout( this.timer );
11480
                                                }
11481
                                        }
11482
                                }
11483
                        },
11484
                        "mouseenter .ui-menu-item": function( event ) {
11485
                                var target = $( event.currentTarget );
11486
                                // Remove ui-state-active class from siblings of the newly focused menu item
11487
                                // to avoid a jump caused by adjacent elements both having a class with a border
11488
                                target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
11489
                                this.focus( event, target );
11490
                        },
11491
                        mouseleave: "collapseAll",
11492
                        "mouseleave .ui-menu": "collapseAll",
11493
                        focus: function( event, keepActiveItem ) {
11494
                                // If there's already an active item, keep it active
11495
                                // If not, activate the first item
11496
                                var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
11497
11498
                                if ( !keepActiveItem ) {
11499
                                        this.focus( event, item );
11500
                                }
11501
                        },
11502
                        blur: function( event ) {
11503
                                this._delay(function() {
11504
                                        if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
11505
                                                this.collapseAll( event );
11506
                                        }
11507
                                });
11508
                        },
11509
                        keydown: "_keydown"
11510 85ad3d82 Assos Assos
                });
11511 503b3f7b Assos Assos
11512
                this.refresh();
11513
11514
                // Clicks outside of a menu collapse any open menus
11515
                this._on( this.document, {
11516
                        click: function( event ) {
11517
                                if ( !$( event.target ).closest( ".ui-menu" ).length ) {
11518
                                        this.collapseAll( event );
11519 85ad3d82 Assos Assos
                                }
11520 503b3f7b Assos Assos
11521
                                // Reset the mouseHandled flag
11522
                                this.mouseHandled = false;
11523
                        }
11524
                });
11525 85ad3d82 Assos Assos
        },
11526
11527 503b3f7b Assos Assos
        _destroy: function() {
11528
                // Destroy (sub)menus
11529
                this.element
11530
                        .removeAttr( "aria-activedescendant" )
11531
                        .find( ".ui-menu" ).addBack()
11532
                                .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
11533
                                .removeAttr( "role" )
11534
                                .removeAttr( "tabIndex" )
11535
                                .removeAttr( "aria-labelledby" )
11536
                                .removeAttr( "aria-expanded" )
11537
                                .removeAttr( "aria-hidden" )
11538
                                .removeAttr( "aria-disabled" )
11539
                                .removeUniqueId()
11540
                                .show();
11541
11542
                // Destroy menu items
11543
                this.element.find( ".ui-menu-item" )
11544
                        .removeClass( "ui-menu-item" )
11545
                        .removeAttr( "role" )
11546
                        .removeAttr( "aria-disabled" )
11547
                        .children( "a" )
11548
                                .removeUniqueId()
11549
                                .removeClass( "ui-corner-all ui-state-hover" )
11550
                                .removeAttr( "tabIndex" )
11551
                                .removeAttr( "role" )
11552
                                .removeAttr( "aria-haspopup" )
11553
                                .children().each( function() {
11554
                                        var elem = $( this );
11555
                                        if ( elem.data( "ui-menu-submenu-carat" ) ) {
11556
                                                elem.remove();
11557 85ad3d82 Assos Assos
                                        }
11558 503b3f7b Assos Assos
                                });
11559 85ad3d82 Assos Assos
11560 503b3f7b Assos Assos
                // Destroy menu dividers
11561
                this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
11562 85ad3d82 Assos Assos
        },
11563
11564 503b3f7b Assos Assos
        _keydown: function( event ) {
11565
                /*jshint maxcomplexity:20*/
11566
                var match, prev, character, skip, regex,
11567
                        preventDefault = true;
11568 85ad3d82 Assos Assos
11569 503b3f7b Assos Assos
                function escape( value ) {
11570
                        return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
11571
                }
11572 85ad3d82 Assos Assos
11573 503b3f7b Assos Assos
                switch ( event.keyCode ) {
11574
                case $.ui.keyCode.PAGE_UP:
11575
                        this.previousPage( event );
11576
                        break;
11577
                case $.ui.keyCode.PAGE_DOWN:
11578
                        this.nextPage( event );
11579
                        break;
11580
                case $.ui.keyCode.HOME:
11581
                        this._move( "first", "first", event );
11582
                        break;
11583
                case $.ui.keyCode.END:
11584
                        this._move( "last", "last", event );
11585
                        break;
11586
                case $.ui.keyCode.UP:
11587
                        this.previous( event );
11588
                        break;
11589
                case $.ui.keyCode.DOWN:
11590
                        this.next( event );
11591
                        break;
11592
                case $.ui.keyCode.LEFT:
11593
                        this.collapse( event );
11594
                        break;
11595
                case $.ui.keyCode.RIGHT:
11596
                        if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
11597
                                this.expand( event );
11598
                        }
11599
                        break;
11600
                case $.ui.keyCode.ENTER:
11601
                case $.ui.keyCode.SPACE:
11602
                        this._activate( event );
11603
                        break;
11604
                case $.ui.keyCode.ESCAPE:
11605
                        this.collapse( event );
11606
                        break;
11607
                default:
11608
                        preventDefault = false;
11609
                        prev = this.previousFilter || "";
11610
                        character = String.fromCharCode( event.keyCode );
11611
                        skip = false;
11612 85ad3d82 Assos Assos
11613 503b3f7b Assos Assos
                        clearTimeout( this.filterTimer );
11614 85ad3d82 Assos Assos
11615 503b3f7b Assos Assos
                        if ( character === prev ) {
11616
                                skip = true;
11617
                        } else {
11618
                                character = prev + character;
11619
                        }
11620 85ad3d82 Assos Assos
11621 503b3f7b Assos Assos
                        regex = new RegExp( "^" + escape( character ), "i" );
11622
                        match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
11623
                                return regex.test( $( this ).children( "a" ).text() );
11624
                        });
11625
                        match = skip && match.index( this.active.next() ) !== -1 ?
11626
                                this.active.nextAll( ".ui-menu-item" ) :
11627
                                match;
11628
11629
                        // If no matches on the current filter, reset to the last character pressed
11630
                        // to move down the menu to the first item that starts with that character
11631
                        if ( !match.length ) {
11632
                                character = String.fromCharCode( event.keyCode );
11633
                                regex = new RegExp( "^" + escape( character ), "i" );
11634
                                match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
11635
                                        return regex.test( $( this ).children( "a" ).text() );
11636
                                });
11637
                        }
11638
11639
                        if ( match.length ) {
11640
                                this.focus( event, match );
11641
                                if ( match.length > 1 ) {
11642
                                        this.previousFilter = character;
11643
                                        this.filterTimer = this._delay(function() {
11644
                                                delete this.previousFilter;
11645
                                        }, 1000 );
11646
                                } else {
11647
                                        delete this.previousFilter;
11648 85ad3d82 Assos Assos
                                }
11649 503b3f7b Assos Assos
                        } else {
11650
                                delete this.previousFilter;
11651 85ad3d82 Assos Assos
                        }
11652
                }
11653
11654 503b3f7b Assos Assos
                if ( preventDefault ) {
11655
                        event.preventDefault();
11656 85ad3d82 Assos Assos
                }
11657
        },
11658
11659 503b3f7b Assos Assos
        _activate: function( event ) {
11660
                if ( !this.active.is( ".ui-state-disabled" ) ) {
11661
                        if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
11662
                                this.expand( event );
11663
                        } else {
11664
                                this.select( event );
11665
                        }
11666 85ad3d82 Assos Assos
                }
11667
        },
11668
11669 503b3f7b Assos Assos
        refresh: function() {
11670
                var menus,
11671
                        icon = this.options.icons.submenu,
11672
                        submenus = this.element.find( this.options.menus );
11673 85ad3d82 Assos Assos
11674 503b3f7b Assos Assos
                // Initialize nested menus
11675
                submenus.filter( ":not(.ui-menu)" )
11676
                        .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
11677
                        .hide()
11678
                        .attr({
11679
                                role: this.options.role,
11680
                                "aria-hidden": "true",
11681
                                "aria-expanded": "false"
11682
                        })
11683
                        .each(function() {
11684
                                var menu = $( this ),
11685
                                        item = menu.prev( "a" ),
11686
                                        submenuCarat = $( "<span>" )
11687
                                                .addClass( "ui-menu-icon ui-icon " + icon )
11688
                                                .data( "ui-menu-submenu-carat", true );
11689
11690
                                item
11691
                                        .attr( "aria-haspopup", "true" )
11692
                                        .prepend( submenuCarat );
11693
                                menu.attr( "aria-labelledby", item.attr( "id" ) );
11694
                        });
11695 85ad3d82 Assos Assos
11696 503b3f7b Assos Assos
                menus = submenus.add( this.element );
11697 85ad3d82 Assos Assos
11698 503b3f7b Assos Assos
                // Don't refresh list items that are already adapted
11699
                menus.children( ":not(.ui-menu-item):has(a)" )
11700
                        .addClass( "ui-menu-item" )
11701
                        .attr( "role", "presentation" )
11702
                        .children( "a" )
11703
                                .uniqueId()
11704
                                .addClass( "ui-corner-all" )
11705
                                .attr({
11706
                                        tabIndex: -1,
11707
                                        role: this._itemRole()
11708
                                });
11709 85ad3d82 Assos Assos
11710 503b3f7b Assos Assos
                // Initialize unlinked menu-items containing spaces and/or dashes only as dividers
11711
                menus.children( ":not(.ui-menu-item)" ).each(function() {
11712
                        var item = $( this );
11713
                        // hyphen, em dash, en dash
11714
                        if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) {
11715
                                item.addClass( "ui-widget-content ui-menu-divider" );
11716
                        }
11717
                });
11718
11719
                // Add aria-disabled attribute to any disabled menu item
11720
                menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
11721 85ad3d82 Assos Assos
11722 503b3f7b Assos Assos
                // If the active item has been removed, blur the menu
11723
                if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
11724
                        this.blur();
11725 85ad3d82 Assos Assos
                }
11726
        },
11727
11728 503b3f7b Assos Assos
        _itemRole: function() {
11729
                return {
11730
                        menu: "menuitem",
11731
                        listbox: "option"
11732
                }[ this.options.role ];
11733 85ad3d82 Assos Assos
        },
11734
11735 503b3f7b Assos Assos
        _setOption: function( key, value ) {
11736
                if ( key === "icons" ) {
11737
                        this.element.find( ".ui-menu-icon" )
11738
                                .removeClass( this.options.icons.submenu )
11739
                                .addClass( value.submenu );
11740
                }
11741
                this._super( key, value );
11742 85ad3d82 Assos Assos
        },
11743
11744 503b3f7b Assos Assos
        focus: function( event, item ) {
11745
                var nested, focused;
11746
                this.blur( event, event && event.type === "focus" );
11747
11748
                this._scrollIntoView( item );
11749
11750
                this.active = item.first();
11751
                focused = this.active.children( "a" ).addClass( "ui-state-focus" );
11752
                // Only update aria-activedescendant if there's a role
11753
                // otherwise we assume focus is managed elsewhere
11754
                if ( this.options.role ) {
11755
                        this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
11756 85ad3d82 Assos Assos
                }
11757 503b3f7b Assos Assos
11758
                // Highlight active parent menu item, if any
11759
                this.active
11760
                        .parent()
11761
                        .closest( ".ui-menu-item" )
11762
                        .children( "a:first" )
11763
                        .addClass( "ui-state-active" );
11764
11765
                if ( event && event.type === "keydown" ) {
11766
                        this._close();
11767
                } else {
11768
                        this.timer = this._delay(function() {
11769
                                this._close();
11770
                        }, this.delay );
11771 85ad3d82 Assos Assos
                }
11772
11773 503b3f7b Assos Assos
                nested = item.children( ".ui-menu" );
11774
                if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
11775
                        this._startOpening(nested);
11776
                }
11777
                this.activeMenu = item.parent();
11778 85ad3d82 Assos Assos
11779 503b3f7b Assos Assos
                this._trigger( "focus", event, { item: item } );
11780
        },
11781 85ad3d82 Assos Assos
11782 503b3f7b Assos Assos
        _scrollIntoView: function( item ) {
11783
                var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
11784
                if ( this._hasScroll() ) {
11785
                        borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
11786
                        paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
11787
                        offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
11788
                        scroll = this.activeMenu.scrollTop();
11789
                        elementHeight = this.activeMenu.height();
11790
                        itemHeight = item.height();
11791
11792
                        if ( offset < 0 ) {
11793
                                this.activeMenu.scrollTop( scroll + offset );
11794
                        } else if ( offset + itemHeight > elementHeight ) {
11795
                                this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
11796 85ad3d82 Assos Assos
                        }
11797 503b3f7b Assos Assos
                }
11798 85ad3d82 Assos Assos
        },
11799
11800 503b3f7b Assos Assos
        blur: function( event, fromFocus ) {
11801
                if ( !fromFocus ) {
11802
                        clearTimeout( this.timer );
11803
                }
11804 85ad3d82 Assos Assos
11805 503b3f7b Assos Assos
                if ( !this.active ) {
11806
                        return;
11807
                }
11808
11809
                this.active.children( "a" ).removeClass( "ui-state-focus" );
11810
                this.active = null;
11811
11812
                this._trigger( "blur", event, { item: this.active } );
11813 85ad3d82 Assos Assos
        },
11814
11815 503b3f7b Assos Assos
        _startOpening: function( submenu ) {
11816
                clearTimeout( this.timer );
11817
11818
                // Don't open if already open fixes a Firefox bug that caused a .5 pixel
11819
                // shift in the submenu position when mousing over the carat icon
11820
                if ( submenu.attr( "aria-hidden" ) !== "true" ) {
11821 85ad3d82 Assos Assos
                        return;
11822
                }
11823 503b3f7b Assos Assos
11824
                this.timer = this._delay(function() {
11825
                        this._close();
11826
                        this._open( submenu );
11827
                }, this.delay );
11828 85ad3d82 Assos Assos
        },
11829
11830 503b3f7b Assos Assos
        _open: function( submenu ) {
11831
                var position = $.extend({
11832
                        of: this.active
11833
                }, this.options.position );
11834
11835
                clearTimeout( this.timer );
11836
                this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
11837
                        .hide()
11838
                        .attr( "aria-hidden", "true" );
11839
11840
                submenu
11841
                        .show()
11842
                        .removeAttr( "aria-hidden" )
11843
                        .attr( "aria-expanded", "true" )
11844
                        .position( position );
11845 85ad3d82 Assos Assos
        },
11846
11847 503b3f7b Assos Assos
        collapseAll: function( event, all ) {
11848
                clearTimeout( this.timer );
11849
                this.timer = this._delay(function() {
11850
                        // If we were passed an event, look for the submenu that contains the event
11851
                        var currentMenu = all ? this.element :
11852
                                $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
11853
11854
                        // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
11855
                        if ( !currentMenu.length ) {
11856
                                currentMenu = this.element;
11857 85ad3d82 Assos Assos
                        }
11858
11859 503b3f7b Assos Assos
                        this._close( currentMenu );
11860
11861
                        this.blur( event );
11862
                        this.activeMenu = currentMenu;
11863
                }, this.delay );
11864 85ad3d82 Assos Assos
        },
11865
11866 503b3f7b Assos Assos
        // With no arguments, closes the currently active menu - if nothing is active
11867
        // it closes all menus.  If passed an argument, it will search for menus BELOW
11868
        _close: function( startMenu ) {
11869
                if ( !startMenu ) {
11870
                        startMenu = this.active ? this.active.parent() : this.element;
11871 85ad3d82 Assos Assos
                }
11872
11873 503b3f7b Assos Assos
                startMenu
11874
                        .find( ".ui-menu" )
11875
                                .hide()
11876
                                .attr( "aria-hidden", "true" )
11877
                                .attr( "aria-expanded", "false" )
11878
                        .end()
11879
                        .find( "a.ui-state-active" )
11880
                                .removeClass( "ui-state-active" );
11881 85ad3d82 Assos Assos
        },
11882
11883 503b3f7b Assos Assos
        collapse: function( event ) {
11884
                var newItem = this.active &&
11885
                        this.active.parent().closest( ".ui-menu-item", this.element );
11886
                if ( newItem && newItem.length ) {
11887
                        this._close();
11888
                        this.focus( event, newItem );
11889 85ad3d82 Assos Assos
                }
11890
        },
11891
11892 503b3f7b Assos Assos
        expand: function( event ) {
11893
                var newItem = this.active &&
11894
                        this.active
11895
                                .children( ".ui-menu " )
11896
                                .children( ".ui-menu-item" )
11897
                                .first();
11898
11899
                if ( newItem && newItem.length ) {
11900
                        this._open( newItem.parent() );
11901
11902
                        // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
11903
                        this._delay(function() {
11904
                                this.focus( event, newItem );
11905
                        });
11906 85ad3d82 Assos Assos
                }
11907
        },
11908
11909 503b3f7b Assos Assos
        next: function( event ) {
11910
                this._move( "next", "first", event );
11911 85ad3d82 Assos Assos
        },
11912
11913 503b3f7b Assos Assos
        previous: function( event ) {
11914
                this._move( "prev", "last", event );
11915 85ad3d82 Assos Assos
        },
11916
11917 503b3f7b Assos Assos
        isFirstItem: function() {
11918
                return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
11919 85ad3d82 Assos Assos
        },
11920
11921 503b3f7b Assos Assos
        isLastItem: function() {
11922
                return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
11923 85ad3d82 Assos Assos
        },
11924
11925 503b3f7b Assos Assos
        _move: function( direction, filter, event ) {
11926
                var next;
11927
                if ( this.active ) {
11928
                        if ( direction === "first" || direction === "last" ) {
11929
                                next = this.active
11930
                                        [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
11931
                                        .eq( -1 );
11932
                        } else {
11933
                                next = this.active
11934
                                        [ direction + "All" ]( ".ui-menu-item" )
11935
                                        .eq( 0 );
11936
                        }
11937
                }
11938
                if ( !next || !next.length || !this.active ) {
11939
                        next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
11940
                }
11941 85ad3d82 Assos Assos
11942 503b3f7b Assos Assos
                this.focus( event, next );
11943 85ad3d82 Assos Assos
        },
11944
11945 503b3f7b Assos Assos
        nextPage: function( event ) {
11946
                var item, base, height;
11947 85ad3d82 Assos Assos
11948 503b3f7b Assos Assos
                if ( !this.active ) {
11949
                        this.next( event );
11950
                        return;
11951
                }
11952
                if ( this.isLastItem() ) {
11953
                        return;
11954
                }
11955
                if ( this._hasScroll() ) {
11956
                        base = this.active.offset().top;
11957
                        height = this.element.height();
11958
                        this.active.nextAll( ".ui-menu-item" ).each(function() {
11959
                                item = $( this );
11960
                                return item.offset().top - base - height < 0;
11961
                        });
11962
11963
                        this.focus( event, item );
11964
                } else {
11965
                        this.focus( event, this.activeMenu.children( ".ui-menu-item" )
11966
                                [ !this.active ? "first" : "last" ]() );
11967
                }
11968 85ad3d82 Assos Assos
        },
11969
11970 503b3f7b Assos Assos
        previousPage: function( event ) {
11971
                var item, base, height;
11972
                if ( !this.active ) {
11973
                        this.next( event );
11974
                        return;
11975
                }
11976
                if ( this.isFirstItem() ) {
11977
                        return;
11978
                }
11979
                if ( this._hasScroll() ) {
11980
                        base = this.active.offset().top;
11981
                        height = this.element.height();
11982
                        this.active.prevAll( ".ui-menu-item" ).each(function() {
11983
                                item = $( this );
11984
                                return item.offset().top - base + height > 0;
11985
                        });
11986
11987
                        this.focus( event, item );
11988
                } else {
11989
                        this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
11990
                }
11991 85ad3d82 Assos Assos
        },
11992
11993 503b3f7b Assos Assos
        _hasScroll: function() {
11994
                return this.element.outerHeight() < this.element.prop( "scrollHeight" );
11995 85ad3d82 Assos Assos
        },
11996
11997 503b3f7b Assos Assos
        select: function( event ) {
11998
                // TODO: It should never be possible to not have an active item at this
11999
                // point, but the tests don't trigger mouseenter before click.
12000
                this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
12001
                var ui = { item: this.active };
12002
                if ( !this.active.has( ".ui-menu" ).length ) {
12003
                        this.collapseAll( event, true );
12004
                }
12005
                this._trigger( "select", event, ui );
12006 85ad3d82 Assos Assos
        }
12007
});
12008
12009 503b3f7b Assos Assos
}( jQuery ));
12010
12011
(function( $, undefined ) {
12012
12013
$.ui = $.ui || {};
12014
12015
var cachedScrollbarWidth,
12016
        max = Math.max,
12017
        abs = Math.abs,
12018
        round = Math.round,
12019
        rhorizontal = /left|center|right/,
12020
        rvertical = /top|center|bottom/,
12021
        roffset = /[\+\-]\d+(\.[\d]+)?%?/,
12022
        rposition = /^\w+/,
12023
        rpercent = /%$/,
12024
        _position = $.fn.position;
12025
12026
function getOffsets( offsets, width, height ) {
12027
        return [
12028
                parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
12029
                parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
12030
        ];
12031
}
12032
12033
function parseCss( element, property ) {
12034
        return parseInt( $.css( element, property ), 10 ) || 0;
12035
}
12036
12037
function getDimensions( elem ) {
12038
        var raw = elem[0];
12039
        if ( raw.nodeType === 9 ) {
12040
                return {
12041
                        width: elem.width(),
12042
                        height: elem.height(),
12043
                        offset: { top: 0, left: 0 }
12044
                };
12045
        }
12046
        if ( $.isWindow( raw ) ) {
12047
                return {
12048
                        width: elem.width(),
12049
                        height: elem.height(),
12050
                        offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
12051
                };
12052
        }
12053
        if ( raw.preventDefault ) {
12054
                return {
12055
                        width: 0,
12056
                        height: 0,
12057
                        offset: { top: raw.pageY, left: raw.pageX }
12058
                };
12059
        }
12060
        return {
12061
                width: elem.outerWidth(),
12062
                height: elem.outerHeight(),
12063
                offset: elem.offset()
12064
        };
12065
}
12066
12067
$.position = {
12068
        scrollbarWidth: function() {
12069
                if ( cachedScrollbarWidth !== undefined ) {
12070
                        return cachedScrollbarWidth;
12071
                }
12072
                var w1, w2,
12073
                        div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
12074
                        innerDiv = div.children()[0];
12075
12076
                $( "body" ).append( div );
12077
                w1 = innerDiv.offsetWidth;
12078
                div.css( "overflow", "scroll" );
12079
12080
                w2 = innerDiv.offsetWidth;
12081
12082
                if ( w1 === w2 ) {
12083
                        w2 = div[0].clientWidth;
12084
                }
12085
12086
                div.remove();
12087 85ad3d82 Assos Assos
12088 503b3f7b Assos Assos
                return (cachedScrollbarWidth = w1 - w2);
12089
        },
12090
        getScrollInfo: function( within ) {
12091
                var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
12092
                        overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
12093
                        hasOverflowX = overflowX === "scroll" ||
12094
                                ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
12095
                        hasOverflowY = overflowY === "scroll" ||
12096
                                ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
12097
                return {
12098
                        width: hasOverflowY ? $.position.scrollbarWidth() : 0,
12099
                        height: hasOverflowX ? $.position.scrollbarWidth() : 0
12100
                };
12101
        },
12102
        getWithinInfo: function( element ) {
12103
                var withinElement = $( element || window ),
12104
                        isWindow = $.isWindow( withinElement[0] );
12105
                return {
12106
                        element: withinElement,
12107
                        isWindow: isWindow,
12108
                        offset: withinElement.offset() || { left: 0, top: 0 },
12109
                        scrollLeft: withinElement.scrollLeft(),
12110
                        scrollTop: withinElement.scrollTop(),
12111
                        width: isWindow ? withinElement.width() : withinElement.outerWidth(),
12112
                        height: isWindow ? withinElement.height() : withinElement.outerHeight()
12113
                };
12114
        }
12115 85ad3d82 Assos Assos
};
12116
12117 503b3f7b Assos Assos
$.fn.position = function( options ) {
12118
        if ( !options || !options.of ) {
12119
                return _position.apply( this, arguments );
12120 85ad3d82 Assos Assos
        }
12121 503b3f7b Assos Assos
12122
        // make a copy, we don't want to modify arguments
12123
        options = $.extend( {}, options );
12124
12125
        var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
12126
                target = $( options.of ),
12127
                within = $.position.getWithinInfo( options.within ),
12128
                scrollInfo = $.position.getScrollInfo( within ),
12129
                collision = ( options.collision || "flip" ).split( " " ),
12130
                offsets = {};
12131
12132
        dimensions = getDimensions( target );
12133
        if ( target[0].preventDefault ) {
12134
                // force left top to allow flipping
12135
                options.at = "left top";
12136 85ad3d82 Assos Assos
        }
12137 503b3f7b Assos Assos
        targetWidth = dimensions.width;
12138
        targetHeight = dimensions.height;
12139
        targetOffset = dimensions.offset;
12140
        // clone to reuse original targetOffset later
12141
        basePosition = $.extend( {}, targetOffset );
12142
12143
        // force my and at to have valid horizontal and vertical positions
12144
        // if a value is missing or invalid, it will be converted to center
12145
        $.each( [ "my", "at" ], function() {
12146
                var pos = ( options[ this ] || "" ).split( " " ),
12147
                        horizontalOffset,
12148
                        verticalOffset;
12149 85ad3d82 Assos Assos
12150 503b3f7b Assos Assos
                if ( pos.length === 1) {
12151
                        pos = rhorizontal.test( pos[ 0 ] ) ?
12152
                                pos.concat( [ "center" ] ) :
12153
                                rvertical.test( pos[ 0 ] ) ?
12154
                                        [ "center" ].concat( pos ) :
12155
                                        [ "center", "center" ];
12156
                }
12157
                pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
12158
                pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
12159
12160
                // calculate offsets
12161
                horizontalOffset = roffset.exec( pos[ 0 ] );
12162
                verticalOffset = roffset.exec( pos[ 1 ] );
12163
                offsets[ this ] = [
12164
                        horizontalOffset ? horizontalOffset[ 0 ] : 0,
12165
                        verticalOffset ? verticalOffset[ 0 ] : 0
12166
                ];
12167
12168
                // reduce to just the positions without the offsets
12169
                options[ this ] = [
12170
                        rposition.exec( pos[ 0 ] )[ 0 ],
12171
                        rposition.exec( pos[ 1 ] )[ 0 ]
12172
                ];
12173 85ad3d82 Assos Assos
        });
12174
12175 503b3f7b Assos Assos
        // normalize collision option
12176
        if ( collision.length === 1 ) {
12177
                collision[ 1 ] = collision[ 0 ];
12178
        }
12179 85ad3d82 Assos Assos
12180 503b3f7b Assos Assos
        if ( options.at[ 0 ] === "right" ) {
12181
                basePosition.left += targetWidth;
12182
        } else if ( options.at[ 0 ] === "center" ) {
12183
                basePosition.left += targetWidth / 2;
12184
        }
12185 85ad3d82 Assos Assos
12186 503b3f7b Assos Assos
        if ( options.at[ 1 ] === "bottom" ) {
12187
                basePosition.top += targetHeight;
12188
        } else if ( options.at[ 1 ] === "center" ) {
12189
                basePosition.top += targetHeight / 2;
12190
        }
12191 85ad3d82 Assos Assos
12192 503b3f7b Assos Assos
        atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
12193
        basePosition.left += atOffset[ 0 ];
12194
        basePosition.top += atOffset[ 1 ];
12195 85ad3d82 Assos Assos
12196 503b3f7b Assos Assos
        return this.each(function() {
12197
                var collisionPosition, using,
12198
                        elem = $( this ),
12199
                        elemWidth = elem.outerWidth(),
12200
                        elemHeight = elem.outerHeight(),
12201
                        marginLeft = parseCss( this, "marginLeft" ),
12202
                        marginTop = parseCss( this, "marginTop" ),
12203
                        collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
12204
                        collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
12205
                        position = $.extend( {}, basePosition ),
12206
                        myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
12207
12208
                if ( options.my[ 0 ] === "right" ) {
12209
                        position.left -= elemWidth;
12210
                } else if ( options.my[ 0 ] === "center" ) {
12211
                        position.left -= elemWidth / 2;
12212
                }
12213
12214
                if ( options.my[ 1 ] === "bottom" ) {
12215
                        position.top -= elemHeight;
12216
                } else if ( options.my[ 1 ] === "center" ) {
12217
                        position.top -= elemHeight / 2;
12218
                }
12219
12220
                position.left += myOffset[ 0 ];
12221
                position.top += myOffset[ 1 ];
12222
12223
                // if the browser doesn't support fractions, then round for consistent results
12224
                if ( !$.support.offsetFractions ) {
12225
                        position.left = round( position.left );
12226
                        position.top = round( position.top );
12227
                }
12228
12229
                collisionPosition = {
12230
                        marginLeft: marginLeft,
12231
                        marginTop: marginTop
12232
                };
12233
12234
                $.each( [ "left", "top" ], function( i, dir ) {
12235
                        if ( $.ui.position[ collision[ i ] ] ) {
12236
                                $.ui.position[ collision[ i ] ][ dir ]( position, {
12237
                                        targetWidth: targetWidth,
12238
                                        targetHeight: targetHeight,
12239
                                        elemWidth: elemWidth,
12240
                                        elemHeight: elemHeight,
12241
                                        collisionPosition: collisionPosition,
12242
                                        collisionWidth: collisionWidth,
12243
                                        collisionHeight: collisionHeight,
12244
                                        offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
12245
                                        my: options.my,
12246
                                        at: options.at,
12247
                                        within: within,
12248
                                        elem : elem
12249
                                });
12250
                        }
12251
                });
12252
12253
                if ( options.using ) {
12254
                        // adds feedback as second argument to using callback, if present
12255
                        using = function( props ) {
12256
                                var left = targetOffset.left - position.left,
12257
                                        right = left + targetWidth - elemWidth,
12258
                                        top = targetOffset.top - position.top,
12259
                                        bottom = top + targetHeight - elemHeight,
12260
                                        feedback = {
12261
                                                target: {
12262
                                                        element: target,
12263
                                                        left: targetOffset.left,
12264
                                                        top: targetOffset.top,
12265
                                                        width: targetWidth,
12266
                                                        height: targetHeight
12267
                                                },
12268
                                                element: {
12269
                                                        element: elem,
12270
                                                        left: position.left,
12271
                                                        top: position.top,
12272
                                                        width: elemWidth,
12273
                                                        height: elemHeight
12274
                                                },
12275
                                                horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
12276
                                                vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
12277
                                        };
12278
                                if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
12279
                                        feedback.horizontal = "center";
12280
                                }
12281
                                if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
12282
                                        feedback.vertical = "middle";
12283
                                }
12284
                                if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
12285
                                        feedback.important = "horizontal";
12286
                                } else {
12287
                                        feedback.important = "vertical";
12288
                                }
12289
                                options.using.call( this, props, feedback );
12290
                        };
12291
                }
12292
12293
                elem.offset( $.extend( position, { using: using } ) );
12294
        });
12295
};
12296
12297
$.ui.position = {
12298
        fit: {
12299
                left: function( position, data ) {
12300
                        var within = data.within,
12301
                                withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
12302
                                outerWidth = within.width,
12303
                                collisionPosLeft = position.left - data.collisionPosition.marginLeft,
12304
                                overLeft = withinOffset - collisionPosLeft,
12305
                                overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
12306
                                newOverRight;
12307
12308
                        // element is wider than within
12309
                        if ( data.collisionWidth > outerWidth ) {
12310
                                // element is initially over the left side of within
12311
                                if ( overLeft > 0 && overRight <= 0 ) {
12312
                                        newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
12313
                                        position.left += overLeft - newOverRight;
12314
                                // element is initially over right side of within
12315
                                } else if ( overRight > 0 && overLeft <= 0 ) {
12316
                                        position.left = withinOffset;
12317
                                // element is initially over both left and right sides of within
12318
                                } else {
12319
                                        if ( overLeft > overRight ) {
12320
                                                position.left = withinOffset + outerWidth - data.collisionWidth;
12321
                                        } else {
12322
                                                position.left = withinOffset;
12323
                                        }
12324
                                }
12325
                        // too far left -> align with left edge
12326
                        } else if ( overLeft > 0 ) {
12327
                                position.left += overLeft;
12328
                        // too far right -> align with right edge
12329
                        } else if ( overRight > 0 ) {
12330
                                position.left -= overRight;
12331
                        // adjust based on position and margin
12332
                        } else {
12333
                                position.left = max( position.left - collisionPosLeft, position.left );
12334
                        }
12335
                },
12336
                top: function( position, data ) {
12337
                        var within = data.within,
12338
                                withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
12339
                                outerHeight = data.within.height,
12340
                                collisionPosTop = position.top - data.collisionPosition.marginTop,
12341
                                overTop = withinOffset - collisionPosTop,
12342
                                overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
12343
                                newOverBottom;
12344
12345
                        // element is taller than within
12346
                        if ( data.collisionHeight > outerHeight ) {
12347
                                // element is initially over the top of within
12348
                                if ( overTop > 0 && overBottom <= 0 ) {
12349
                                        newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
12350
                                        position.top += overTop - newOverBottom;
12351
                                // element is initially over bottom of within
12352
                                } else if ( overBottom > 0 && overTop <= 0 ) {
12353
                                        position.top = withinOffset;
12354
                                // element is initially over both top and bottom of within
12355
                                } else {
12356
                                        if ( overTop > overBottom ) {
12357
                                                position.top = withinOffset + outerHeight - data.collisionHeight;
12358
                                        } else {
12359
                                                position.top = withinOffset;
12360
                                        }
12361
                                }
12362
                        // too far up -> align with top
12363
                        } else if ( overTop > 0 ) {
12364
                                position.top += overTop;
12365
                        // too far down -> align with bottom edge
12366
                        } else if ( overBottom > 0 ) {
12367
                                position.top -= overBottom;
12368
                        // adjust based on position and margin
12369
                        } else {
12370
                                position.top = max( position.top - collisionPosTop, position.top );
12371
                        }
12372
                }
12373
        },
12374
        flip: {
12375
                left: function( position, data ) {
12376
                        var within = data.within,
12377
                                withinOffset = within.offset.left + within.scrollLeft,
12378
                                outerWidth = within.width,
12379
                                offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
12380
                                collisionPosLeft = position.left - data.collisionPosition.marginLeft,
12381
                                overLeft = collisionPosLeft - offsetLeft,
12382
                                overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
12383
                                myOffset = data.my[ 0 ] === "left" ?
12384
                                        -data.elemWidth :
12385
                                        data.my[ 0 ] === "right" ?
12386
                                                data.elemWidth :
12387
                                                0,
12388
                                atOffset = data.at[ 0 ] === "left" ?
12389
                                        data.targetWidth :
12390
                                        data.at[ 0 ] === "right" ?
12391
                                                -data.targetWidth :
12392
                                                0,
12393
                                offset = -2 * data.offset[ 0 ],
12394
                                newOverRight,
12395
                                newOverLeft;
12396
12397
                        if ( overLeft < 0 ) {
12398
                                newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
12399
                                if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
12400
                                        position.left += myOffset + atOffset + offset;
12401
                                }
12402
                        }
12403
                        else if ( overRight > 0 ) {
12404
                                newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
12405
                                if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
12406
                                        position.left += myOffset + atOffset + offset;
12407 85ad3d82 Assos Assos
                                }
12408
                        }
12409
                },
12410 503b3f7b Assos Assos
                top: function( position, data ) {
12411
                        var within = data.within,
12412
                                withinOffset = within.offset.top + within.scrollTop,
12413
                                outerHeight = within.height,
12414
                                offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
12415
                                collisionPosTop = position.top - data.collisionPosition.marginTop,
12416
                                overTop = collisionPosTop - offsetTop,
12417
                                overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
12418
                                top = data.my[ 1 ] === "top",
12419
                                myOffset = top ?
12420
                                        -data.elemHeight :
12421
                                        data.my[ 1 ] === "bottom" ?
12422
                                                data.elemHeight :
12423
                                                0,
12424
                                atOffset = data.at[ 1 ] === "top" ?
12425
                                        data.targetHeight :
12426
                                        data.at[ 1 ] === "bottom" ?
12427
                                                -data.targetHeight :
12428
                                                0,
12429
                                offset = -2 * data.offset[ 1 ],
12430
                                newOverTop,
12431
                                newOverBottom;
12432
                        if ( overTop < 0 ) {
12433
                                newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
12434
                                if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
12435
                                        position.top += myOffset + atOffset + offset;
12436
                                }
12437
                        }
12438
                        else if ( overBottom > 0 ) {
12439
                                newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
12440
                                if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
12441
                                        position.top += myOffset + atOffset + offset;
12442
                                }
12443
                        }
12444
                }
12445 85ad3d82 Assos Assos
        },
12446 503b3f7b Assos Assos
        flipfit: {
12447
                left: function() {
12448
                        $.ui.position.flip.left.apply( this, arguments );
12449
                        $.ui.position.fit.left.apply( this, arguments );
12450
                },
12451
                top: function() {
12452
                        $.ui.position.flip.top.apply( this, arguments );
12453
                        $.ui.position.fit.top.apply( this, arguments );
12454 85ad3d82 Assos Assos
                }
12455 503b3f7b Assos Assos
        }
12456
};
12457 85ad3d82 Assos Assos
12458 503b3f7b Assos Assos
// fraction support test
12459
(function () {
12460
        var testElement, testElementParent, testElementStyle, offsetLeft, i,
12461
                body = document.getElementsByTagName( "body" )[ 0 ],
12462
                div = document.createElement( "div" );
12463
12464
        //Create a "fake body" for testing based on method used in jQuery.support
12465
        testElement = document.createElement( body ? "div" : "body" );
12466
        testElementStyle = {
12467
                visibility: "hidden",
12468
                width: 0,
12469
                height: 0,
12470
                border: 0,
12471
                margin: 0,
12472
                background: "none"
12473
        };
12474
        if ( body ) {
12475
                $.extend( testElementStyle, {
12476
                        position: "absolute",
12477
                        left: "-1000px",
12478
                        top: "-1000px"
12479
                });
12480
        }
12481
        for ( i in testElementStyle ) {
12482
                testElement.style[ i ] = testElementStyle[ i ];
12483
        }
12484
        testElement.appendChild( div );
12485
        testElementParent = body || document.documentElement;
12486
        testElementParent.insertBefore( testElement, testElementParent.firstChild );
12487 85ad3d82 Assos Assos
12488 503b3f7b Assos Assos
        div.style.cssText = "position: absolute; left: 10.7432222px;";
12489 85ad3d82 Assos Assos
12490 503b3f7b Assos Assos
        offsetLeft = $( div ).offset().left;
12491
        $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
12492 85ad3d82 Assos Assos
12493 503b3f7b Assos Assos
        testElement.innerHTML = "";
12494
        testElementParent.removeChild( testElement );
12495
})();
12496 85ad3d82 Assos Assos
12497 503b3f7b Assos Assos
}( jQuery ) );
12498 85ad3d82 Assos Assos
12499 503b3f7b Assos Assos
(function( $, undefined ) {
12500 85ad3d82 Assos Assos
12501 503b3f7b Assos Assos
$.widget( "ui.progressbar", {
12502
        version: "1.10.2",
12503
        options: {
12504
                max: 100,
12505
                value: 0,
12506 85ad3d82 Assos Assos
12507 503b3f7b Assos Assos
                change: null,
12508
                complete: null
12509 85ad3d82 Assos Assos
        },
12510
12511 503b3f7b Assos Assos
        min: 0,
12512 85ad3d82 Assos Assos
12513 503b3f7b Assos Assos
        _create: function() {
12514
                // Constrain initial value
12515
                this.oldValue = this.options.value = this._constrainedValue();
12516 85ad3d82 Assos Assos
12517 503b3f7b Assos Assos
                this.element
12518
                        .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
12519
                        .attr({
12520
                                // Only set static values, aria-valuenow and aria-valuemax are
12521
                                // set inside _refreshValue()
12522
                                role: "progressbar",
12523
                                "aria-valuemin": this.min
12524
                        });
12525 85ad3d82 Assos Assos
12526 503b3f7b Assos Assos
                this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
12527
                        .appendTo( this.element );
12528 85ad3d82 Assos Assos
12529 503b3f7b Assos Assos
                this._refreshValue();
12530 85ad3d82 Assos Assos
        },
12531
12532 503b3f7b Assos Assos
        _destroy: function() {
12533
                this.element
12534
                        .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
12535
                        .removeAttr( "role" )
12536
                        .removeAttr( "aria-valuemin" )
12537
                        .removeAttr( "aria-valuemax" )
12538
                        .removeAttr( "aria-valuenow" );
12539
12540
                this.valueDiv.remove();
12541
        },
12542 85ad3d82 Assos Assos
12543 503b3f7b Assos Assos
        value: function( newValue ) {
12544
                if ( newValue === undefined ) {
12545
                        return this.options.value;
12546 85ad3d82 Assos Assos
                }
12547
12548 503b3f7b Assos Assos
                this.options.value = this._constrainedValue( newValue );
12549
                this._refreshValue();
12550
        },
12551 85ad3d82 Assos Assos
12552 503b3f7b Assos Assos
        _constrainedValue: function( newValue ) {
12553
                if ( newValue === undefined ) {
12554
                        newValue = this.options.value;
12555 85ad3d82 Assos Assos
                }
12556
12557 503b3f7b Assos Assos
                this.indeterminate = newValue === false;
12558 85ad3d82 Assos Assos
12559 503b3f7b Assos Assos
                // sanitize value
12560
                if ( typeof newValue !== "number" ) {
12561
                        newValue = 0;
12562 85ad3d82 Assos Assos
                }
12563
12564 503b3f7b Assos Assos
                return this.indeterminate ? false :
12565
                        Math.min( this.options.max, Math.max( this.min, newValue ) );
12566 85ad3d82 Assos Assos
        },
12567
12568 503b3f7b Assos Assos
        _setOptions: function( options ) {
12569
                // Ensure "value" option is set after other values (like max)
12570
                var value = options.value;
12571
                delete options.value;
12572 85ad3d82 Assos Assos
12573 503b3f7b Assos Assos
                this._super( options );
12574 85ad3d82 Assos Assos
12575 503b3f7b Assos Assos
                this.options.value = this._constrainedValue( value );
12576
                this._refreshValue();
12577 85ad3d82 Assos Assos
        },
12578
12579 503b3f7b Assos Assos
        _setOption: function( key, value ) {
12580
                if ( key === "max" ) {
12581
                        // Don't allow a max less than min
12582
                        value = Math.max( this.min, value );
12583 85ad3d82 Assos Assos
                }
12584
12585 503b3f7b Assos Assos
                this._super( key, value );
12586
        },
12587 85ad3d82 Assos Assos
12588 503b3f7b Assos Assos
        _percentage: function() {
12589
                return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
12590 85ad3d82 Assos Assos
        },
12591
12592 503b3f7b Assos Assos
        _refreshValue: function() {
12593
                var value = this.options.value,
12594
                        percentage = this._percentage();
12595
12596
                this.valueDiv
12597
                        .toggle( this.indeterminate || value > this.min )
12598
                        .toggleClass( "ui-corner-right", value === this.options.max )
12599
                        .width( percentage.toFixed(0) + "%" );
12600 85ad3d82 Assos Assos
12601 503b3f7b Assos Assos
                this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
12602 85ad3d82 Assos Assos
12603 503b3f7b Assos Assos
                if ( this.indeterminate ) {
12604
                        this.element.removeAttr( "aria-valuenow" );
12605
                        if ( !this.overlayDiv ) {
12606
                                this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
12607
                        }
12608
                } else {
12609
                        this.element.attr({
12610
                                "aria-valuemax": this.options.max,
12611
                                "aria-valuenow": value
12612 85ad3d82 Assos Assos
                        });
12613 503b3f7b Assos Assos
                        if ( this.overlayDiv ) {
12614
                                this.overlayDiv.remove();
12615
                                this.overlayDiv = null;
12616
                        }
12617 85ad3d82 Assos Assos
                }
12618
12619 503b3f7b Assos Assos
                if ( this.oldValue !== value ) {
12620
                        this.oldValue = value;
12621
                        this._trigger( "change" );
12622 85ad3d82 Assos Assos
                }
12623 503b3f7b Assos Assos
                if ( value === this.options.max ) {
12624
                        this._trigger( "complete" );
12625 85ad3d82 Assos Assos
                }
12626 503b3f7b Assos Assos
        }
12627
});
12628 85ad3d82 Assos Assos
12629 503b3f7b Assos Assos
})( jQuery );
12630 85ad3d82 Assos Assos
12631 503b3f7b Assos Assos
(function( $, undefined ) {
12632 85ad3d82 Assos Assos
12633 503b3f7b Assos Assos
// number of pages in a slider
12634
// (how many times can you page up/down to go through the whole range)
12635
var numPages = 5;
12636 85ad3d82 Assos Assos
12637 503b3f7b Assos Assos
$.widget( "ui.slider", $.ui.mouse, {
12638
        version: "1.10.2",
12639
        widgetEventPrefix: "slide",
12640 85ad3d82 Assos Assos
12641 503b3f7b Assos Assos
        options: {
12642
                animate: false,
12643
                distance: 0,
12644
                max: 100,
12645
                min: 0,
12646
                orientation: "horizontal",
12647
                range: false,
12648
                step: 1,
12649
                value: 0,
12650
                values: null,
12651 85ad3d82 Assos Assos
12652 503b3f7b Assos Assos
                // callbacks
12653
                change: null,
12654
                slide: null,
12655
                start: null,
12656
                stop: null
12657
        },
12658 85ad3d82 Assos Assos
12659 503b3f7b Assos Assos
        _create: function() {
12660
                this._keySliding = false;
12661
                this._mouseSliding = false;
12662
                this._animateOff = true;
12663
                this._handleIndex = null;
12664
                this._detectOrientation();
12665
                this._mouseInit();
12666 85ad3d82 Assos Assos
12667 503b3f7b Assos Assos
                this.element
12668
                        .addClass( "ui-slider" +
12669
                                " ui-slider-" + this.orientation +
12670
                                " ui-widget" +
12671
                                " ui-widget-content" +
12672
                                " ui-corner-all");
12673 85ad3d82 Assos Assos
12674 503b3f7b Assos Assos
                this._refresh();
12675
                this._setOption( "disabled", this.options.disabled );
12676 85ad3d82 Assos Assos
12677 503b3f7b Assos Assos
                this._animateOff = false;
12678 85ad3d82 Assos Assos
        },
12679
12680 503b3f7b Assos Assos
        _refresh: function() {
12681
                this._createRange();
12682
                this._createHandles();
12683
                this._setupEvents();
12684
                this._refreshValue();
12685 85ad3d82 Assos Assos
        },
12686
12687 503b3f7b Assos Assos
        _createHandles: function() {
12688
                var i, handleCount,
12689
                        options = this.options,
12690
                        existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
12691
                        handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
12692
                        handles = [];
12693 85ad3d82 Assos Assos
12694 503b3f7b Assos Assos
                handleCount = ( options.values && options.values.length ) || 1;
12695 85ad3d82 Assos Assos
12696 503b3f7b Assos Assos
                if ( existingHandles.length > handleCount ) {
12697
                        existingHandles.slice( handleCount ).remove();
12698
                        existingHandles = existingHandles.slice( 0, handleCount );
12699 85ad3d82 Assos Assos
                }
12700
12701 503b3f7b Assos Assos
                for ( i = existingHandles.length; i < handleCount; i++ ) {
12702
                        handles.push( handle );
12703
                }
12704 85ad3d82 Assos Assos
12705 503b3f7b Assos Assos
                this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
12706 85ad3d82 Assos Assos
12707 503b3f7b Assos Assos
                this.handle = this.handles.eq( 0 );
12708
12709
                this.handles.each(function( i ) {
12710
                        $( this ).data( "ui-slider-handle-index", i );
12711 85ad3d82 Assos Assos
                });
12712 503b3f7b Assos Assos
        },
12713 85ad3d82 Assos Assos
12714 503b3f7b Assos Assos
        _createRange: function() {
12715
                var options = this.options,
12716
                        classes = "";
12717
12718
                if ( options.range ) {
12719
                        if ( options.range === true ) {
12720
                                if ( !options.values ) {
12721
                                        options.values = [ this._valueMin(), this._valueMin() ];
12722
                                } else if ( options.values.length && options.values.length !== 2 ) {
12723
                                        options.values = [ options.values[0], options.values[0] ];
12724
                                } else if ( $.isArray( options.values ) ) {
12725
                                        options.values = options.values.slice(0);
12726
                                }
12727
                        }
12728 85ad3d82 Assos Assos
12729 503b3f7b Assos Assos
                        if ( !this.range || !this.range.length ) {
12730
                                this.range = $( "<div></div>" )
12731
                                        .appendTo( this.element );
12732
12733
                                classes = "ui-slider-range" +
12734
                                // note: this isn't the most fittingly semantic framework class for this element,
12735
                                // but worked best visually with a variety of themes
12736
                                " ui-widget-header ui-corner-all";
12737 85ad3d82 Assos Assos
                        } else {
12738 503b3f7b Assos Assos
                                this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
12739
                                        // Handle range switching from true to min/max
12740
                                        .css({
12741
                                                "left": "",
12742
                                                "bottom": ""
12743
                                        });
12744 85ad3d82 Assos Assos
                        }
12745 503b3f7b Assos Assos
12746
                        this.range.addClass( classes +
12747
                                ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
12748 85ad3d82 Assos Assos
                } else {
12749 503b3f7b Assos Assos
                        this.range = $([]);
12750 85ad3d82 Assos Assos
                }
12751 503b3f7b Assos Assos
        },
12752 85ad3d82 Assos Assos
12753 503b3f7b Assos Assos
        _setupEvents: function() {
12754
                var elements = this.handles.add( this.range ).filter( "a" );
12755
                this._off( elements );
12756
                this._on( elements, this._handleEvents );
12757
                this._hoverable( elements );
12758
                this._focusable( elements );
12759
        },
12760 85ad3d82 Assos Assos
12761 503b3f7b Assos Assos
        _destroy: function() {
12762
                this.handles.remove();
12763
                this.range.remove();
12764 85ad3d82 Assos Assos
12765 503b3f7b Assos Assos
                this.element
12766
                        .removeClass( "ui-slider" +
12767
                                " ui-slider-horizontal" +
12768
                                " ui-slider-vertical" +
12769
                                " ui-widget" +
12770
                                " ui-widget-content" +
12771
                                " ui-corner-all" );
12772 85ad3d82 Assos Assos
12773 503b3f7b Assos Assos
                this._mouseDestroy();
12774 85ad3d82 Assos Assos
        },
12775
12776 503b3f7b Assos Assos
        _mouseCapture: function( event ) {
12777
                var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
12778
                        that = this,
12779
                        o = this.options;
12780 85ad3d82 Assos Assos
12781 503b3f7b Assos Assos
                if ( o.disabled ) {
12782
                        return false;
12783 85ad3d82 Assos Assos
                }
12784
12785 503b3f7b Assos Assos
                this.elementSize = {
12786
                        width: this.element.outerWidth(),
12787
                        height: this.element.outerHeight()
12788
                };
12789
                this.elementOffset = this.element.offset();
12790
12791
                position = { x: event.pageX, y: event.pageY };
12792
                normValue = this._normValueFromMouse( position );
12793
                distance = this._valueMax() - this._valueMin() + 1;
12794
                this.handles.each(function( i ) {
12795
                        var thisDistance = Math.abs( normValue - that.values(i) );
12796
                        if (( distance > thisDistance ) ||
12797
                                ( distance === thisDistance &&
12798
                                        (i === that._lastChangedValue || that.values(i) === o.min ))) {
12799
                                distance = thisDistance;
12800
                                closestHandle = $( this );
12801
                                index = i;
12802
                        }
12803
                });
12804 85ad3d82 Assos Assos
12805 503b3f7b Assos Assos
                allowed = this._start( event, index );
12806
                if ( allowed === false ) {
12807
                        return false;
12808 85ad3d82 Assos Assos
                }
12809 503b3f7b Assos Assos
                this._mouseSliding = true;
12810 85ad3d82 Assos Assos
12811 503b3f7b Assos Assos
                this._handleIndex = index;
12812 85ad3d82 Assos Assos
12813 503b3f7b Assos Assos
                closestHandle
12814
                        .addClass( "ui-state-active" )
12815
                        .focus();
12816
12817
                offset = closestHandle.offset();
12818
                mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
12819
                this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
12820
                        left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
12821
                        top: event.pageY - offset.top -
12822
                                ( closestHandle.height() / 2 ) -
12823
                                ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
12824
                                ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
12825
                                ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
12826
                };
12827 85ad3d82 Assos Assos
12828 503b3f7b Assos Assos
                if ( !this.handles.hasClass( "ui-state-hover" ) ) {
12829
                        this._slide( event, index, normValue );
12830 85ad3d82 Assos Assos
                }
12831 503b3f7b Assos Assos
                this._animateOff = true;
12832
                return true;
12833
        },
12834 85ad3d82 Assos Assos
12835 503b3f7b Assos Assos
        _mouseStart: function() {
12836
                return true;
12837 85ad3d82 Assos Assos
        },
12838
12839 503b3f7b Assos Assos
        _mouseDrag: function( event ) {
12840
                var position = { x: event.pageX, y: event.pageY },
12841
                        normValue = this._normValueFromMouse( position );
12842 85ad3d82 Assos Assos
12843 503b3f7b Assos Assos
                this._slide( event, this._handleIndex, normValue );
12844
12845
                return false;
12846 85ad3d82 Assos Assos
        },
12847
12848 503b3f7b Assos Assos
        _mouseStop: function( event ) {
12849
                this.handles.removeClass( "ui-state-active" );
12850
                this._mouseSliding = false;
12851 85ad3d82 Assos Assos
12852 503b3f7b Assos Assos
                this._stop( event, this._handleIndex );
12853
                this._change( event, this._handleIndex );
12854 85ad3d82 Assos Assos
12855 503b3f7b Assos Assos
                this._handleIndex = null;
12856
                this._clickOffset = null;
12857
                this._animateOff = false;
12858 85ad3d82 Assos Assos
12859 503b3f7b Assos Assos
                return false;
12860
        },
12861 85ad3d82 Assos Assos
12862 503b3f7b Assos Assos
        _detectOrientation: function() {
12863
                this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
12864
        },
12865 85ad3d82 Assos Assos
12866 503b3f7b Assos Assos
        _normValueFromMouse: function( position ) {
12867
                var pixelTotal,
12868
                        pixelMouse,
12869
                        percentMouse,
12870
                        valueTotal,
12871
                        valueMouse;
12872 85ad3d82 Assos Assos
12873 503b3f7b Assos Assos
                if ( this.orientation === "horizontal" ) {
12874
                        pixelTotal = this.elementSize.width;
12875
                        pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
12876
                } else {
12877
                        pixelTotal = this.elementSize.height;
12878
                        pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
12879
                }
12880 85ad3d82 Assos Assos
12881 503b3f7b Assos Assos
                percentMouse = ( pixelMouse / pixelTotal );
12882
                if ( percentMouse > 1 ) {
12883
                        percentMouse = 1;
12884
                }
12885
                if ( percentMouse < 0 ) {
12886
                        percentMouse = 0;
12887
                }
12888
                if ( this.orientation === "vertical" ) {
12889
                        percentMouse = 1 - percentMouse;
12890
                }
12891 85ad3d82 Assos Assos
12892 503b3f7b Assos Assos
                valueTotal = this._valueMax() - this._valueMin();
12893
                valueMouse = this._valueMin() + percentMouse * valueTotal;
12894 85ad3d82 Assos Assos
12895 503b3f7b Assos Assos
                return this._trimAlignValue( valueMouse );
12896
        },
12897 85ad3d82 Assos Assos
12898 503b3f7b Assos Assos
        _start: function( event, index ) {
12899
                var uiHash = {
12900
                        handle: this.handles[ index ],
12901
                        value: this.value()
12902
                };
12903
                if ( this.options.values && this.options.values.length ) {
12904
                        uiHash.value = this.values( index );
12905
                        uiHash.values = this.values();
12906
                }
12907
                return this._trigger( "start", event, uiHash );
12908
        },
12909 85ad3d82 Assos Assos
12910 503b3f7b Assos Assos
        _slide: function( event, index, newVal ) {
12911
                var otherVal,
12912
                        newValues,
12913
                        allowed;
12914 85ad3d82 Assos Assos
12915 503b3f7b Assos Assos
                if ( this.options.values && this.options.values.length ) {
12916
                        otherVal = this.values( index ? 0 : 1 );
12917 85ad3d82 Assos Assos
12918 503b3f7b Assos Assos
                        if ( ( this.options.values.length === 2 && this.options.range === true ) &&
12919
                                        ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
12920
                                ) {
12921
                                newVal = otherVal;
12922
                        }
12923 85ad3d82 Assos Assos
12924 503b3f7b Assos Assos
                        if ( newVal !== this.values( index ) ) {
12925
                                newValues = this.values();
12926
                                newValues[ index ] = newVal;
12927
                                // A slide can be canceled by returning false from the slide callback
12928
                                allowed = this._trigger( "slide", event, {
12929
                                        handle: this.handles[ index ],
12930
                                        value: newVal,
12931
                                        values: newValues
12932
                                } );
12933
                                otherVal = this.values( index ? 0 : 1 );
12934
                                if ( allowed !== false ) {
12935
                                        this.values( index, newVal, true );
12936
                                }
12937
                        }
12938
                } else {
12939
                        if ( newVal !== this.value() ) {
12940
                                // A slide can be canceled by returning false from the slide callback
12941
                                allowed = this._trigger( "slide", event, {
12942
                                        handle: this.handles[ index ],
12943
                                        value: newVal
12944
                                } );
12945
                                if ( allowed !== false ) {
12946
                                        this.value( newVal );
12947
                                }
12948
                        }
12949
                }
12950
        },
12951 85ad3d82 Assos Assos
12952 503b3f7b Assos Assos
        _stop: function( event, index ) {
12953
                var uiHash = {
12954
                        handle: this.handles[ index ],
12955
                        value: this.value()
12956
                };
12957
                if ( this.options.values && this.options.values.length ) {
12958
                        uiHash.value = this.values( index );
12959
                        uiHash.values = this.values();
12960
                }
12961 85ad3d82 Assos Assos
12962 503b3f7b Assos Assos
                this._trigger( "stop", event, uiHash );
12963
        },
12964 85ad3d82 Assos Assos
12965 503b3f7b Assos Assos
        _change: function( event, index ) {
12966
                if ( !this._keySliding && !this._mouseSliding ) {
12967
                        var uiHash = {
12968
                                handle: this.handles[ index ],
12969
                                value: this.value()
12970
                        };
12971
                        if ( this.options.values && this.options.values.length ) {
12972
                                uiHash.value = this.values( index );
12973
                                uiHash.values = this.values();
12974
                        }
12975 85ad3d82 Assos Assos
12976 503b3f7b Assos Assos
                        //store the last changed value index for reference when handles overlap
12977
                        this._lastChangedValue = index;
12978 85ad3d82 Assos Assos
12979 503b3f7b Assos Assos
                        this._trigger( "change", event, uiHash );
12980 85ad3d82 Assos Assos
                }
12981 503b3f7b Assos Assos
        },
12982 85ad3d82 Assos Assos
12983 503b3f7b Assos Assos
        value: function( newValue ) {
12984
                if ( arguments.length ) {
12985
                        this.options.value = this._trimAlignValue( newValue );
12986
                        this._refreshValue();
12987
                        this._change( null, 0 );
12988
                        return;
12989
                }
12990 85ad3d82 Assos Assos
12991 503b3f7b Assos Assos
                return this._value();
12992
        },
12993 85ad3d82 Assos Assos
12994 503b3f7b Assos Assos
        values: function( index, newValue ) {
12995
                var vals,
12996
                        newValues,
12997
                        i;
12998 85ad3d82 Assos Assos
12999 503b3f7b Assos Assos
                if ( arguments.length > 1 ) {
13000
                        this.options.values[ index ] = this._trimAlignValue( newValue );
13001
                        this._refreshValue();
13002
                        this._change( null, index );
13003
                        return;
13004 85ad3d82 Assos Assos
                }
13005
13006 503b3f7b Assos Assos
                if ( arguments.length ) {
13007
                        if ( $.isArray( arguments[ 0 ] ) ) {
13008
                                vals = this.options.values;
13009
                                newValues = arguments[ 0 ];
13010
                                for ( i = 0; i < vals.length; i += 1 ) {
13011
                                        vals[ i ] = this._trimAlignValue( newValues[ i ] );
13012
                                        this._change( null, i );
13013
                                }
13014
                                this._refreshValue();
13015
                        } else {
13016
                                if ( this.options.values && this.options.values.length ) {
13017
                                        return this._values( index );
13018
                                } else {
13019
                                        return this.value();
13020
                                }
13021
                        }
13022
                } else {
13023
                        return this._values();
13024 85ad3d82 Assos Assos
                }
13025
        },
13026
13027 503b3f7b Assos Assos
        _setOption: function( key, value ) {
13028
                var i,
13029
                        valsLength = 0;
13030
13031
                if ( key === "range" && this.options.range === true ) {
13032
                        if ( value === "min" ) {
13033
                                this.options.value = this._values( 0 );
13034
                                this.options.values = null;
13035
                        } else if ( value === "max" ) {
13036
                                this.options.value = this._values( this.options.values.length-1 );
13037
                                this.options.values = null;
13038 85ad3d82 Assos Assos
                        }
13039
                }
13040
13041 503b3f7b Assos Assos
                if ( $.isArray( this.options.values ) ) {
13042
                        valsLength = this.options.values.length;
13043 85ad3d82 Assos Assos
                }
13044
13045 503b3f7b Assos Assos
                $.Widget.prototype._setOption.apply( this, arguments );
13046
13047
                switch ( key ) {
13048
                        case "orientation":
13049
                                this._detectOrientation();
13050
                                this.element
13051
                                        .removeClass( "ui-slider-horizontal ui-slider-vertical" )
13052
                                        .addClass( "ui-slider-" + this.orientation );
13053
                                this._refreshValue();
13054
                                break;
13055
                        case "value":
13056
                                this._animateOff = true;
13057
                                this._refreshValue();
13058
                                this._change( null, 0 );
13059
                                this._animateOff = false;
13060
                                break;
13061
                        case "values":
13062
                                this._animateOff = true;
13063
                                this._refreshValue();
13064
                                for ( i = 0; i < valsLength; i += 1 ) {
13065
                                        this._change( null, i );
13066
                                }
13067
                                this._animateOff = false;
13068
                                break;
13069
                        case "min":
13070
                        case "max":
13071
                                this._animateOff = true;
13072
                                this._refreshValue();
13073
                                this._animateOff = false;
13074
                                break;
13075
                        case "range":
13076
                                this._animateOff = true;
13077
                                this._refresh();
13078
                                this._animateOff = false;
13079
                                break;
13080 85ad3d82 Assos Assos
                }
13081 503b3f7b Assos Assos
        },
13082 85ad3d82 Assos Assos
13083 503b3f7b Assos Assos
        //internal value getter
13084
        // _value() returns value trimmed by min and max, aligned by step
13085
        _value: function() {
13086
                var val = this.options.value;
13087
                val = this._trimAlignValue( val );
13088 85ad3d82 Assos Assos
13089 503b3f7b Assos Assos
                return val;
13090 85ad3d82 Assos Assos
        },
13091
13092 503b3f7b Assos Assos
        //internal values getter
13093
        // _values() returns array of values trimmed by min and max, aligned by step
13094
        // _values( index ) returns single value trimmed by min and max, aligned by step
13095
        _values: function( index ) {
13096
                var val,
13097
                        vals,
13098
                        i;
13099 85ad3d82 Assos Assos
13100 503b3f7b Assos Assos
                if ( arguments.length ) {
13101
                        val = this.options.values[ index ];
13102
                        val = this._trimAlignValue( val );
13103 85ad3d82 Assos Assos
13104 503b3f7b Assos Assos
                        return val;
13105
                } else if ( this.options.values && this.options.values.length ) {
13106
                        // .slice() creates a copy of the array
13107
                        // this copy gets trimmed by min and max and then returned
13108
                        vals = this.options.values.slice();
13109
                        for ( i = 0; i < vals.length; i+= 1) {
13110
                                vals[ i ] = this._trimAlignValue( vals[ i ] );
13111
                        }
13112 85ad3d82 Assos Assos
13113 503b3f7b Assos Assos
                        return vals;
13114
                } else {
13115
                        return [];
13116
                }
13117 85ad3d82 Assos Assos
        },
13118
13119 503b3f7b Assos Assos
        // returns the step-aligned value that val is closest to, between (inclusive) min and max
13120
        _trimAlignValue: function( val ) {
13121
                if ( val <= this._valueMin() ) {
13122
                        return this._valueMin();
13123
                }
13124
                if ( val >= this._valueMax() ) {
13125
                        return this._valueMax();
13126
                }
13127
                var step = ( this.options.step > 0 ) ? this.options.step : 1,
13128
                        valModStep = (val - this._valueMin()) % step,
13129
                        alignValue = val - valModStep;
13130 85ad3d82 Assos Assos
13131 503b3f7b Assos Assos
                if ( Math.abs(valModStep) * 2 >= step ) {
13132
                        alignValue += ( valModStep > 0 ) ? step : ( -step );
13133
                }
13134
13135
                // Since JavaScript has problems with large floats, round
13136
                // the final value to 5 digits after the decimal point (see #4124)
13137
                return parseFloat( alignValue.toFixed(5) );
13138
        },
13139
13140
        _valueMin: function() {
13141
                return this.options.min;
13142
        },
13143 85ad3d82 Assos Assos
13144 503b3f7b Assos Assos
        _valueMax: function() {
13145
                return this.options.max;
13146 85ad3d82 Assos Assos
        },
13147
13148 503b3f7b Assos Assos
        _refreshValue: function() {
13149
                var lastValPercent, valPercent, value, valueMin, valueMax,
13150
                        oRange = this.options.range,
13151
                        o = this.options,
13152
                        that = this,
13153
                        animate = ( !this._animateOff ) ? o.animate : false,
13154
                        _set = {};
13155
13156
                if ( this.options.values && this.options.values.length ) {
13157
                        this.handles.each(function( i ) {
13158
                                valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
13159
                                _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13160
                                $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13161
                                if ( that.options.range === true ) {
13162
                                        if ( that.orientation === "horizontal" ) {
13163
                                                if ( i === 0 ) {
13164
                                                        that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
13165
                                                }
13166
                                                if ( i === 1 ) {
13167
                                                        that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13168
                                                }
13169
                                        } else {
13170
                                                if ( i === 0 ) {
13171
                                                        that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
13172
                                                }
13173
                                                if ( i === 1 ) {
13174
                                                        that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13175
                                                }
13176
                                        }
13177
                                }
13178
                                lastValPercent = valPercent;
13179
                        });
13180
                } else {
13181
                        value = this.value();
13182
                        valueMin = this._valueMin();
13183
                        valueMax = this._valueMax();
13184
                        valPercent = ( valueMax !== valueMin ) ?
13185
                                        ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
13186
                                        0;
13187
                        _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13188
                        this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13189
13190
                        if ( oRange === "min" && this.orientation === "horizontal" ) {
13191
                                this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
13192
                        }
13193
                        if ( oRange === "max" && this.orientation === "horizontal" ) {
13194
                                this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13195
                        }
13196
                        if ( oRange === "min" && this.orientation === "vertical" ) {
13197
                                this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
13198
                        }
13199
                        if ( oRange === "max" && this.orientation === "vertical" ) {
13200
                                this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13201
                        }
13202 85ad3d82 Assos Assos
                }
13203
        },
13204
13205 503b3f7b Assos Assos
        _handleEvents: {
13206
                keydown: function( event ) {
13207
                        /*jshint maxcomplexity:25*/
13208
                        var allowed, curVal, newVal, step,
13209
                                index = $( event.target ).data( "ui-slider-handle-index" );
13210 85ad3d82 Assos Assos
13211 503b3f7b Assos Assos
                        switch ( event.keyCode ) {
13212
                                case $.ui.keyCode.HOME:
13213
                                case $.ui.keyCode.END:
13214
                                case $.ui.keyCode.PAGE_UP:
13215
                                case $.ui.keyCode.PAGE_DOWN:
13216
                                case $.ui.keyCode.UP:
13217
                                case $.ui.keyCode.RIGHT:
13218
                                case $.ui.keyCode.DOWN:
13219
                                case $.ui.keyCode.LEFT:
13220
                                        event.preventDefault();
13221
                                        if ( !this._keySliding ) {
13222
                                                this._keySliding = true;
13223
                                                $( event.target ).addClass( "ui-state-active" );
13224
                                                allowed = this._start( event, index );
13225
                                                if ( allowed === false ) {
13226
                                                        return;
13227
                                                }
13228
                                        }
13229
                                        break;
13230
                        }
13231 85ad3d82 Assos Assos
13232 503b3f7b Assos Assos
                        step = this.options.step;
13233
                        if ( this.options.values && this.options.values.length ) {
13234
                                curVal = newVal = this.values( index );
13235
                        } else {
13236
                                curVal = newVal = this.value();
13237
                        }
13238 85ad3d82 Assos Assos
13239 503b3f7b Assos Assos
                        switch ( event.keyCode ) {
13240
                                case $.ui.keyCode.HOME:
13241
                                        newVal = this._valueMin();
13242
                                        break;
13243
                                case $.ui.keyCode.END:
13244
                                        newVal = this._valueMax();
13245
                                        break;
13246
                                case $.ui.keyCode.PAGE_UP:
13247
                                        newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
13248
                                        break;
13249
                                case $.ui.keyCode.PAGE_DOWN:
13250
                                        newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
13251
                                        break;
13252
                                case $.ui.keyCode.UP:
13253
                                case $.ui.keyCode.RIGHT:
13254
                                        if ( curVal === this._valueMax() ) {
13255
                                                return;
13256
                                        }
13257
                                        newVal = this._trimAlignValue( curVal + step );
13258
                                        break;
13259
                                case $.ui.keyCode.DOWN:
13260
                                case $.ui.keyCode.LEFT:
13261
                                        if ( curVal === this._valueMin() ) {
13262
                                                return;
13263
                                        }
13264
                                        newVal = this._trimAlignValue( curVal - step );
13265
                                        break;
13266
                        }
13267 85ad3d82 Assos Assos
13268 503b3f7b Assos Assos
                        this._slide( event, index, newVal );
13269
                },
13270
                click: function( event ) {
13271
                        event.preventDefault();
13272
                },
13273
                keyup: function( event ) {
13274
                        var index = $( event.target ).data( "ui-slider-handle-index" );
13275 85ad3d82 Assos Assos
13276 503b3f7b Assos Assos
                        if ( this._keySliding ) {
13277
                                this._keySliding = false;
13278
                                this._stop( event, index );
13279
                                this._change( event, index );
13280
                                $( event.target ).removeClass( "ui-state-active" );
13281
                        }
13282 85ad3d82 Assos Assos
                }
13283
        }
13284
13285
});
13286
13287 503b3f7b Assos Assos
}(jQuery));
13288 85ad3d82 Assos Assos
13289 503b3f7b Assos Assos
(function( $ ) {
13290 85ad3d82 Assos Assos
13291 503b3f7b Assos Assos
function modifier( fn ) {
13292
        return function() {
13293
                var previous = this.element.val();
13294
                fn.apply( this, arguments );
13295
                this._refresh();
13296
                if ( previous !== this.element.val() ) {
13297
                        this._trigger( "change" );
13298
                }
13299
        };
13300
}
13301 85ad3d82 Assos Assos
13302 503b3f7b Assos Assos
$.widget( "ui.spinner", {
13303
        version: "1.10.2",
13304
        defaultElement: "<input>",
13305
        widgetEventPrefix: "spin",
13306 85ad3d82 Assos Assos
        options: {
13307 503b3f7b Assos Assos
                culture: null,
13308
                icons: {
13309
                        down: "ui-icon-triangle-1-s",
13310
                        up: "ui-icon-triangle-1-n"
13311
                },
13312
                incremental: true,
13313
                max: null,
13314
                min: null,
13315
                numberFormat: null,
13316
                page: 10,
13317 85ad3d82 Assos Assos
                step: 1,
13318 503b3f7b Assos Assos
13319
                change: null,
13320
                spin: null,
13321
                start: null,
13322
                stop: null
13323 85ad3d82 Assos Assos
        },
13324
13325
        _create: function() {
13326 503b3f7b Assos Assos
                // handle string values that need to be parsed
13327
                this._setOption( "max", this.options.max );
13328
                this._setOption( "min", this.options.min );
13329
                this._setOption( "step", this.options.step );
13330 85ad3d82 Assos Assos
13331 503b3f7b Assos Assos
                // format the value, but don't constrain
13332
                this._value( this.element.val(), true );
13333 85ad3d82 Assos Assos
13334 503b3f7b Assos Assos
                this._draw();
13335
                this._on( this._events );
13336
                this._refresh();
13337 85ad3d82 Assos Assos
13338 503b3f7b Assos Assos
                // turning off autocomplete prevents the browser from remembering the
13339
                // value when navigating through history, so we re-enable autocomplete
13340
                // if the page is unloaded before the widget is destroyed. #7790
13341
                this._on( this.window, {
13342
                        beforeunload: function() {
13343
                                this.element.removeAttr( "autocomplete" );
13344 85ad3d82 Assos Assos
                        }
13345 503b3f7b Assos Assos
                });
13346
        },
13347 85ad3d82 Assos Assos
13348 503b3f7b Assos Assos
        _getCreateOptions: function() {
13349
                var options = {},
13350
                        element = this.element;
13351 85ad3d82 Assos Assos
13352 503b3f7b Assos Assos
                $.each( [ "min", "max", "step" ], function( i, option ) {
13353
                        var value = element.attr( option );
13354
                        if ( value !== undefined && value.length ) {
13355
                                options[ option ] = value;
13356 85ad3d82 Assos Assos
                        }
13357 503b3f7b Assos Assos
                });
13358 85ad3d82 Assos Assos
13359 503b3f7b Assos Assos
                return options;
13360
        },
13361 85ad3d82 Assos Assos
13362 503b3f7b Assos Assos
        _events: {
13363
                keydown: function( event ) {
13364
                        if ( this._start( event ) && this._keydown( event ) ) {
13365
                                event.preventDefault();
13366
                        }
13367
                },
13368
                keyup: "_stop",
13369
                focus: function() {
13370
                        this.previous = this.element.val();
13371
                },
13372
                blur: function( event ) {
13373
                        if ( this.cancelBlur ) {
13374
                                delete this.cancelBlur;
13375
                                return;
13376 85ad3d82 Assos Assos
                        }
13377
13378 503b3f7b Assos Assos
                        this._stop();
13379
                        this._refresh();
13380
                        if ( this.previous !== this.element.val() ) {
13381
                                this._trigger( "change", event );
13382
                        }
13383
                },
13384
                mousewheel: function( event, delta ) {
13385
                        if ( !delta ) {
13386
                                return;
13387
                        }
13388
                        if ( !this.spinning && !this._start( event ) ) {
13389
                                return false;
13390
                        }
13391 85ad3d82 Assos Assos
13392 503b3f7b Assos Assos
                        this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
13393
                        clearTimeout( this.mousewheelTimer );
13394
                        this.mousewheelTimer = this._delay(function() {
13395
                                if ( this.spinning ) {
13396
                                        this._stop( event );
13397 85ad3d82 Assos Assos
                                }
13398 503b3f7b Assos Assos
                        }, 100 );
13399
                        event.preventDefault();
13400
                },
13401
                "mousedown .ui-spinner-button": function( event ) {
13402
                        var previous;
13403
13404
                        // We never want the buttons to have focus; whenever the user is
13405
                        // interacting with the spinner, the focus should be on the input.
13406
                        // If the input is focused then this.previous is properly set from
13407
                        // when the input first received focus. If the input is not focused
13408
                        // then we need to set this.previous based on the value before spinning.
13409
                        previous = this.element[0] === this.document[0].activeElement ?
13410
                                this.previous : this.element.val();
13411
                        function checkFocus() {
13412
                                var isActive = this.element[0] === this.document[0].activeElement;
13413
                                if ( !isActive ) {
13414
                                        this.element.focus();
13415
                                        this.previous = previous;
13416
                                        // support: IE
13417
                                        // IE sets focus asynchronously, so we need to check if focus
13418
                                        // moved off of the input because the user clicked on the button.
13419
                                        this._delay(function() {
13420
                                                this.previous = previous;
13421
                                        });
13422 85ad3d82 Assos Assos
                                }
13423 503b3f7b Assos Assos
                        }
13424 85ad3d82 Assos Assos
13425 503b3f7b Assos Assos
                        // ensure focus is on (or stays on) the text field
13426
                        event.preventDefault();
13427
                        checkFocus.call( this );
13428
13429
                        // support: IE
13430
                        // IE doesn't prevent moving focus even with event.preventDefault()
13431
                        // so we set a flag to know when we should ignore the blur event
13432
                        // and check (again) if focus moved off of the input.
13433
                        this.cancelBlur = true;
13434
                        this._delay(function() {
13435
                                delete this.cancelBlur;
13436
                                checkFocus.call( this );
13437 85ad3d82 Assos Assos
                        });
13438
13439 503b3f7b Assos Assos
                        if ( this._start( event ) === false ) {
13440
                                return;
13441
                        }
13442 85ad3d82 Assos Assos
13443 503b3f7b Assos Assos
                        this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
13444
                },
13445
                "mouseup .ui-spinner-button": "_stop",
13446
                "mouseenter .ui-spinner-button": function( event ) {
13447
                        // button will add ui-state-active if mouse was down while mouseleave and kept down
13448
                        if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
13449
                                return;
13450
                        }
13451 85ad3d82 Assos Assos
13452 503b3f7b Assos Assos
                        if ( this._start( event ) === false ) {
13453
                                return false;
13454
                        }
13455
                        this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
13456
                },
13457
                // TODO: do we really want to consider this a stop?
13458
                // shouldn't we just stop the repeater and wait until mouseup before
13459
                // we trigger the stop event?
13460
                "mouseleave .ui-spinner-button": "_stop"
13461
        },
13462 85ad3d82 Assos Assos
13463 503b3f7b Assos Assos
        _draw: function() {
13464
                var uiSpinner = this.uiSpinner = this.element
13465
                        .addClass( "ui-spinner-input" )
13466
                        .attr( "autocomplete", "off" )
13467
                        .wrap( this._uiSpinnerHtml() )
13468
                        .parent()
13469
                                // add buttons
13470
                                .append( this._buttonHtml() );
13471 85ad3d82 Assos Assos
13472 503b3f7b Assos Assos
                this.element.attr( "role", "spinbutton" );
13473 85ad3d82 Assos Assos
13474 503b3f7b Assos Assos
                // button bindings
13475
                this.buttons = uiSpinner.find( ".ui-spinner-button" )
13476
                        .attr( "tabIndex", -1 )
13477
                        .button()
13478
                        .removeClass( "ui-corner-all" );
13479 85ad3d82 Assos Assos
13480 503b3f7b Assos Assos
                // IE 6 doesn't understand height: 50% for the buttons
13481
                // unless the wrapper has an explicit height
13482
                if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
13483
                                uiSpinner.height() > 0 ) {
13484
                        uiSpinner.height( uiSpinner.height() );
13485 85ad3d82 Assos Assos
                }
13486
13487 503b3f7b Assos Assos
                // disable spinner if element was already disabled
13488
                if ( this.options.disabled ) {
13489
                        this.disable();
13490
                }
13491
        },
13492 85ad3d82 Assos Assos
13493 503b3f7b Assos Assos
        _keydown: function( event ) {
13494
                var options = this.options,
13495
                        keyCode = $.ui.keyCode;
13496 85ad3d82 Assos Assos
13497 503b3f7b Assos Assos
                switch ( event.keyCode ) {
13498
                case keyCode.UP:
13499
                        this._repeat( null, 1, event );
13500
                        return true;
13501
                case keyCode.DOWN:
13502
                        this._repeat( null, -1, event );
13503
                        return true;
13504
                case keyCode.PAGE_UP:
13505
                        this._repeat( null, options.page, event );
13506
                        return true;
13507
                case keyCode.PAGE_DOWN:
13508
                        this._repeat( null, -options.page, event );
13509
                        return true;
13510 85ad3d82 Assos Assos
                }
13511
13512 503b3f7b Assos Assos
                return false;
13513
        },
13514 85ad3d82 Assos Assos
13515 503b3f7b Assos Assos
        _uiSpinnerHtml: function() {
13516
                return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
13517
        },
13518 85ad3d82 Assos Assos
13519 503b3f7b Assos Assos
        _buttonHtml: function() {
13520
                return "" +
13521
                        "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
13522
                                "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
13523
                        "</a>" +
13524
                        "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
13525
                                "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
13526
                        "</a>";
13527
        },
13528 85ad3d82 Assos Assos
13529 503b3f7b Assos Assos
        _start: function( event ) {
13530
                if ( !this.spinning && this._trigger( "start", event ) === false ) {
13531
                        return false;
13532 85ad3d82 Assos Assos
                }
13533
13534 503b3f7b Assos Assos
                if ( !this.counter ) {
13535
                        this.counter = 1;
13536
                }
13537
                this.spinning = true;
13538 85ad3d82 Assos Assos
                return true;
13539
        },
13540
13541 503b3f7b Assos Assos
        _repeat: function( i, steps, event ) {
13542
                i = i || 500;
13543 85ad3d82 Assos Assos
13544 503b3f7b Assos Assos
                clearTimeout( this.timer );
13545
                this.timer = this._delay(function() {
13546
                        this._repeat( 40, steps, event );
13547
                }, i );
13548
13549
                this._spin( steps * this.options.step, event );
13550 85ad3d82 Assos Assos
        },
13551
13552 503b3f7b Assos Assos
        _spin: function( step, event ) {
13553
                var value = this.value() || 0;
13554 85ad3d82 Assos Assos
13555 503b3f7b Assos Assos
                if ( !this.counter ) {
13556
                        this.counter = 1;
13557
                }
13558 85ad3d82 Assos Assos
13559 503b3f7b Assos Assos
                value = this._adjustValue( value + step * this._increment( this.counter ) );
13560 85ad3d82 Assos Assos
13561 503b3f7b Assos Assos
                if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
13562
                        this._value( value );
13563
                        this.counter++;
13564
                }
13565 85ad3d82 Assos Assos
        },
13566
13567 503b3f7b Assos Assos
        _increment: function( i ) {
13568
                var incremental = this.options.incremental;
13569 85ad3d82 Assos Assos
13570 503b3f7b Assos Assos
                if ( incremental ) {
13571
                        return $.isFunction( incremental ) ?
13572
                                incremental( i ) :
13573
                                Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
13574 85ad3d82 Assos Assos
                }
13575
13576 503b3f7b Assos Assos
                return 1;
13577
        },
13578
13579
        _precision: function() {
13580
                var precision = this._precisionOf( this.options.step );
13581
                if ( this.options.min !== null ) {
13582
                        precision = Math.max( precision, this._precisionOf( this.options.min ) );
13583 85ad3d82 Assos Assos
                }
13584 503b3f7b Assos Assos
                return precision;
13585
        },
13586
13587
        _precisionOf: function( num ) {
13588
                var str = num.toString(),
13589
                        decimal = str.indexOf( "." );
13590
                return decimal === -1 ? 0 : str.length - decimal - 1;
13591
        },
13592
13593
        _adjustValue: function( value ) {
13594
                var base, aboveMin,
13595
                        options = this.options;
13596
13597
                // make sure we're at a valid step
13598
                // - find out where we are relative to the base (min or 0)
13599
                base = options.min !== null ? options.min : 0;
13600
                aboveMin = value - base;
13601
                // - round to the nearest step
13602
                aboveMin = Math.round(aboveMin / options.step) * options.step;
13603
                // - rounding is based on 0, so adjust back to our base
13604
                value = base + aboveMin;
13605
13606
                // fix precision from bad JS floating point math
13607
                value = parseFloat( value.toFixed( this._precision() ) );
13608
13609
                // clamp the value
13610
                if ( options.max !== null && value > options.max) {
13611
                        return options.max;
13612 85ad3d82 Assos Assos
                }
13613 503b3f7b Assos Assos
                if ( options.min !== null && value < options.min ) {
13614
                        return options.min;
13615 85ad3d82 Assos Assos
                }
13616
13617 503b3f7b Assos Assos
                return value;
13618 85ad3d82 Assos Assos
        },
13619
13620 503b3f7b Assos Assos
        _stop: function( event ) {
13621
                if ( !this.spinning ) {
13622
                        return;
13623 85ad3d82 Assos Assos
                }
13624
13625 503b3f7b Assos Assos
                clearTimeout( this.timer );
13626
                clearTimeout( this.mousewheelTimer );
13627
                this.counter = 0;
13628
                this.spinning = false;
13629
                this._trigger( "stop", event );
13630
        },
13631 85ad3d82 Assos Assos
13632 503b3f7b Assos Assos
        _setOption: function( key, value ) {
13633
                if ( key === "culture" || key === "numberFormat" ) {
13634
                        var prevValue = this._parse( this.element.val() );
13635
                        this.options[ key ] = value;
13636
                        this.element.val( this._format( prevValue ) );
13637
                        return;
13638
                }
13639 85ad3d82 Assos Assos
13640 503b3f7b Assos Assos
                if ( key === "max" || key === "min" || key === "step" ) {
13641
                        if ( typeof value === "string" ) {
13642
                                value = this._parse( value );
13643 85ad3d82 Assos Assos
                        }
13644 503b3f7b Assos Assos
                }
13645
                if ( key === "icons" ) {
13646
                        this.buttons.first().find( ".ui-icon" )
13647
                                .removeClass( this.options.icons.up )
13648
                                .addClass( value.up );
13649
                        this.buttons.last().find( ".ui-icon" )
13650
                                .removeClass( this.options.icons.down )
13651
                                .addClass( value.down );
13652
                }
13653 85ad3d82 Assos Assos
13654 503b3f7b Assos Assos
                this._super( key, value );
13655
13656
                if ( key === "disabled" ) {
13657
                        if ( value ) {
13658
                                this.element.prop( "disabled", true );
13659
                                this.buttons.button( "disable" );
13660
                        } else {
13661
                                this.element.prop( "disabled", false );
13662
                                this.buttons.button( "enable" );
13663 85ad3d82 Assos Assos
                        }
13664
                }
13665
        },
13666
13667 503b3f7b Assos Assos
        _setOptions: modifier(function( options ) {
13668
                this._super( options );
13669
                this._value( this.element.val() );
13670
        }),
13671
13672
        _parse: function( val ) {
13673
                if ( typeof val === "string" && val !== "" ) {
13674
                        val = window.Globalize && this.options.numberFormat ?
13675
                                Globalize.parseFloat( val, 10, this.options.culture ) : +val;
13676 85ad3d82 Assos Assos
                }
13677 503b3f7b Assos Assos
                return val === "" || isNaN( val ) ? null : val;
13678
        },
13679 85ad3d82 Assos Assos
13680 503b3f7b Assos Assos
        _format: function( value ) {
13681
                if ( value === "" ) {
13682
                        return "";
13683
                }
13684
                return window.Globalize && this.options.numberFormat ?
13685
                        Globalize.format( value, this.options.numberFormat, this.options.culture ) :
13686
                        value;
13687 85ad3d82 Assos Assos
        },
13688
13689 503b3f7b Assos Assos
        _refresh: function() {
13690
                this.element.attr({
13691
                        "aria-valuemin": this.options.min,
13692
                        "aria-valuemax": this.options.max,
13693
                        // TODO: what should we do with values that can't be parsed?
13694
                        "aria-valuenow": this._parse( this.element.val() )
13695
                });
13696
        },
13697 85ad3d82 Assos Assos
13698 503b3f7b Assos Assos
        // update the value without triggering change
13699
        _value: function( value, allowAny ) {
13700
                var parsed;
13701
                if ( value !== "" ) {
13702
                        parsed = this._parse( value );
13703
                        if ( parsed !== null ) {
13704
                                if ( !allowAny ) {
13705
                                        parsed = this._adjustValue( parsed );
13706
                                }
13707
                                value = this._format( parsed );
13708
                        }
13709 85ad3d82 Assos Assos
                }
13710 503b3f7b Assos Assos
                this.element.val( value );
13711
                this._refresh();
13712 85ad3d82 Assos Assos
        },
13713
13714 503b3f7b Assos Assos
        _destroy: function() {
13715
                this.element
13716
                        .removeClass( "ui-spinner-input" )
13717
                        .prop( "disabled", false )
13718
                        .removeAttr( "autocomplete" )
13719
                        .removeAttr( "role" )
13720
                        .removeAttr( "aria-valuemin" )
13721
                        .removeAttr( "aria-valuemax" )
13722
                        .removeAttr( "aria-valuenow" );
13723
                this.uiSpinner.replaceWith( this.element );
13724
        },
13725
13726
        stepUp: modifier(function( steps ) {
13727
                this._stepUp( steps );
13728
        }),
13729
        _stepUp: function( steps ) {
13730
                if ( this._start() ) {
13731
                        this._spin( (steps || 1) * this.options.step );
13732
                        this._stop();
13733 85ad3d82 Assos Assos
                }
13734 503b3f7b Assos Assos
        },
13735 85ad3d82 Assos Assos
13736 503b3f7b Assos Assos
        stepDown: modifier(function( steps ) {
13737
                this._stepDown( steps );
13738
        }),
13739
        _stepDown: function( steps ) {
13740
                if ( this._start() ) {
13741
                        this._spin( (steps || 1) * -this.options.step );
13742
                        this._stop();
13743
                }
13744 85ad3d82 Assos Assos
        },
13745
13746 503b3f7b Assos Assos
        pageUp: modifier(function( pages ) {
13747
                this._stepUp( (pages || 1) * this.options.page );
13748
        }),
13749 85ad3d82 Assos Assos
13750 503b3f7b Assos Assos
        pageDown: modifier(function( pages ) {
13751
                this._stepDown( (pages || 1) * this.options.page );
13752
        }),
13753 85ad3d82 Assos Assos
13754 503b3f7b Assos Assos
        value: function( newVal ) {
13755
                if ( !arguments.length ) {
13756
                        return this._parse( this.element.val() );
13757 85ad3d82 Assos Assos
                }
13758 503b3f7b Assos Assos
                modifier( this._value ).call( this, newVal );
13759 85ad3d82 Assos Assos
        },
13760
13761 503b3f7b Assos Assos
        widget: function() {
13762
                return this.uiSpinner;
13763
        }
13764
});
13765 85ad3d82 Assos Assos
13766 503b3f7b Assos Assos
}( jQuery ) );
13767 85ad3d82 Assos Assos
13768 503b3f7b Assos Assos
(function( $, undefined ) {
13769 85ad3d82 Assos Assos
13770 503b3f7b Assos Assos
var tabId = 0,
13771
        rhash = /#.*$/;
13772
13773
function getNextTabId() {
13774
        return ++tabId;
13775
}
13776
13777
function isLocal( anchor ) {
13778
        return anchor.hash.length > 1 &&
13779
                decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
13780
                        decodeURIComponent( location.href.replace( rhash, "" ) );
13781
}
13782
13783
$.widget( "ui.tabs", {
13784
        version: "1.10.2",
13785
        delay: 300,
13786
        options: {
13787
                active: null,
13788
                collapsible: false,
13789
                event: "click",
13790
                heightStyle: "content",
13791
                hide: null,
13792
                show: null,
13793
13794
                // callbacks
13795
                activate: null,
13796
                beforeActivate: null,
13797
                beforeLoad: null,
13798
                load: null
13799
        },
13800
13801
        _create: function() {
13802
                var that = this,
13803
                        options = this.options;
13804
13805
                this.running = false;
13806
13807
                this.element
13808
                        .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
13809
                        .toggleClass( "ui-tabs-collapsible", options.collapsible )
13810
                        // Prevent users from focusing disabled tabs via click
13811
                        .delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
13812
                                if ( $( this ).is( ".ui-state-disabled" ) ) {
13813
                                        event.preventDefault();
13814 85ad3d82 Assos Assos
                                }
13815 503b3f7b Assos Assos
                        })
13816
                        // support: IE <9
13817
                        // Preventing the default action in mousedown doesn't prevent IE
13818
                        // from focusing the element, so if the anchor gets focused, blur.
13819
                        // We don't have to worry about focusing the previously focused
13820
                        // element since clicking on a non-focusable element should focus
13821
                        // the body anyway.
13822
                        .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
13823
                                if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
13824
                                        this.blur();
13825 85ad3d82 Assos Assos
                                }
13826 503b3f7b Assos Assos
                        });
13827
13828
                this._processTabs();
13829
                options.active = this._initialActive();
13830
13831
                // Take disabling tabs via class attribute from HTML
13832
                // into account and update option properly.
13833
                if ( $.isArray( options.disabled ) ) {
13834
                        options.disabled = $.unique( options.disabled.concat(
13835
                                $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
13836
                                        return that.tabs.index( li );
13837
                                })
13838
                        ) ).sort();
13839 85ad3d82 Assos Assos
                }
13840
13841 503b3f7b Assos Assos
                // check for length avoids error when initializing empty list
13842
                if ( this.options.active !== false && this.anchors.length ) {
13843
                        this.active = this._findActive( options.active );
13844
                } else {
13845
                        this.active = $();
13846
                }
13847 85ad3d82 Assos Assos
13848 503b3f7b Assos Assos
                this._refresh();
13849
13850
                if ( this.active.length ) {
13851
                        this.load( options.active );
13852
                }
13853 85ad3d82 Assos Assos
        },
13854
13855 503b3f7b Assos Assos
        _initialActive: function() {
13856
                var active = this.options.active,
13857
                        collapsible = this.options.collapsible,
13858
                        locationHash = location.hash.substring( 1 );
13859 85ad3d82 Assos Assos
13860 503b3f7b Assos Assos
                if ( active === null ) {
13861
                        // check the fragment identifier in the URL
13862
                        if ( locationHash ) {
13863
                                this.tabs.each(function( i, tab ) {
13864
                                        if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
13865
                                                active = i;
13866
                                                return false;
13867
                                        }
13868
                                });
13869
                        }
13870 85ad3d82 Assos Assos
13871 503b3f7b Assos Assos
                        // check for a tab marked active via a class
13872
                        if ( active === null ) {
13873
                                active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
13874 85ad3d82 Assos Assos
                        }
13875
13876 503b3f7b Assos Assos
                        // no active tab, set to false
13877
                        if ( active === null || active === -1 ) {
13878
                                active = this.tabs.length ? 0 : false;
13879
                        }
13880 85ad3d82 Assos Assos
                }
13881 503b3f7b Assos Assos
13882
                // handle numbers: negative, out of range
13883
                if ( active !== false ) {
13884
                        active = this.tabs.index( this.tabs.eq( active ) );
13885
                        if ( active === -1 ) {
13886
                                active = collapsible ? false : 0;
13887
                        }
13888 85ad3d82 Assos Assos
                }
13889
13890 503b3f7b Assos Assos
                // don't allow collapsible: false and active: false
13891
                if ( !collapsible && active === false && this.anchors.length ) {
13892
                        active = 0;
13893 85ad3d82 Assos Assos
                }
13894
13895 503b3f7b Assos Assos
                return active;
13896 85ad3d82 Assos Assos
        },
13897
13898 503b3f7b Assos Assos
        _getCreateEventData: function() {
13899
                return {
13900
                        tab: this.active,
13901
                        panel: !this.active.length ? $() : this._getPanelForTab( this.active )
13902
                };
13903 85ad3d82 Assos Assos
        },
13904
13905 503b3f7b Assos Assos
        _tabKeydown: function( event ) {
13906
                /*jshint maxcomplexity:15*/
13907
                var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
13908
                        selectedIndex = this.tabs.index( focusedTab ),
13909
                        goingForward = true;
13910 85ad3d82 Assos Assos
13911 503b3f7b Assos Assos
                if ( this._handlePageNav( event ) ) {
13912
                        return;
13913
                }
13914 85ad3d82 Assos Assos
13915 503b3f7b Assos Assos
                switch ( event.keyCode ) {
13916
                        case $.ui.keyCode.RIGHT:
13917
                        case $.ui.keyCode.DOWN:
13918
                                selectedIndex++;
13919
                                break;
13920
                        case $.ui.keyCode.UP:
13921
                        case $.ui.keyCode.LEFT:
13922
                                goingForward = false;
13923
                                selectedIndex--;
13924
                                break;
13925
                        case $.ui.keyCode.END:
13926
                                selectedIndex = this.anchors.length - 1;
13927
                                break;
13928
                        case $.ui.keyCode.HOME:
13929
                                selectedIndex = 0;
13930
                                break;
13931
                        case $.ui.keyCode.SPACE:
13932
                                // Activate only, no collapsing
13933
                                event.preventDefault();
13934
                                clearTimeout( this.activating );
13935
                                this._activate( selectedIndex );
13936
                                return;
13937
                        case $.ui.keyCode.ENTER:
13938
                                // Toggle (cancel delayed activation, allow collapsing)
13939
                                event.preventDefault();
13940
                                clearTimeout( this.activating );
13941
                                // Determine if we should collapse or activate
13942
                                this._activate( selectedIndex === this.options.active ? false : selectedIndex );
13943
                                return;
13944
                        default:
13945
                                return;
13946 85ad3d82 Assos Assos
                }
13947
13948 503b3f7b Assos Assos
                // Focus the appropriate tab, based on which key was pressed
13949
                event.preventDefault();
13950
                clearTimeout( this.activating );
13951
                selectedIndex = this._focusNextTab( selectedIndex, goingForward );
13952 85ad3d82 Assos Assos
13953 503b3f7b Assos Assos
                // Navigating with control key will prevent automatic activation
13954
                if ( !event.ctrlKey ) {
13955
                        // Update aria-selected immediately so that AT think the tab is already selected.
13956
                        // Otherwise AT may confuse the user by stating that they need to activate the tab,
13957
                        // but the tab will already be activated by the time the announcement finishes.
13958
                        focusedTab.attr( "aria-selected", "false" );
13959
                        this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
13960 85ad3d82 Assos Assos
13961 503b3f7b Assos Assos
                        this.activating = this._delay(function() {
13962
                                this.option( "active", selectedIndex );
13963
                        }, this.delay );
13964
                }
13965
        },
13966 85ad3d82 Assos Assos
13967 503b3f7b Assos Assos
        _panelKeydown: function( event ) {
13968
                if ( this._handlePageNav( event ) ) {
13969
                        return;
13970
                }
13971 85ad3d82 Assos Assos
13972 503b3f7b Assos Assos
                // Ctrl+up moves focus to the current tab
13973
                if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
13974
                        event.preventDefault();
13975
                        this.active.focus();
13976
                }
13977
        },
13978 85ad3d82 Assos Assos
13979 503b3f7b Assos Assos
        // Alt+page up/down moves focus to the previous/next tab (and activates)
13980
        _handlePageNav: function( event ) {
13981
                if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
13982
                        this._activate( this._focusNextTab( this.options.active - 1, false ) );
13983
                        return true;
13984
                }
13985
                if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
13986
                        this._activate( this._focusNextTab( this.options.active + 1, true ) );
13987
                        return true;
13988
                }
13989
        },
13990 85ad3d82 Assos Assos
13991 503b3f7b Assos Assos
        _findNextTab: function( index, goingForward ) {
13992
                var lastTabIndex = this.tabs.length - 1;
13993
13994
                function constrain() {
13995
                        if ( index > lastTabIndex ) {
13996
                                index = 0;
13997
                        }
13998
                        if ( index < 0 ) {
13999
                                index = lastTabIndex;
14000
                        }
14001
                        return index;
14002
                }
14003
14004
                while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
14005
                        index = goingForward ? index + 1 : index - 1;
14006
                }
14007
14008
                return index;
14009 85ad3d82 Assos Assos
        },
14010
14011 503b3f7b Assos Assos
        _focusNextTab: function( index, goingForward ) {
14012
                index = this._findNextTab( index, goingForward );
14013
                this.tabs.eq( index ).focus();
14014
                return index;
14015 85ad3d82 Assos Assos
        },
14016
14017
        _setOption: function( key, value ) {
14018 503b3f7b Assos Assos
                if ( key === "active" ) {
14019
                        // _activate() will handle invalid values and update this.options
14020
                        this._activate( value );
14021
                        return;
14022
                }
14023
14024
                if ( key === "disabled" ) {
14025
                        // don't use the widget factory's disabled handling
14026
                        this._setupDisabled( value );
14027
                        return;
14028
                }
14029
14030
                this._super( key, value);
14031
14032
                if ( key === "collapsible" ) {
14033
                        this.element.toggleClass( "ui-tabs-collapsible", value );
14034
                        // Setting collapsible: false while collapsed; open first panel
14035
                        if ( !value && this.options.active === false ) {
14036
                                this._activate( 0 );
14037 85ad3d82 Assos Assos
                        }
14038 503b3f7b Assos Assos
                }
14039
14040
                if ( key === "event" ) {
14041
                        this._setupEvents( value );
14042
                }
14043
14044
                if ( key === "heightStyle" ) {
14045
                        this._setupHeightStyle( value );
14046 85ad3d82 Assos Assos
                }
14047
        },
14048
14049 503b3f7b Assos Assos
        _tabId: function( tab ) {
14050
                return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
14051 85ad3d82 Assos Assos
        },
14052
14053
        _sanitizeSelector: function( hash ) {
14054 503b3f7b Assos Assos
                return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
14055 85ad3d82 Assos Assos
        },
14056
14057 503b3f7b Assos Assos
        refresh: function() {
14058
                var options = this.options,
14059
                        lis = this.tablist.children( ":has(a[href])" );
14060 85ad3d82 Assos Assos
14061 503b3f7b Assos Assos
                // get disabled tabs from class attribute from HTML
14062
                // this will get converted to a boolean if needed in _refresh()
14063
                options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
14064
                        return lis.index( tab );
14065
                });
14066
14067
                this._processTabs();
14068
14069
                // was collapsed or no tabs
14070
                if ( options.active === false || !this.anchors.length ) {
14071
                        options.active = false;
14072
                        this.active = $();
14073
                // was active, but active tab is gone
14074
                } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
14075
                        // all remaining tabs are disabled
14076
                        if ( this.tabs.length === options.disabled.length ) {
14077
                                options.active = false;
14078
                                this.active = $();
14079
                        // activate previous tab
14080
                        } else {
14081
                                this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
14082
                        }
14083
                // was active, active tab still exists
14084
                } else {
14085
                        // make sure active index is correct
14086
                        options.active = this.tabs.index( this.active );
14087
                }
14088
14089
                this._refresh();
14090 85ad3d82 Assos Assos
        },
14091
14092 503b3f7b Assos Assos
        _refresh: function() {
14093
                this._setupDisabled( this.options.disabled );
14094
                this._setupEvents( this.options.event );
14095
                this._setupHeightStyle( this.options.heightStyle );
14096
14097
                this.tabs.not( this.active ).attr({
14098
                        "aria-selected": "false",
14099
                        tabIndex: -1
14100
                });
14101
                this.panels.not( this._getPanelForTab( this.active ) )
14102
                        .hide()
14103
                        .attr({
14104
                                "aria-expanded": "false",
14105
                                "aria-hidden": "true"
14106
                        });
14107
14108
                // Make sure one tab is in the tab order
14109
                if ( !this.active.length ) {
14110
                        this.tabs.eq( 0 ).attr( "tabIndex", 0 );
14111
                } else {
14112
                        this.active
14113
                                .addClass( "ui-tabs-active ui-state-active" )
14114
                                .attr({
14115
                                        "aria-selected": "true",
14116
                                        tabIndex: 0
14117
                                });
14118
                        this._getPanelForTab( this.active )
14119
                                .show()
14120
                                .attr({
14121
                                        "aria-expanded": "true",
14122
                                        "aria-hidden": "false"
14123 85ad3d82 Assos Assos
                                });
14124 503b3f7b Assos Assos
                }
14125 85ad3d82 Assos Assos
        },
14126
14127 503b3f7b Assos Assos
        _processTabs: function() {
14128
                var that = this;
14129 85ad3d82 Assos Assos
14130 503b3f7b Assos Assos
                this.tablist = this._getList()
14131
                        .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
14132
                        .attr( "role", "tablist" );
14133
14134
                this.tabs = this.tablist.find( "> li:has(a[href])" )
14135
                        .addClass( "ui-state-default ui-corner-top" )
14136
                        .attr({
14137
                                role: "tab",
14138
                                tabIndex: -1
14139
                        });
14140
14141
                this.anchors = this.tabs.map(function() {
14142
                                return $( "a", this )[ 0 ];
14143
                        })
14144
                        .addClass( "ui-tabs-anchor" )
14145
                        .attr({
14146
                                role: "presentation",
14147
                                tabIndex: -1
14148
                        });
14149
14150
                this.panels = $();
14151
14152
                this.anchors.each(function( i, anchor ) {
14153
                        var selector, panel, panelId,
14154
                                anchorId = $( anchor ).uniqueId().attr( "id" ),
14155
                                tab = $( anchor ).closest( "li" ),
14156
                                originalAriaControls = tab.attr( "aria-controls" );
14157 85ad3d82 Assos Assos
14158
                        // inline tab
14159 503b3f7b Assos Assos
                        if ( isLocal( anchor ) ) {
14160
                                selector = anchor.hash;
14161
                                panel = that.element.find( that._sanitizeSelector( selector ) );
14162 85ad3d82 Assos Assos
                        // remote tab
14163
                        } else {
14164 503b3f7b Assos Assos
                                panelId = that._tabId( tab );
14165
                                selector = "#" + panelId;
14166
                                panel = that.element.find( selector );
14167
                                if ( !panel.length ) {
14168
                                        panel = that._createPanel( panelId );
14169
                                        panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
14170
                                }
14171
                                panel.attr( "aria-live", "polite" );
14172 85ad3d82 Assos Assos
                        }
14173
14174 503b3f7b Assos Assos
                        if ( panel.length) {
14175
                                that.panels = that.panels.add( panel );
14176 85ad3d82 Assos Assos
                        }
14177 503b3f7b Assos Assos
                        if ( originalAriaControls ) {
14178
                                tab.data( "ui-tabs-aria-controls", originalAriaControls );
14179
                        }
14180
                        tab.attr({
14181
                                "aria-controls": selector.substring( 1 ),
14182
                                "aria-labelledby": anchorId
14183
                        });
14184
                        panel.attr( "aria-labelledby", anchorId );
14185
                });
14186
14187
                this.panels
14188
                        .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
14189
                        .attr( "role", "tabpanel" );
14190
        },
14191 85ad3d82 Assos Assos
14192 503b3f7b Assos Assos
        // allow overriding how to find the list for rare usage scenarios (#7715)
14193
        _getList: function() {
14194
                return this.element.find( "ol,ul" ).eq( 0 );
14195
        },
14196 85ad3d82 Assos Assos
14197 503b3f7b Assos Assos
        _createPanel: function( id ) {
14198
                return $( "<div>" )
14199
                        .attr( "id", id )
14200
                        .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
14201
                        .data( "ui-tabs-destroy", true );
14202
        },
14203 85ad3d82 Assos Assos
14204 503b3f7b Assos Assos
        _setupDisabled: function( disabled ) {
14205
                if ( $.isArray( disabled ) ) {
14206
                        if ( !disabled.length ) {
14207
                                disabled = false;
14208
                        } else if ( disabled.length === this.anchors.length ) {
14209
                                disabled = true;
14210 85ad3d82 Assos Assos
                        }
14211 503b3f7b Assos Assos
                }
14212 85ad3d82 Assos Assos
14213 503b3f7b Assos Assos
                // disable tabs
14214
                for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
14215
                        if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
14216
                                $( li )
14217
                                        .addClass( "ui-state-disabled" )
14218
                                        .attr( "aria-disabled", "true" );
14219
                        } else {
14220
                                $( li )
14221
                                        .removeClass( "ui-state-disabled" )
14222
                                        .removeAttr( "aria-disabled" );
14223
                        }
14224
                }
14225 85ad3d82 Assos Assos
14226 503b3f7b Assos Assos
                this.options.disabled = disabled;
14227
        },
14228 85ad3d82 Assos Assos
14229 503b3f7b Assos Assos
        _setupEvents: function( event ) {
14230
                var events = {
14231
                        click: function( event ) {
14232
                                event.preventDefault();
14233 85ad3d82 Assos Assos
                        }
14234 503b3f7b Assos Assos
                };
14235
                if ( event ) {
14236
                        $.each( event.split(" "), function( index, eventName ) {
14237
                                events[ eventName ] = "_eventHandler";
14238
                        });
14239
                }
14240
14241
                this._off( this.anchors.add( this.tabs ).add( this.panels ) );
14242
                this._on( this.anchors, events );
14243
                this._on( this.tabs, { keydown: "_tabKeydown" } );
14244
                this._on( this.panels, { keydown: "_panelKeydown" } );
14245
14246
                this._focusable( this.tabs );
14247
                this._hoverable( this.tabs );
14248
        },
14249
14250
        _setupHeightStyle: function( heightStyle ) {
14251
                var maxHeight,
14252
                        parent = this.element.parent();
14253
14254
                if ( heightStyle === "fill" ) {
14255
                        maxHeight = parent.height();
14256
                        maxHeight -= this.element.outerHeight() - this.element.height();
14257
14258
                        this.element.siblings( ":visible" ).each(function() {
14259
                                var elem = $( this ),
14260
                                        position = elem.css( "position" );
14261
14262
                                if ( position === "absolute" || position === "fixed" ) {
14263
                                        return;
14264
                                }
14265
                                maxHeight -= elem.outerHeight( true );
14266
                        });
14267 85ad3d82 Assos Assos
14268 503b3f7b Assos Assos
                        this.element.children().not( this.panels ).each(function() {
14269
                                maxHeight -= $( this ).outerHeight( true );
14270 85ad3d82 Assos Assos
                        });
14271 503b3f7b Assos Assos
14272
                        this.panels.each(function() {
14273
                                $( this ).height( Math.max( 0, maxHeight -
14274
                                        $( this ).innerHeight() + $( this ).height() ) );
14275
                        })
14276
                        .css( "overflow", "auto" );
14277
                } else if ( heightStyle === "auto" ) {
14278
                        maxHeight = 0;
14279
                        this.panels.each(function() {
14280
                                maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
14281
                        }).height( maxHeight );
14282
                }
14283
        },
14284
14285
        _eventHandler: function( event ) {
14286
                var options = this.options,
14287
                        active = this.active,
14288
                        anchor = $( event.currentTarget ),
14289
                        tab = anchor.closest( "li" ),
14290
                        clickedIsActive = tab[ 0 ] === active[ 0 ],
14291
                        collapsing = clickedIsActive && options.collapsible,
14292
                        toShow = collapsing ? $() : this._getPanelForTab( tab ),
14293
                        toHide = !active.length ? $() : this._getPanelForTab( active ),
14294
                        eventData = {
14295
                                oldTab: active,
14296
                                oldPanel: toHide,
14297
                                newTab: collapsing ? $() : tab,
14298
                                newPanel: toShow
14299
                        };
14300
14301
                event.preventDefault();
14302
14303
                if ( tab.hasClass( "ui-state-disabled" ) ||
14304
                                // tab is already loading
14305
                                tab.hasClass( "ui-tabs-loading" ) ||
14306
                                // can't switch durning an animation
14307
                                this.running ||
14308
                                // click on active header, but not collapsible
14309
                                ( clickedIsActive && !options.collapsible ) ||
14310
                                // allow canceling activation
14311
                                ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
14312
                        return;
14313 85ad3d82 Assos Assos
                }
14314
14315 503b3f7b Assos Assos
                options.active = collapsing ? false : this.tabs.index( tab );
14316 85ad3d82 Assos Assos
14317 503b3f7b Assos Assos
                this.active = clickedIsActive ? $() : tab;
14318
                if ( this.xhr ) {
14319
                        this.xhr.abort();
14320 85ad3d82 Assos Assos
                }
14321
14322 503b3f7b Assos Assos
                if ( !toHide.length && !toShow.length ) {
14323
                        $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
14324 85ad3d82 Assos Assos
                }
14325
14326 503b3f7b Assos Assos
                if ( toShow.length ) {
14327
                        this.load( this.tabs.index( tab ), event );
14328 85ad3d82 Assos Assos
                }
14329 503b3f7b Assos Assos
                this._toggle( event, eventData );
14330
        },
14331 85ad3d82 Assos Assos
14332 503b3f7b Assos Assos
        // handles show/hide for selecting tabs
14333
        _toggle: function( event, eventData ) {
14334
                var that = this,
14335
                        toShow = eventData.newPanel,
14336
                        toHide = eventData.oldPanel;
14337 85ad3d82 Assos Assos
14338 503b3f7b Assos Assos
                this.running = true;
14339
14340
                function complete() {
14341
                        that.running = false;
14342
                        that._trigger( "activate", event, eventData );
14343 85ad3d82 Assos Assos
                }
14344
14345 503b3f7b Assos Assos
                function show() {
14346
                        eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
14347
14348
                        if ( toShow.length && that.options.show ) {
14349
                                that._show( toShow, that.options.show, complete );
14350 85ad3d82 Assos Assos
                        } else {
14351 503b3f7b Assos Assos
                                toShow.show();
14352
                                complete();
14353 85ad3d82 Assos Assos
                        }
14354
                }
14355
14356 503b3f7b Assos Assos
                // start out by hiding, then showing, then completing
14357
                if ( toHide.length && this.options.hide ) {
14358
                        this._hide( toHide, this.options.hide, function() {
14359
                                eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
14360
                                show();
14361
                        });
14362
                } else {
14363
                        eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
14364
                        toHide.hide();
14365
                        show();
14366 85ad3d82 Assos Assos
                }
14367
14368 503b3f7b Assos Assos
                toHide.attr({
14369
                        "aria-expanded": "false",
14370
                        "aria-hidden": "true"
14371
                });
14372
                eventData.oldTab.attr( "aria-selected", "false" );
14373
                // If we're switching tabs, remove the old tab from the tab order.
14374
                // If we're opening from collapsed state, remove the previous tab from the tab order.
14375
                // If we're collapsing, then keep the collapsing tab in the tab order.
14376
                if ( toShow.length && toHide.length ) {
14377
                        eventData.oldTab.attr( "tabIndex", -1 );
14378
                } else if ( toShow.length ) {
14379
                        this.tabs.filter(function() {
14380
                                return $( this ).attr( "tabIndex" ) === 0;
14381
                        })
14382
                        .attr( "tabIndex", -1 );
14383
                }
14384 85ad3d82 Assos Assos
14385 503b3f7b Assos Assos
                toShow.attr({
14386
                        "aria-expanded": "true",
14387
                        "aria-hidden": "false"
14388
                });
14389
                eventData.newTab.attr({
14390
                        "aria-selected": "true",
14391
                        tabIndex: 0
14392
                });
14393
        },
14394 85ad3d82 Assos Assos
14395 503b3f7b Assos Assos
        _activate: function( index ) {
14396
                var anchor,
14397
                        active = this._findActive( index );
14398 85ad3d82 Assos Assos
14399 503b3f7b Assos Assos
                // trying to activate the already active panel
14400
                if ( active[ 0 ] === this.active[ 0 ] ) {
14401
                        return;
14402
                }
14403 85ad3d82 Assos Assos
14404 503b3f7b Assos Assos
                // trying to collapse, simulate a click on the current active header
14405
                if ( !active.length ) {
14406
                        active = this.active;
14407
                }
14408 85ad3d82 Assos Assos
14409 503b3f7b Assos Assos
                anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
14410
                this._eventHandler({
14411
                        target: anchor,
14412
                        currentTarget: anchor,
14413
                        preventDefault: $.noop
14414 85ad3d82 Assos Assos
                });
14415 503b3f7b Assos Assos
        },
14416 85ad3d82 Assos Assos
14417 503b3f7b Assos Assos
        _findActive: function( index ) {
14418
                return index === false ? $() : this.tabs.eq( index );
14419 85ad3d82 Assos Assos
        },
14420
14421 503b3f7b Assos Assos
        _getIndex: function( index ) {
14422 85ad3d82 Assos Assos
                // meta-function to give users option to provide a href string instead of a numerical index.
14423 503b3f7b Assos Assos
                if ( typeof index === "string" ) {
14424
                        index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
14425 85ad3d82 Assos Assos
                }
14426
14427
                return index;
14428
        },
14429
14430 503b3f7b Assos Assos
        _destroy: function() {
14431
                if ( this.xhr ) {
14432
                        this.xhr.abort();
14433
                }
14434 85ad3d82 Assos Assos
14435 503b3f7b Assos Assos
                this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
14436 85ad3d82 Assos Assos
14437 503b3f7b Assos Assos
                this.tablist
14438
                        .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
14439
                        .removeAttr( "role" );
14440 85ad3d82 Assos Assos
14441 503b3f7b Assos Assos
                this.anchors
14442
                        .removeClass( "ui-tabs-anchor" )
14443
                        .removeAttr( "role" )
14444
                        .removeAttr( "tabIndex" )
14445
                        .removeUniqueId();
14446 85ad3d82 Assos Assos
14447 503b3f7b Assos Assos
                this.tabs.add( this.panels ).each(function() {
14448
                        if ( $.data( this, "ui-tabs-destroy" ) ) {
14449
                                $( this ).remove();
14450
                        } else {
14451
                                $( this )
14452
                                        .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
14453
                                                "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
14454
                                        .removeAttr( "tabIndex" )
14455
                                        .removeAttr( "aria-live" )
14456
                                        .removeAttr( "aria-busy" )
14457
                                        .removeAttr( "aria-selected" )
14458
                                        .removeAttr( "aria-labelledby" )
14459
                                        .removeAttr( "aria-hidden" )
14460
                                        .removeAttr( "aria-expanded" )
14461
                                        .removeAttr( "role" );
14462 85ad3d82 Assos Assos
                        }
14463
                });
14464
14465 503b3f7b Assos Assos
                this.tabs.each(function() {
14466
                        var li = $( this ),
14467
                                prev = li.data( "ui-tabs-aria-controls" );
14468
                        if ( prev ) {
14469
                                li
14470
                                        .attr( "aria-controls", prev )
14471
                                        .removeData( "ui-tabs-aria-controls" );
14472 85ad3d82 Assos Assos
                        } else {
14473 503b3f7b Assos Assos
                                li.removeAttr( "aria-controls" );
14474 85ad3d82 Assos Assos
                        }
14475
                });
14476
14477 503b3f7b Assos Assos
                this.panels.show();
14478 85ad3d82 Assos Assos
14479 503b3f7b Assos Assos
                if ( this.options.heightStyle !== "content" ) {
14480
                        this.panels.css( "height", "" );
14481
                }
14482 85ad3d82 Assos Assos
        },
14483
14484 503b3f7b Assos Assos
        enable: function( index ) {
14485
                var disabled = this.options.disabled;
14486
                if ( disabled === false ) {
14487
                        return;
14488 85ad3d82 Assos Assos
                }
14489
14490 503b3f7b Assos Assos
                if ( index === undefined ) {
14491
                        disabled = false;
14492
                } else {
14493
                        index = this._getIndex( index );
14494
                        if ( $.isArray( disabled ) ) {
14495
                                disabled = $.map( disabled, function( num ) {
14496
                                        return num !== index ? num : null;
14497
                                });
14498
                        } else {
14499
                                disabled = $.map( this.tabs, function( li, num ) {
14500
                                        return num !== index ? num : null;
14501
                                });
14502
                        }
14503
                }
14504
                this._setupDisabled( disabled );
14505
        },
14506 85ad3d82 Assos Assos
14507 503b3f7b Assos Assos
        disable: function( index ) {
14508
                var disabled = this.options.disabled;
14509
                if ( disabled === true ) {
14510
                        return;
14511 85ad3d82 Assos Assos
                }
14512
14513 503b3f7b Assos Assos
                if ( index === undefined ) {
14514
                        disabled = true;
14515 85ad3d82 Assos Assos
                } else {
14516 503b3f7b Assos Assos
                        index = this._getIndex( index );
14517
                        if ( $.inArray( index, disabled ) !== -1 ) {
14518
                                return;
14519
                        }
14520
                        if ( $.isArray( disabled ) ) {
14521
                                disabled = $.merge( [ index ], disabled ).sort();
14522
                        } else {
14523
                                disabled = [ index ];
14524
                        }
14525 85ad3d82 Assos Assos
                }
14526 503b3f7b Assos Assos
                this._setupDisabled( disabled );
14527
        },
14528 85ad3d82 Assos Assos
14529 503b3f7b Assos Assos
        load: function( index, event ) {
14530
                index = this._getIndex( index );
14531
                var that = this,
14532
                        tab = this.tabs.eq( index ),
14533
                        anchor = tab.find( ".ui-tabs-anchor" ),
14534
                        panel = this._getPanelForTab( tab ),
14535
                        eventData = {
14536
                                tab: tab,
14537
                                panel: panel
14538
                        };
14539
14540
                // not remote
14541
                if ( isLocal( anchor[ 0 ] ) ) {
14542
                        return;
14543
                }
14544 85ad3d82 Assos Assos
14545 503b3f7b Assos Assos
                this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
14546 85ad3d82 Assos Assos
14547 503b3f7b Assos Assos
                // support: jQuery <1.8
14548
                // jQuery <1.8 returns false if the request is canceled in beforeSend,
14549
                // but as of 1.8, $.ajax() always returns a jqXHR object.
14550
                if ( this.xhr && this.xhr.statusText !== "canceled" ) {
14551
                        tab.addClass( "ui-tabs-loading" );
14552
                        panel.attr( "aria-busy", "true" );
14553
14554
                        this.xhr
14555
                                .success(function( response ) {
14556
                                        // support: jQuery <1.8
14557
                                        // http://bugs.jquery.com/ticket/11778
14558
                                        setTimeout(function() {
14559
                                                panel.html( response );
14560
                                                that._trigger( "load", event, eventData );
14561
                                        }, 1 );
14562
                                })
14563
                                .complete(function( jqXHR, status ) {
14564
                                        // support: jQuery <1.8
14565
                                        // http://bugs.jquery.com/ticket/11778
14566
                                        setTimeout(function() {
14567
                                                if ( status === "abort" ) {
14568
                                                        that.panels.stop( false, true );
14569
                                                }
14570 85ad3d82 Assos Assos
14571 503b3f7b Assos Assos
                                                tab.removeClass( "ui-tabs-loading" );
14572
                                                panel.removeAttr( "aria-busy" );
14573
14574
                                                if ( jqXHR === that.xhr ) {
14575
                                                        delete that.xhr;
14576
                                                }
14577
                                        }, 1 );
14578
                                });
14579 85ad3d82 Assos Assos
                }
14580 503b3f7b Assos Assos
        },
14581 85ad3d82 Assos Assos
14582 503b3f7b Assos Assos
        _ajaxSettings: function( anchor, event, eventData ) {
14583
                var that = this;
14584
                return {
14585
                        url: anchor.attr( "href" ),
14586
                        beforeSend: function( jqXHR, settings ) {
14587
                                return that._trigger( "beforeLoad", event,
14588
                                        $.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
14589
                        }
14590
                };
14591 85ad3d82 Assos Assos
        },
14592
14593 503b3f7b Assos Assos
        _getPanelForTab: function( tab ) {
14594
                var id = $( tab ).attr( "aria-controls" );
14595
                return this.element.find( this._sanitizeSelector( "#" + id ) );
14596
        }
14597
});
14598 85ad3d82 Assos Assos
14599 503b3f7b Assos Assos
})( jQuery );
14600 85ad3d82 Assos Assos
14601 503b3f7b Assos Assos
(function( $ ) {
14602 85ad3d82 Assos Assos
14603 503b3f7b Assos Assos
var increments = 0;
14604 85ad3d82 Assos Assos
14605 503b3f7b Assos Assos
function addDescribedBy( elem, id ) {
14606
        var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
14607
        describedby.push( id );
14608
        elem
14609
                .data( "ui-tooltip-id", id )
14610
                .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
14611
}
14612
14613
function removeDescribedBy( elem ) {
14614
        var id = elem.data( "ui-tooltip-id" ),
14615
                describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
14616
                index = $.inArray( id, describedby );
14617
        if ( index !== -1 ) {
14618
                describedby.splice( index, 1 );
14619
        }
14620
14621
        elem.removeData( "ui-tooltip-id" );
14622
        describedby = $.trim( describedby.join( " " ) );
14623
        if ( describedby ) {
14624
                elem.attr( "aria-describedby", describedby );
14625
        } else {
14626
                elem.removeAttr( "aria-describedby" );
14627
        }
14628
}
14629
14630
$.widget( "ui.tooltip", {
14631
        version: "1.10.2",
14632
        options: {
14633
                content: function() {
14634
                        // support: IE<9, Opera in jQuery <1.7
14635
                        // .text() can't accept undefined, so coerce to a string
14636
                        var title = $( this ).attr( "title" ) || "";
14637
                        // Escape title, since we're going from an attribute to raw HTML
14638
                        return $( "<a>" ).text( title ).html();
14639
                },
14640
                hide: true,
14641
                // Disabled elements have inconsistent behavior across browsers (#8661)
14642
                items: "[title]:not([disabled])",
14643
                position: {
14644
                        my: "left top+15",
14645
                        at: "left bottom",
14646
                        collision: "flipfit flip"
14647
                },
14648
                show: true,
14649
                tooltipClass: null,
14650
                track: false,
14651
14652
                // callbacks
14653
                close: null,
14654
                open: null
14655 85ad3d82 Assos Assos
        },
14656
14657 503b3f7b Assos Assos
        _create: function() {
14658
                this._on({
14659
                        mouseover: "open",
14660
                        focusin: "open"
14661
                });
14662
14663
                // IDs of generated tooltips, needed for destroy
14664
                this.tooltips = {};
14665
                // IDs of parent tooltips where we removed the title attribute
14666
                this.parents = {};
14667
14668
                if ( this.options.disabled ) {
14669
                        this._disable();
14670
                }
14671
        },
14672
14673
        _setOption: function( key, value ) {
14674
                var that = this;
14675
14676
                if ( key === "disabled" ) {
14677
                        this[ value ? "_disable" : "_enable" ]();
14678
                        this.options[ key ] = value;
14679
                        // disable element style changes
14680 85ad3d82 Assos Assos
                        return;
14681
                }
14682
14683 503b3f7b Assos Assos
                this._super( key, value );
14684
14685
                if ( key === "content" ) {
14686
                        $.each( this.tooltips, function( id, element ) {
14687
                                that._updateContent( element );
14688
                        });
14689
                }
14690
        },
14691
14692
        _disable: function() {
14693
                var that = this;
14694
14695
                // close open tooltips
14696
                $.each( this.tooltips, function( id, element ) {
14697
                        var event = $.Event( "blur" );
14698
                        event.target = event.currentTarget = element[0];
14699
                        that.close( event, true );
14700 85ad3d82 Assos Assos
                });
14701
14702 503b3f7b Assos Assos
                // remove title attributes to prevent native tooltips
14703
                this.element.find( this.options.items ).addBack().each(function() {
14704
                        var element = $( this );
14705
                        if ( element.is( "[title]" ) ) {
14706
                                element
14707
                                        .data( "ui-tooltip-title", element.attr( "title" ) )
14708
                                        .attr( "title", "" );
14709
                        }
14710
                });
14711 85ad3d82 Assos Assos
        },
14712
14713 503b3f7b Assos Assos
        _enable: function() {
14714
                // restore title attributes
14715
                this.element.find( this.options.items ).addBack().each(function() {
14716
                        var element = $( this );
14717
                        if ( element.data( "ui-tooltip-title" ) ) {
14718
                                element.attr( "title", element.data( "ui-tooltip-title" ) );
14719
                        }
14720
                });
14721
        },
14722
14723
        open: function( event ) {
14724
                var that = this,
14725
                        target = $( event ? event.target : this.element )
14726
                                // we need closest here due to mouseover bubbling,
14727
                                // but always pointing at the same event target
14728
                                .closest( this.options.items );
14729 85ad3d82 Assos Assos
14730 503b3f7b Assos Assos
                // No element to show a tooltip for or the tooltip is already open
14731
                if ( !target.length || target.data( "ui-tooltip-id" ) ) {
14732
                        return;
14733
                }
14734 85ad3d82 Assos Assos
14735 503b3f7b Assos Assos
                if ( target.attr( "title" ) ) {
14736
                        target.data( "ui-tooltip-title", target.attr( "title" ) );
14737 85ad3d82 Assos Assos
                }
14738
14739 503b3f7b Assos Assos
                target.data( "ui-tooltip-open", true );
14740
14741
                // kill parent tooltips, custom or native, for hover
14742
                if ( event && event.type === "mouseover" ) {
14743
                        target.parents().each(function() {
14744
                                var parent = $( this ),
14745
                                        blurEvent;
14746
                                if ( parent.data( "ui-tooltip-open" ) ) {
14747
                                        blurEvent = $.Event( "blur" );
14748
                                        blurEvent.target = blurEvent.currentTarget = this;
14749
                                        that.close( blurEvent, true );
14750
                                }
14751
                                if ( parent.attr( "title" ) ) {
14752
                                        parent.uniqueId();
14753
                                        that.parents[ this.id ] = {
14754
                                                element: this,
14755
                                                title: parent.attr( "title" )
14756
                                        };
14757
                                        parent.attr( "title", "" );
14758
                                }
14759
                        });
14760
                }
14761
14762
                this._updateContent( target, event );
14763 85ad3d82 Assos Assos
        },
14764
14765 503b3f7b Assos Assos
        _updateContent: function( target, event ) {
14766
                var content,
14767
                        contentOption = this.options.content,
14768
                        that = this,
14769
                        eventType = event ? event.type : null;
14770
14771
                if ( typeof contentOption === "string" ) {
14772
                        return this._open( event, target, contentOption );
14773
                }
14774
14775
                content = contentOption.call( target[0], function( response ) {
14776
                        // ignore async response if tooltip was closed already
14777
                        if ( !target.data( "ui-tooltip-open" ) ) {
14778
                                return;
14779 85ad3d82 Assos Assos
                        }
14780 503b3f7b Assos Assos
                        // IE may instantly serve a cached response for ajax requests
14781
                        // delay this call to _open so the other call to _open runs first
14782
                        that._delay(function() {
14783
                                // jQuery creates a special event for focusin when it doesn't
14784
                                // exist natively. To improve performance, the native event
14785
                                // object is reused and the type is changed. Therefore, we can't
14786
                                // rely on the type being correct after the event finished
14787
                                // bubbling, so we set it back to the previous value. (#8740)
14788
                                if ( event ) {
14789
                                        event.type = eventType;
14790
                                }
14791
                                this._open( event, target, response );
14792
                        });
14793
                });
14794
                if ( content ) {
14795
                        this._open( event, target, content );
14796 85ad3d82 Assos Assos
                }
14797
        },
14798
14799 503b3f7b Assos Assos
        _open: function( event, target, content ) {
14800
                var tooltip, events, delayedShow,
14801
                        positionOption = $.extend( {}, this.options.position );
14802 85ad3d82 Assos Assos
14803 503b3f7b Assos Assos
                if ( !content ) {
14804 85ad3d82 Assos Assos
                        return;
14805
                }
14806
14807 503b3f7b Assos Assos
                // Content can be updated multiple times. If the tooltip already
14808
                // exists, then just update the content and bail.
14809
                tooltip = this._find( target );
14810
                if ( tooltip.length ) {
14811
                        tooltip.find( ".ui-tooltip-content" ).html( content );
14812
                        return;
14813 85ad3d82 Assos Assos
                }
14814
14815 503b3f7b Assos Assos
                // if we have a title, clear it to prevent the native tooltip
14816
                // we have to check first to avoid defining a title if none exists
14817
                // (we don't want to cause an element to start matching [title])
14818
                //
14819
                // We use removeAttr only for key events, to allow IE to export the correct
14820
                // accessible attributes. For mouse events, set to empty string to avoid
14821
                // native tooltip showing up (happens only when removing inside mouseover).
14822
                if ( target.is( "[title]" ) ) {
14823
                        if ( event && event.type === "mouseover" ) {
14824
                                target.attr( "title", "" );
14825
                        } else {
14826
                                target.removeAttr( "title" );
14827
                        }
14828
                }
14829 85ad3d82 Assos Assos
14830 503b3f7b Assos Assos
                tooltip = this._tooltip( target );
14831
                addDescribedBy( target, tooltip.attr( "id" ) );
14832
                tooltip.find( ".ui-tooltip-content" ).html( content );
14833 85ad3d82 Assos Assos
14834 503b3f7b Assos Assos
                function position( event ) {
14835
                        positionOption.of = event;
14836
                        if ( tooltip.is( ":hidden" ) ) {
14837
                                return;
14838
                        }
14839
                        tooltip.position( positionOption );
14840
                }
14841
                if ( this.options.track && event && /^mouse/.test( event.type ) ) {
14842
                        this._on( this.document, {
14843
                                mousemove: position
14844
                        });
14845
                        // trigger once to override element-relative positioning
14846
                        position( event );
14847
                } else {
14848
                        tooltip.position( $.extend({
14849
                                of: target
14850
                        }, this.options.position ) );
14851
                }
14852
14853
                tooltip.hide();
14854
14855
                this._show( tooltip, this.options.show );
14856
                // Handle tracking tooltips that are shown with a delay (#8644). As soon
14857
                // as the tooltip is visible, position the tooltip using the most recent
14858
                // event.
14859
                if ( this.options.show && this.options.show.delay ) {
14860
                        delayedShow = this.delayedShow = setInterval(function() {
14861
                                if ( tooltip.is( ":visible" ) ) {
14862
                                        position( positionOption.of );
14863
                                        clearInterval( delayedShow );
14864 85ad3d82 Assos Assos
                                }
14865 503b3f7b Assos Assos
                        }, $.fx.interval );
14866
                }
14867 85ad3d82 Assos Assos
14868 503b3f7b Assos Assos
                this._trigger( "open", event, { tooltip: tooltip } );
14869 85ad3d82 Assos Assos
14870 503b3f7b Assos Assos
                events = {
14871
                        keyup: function( event ) {
14872
                                if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
14873
                                        var fakeEvent = $.Event(event);
14874
                                        fakeEvent.currentTarget = target[0];
14875
                                        this.close( fakeEvent, true );
14876 85ad3d82 Assos Assos
                                }
14877 503b3f7b Assos Assos
                        },
14878
                        remove: function() {
14879
                                this._removeTooltip( tooltip );
14880 85ad3d82 Assos Assos
                        }
14881 503b3f7b Assos Assos
                };
14882
                if ( !event || event.type === "mouseover" ) {
14883
                        events.mouseleave = "close";
14884
                }
14885
                if ( !event || event.type === "focusin" ) {
14886
                        events.focusout = "close";
14887
                }
14888
                this._on( true, target, events );
14889
        },
14890 85ad3d82 Assos Assos
14891 503b3f7b Assos Assos
        close: function( event ) {
14892
                var that = this,
14893
                        target = $( event ? event.currentTarget : this.element ),
14894
                        tooltip = this._find( target );
14895 85ad3d82 Assos Assos
14896 503b3f7b Assos Assos
                // disabling closes the tooltip, so we need to track when we're closing
14897
                // to avoid an infinite loop in case the tooltip becomes disabled on close
14898
                if ( this.closing ) {
14899
                        return;
14900
                }
14901 85ad3d82 Assos Assos
14902 503b3f7b Assos Assos
                // Clear the interval for delayed tracking tooltips
14903
                clearInterval( this.delayedShow );
14904 85ad3d82 Assos Assos
14905 503b3f7b Assos Assos
                // only set title if we had one before (see comment in _open())
14906
                if ( target.data( "ui-tooltip-title" ) ) {
14907
                        target.attr( "title", target.data( "ui-tooltip-title" ) );
14908
                }
14909 85ad3d82 Assos Assos
14910 503b3f7b Assos Assos
                removeDescribedBy( target );
14911
14912
                tooltip.stop( true );
14913
                this._hide( tooltip, this.options.hide, function() {
14914
                        that._removeTooltip( $( this ) );
14915
                });
14916
14917
                target.removeData( "ui-tooltip-open" );
14918
                this._off( target, "mouseleave focusout keyup" );
14919
                // Remove 'remove' binding only on delegated targets
14920
                if ( target[0] !== this.element[0] ) {
14921
                        this._off( target, "remove" );
14922 85ad3d82 Assos Assos
                }
14923 503b3f7b Assos Assos
                this._off( this.document, "mousemove" );
14924 85ad3d82 Assos Assos
14925 503b3f7b Assos Assos
                if ( event && event.type === "mouseleave" ) {
14926
                        $.each( this.parents, function( id, parent ) {
14927
                                $( parent.element ).attr( "title", parent.title );
14928
                                delete that.parents[ id ];
14929
                        });
14930
                }
14931
14932
                this.closing = true;
14933
                this._trigger( "close", event, { tooltip: tooltip } );
14934
                this.closing = false;
14935 85ad3d82 Assos Assos
        },
14936
14937 503b3f7b Assos Assos
        _tooltip: function( element ) {
14938
                var id = "ui-tooltip-" + increments++,
14939
                        tooltip = $( "<div>" )
14940
                                .attr({
14941
                                        id: id,
14942
                                        role: "tooltip"
14943
                                })
14944
                                .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
14945
                                        ( this.options.tooltipClass || "" ) );
14946
                $( "<div>" )
14947
                        .addClass( "ui-tooltip-content" )
14948
                        .appendTo( tooltip );
14949
                tooltip.appendTo( this.document[0].body );
14950
                this.tooltips[ id ] = element;
14951
                return tooltip;
14952 85ad3d82 Assos Assos
        },
14953
14954 503b3f7b Assos Assos
        _find: function( target ) {
14955
                var id = target.data( "ui-tooltip-id" );
14956
                return id ? $( "#" + id ) : $();
14957
        },
14958 85ad3d82 Assos Assos
14959 503b3f7b Assos Assos
        _removeTooltip: function( tooltip ) {
14960
                tooltip.remove();
14961
                delete this.tooltips[ tooltip.attr( "id" ) ];
14962
        },
14963 85ad3d82 Assos Assos
14964 503b3f7b Assos Assos
        _destroy: function() {
14965
                var that = this;
14966 85ad3d82 Assos Assos
14967 503b3f7b Assos Assos
                // close open tooltips
14968
                $.each( this.tooltips, function( id, element ) {
14969
                        // Delegate to close method to handle common cleanup
14970
                        var event = $.Event( "blur" );
14971
                        event.target = event.currentTarget = element[0];
14972
                        that.close( event, true );
14973 85ad3d82 Assos Assos
14974 503b3f7b Assos Assos
                        // Remove immediately; destroying an open tooltip doesn't use the
14975
                        // hide animation
14976
                        $( "#" + id ).remove();
14977 85ad3d82 Assos Assos
14978 503b3f7b Assos Assos
                        // Restore the title
14979
                        if ( element.data( "ui-tooltip-title" ) ) {
14980
                                element.attr( "title", element.data( "ui-tooltip-title" ) );
14981
                                element.removeData( "ui-tooltip-title" );
14982 85ad3d82 Assos Assos
                        }
14983 503b3f7b Assos Assos
                });
14984 85ad3d82 Assos Assos
        }
14985
});
14986
14987 503b3f7b Assos Assos
}( jQuery ) );