vendor: 14,990 bytes, lines 1-521
1/*! jQuery UI - v1.11.2 - 2014-10-16 2* http://jqueryui.com 3* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js 4* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ 5 6(function( factory ) { 7 if ( typeof define === "function" && define.amd ) { 8 9 // AMD. Register as an anonymous module. 10 define([ "jquery" ], factory ); 11 } else { 12 13 // Browser globals 14 factory( jQuery ); 15 } 16}(function( $ ) { 17/*! 18 * jQuery UI Core 1.11.2 19 * http://jqueryui.com 20 * 21 * Copyright 2014 jQuery Foundation and other contributors 22 * Released under the MIT license. 23 * http://jquery.org/license 24 * 25 * http://api.jqueryui.com/category/ui-core/ 26 */ 27 28 29// $.ui might exist from components with no dependencies, e.g., $.ui.position 30$.ui = $.ui || {}; 31 32$.extend( $.ui, { 33 version: "1.11.2", 34 35 keyCode: { 36 BACKSPACE: 8, 37 COMMA: 188, 38 DELETE: 46, 39 DOWN: 40, 40 END: 35, 41 ENTER: 13, 42 ESCAPE: 27, 43 HOME: 36, 44 LEFT: 37, 45 PAGE_DOWN: 34, 46 PAGE_UP: 33, 47 PERIOD: 190, 48 RIGHT: 39, 49 SPACE: 32, 50 TAB: 9, 51 UP: 38 52 } 53}); 54 55// plugins 56$.fn.extend({ 57 scrollParent: function( includeHidden ) { 58 var position = this.css( "position" ), 59 excludeStaticParent = position === "absolute", 60 overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, 61 scrollParent = this.parents().filter( function() { 62 var parent = $( this ); 63 if ( excludeStaticParent && parent.css( "position" ) === "static" ) { 64 return false; 65 } 66 return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); 67 }).eq( 0 ); 68 69 return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; 70 }, 71 72 uniqueId: (function() { 73 var uuid = 0; 74 75 return function() { 76 return this.each(function() { 77 if ( !this.id ) { 78 this.id = "ui-id-" + ( ++uuid ); 79 } 80 }); 81 }; 82 })(), 83 84 removeUniqueId: function() { 85 return this.each(function() { 86 if ( /^ui-id-\d+$/.test( this.id ) ) { 87 $( this ).removeAttr( "id" ); 88 } 89 }); 90 } 91}); 92 93// selectors 94function focusable( element, isTabIndexNotNaN ) { 95 var map, mapName, img, 96 nodeName = element.nodeName.toLowerCase(); 97 if ( "area" === nodeName ) { 98 map = element.parentNode; 99 mapName = map.name; 100 if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { 101 return false; 102 } 103 img = $( "img[usemap='#" + mapName + "']" )[ 0 ]; 104 return !!img && visible( img ); 105 } 106 return ( /input|select|textarea|button|object/.test( nodeName ) ? 107 !element.disabled : 108 "a" === nodeName ? 109 element.href || isTabIndexNotNaN : 110 isTabIndexNotNaN) && 111 // the element and all of its ancestors must be visible 112 visible( element ); 113} 114 115function visible( element ) { 116 return $.expr.filters.visible( element ) && 117 !$( element ).parents().addBack().filter(function() { 118 return $.css( this, "visibility" ) === "hidden"; 119 }).length; 120} 121 122$.extend( $.expr[ ":" ], { 123 data: $.expr.createPseudo ? 124 $.expr.createPseudo(function( dataName ) { 125 return function( elem ) { 126 return !!$.data( elem, dataName ); 127 }; 128 }) : 129 // support: jQuery <1.8 130 function( elem, i, match ) { 131 return !!$.data( elem, match[ 3 ] ); 132 }, 133 134 focusable: function( element ) { 135 return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); 136 }, 137 138 tabbable: function( element ) { 139 var tabIndex = $.attr( element, "tabindex" ), 140 isTabIndexNaN = isNaN( tabIndex ); 141 return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); 142 } 143}); 144 145// support: jQuery <1.8 146if ( !$( "<a>" ).outerWidth( 1 ).jquery ) { 147 $.each( [ "Width", "Height" ], function( i, name ) { 148 var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], 149 type = name.toLowerCase(), 150 orig = { 151 innerWidth: $.fn.innerWidth, 152 innerHeight: $.fn.innerHeight, 153 outerWidth: $.fn.outerWidth, 154 outerHeight: $.fn.outerHeight 155 }; 156 157 function reduce( elem, size, border, margin ) { 158 $.each( side, function() { 159 size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; 160 if ( border ) { 161 size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; 162 } 163 if ( margin ) { 164 size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; 165 } 166 }); 167 return size; 168 } 169 170 $.fn[ "inner" + name ] = function( size ) { 171 if ( size === undefined ) { 172 return orig[ "inner" + name ].call( this ); 173 } 174 175 return this.each(function() { 176 $( this ).css( type, reduce( this, size ) + "px" ); 177 }); 178 }; 179 180 $.fn[ "outer" + name] = function( size, margin ) { 181 if ( typeof size !== "number" ) { 182 return orig[ "outer" + name ].call( this, size ); 183 } 184 185 return this.each(function() { 186 $( this).css( type, reduce( this, size, true, margin ) + "px" ); 187 }); 188 }; 189 }); 190} 191 192// support: jQuery <1.8 193if ( !$.fn.addBack ) { 194 $.fn.addBack = function( selector ) { 195 return this.add( selector == null ? 196 this.prevObject : this.prevObject.filter( selector ) 197 ); 198 }; 199} 200 201// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) 202if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { 203 $.fn.removeData = (function( removeData ) { 204 return function( key ) { 205 if ( arguments.length ) { 206 return removeData.call( this, $.camelCase( key ) ); 207 } else { 208 return removeData.call( this ); 209 } 210 }; 211 })( $.fn.removeData ); 212} 213 214// deprecated 215$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); 216 217$.fn.extend({ 218 focus: (function( orig ) { 219 return function( delay, fn ) { 220 return typeof delay === "number" ? 221 this.each(function() { 222 var elem = this; 223 setTimeout(function() { 224 $( elem ).focus(); 225 if ( fn ) { 226 fn.call( elem ); 227 } 228 }, delay ); 229 }) : 230 orig.apply( this, arguments ); 231 }; 232 })( $.fn.focus ), 233 234 disableSelection: (function() { 235 var eventType = "onselectstart" in document.createElement( "div" ) ? 236 "selectstart" : 237 "mousedown"; 238 239 return function() { 240 return this.bind( eventType + ".ui-disableSelection", function( event ) { 241 event.preventDefault(); 242 }); 243 }; 244 })(), 245 246 enableSelection: function() { 247 return this.unbind( ".ui-disableSelection" ); 248 }, 249 250 zIndex: function( zIndex ) { 251 if ( zIndex !== undefined ) { 252 return this.css( "zIndex", zIndex ); 253 } 254 255 if ( this.length ) { 256 var elem = $( this[ 0 ] ), position, value; 257 while ( elem.length && elem[ 0 ] !== document ) { 258 // Ignore z-index if position is set to a value where z-index is ignored by the browser 259 // This makes behavior of this function consistent across browsers 260 // WebKit always returns auto if the element is positioned 261 position = elem.css( "position" ); 262 if ( position === "absolute" || position === "relative" || position === "fixed" ) { 263 // IE returns 0 when zIndex is not specified 264 // other browsers return a string 265 // we ignore the case of nested elements with an explicit value of 0 266 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> 267 value = parseInt( elem.css( "zIndex" ), 10 ); 268 if ( !isNaN( value ) && value !== 0 ) { 269 return value; 270 } 271 } 272 elem = elem.parent(); 273 } 274 } 275 276 return 0; 277 } 278}); 279 280// $.ui.plugin is deprecated. Use $.widget() extensions instead. 281$.ui.plugin = { 282 add: function( module, option, set ) { 283 var i, 284 proto = $.ui[ module ].prototype; 285 for ( i in set ) { 286 proto.plugins[ i ] = proto.plugins[ i ] || []; 287 proto.plugins[ i ].push( [ option, set[ i ] ] ); 288 } 289 }, 290 call: function( instance, name, args, allowDisconnected ) { 291 var i, 292 set = instance.plugins[ name ]; 293 294 if ( !set ) { 295 return; 296 } 297 298 if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { 299 return; 300 } 301 302 for ( i = 0; i < set.length; i++ ) { 303 if ( instance.options[ set[ i ][ 0 ] ] ) { 304 set[ i ][ 1 ].apply( instance.element, args ); 305 } 306 } 307 } 308}; 309 310 311/*! 312 * jQuery UI Widget 1.11.2 313 * http://jqueryui.com 314 * 315 * Copyright 2014 jQuery Foundation and other contributors 316 * Released under the MIT license. 317 * http://jquery.org/license 318 * 319 * http://api.jqueryui.com/jQuery.widget/ 320 */ 321 322 323var widget_uuid = 0, 324 widget_slice = Array.prototype.slice; 325 326$.cleanData = (function( orig ) { 327 return function( elems ) { 328 var events, elem, i; 329 for ( i = 0; (elem = elems[i]) != null; i++ ) { 330 try { 331 332 // Only trigger remove when necessary to save time 333 events = $._data( elem, "events" ); 334 if ( events && events.remove ) { 335 $( elem ).triggerHandler( "remove" ); 336 } 337 338 // http://bugs.jquery.com/ticket/8235 339 } catch ( e ) {} 340 } 341 orig( elems ); 342 }; 343})( $.cleanData ); 344 345$.widget = function( name, base, prototype ) { 346 var fullName, existingConstructor, constructor, basePrototype, 347 // proxiedPrototype allows the provided prototype to remain unmodified 348 // so that it can be used as a mixin for multiple widgets (#8876) 349 proxiedPrototype = {}, 350 namespace = name.split( "." )[ 0 ]; 351 352 name = name.split( "." )[ 1 ]; 353 fullName = namespace + "-" + name; 354 355 if ( !prototype ) { 356 prototype = base; 357 base = $.Widget; 358 } 359 360 // create selector for plugin 361 $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { 362 return !!$.data( elem, fullName ); 363 }; 364 365 $[ namespace ] = $[ namespace ] || {}; 366 existingConstructor = $[ namespace ][ name ]; 367 constructor = $[ namespace ][ name ] = function( options, element ) { 368 // allow instantiation without "new" keyword 369 if ( !this._createWidget ) { 370 return new constructor( options, element ); 371 } 372 373 // allow instantiation without initializing for simple inheritance 374 // must use "new" keyword (the code above always passes args) 375 if ( arguments.length ) { 376 this._createWidget( options, element ); 377 } 378 }; 379 // extend with the existing constructor to carry over any static properties 380 $.extend( constructor, existingConstructor, { 381 version: prototype.version, 382 // copy the object used to create the prototype in case we need to 383 // redefine the widget later 384 _proto: $.extend( {}, prototype ), 385 // track widgets that inherit from this widget in case this widget is 386 // redefined after a widget inherits from it 387 _childConstructors: [] 388 }); 389 390 basePrototype = new base(); 391 // we need to make the options hash a property directly on the new instance 392 // otherwise we'll modify the options hash on the prototype that we're 393 // inheriting from 394 basePrototype.options = $.widget.extend( {}, basePrototype.options ); 395 $.each( prototype, function( prop, value ) { 396 if ( !$.isFunction( value ) ) { 397 proxiedPrototype[ prop ] = value; 398 return; 399 } 400 proxiedPrototype[ prop ] = (function() { 401 var _super = function() { 402 return base.prototype[ prop ].apply( this, arguments ); 403 }, 404 _superApply = function( args ) { 405 return base.prototype[ prop ].apply( this, args ); 406 }; 407 return function() { 408 var __super = this._super, 409 __superApply = this._superApply, 410 returnValue; 411 412 this._super = _super; 413 this._superApply = _superApply; 414 415 returnValue = value.apply( this, arguments ); 416 417 this._super = __super; 418 this._superApply = __superApply; 419 420 return returnValue; 421 }; 422 })(); 423 }); 424 constructor.prototype = $.widget.extend( basePrototype, { 425 // TODO: remove support for widgetEventPrefix 426 // always use the name + a colon as the prefix, e.g., draggable:start 427 // don't prefix for widgets that aren't DOM-based 428 widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name 429 }, proxiedPrototype, { 430 constructor: constructor, 431 namespace: namespace, 432 widgetName: name, 433 widgetFullName: fullName 434 }); 435 436 // If this widget is being redefined then we need to find all widgets that 437 // are inheriting from it and redefine all of them so that they inherit from 438 // the new version of this widget. We're essentially trying to replace one 439 // level in the prototype chain. 440 if ( existingConstructor ) { 441 $.each( existingConstructor._childConstructors, function( i, child ) { 442 var childPrototype = child.prototype; 443 444 // redefine the child widget using the same prototype that was 445 // originally used, but inherit from the new version of the base 446 $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); 447 }); 448 // remove the list of existing child constructors from the old constructor 449 // so the old child constructors can be garbage collected 450 delete existingConstructor._childConstructors; 451 } else { 452 base._childConstructors.push( constructor ); 453 } 454 455 $.widget.bridge( name, constructor ); 456 457 return constructor; 458}; 459 460$.widget.extend = function( target ) { 461 var input = widget_slice.call( arguments, 1 ), 462 inputIndex = 0, 463 inputLength = input.length, 464 key, 465 value; 466 for ( ; inputIndex < inputLength; inputIndex++ ) { 467 for ( key in input[ inputIndex ] ) { 468 value = input[ inputIndex ][ key ]; 469 if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { 470 // Clone objects 471 if ( $.isPlainObject( value ) ) { 472 target[ key ] = $.isPlainObject( target[ key ] ) ? 473 $.widget.extend( {}, target[ key ], value ) : 474 // Don't extend strings, arrays, etc. with objects 475 $.widget.extend( {}, value ); 476 // Copy everything else by reference 477 } else { 478 target[ key ] = value; 479 } 480 } 481 } 482 } 483 return target; 484}; 485 486$.widget.bridge = function( name, object ) { 487 var fullName = object.prototype.widgetFullName || name; 488 $.fn[ name ] = function( options ) { 489 var isMethodCall = typeof options === "string", 490 args = widget_slice.call( arguments, 1 ), 491 returnValue = this; 492 493 // allow multiple hashes to be passed on init 494 options = !isMethodCall && args.length ? 495 $.widget.extend.apply( null, [ options ].concat(args) ) : 496 options; 497 498 if ( isMethodCall ) { 499 this.each(function() { 500 var methodValue, 501 instance = $.data( this, fullName ); 502 if ( options === "instance" ) { 503 returnValue = instance; 504 return false; 505 } 506 if ( !instance ) { 507 return $.error( "cannot call methods on " + name + " prior to initialization; " + 508 "attempted to call method '" + options + "'" ); 509 } 510 if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { 511 return $.error( "no such method '" + options + "' for " + name + " widget instance" ); 512 } 513 methodValue = instance[ options ].apply( instance, args ); 514 if ( methodValue !== instance && methodValue !== undefined ) { 515 returnValue = methodValue && methodValue.jquery ? 516 returnValue.pushStack( methodValue.get() ) : 517 methodValue; 518 return false; 519 } 520 }); 521 } else {
vendor: 8,987 bytes, lines 521-859
521 522 this.each(function() { 523 var instance = $.data( this, fullName ); 524 if ( instance ) { 525 instance.option( options || {} ); 526 if ( instance._init ) { 527 instance._init(); 528 } 529 } else { 530 $.data( this, fullName, new object( options, this ) ); 531 } 532 }); 533 } 534 535 return returnValue; 536 }; 537}; 538 539$.Widget = function( /* options, element */ ) {}; 540$.Widget._childConstructors = []; 541 542$.Widget.prototype = { 543 widgetName: "widget", 544 widgetEventPrefix: "", 545 defaultElement: "<div>", 546 options: { 547 disabled: false, 548 549 // callbacks 550 create: null 551 }, 552 _createWidget: function( options, element ) { 553 element = $( element || this.defaultElement || this )[ 0 ]; 554 this.element = $( element ); 555 this.uuid = widget_uuid++; 556 this.eventNamespace = "." + this.widgetName + this.uuid; 557 558 this.bindings = $(); 559 this.hoverable = $(); 560 this.focusable = $(); 561 562 if ( element !== this ) { 563 $.data( element, this.widgetFullName, this ); 564 this._on( true, this.element, { 565 remove: function( event ) { 566 if ( event.target === element ) { 567 this.destroy(); 568 } 569 } 570 }); 571 this.document = $( element.style ? 572 // element within the document 573 element.ownerDocument : 574 // element is window or document 575 element.document || element ); 576 this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); 577 } 578 579 this.options = $.widget.extend( {}, 580 this.options, 581 this._getCreateOptions(), 582 options ); 583 584 this._create(); 585 this._trigger( "create", null, this._getCreateEventData() ); 586 this._init(); 587 }, 588 _getCreateOptions: $.noop, 589 _getCreateEventData: $.noop, 590 _create: $.noop, 591 _init: $.noop, 592 593 destroy: function() { 594 this._destroy(); 595 // we can probably remove the unbind calls in 2.0 596 // all event bindings should go through this._on() 597 this.element 598 .unbind( this.eventNamespace ) 599 .removeData( this.widgetFullName ) 600 // support: jquery <1.6.3 601 // http://bugs.jquery.com/ticket/9413 602 .removeData( $.camelCase( this.widgetFullName ) ); 603 this.widget() 604 .unbind( this.eventNamespace ) 605 .removeAttr( "aria-disabled" ) 606 .removeClass( 607 this.widgetFullName + "-disabled " + 608 "ui-state-disabled" ); 609 610 // clean up events and states 611 this.bindings.unbind( this.eventNamespace ); 612 this.hoverable.removeClass( "ui-state-hover" ); 613 this.focusable.removeClass( "ui-state-focus" ); 614 }, 615 _destroy: $.noop, 616 617 widget: function() { 618 return this.element; 619 }, 620 621 option: function( key, value ) { 622 var options = key, 623 parts, 624 curOption, 625 i; 626 627 if ( arguments.length === 0 ) { 628 // don't return a reference to the internal hash 629 return $.widget.extend( {}, this.options ); 630 } 631 632 if ( typeof key === "string" ) { 633 // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } 634 options = {}; 635 parts = key.split( "." ); 636 key = parts.shift(); 637 if ( parts.length ) { 638 curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); 639 for ( i = 0; i < parts.length - 1; i++ ) { 640 curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; 641 curOption = curOption[ parts[ i ] ]; 642 } 643 key = parts.pop(); 644 if ( arguments.length === 1 ) { 645 return curOption[ key ] === undefined ? null : curOption[ key ]; 646 } 647 curOption[ key ] = value; 648 } else { 649 if ( arguments.length === 1 ) { 650 return this.options[ key ] === undefined ? null : this.options[ key ]; 651 } 652 options[ key ] = value; 653 } 654 } 655 656 this._setOptions( options ); 657 658 return this; 659 }, 660 _setOptions: function( options ) { 661 var key; 662 663 for ( key in options ) { 664 this._setOption( key, options[ key ] ); 665 } 666 667 return this; 668 }, 669 _setOption: function( key, value ) { 670 this.options[ key ] = value; 671 672 if ( key === "disabled" ) { 673 this.widget() 674 .toggleClass( this.widgetFullName + "-disabled", !!value ); 675 676 // If the widget is becoming disabled, then nothing is interactive 677 if ( value ) { 678 this.hoverable.removeClass( "ui-state-hover" ); 679 this.focusable.removeClass( "ui-state-focus" ); 680 } 681 } 682 683 return this; 684 }, 685 686 enable: function() { 687 return this._setOptions({ disabled: false }); 688 }, 689 disable: function() { 690 return this._setOptions({ disabled: true }); 691 }, 692 693 _on: function( suppressDisabledCheck, element, handlers ) { 694 var delegateElement, 695 instance = this; 696 697 // no suppressDisabledCheck flag, shuffle arguments 698 if ( typeof suppressDisabledCheck !== "boolean" ) { 699 handlers = element; 700 element = suppressDisabledCheck; 701 suppressDisabledCheck = false; 702 } 703 704 // no element argument, shuffle and use this.element 705 if ( !handlers ) { 706 handlers = element; 707 element = this.element; 708 delegateElement = this.widget(); 709 } else { 710 element = delegateElement = $( element ); 711 this.bindings = this.bindings.add( element ); 712 } 713 714 $.each( handlers, function( event, handler ) { 715 function handlerProxy() { 716 // allow widgets to customize the disabled handling 717 // - disabled as an array instead of boolean 718 // - disabled class as method for disabling individual parts 719 if ( !suppressDisabledCheck && 720 ( instance.options.disabled === true || 721 $( this ).hasClass( "ui-state-disabled" ) ) ) { 722 return; 723 } 724 return ( typeof handler === "string" ? instance[ handler ] : handler ) 725 .apply( instance, arguments ); 726 } 727 728 // copy the guid so direct unbinding works 729 if ( typeof handler !== "string" ) { 730 handlerProxy.guid = handler.guid = 731 handler.guid || handlerProxy.guid || $.guid++; 732 } 733 734 var match = event.match( /^([\w:-]*)\s*(.*)$/ ), 735 eventName = match[1] + instance.eventNamespace, 736 selector = match[2]; 737 if ( selector ) { 738 delegateElement.delegate( selector, eventName, handlerProxy ); 739 } else { 740 element.bind( eventName, handlerProxy ); 741 } 742 }); 743 }, 744 745 _off: function( element, eventName ) { 746 eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + 747 this.eventNamespace; 748 element.unbind( eventName ).undelegate( eventName ); 749 750 // Clear the stack to avoid memory leaks (#10056) 751 this.bindings = $( this.bindings.not( element ).get() ); 752 this.focusable = $( this.focusable.not( element ).get() ); 753 this.hoverable = $( this.hoverable.not( element ).get() ); 754 }, 755 756 _delay: function( handler, delay ) { 757 function handlerProxy() { 758 return ( typeof handler === "string" ? instance[ handler ] : handler ) 759 .apply( instance, arguments ); 760 } 761 var instance = this; 762 return setTimeout( handlerProxy, delay || 0 ); 763 }, 764 765 _hoverable: function( element ) { 766 this.hoverable = this.hoverable.add( element ); 767 this._on( element, { 768 mouseenter: function( event ) { 769 $( event.currentTarget ).addClass( "ui-state-hover" ); 770 }, 771 mouseleave: function( event ) { 772 $( event.currentTarget ).removeClass( "ui-state-hover" ); 773 } 774 }); 775 }, 776 777 _focusable: function( element ) { 778 this.focusable = this.focusable.add( element ); 779 this._on( element, { 780 focusin: function( event ) { 781 $( event.currentTarget ).addClass( "ui-state-focus" ); 782 }, 783 focusout: function( event ) { 784 $( event.currentTarget ).removeClass( "ui-state-focus" ); 785 } 786 }); 787 }, 788 789 _trigger: function( type, event, data ) { 790 var prop, orig, 791 callback = this.options[ type ]; 792 793 data = data || {}; 794 event = $.Event( event ); 795 event.type = ( type === this.widgetEventPrefix ? 796 type : 797 this.widgetEventPrefix + type ).toLowerCase(); 798 // the original event may come from any element 799 // so we need to reset the target on the new event 800 event.target = this.element[ 0 ]; 801 802 // copy original event properties over to the new event 803 orig = event.originalEvent; 804 if ( orig ) { 805 for ( prop in orig ) { 806 if ( !( prop in event ) ) { 807 event[ prop ] = orig[ prop ]; 808 } 809 } 810 } 811 812 this.element.trigger( event, data ); 813 return !( $.isFunction( callback ) && 814 callback.apply( this.element[0], [ event ].concat( data ) ) === false || 815 event.isDefaultPrevented() ); 816 } 817}; 818 819$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { 820 $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { 821 if ( typeof options === "string" ) { 822 options = { effect: options }; 823 } 824 var hasOptions, 825 effectName = !options ? 826 method : 827 options === true || typeof options === "number" ? 828 defaultEffect : 829 options.effect || defaultEffect; 830 options = options || {}; 831 if ( typeof options === "number" ) { 832 options = { duration: options }; 833 } 834 hasOptions = !$.isEmptyObject( options ); 835 options.complete = callback; 836 if ( options.delay ) { 837 element.delay( options.delay ); 838 } 839 if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { 840 element[ method ]( options ); 841 } else if ( effectName !== method && element[ effectName ] ) { 842 element[ effectName ]( options.duration, options.easing, callback ); 843 } else { 844 element.queue(function( next ) { 845 $( this )[ method ](); 846 if ( callback ) { 847 callback.call( element[ 0 ] ); 848 } 849 next(); 850 }); 851 } 852 }; 853}); 854 855var widget = $.widget; 856 857 858/*! 859 * jQuery UI Mouse 1.11.
vendor: 4,329 bytes, lines 859-1011
8592 860 * http://jqueryui.com 861 * 862 * Copyright 2014 jQuery Foundation and other contributors 863 * Released under the MIT license. 864 * http://jquery.org/license 865 * 866 * http://api.jqueryui.com/mouse/ 867 */ 868 869 870var mouseHandled = false; 871$( document ).mouseup( function() { 872 mouseHandled = false; 873}); 874 875var mouse = $.widget("ui.mouse", { 876 version: "1.11.2", 877 options: { 878 cancel: "input,textarea,button,select,option", 879 distance: 1, 880 delay: 0 881 }, 882 _mouseInit: function() { 883 var that = this; 884 885 this.element 886 .bind("mousedown." + this.widgetName, function(event) { 887 return that._mouseDown(event); 888 }) 889 .bind("click." + this.widgetName, function(event) { 890 if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { 891 $.removeData(event.target, that.widgetName + ".preventClickEvent"); 892 event.stopImmediatePropagation(); 893 return false; 894 } 895 }); 896 897 this.started = false; 898 }, 899 900 // TODO: make sure destroying one instance of mouse doesn't mess with 901 // other instances of mouse 902 _mouseDestroy: function() { 903 this.element.unbind("." + this.widgetName); 904 if ( this._mouseMoveDelegate ) { 905 this.document 906 .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) 907 .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); 908 } 909 }, 910 911 _mouseDown: function(event) { 912 // don't let more than one widget handle mouseStart 913 if ( mouseHandled ) { 914 return; 915 } 916 917 this._mouseMoved = false; 918 919 // we may have missed mouseup (out of window) 920 (this._mouseStarted && this._mouseUp(event)); 921 922 this._mouseDownEvent = event; 923 924 var that = this, 925 btnIsLeft = (event.which === 1), 926 // event.target.nodeName works around a bug in IE 8 with 927 // disabled inputs (#7620) 928 elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); 929 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { 930 return true; 931 } 932 933 this.mouseDelayMet = !this.options.delay; 934 if (!this.mouseDelayMet) { 935 this._mouseDelayTimer = setTimeout(function() { 936 that.mouseDelayMet = true; 937 }, this.options.delay); 938 } 939 940 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { 941 this._mouseStarted = (this._mouseStart(event) !== false); 942 if (!this._mouseStarted) { 943 event.preventDefault(); 944 return true; 945 } 946 } 947 948 // Click event may never have fired (Gecko & Opera) 949 if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { 950 $.removeData(event.target, this.widgetName + ".preventClickEvent"); 951 } 952 953 // these delegates are required to keep context 954 this._mouseMoveDelegate = function(event) { 955 return that._mouseMove(event); 956 }; 957 this._mouseUpDelegate = function(event) { 958 return that._mouseUp(event); 959 }; 960 961 this.document 962 .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) 963 .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); 964 965 event.preventDefault(); 966 967 mouseHandled = true; 968 return true; 969 }, 970 971 _mouseMove: function(event) { 972 // Only check for mouseups outside the document if you've moved inside the document 973 // at least once. This prevents the firing of mouseup in the case of IE<9, which will 974 // fire a mousemove event if content is placed under the cursor. See #7778 975 // Support: IE <9 976 if ( this._mouseMoved ) { 977 // IE mouseup check - mouseup happened when mouse was out of window 978 if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { 979 return this._mouseUp(event); 980 981 // Iframe mouseup check - mouseup occurred in another document 982 } else if ( !event.which ) { 983 return this._mouseUp( event ); 984 } 985 } 986 987 if ( event.which || event.button ) { 988 this._mouseMoved = true; 989 } 990 991 if (this._mouseStarted) { 992 this._mouseDrag(event); 993 return event.preventDefault(); 994 } 995 996 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { 997 this._mouseStarted = 998 (this._mouseStart(this._mouseDownEvent, event) !== false); 999 (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); 1000 } 1001 1002 return !this._mouseStarted; 1003 }, 1004 1005 _mouseUp: function(event) { 1006 this.document 1007 .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) 1008 .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); 1009 1010 if (this._mouseStarted) { 1011 this._mouseStarted = false;
vendor: 777 bytes, lines 1012-1045
1012 1013 if (event.target === this._mouseDownEvent.target) { 1014 $.data(event.target, this.widgetName + ".preventClickEvent", true); 1015 } 1016 1017 this._mouseStop(event); 1018 } 1019 1020 mouseHandled = false; 1021 return false; 1022 }, 1023 1024 _mouseDistanceMet: function(event) { 1025 return (Math.max( 1026 Math.abs(this._mouseDownEvent.pageX - event.pageX), 1027 Math.abs(this._mouseDownEvent.pageY - event.pageY) 1028 ) >= this.options.distance 1029 ); 1030 }, 1031 1032 _mouseDelayMet: function(/* event */) { 1033 return this.mouseDelayMet; 1034 }, 1035 1036 // These are placeholder methods, to be overriden by extending plugin 1037 _mouseStart: function(/* event */) {}, 1038 _mouseDrag: function(/* event */) {}, 1039 _mouseStop: function(/* event */) {}, 1040 _mouseCapture: function(/* event */) { return true; } 1041}); 1042 1043 1044/*! 1045 * jQuery UI Position 1.11.2
vendor: 16,004 bytes, lines 1045-1552
1045 1046 * http://jqueryui.com 1047 * 1048 * Copyright 2014 jQuery Foundation and other contributors 1049 * Released under the MIT license. 1050 * http://jquery.org/license 1051 * 1052 * http://api.jqueryui.com/position/ 1053 */ 1054 1055(function() { 1056 1057$.ui = $.ui || {}; 1058 1059var cachedScrollbarWidth, supportsOffsetFractions, 1060 max = Math.max, 1061 abs = Math.abs, 1062 round = Math.round, 1063 rhorizontal = /left|center|right/, 1064 rvertical = /top|center|bottom/, 1065 roffset = /[\+\-]\d+(\.[\d]+)?%?/, 1066 rposition = /^\w+/, 1067 rpercent = /%$/, 1068 _position = $.fn.position; 1069 1070function getOffsets( offsets, width, height ) { 1071 return [ 1072 parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), 1073 parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) 1074 ]; 1075} 1076 1077function parseCss( element, property ) { 1078 return parseInt( $.css( element, property ), 10 ) || 0; 1079} 1080 1081function getDimensions( elem ) { 1082 var raw = elem[0]; 1083 if ( raw.nodeType === 9 ) { 1084 return { 1085 width: elem.width(), 1086 height: elem.height(), 1087 offset: { top: 0, left: 0 } 1088 }; 1089 } 1090 if ( $.isWindow( raw ) ) { 1091 return { 1092 width: elem.width(), 1093 height: elem.height(), 1094 offset: { top: elem.scrollTop(), left: elem.scrollLeft() } 1095 }; 1096 } 1097 if ( raw.preventDefault ) { 1098 return { 1099 width: 0, 1100 height: 0, 1101 offset: { top: raw.pageY, left: raw.pageX } 1102 }; 1103 } 1104 return { 1105 width: elem.outerWidth(), 1106 height: elem.outerHeight(), 1107 offset: elem.offset() 1108 }; 1109} 1110 1111$.position = { 1112 scrollbarWidth: function() { 1113 if ( cachedScrollbarWidth !== undefined ) { 1114 return cachedScrollbarWidth; 1115 } 1116 var w1, w2, 1117 div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ), 1118 innerDiv = div.children()[0]; 1119 1120 $( "body" ).append( div ); 1121 w1 = innerDiv.offsetWidth; 1122 div.css( "overflow", "scroll" ); 1123 1124 w2 = innerDiv.offsetWidth; 1125 1126 if ( w1 === w2 ) { 1127 w2 = div[0].clientWidth; 1128 } 1129 1130 div.remove(); 1131 1132 return (cachedScrollbarWidth = w1 - w2); 1133 }, 1134 getScrollInfo: function( within ) { 1135 var overflowX = within.isWindow || within.isDocument ? "" : 1136 within.element.css( "overflow-x" ), 1137 overflowY = within.isWindow || within.isDocument ? "" : 1138 within.element.css( "overflow-y" ), 1139 hasOverflowX = overflowX === "scroll" || 1140 ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), 1141 hasOverflowY = overflowY === "scroll" || 1142 ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); 1143 return { 1144 width: hasOverflowY ? $.position.scrollbarWidth() : 0, 1145 height: hasOverflowX ? $.position.scrollbarWidth() : 0 1146 }; 1147 }, 1148 getWithinInfo: function( element ) { 1149 var withinElement = $( element || window ), 1150 isWindow = $.isWindow( withinElement[0] ), 1151 isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; 1152 return { 1153 element: withinElement, 1154 isWindow: isWindow, 1155 isDocument: isDocument, 1156 offset: withinElement.offset() || { left: 0, top: 0 }, 1157 scrollLeft: withinElement.scrollLeft(), 1158 scrollTop: withinElement.scrollTop(), 1159 1160 // support: jQuery 1.6.x 1161 // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows 1162 width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), 1163 height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() 1164 }; 1165 } 1166}; 1167 1168$.fn.position = function( options ) { 1169 if ( !options || !options.of ) { 1170 return _position.apply( this, arguments ); 1171 } 1172 1173 // make a copy, we don't want to modify arguments 1174 options = $.extend( {}, options ); 1175 1176 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, 1177 target = $( options.of ), 1178 within = $.position.getWithinInfo( options.within ), 1179 scrollInfo = $.position.getScrollInfo( within ), 1180 collision = ( options.collision || "flip" ).split( " " ), 1181 offsets = {}; 1182 1183 dimensions = getDimensions( target ); 1184 if ( target[0].preventDefault ) { 1185 // force left top to allow flipping 1186 options.at = "left top"; 1187 } 1188 targetWidth = dimensions.width; 1189 targetHeight = dimensions.height; 1190 targetOffset = dimensions.offset; 1191 // clone to reuse original targetOffset later 1192 basePosition = $.extend( {}, targetOffset ); 1193 1194 // force my and at to have valid horizontal and vertical positions 1195 // if a value is missing or invalid, it will be converted to center 1196 $.each( [ "my", "at" ], function() { 1197 var pos = ( options[ this ] || "" ).split( " " ), 1198 horizontalOffset, 1199 verticalOffset; 1200 1201 if ( pos.length === 1) { 1202 pos = rhorizontal.test( pos[ 0 ] ) ? 1203 pos.concat( [ "center" ] ) : 1204 rvertical.test( pos[ 0 ] ) ? 1205 [ "center" ].concat( pos ) : 1206 [ "center", "center" ]; 1207 } 1208 pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; 1209 pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; 1210 1211 // calculate offsets 1212 horizontalOffset = roffset.exec( pos[ 0 ] ); 1213 verticalOffset = roffset.exec( pos[ 1 ] ); 1214 offsets[ this ] = [ 1215 horizontalOffset ? horizontalOffset[ 0 ] : 0, 1216 verticalOffset ? verticalOffset[ 0 ] : 0 1217 ]; 1218 1219 // reduce to just the positions without the offsets 1220 options[ this ] = [ 1221 rposition.exec( pos[ 0 ] )[ 0 ], 1222 rposition.exec( pos[ 1 ] )[ 0 ] 1223 ]; 1224 }); 1225 1226 // normalize collision option 1227 if ( collision.length === 1 ) { 1228 collision[ 1 ] = collision[ 0 ]; 1229 } 1230 1231 if ( options.at[ 0 ] === "right" ) { 1232 basePosition.left += targetWidth; 1233 } else if ( options.at[ 0 ] === "center" ) { 1234 basePosition.left += targetWidth / 2; 1235 } 1236 1237 if ( options.at[ 1 ] === "bottom" ) { 1238 basePosition.top += targetHeight; 1239 } else if ( options.at[ 1 ] === "center" ) { 1240 basePosition.top += targetHeight / 2; 1241 } 1242 1243 atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); 1244 basePosition.left += atOffset[ 0 ]; 1245 basePosition.top += atOffset[ 1 ]; 1246 1247 return this.each(function() { 1248 var collisionPosition, using, 1249 elem = $( this ), 1250 elemWidth = elem.outerWidth(), 1251 elemHeight = elem.outerHeight(), 1252 marginLeft = parseCss( this, "marginLeft" ), 1253 marginTop = parseCss( this, "marginTop" ), 1254 collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, 1255 collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, 1256 position = $.extend( {}, basePosition ), 1257 myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); 1258 1259 if ( options.my[ 0 ] === "right" ) { 1260 position.left -= elemWidth; 1261 } else if ( options.my[ 0 ] === "center" ) { 1262 position.left -= elemWidth / 2; 1263 } 1264 1265 if ( options.my[ 1 ] === "bottom" ) { 1266 position.top -= elemHeight; 1267 } else if ( options.my[ 1 ] === "center" ) { 1268 position.top -= elemHeight / 2; 1269 } 1270 1271 position.left += myOffset[ 0 ]; 1272 position.top += myOffset[ 1 ]; 1273 1274 // if the browser doesn't support fractions, then round for consistent results 1275 if ( !supportsOffsetFractions ) { 1276 position.left = round( position.left ); 1277 position.top = round( position.top ); 1278 } 1279 1280 collisionPosition = { 1281 marginLeft: marginLeft, 1282 marginTop: marginTop 1283 }; 1284 1285 $.each( [ "left", "top" ], function( i, dir ) { 1286 if ( $.ui.position[ collision[ i ] ] ) { 1287 $.ui.position[ collision[ i ] ][ dir ]( position, { 1288 targetWidth: targetWidth, 1289 targetHeight: targetHeight, 1290 elemWidth: elemWidth, 1291 elemHeight: elemHeight, 1292 collisionPosition: collisionPosition, 1293 collisionWidth: collisionWidth, 1294 collisionHeight: collisionHeight, 1295 offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], 1296 my: options.my, 1297 at: options.at, 1298 within: within, 1299 elem: elem 1300 }); 1301 } 1302 }); 1303 1304 if ( options.using ) { 1305 // adds feedback as second argument to using callback, if present 1306 using = function( props ) { 1307 var left = targetOffset.left - position.left, 1308 right = left + targetWidth - elemWidth, 1309 top = targetOffset.top - position.top, 1310 bottom = top + targetHeight - elemHeight, 1311 feedback = { 1312 target: { 1313 element: target, 1314 left: targetOffset.left, 1315 top: targetOffset.top, 1316 width: targetWidth, 1317 height: targetHeight 1318 }, 1319 element: { 1320 element: elem, 1321 left: position.left, 1322 top: position.top, 1323 width: elemWidth, 1324 height: elemHeight 1325 }, 1326 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", 1327 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" 1328 }; 1329 if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { 1330 feedback.horizontal = "center"; 1331 } 1332 if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { 1333 feedback.vertical = "middle"; 1334 } 1335 if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { 1336 feedback.important = "horizontal"; 1337 } else { 1338 feedback.important = "vertical"; 1339 } 1340 options.using.call( this, props, feedback ); 1341 }; 1342 } 1343 1344 elem.offset( $.extend( position, { using: using } ) ); 1345 }); 1346}; 1347 1348$.ui.position = { 1349 fit: { 1350 left: function( position, data ) { 1351 var within = data.within, 1352 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, 1353 outerWidth = within.width, 1354 collisionPosLeft = position.left - data.collisionPosition.marginLeft, 1355 overLeft = withinOffset - collisionPosLeft, 1356 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, 1357 newOverRight; 1358 1359 // element is wider than within 1360 if ( data.collisionWidth > outerWidth ) { 1361 // element is initially over the left side of within 1362 if ( overLeft > 0 && overRight <= 0 ) { 1363 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; 1364 position.left += overLeft - newOverRight; 1365 // element is initially over right side of within 1366 } else if ( overRight > 0 && overLeft <= 0 ) { 1367 position.left = withinOffset; 1368 // element is initially over both left and right sides of within 1369 } else { 1370 if ( overLeft > overRight ) { 1371 position.left = withinOffset + outerWidth - data.collisionWidth; 1372 } else { 1373 position.left = withinOffset; 1374 } 1375 } 1376 // too far left -> align with left edge 1377 } else if ( overLeft > 0 ) { 1378 position.left += overLeft; 1379 // too far right -> align with right edge 1380 } else if ( overRight > 0 ) { 1381 position.left -= overRight; 1382 // adjust based on position and margin 1383 } else { 1384 position.left = max( position.left - collisionPosLeft, position.left ); 1385 } 1386 }, 1387 top: function( position, data ) { 1388 var within = data.within, 1389 withinOffset = within.isWindow ? within.scrollTop : within.offset.top, 1390 outerHeight = data.within.height, 1391 collisionPosTop = position.top - data.collisionPosition.marginTop, 1392 overTop = withinOffset - collisionPosTop, 1393 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, 1394 newOverBottom; 1395 1396 // element is taller than within 1397 if ( data.collisionHeight > outerHeight ) { 1398 // element is initially over the top of within 1399 if ( overTop > 0 && overBottom <= 0 ) { 1400 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; 1401 position.top += overTop - newOverBottom; 1402 // element is initially over bottom of within 1403 } else if ( overBottom > 0 && overTop <= 0 ) { 1404 position.top = withinOffset; 1405 // element is initially over both top and bottom of within 1406 } else { 1407 if ( overTop > overBottom ) { 1408 position.top = withinOffset + outerHeight - data.collisionHeight; 1409 } else { 1410 position.top = withinOffset; 1411 } 1412 } 1413 // too far up -> align with top 1414 } else if ( overTop > 0 ) { 1415 position.top += overTop; 1416 // too far down -> align with bottom edge 1417 } else if ( overBottom > 0 ) { 1418 position.top -= overBottom; 1419 // adjust based on position and margin 1420 } else { 1421 position.top = max( position.top - collisionPosTop, position.top ); 1422 } 1423 } 1424 }, 1425 flip: { 1426 left: function( position, data ) { 1427 var within = data.within, 1428 withinOffset = within.offset.left + within.scrollLeft, 1429 outerWidth = within.width, 1430 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, 1431 collisionPosLeft = position.left - data.collisionPosition.marginLeft, 1432 overLeft = collisionPosLeft - offsetLeft, 1433 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, 1434 myOffset = data.my[ 0 ] === "left" ? 1435 -data.elemWidth : 1436 data.my[ 0 ] === "right" ? 1437 data.elemWidth : 1438 0, 1439 atOffset = data.at[ 0 ] === "left" ? 1440 data.targetWidth : 1441 data.at[ 0 ] === "right" ? 1442 -data.targetWidth : 1443 0, 1444 offset = -2 * data.offset[ 0 ], 1445 newOverRight, 1446 newOverLeft; 1447 1448 if ( overLeft < 0 ) { 1449 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; 1450 if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { 1451 position.left += myOffset + atOffset + offset; 1452 } 1453 } else if ( overRight > 0 ) { 1454 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; 1455 if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { 1456 position.left += myOffset + atOffset + offset; 1457 } 1458 } 1459 }, 1460 top: function( position, data ) { 1461 var within = data.within, 1462 withinOffset = within.offset.top + within.scrollTop, 1463 outerHeight = within.height, 1464 offsetTop = within.isWindow ? within.scrollTop : within.offset.top, 1465 collisionPosTop = position.top - data.collisionPosition.marginTop, 1466 overTop = collisionPosTop - offsetTop, 1467 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, 1468 top = data.my[ 1 ] === "top", 1469 myOffset = top ? 1470 -data.elemHeight : 1471 data.my[ 1 ] === "bottom" ? 1472 data.elemHeight : 1473 0, 1474 atOffset = data.at[ 1 ] === "top" ? 1475 data.targetHeight : 1476 data.at[ 1 ] === "bottom" ? 1477 -data.targetHeight : 1478 0, 1479 offset = -2 * data.offset[ 1 ], 1480 newOverTop, 1481 newOverBottom; 1482 if ( overTop < 0 ) { 1483 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; 1484 if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { 1485 position.top += myOffset + atOffset + offset; 1486 } 1487 } else if ( overBottom > 0 ) { 1488 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; 1489 if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { 1490 position.top += myOffset + atOffset + offset; 1491 } 1492 } 1493 } 1494 }, 1495 flipfit: { 1496 left: function() { 1497 $.ui.position.flip.left.apply( this, arguments ); 1498 $.ui.position.fit.left.apply( this, arguments ); 1499 }, 1500 top: function() { 1501 $.ui.position.flip.top.apply( this, arguments ); 1502 $.ui.position.fit.top.apply( this, arguments ); 1503 } 1504 } 1505}; 1506 1507// fraction support test 1508(function() { 1509 var testElement, testElementParent, testElementStyle, offsetLeft, i, 1510 body = document.getElementsByTagName( "body" )[ 0 ], 1511 div = document.createElement( "div" ); 1512 1513 //Create a "fake body" for testing based on method used in jQuery.support 1514 testElement = document.createElement( body ? "div" : "body" ); 1515 testElementStyle = { 1516 visibility: "hidden", 1517 width: 0, 1518 height: 0, 1519 border: 0, 1520 margin: 0, 1521 background: "none" 1522 }; 1523 if ( body ) { 1524 $.extend( testElementStyle, { 1525 position: "absolute", 1526 left: "-1000px", 1527 top: "-1000px" 1528 }); 1529 } 1530 for ( i in testElementStyle ) { 1531 testElement.style[ i ] = testElementStyle[ i ]; 1532 } 1533 testElement.appendChild( div ); 1534 testElementParent = body || document.documentElement; 1535 testElementParent.insertBefore( testElement, testElementParent.firstChild ); 1536 1537 div.style.cssText = "position: absolute; left: 10.7432222px;"; 1538 1539 offsetLeft = $( div ).offset().left; 1540 supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; 1541 1542 testElement.innerHTML = ""; 1543 testElementParent.removeChild( testElement ); 1544})(); 1545 1546})(); 1547 1548var position = $.ui.position; 1549 1550 1551/*! 1552 * jQuery UI Accordion 1.11.
15522 1553 * http://jqueryui.com 1554 * 1555 * Copyright 2014 jQuery Foundation and other contributors 1556 * Released under the MIT license. 1557 * http://jquery.org/license 1558 * 1559 * http://api.jqueryui.com/accordion/ 1560 */ 1561 1562 1563var accordion = $.widget( "ui.accordion", { 1564 version: "1.11.2
vendor: 4,914 bytes, lines 1564-1768
1564", 1565 options: { 1566 active: 0, 1567 animate: {}, 1568 collapsible: false, 1569 event: "click", 1570 header: "> li > :first-child,> :not(li):even", 1571 heightStyle: "auto", 1572 icons: { 1573 activeHeader: "ui-icon-triangle-1-s", 1574 header: "ui-icon-triangle-1-e" 1575 }, 1576 1577 // callbacks 1578 activate: null, 1579 beforeActivate: null 1580 }, 1581 1582 hideProps: { 1583 borderTopWidth: "hide", 1584 borderBottomWidth: "hide", 1585 paddingTop: "hide", 1586 paddingBottom: "hide", 1587 height: "hide" 1588 }, 1589 1590 showProps: { 1591 borderTopWidth: "show", 1592 borderBottomWidth: "show", 1593 paddingTop: "show", 1594 paddingBottom: "show", 1595 height: "show" 1596 }, 1597 1598 _create: function() { 1599 var options = this.options; 1600 this.prevShow = this.prevHide = $(); 1601 this.element.addClass( "ui-accordion ui-widget ui-helper-reset" ) 1602 // ARIA 1603 .attr( "role", "tablist" ); 1604 1605 // don't allow collapsible: false and active: false / null 1606 if ( !options.collapsible && (options.active === false || options.active == null) ) { 1607 options.active = 0; 1608 } 1609 1610 this._processPanels(); 1611 // handle negative values 1612 if ( options.active < 0 ) { 1613 options.active += this.headers.length; 1614 } 1615 this._refresh(); 1616 }, 1617 1618 _getCreateEventData: function() { 1619 return { 1620 header: this.active, 1621 panel: !this.active.length ? $() : this.active.next() 1622 }; 1623 }, 1624 1625 _createIcons: function() { 1626 var icons = this.options.icons; 1627 if ( icons ) { 1628 $( "<span>" ) 1629 .addClass( "ui-accordion-header-icon ui-icon " + icons.header ) 1630 .prependTo( this.headers ); 1631 this.active.children( ".ui-accordion-header-icon" ) 1632 .removeClass( icons.header ) 1633 .addClass( icons.activeHeader ); 1634 this.headers.addClass( "ui-accordion-icons" ); 1635 } 1636 }, 1637 1638 _destroyIcons: function() { 1639 this.headers 1640 .removeClass( "ui-accordion-icons" ) 1641 .children( ".ui-accordion-header-icon" ) 1642 .remove(); 1643 }, 1644 1645 _destroy: function() { 1646 var contents; 1647 1648 // clean up main element 1649 this.element 1650 .removeClass( "ui-accordion ui-widget ui-helper-reset" ) 1651 .removeAttr( "role" ); 1652 1653 // clean up headers 1654 this.headers 1655 .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " + 1656 "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) 1657 .removeAttr( "role" ) 1658 .removeAttr( "aria-expanded" ) 1659 .removeAttr( "aria-selected" ) 1660 .removeAttr( "aria-controls" ) 1661 .removeAttr( "tabIndex" ) 1662 .removeUniqueId(); 1663 1664 this._destroyIcons(); 1665 1666 // clean up content panels 1667 contents = this.headers.next() 1668 .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " + 1669 "ui-accordion-content ui-accordion-content-active ui-state-disabled" ) 1670 .css( "display", "" ) 1671 .removeAttr( "role" ) 1672 .removeAttr( "aria-hidden" ) 1673 .removeAttr( "aria-labelledby" ) 1674 .removeUniqueId(); 1675 1676 if ( this.options.heightStyle !== "content" ) { 1677 contents.css( "height", "" ); 1678 } 1679 }, 1680 1681 _setOption: function( key, value ) { 1682 if ( key === "active" ) { 1683 // _activate() will handle invalid values and update this.options 1684 this._activate( value ); 1685 return; 1686 } 1687 1688 if ( key === "event" ) { 1689 if ( this.options.event ) { 1690 this._off( this.headers, this.options.event ); 1691 } 1692 this._setupEvents( value ); 1693 } 1694 1695 this._super( key, value ); 1696 1697 // setting collapsible: false while collapsed; open first panel 1698 if ( key === "collapsible" && !value && this.options.active === false ) { 1699 this._activate( 0 ); 1700 } 1701 1702 if ( key === "icons" ) { 1703 this._destroyIcons(); 1704 if ( value ) { 1705 this._createIcons(); 1706 } 1707 } 1708 1709 // #5332 - opacity doesn't cascade to positioned elements in IE 1710 // so we need to add the disabled class to the headers and panels 1711 if ( key === "disabled" ) { 1712 this.element 1713 .toggleClass( "ui-state-disabled", !!value ) 1714 .attr( "aria-disabled", value ); 1715 this.headers.add( this.headers.next() ) 1716 .toggleClass( "ui-state-disabled", !!value ); 1717 } 1718 }, 1719 1720 _keydown: function( event ) { 1721 if ( event.altKey || event.ctrlKey ) { 1722 return; 1723 } 1724 1725 var keyCode = $.ui.keyCode, 1726 length = this.headers.length, 1727 currentIndex = this.headers.index( event.target ), 1728 toFocus = false; 1729 1730 switch ( event.keyCode ) { 1731 case keyCode.RIGHT: 1732 case keyCode.DOWN: 1733 toFocus = this.headers[ ( currentIndex + 1 ) % length ]; 1734 break; 1735 case keyCode.LEFT: 1736 case keyCode.UP: 1737 toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; 1738 break; 1739 case keyCode.SPACE: 1740 case keyCode.ENTER: 1741 this._eventHandler( event ); 1742 break; 1743 case keyCode.HOME: 1744 toFocus = this.headers[ 0 ]; 1745 break; 1746 case keyCode.END: 1747 toFocus = this.headers[ length - 1 ]; 1748 break; 1749 } 1750 1751 if ( toFocus ) { 1752 $( event.target ).attr( "tabIndex", -1 ); 1753 $( toFocus ).attr( "tabIndex", 0 ); 1754 toFocus.focus(); 1755 event.preventDefault(); 1756 } 1757 }, 1758 1759 _panelKeyDown: function( event ) { 1760 if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { 1761 $( event.currentTarget ).prev().focus(); 1762 } 1763 }, 1764 1765 refresh: function() { 1766 var options = this.options; 1767 this._processPanels(); 1768
vendor: 4,765 bytes, lines 1769-1949
1769 // was collapsed or no panel 1770 if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) { 1771 options.active = false; 1772 this.active = $(); 1773 // active false only when collapsible is true 1774 } else if ( options.active === false ) { 1775 this._activate( 0 ); 1776 // was active, but active panel is gone 1777 } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { 1778 // all remaining panel are disabled 1779 if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) { 1780 options.active = false; 1781 this.active = $(); 1782 // activate previous panel 1783 } else { 1784 this._activate( Math.max( 0, options.active - 1 ) ); 1785 } 1786 // was active, active panel still exists 1787 } else { 1788 // make sure active index is correct 1789 options.active = this.headers.index( this.active ); 1790 } 1791 1792 this._destroyIcons(); 1793 1794 this._refresh(); 1795 }, 1796 1797 _processPanels: function() { 1798 var prevHeaders = this.headers, 1799 prevPanels = this.panels; 1800 1801 this.headers = this.element.find( this.options.header ) 1802 .addClass( "ui-accordion-header ui-state-default ui-corner-all" ); 1803 1804 this.panels = this.headers.next() 1805 .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ) 1806 .filter( ":not(.ui-accordion-content-active)" ) 1807 .hide(); 1808 1809 // Avoid memory leaks (#10056) 1810 if ( prevPanels ) { 1811 this._off( prevHeaders.not( this.headers ) ); 1812 this._off( prevPanels.not( this.panels ) ); 1813 } 1814 }, 1815 1816 _refresh: function() { 1817 var maxHeight, 1818 options = this.options, 1819 heightStyle = options.heightStyle, 1820 parent = this.element.parent(); 1821 1822 this.active = this._findActive( options.active ) 1823 .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) 1824 .removeClass( "ui-corner-all" ); 1825 this.active.next() 1826 .addClass( "ui-accordion-content-active" ) 1827 .show(); 1828 1829 this.headers 1830 .attr( "role", "tab" ) 1831 .each(function() { 1832 var header = $( this ), 1833 headerId = header.uniqueId().attr( "id" ), 1834 panel = header.next(), 1835 panelId = panel.uniqueId().attr( "id" ); 1836 header.attr( "aria-controls", panelId ); 1837 panel.attr( "aria-labelledby", headerId ); 1838 }) 1839 .next() 1840 .attr( "role", "tabpanel" ); 1841 1842 this.headers 1843 .not( this.active ) 1844 .attr({ 1845 "aria-selected": "false", 1846 "aria-expanded": "false", 1847 tabIndex: -1 1848 }) 1849 .next() 1850 .attr({ 1851 "aria-hidden": "true" 1852 }) 1853 .hide(); 1854 1855 // make sure at least one header is in the tab order 1856 if ( !this.active.length ) { 1857 this.headers.eq( 0 ).attr( "tabIndex", 0 ); 1858 } else { 1859 this.active.attr({ 1860 "aria-selected": "true", 1861 "aria-expanded": "true", 1862 tabIndex: 0 1863 }) 1864 .next() 1865 .attr({ 1866 "aria-hidden": "false" 1867 }); 1868 } 1869 1870 this._createIcons(); 1871 1872 this._setupEvents( options.event ); 1873 1874 if ( heightStyle === "fill" ) { 1875 maxHeight = parent.height(); 1876 this.element.siblings( ":visible" ).each(function() { 1877 var elem = $( this ), 1878 position = elem.css( "position" ); 1879 1880 if ( position === "absolute" || position === "fixed" ) { 1881 return; 1882 } 1883 maxHeight -= elem.outerHeight( true ); 1884 }); 1885 1886 this.headers.each(function() { 1887 maxHeight -= $( this ).outerHeight( true ); 1888 }); 1889 1890 this.headers.next() 1891 .each(function() { 1892 $( this ).height( Math.max( 0, maxHeight - 1893 $( this ).innerHeight() + $( this ).height() ) ); 1894 }) 1895 .css( "overflow", "auto" ); 1896 } else if ( heightStyle === "auto" ) { 1897 maxHeight = 0; 1898 this.headers.next() 1899 .each(function() { 1900 maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); 1901 }) 1902 .height( maxHeight ); 1903 } 1904 }, 1905 1906 _activate: function( index ) { 1907 var active = this._findActive( index )[ 0 ]; 1908 1909 // trying to activate the already active panel 1910 if ( active === this.active[ 0 ] ) { 1911 return; 1912 } 1913 1914 // trying to collapse, simulate a click on the currently active header 1915 active = active || this.active[ 0 ]; 1916 1917 this._eventHandler({ 1918 target: active, 1919 currentTarget: active, 1920 preventDefault: $.noop 1921 }); 1922 }, 1923 1924 _findActive: function( selector ) { 1925 return typeof selector === "number" ? this.headers.eq( selector ) : $(); 1926 }, 1927 1928 _setupEvents: function( event ) { 1929 var events = { 1930 keydown: "_keydown" 1931 }; 1932 if ( event ) { 1933 $.each( event.split( " " ), function( index, eventName ) { 1934 events[ eventName ] = "_eventHandler"; 1935 }); 1936 } 1937 1938 this._off( this.headers.add( this.headers.next() ) ); 1939 this._on( this.headers, events ); 1940 this._on( this.headers.next(), { keydown: "_panelKeyDown" }); 1941 this._hoverable( this.headers ); 1942 this._focusable( this.headers ); 1943 }, 1944 1945 _eventHandler: function( event ) { 1946 var options = this.options, 1947 active = this.active, 1948 clicked = $( event.currentTarget ), 1949 clickedIsActive = clicked[ 0 ] === active[ 0 ],
vendor: 4,681 bytes, lines 1950-2122
1950 collapsing = clickedIsActive && options.collapsible, 1951 toShow = collapsing ? $() : clicked.next(), 1952 toHide = active.next(), 1953 eventData = { 1954 oldHeader: active, 1955 oldPanel: toHide, 1956 newHeader: collapsing ? $() : clicked, 1957 newPanel: toShow 1958 }; 1959 1960 event.preventDefault(); 1961 1962 if ( 1963 // click on active header, but not collapsible 1964 ( clickedIsActive && !options.collapsible ) || 1965 // allow canceling activation 1966 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { 1967 return; 1968 } 1969 1970 options.active = collapsing ? false : this.headers.index( clicked ); 1971 1972 // when the call to ._toggle() comes after the class changes 1973 // it causes a very odd bug in IE 8 (see #6720) 1974 this.active = clickedIsActive ? $() : clicked; 1975 this._toggle( eventData ); 1976 1977 // switch classes 1978 // corner classes on the previously active header stay after the animation 1979 active.removeClass( "ui-accordion-header-active ui-state-active" ); 1980 if ( options.icons ) { 1981 active.children( ".ui-accordion-header-icon" ) 1982 .removeClass( options.icons.activeHeader ) 1983 .addClass( options.icons.header ); 1984 } 1985 1986 if ( !clickedIsActive ) { 1987 clicked 1988 .removeClass( "ui-corner-all" ) 1989 .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ); 1990 if ( options.icons ) { 1991 clicked.children( ".ui-accordion-header-icon" ) 1992 .removeClass( options.icons.header ) 1993 .addClass( options.icons.activeHeader ); 1994 } 1995 1996 clicked 1997 .next() 1998 .addClass( "ui-accordion-content-active" ); 1999 } 2000 }, 2001 2002 _toggle: function( data ) { 2003 var toShow = data.newPanel, 2004 toHide = this.prevShow.length ? this.prevShow : data.oldPanel; 2005 2006 // handle activating a panel during the animation for another activation 2007 this.prevShow.add( this.prevHide ).stop( true, true ); 2008 this.prevShow = toShow; 2009 this.prevHide = toHide; 2010 2011 if ( this.options.animate ) { 2012 this._animate( toShow, toHide, data ); 2013 } else { 2014 toHide.hide(); 2015 toShow.show(); 2016 this._toggleComplete( data ); 2017 } 2018 2019 toHide.attr({ 2020 "aria-hidden": "true" 2021 }); 2022 toHide.prev().attr( "aria-selected", "false" ); 2023 // if we're switching panels, remove the old header from the tab order 2024 // if we're opening from collapsed state, remove the previous header from the tab order 2025 // if we're collapsing, then keep the collapsing header in the tab order 2026 if ( toShow.length && toHide.length ) { 2027 toHide.prev().attr({ 2028 "tabIndex": -1, 2029 "aria-expanded": "false" 2030 }); 2031 } else if ( toShow.length ) { 2032 this.headers.filter(function() { 2033 return $( this ).attr( "tabIndex" ) === 0; 2034 }) 2035 .attr( "tabIndex", -1 ); 2036 } 2037 2038 toShow 2039 .attr( "aria-hidden", "false" ) 2040 .prev() 2041 .attr({ 2042 "aria-selected": "true", 2043 tabIndex: 0, 2044 "aria-expanded": "true" 2045 }); 2046 }, 2047 2048 _animate: function( toShow, toHide, data ) { 2049 var total, easing, duration, 2050 that = this, 2051 adjust = 0, 2052 down = toShow.length && 2053 ( !toHide.length || ( toShow.index() < toHide.index() ) ), 2054 animate = this.options.animate || {}, 2055 options = down && animate.down || animate, 2056 complete = function() { 2057 that._toggleComplete( data ); 2058 }; 2059 2060 if ( typeof options === "number" ) { 2061 duration = options; 2062 } 2063 if ( typeof options === "string" ) { 2064 easing = options; 2065 } 2066 // fall back from options to animation in case of partial down settings 2067 easing = easing || options.easing || animate.easing; 2068 duration = duration || options.duration || animate.duration; 2069 2070 if ( !toHide.length ) { 2071 return toShow.animate( this.showProps, duration, easing, complete ); 2072 } 2073 if ( !toShow.length ) { 2074 return toHide.animate( this.hideProps, duration, easing, complete ); 2075 } 2076 2077 total = toShow.show().outerHeight(); 2078 toHide.animate( this.hideProps, { 2079 duration: duration, 2080 easing: easing, 2081 step: function( now, fx ) { 2082 fx.now = Math.round( now ); 2083 } 2084 }); 2085 toShow 2086 .hide() 2087 .animate( this.showProps, { 2088 duration: duration, 2089 easing: easing, 2090 complete: complete, 2091 step: function( now, fx ) { 2092 fx.now = Math.round( now ); 2093 if ( fx.prop !== "height" ) { 2094 adjust += fx.now; 2095 } else if ( that.options.heightStyle !== "content" ) { 2096 fx.now = Math.round( total - toHide.outerHeight() - adjust ); 2097 adjust = 0; 2098 } 2099 } 2100 }); 2101 }, 2102 2103 _toggleComplete: function( data ) { 2104 var toHide = data.oldPanel; 2105 2106 toHide 2107 .removeClass( "ui-accordion-content-active" ) 2108 .prev() 2109 .removeClass( "ui-corner-top" ) 2110 .addClass( "ui-corner-all" ); 2111 2112 // Work around for rendering bug in IE (#5421) 2113 if ( toHide.length ) { 2114 toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; 2115 } 2116 this._trigger( "activate", null, data ); 2117 } 2118}); 2119 2120 2121/*! 2122 * jQuery UI Menu 1.11.
21222 2123 * http://jqueryui.com 2124 * 2125 * Copyright 2014 jQuery Foundation and other contributors 2126 * Released under the MIT license. 2127 * http://jquery.org/license 2128 * 2129 * http://api.jqueryui.com/menu/ 2130 */ 2131 2132 2133var menu = $.widget( "ui.menu", { 2134 version: "1.11.2
vendor: 7,579 bytes, lines 2134-2415
2134", 2135 defaultElement: "<ul>", 2136 delay: 300, 2137 options: { 2138 icons: { 2139 submenu: "ui-icon-carat-1-e" 2140 }, 2141 items: "> *", 2142 menus: "ul", 2143 position: { 2144 my: "left-1 top", 2145 at: "right top" 2146 }, 2147 role: "menu", 2148 2149 // callbacks 2150 blur: null, 2151 focus: null, 2152 select: null 2153 }, 2154 2155 _create: function() { 2156 this.activeMenu = this.element; 2157 2158 // Flag used to prevent firing of the click handler 2159 // as the event bubbles up through nested menus 2160 this.mouseHandled = false; 2161 this.element 2162 .uniqueId() 2163 .addClass( "ui-menu ui-widget ui-widget-content" ) 2164 .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ) 2165 .attr({ 2166 role: this.options.role, 2167 tabIndex: 0 2168 }); 2169 2170 if ( this.options.disabled ) { 2171 this.element 2172 .addClass( "ui-state-disabled" ) 2173 .attr( "aria-disabled", "true" ); 2174 } 2175 2176 this._on({ 2177 // Prevent focus from sticking to links inside menu after clicking 2178 // them (focus should always stay on UL during navigation). 2179 "mousedown .ui-menu-item": function( event ) { 2180 event.preventDefault(); 2181 }, 2182 "click .ui-menu-item": function( event ) { 2183 var target = $( event.target ); 2184 if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { 2185 this.select( event ); 2186 2187 // Only set the mouseHandled flag if the event will bubble, see #9469. 2188 if ( !event.isPropagationStopped() ) { 2189 this.mouseHandled = true; 2190 } 2191 2192 // Open submenu on click 2193 if ( target.has( ".ui-menu" ).length ) { 2194 this.expand( event ); 2195 } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) { 2196 2197 // Redirect focus to the menu 2198 this.element.trigger( "focus", [ true ] ); 2199 2200 // If the active item is on the top level, let it stay active. 2201 // Otherwise, blur the active item since it is no longer visible. 2202 if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) { 2203 clearTimeout( this.timer ); 2204 } 2205 } 2206 } 2207 }, 2208 "mouseenter .ui-menu-item": function( event ) { 2209 // Ignore mouse events while typeahead is active, see #10458. 2210 // Prevents focusing the wrong item when typeahead causes a scroll while the mouse 2211 // is over an item in the menu 2212 if ( this.previousFilter ) { 2213 return; 2214 } 2215 var target = $( event.currentTarget ); 2216 // Remove ui-state-active class from siblings of the newly focused menu item 2217 // to avoid a jump caused by adjacent elements both having a class with a border 2218 target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" ); 2219 this.focus( event, target ); 2220 }, 2221 mouseleave: "collapseAll", 2222 "mouseleave .ui-menu": "collapseAll", 2223 focus: function( event, keepActiveItem ) { 2224 // If there's already an active item, keep it active 2225 // If not, activate the first item 2226 var item = this.active || this.element.find( this.options.items ).eq( 0 ); 2227 2228 if ( !keepActiveItem ) { 2229 this.focus( event, item ); 2230 } 2231 }, 2232 blur: function( event ) { 2233 this._delay(function() { 2234 if ( !$.contains( this.element[0], this.document[0].activeElement ) ) { 2235 this.collapseAll( event ); 2236 } 2237 }); 2238 }, 2239 keydown: "_keydown" 2240 }); 2241 2242 this.refresh(); 2243 2244 // Clicks outside of a menu collapse any open menus 2245 this._on( this.document, { 2246 click: function( event ) { 2247 if ( this._closeOnDocumentClick( event ) ) { 2248 this.collapseAll( event ); 2249 } 2250 2251 // Reset the mouseHandled flag 2252 this.mouseHandled = false; 2253 } 2254 }); 2255 }, 2256 2257 _destroy: function() { 2258 // Destroy (sub)menus 2259 this.element 2260 .removeAttr( "aria-activedescendant" ) 2261 .find( ".ui-menu" ).addBack() 2262 .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" ) 2263 .removeAttr( "role" ) 2264 .removeAttr( "tabIndex" ) 2265 .removeAttr( "aria-labelledby" ) 2266 .removeAttr( "aria-expanded" ) 2267 .removeAttr( "aria-hidden" ) 2268 .removeAttr( "aria-disabled" ) 2269 .removeUniqueId() 2270 .show(); 2271 2272 // Destroy menu items 2273 this.element.find( ".ui-menu-item" ) 2274 .removeClass( "ui-menu-item" ) 2275 .removeAttr( "role" ) 2276 .removeAttr( "aria-disabled" ) 2277 .removeUniqueId() 2278 .removeClass( "ui-state-hover" ) 2279 .removeAttr( "tabIndex" ) 2280 .removeAttr( "role" ) 2281 .removeAttr( "aria-haspopup" ) 2282 .children().each( function() { 2283 var elem = $( this ); 2284 if ( elem.data( "ui-menu-submenu-carat" ) ) { 2285 elem.remove(); 2286 } 2287 }); 2288 2289 // Destroy menu dividers 2290 this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" ); 2291 }, 2292 2293 _keydown: function( event ) { 2294 var match, prev, character, skip, 2295 preventDefault = true; 2296 2297 switch ( event.keyCode ) { 2298 case $.ui.keyCode.PAGE_UP: 2299 this.previousPage( event ); 2300 break; 2301 case $.ui.keyCode.PAGE_DOWN: 2302 this.nextPage( event ); 2303 break; 2304 case $.ui.keyCode.HOME: 2305 this._move( "first", "first", event ); 2306 break; 2307 case $.ui.keyCode.END: 2308 this._move( "last", "last", event ); 2309 break; 2310 case $.ui.keyCode.UP: 2311 this.previous( event ); 2312 break; 2313 case $.ui.keyCode.DOWN: 2314 this.next( event ); 2315 break; 2316 case $.ui.keyCode.LEFT: 2317 this.collapse( event ); 2318 break; 2319 case $.ui.keyCode.RIGHT: 2320 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { 2321 this.expand( event ); 2322 } 2323 break; 2324 case $.ui.keyCode.ENTER: 2325 case $.ui.keyCode.SPACE: 2326 this._activate( event ); 2327 break; 2328 case $.ui.keyCode.ESCAPE: 2329 this.collapse( event ); 2330 break; 2331 default: 2332 preventDefault = false; 2333 prev = this.previousFilter || ""; 2334 character = String.fromCharCode( event.keyCode ); 2335 skip = false; 2336 2337 clearTimeout( this.filterTimer ); 2338 2339 if ( character === prev ) { 2340 skip = true; 2341 } else { 2342 character = prev + character; 2343 } 2344 2345 match = this._filterMenuItems( character ); 2346 match = skip && match.index( this.active.next() ) !== -1 ? 2347 this.active.nextAll( ".ui-menu-item" ) : 2348 match; 2349 2350 // If no matches on the current filter, reset to the last character pressed 2351 // to move down the menu to the first item that starts with that character 2352 if ( !match.length ) { 2353 character = String.fromCharCode( event.keyCode ); 2354 match = this._filterMenuItems( character ); 2355 } 2356 2357 if ( match.length ) { 2358 this.focus( event, match ); 2359 this.previousFilter = character; 2360 this.filterTimer = this._delay(function() { 2361 delete this.previousFilter; 2362 }, 1000 ); 2363 } else { 2364 delete this.previousFilter; 2365 } 2366 } 2367 2368 if ( preventDefault ) { 2369 event.preventDefault(); 2370 } 2371 }, 2372 2373 _activate: function( event ) { 2374 if ( !this.active.is( ".ui-state-disabled" ) ) { 2375 if ( this.active.is( "[aria-haspopup='true']" ) ) { 2376 this.expand( event ); 2377 } else { 2378 this.select( event ); 2379 } 2380 } 2381 }, 2382 2383 refresh: function() { 2384 var menus, items, 2385 that = this, 2386 icon = this.options.icons.submenu, 2387 submenus = this.element.find( this.options.menus ); 2388 2389 this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ); 2390 2391 // Initialize nested menus 2392 submenus.filter( ":not(.ui-menu)" ) 2393 .addClass( "ui-menu ui-widget ui-widget-content ui-front" ) 2394 .hide() 2395 .attr({ 2396 role: this.options.role, 2397 "aria-hidden": "true", 2398 "aria-expanded": "false" 2399 }) 2400 .each(function() { 2401 var menu = $( this ), 2402 item = menu.parent(), 2403 submenuCarat = $( "<span>" ) 2404 .addClass( "ui-menu-icon ui-icon " + icon ) 2405 .data( "ui-menu-submenu-carat", true ); 2406 2407 item 2408 .attr( "aria-haspopup", "true" ) 2409 .prepend( submenuCarat ); 2410 menu.attr( "aria-labelledby", item.attr( "id" ) ); 2411 }); 2412 2413 menus = submenus.add( this.element ); 2414 items = menus.find( this.options.items ); 2415
vendor: 4,109 bytes, lines 2416-2567
2416 // Initialize menu-items containing spaces and/or dashes only as dividers 2417 items.not( ".ui-menu-item" ).each(function() { 2418 var item = $( this ); 2419 if ( that._isDivider( item ) ) { 2420 item.addClass( "ui-widget-content ui-menu-divider" ); 2421 } 2422 }); 2423 2424 // Don't refresh list items that are already adapted 2425 items.not( ".ui-menu-item, .ui-menu-divider" ) 2426 .addClass( "ui-menu-item" ) 2427 .uniqueId() 2428 .attr({ 2429 tabIndex: -1, 2430 role: this._itemRole() 2431 }); 2432 2433 // Add aria-disabled attribute to any disabled menu item 2434 items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); 2435 2436 // If the active item has been removed, blur the menu 2437 if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { 2438 this.blur(); 2439 } 2440 }, 2441 2442 _itemRole: function() { 2443 return { 2444 menu: "menuitem", 2445 listbox: "option" 2446 }[ this.options.role ]; 2447 }, 2448 2449 _setOption: function( key, value ) { 2450 if ( key === "icons" ) { 2451 this.element.find( ".ui-menu-icon" ) 2452 .removeClass( this.options.icons.submenu ) 2453 .addClass( value.submenu ); 2454 } 2455 if ( key === "disabled" ) { 2456 this.element 2457 .toggleClass( "ui-state-disabled", !!value ) 2458 .attr( "aria-disabled", value ); 2459 } 2460 this._super( key, value ); 2461 }, 2462 2463 focus: function( event, item ) { 2464 var nested, focused; 2465 this.blur( event, event && event.type === "focus" ); 2466 2467 this._scrollIntoView( item ); 2468 2469 this.active = item.first(); 2470 focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" ); 2471 // Only update aria-activedescendant if there's a role 2472 // otherwise we assume focus is managed elsewhere 2473 if ( this.options.role ) { 2474 this.element.attr( "aria-activedescendant", focused.attr( "id" ) ); 2475 } 2476 2477 // Highlight active parent menu item, if any 2478 this.active 2479 .parent() 2480 .closest( ".ui-menu-item" ) 2481 .addClass( "ui-state-active" ); 2482 2483 if ( event && event.type === "keydown" ) { 2484 this._close(); 2485 } else { 2486 this.timer = this._delay(function() { 2487 this._close(); 2488 }, this.delay ); 2489 } 2490 2491 nested = item.children( ".ui-menu" ); 2492 if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) { 2493 this._startOpening(nested); 2494 } 2495 this.activeMenu = item.parent(); 2496 2497 this._trigger( "focus", event, { item: item } ); 2498 }, 2499 2500 _scrollIntoView: function( item ) { 2501 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; 2502 if ( this._hasScroll() ) { 2503 borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; 2504 paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0; 2505 offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; 2506 scroll = this.activeMenu.scrollTop(); 2507 elementHeight = this.activeMenu.height(); 2508 itemHeight = item.outerHeight(); 2509 2510 if ( offset < 0 ) { 2511 this.activeMenu.scrollTop( scroll + offset ); 2512 } else if ( offset + itemHeight > elementHeight ) { 2513 this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); 2514 } 2515 } 2516 }, 2517 2518 blur: function( event, fromFocus ) { 2519 if ( !fromFocus ) { 2520 clearTimeout( this.timer ); 2521 } 2522 2523 if ( !this.active ) { 2524 return; 2525 } 2526 2527 this.active.removeClass( "ui-state-focus" ); 2528 this.active = null; 2529 2530 this._trigger( "blur", event, { item: this.active } ); 2531 }, 2532 2533 _startOpening: function( submenu ) { 2534 clearTimeout( this.timer ); 2535 2536 // Don't open if already open fixes a Firefox bug that caused a .5 pixel 2537 // shift in the submenu position when mousing over the carat icon 2538 if ( submenu.attr( "aria-hidden" ) !== "true" ) { 2539 return; 2540 } 2541 2542 this.timer = this._delay(function() { 2543 this._close(); 2544 this._open( submenu ); 2545 }, this.delay ); 2546 }, 2547 2548 _open: function( submenu ) { 2549 var position = $.extend({ 2550 of: this.active 2551 }, this.options.position ); 2552 2553 clearTimeout( this.timer ); 2554 this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) ) 2555 .hide() 2556 .attr( "aria-hidden", "true" ); 2557 2558 submenu 2559 .show() 2560 .removeAttr( "aria-hidden" ) 2561 .attr( "aria-expanded", "true" ) 2562 .position( position ); 2563 }, 2564 2565 collapseAll: function( event, all ) { 2566 clearTimeout( this.timer ); 2567 this.timer = this._delay(function() {
vendor: 4,784 bytes, lines 2568-2753
2568 // If we were passed an event, look for the submenu that contains the event 2569 var currentMenu = all ? this.element : 2570 $( event && event.target ).closest( this.element.find( ".ui-menu" ) ); 2571 2572 // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway 2573 if ( !currentMenu.length ) { 2574 currentMenu = this.element; 2575 } 2576 2577 this._close( currentMenu ); 2578 2579 this.blur( event ); 2580 this.activeMenu = currentMenu; 2581 }, this.delay ); 2582 }, 2583 2584 // With no arguments, closes the currently active menu - if nothing is active 2585 // it closes all menus. If passed an argument, it will search for menus BELOW 2586 _close: function( startMenu ) { 2587 if ( !startMenu ) { 2588 startMenu = this.active ? this.active.parent() : this.element; 2589 } 2590 2591 startMenu 2592 .find( ".ui-menu" ) 2593 .hide() 2594 .attr( "aria-hidden", "true" ) 2595 .attr( "aria-expanded", "false" ) 2596 .end() 2597 .find( ".ui-state-active" ).not( ".ui-state-focus" ) 2598 .removeClass( "ui-state-active" ); 2599 }, 2600 2601 _closeOnDocumentClick: function( event ) { 2602 return !$( event.target ).closest( ".ui-menu" ).length; 2603 }, 2604 2605 _isDivider: function( item ) { 2606 2607 // Match hyphen, em dash, en dash 2608 return !/[^\-\u2014\u2013\s]/.test( item.text() ); 2609 }, 2610 2611 collapse: function( event ) { 2612 var newItem = this.active && 2613 this.active.parent().closest( ".ui-menu-item", this.element ); 2614 if ( newItem && newItem.length ) { 2615 this._close(); 2616 this.focus( event, newItem ); 2617 } 2618 }, 2619 2620 expand: function( event ) { 2621 var newItem = this.active && 2622 this.active 2623 .children( ".ui-menu " ) 2624 .find( this.options.items ) 2625 .first(); 2626 2627 if ( newItem && newItem.length ) { 2628 this._open( newItem.parent() ); 2629 2630 // Delay so Firefox will not hide activedescendant change in expanding submenu from AT 2631 this._delay(function() { 2632 this.focus( event, newItem ); 2633 }); 2634 } 2635 }, 2636 2637 next: function( event ) { 2638 this._move( "next", "first", event ); 2639 }, 2640 2641 previous: function( event ) { 2642 this._move( "prev", "last", event ); 2643 }, 2644 2645 isFirstItem: function() { 2646 return this.active && !this.active.prevAll( ".ui-menu-item" ).length; 2647 }, 2648 2649 isLastItem: function() { 2650 return this.active && !this.active.nextAll( ".ui-menu-item" ).length; 2651 }, 2652 2653 _move: function( direction, filter, event ) { 2654 var next; 2655 if ( this.active ) { 2656 if ( direction === "first" || direction === "last" ) { 2657 next = this.active 2658 [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ) 2659 .eq( -1 ); 2660 } else { 2661 next = this.active 2662 [ direction + "All" ]( ".ui-menu-item" ) 2663 .eq( 0 ); 2664 } 2665 } 2666 if ( !next || !next.length || !this.active ) { 2667 next = this.activeMenu.find( this.options.items )[ filter ](); 2668 } 2669 2670 this.focus( event, next ); 2671 }, 2672 2673 nextPage: function( event ) { 2674 var item, base, height; 2675 2676 if ( !this.active ) { 2677 this.next( event ); 2678 return; 2679 } 2680 if ( this.isLastItem() ) { 2681 return; 2682 } 2683 if ( this._hasScroll() ) { 2684 base = this.active.offset().top; 2685 height = this.element.height(); 2686 this.active.nextAll( ".ui-menu-item" ).each(function() { 2687 item = $( this ); 2688 return item.offset().top - base - height < 0; 2689 }); 2690 2691 this.focus( event, item ); 2692 } else { 2693 this.focus( event, this.activeMenu.find( this.options.items ) 2694 [ !this.active ? "first" : "last" ]() ); 2695 } 2696 }, 2697 2698 previousPage: function( event ) { 2699 var item, base, height; 2700 if ( !this.active ) { 2701 this.next( event ); 2702 return; 2703 } 2704 if ( this.isFirstItem() ) { 2705 return; 2706 } 2707 if ( this._hasScroll() ) { 2708 base = this.active.offset().top; 2709 height = this.element.height(); 2710 this.active.prevAll( ".ui-menu-item" ).each(function() { 2711 item = $( this ); 2712 return item.offset().top - base + height > 0; 2713 }); 2714 2715 this.focus( event, item ); 2716 } else { 2717 this.focus( event, this.activeMenu.find( this.options.items ).first() ); 2718 } 2719 }, 2720 2721 _hasScroll: function() { 2722 return this.element.outerHeight() < this.element.prop( "scrollHeight" ); 2723 }, 2724 2725 select: function( event ) { 2726 // TODO: It should never be possible to not have an active item at this 2727 // point, but the tests don't trigger mouseenter before click. 2728 this.active = this.active || $( event.target ).closest( ".ui-menu-item" ); 2729 var ui = { item: this.active }; 2730 if ( !this.active.has( ".ui-menu" ).length ) { 2731 this.collapseAll( event, true ); 2732 } 2733 this._trigger( "select", event, ui ); 2734 }, 2735 2736 _filterMenuItems: function(character) { 2737 var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ), 2738 regex = new RegExp( "^" + escapedCharacter, "i" ); 2739 2740 return this.activeMenu 2741 .find( this.options.items ) 2742 2743 // Only match on items, not dividers or other content (#10571) 2744 .filter( ".ui-menu-item" ) 2745 .filter(function() { 2746 return regex.test( $.trim( $( this ).text() ) ); 2747 }); 2748 } 2749}); 2750 2751 2752/*! 2753 * jQuery UI Autocomplete 1.11.
27532 2754 * http://jqueryui.com 2755 * 2756 * Copyright 2014 jQuery Foundation and other contributors 2757 * Released under the MIT license. 2758 * http://jquery.org/license 2759 * 2760 * http://api.jqueryui.com/autocomplete/ 2761 */ 2762 2763 2764$.widget( "ui.autocomplete", { 2765 version: "1.11.2
vendor: 6,110 bytes, lines 2765-2984
2765", 2766 defaultElement: "<input>", 2767 options: { 2768 appendTo: null, 2769 autoFocus: false, 2770 delay: 300, 2771 minLength: 1, 2772 position: { 2773 my: "left top", 2774 at: "left bottom", 2775 collision: "none" 2776 }, 2777 source: null, 2778 2779 // callbacks 2780 change: null, 2781 close: null, 2782 focus: null, 2783 open: null, 2784 response: null, 2785 search: null, 2786 select: null 2787 }, 2788 2789 requestIndex: 0, 2790 pending: 0, 2791 2792 _create: function() { 2793 // Some browsers only repeat keydown events, not keypress events, 2794 // so we use the suppressKeyPress flag to determine if we've already 2795 // handled the keydown event. #7269 2796 // Unfortunately the code for & in keypress is the same as the up arrow, 2797 // so we use the suppressKeyPressRepeat flag to avoid handling keypress 2798 // events when we know the keydown event was used to modify the 2799 // search term. #7799 2800 var suppressKeyPress, suppressKeyPressRepeat, suppressInput, 2801 nodeName = this.element[ 0 ].nodeName.toLowerCase(), 2802 isTextarea = nodeName === "textarea", 2803 isInput = nodeName === "input"; 2804 2805 this.isMultiLine = 2806 // Textareas are always multi-line 2807 isTextarea ? true : 2808 // Inputs are always single-line, even if inside a contentEditable element 2809 // IE also treats inputs as contentEditable 2810 isInput ? false : 2811 // All other element types are determined by whether or not they're contentEditable 2812 this.element.prop( "isContentEditable" ); 2813 2814 this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; 2815 this.isNewMenu = true; 2816 2817 this.element 2818 .addClass( "ui-autocomplete-input" ) 2819 .attr( "autocomplete", "off" ); 2820 2821 this._on( this.element, { 2822 keydown: function( event ) { 2823 if ( this.element.prop( "readOnly" ) ) { 2824 suppressKeyPress = true; 2825 suppressInput = true; 2826 suppressKeyPressRepeat = true; 2827 return; 2828 } 2829 2830 suppressKeyPress = false; 2831 suppressInput = false; 2832 suppressKeyPressRepeat = false; 2833 var keyCode = $.ui.keyCode; 2834 switch ( event.keyCode ) { 2835 case keyCode.PAGE_UP: 2836 suppressKeyPress = true; 2837 this._move( "previousPage", event ); 2838 break; 2839 case keyCode.PAGE_DOWN: 2840 suppressKeyPress = true; 2841 this._move( "nextPage", event ); 2842 break; 2843 case keyCode.UP: 2844 suppressKeyPress = true; 2845 this._keyEvent( "previous", event ); 2846 break; 2847 case keyCode.DOWN: 2848 suppressKeyPress = true; 2849 this._keyEvent( "next", event ); 2850 break; 2851 case keyCode.ENTER: 2852 // when menu is open and has focus 2853 if ( this.menu.active ) { 2854 // #6055 - Opera still allows the keypress to occur 2855 // which causes forms to submit 2856 suppressKeyPress = true; 2857 event.preventDefault(); 2858 this.menu.select( event ); 2859 } 2860 break; 2861 case keyCode.TAB: 2862 if ( this.menu.active ) { 2863 this.menu.select( event ); 2864 } 2865 break; 2866 case keyCode.ESCAPE: 2867 if ( this.menu.element.is( ":visible" ) ) { 2868 if ( !this.isMultiLine ) { 2869 this._value( this.term ); 2870 } 2871 this.close( event ); 2872 // Different browsers have different default behavior for escape 2873 // Single press can mean undo or clear 2874 // Double press in IE means clear the whole form 2875 event.preventDefault(); 2876 } 2877 break; 2878 default: 2879 suppressKeyPressRepeat = true; 2880 // search timeout should be triggered before the input value is changed 2881 this._searchTimeout( event ); 2882 break; 2883 } 2884 }, 2885 keypress: function( event ) { 2886 if ( suppressKeyPress ) { 2887 suppressKeyPress = false; 2888 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { 2889 event.preventDefault(); 2890 } 2891 return; 2892 } 2893 if ( suppressKeyPressRepeat ) { 2894 return; 2895 } 2896 2897 // replicate some key handlers to allow them to repeat in Firefox and Opera 2898 var keyCode = $.ui.keyCode; 2899 switch ( event.keyCode ) { 2900 case keyCode.PAGE_UP: 2901 this._move( "previousPage", event ); 2902 break; 2903 case keyCode.PAGE_DOWN: 2904 this._move( "nextPage", event ); 2905 break; 2906 case keyCode.UP: 2907 this._keyEvent( "previous", event ); 2908 break; 2909 case keyCode.DOWN: 2910 this._keyEvent( "next", event ); 2911 break; 2912 } 2913 }, 2914 input: function( event ) { 2915 if ( suppressInput ) { 2916 suppressInput = false; 2917 event.preventDefault(); 2918 return; 2919 } 2920 this._searchTimeout( event ); 2921 }, 2922 focus: function() { 2923 this.selectedItem = null; 2924 this.previous = this._value(); 2925 }, 2926 blur: function( event ) { 2927 if ( this.cancelBlur ) { 2928 delete this.cancelBlur; 2929 return; 2930 } 2931 2932 clearTimeout( this.searching ); 2933 this.close( event ); 2934 this._change( event ); 2935 } 2936 }); 2937 2938 this._initSource(); 2939 this.menu = $( "<ul>" ) 2940 .addClass( "ui-autocomplete ui-front" ) 2941 .appendTo( this._appendTo() ) 2942 .menu({ 2943 // disable ARIA support, the live region takes care of that 2944 role: null 2945 }) 2946 .hide() 2947 .menu( "instance" ); 2948 2949 this._on( this.menu.element, { 2950 mousedown: function( event ) { 2951 // prevent moving focus out of the text field 2952 event.preventDefault(); 2953 2954 // IE doesn't prevent moving focus even with event.preventDefault() 2955 // so we set a flag to know when we should ignore the blur event 2956 this.cancelBlur = true; 2957 this._delay(function() { 2958 delete this.cancelBlur; 2959 }); 2960 2961 // clicking on the scrollbar causes focus to shift to the body 2962 // but we can't detect a mouseup or a click immediately afterward 2963 // so we have to track the next mousedown and close the menu if 2964 // the user clicks somewhere outside of the autocomplete 2965 var menuElement = this.menu.element[ 0 ]; 2966 if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { 2967 this._delay(function() { 2968 var that = this; 2969 this.document.one( "mousedown", function( event ) { 2970 if ( event.target !== that.element[ 0 ] && 2971 event.target !== menuElement && 2972 !$.contains( menuElement, event.target ) ) { 2973 that.close(); 2974 } 2975 }); 2976 }); 2977 } 2978 }, 2979 menufocus: function( event, ui ) { 2980 var label, item; 2981 // support: Firefox 2982 // Prevent accidental activation of menu items in Firefox (#7024 #9118) 2983 if ( this.isNewMenu ) { 2984 this.isNewMenu = false;
vendor: 9,744 bytes, lines 2985-3365
2985 if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { 2986 this.menu.blur(); 2987 2988 this.document.one( "mousemove", function() { 2989 $( event.target ).trigger( event.originalEvent ); 2990 }); 2991 2992 return; 2993 } 2994 } 2995 2996 item = ui.item.data( "ui-autocomplete-item" ); 2997 if ( false !== this._trigger( "focus", event, { item: item } ) ) { 2998 // use value to match what will end up in the input, if it was a key event 2999 if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { 3000 this._value( item.value ); 3001 } 3002 } 3003 3004 // Announce the value in the liveRegion 3005 label = ui.item.attr( "aria-label" ) || item.value; 3006 if ( label && $.trim( label ).length ) { 3007 this.liveRegion.children().hide(); 3008 $( "<div>" ).text( label ).appendTo( this.liveRegion ); 3009 } 3010 }, 3011 menuselect: function( event, ui ) { 3012 var item = ui.item.data( "ui-autocomplete-item" ), 3013 previous = this.previous; 3014 3015 // only trigger when focus was lost (click on menu) 3016 if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) { 3017 this.element.focus(); 3018 this.previous = previous; 3019 // #6109 - IE triggers two focus events and the second 3020 // is asynchronous, so we need to reset the previous 3021 // term synchronously and asynchronously :-( 3022 this._delay(function() { 3023 this.previous = previous; 3024 this.selectedItem = item; 3025 }); 3026 } 3027 3028 if ( false !== this._trigger( "select", event, { item: item } ) ) { 3029 this._value( item.value ); 3030 } 3031 // reset the term after the select event 3032 // this allows custom select handling to work properly 3033 this.term = this._value(); 3034 3035 this.close( event ); 3036 this.selectedItem = item; 3037 } 3038 }); 3039 3040 this.liveRegion = $( "<span>", { 3041 role: "status", 3042 "aria-live": "assertive", 3043 "aria-relevant": "additions" 3044 }) 3045 .addClass( "ui-helper-hidden-accessible" ) 3046 .appendTo( this.document[ 0 ].body ); 3047 3048 // turning off autocomplete prevents the browser from remembering the 3049 // value when navigating through history, so we re-enable autocomplete 3050 // if the page is unloaded before the widget is destroyed. #7790 3051 this._on( this.window, { 3052 beforeunload: function() { 3053 this.element.removeAttr( "autocomplete" ); 3054 } 3055 }); 3056 }, 3057 3058 _destroy: function() { 3059 clearTimeout( this.searching ); 3060 this.element 3061 .removeClass( "ui-autocomplete-input" ) 3062 .removeAttr( "autocomplete" ); 3063 this.menu.element.remove(); 3064 this.liveRegion.remove(); 3065 }, 3066 3067 _setOption: function( key, value ) { 3068 this._super( key, value ); 3069 if ( key === "source" ) { 3070 this._initSource(); 3071 } 3072 if ( key === "appendTo" ) { 3073 this.menu.element.appendTo( this._appendTo() ); 3074 } 3075 if ( key === "disabled" && value && this.xhr ) { 3076 this.xhr.abort(); 3077 } 3078 }, 3079 3080 _appendTo: function() { 3081 var element = this.options.appendTo; 3082 3083 if ( element ) { 3084 element = element.jquery || element.nodeType ? 3085 $( element ) : 3086 this.document.find( element ).eq( 0 ); 3087 } 3088 3089 if ( !element || !element[ 0 ] ) { 3090 element = this.element.closest( ".ui-front" ); 3091 } 3092 3093 if ( !element.length ) { 3094 element = this.document[ 0 ].body; 3095 } 3096 3097 return element; 3098 }, 3099 3100 _initSource: function() { 3101 var array, url, 3102 that = this; 3103 if ( $.isArray( this.options.source ) ) { 3104 array = this.options.source; 3105 this.source = function( request, response ) { 3106 response( $.ui.autocomplete.filter( array, request.term ) ); 3107 }; 3108 } else if ( typeof this.options.source === "string" ) { 3109 url = this.options.source; 3110 this.source = function( request, response ) { 3111 if ( that.xhr ) { 3112 that.xhr.abort(); 3113 } 3114 that.xhr = $.ajax({ 3115 url: url, 3116 data: request, 3117 dataType: "json", 3118 success: function( data ) { 3119 response( data ); 3120 }, 3121 error: function() { 3122 response([]); 3123 } 3124 }); 3125 }; 3126 } else { 3127 this.source = this.options.source; 3128 } 3129 }, 3130 3131 _searchTimeout: function( event ) { 3132 clearTimeout( this.searching ); 3133 this.searching = this._delay(function() { 3134 3135 // Search if the value has changed, or if the user retypes the same value (see #7434) 3136 var equalValues = this.term === this._value(), 3137 menuVisible = this.menu.element.is( ":visible" ), 3138 modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; 3139 3140 if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) { 3141 this.selectedItem = null; 3142 this.search( null, event ); 3143 } 3144 }, this.options.delay ); 3145 }, 3146 3147 search: function( value, event ) { 3148 value = value != null ? value : this._value(); 3149 3150 // always save the actual value, not the one passed as an argument 3151 this.term = this._value(); 3152 3153 if ( value.length < this.options.minLength ) { 3154 return this.close( event ); 3155 } 3156 3157 if ( this._trigger( "search", event ) === false ) { 3158 return; 3159 } 3160 3161 return this._search( value ); 3162 }, 3163 3164 _search: function( value ) { 3165 this.pending++; 3166 this.element.addClass( "ui-autocomplete-loading" ); 3167 this.cancelSearch = false; 3168 3169 this.source( { term: value }, this._response() ); 3170 }, 3171 3172 _response: function() { 3173 var index = ++this.requestIndex; 3174 3175 return $.proxy(function( content ) { 3176 if ( index === this.requestIndex ) { 3177 this.__response( content ); 3178 } 3179 3180 this.pending--; 3181 if ( !this.pending ) { 3182 this.element.removeClass( "ui-autocomplete-loading" ); 3183 } 3184 }, this ); 3185 }, 3186 3187 __response: function( content ) { 3188 if ( content ) { 3189 content = this._normalize( content ); 3190 } 3191 this._trigger( "response", null, { content: content } ); 3192 if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { 3193 this._suggest( content ); 3194 this._trigger( "open" ); 3195 } else { 3196 // use ._close() instead of .close() so we don't cancel future searches 3197 this._close(); 3198 } 3199 }, 3200 3201 close: function( event ) { 3202 this.cancelSearch = true; 3203 this._close( event ); 3204 }, 3205 3206 _close: function( event ) { 3207 if ( this.menu.element.is( ":visible" ) ) { 3208 this.menu.element.hide(); 3209 this.menu.blur(); 3210 this.isNewMenu = true; 3211 this._trigger( "close", event ); 3212 } 3213 }, 3214 3215 _change: function( event ) { 3216 if ( this.previous !== this._value() ) { 3217 this._trigger( "change", event, { item: this.selectedItem } ); 3218 } 3219 }, 3220 3221 _normalize: function( items ) { 3222 // assume all items have the right format when the first item is complete 3223 if ( items.length && items[ 0 ].label && items[ 0 ].value ) { 3224 return items; 3225 } 3226 return $.map( items, function( item ) { 3227 if ( typeof item === "string" ) { 3228 return { 3229 label: item, 3230 value: item 3231 }; 3232 } 3233 return $.extend( {}, item, { 3234 label: item.label || item.value, 3235 value: item.value || item.label 3236 }); 3237 }); 3238 }, 3239 3240 _suggest: function( items ) { 3241 var ul = this.menu.element.empty(); 3242 this._renderMenu( ul, items ); 3243 this.isNewMenu = true; 3244 this.menu.refresh(); 3245 3246 // size and position menu 3247 ul.show(); 3248 this._resizeMenu(); 3249 ul.position( $.extend({ 3250 of: this.element 3251 }, this.options.position ) ); 3252 3253 if ( this.options.autoFocus ) { 3254 this.menu.next(); 3255 } 3256 }, 3257 3258 _resizeMenu: function() { 3259 var ul = this.menu.element; 3260 ul.outerWidth( Math.max( 3261 // Firefox wraps long text (possibly a rounding bug) 3262 // so we add 1px to avoid the wrapping (#7513) 3263 ul.width( "" ).outerWidth() + 1, 3264 this.element.outerWidth() 3265 ) ); 3266 }, 3267 3268 _renderMenu: function( ul, items ) { 3269 var that = this; 3270 $.each( items, function( index, item ) { 3271 that._renderItemData( ul, item ); 3272 }); 3273 }, 3274 3275 _renderItemData: function( ul, item ) { 3276 return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); 3277 }, 3278 3279 _renderItem: function( ul, item ) { 3280 return $( "<li>" ).text( item.label ).appendTo( ul ); 3281 }, 3282 3283 _move: function( direction, event ) { 3284 if ( !this.menu.element.is( ":visible" ) ) { 3285 this.search( null, event ); 3286 return; 3287 } 3288 if ( this.menu.isFirstItem() && /^previous/.test( direction ) || 3289 this.menu.isLastItem() && /^next/.test( direction ) ) { 3290 3291 if ( !this.isMultiLine ) { 3292 this._value( this.term ); 3293 } 3294 3295 this.menu.blur(); 3296 return; 3297 } 3298 this.menu[ direction ]( event ); 3299 }, 3300 3301 widget: function() { 3302 return this.menu.element; 3303 }, 3304 3305 _value: function() { 3306 return this.valueMethod.apply( this.element, arguments ); 3307 }, 3308 3309 _keyEvent: function( keyEvent, event ) { 3310 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { 3311 this._move( keyEvent, event ); 3312 3313 // prevents moving cursor to beginning/end of the text field in some browsers 3314 event.preventDefault(); 3315 } 3316 } 3317}); 3318 3319$.extend( $.ui.autocomplete, { 3320 escapeRegex: function( value ) { 3321 return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); 3322 }, 3323 filter: function( array, term ) { 3324 var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" ); 3325 return $.grep( array, function( value ) { 3326 return matcher.test( value.label || value.value || value ); 3327 }); 3328 } 3329}); 3330 3331// live region extension, adding a `messages` option 3332// NOTE: This is an experimental API. We are still investigating 3333// a full solution for string manipulation and internationalization. 3334$.widget( "ui.autocomplete", $.ui.autocomplete, { 3335 options: { 3336 messages: { 3337 noResults: "No search results.", 3338 results: function( amount ) { 3339 return amount + ( amount > 1 ? " results are" : " result is" ) + 3340 " available, use up and down arrow keys to navigate."; 3341 } 3342 } 3343 }, 3344 3345 __response: function( content ) { 3346 var message; 3347 this._superApply( arguments ); 3348 if ( this.options.disabled || this.cancelSearch ) { 3349 return; 3350 } 3351 if ( content && content.length ) { 3352 message = this.options.messages.results( content.length ); 3353 } else { 3354 message = this.options.messages.noResults; 3355 } 3356 this.liveRegion.children().hide(); 3357 $( "<div>" ).text( message ).appendTo( this.liveRegion ); 3358 } 3359}); 3360 3361var autocomplete = $.ui.autocomplete; 3362 3363 3364/*! 3365 * jQuery UI Button 1.11.
vendor: 1,047 bytes, lines 3365-3404
33652 3366 * http://jqueryui.com 3367 * 3368 * Copyright 2014 jQuery Foundation and other contributors 3369 * Released under the MIT license. 3370 * http://jquery.org/license 3371 * 3372 * http://api.jqueryui.com/button/ 3373 */ 3374 3375 3376var lastActive, 3377 baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", 3378 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", 3379 formResetHandler = function() { 3380 var form = $( this ); 3381 setTimeout(function() { 3382 form.find( ":ui-button" ).button( "refresh" ); 3383 }, 1 ); 3384 }, 3385 radioGroup = function( radio ) { 3386 var name = radio.name, 3387 form = radio.form, 3388 radios = $( [] ); 3389 if ( name ) { 3390 name = name.replace( /'/g, "\\'" ); 3391 if ( form ) { 3392 radios = $( form ).find( "[name='" + name + "'][type=radio]" ); 3393 } else { 3394 radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument ) 3395 .filter(function() { 3396 return !this.form; 3397 }); 3398 } 3399 } 3400 return radios; 3401 }; 3402 3403$.widget( "ui.button", { 3404 version: "1.11.2
vendor: 8,577 bytes, lines 3404-3700
3404", 3405 defaultElement: "<button>", 3406 options: { 3407 disabled: null, 3408 text: true, 3409 label: null, 3410 icons: { 3411 primary: null, 3412 secondary: null 3413 } 3414 }, 3415 _create: function() { 3416 this.element.closest( "form" ) 3417 .unbind( "reset" + this.eventNamespace ) 3418 .bind( "reset" + this.eventNamespace, formResetHandler ); 3419 3420 if ( typeof this.options.disabled !== "boolean" ) { 3421 this.options.disabled = !!this.element.prop( "disabled" ); 3422 } else { 3423 this.element.prop( "disabled", this.options.disabled ); 3424 } 3425 3426 this._determineButtonType(); 3427 this.hasTitle = !!this.buttonElement.attr( "title" ); 3428 3429 var that = this, 3430 options = this.options, 3431 toggleButton = this.type === "checkbox" || this.type === "radio", 3432 activeClass = !toggleButton ? "ui-state-active" : ""; 3433 3434 if ( options.label === null ) { 3435 options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html()); 3436 } 3437 3438 this._hoverable( this.buttonElement ); 3439 3440 this.buttonElement 3441 .addClass( baseClasses ) 3442 .attr( "role", "button" ) 3443 .bind( "mouseenter" + this.eventNamespace, function() { 3444 if ( options.disabled ) { 3445 return; 3446 } 3447 if ( this === lastActive ) { 3448 $( this ).addClass( "ui-state-active" ); 3449 } 3450 }) 3451 .bind( "mouseleave" + this.eventNamespace, function() { 3452 if ( options.disabled ) { 3453 return; 3454 } 3455 $( this ).removeClass( activeClass ); 3456 }) 3457 .bind( "click" + this.eventNamespace, function( event ) { 3458 if ( options.disabled ) { 3459 event.preventDefault(); 3460 event.stopImmediatePropagation(); 3461 } 3462 }); 3463 3464 // Can't use _focusable() because the element that receives focus 3465 // and the element that gets the ui-state-focus class are different 3466 this._on({ 3467 focus: function() { 3468 this.buttonElement.addClass( "ui-state-focus" ); 3469 }, 3470 blur: function() { 3471 this.buttonElement.removeClass( "ui-state-focus" ); 3472 } 3473 }); 3474 3475 if ( toggleButton ) { 3476 this.element.bind( "change" + this.eventNamespace, function() { 3477 that.refresh(); 3478 }); 3479 } 3480 3481 if ( this.type === "checkbox" ) { 3482 this.buttonElement.bind( "click" + this.eventNamespace, function() { 3483 if ( options.disabled ) { 3484 return false; 3485 } 3486 }); 3487 } else if ( this.type === "radio" ) { 3488 this.buttonElement.bind( "click" + this.eventNamespace, function() { 3489 if ( options.disabled ) { 3490 return false; 3491 } 3492 $( this ).addClass( "ui-state-active" ); 3493 that.buttonElement.attr( "aria-pressed", "true" ); 3494 3495 var radio = that.element[ 0 ]; 3496 radioGroup( radio ) 3497 .not( radio ) 3498 .map(function() { 3499 return $( this ).button( "widget" )[ 0 ]; 3500 }) 3501 .removeClass( "ui-state-active" ) 3502 .attr( "aria-pressed", "false" ); 3503 }); 3504 } else { 3505 this.buttonElement 3506 .bind( "mousedown" + this.eventNamespace, function() { 3507 if ( options.disabled ) { 3508 return false; 3509 } 3510 $( this ).addClass( "ui-state-active" ); 3511 lastActive = this; 3512 that.document.one( "mouseup", function() { 3513 lastActive = null; 3514 }); 3515 }) 3516 .bind( "mouseup" + this.eventNamespace, function() { 3517 if ( options.disabled ) { 3518 return false; 3519 } 3520 $( this ).removeClass( "ui-state-active" ); 3521 }) 3522 .bind( "keydown" + this.eventNamespace, function(event) { 3523 if ( options.disabled ) { 3524 return false; 3525 } 3526 if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) { 3527 $( this ).addClass( "ui-state-active" ); 3528 } 3529 }) 3530 // see #8559, we bind to blur here in case the button element loses 3531 // focus between keydown and keyup, it would be left in an "active" state 3532 .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() { 3533 $( this ).removeClass( "ui-state-active" ); 3534 }); 3535 3536 if ( this.buttonElement.is("a") ) { 3537 this.buttonElement.keyup(function(event) { 3538 if ( event.keyCode === $.ui.keyCode.SPACE ) { 3539 // TODO pass through original event correctly (just as 2nd argument doesn't work) 3540 $( this ).click(); 3541 } 3542 }); 3543 } 3544 } 3545 3546 this._setOption( "disabled", options.disabled ); 3547 this._resetButton(); 3548 }, 3549 3550 _determineButtonType: function() { 3551 var ancestor, labelSelector, checked; 3552 3553 if ( this.element.is("[type=checkbox]") ) { 3554 this.type = "checkbox"; 3555 } else if ( this.element.is("[type=radio]") ) { 3556 this.type = "radio"; 3557 } else if ( this.element.is("input") ) { 3558 this.type = "input"; 3559 } else { 3560 this.type = "button"; 3561 } 3562 3563 if ( this.type === "checkbox" || this.type === "radio" ) { 3564 // we don't search against the document in case the element 3565 // is disconnected from the DOM 3566 ancestor = this.element.parents().last(); 3567 labelSelector = "label[for='" + this.element.attr("id") + "']"; 3568 this.buttonElement = ancestor.find( labelSelector ); 3569 if ( !this.buttonElement.length ) { 3570 ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings(); 3571 this.buttonElement = ancestor.filter( labelSelector ); 3572 if ( !this.buttonElement.length ) { 3573 this.buttonElement = ancestor.find( labelSelector ); 3574 } 3575 } 3576 this.element.addClass( "ui-helper-hidden-accessible" ); 3577 3578 checked = this.element.is( ":checked" ); 3579 if ( checked ) { 3580 this.buttonElement.addClass( "ui-state-active" ); 3581 } 3582 this.buttonElement.prop( "aria-pressed", checked ); 3583 } else { 3584 this.buttonElement = this.element; 3585 } 3586 }, 3587 3588 widget: function() { 3589 return this.buttonElement; 3590 }, 3591 3592 _destroy: function() { 3593 this.element 3594 .removeClass( "ui-helper-hidden-accessible" ); 3595 this.buttonElement 3596 .removeClass( baseClasses + " ui-state-active " + typeClasses ) 3597 .removeAttr( "role" ) 3598 .removeAttr( "aria-pressed" ) 3599 .html( this.buttonElement.find(".ui-button-text").html() ); 3600 3601 if ( !this.hasTitle ) { 3602 this.buttonElement.removeAttr( "title" ); 3603 } 3604 }, 3605 3606 _setOption: function( key, value ) { 3607 this._super( key, value ); 3608 if ( key === "disabled" ) { 3609 this.widget().toggleClass( "ui-state-disabled", !!value ); 3610 this.element.prop( "disabled", !!value ); 3611 if ( value ) { 3612 if ( this.type === "checkbox" || this.type === "radio" ) { 3613 this.buttonElement.removeClass( "ui-state-focus" ); 3614 } else { 3615 this.buttonElement.removeClass( "ui-state-focus ui-state-active" ); 3616 } 3617 } 3618 return; 3619 } 3620 this._resetButton(); 3621 }, 3622 3623 refresh: function() { 3624 //See #8237 & #8828 3625 var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" ); 3626 3627 if ( isDisabled !== this.options.disabled ) { 3628 this._setOption( "disabled", isDisabled ); 3629 } 3630 if ( this.type === "radio" ) { 3631 radioGroup( this.element[0] ).each(function() { 3632 if ( $( this ).is( ":checked" ) ) { 3633 $( this ).button( "widget" ) 3634 .addClass( "ui-state-active" ) 3635 .attr( "aria-pressed", "true" ); 3636 } else { 3637 $( this ).button( "widget" ) 3638 .removeClass( "ui-state-active" ) 3639 .attr( "aria-pressed", "false" ); 3640 } 3641 }); 3642 } else if ( this.type === "checkbox" ) { 3643 if ( this.element.is( ":checked" ) ) { 3644 this.buttonElement 3645 .addClass( "ui-state-active" ) 3646 .attr( "aria-pressed", "true" ); 3647 } else { 3648 this.buttonElement 3649 .removeClass( "ui-state-active" ) 3650 .attr( "aria-pressed", "false" ); 3651 } 3652 } 3653 }, 3654 3655 _resetButton: function() { 3656 if ( this.type === "input" ) { 3657 if ( this.options.label ) { 3658 this.element.val( this.options.label ); 3659 } 3660 return; 3661 } 3662 var buttonElement = this.buttonElement.removeClass( typeClasses ), 3663 buttonText = $( "<span></span>", this.document[0] ) 3664 .addClass( "ui-button-text" ) 3665 .html( this.options.label ) 3666 .appendTo( buttonElement.empty() ) 3667 .text(), 3668 icons = this.options.icons, 3669 multipleIcons = icons.primary && icons.secondary, 3670 buttonClasses = []; 3671 3672 if ( icons.primary || icons.secondary ) { 3673 if ( this.options.text ) { 3674 buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) ); 3675 } 3676 3677 if ( icons.primary ) { 3678 buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" ); 3679 } 3680 3681 if ( icons.secondary ) { 3682 buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" ); 3683 } 3684 3685 if ( !this.options.text ) { 3686 buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" ); 3687 3688 if ( !this.hasTitle ) { 3689 buttonElement.attr( "title", $.trim( buttonText ) ); 3690 } 3691 } 3692 } else { 3693 buttonClasses.push( "ui-button-text-only" ); 3694 } 3695 buttonElement.addClass( buttonClasses.join( " " ) ); 3696 } 3697}); 3698 3699$.widget( "ui.buttonset", { 3700 version: "1.11.
vendor: 1,700 bytes, lines 3700-3773
37002", 3701 options: { 3702 items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)" 3703 }, 3704 3705 _create: function() { 3706 this.element.addClass( "ui-buttonset" ); 3707 }, 3708 3709 _init: function() { 3710 this.refresh(); 3711 }, 3712 3713 _setOption: function( key, value ) { 3714 if ( key === "disabled" ) { 3715 this.buttons.button( "option", key, value ); 3716 } 3717 3718 this._super( key, value ); 3719 }, 3720 3721 refresh: function() { 3722 var rtl = this.element.css( "direction" ) === "rtl", 3723 allButtons = this.element.find( this.options.items ), 3724 existingButtons = allButtons.filter( ":ui-button" ); 3725 3726 // Initialize new buttons 3727 allButtons.not( ":ui-button" ).button(); 3728 3729 // Refresh existing buttons 3730 existingButtons.button( "refresh" ); 3731 3732 this.buttons = allButtons 3733 .map(function() { 3734 return $( this ).button( "widget" )[ 0 ]; 3735 }) 3736 .removeClass( "ui-corner-all ui-corner-left ui-corner-right" ) 3737 .filter( ":first" ) 3738 .addClass( rtl ? "ui-corner-right" : "ui-corner-left" ) 3739 .end() 3740 .filter( ":last" ) 3741 .addClass( rtl ? "ui-corner-left" : "ui-corner-right" ) 3742 .end() 3743 .end(); 3744 }, 3745 3746 _destroy: function() { 3747 this.element.removeClass( "ui-buttonset" ); 3748 this.buttons 3749 .map(function() { 3750 return $( this ).button( "widget" )[ 0 ]; 3751 }) 3752 .removeClass( "ui-corner-left ui-corner-right" ) 3753 .end() 3754 .button( "destroy" ); 3755 } 3756}); 3757 3758var button = $.ui.button; 3759 3760 3761/*! 3762 * jQuery UI Datepicker 1.11.2 3763 * http://jqueryui.com 3764 * 3765 * Copyright 2014 jQuery Foundation and other contributors 3766 * Released under the MIT license. 3767 * http://jquery.org/license 3768 * 3769 * http://api.jqueryui.com/datepicker/ 3770 */ 3771 3772 3773$.extend($.ui, { datepicker: { version: "1.11.2
vendor: 16,250 bytes, lines 3773-4128
3773" } }); 3774 3775var datepicker_instActive; 3776 3777function datepicker_getZindex( elem ) { 3778 var position, value; 3779 while ( elem.length && elem[ 0 ] !== document ) { 3780 // Ignore z-index if position is set to a value where z-index is ignored by the browser 3781 // This makes behavior of this function consistent across browsers 3782 // WebKit always returns auto if the element is positioned 3783 position = elem.css( "position" ); 3784 if ( position === "absolute" || position === "relative" || position === "fixed" ) { 3785 // IE returns 0 when zIndex is not specified 3786 // other browsers return a string 3787 // we ignore the case of nested elements with an explicit value of 0 3788 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> 3789 value = parseInt( elem.css( "zIndex" ), 10 ); 3790 if ( !isNaN( value ) && value !== 0 ) { 3791 return value; 3792 } 3793 } 3794 elem = elem.parent(); 3795 } 3796 3797 return 0; 3798} 3799/* Date picker manager. 3800 Use the singleton instance of this class, $.datepicker, to interact with the date picker. 3801 Settings for (groups of) date pickers are maintained in an instance object, 3802 allowing multiple different settings on the same page. */ 3803 3804function Datepicker() { 3805 this._curInst = null; // The current instance in use 3806 this._keyEvent = false; // If the last event was a key event 3807 this._disabledInputs = []; // List of date picker inputs that have been disabled 3808 this._datepickerShowing = false; // True if the popup picker is showing , false if not 3809 this._inDialog = false; // True if showing within a "dialog", false if not 3810 this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division 3811 this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class 3812 this._appendClass = "ui-datepicker-append"; // The name of the append marker class 3813 this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class 3814 this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class 3815 this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class 3816 this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class 3817 this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class 3818 this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class 3819 this.regional = []; // Available regional settings, indexed by language code 3820 this.regional[""] = { // Default regional settings 3821 closeText: "Done", // Display text for close link 3822 prevText: "Prev", // Display text for previous month link 3823 nextText: "Next", // Display text for next month link 3824 currentText: "Today", // Display text for current month link 3825 monthNames: ["January","February","March","April","May","June", 3826 "July","August","September","October","November","December"], // Names of months for drop-down and formatting 3827 monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting 3828 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting 3829 dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting 3830 dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday 3831 weekHeader: "Wk", // Column header for week of the year 3832 dateFormat: "mm/dd/yy", // See format options on parseDate 3833 firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... 3834 isRTL: false, // True if right-to-left language, false if left-to-right 3835 showMonthAfterYear: false, // True if the year select precedes month, false for month then year 3836 yearSuffix: "" // Additional text to append to the year in the month headers 3837 }; 3838 this._defaults = { // Global defaults for all the date picker instances 3839 showOn: "focus", // "focus" for popup on focus, 3840 // "button" for trigger button, or "both" for either 3841 showAnim: "fadeIn", // Name of jQuery animation for popup 3842 showOptions: {}, // Options for enhanced animations 3843 defaultDate: null, // Used when field is blank: actual date, 3844 // +/-number for offset from today, null for today 3845 appendText: "", // Display text following the input box, e.g. showing the format 3846 buttonText: "...", // Text for trigger button 3847 buttonImage: "", // URL for trigger button image 3848 buttonImageOnly: false, // True if the image appears alone, false if it appears on a button 3849 hideIfNoPrevNext: false, // True to hide next/previous month links 3850 // if not applicable, false to just disable them 3851 navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links 3852 gotoCurrent: false, // True if today link goes back to current selection instead 3853 changeMonth: false, // True if month can be selected directly, false if only prev/next 3854 changeYear: false, // True if year can be selected directly, false if only prev/next 3855 yearRange: "c-10:c+10", // Range of years to display in drop-down, 3856 // either relative to today's year (-nn:+nn), relative to currently displayed year 3857 // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) 3858 showOtherMonths: false, // True to show dates in other months, false to leave blank 3859 selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable 3860 showWeek: false, // True to show week of the year, false to not show it 3861 calculateWeek: this.iso8601Week, // How to calculate the week of the year, 3862 // takes a Date and returns the number of the week for it 3863 shortYearCutoff: "+10", // Short year values < this are in the current century, 3864 // > this are in the previous century, 3865 // string value starting with "+" for current year + value 3866 minDate: null, // The earliest selectable date, or null for no limit 3867 maxDate: null, // The latest selectable date, or null for no limit 3868 duration: "fast", // Duration of display/closure 3869 beforeShowDay: null, // Function that takes a date and returns an array with 3870 // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "", 3871 // [2] = cell title (optional), e.g. $.datepicker.noWeekends 3872 beforeShow: null, // Function that takes an input field and 3873 // returns a set of custom settings for the date picker 3874 onSelect: null, // Define a callback function when a date is selected 3875 onChangeMonthYear: null, // Define a callback function when the month or year is changed 3876 onClose: null, // Define a callback function when the datepicker is closed 3877 numberOfMonths: 1, // Number of months to show at a time 3878 showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) 3879 stepMonths: 1, // Number of months to step back/forward 3880 stepBigMonths: 12, // Number of months to step back/forward for the big links 3881 altField: "", // Selector for an alternate field to store selected dates into 3882 altFormat: "", // The date format to use for the alternate field 3883 constrainInput: true, // The input is constrained by the current date format 3884 showButtonPanel: false, // True to show button panel, false to not show it 3885 autoSize: false, // True to size the input for the date format, false to leave as is 3886 disabled: false // The initial disabled state 3887 }; 3888 $.extend(this._defaults, this.regional[""]); 3889 this.regional.en = $.extend( true, {}, this.regional[ "" ]); 3890 this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en ); 3891 this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")); 3892} 3893 3894$.extend(Datepicker.prototype, { 3895 /* Class name added to elements to indicate already configured with a date picker. */ 3896 markerClassName: "hasDatepicker", 3897 3898 //Keep track of the maximum number of rows displayed (see #7043) 3899 maxRows: 4, 3900 3901 // TODO rename to "widget" when switching to widget factory 3902 _widgetDatepicker: function() { 3903 return this.dpDiv; 3904 }, 3905 3906 /* Override the default settings for all instances of the date picker. 3907 * @param settings object - the new settings to use as defaults (anonymous object) 3908 * @return the manager object 3909 */ 3910 setDefaults: function(settings) { 3911 datepicker_extendRemove(this._defaults, settings || {}); 3912 return this; 3913 }, 3914 3915 /* Attach the date picker to a jQuery selection. 3916 * @param target element - the target input field or division or span 3917 * @param settings object - the new settings to use for this date picker instance (anonymous) 3918 */ 3919 _attachDatepicker: function(target, settings) { 3920 var nodeName, inline, inst; 3921 nodeName = target.nodeName.toLowerCase(); 3922 inline = (nodeName === "div" || nodeName === "span"); 3923 if (!target.id) { 3924 this.uuid += 1; 3925 target.id = "dp" + this.uuid; 3926 } 3927 inst = this._newInst($(target), inline); 3928 inst.settings = $.extend({}, settings || {}); 3929 if (nodeName === "input") { 3930 this._connectDatepicker(target, inst); 3931 } else if (inline) { 3932 this._inlineDatepicker(target, inst); 3933 } 3934 }, 3935 3936 /* Create a new instance object. */ 3937 _newInst: function(target, inline) { 3938 var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars 3939 return {id: id, input: target, // associated target 3940 selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection 3941 drawMonth: 0, drawYear: 0, // month being drawn 3942 inline: inline, // is datepicker inline or not 3943 dpDiv: (!inline ? this.dpDiv : // presentation div 3944 datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))}; 3945 }, 3946 3947 /* Attach the date picker to an input field. */ 3948 _connectDatepicker: function(target, inst) { 3949 var input = $(target); 3950 inst.append = $([]); 3951 inst.trigger = $([]); 3952 if (input.hasClass(this.markerClassName)) { 3953 return; 3954 } 3955 this._attachments(input, inst); 3956 input.addClass(this.markerClassName).keydown(this._doKeyDown). 3957 keypress(this._doKeyPress).keyup(this._doKeyUp); 3958 this._autoSize(inst); 3959 $.data(target, "datepicker", inst); 3960 //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665) 3961 if( inst.settings.disabled ) { 3962 this._disableDatepicker( target ); 3963 } 3964 }, 3965 3966 /* Make attachments based on settings. */ 3967 _attachments: function(input, inst) { 3968 var showOn, buttonText, buttonImage, 3969 appendText = this._get(inst, "appendText"), 3970 isRTL = this._get(inst, "isRTL"); 3971 3972 if (inst.append) { 3973 inst.append.remove(); 3974 } 3975 if (appendText) { 3976 inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>"); 3977 input[isRTL ? "before" : "after"](inst.append); 3978 } 3979 3980 input.unbind("focus", this._showDatepicker); 3981 3982 if (inst.trigger) { 3983 inst.trigger.remove(); 3984 } 3985 3986 showOn = this._get(inst, "showOn"); 3987 if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field 3988 input.focus(this._showDatepicker); 3989 } 3990 if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked 3991 buttonText = this._get(inst, "buttonText"); 3992 buttonImage = this._get(inst, "buttonImage"); 3993 inst.trigger = $(this._get(inst, "buttonImageOnly") ? 3994 $("<img/>").addClass(this._triggerClass). 3995 attr({ src: buttonImage, alt: buttonText, title: buttonText }) : 3996 $("<button type='button'></button>").addClass(this._triggerClass). 3997 html(!buttonImage ? buttonText : $("<img/>").attr( 3998 { src:buttonImage, alt:buttonText, title:buttonText }))); 3999 input[isRTL ? "before" : "after"](inst.trigger); 4000 inst.trigger.click(function() { 4001 if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { 4002 $.datepicker._hideDatepicker(); 4003 } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { 4004 $.datepicker._hideDatepicker(); 4005 $.datepicker._showDatepicker(input[0]); 4006 } else { 4007 $.datepicker._showDatepicker(input[0]); 4008 } 4009 return false; 4010 }); 4011 } 4012 }, 4013 4014 /* Apply the maximum length for the date format. */ 4015 _autoSize: function(inst) { 4016 if (this._get(inst, "autoSize") && !inst.inline) { 4017 var findMax, max, maxI, i, 4018 date = new Date(2009, 12 - 1, 20), // Ensure double digits 4019 dateFormat = this._get(inst, "dateFormat"); 4020 4021 if (dateFormat.match(/[DM]/)) { 4022 findMax = function(names) { 4023 max = 0; 4024 maxI = 0; 4025 for (i = 0; i < names.length; i++) { 4026 if (names[i].length > max) { 4027 max = names[i].length; 4028 maxI = i; 4029 } 4030 } 4031 return maxI; 4032 }; 4033 date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? 4034 "monthNames" : "monthNamesShort")))); 4035 date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? 4036 "dayNames" : "dayNamesShort"))) + 20 - date.getDay()); 4037 } 4038 inst.input.attr("size", this._formatDate(inst, date).length); 4039 } 4040 }, 4041 4042 /* Attach an inline date picker to a div. */ 4043 _inlineDatepicker: function(target, inst) { 4044 var divSpan = $(target); 4045 if (divSpan.hasClass(this.markerClassName)) { 4046 return; 4047 } 4048 divSpan.addClass(this.markerClassName).append(inst.dpDiv); 4049 $.data(target, "datepicker", inst); 4050 this._setDate(inst, this._getDefaultDate(inst), true); 4051 this._updateDatepicker(inst); 4052 this._updateAlternate(inst); 4053 //If disabled option is true, disable the datepicker before showing it (see ticket #5665) 4054 if( inst.settings.disabled ) { 4055 this._disableDatepicker( target ); 4056 } 4057 // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements 4058 // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height 4059 inst.dpDiv.css( "display", "block" ); 4060 }, 4061 4062 /* Pop-up the date picker in a "dialog" box. 4063 * @param input element - ignored 4064 * @param date string or Date - the initial date to display 4065 * @param onSelect function - the function to call when a date is selected 4066 * @param settings object - update the dialog date picker instance's settings (anonymous object) 4067 * @param pos int[2] - coordinates for the dialog's position within the screen or 4068 * event - with x/y coordinates or 4069 * leave empty for default (screen centre) 4070 * @return the manager object 4071 */ 4072 _dialogDatepicker: function(input, date, onSelect, settings, pos) { 4073 var id, browserWidth, browserHeight, scrollX, scrollY, 4074 inst = this._dialogInst; // internal instance 4075 4076 if (!inst) { 4077 this.uuid += 1; 4078 id = "dp" + this.uuid; 4079 this._dialogInput = $("<input type='text' id='" + id + 4080 "' style='position: absolute; top: -100px; width: 0px;'/>"); 4081 this._dialogInput.keydown(this._doKeyDown); 4082 $("body").append(this._dialogInput); 4083 inst = this._dialogInst = this._newInst(this._dialogInput, false); 4084 inst.settings = {}; 4085 $.data(this._dialogInput[0], "datepicker", inst); 4086 } 4087 datepicker_extendRemove(inst.settings, settings || {}); 4088 date = (date && date.constructor === Date ? this._formatDate(inst, date) : date); 4089 this._dialogInput.val(date); 4090 4091 this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); 4092 if (!this._pos) { 4093 browserWidth = document.documentElement.clientWidth; 4094 browserHeight = document.documentElement.clientHeight; 4095 scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; 4096 scrollY = document.documentElement.scrollTop || document.body.scrollTop; 4097 this._pos = // should use actual width/height below 4098 [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; 4099 } 4100 4101 // move input on screen for focus, but hidden behind dialog 4102 this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px"); 4103 inst.settings.onSelect = onSelect; 4104 this._inDialog = true; 4105 this.dpDiv.addClass(this._dialogClass); 4106 this._showDatepicker(this._dialogInput[0]); 4107 if ($.blockUI) { 4108 $.blockUI(this.dpDiv); 4109 } 4110 $.data(this._dialogInput[0], "datepicker", inst); 4111 return this; 4112 }, 4113 4114 /* Detach a datepicker from its control. 4115 * @param target element - the target input field or division or span 4116 */ 4117 _destroyDatepicker: function(target) { 4118 var nodeName, 4119 $target = $(target), 4120 inst = $.data(target, "datepicker"); 4121 4122 if (!$target.hasClass(this.markerClassName)) { 4123 return; 4124 } 4125 4126 nodeName = target.nodeName.toLowerCase(); 4127 $.removeData(target, "datepicker"); 4128 if (nodeName === "input") {
vendor: 6,854 bytes, lines 4129-4336
4129 inst.append.remove(); 4130 inst.trigger.remove(); 4131 $target.removeClass(this.markerClassName). 4132 unbind("focus", this._showDatepicker). 4133 unbind("keydown", this._doKeyDown). 4134 unbind("keypress", this._doKeyPress). 4135 unbind("keyup", this._doKeyUp); 4136 } else if (nodeName === "div" || nodeName === "span") { 4137 $target.removeClass(this.markerClassName).empty(); 4138 } 4139 }, 4140 4141 /* Enable the date picker to a jQuery selection. 4142 * @param target element - the target input field or division or span 4143 */ 4144 _enableDatepicker: function(target) { 4145 var nodeName, inline, 4146 $target = $(target), 4147 inst = $.data(target, "datepicker"); 4148 4149 if (!$target.hasClass(this.markerClassName)) { 4150 return; 4151 } 4152 4153 nodeName = target.nodeName.toLowerCase(); 4154 if (nodeName === "input") { 4155 target.disabled = false; 4156 inst.trigger.filter("button"). 4157 each(function() { this.disabled = false; }).end(). 4158 filter("img").css({opacity: "1.0", cursor: ""}); 4159 } else if (nodeName === "div" || nodeName === "span") { 4160 inline = $target.children("." + this._inlineClass); 4161 inline.children().removeClass("ui-state-disabled"); 4162 inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). 4163 prop("disabled", false); 4164 } 4165 this._disabledInputs = $.map(this._disabledInputs, 4166 function(value) { return (value === target ? null : value); }); // delete entry 4167 }, 4168 4169 /* Disable the date picker to a jQuery selection. 4170 * @param target element - the target input field or division or span 4171 */ 4172 _disableDatepicker: function(target) { 4173 var nodeName, inline, 4174 $target = $(target), 4175 inst = $.data(target, "datepicker"); 4176 4177 if (!$target.hasClass(this.markerClassName)) { 4178 return; 4179 } 4180 4181 nodeName = target.nodeName.toLowerCase(); 4182 if (nodeName === "input") { 4183 target.disabled = true; 4184 inst.trigger.filter("button"). 4185 each(function() { this.disabled = true; }).end(). 4186 filter("img").css({opacity: "0.5", cursor: "default"}); 4187 } else if (nodeName === "div" || nodeName === "span") { 4188 inline = $target.children("." + this._inlineClass); 4189 inline.children().addClass("ui-state-disabled"); 4190 inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). 4191 prop("disabled", true); 4192 } 4193 this._disabledInputs = $.map(this._disabledInputs, 4194 function(value) { return (value === target ? null : value); }); // delete entry 4195 this._disabledInputs[this._disabledInputs.length] = target; 4196 }, 4197 4198 /* Is the first field in a jQuery collection disabled as a datepicker? 4199 * @param target element - the target input field or division or span 4200 * @return boolean - true if disabled, false if enabled 4201 */ 4202 _isDisabledDatepicker: function(target) { 4203 if (!target) { 4204 return false; 4205 } 4206 for (var i = 0; i < this._disabledInputs.length; i++) { 4207 if (this._disabledInputs[i] === target) { 4208 return true; 4209 } 4210 } 4211 return false; 4212 }, 4213 4214 /* Retrieve the instance data for the target control. 4215 * @param target element - the target input field or division or span 4216 * @return object - the associated instance data 4217 * @throws error if a jQuery problem getting data 4218 */ 4219 _getInst: function(target) { 4220 try { 4221 return $.data(target, "datepicker"); 4222 } 4223 catch (err) { 4224 throw "Missing instance data for this datepicker"; 4225 } 4226 }, 4227 4228 /* Update or retrieve the settings for a date picker attached to an input field or division. 4229 * @param target element - the target input field or division or span 4230 * @param name object - the new settings to update or 4231 * string - the name of the setting to change or retrieve, 4232 * when retrieving also "all" for all instance settings or 4233 * "defaults" for all global defaults 4234 * @param value any - the new value for the setting 4235 * (omit if above is an object or to retrieve a value) 4236 */ 4237 _optionDatepicker: function(target, name, value) { 4238 var settings, date, minDate, maxDate, 4239 inst = this._getInst(target); 4240 4241 if (arguments.length === 2 && typeof name === "string") { 4242 return (name === "defaults" ? $.extend({}, $.datepicker._defaults) : 4243 (inst ? (name === "all" ? $.extend({}, inst.settings) : 4244 this._get(inst, name)) : null)); 4245 } 4246 4247 settings = name || {}; 4248 if (typeof name === "string") { 4249 settings = {}; 4250 settings[name] = value; 4251 } 4252 4253 if (inst) { 4254 if (this._curInst === inst) { 4255 this._hideDatepicker(); 4256 } 4257 4258 date = this._getDateDatepicker(target, true); 4259 minDate = this._getMinMaxDate(inst, "min"); 4260 maxDate = this._getMinMaxDate(inst, "max"); 4261 datepicker_extendRemove(inst.settings, settings); 4262 // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided 4263 if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) { 4264 inst.settings.minDate = this._formatDate(inst, minDate); 4265 } 4266 if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) { 4267 inst.settings.maxDate = this._formatDate(inst, maxDate); 4268 } 4269 if ( "disabled" in settings ) { 4270 if ( settings.disabled ) { 4271 this._disableDatepicker(target); 4272 } else { 4273 this._enableDatepicker(target); 4274 } 4275 } 4276 this._attachments($(target), inst); 4277 this._autoSize(inst); 4278 this._setDate(inst, date); 4279 this._updateAlternate(inst); 4280 this._updateDatepicker(inst); 4281 } 4282 }, 4283 4284 // change method deprecated 4285 _changeDatepicker: function(target, name, value) { 4286 this._optionDatepicker(target, name, value); 4287 }, 4288 4289 /* Redraw the date picker attached to an input field or division. 4290 * @param target element - the target input field or division or span 4291 */ 4292 _refreshDatepicker: function(target) { 4293 var inst = this._getInst(target); 4294 if (inst) { 4295 this._updateDatepicker(inst); 4296 } 4297 }, 4298 4299 /* Set the dates for a jQuery selection. 4300 * @param target element - the target input field or division or span 4301 * @param date Date - the new date 4302 */ 4303 _setDateDatepicker: function(target, date) { 4304 var inst = this._getInst(target); 4305 if (inst) { 4306 this._setDate(inst, date); 4307 this._updateDatepicker(inst); 4308 this._updateAlternate(inst); 4309 } 4310 }, 4311 4312 /* Get the date(s) for the first entry in a jQuery selection. 4313 * @param target element - the target input field or division or span 4314 * @param noDefault boolean - true if no default date is to be used 4315 * @return Date - the current date 4316 */ 4317 _getDateDatepicker: function(target, noDefault) { 4318 var inst = this._getInst(target); 4319 if (inst && !inst.inline) { 4320 this._setDateFromField(inst, noDefault); 4321 } 4322 return (inst ? this._getDate(inst) : null); 4323 }, 4324 4325 /* Handle keystrokes. */ 4326 _doKeyDown: function(event) { 4327 var onSelect, dateStr, sel, 4328 inst = $.datepicker._getInst(event.target), 4329 handled = true, 4330 isRTL = inst.dpDiv.is(".ui-datepicker-rtl"); 4331 4332 inst._keyEvent = true; 4333 if ($.datepicker._datepickerShowing) { 4334 switch (event.keyCode) { 4335 case 9: $.datepicker._hideDatepicker(); 4336 handled = false;
vendor: 4,495 bytes, lines 4337-4460
4337 break; // hide on tab out 4338 case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." + 4339 $.datepicker._currentClass + ")", inst.dpDiv); 4340 if (sel[0]) { 4341 $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); 4342 } 4343 4344 onSelect = $.datepicker._get(inst, "onSelect"); 4345 if (onSelect) { 4346 dateStr = $.datepicker._formatDate(inst); 4347 4348 // trigger custom callback 4349 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); 4350 } else { 4351 $.datepicker._hideDatepicker(); 4352 } 4353 4354 return false; // don't submit the form 4355 case 27: $.datepicker._hideDatepicker(); 4356 break; // hide on escape 4357 case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? 4358 -$.datepicker._get(inst, "stepBigMonths") : 4359 -$.datepicker._get(inst, "stepMonths")), "M"); 4360 break; // previous month/year on page up/+ ctrl 4361 case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? 4362 +$.datepicker._get(inst, "stepBigMonths") : 4363 +$.datepicker._get(inst, "stepMonths")), "M"); 4364 break; // next month/year on page down/+ ctrl 4365 case 35: if (event.ctrlKey || event.metaKey) { 4366 $.datepicker._clearDate(event.target); 4367 } 4368 handled = event.ctrlKey || event.metaKey; 4369 break; // clear on ctrl or command +end 4370 case 36: if (event.ctrlKey || event.metaKey) { 4371 $.datepicker._gotoToday(event.target); 4372 } 4373 handled = event.ctrlKey || event.metaKey; 4374 break; // current on ctrl or command +home 4375 case 37: if (event.ctrlKey || event.metaKey) { 4376 $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D"); 4377 } 4378 handled = event.ctrlKey || event.metaKey; 4379 // -1 day on ctrl or command +left 4380 if (event.originalEvent.altKey) { 4381 $.datepicker._adjustDate(event.target, (event.ctrlKey ? 4382 -$.datepicker._get(inst, "stepBigMonths") : 4383 -$.datepicker._get(inst, "stepMonths")), "M"); 4384 } 4385 // next month/year on alt +left on Mac 4386 break; 4387 case 38: if (event.ctrlKey || event.metaKey) { 4388 $.datepicker._adjustDate(event.target, -7, "D"); 4389 } 4390 handled = event.ctrlKey || event.metaKey; 4391 break; // -1 week on ctrl or command +up 4392 case 39: if (event.ctrlKey || event.metaKey) { 4393 $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D"); 4394 } 4395 handled = event.ctrlKey || event.metaKey; 4396 // +1 day on ctrl or command +right 4397 if (event.originalEvent.altKey) { 4398 $.datepicker._adjustDate(event.target, (event.ctrlKey ? 4399 +$.datepicker._get(inst, "stepBigMonths") : 4400 +$.datepicker._get(inst, "stepMonths")), "M"); 4401 } 4402 // next month/year on alt +right 4403 break; 4404 case 40: if (event.ctrlKey || event.metaKey) { 4405 $.datepicker._adjustDate(event.target, +7, "D"); 4406 } 4407 handled = event.ctrlKey || event.metaKey; 4408 break; // +1 week on ctrl or command +down 4409 default: handled = false; 4410 } 4411 } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home 4412 $.datepicker._showDatepicker(this); 4413 } else { 4414 handled = false; 4415 } 4416 4417 if (handled) { 4418 event.preventDefault(); 4419 event.stopPropagation(); 4420 } 4421 }, 4422 4423 /* Filter entered characters - based on date format. */ 4424 _doKeyPress: function(event) { 4425 var chars, chr, 4426 inst = $.datepicker._getInst(event.target); 4427 4428 if ($.datepicker._get(inst, "constrainInput")) { 4429 chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat")); 4430 chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode); 4431 return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1); 4432 } 4433 }, 4434 4435 /* Synchronise manual entry and field/alternate field. */ 4436 _doKeyUp: function(event) { 4437 var date, 4438 inst = $.datepicker._getInst(event.target); 4439 4440 if (inst.input.val() !== inst.lastVal) { 4441 try { 4442 date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), 4443 (inst.input ? inst.input.val() : null), 4444 $.datepicker._getFormatConfig(inst)); 4445 4446 if (date) { // only if valid 4447 $.datepicker._setDateFromField(inst); 4448 $.datepicker._updateAlternate(inst); 4449 $.datepicker._updateDatepicker(inst); 4450 } 4451 } 4452 catch (err) { 4453 } 4454 } 4455 return true; 4456 }, 4457 4458 /* Pop-up the date picker for a given input field. 4459 * If false returned from beforeShow event handler do not show. 4460 * @param input element - the input field attached to the date picker or
vendor: 9,398 bytes, lines 4461-4735
4461 * event - if triggered by focus 4462 */ 4463 _showDatepicker: function(input) { 4464 input = input.target || input; 4465 if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger 4466 input = $("input", input.parentNode)[0]; 4467 } 4468 4469 if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here 4470 return; 4471 } 4472 4473 var inst, beforeShow, beforeShowSettings, isFixed, 4474 offset, showAnim, duration; 4475 4476 inst = $.datepicker._getInst(input); 4477 if ($.datepicker._curInst && $.datepicker._curInst !== inst) { 4478 $.datepicker._curInst.dpDiv.stop(true, true); 4479 if ( inst && $.datepicker._datepickerShowing ) { 4480 $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] ); 4481 } 4482 } 4483 4484 beforeShow = $.datepicker._get(inst, "beforeShow"); 4485 beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {}; 4486 if(beforeShowSettings === false){ 4487 return; 4488 } 4489 datepicker_extendRemove(inst.settings, beforeShowSettings); 4490 4491 inst.lastVal = null; 4492 $.datepicker._lastInput = input; 4493 $.datepicker._setDateFromField(inst); 4494 4495 if ($.datepicker._inDialog) { // hide cursor 4496 input.value = ""; 4497 } 4498 if (!$.datepicker._pos) { // position below input 4499 $.datepicker._pos = $.datepicker._findPos(input); 4500 $.datepicker._pos[1] += input.offsetHeight; // add the height 4501 } 4502 4503 isFixed = false; 4504 $(input).parents().each(function() { 4505 isFixed |= $(this).css("position") === "fixed"; 4506 return !isFixed; 4507 }); 4508 4509 offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; 4510 $.datepicker._pos = null; 4511 //to avoid flashes on Firefox 4512 inst.dpDiv.empty(); 4513 // determine sizing offscreen 4514 inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"}); 4515 $.datepicker._updateDatepicker(inst); 4516 // fix width for dynamic number of date pickers 4517 // and adjust position before showing 4518 offset = $.datepicker._checkOffset(inst, offset, isFixed); 4519 inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? 4520 "static" : (isFixed ? "fixed" : "absolute")), display: "none", 4521 left: offset.left + "px", top: offset.top + "px"}); 4522 4523 if (!inst.inline) { 4524 showAnim = $.datepicker._get(inst, "showAnim"); 4525 duration = $.datepicker._get(inst, "duration"); 4526 inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 ); 4527 $.datepicker._datepickerShowing = true; 4528 4529 if ( $.effects && $.effects.effect[ showAnim ] ) { 4530 inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration); 4531 } else { 4532 inst.dpDiv[showAnim || "show"](showAnim ? duration : null); 4533 } 4534 4535 if ( $.datepicker._shouldFocusInput( inst ) ) { 4536 inst.input.focus(); 4537 } 4538 4539 $.datepicker._curInst = inst; 4540 } 4541 }, 4542 4543 /* Generate the date picker content. */ 4544 _updateDatepicker: function(inst) { 4545 this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) 4546 datepicker_instActive = inst; // for delegate hover events 4547 inst.dpDiv.empty().append(this._generateHTML(inst)); 4548 this._attachHandlers(inst); 4549 4550 var origyearshtml, 4551 numMonths = this._getNumberOfMonths(inst), 4552 cols = numMonths[1], 4553 width = 17, 4554 activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ); 4555 4556 if ( activeCell.length > 0 ) { 4557 datepicker_handleMouseover.apply( activeCell.get( 0 ) ); 4558 } 4559 4560 inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); 4561 if (cols > 1) { 4562 inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em"); 4563 } 4564 inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") + 4565 "Class"]("ui-datepicker-multi"); 4566 inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") + 4567 "Class"]("ui-datepicker-rtl"); 4568 4569 if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) { 4570 inst.input.focus(); 4571 } 4572 4573 // deffered render of the years select (to avoid flashes on Firefox) 4574 if( inst.yearshtml ){ 4575 origyearshtml = inst.yearshtml; 4576 setTimeout(function(){ 4577 //assure that inst.yearshtml didn't change. 4578 if( origyearshtml === inst.yearshtml && inst.yearshtml ){ 4579 inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml); 4580 } 4581 origyearshtml = inst.yearshtml = null; 4582 }, 0); 4583 } 4584 }, 4585 4586 // #6694 - don't focus the input if it's already focused 4587 // this breaks the change event in IE 4588 // Support: IE and jQuery <1.9 4589 _shouldFocusInput: function( inst ) { 4590 return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" ); 4591 }, 4592 4593 /* Check positioning to remain on screen. */ 4594 _checkOffset: function(inst, offset, isFixed) { 4595 var dpWidth = inst.dpDiv.outerWidth(), 4596 dpHeight = inst.dpDiv.outerHeight(), 4597 inputWidth = inst.input ? inst.input.outerWidth() : 0, 4598 inputHeight = inst.input ? inst.input.outerHeight() : 0, 4599 viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), 4600 viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()); 4601 4602 offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0); 4603 offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0; 4604 offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; 4605 4606 // now check if datepicker is showing outside window viewport - move to a better place if so. 4607 offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? 4608 Math.abs(offset.left + dpWidth - viewWidth) : 0); 4609 offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? 4610 Math.abs(dpHeight + inputHeight) : 0); 4611 4612 return offset; 4613 }, 4614 4615 /* Find an object's position on the screen. */ 4616 _findPos: function(obj) { 4617 var position, 4618 inst = this._getInst(obj), 4619 isRTL = this._get(inst, "isRTL"); 4620 4621 while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) { 4622 obj = obj[isRTL ? "previousSibling" : "nextSibling"]; 4623 } 4624 4625 position = $(obj).offset(); 4626 return [position.left, position.top]; 4627 }, 4628 4629 /* Hide the date picker from view. 4630 * @param input element - the input field attached to the date picker 4631 */ 4632 _hideDatepicker: function(input) { 4633 var showAnim, duration, postProcess, onClose, 4634 inst = this._curInst; 4635 4636 if (!inst || (input && inst !== $.data(input, "datepicker"))) { 4637 return; 4638 } 4639 4640 if (this._datepickerShowing) { 4641 showAnim = this._get(inst, "showAnim"); 4642 duration = this._get(inst, "duration"); 4643 postProcess = function() { 4644 $.datepicker._tidyDialog(inst); 4645 }; 4646 4647 // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed 4648 if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) { 4649 inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess); 4650 } else { 4651 inst.dpDiv[(showAnim === "slideDown" ? "slideUp" : 4652 (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess); 4653 } 4654 4655 if (!showAnim) { 4656 postProcess(); 4657 } 4658 this._datepickerShowing = false; 4659 4660 onClose = this._get(inst, "onClose"); 4661 if (onClose) { 4662 onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]); 4663 } 4664 4665 this._lastInput = null; 4666 if (this._inDialog) { 4667 this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" }); 4668 if ($.blockUI) { 4669 $.unblockUI(); 4670 $("body").append(this.dpDiv); 4671 } 4672 } 4673 this._inDialog = false; 4674 } 4675 }, 4676 4677 /* Tidy up after a dialog display. */ 4678 _tidyDialog: function(inst) { 4679 inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar"); 4680 }, 4681 4682 /* Close date picker if clicked elsewhere. */ 4683 _checkExternalClick: function(event) { 4684 if (!$.datepicker._curInst) { 4685 return; 4686 } 4687 4688 var $target = $(event.target), 4689 inst = $.datepicker._getInst($target[0]); 4690 4691 if ( ( ( $target[0].id !== $.datepicker._mainDivId && 4692 $target.parents("#" + $.datepicker._mainDivId).length === 0 && 4693 !$target.hasClass($.datepicker.markerClassName) && 4694 !$target.closest("." + $.datepicker._triggerClass).length && 4695 $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) || 4696 ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) { 4697 $.datepicker._hideDatepicker(); 4698 } 4699 }, 4700 4701 /* Adjust one of the date sub-fields. */ 4702 _adjustDate: function(id, offset, period) { 4703 var target = $(id), 4704 inst = this._getInst(target[0]); 4705 4706 if (this._isDisabledDatepicker(target[0])) { 4707 return; 4708 } 4709 this._adjustInstDate(inst, offset + 4710 (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning 4711 period); 4712 this._updateDatepicker(inst); 4713 }, 4714 4715 /* Action for current link. */ 4716 _gotoToday: function(id) { 4717 var date, 4718 target = $(id), 4719 inst = this._getInst(target[0]); 4720 4721 if (this._get(inst, "gotoCurrent") && inst.currentDay) { 4722 inst.selectedDay = inst.currentDay; 4723 inst.drawMonth = inst.selectedMonth = inst.currentMonth; 4724 inst.drawYear = inst.selectedYear = inst.currentYear; 4725 } else { 4726 date = new Date(); 4727 inst.selectedDay = date.getDate(); 4728 inst.drawMonth = inst.selectedMonth = date.getMonth(); 4729 inst.drawYear = inst.selectedYear = date.getFullYear(); 4730 } 4731 this._notifyChange(inst); 4732 this._adjustDate(target); 4733 }, 4734 4735 /* Action for selecting a new month/year. */
vendor: 4,436 bytes, lines 4736-4867
4736 _selectMonthYear: function(id, select, period) { 4737 var target = $(id), 4738 inst = this._getInst(target[0]); 4739 4740 inst["selected" + (period === "M" ? "Month" : "Year")] = 4741 inst["draw" + (period === "M" ? "Month" : "Year")] = 4742 parseInt(select.options[select.selectedIndex].value,10); 4743 4744 this._notifyChange(inst); 4745 this._adjustDate(target); 4746 }, 4747 4748 /* Action for selecting a day. */ 4749 _selectDay: function(id, month, year, td) { 4750 var inst, 4751 target = $(id); 4752 4753 if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { 4754 return; 4755 } 4756 4757 inst = this._getInst(target[0]); 4758 inst.selectedDay = inst.currentDay = $("a", td).html(); 4759 inst.selectedMonth = inst.currentMonth = month; 4760 inst.selectedYear = inst.currentYear = year; 4761 this._selectDate(id, this._formatDate(inst, 4762 inst.currentDay, inst.currentMonth, inst.currentYear)); 4763 }, 4764 4765 /* Erase the input field and hide the date picker. */ 4766 _clearDate: function(id) { 4767 var target = $(id); 4768 this._selectDate(target, ""); 4769 }, 4770 4771 /* Update the input field with the selected date. */ 4772 _selectDate: function(id, dateStr) { 4773 var onSelect, 4774 target = $(id), 4775 inst = this._getInst(target[0]); 4776 4777 dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); 4778 if (inst.input) { 4779 inst.input.val(dateStr); 4780 } 4781 this._updateAlternate(inst); 4782 4783 onSelect = this._get(inst, "onSelect"); 4784 if (onSelect) { 4785 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback 4786 } else if (inst.input) { 4787 inst.input.trigger("change"); // fire the change event 4788 } 4789 4790 if (inst.inline){ 4791 this._updateDatepicker(inst); 4792 } else { 4793 this._hideDatepicker(); 4794 this._lastInput = inst.input[0]; 4795 if (typeof(inst.input[0]) !== "object") { 4796 inst.input.focus(); // restore focus 4797 } 4798 this._lastInput = null; 4799 } 4800 }, 4801 4802 /* Update any alternate field to synchronise with the main field. */ 4803 _updateAlternate: function(inst) { 4804 var altFormat, date, dateStr, 4805 altField = this._get(inst, "altField"); 4806 4807 if (altField) { // update alternate field too 4808 altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat"); 4809 date = this._getDate(inst); 4810 dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); 4811 $(altField).each(function() { $(this).val(dateStr); }); 4812 } 4813 }, 4814 4815 /* Set as beforeShowDay function to prevent selection of weekends. 4816 * @param date Date - the date to customise 4817 * @return [boolean, string] - is this date selectable?, what is its CSS class? 4818 */ 4819 noWeekends: function(date) { 4820 var day = date.getDay(); 4821 return [(day > 0 && day < 6), ""]; 4822 }, 4823 4824 /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. 4825 * @param date Date - the date to get the week for 4826 * @return number - the number of the week within the year that contains this date 4827 */ 4828 iso8601Week: function(date) { 4829 var time, 4830 checkDate = new Date(date.getTime()); 4831 4832 // Find Thursday of this week starting on Monday 4833 checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); 4834 4835 time = checkDate.getTime(); 4836 checkDate.setMonth(0); // Compare with Jan 1 4837 checkDate.setDate(1); 4838 return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; 4839 }, 4840 4841 /* Parse a string value into a date object. 4842 * See formatDate below for the possible formats. 4843 * 4844 * @param format string - the expected format of the date 4845 * @param value string - the date in the above format 4846 * @param settings Object - attributes include: 4847 * shortYearCutoff number - the cutoff year for determining the century (optional) 4848 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) 4849 * dayNames string[7] - names of the days from Sunday (optional) 4850 * monthNamesShort string[12] - abbreviated names of the months (optional) 4851 * monthNames string[12] - names of the months (optional) 4852 * @return Date - the extracted date value or null if value is blank 4853 */ 4854 parseDate: function (format, value, settings) { 4855 if (format == null || value == null) { 4856 throw "Invalid arguments"; 4857 } 4858 4859 value = (typeof value === "object" ? value.toString() : value + ""); 4860 if (value === "") { 4861 return null; 4862 } 4863 4864 var iFormat, dim, extra, 4865 iValue = 0, 4866 shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, 4867 shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp
vendor: 5,261 bytes, lines 4867-5053
4867: 4868 new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)), 4869 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, 4870 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, 4871 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, 4872 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, 4873 year = -1, 4874 month = -1, 4875 day = -1, 4876 doy = -1, 4877 literal = false, 4878 date, 4879 // Check whether a format character is doubled 4880 lookAhead = function(match) { 4881 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); 4882 if (matches) { 4883 iFormat++; 4884 } 4885 return matches; 4886 }, 4887 // Extract a number from the string value 4888 getNumber = function(match) { 4889 var isDoubled = lookAhead(match), 4890 size = (match === "@" ? 14 : (match === "!" ? 20 : 4891 (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))), 4892 minSize = (match === "y" ? size : 1), 4893 digits = new RegExp("^\\d{" + minSize + "," + size + "}"), 4894 num = value.substring(iValue).match(digits); 4895 if (!num) { 4896 throw "Missing number at position " + iValue; 4897 } 4898 iValue += num[0].length; 4899 return parseInt(num[0], 10); 4900 }, 4901 // Extract a name from the string value and convert to an index 4902 getName = function(match, shortNames, longNames) { 4903 var index = -1, 4904 names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { 4905 return [ [k, v] ]; 4906 }).sort(function (a, b) { 4907 return -(a[1].length - b[1].length); 4908 }); 4909 4910 $.each(names, function (i, pair) { 4911 var name = pair[1]; 4912 if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { 4913 index = pair[0]; 4914 iValue += name.length; 4915 return false; 4916 } 4917 }); 4918 if (index !== -1) { 4919 return index + 1; 4920 } else { 4921 throw "Unknown name at position " + iValue; 4922 } 4923 }, 4924 // Confirm that a literal character matches the string value 4925 checkLiteral = function() { 4926 if (value.charAt(iValue) !== format.charAt(iFormat)) { 4927 throw "Unexpected literal at position " + iValue; 4928 } 4929 iValue++; 4930 }; 4931 4932 for (iFormat = 0; iFormat < format.length; iFormat++) { 4933 if (literal) { 4934 if (format.charAt(iFormat) === "'" && !lookAhead("'")) { 4935 literal = false; 4936 } else { 4937 checkLiteral(); 4938 } 4939 } else { 4940 switch (format.charAt(iFormat)) { 4941 case "d": 4942 day = getNumber("d"); 4943 break; 4944 case "D": 4945 getName("D", dayNamesShort, dayNames); 4946 break; 4947 case "o": 4948 doy = getNumber("o"); 4949 break; 4950 case "m": 4951 month = getNumber("m"); 4952 break; 4953 case "M": 4954 month = getName("M", monthNamesShort, monthNames); 4955 break; 4956 case "y": 4957 year = getNumber("y"); 4958 break; 4959 case "@": 4960 date = new Date(getNumber("@")); 4961 year = date.getFullYear(); 4962 month = date.getMonth() + 1; 4963 day = date.getDate(); 4964 break; 4965 case "!": 4966 date = new Date((getNumber("!") - this._ticksTo1970) / 10000); 4967 year = date.getFullYear(); 4968 month = date.getMonth() + 1; 4969 day = date.getDate(); 4970 break; 4971 case "'": 4972 if (lookAhead("'")){ 4973 checkLiteral(); 4974 } else { 4975 literal = true; 4976 } 4977 break; 4978 default: 4979 checkLiteral(); 4980 } 4981 } 4982 } 4983 4984 if (iValue < value.length){ 4985 extra = value.substr(iValue); 4986 if (!/^\s+/.test(extra)) { 4987 throw "Extra/unparsed characters found in date: " + extra; 4988 } 4989 } 4990 4991 if (year === -1) { 4992 year = new Date().getFullYear(); 4993 } else if (year < 100) { 4994 year += new Date().getFullYear() - new Date().getFullYear() % 100 + 4995 (year <= shortYearCutoff ? 0 : -100); 4996 } 4997 4998 if (doy > -1) { 4999 month = 1; 5000 day = doy; 5001 do { 5002 dim = this._getDaysInMonth(year, month - 1); 5003 if (day <= dim) { 5004 break; 5005 } 5006 month++; 5007 day -= dim; 5008 } while (true); 5009 } 5010 5011 date = this._daylightSavingAdjust(new Date(year, month - 1, day)); 5012 if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { 5013 throw "Invalid date"; // E.g. 31/02/00 5014 } 5015 return date; 5016 }, 5017 5018 /* Standard date formats. */ 5019 ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) 5020 COOKIE: "D, dd M yy", 5021 ISO_8601: "yy-mm-dd", 5022 RFC_822: "D, d M y", 5023 RFC_850: "DD, dd-M-y", 5024 RFC_1036: "D, d M y", 5025 RFC_1123: "D, d M yy", 5026 RFC_2822: "D, d M yy", 5027 RSS: "D, d M y", // RFC 822 5028 TICKS: "!", 5029 TIMESTAMP: "@", 5030 W3C: "yy-mm-dd", // ISO 8601 5031 5032 _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + 5033 Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), 5034 5035 /* Format a date object into a string value. 5036 * The format can be combinations of the following: 5037 * d - day of month (no leading zero) 5038 * dd - day of month (two digit) 5039 * o - day of year (no leading zeros) 5040 * oo - day of year (three digit) 5041 * D - day name short 5042 * DD - day name long 5043 * m - month of year (no leading zero) 5044 * mm - month of year (two digit) 5045 * M - month name short 5046 * MM - month name long 5047 * y - year (two digit) 5048 * yy - year (four digit) 5049 * @ - Unix timestamp (ms since 01/01/1970) 5050 * ! - Windows ticks (100ns since 01/01/0001) 5051 * "..." - literal text 5052 * '' - single quote 5053 *
vendor: 11,157 bytes, lines 5054-5387
5054 * @param format string - the desired format of the date 5055 * @param date Date - the date value to format 5056 * @param settings Object - attributes include: 5057 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) 5058 * dayNames string[7] - names of the days from Sunday (optional) 5059 * monthNamesShort string[12] - abbreviated names of the months (optional) 5060 * monthNames string[12] - names of the months (optional) 5061 * @return string - the date in the above format 5062 */ 5063 formatDate: function (format, date, settings) { 5064 if (!date) { 5065 return ""; 5066 } 5067 5068 var iFormat, 5069 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, 5070 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, 5071 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, 5072 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, 5073 // Check whether a format character is doubled 5074 lookAhead = function(match) { 5075 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); 5076 if (matches) { 5077 iFormat++; 5078 } 5079 return matches; 5080 }, 5081 // Format a number, with leading zero if necessary 5082 formatNumber = function(match, value, len) { 5083 var num = "" + value; 5084 if (lookAhead(match)) { 5085 while (num.length < len) { 5086 num = "0" + num; 5087 } 5088 } 5089 return num; 5090 }, 5091 // Format a name, short or long as requested 5092 formatName = function(match, value, shortNames, longNames) { 5093 return (lookAhead(match) ? longNames[value] : shortNames[value]); 5094 }, 5095 output = "", 5096 literal = false; 5097 5098 if (date) { 5099 for (iFormat = 0; iFormat < format.length; iFormat++) { 5100 if (literal) { 5101 if (format.charAt(iFormat) === "'" && !lookAhead("'")) { 5102 literal = false; 5103 } else { 5104 output += format.charAt(iFormat); 5105 } 5106 } else { 5107 switch (format.charAt(iFormat)) { 5108 case "d": 5109 output += formatNumber("d", date.getDate(), 2); 5110 break; 5111 case "D": 5112 output += formatName("D", date.getDay(), dayNamesShort, dayNames); 5113 break; 5114 case "o": 5115 output += formatNumber("o", 5116 Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); 5117 break; 5118 case "m": 5119 output += formatNumber("m", date.getMonth() + 1, 2); 5120 break; 5121 case "M": 5122 output += formatName("M", date.getMonth(), monthNamesShort, monthNames); 5123 break; 5124 case "y": 5125 output += (lookAhead("y") ? date.getFullYear() : 5126 (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100); 5127 break; 5128 case "@": 5129 output += date.getTime(); 5130 break; 5131 case "!": 5132 output += date.getTime() * 10000 + this._ticksTo1970; 5133 break; 5134 case "'": 5135 if (lookAhead("'")) { 5136 output += "'"; 5137 } else { 5138 literal = true; 5139 } 5140 break; 5141 default: 5142 output += format.charAt(iFormat); 5143 } 5144 } 5145 } 5146 } 5147 return output; 5148 }, 5149 5150 /* Extract all possible characters from the date format. */ 5151 _possibleChars: function (format) { 5152 var iFormat, 5153 chars = "", 5154 literal = false, 5155 // Check whether a format character is doubled 5156 lookAhead = function(match) { 5157 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); 5158 if (matches) { 5159 iFormat++; 5160 } 5161 return matches; 5162 }; 5163 5164 for (iFormat = 0; iFormat < format.length; iFormat++) { 5165 if (literal) { 5166 if (format.charAt(iFormat) === "'" && !lookAhead("'")) { 5167 literal = false; 5168 } else { 5169 chars += format.charAt(iFormat); 5170 } 5171 } else { 5172 switch (format.charAt(iFormat)) { 5173 case "d": case "m": case "y": case "@": 5174 chars += "0123456789"; 5175 break; 5176 case "D": case "M": 5177 return null; // Accept anything 5178 case "'": 5179 if (lookAhead("'")) { 5180 chars += "'"; 5181 } else { 5182 literal = true; 5183 } 5184 break; 5185 default: 5186 chars += format.charAt(iFormat); 5187 } 5188 } 5189 } 5190 return chars; 5191 }, 5192 5193 /* Get a setting value, defaulting if necessary. */ 5194 _get: function(inst, name) { 5195 return inst.settings[name] !== undefined ? 5196 inst.settings[name] : this._defaults[name]; 5197 }, 5198 5199 /* Parse existing date and initialise date picker. */ 5200 _setDateFromField: function(inst, noDefault) { 5201 if (inst.input.val() === inst.lastVal) { 5202 return; 5203 } 5204 5205 var dateFormat = this._get(inst, "dateFormat"), 5206 dates = inst.lastVal = inst.input ? inst.input.val() : null, 5207 defaultDate = this._getDefaultDate(inst), 5208 date = defaultDate, 5209 settings = this._getFormatConfig(inst); 5210 5211 try { 5212 date = this.parseDate(dateFormat, dates, settings) || defaultDate; 5213 } catch (event) { 5214 dates = (noDefault ? "" : dates); 5215 } 5216 inst.selectedDay = date.getDate(); 5217 inst.drawMonth = inst.selectedMonth = date.getMonth(); 5218 inst.drawYear = inst.selectedYear = date.getFullYear(); 5219 inst.currentDay = (dates ? date.getDate() : 0); 5220 inst.currentMonth = (dates ? date.getMonth() : 0); 5221 inst.currentYear = (dates ? date.getFullYear() : 0); 5222 this._adjustInstDate(inst); 5223 }, 5224 5225 /* Retrieve the default date shown on opening. */ 5226 _getDefaultDate: function(inst) { 5227 return this._restrictMinMax(inst, 5228 this._determineDate(inst, this._get(inst, "defaultDate"), new Date())); 5229 }, 5230 5231 /* A date may be specified as an exact value or a relative one. */ 5232 _determineDate: function(inst, date, defaultDate) { 5233 var offsetNumeric = function(offset) { 5234 var date = new Date(); 5235 date.setDate(date.getDate() + offset); 5236 return date; 5237 }, 5238 offsetString = function(offset) { 5239 try { 5240 return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), 5241 offset, $.datepicker._getFormatConfig(inst)); 5242 } 5243 catch (e) { 5244 // Ignore 5245 } 5246 5247 var date = (offset.toLowerCase().match(/^c/) ? 5248 $.datepicker._getDate(inst) : null) || new Date(), 5249 year = date.getFullYear(), 5250 month = date.getMonth(), 5251 day = date.getDate(), 5252 pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, 5253 matches = pattern.exec(offset); 5254 5255 while (matches) { 5256 switch (matches[2] || "d") { 5257 case "d" : case "D" : 5258 day += parseInt(matches[1],10); break; 5259 case "w" : case "W" : 5260 day += parseInt(matches[1],10) * 7; break; 5261 case "m" : case "M" : 5262 month += parseInt(matches[1],10); 5263 day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); 5264 break; 5265 case "y": case "Y" : 5266 year += parseInt(matches[1],10); 5267 day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); 5268 break; 5269 } 5270 matches = pattern.exec(offset); 5271 } 5272 return new Date(year, month, day); 5273 }, 5274 newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) : 5275 (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); 5276 5277 newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate); 5278 if (newDate) { 5279 newDate.setHours(0); 5280 newDate.setMinutes(0); 5281 newDate.setSeconds(0); 5282 newDate.setMilliseconds(0); 5283 } 5284 return this._daylightSavingAdjust(newDate); 5285 }, 5286 5287 /* Handle switch to/from daylight saving. 5288 * Hours may be non-zero on daylight saving cut-over: 5289 * > 12 when midnight changeover, but then cannot generate 5290 * midnight datetime, so jump to 1AM, otherwise reset. 5291 * @param date (Date) the date to check 5292 * @return (Date) the corrected date 5293 */ 5294 _daylightSavingAdjust: function(date) { 5295 if (!date) { 5296 return null; 5297 } 5298 date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); 5299 return date; 5300 }, 5301 5302 /* Set the date(s) directly. */ 5303 _setDate: function(inst, date, noChange) { 5304 var clear = !date, 5305 origMonth = inst.selectedMonth, 5306 origYear = inst.selectedYear, 5307 newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); 5308 5309 inst.selectedDay = inst.currentDay = newDate.getDate(); 5310 inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); 5311 inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); 5312 if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { 5313 this._notifyChange(inst); 5314 } 5315 this._adjustInstDate(inst); 5316 if (inst.input) { 5317 inst.input.val(clear ? "" : this._formatDate(inst)); 5318 } 5319 }, 5320 5321 /* Retrieve the date(s) directly. */ 5322 _getDate: function(inst) { 5323 var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null : 5324 this._daylightSavingAdjust(new Date( 5325 inst.currentYear, inst.currentMonth, inst.currentDay))); 5326 return startDate; 5327 }, 5328 5329 /* Attach the onxxx handlers. These are declared statically so 5330 * they work with static code transformers like Caja. 5331 */ 5332 _attachHandlers: function(inst) { 5333 var stepMonths = this._get(inst, "stepMonths"), 5334 id = "#" + inst.id.replace( /\\\\/g, "\\" ); 5335 inst.dpDiv.find("[data-handler]").map(function () { 5336 var handler = { 5337 prev: function () { 5338 $.datepicker._adjustDate(id, -stepMonths, "M"); 5339 }, 5340 next: function () { 5341 $.datepicker._adjustDate(id, +stepMonths, "M"); 5342 }, 5343 hide: function () { 5344 $.datepicker._hideDatepicker(); 5345 }, 5346 today: function () { 5347 $.datepicker._gotoToday(id); 5348 }, 5349 selectDay: function () { 5350 $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this); 5351 return false; 5352 }, 5353 selectMonth: function () { 5354 $.datepicker._selectMonthYear(id, this, "M"); 5355 return false; 5356 }, 5357 selectYear: function () { 5358 $.datepicker._selectMonthYear(id, this, "Y"); 5359 return false; 5360 } 5361 }; 5362 $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]); 5363 }); 5364 }, 5365 5366 /* Generate the HTML for the current state of the date picker. */ 5367 _generateHTML: function(inst) { 5368 var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, 5369 controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, 5370 monthNames, monthNamesShort, beforeShowDay, showOtherMonths, 5371 selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, 5372 cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, 5373 printDate, dRow, tbody, daySettings, otherMonth, unselectable, 5374 tempDate = new Date(), 5375 today = this._daylightSavingAdjust( 5376 new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time 5377 isRTL = this._get(inst, "isRTL"), 5378 showButtonPanel = this._get(inst, "showButtonPanel"), 5379 hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"), 5380 navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"), 5381 numMonths = this._getNumberOfMonths(inst), 5382 showCurrentAtPos = this._get(inst, "showCurrentAtPos"), 5383 stepMonths = this._get(inst, "stepMonths"), 5384 isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1), 5385 currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : 5386 new Date(inst.currentYear, inst.currentMonth, inst.currentDay))), 5387 minDate = this._getMinMaxDate(inst, "min"),
vendor: 9,139 bytes, lines 5388-5546
5388 maxDate = this._getMinMaxDate(inst, "max"), 5389 drawMonth = inst.drawMonth - showCurrentAtPos, 5390 drawYear = inst.drawYear; 5391 5392 if (drawMonth < 0) { 5393 drawMonth += 12; 5394 drawYear--; 5395 } 5396 if (maxDate) { 5397 maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), 5398 maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); 5399 maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); 5400 while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { 5401 drawMonth--; 5402 if (drawMonth < 0) { 5403 drawMonth = 11; 5404 drawYear--; 5405 } 5406 } 5407 } 5408 inst.drawMonth = drawMonth; 5409 inst.drawYear = drawYear; 5410 5411 prevText = this._get(inst, "prevText"); 5412 prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, 5413 this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), 5414 this._getFormatConfig(inst))); 5415 5416 prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? 5417 "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" + 5418 " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" : 5419 (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>")); 5420 5421 nextText = this._get(inst, "nextText"); 5422 nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, 5423 this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), 5424 this._getFormatConfig(inst))); 5425 5426 next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? 5427 "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" + 5428 " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" : 5429 (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>")); 5430 5431 currentText = this._get(inst, "currentText"); 5432 gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today); 5433 currentText = (!navigationAsDateFormat ? currentText : 5434 this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); 5435 5436 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'>" + 5437 this._get(inst, "closeText") + "</button>" : ""); 5438 5439 buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") + 5440 (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'" + 5441 ">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : ""; 5442 5443 firstDay = parseInt(this._get(inst, "firstDay"),10); 5444 firstDay = (isNaN(firstDay) ? 0 : firstDay); 5445 5446 showWeek = this._get(inst, "showWeek"); 5447 dayNames = this._get(inst, "dayNames"); 5448 dayNamesMin = this._get(inst, "dayNamesMin"); 5449 monthNames = this._get(inst, "monthNames"); 5450 monthNamesShort = this._get(inst, "monthNamesShort"); 5451 beforeShowDay = this._get(inst, "beforeShowDay"); 5452 showOtherMonths = this._get(inst, "showOtherMonths"); 5453 selectOtherMonths = this._get(inst, "selectOtherMonths"); 5454 defaultDate = this._getDefaultDate(inst); 5455 html = ""; 5456 dow; 5457 for (row = 0; row < numMonths[0]; row++) { 5458 group = ""; 5459 this.maxRows = 4; 5460 for (col = 0; col < numMonths[1]; col++) { 5461 selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); 5462 cornerClass = " ui-corner-all"; 5463 calender = ""; 5464 if (isMultiMonth) { 5465 calender += "<div class='ui-datepicker-group"; 5466 if (numMonths[1] > 1) { 5467 switch (col) { 5468 case 0: calender += " ui-datepicker-group-first"; 5469 cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break; 5470 case numMonths[1]-1: calender += " ui-datepicker-group-last"; 5471 cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break; 5472 default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break; 5473 } 5474 } 5475 calender += "'>"; 5476 } 5477 calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" + 5478 (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") + 5479 (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") + 5480 this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, 5481 row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers 5482 "</div><table class='ui-datepicker-calendar'><thead>" + 5483 "<tr>"; 5484 thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : ""); 5485 for (dow = 0; dow < 7; dow++) { // days of the week 5486 day = (dow + firstDay) % 7; 5487 thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + 5488 "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>"; 5489 } 5490 calender += thead + "</tr></thead><tbody>"; 5491 daysInMonth = this._getDaysInMonth(drawYear, drawMonth); 5492 if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { 5493 inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); 5494 } 5495 leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; 5496 curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate 5497 numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043) 5498 this.maxRows = numRows; 5499 printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); 5500 for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows 5501 calender += "<tr>"; 5502 tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" + 5503 this._get(inst, "calculateWeek")(printDate) + "</td>"); 5504 for (dow = 0; dow < 7; dow++) { // create date picker days 5505 daySettings = (beforeShowDay ? 5506 beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]); 5507 otherMonth = (printDate.getMonth() !== drawMonth); 5508 unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || 5509 (minDate && printDate < minDate) || (maxDate && printDate > maxDate); 5510 tbody += "<td class='" + 5511 ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends 5512 (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months 5513 ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key 5514 (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ? 5515 // or defaultDate is current printedDate and defaultDate is selectedDate 5516 " " + this._dayOverClass : "") + // highlight selected day 5517 (unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") + // highlight unselectable days 5518 (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates 5519 (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day 5520 (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different) 5521 ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "'") + "'" : "") + // cell title 5522 (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions 5523 (otherMonth && !showOtherMonths ? " " : // display for other months 5524 (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" + 5525 (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") + 5526 (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day 5527 (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months 5528 "' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date 5529 printDate.setDate(printDate.getDate() + 1); 5530 printDate = this._daylightSavingAdjust(printDate); 5531 } 5532 calender += tbody + "</tr>"; 5533 } 5534 drawMonth++; 5535 if (drawMonth > 11) { 5536 drawMonth = 0; 5537 drawYear++; 5538 } 5539 calender += "</tbody></table>" + (isMultiMonth ? "</div>" + 5540 ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : ""); 5541 group += calender; 5542 } 5543 html += group; 5544 } 5545 html += buttonPanel; 5546 inst._keyEvent = false;
vendor: 5,431 bytes, lines 5547-5690
5547 return html; 5548 }, 5549 5550 /* Generate the month and year header. */ 5551 _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, 5552 secondary, monthNames, monthNamesShort) { 5553 5554 var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, 5555 changeMonth = this._get(inst, "changeMonth"), 5556 changeYear = this._get(inst, "changeYear"), 5557 showMonthAfterYear = this._get(inst, "showMonthAfterYear"), 5558 html = "<div class='ui-datepicker-title'>", 5559 monthHtml = ""; 5560 5561 // month selection 5562 if (secondary || !changeMonth) { 5563 monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>"; 5564 } else { 5565 inMinYear = (minDate && minDate.getFullYear() === drawYear); 5566 inMaxYear = (maxDate && maxDate.getFullYear() === drawYear); 5567 monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>"; 5568 for ( month = 0; month < 12; month++) { 5569 if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) { 5570 monthHtml += "<option value='" + month + "'" + 5571 (month === drawMonth ? " selected='selected'" : "") + 5572 ">" + monthNamesShort[month] + "</option>"; 5573 } 5574 } 5575 monthHtml += "</select>"; 5576 } 5577 5578 if (!showMonthAfterYear) { 5579 html += monthHtml + (secondary || !(changeMonth && changeYear) ? " " : ""); 5580 } 5581 5582 // year selection 5583 if ( !inst.yearshtml ) { 5584 inst.yearshtml = ""; 5585 if (secondary || !changeYear) { 5586 html += "<span class='ui-datepicker-year'>" + drawYear + "</span>"; 5587 } else { 5588 // determine range of years to display 5589 years = this._get(inst, "yearRange").split(":"); 5590 thisYear = new Date().getFullYear(); 5591 determineYear = function(value) { 5592 var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) : 5593 (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) : 5594 parseInt(value, 10))); 5595 return (isNaN(year) ? thisYear : year); 5596 }; 5597 year = determineYear(years[0]); 5598 endYear = Math.max(year, determineYear(years[1] || "")); 5599 year = (minDate ? Math.max(year, minDate.getFullYear()) : year); 5600 endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); 5601 inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>"; 5602 for (; year <= endYear; year++) { 5603 inst.yearshtml += "<option value='" + year + "'" + 5604 (year === drawYear ? " selected='selected'" : "") + 5605 ">" + year + "</option>"; 5606 } 5607 inst.yearshtml += "</select>"; 5608 5609 html += inst.yearshtml; 5610 inst.yearshtml = null; 5611 } 5612 } 5613 5614 html += this._get(inst, "yearSuffix"); 5615 if (showMonthAfterYear) { 5616 html += (secondary || !(changeMonth && changeYear) ? " " : "") + monthHtml; 5617 } 5618 html += "</div>"; // Close datepicker_header 5619 return html; 5620 }, 5621 5622 /* Adjust one of the date sub-fields. */ 5623 _adjustInstDate: function(inst, offset, period) { 5624 var year = inst.drawYear + (period === "Y" ? offset : 0), 5625 month = inst.drawMonth + (period === "M" ? offset : 0), 5626 day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0), 5627 date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))); 5628 5629 inst.selectedDay = date.getDate(); 5630 inst.drawMonth = inst.selectedMonth = date.getMonth(); 5631 inst.drawYear = inst.selectedYear = date.getFullYear(); 5632 if (period === "M" || period === "Y") { 5633 this._notifyChange(inst); 5634 } 5635 }, 5636 5637 /* Ensure a date is within any min/max bounds. */ 5638 _restrictMinMax: function(inst, date) { 5639 var minDate = this._getMinMaxDate(inst, "min"), 5640 maxDate = this._getMinMaxDate(inst, "max"), 5641 newDate = (minDate && date < minDate ? minDate : date); 5642 return (maxDate && newDate > maxDate ? maxDate : newDate); 5643 }, 5644 5645 /* Notify change of month/year. */ 5646 _notifyChange: function(inst) { 5647 var onChange = this._get(inst, "onChangeMonthYear"); 5648 if (onChange) { 5649 onChange.apply((inst.input ? inst.input[0] : null), 5650 [inst.selectedYear, inst.selectedMonth + 1, inst]); 5651 } 5652 }, 5653 5654 /* Determine the number of months to show. */ 5655 _getNumberOfMonths: function(inst) { 5656 var numMonths = this._get(inst, "numberOfMonths"); 5657 return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths)); 5658 }, 5659 5660 /* Determine the current maximum date - ensure no time components are set. */ 5661 _getMinMaxDate: function(inst, minMax) { 5662 return this._determineDate(inst, this._get(inst, minMax + "Date"), null); 5663 }, 5664 5665 /* Find the number of days in a given month. */ 5666 _getDaysInMonth: function(year, month) { 5667 return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); 5668 }, 5669 5670 /* Find the day of the week of the first of a month. */ 5671 _getFirstDayOfMonth: function(year, month) { 5672 return new Date(year, month, 1).getDay(); 5673 }, 5674 5675 /* Determines if we should allow a "next/prev" month display change. */ 5676 _canAdjustMonth: function(inst, offset, curYear, curMonth) { 5677 var numMonths = this._getNumberOfMonths(inst), 5678 date = this._daylightSavingAdjust(new Date(curYear, 5679 curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); 5680 5681 if (offset < 0) { 5682 date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); 5683 } 5684 return this._isInRange(inst, date); 5685 }, 5686 5687 /* Is the given date in the accepted range? */ 5688 _isInRange: function(inst, date) { 5689 var yearSplit, currentYear, 5690 minDate = this._getMinMaxDate(inst, "min"),
vendor: 4,921 bytes, lines 5691-5823
5691 maxDate = this._getMinMaxDate(inst, "max"), 5692 minYear = null, 5693 maxYear = null, 5694 years = this._get(inst, "yearRange"); 5695 if (years){ 5696 yearSplit = years.split(":"); 5697 currentYear = new Date().getFullYear(); 5698 minYear = parseInt(yearSplit[0], 10); 5699 maxYear = parseInt(yearSplit[1], 10); 5700 if ( yearSplit[0].match(/[+\-].*/) ) { 5701 minYear += currentYear; 5702 } 5703 if ( yearSplit[1].match(/[+\-].*/) ) { 5704 maxYear += currentYear; 5705 } 5706 } 5707 5708 return ((!minDate || date.getTime() >= minDate.getTime()) && 5709 (!maxDate || date.getTime() <= maxDate.getTime()) && 5710 (!minYear || date.getFullYear() >= minYear) && 5711 (!maxYear || date.getFullYear() <= maxYear)); 5712 }, 5713 5714 /* Provide the configuration settings for formatting/parsing. */ 5715 _getFormatConfig: function(inst) { 5716 var shortYearCutoff = this._get(inst, "shortYearCutoff"); 5717 shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff : 5718 new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); 5719 return {shortYearCutoff: shortYearCutoff, 5720 dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"), 5721 monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")}; 5722 }, 5723 5724 /* Format the given date for display. */ 5725 _formatDate: function(inst, day, month, year) { 5726 if (!day) { 5727 inst.currentDay = inst.selectedDay; 5728 inst.currentMonth = inst.selectedMonth; 5729 inst.currentYear = inst.selectedYear; 5730 } 5731 var date = (day ? (typeof day === "object" ? day : 5732 this._daylightSavingAdjust(new Date(year, month, day))) : 5733 this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); 5734 return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst)); 5735 } 5736}); 5737 5738/* 5739 * Bind hover events for datepicker elements. 5740 * Done via delegate so the binding only occurs once in the lifetime of the parent div. 5741 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. 5742 */ 5743function datepicker_bindHover(dpDiv) { 5744 var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; 5745 return dpDiv.delegate(selector, "mouseout", function() { 5746 $(this).removeClass("ui-state-hover"); 5747 if (this.className.indexOf("ui-datepicker-prev") !== -1) { 5748 $(this).removeClass("ui-datepicker-prev-hover"); 5749 } 5750 if (this.className.indexOf("ui-datepicker-next") !== -1) { 5751 $(this).removeClass("ui-datepicker-next-hover"); 5752 } 5753 }) 5754 .delegate( selector, "mouseover", datepicker_handleMouseover ); 5755} 5756 5757function datepicker_handleMouseover() { 5758 if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) { 5759 $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); 5760 $(this).addClass("ui-state-hover"); 5761 if (this.className.indexOf("ui-datepicker-prev") !== -1) { 5762 $(this).addClass("ui-datepicker-prev-hover"); 5763 } 5764 if (this.className.indexOf("ui-datepicker-next") !== -1) { 5765 $(this).addClass("ui-datepicker-next-hover"); 5766 } 5767 } 5768} 5769 5770/* jQuery extend now ignores nulls! */ 5771function datepicker_extendRemove(target, props) { 5772 $.extend(target, props); 5773 for (var name in props) { 5774 if (props[name] == null) { 5775 target[name] = props[name]; 5776 } 5777 } 5778 return target; 5779} 5780 5781/* Invoke the datepicker functionality. 5782 @param options string - a command, optionally followed by additional parameters or 5783 Object - settings for attaching new datepicker functionality 5784 @return jQuery object */ 5785$.fn.datepicker = function(options){ 5786 5787 /* Verify an empty collection wasn't passed - Fixes #6976 */ 5788 if ( !this.length ) { 5789 return this; 5790 } 5791 5792 /* Initialise the date picker. */ 5793 if (!$.datepicker.initialized) { 5794 $(document).mousedown($.datepicker._checkExternalClick); 5795 $.datepicker.initialized = true; 5796 } 5797 5798 /* Append datepicker main container to body if not exist. */ 5799 if ($("#"+$.datepicker._mainDivId).length === 0) { 5800 $("body").append($.datepicker.dpDiv); 5801 } 5802 5803 var otherArgs = Array.prototype.slice.call(arguments, 1); 5804 if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) { 5805 return $.datepicker["_" + options + "Datepicker"]. 5806 apply($.datepicker, [this[0]].concat(otherArgs)); 5807 } 5808 if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") { 5809 return $.datepicker["_" + options + "Datepicker"]. 5810 apply($.datepicker, [this[0]].concat(otherArgs)); 5811 } 5812 return this.each(function() { 5813 typeof options === "string" ? 5814 $.datepicker["_" + options + "Datepicker"]. 5815 apply($.datepicker, [this].concat(otherArgs)) : 5816 $.datepicker._attachDatepicker(this, options); 5817 }); 5818}; 5819 5820$.datepicker = new Datepicker(); // singleton instance 5821$.datepicker.initialized = false; 5822$.datepicker.uuid = new Date().getTime(); 5823$.datepicker.version = "1.11.
58232"; 5824 5825var datepicker = $.datepicker; 5826 5827 5828/*! 5829 * jQuery UI Draggable 1.11.2 5830 * http://jqueryui.com 5831 * 5832 * Copyright 2014 jQuery Foundation and other contributors 5833 * Released under the MIT license. 5834 * http://jquery.org/license 5835 * 5836 * http://api.jqueryui.com/draggable/ 5837 */ 5838 5839 5840$.widget("ui.draggable", $.ui.mouse, { 5841 version: "1.11.2
vendor: 23,732 bytes, lines 5841-6615
5841", 5842 widgetEventPrefix: "drag", 5843 options: { 5844 addClasses: true, 5845 appendTo: "parent", 5846 axis: false, 5847 connectToSortable: false, 5848 containment: false, 5849 cursor: "auto", 5850 cursorAt: false, 5851 grid: false, 5852 handle: false, 5853 helper: "original", 5854 iframeFix: false, 5855 opacity: false, 5856 refreshPositions: false, 5857 revert: false, 5858 revertDuration: 500, 5859 scope: "default", 5860 scroll: true, 5861 scrollSensitivity: 20, 5862 scrollSpeed: 20, 5863 snap: false, 5864 snapMode: "both", 5865 snapTolerance: 20, 5866 stack: false, 5867 zIndex: false, 5868 5869 // callbacks 5870 drag: null, 5871 start: null, 5872 stop: null 5873 }, 5874 _create: function() { 5875 5876 if ( this.options.helper === "original" ) { 5877 this._setPositionRelative(); 5878 } 5879 if (this.options.addClasses){ 5880 this.element.addClass("ui-draggable"); 5881 } 5882 if (this.options.disabled){ 5883 this.element.addClass("ui-draggable-disabled"); 5884 } 5885 this._setHandleClassName(); 5886 5887 this._mouseInit(); 5888 }, 5889 5890 _setOption: function( key, value ) { 5891 this._super( key, value ); 5892 if ( key === "handle" ) { 5893 this._removeHandleClassName(); 5894 this._setHandleClassName(); 5895 } 5896 }, 5897 5898 _destroy: function() { 5899 if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { 5900 this.destroyOnClear = true; 5901 return; 5902 } 5903 this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); 5904 this._removeHandleClassName(); 5905 this._mouseDestroy(); 5906 }, 5907 5908 _mouseCapture: function(event) { 5909 var o = this.options; 5910 5911 this._blurActiveElement( event ); 5912 5913 // among others, prevent a drag on a resizable-handle 5914 if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { 5915 return false; 5916 } 5917 5918 //Quit if we're not on a valid handle 5919 this.handle = this._getHandle(event); 5920 if (!this.handle) { 5921 return false; 5922 } 5923 5924 this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); 5925 5926 return true; 5927 5928 }, 5929 5930 _blockFrames: function( selector ) { 5931 this.iframeBlocks = this.document.find( selector ).map(function() { 5932 var iframe = $( this ); 5933 5934 return $( "<div>" ) 5935 .css( "position", "absolute" ) 5936 .appendTo( iframe.parent() ) 5937 .outerWidth( iframe.outerWidth() ) 5938 .outerHeight( iframe.outerHeight() ) 5939 .offset( iframe.offset() )[ 0 ]; 5940 }); 5941 }, 5942 5943 _unblockFrames: function() { 5944 if ( this.iframeBlocks ) { 5945 this.iframeBlocks.remove(); 5946 delete this.iframeBlocks; 5947 } 5948 }, 5949 5950 _blurActiveElement: function( event ) { 5951 var document = this.document[ 0 ]; 5952 5953 // Only need to blur if the event occurred on the draggable itself, see #10527 5954 if ( !this.handleElement.is( event.target ) ) { 5955 return; 5956 } 5957 5958 // support: IE9 5959 // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> 5960 try { 5961 5962 // Support: IE9, IE10 5963 // If the <body> is blurred, IE will switch windows, see #9520 5964 if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) { 5965 5966 // Blur any element that currently has focus, see #4261 5967 $( document.activeElement ).blur(); 5968 } 5969 } catch ( error ) {} 5970 }, 5971 5972 _mouseStart: function(event) { 5973 5974 var o = this.options; 5975 5976 //Create and append the visible helper 5977 this.helper = this._createHelper(event); 5978 5979 this.helper.addClass("ui-draggable-dragging"); 5980 5981 //Cache the helper size 5982 this._cacheHelperProportions(); 5983 5984 //If ddmanager is used for droppables, set the global draggable 5985 if ($.ui.ddmanager) { 5986 $.ui.ddmanager.current = this; 5987 } 5988 5989 /* 5990 * - Position generation - 5991 * This block generates everything position related - it's the core of draggables. 5992 */ 5993 5994 //Cache the margins of the original element 5995 this._cacheMargins(); 5996 5997 //Store the helper's css position 5998 this.cssPosition = this.helper.css( "position" ); 5999 this.scrollParent = this.helper.scrollParent( true ); 6000 this.offsetParent = this.helper.offsetParent(); 6001 this.hasFixedAncestor = this.helper.parents().filter(function() { 6002 return $( this ).css( "position" ) === "fixed"; 6003 }).length > 0; 6004 6005 //The element's absolute position on the page minus margins 6006 this.positionAbs = this.element.offset(); 6007 this._refreshOffsets( event ); 6008 6009 //Generate the original position 6010 this.originalPosition = this.position = this._generatePosition( event, false ); 6011 this.originalPageX = event.pageX; 6012 this.originalPageY = event.pageY; 6013 6014 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied 6015 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); 6016 6017 //Set a containment if given in the options 6018 this._setContainment(); 6019 6020 //Trigger event + callbacks 6021 if (this._trigger("start", event) === false) { 6022 this._clear(); 6023 return false; 6024 } 6025 6026 //Recache the helper size 6027 this._cacheHelperProportions(); 6028 6029 //Prepare the droppable offsets 6030 if ($.ui.ddmanager && !o.dropBehaviour) { 6031 $.ui.ddmanager.prepareOffsets(this, event); 6032 } 6033 6034 // Reset helper's right/bottom css if they're set and set explicit width/height instead 6035 // as this prevents resizing of elements with right/bottom set (see #7772) 6036 this._normalizeRightBottom(); 6037 6038 this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position 6039 6040 //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003) 6041 if ( $.ui.ddmanager ) { 6042 $.ui.ddmanager.dragStart(this, event); 6043 } 6044 6045 return true; 6046 }, 6047 6048 _refreshOffsets: function( event ) { 6049 this.offset = { 6050 top: this.positionAbs.top - this.margins.top, 6051 left: this.positionAbs.left - this.margins.left, 6052 scroll: false, 6053 parent: this._getParentOffset(), 6054 relative: this._getRelativeOffset() 6055 }; 6056 6057 this.offset.click = { 6058 left: event.pageX - this.offset.left, 6059 top: event.pageY - this.offset.top 6060 }; 6061 }, 6062 6063 _mouseDrag: function(event, noPropagation) { 6064 // reset any necessary cached properties (see #5009) 6065 if ( this.hasFixedAncestor ) { 6066 this.offset.parent = this._getParentOffset(); 6067 } 6068 6069 //Compute the helpers position 6070 this.position = this._generatePosition( event, true ); 6071 this.positionAbs = this._convertPositionTo("absolute"); 6072 6073 //Call plugins and callbacks and use the resulting position if something is returned 6074 if (!noPropagation) { 6075 var ui = this._uiHash(); 6076 if (this._trigger("drag", event, ui) === false) { 6077 this._mouseUp({}); 6078 return false; 6079 } 6080 this.position = ui.position; 6081 } 6082 6083 this.helper[ 0 ].style.left = this.position.left + "px"; 6084 this.helper[ 0 ].style.top = this.position.top + "px"; 6085 6086 if ($.ui.ddmanager) { 6087 $.ui.ddmanager.drag(this, event); 6088 } 6089 6090 return false; 6091 }, 6092 6093 _mouseStop: function(event) { 6094 6095 //If we are using droppables, inform the manager about the drop 6096 var that = this, 6097 dropped = false; 6098 if ($.ui.ddmanager && !this.options.dropBehaviour) { 6099 dropped = $.ui.ddmanager.drop(this, event); 6100 } 6101 6102 //if a drop comes from outside (a sortable) 6103 if (this.dropped) { 6104 dropped = this.dropped; 6105 this.dropped = false; 6106 } 6107 6108 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))) { 6109 $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { 6110 if (that._trigger("stop", event) !== false) { 6111 that._clear(); 6112 } 6113 }); 6114 } else { 6115 if (this._trigger("stop", event) !== false) { 6116 this._clear(); 6117 } 6118 } 6119 6120 return false; 6121 }, 6122 6123 _mouseUp: function( event ) { 6124 this._unblockFrames(); 6125 6126 //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003) 6127 if ( $.ui.ddmanager ) { 6128 $.ui.ddmanager.dragStop(this, event); 6129 } 6130 6131 // Only need to focus if the event occurred on the draggable itself, see #10527 6132 if ( this.handleElement.is( event.target ) ) { 6133 // The interaction is over; whether or not the click resulted in a drag, focus the element 6134 this.element.focus(); 6135 } 6136 6137 return $.ui.mouse.prototype._mouseUp.call(this, event); 6138 }, 6139 6140 cancel: function() { 6141 6142 if (this.helper.is(".ui-draggable-dragging")) { 6143 this._mouseUp({}); 6144 } else { 6145 this._clear(); 6146 } 6147 6148 return this; 6149 6150 }, 6151 6152 _getHandle: function(event) { 6153 return this.options.handle ? 6154 !!$( event.target ).closest( this.element.find( this.options.handle ) ).length : 6155 true; 6156 }, 6157 6158 _setHandleClassName: function() { 6159 this.handleElement = this.options.handle ? 6160 this.element.find( this.options.handle ) : this.element; 6161 this.handleElement.addClass( "ui-draggable-handle" ); 6162 }, 6163 6164 _removeHandleClassName: function() { 6165 this.handleElement.removeClass( "ui-draggable-handle" ); 6166 }, 6167 6168 _createHelper: function(event) { 6169 6170 var o = this.options, 6171 helperIsFunction = $.isFunction( o.helper ), 6172 helper = helperIsFunction ? 6173 $( o.helper.apply( this.element[ 0 ], [ event ] ) ) : 6174 ( o.helper === "clone" ? 6175 this.element.clone().removeAttr( "id" ) : 6176 this.element ); 6177 6178 if (!helper.parents("body").length) { 6179 helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo)); 6180 } 6181 6182 // http://bugs.jqueryui.com/ticket/9446 6183 // a helper function can return the original element 6184 // which wouldn't have been set to relative in _create 6185 if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) { 6186 this._setPositionRelative(); 6187 } 6188 6189 if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) { 6190 helper.css("position", "absolute"); 6191 } 6192 6193 return helper; 6194 6195 }, 6196 6197 _setPositionRelative: function() { 6198 if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) { 6199 this.element[ 0 ].style.position = "relative"; 6200 } 6201 }, 6202 6203 _adjustOffsetFromHelper: function(obj) { 6204 if (typeof obj === "string") { 6205 obj = obj.split(" "); 6206 } 6207 if ($.isArray(obj)) { 6208 obj = { left: +obj[0], top: +obj[1] || 0 }; 6209 } 6210 if ("left" in obj) { 6211 this.offset.click.left = obj.left + this.margins.left; 6212 } 6213 if ("right" in obj) { 6214 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; 6215 } 6216 if ("top" in obj) { 6217 this.offset.click.top = obj.top + this.margins.top; 6218 } 6219 if ("bottom" in obj) { 6220 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; 6221 } 6222 }, 6223 6224 _isRootNode: function( element ) { 6225 return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ]; 6226 }, 6227 6228 _getParentOffset: function() { 6229 6230 //Get the offsetParent and cache its position 6231 var po = this.offsetParent.offset(), 6232 document = this.document[ 0 ]; 6233 6234 // This is a special case where we need to modify a offset calculated on start, since the following happened: 6235 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent 6236 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that 6237 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag 6238 if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { 6239 po.left += this.scrollParent.scrollLeft(); 6240 po.top += this.scrollParent.scrollTop(); 6241 } 6242 6243 if ( this._isRootNode( this.offsetParent[ 0 ] ) ) { 6244 po = { top: 0, left: 0 }; 6245 } 6246 6247 return { 6248 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0), 6249 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0) 6250 }; 6251 6252 }, 6253 6254 _getRelativeOffset: function() { 6255 if ( this.cssPosition !== "relative" ) { 6256 return { top: 0, left: 0 }; 6257 } 6258 6259 var p = this.element.position(), 6260 scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); 6261 6262 return { 6263 top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ), 6264 left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 ) 6265 }; 6266 6267 }, 6268 6269 _cacheMargins: function() { 6270 this.margins = { 6271 left: (parseInt(this.element.css("marginLeft"), 10) || 0), 6272 top: (parseInt(this.element.css("marginTop"), 10) || 0), 6273 right: (parseInt(this.element.css("marginRight"), 10) || 0), 6274 bottom: (parseInt(this.element.css("marginBottom"), 10) || 0) 6275 }; 6276 }, 6277 6278 _cacheHelperProportions: function() { 6279 this.helperProportions = { 6280 width: this.helper.outerWidth(), 6281 height: this.helper.outerHeight() 6282 }; 6283 }, 6284 6285 _setContainment: function() { 6286 6287 var isUserScrollable, c, ce, 6288 o = this.options, 6289 document = this.document[ 0 ]; 6290 6291 this.relativeContainer = null; 6292 6293 if ( !o.containment ) { 6294 this.containment = null; 6295 return; 6296 } 6297 6298 if ( o.containment === "window" ) { 6299 this.containment = [ 6300 $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, 6301 $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, 6302 $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left, 6303 $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top 6304 ]; 6305 return; 6306 } 6307 6308 if ( o.containment === "document") { 6309 this.containment = [ 6310 0, 6311 0, 6312 $( document ).width() - this.helperProportions.width - this.margins.left, 6313 ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top 6314 ]; 6315 return; 6316 } 6317 6318 if ( o.containment.constructor === Array ) { 6319 this.containment = o.containment; 6320 return; 6321 } 6322 6323 if ( o.containment === "parent" ) { 6324 o.containment = this.helper[ 0 ].parentNode; 6325 } 6326 6327 c = $( o.containment ); 6328 ce = c[ 0 ]; 6329 6330 if ( !ce ) { 6331 return; 6332 } 6333 6334 isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) ); 6335 6336 this.containment = [ 6337 ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), 6338 ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ), 6339 ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - 6340 ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - 6341 ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - 6342 this.helperProportions.width - 6343 this.margins.left - 6344 this.margins.right, 6345 ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - 6346 ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - 6347 ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - 6348 this.helperProportions.height - 6349 this.margins.top - 6350 this.margins.bottom 6351 ]; 6352 this.relativeContainer = c; 6353 }, 6354 6355 _convertPositionTo: function(d, pos) { 6356 6357 if (!pos) { 6358 pos = this.position; 6359 } 6360 6361 var mod = d === "absolute" ? 1 : -1, 6362 scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); 6363 6364 return { 6365 top: ( 6366 pos.top + // The absolute mouse position 6367 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent 6368 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) 6369 ( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod) 6370 ), 6371 left: ( 6372 pos.left + // The absolute mouse position 6373 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent 6374 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) 6375 ( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod) 6376 ) 6377 }; 6378 6379 }, 6380 6381 _generatePosition: function( event, constrainPosition ) { 6382 6383 var containment, co, top, left, 6384 o = this.options, 6385 scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ), 6386 pageX = event.pageX, 6387 pageY = event.pageY; 6388 6389 // Cache the scroll 6390 if ( !scrollIsRootNode || !this.offset.scroll ) { 6391 this.offset.scroll = { 6392 top: this.scrollParent.scrollTop(), 6393 left: this.scrollParent.scrollLeft() 6394 }; 6395 } 6396 6397 /* 6398 * - Position constraining - 6399 * Constrain the position to a mix of grid, containment. 6400 */ 6401 6402 // If we are not dragging yet, we won't check for options 6403 if ( constrainPosition ) { 6404 if ( this.containment ) { 6405 if ( this.relativeContainer ){ 6406 co = this.relativeContainer.offset(); 6407 containment = [ 6408 this.containment[ 0 ] + co.left, 6409 this.containment[ 1 ] + co.top, 6410 this.containment[ 2 ] + co.left, 6411 this.containment[ 3 ] + co.top 6412 ]; 6413 } else { 6414 containment = this.containment; 6415 } 6416 6417 if (event.pageX - this.offset.click.left < containment[0]) { 6418 pageX = containment[0] + this.offset.click.left; 6419 } 6420 if (event.pageY - this.offset.click.top < containment[1]) { 6421 pageY = containment[1] + this.offset.click.top; 6422 } 6423 if (event.pageX - this.offset.click.left > containment[2]) { 6424 pageX = containment[2] + this.offset.click.left; 6425 } 6426 if (event.pageY - this.offset.click.top > containment[3]) { 6427 pageY = containment[3] + this.offset.click.top; 6428 } 6429 } 6430 6431 if (o.grid) { 6432 //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950) 6433 top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY; 6434 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; 6435 6436 left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX; 6437 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; 6438 } 6439 6440 if ( o.axis === "y" ) { 6441 pageX = this.originalPageX; 6442 } 6443 6444 if ( o.axis === "x" ) { 6445 pageY = this.originalPageY; 6446 } 6447 } 6448 6449 return { 6450 top: ( 6451 pageY - // The absolute mouse position 6452 this.offset.click.top - // Click offset (relative to the element) 6453 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent 6454 this.offset.parent.top + // The offsetParent's offset without borders (offset + border) 6455 ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) 6456 ), 6457 left: ( 6458 pageX - // The absolute mouse position 6459 this.offset.click.left - // Click offset (relative to the element) 6460 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent 6461 this.offset.parent.left + // The offsetParent's offset without borders (offset + border) 6462 ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) 6463 ) 6464 }; 6465 6466 }, 6467 6468 _clear: function() { 6469 this.helper.removeClass("ui-draggable-dragging"); 6470 if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { 6471 this.helper.remove(); 6472 } 6473 this.helper = null; 6474 this.cancelHelperRemoval = false; 6475 if ( this.destroyOnClear ) { 6476 this.destroy(); 6477 } 6478 }, 6479 6480 _normalizeRightBottom: function() { 6481 if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) { 6482 this.helper.width( this.helper.width() ); 6483 this.helper.css( "right", "auto" ); 6484 } 6485 if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) { 6486 this.helper.height( this.helper.height() ); 6487 this.helper.css( "bottom", "auto" ); 6488 } 6489 }, 6490 6491 // From now on bulk stuff - mainly helpers 6492 6493 _trigger: function( type, event, ui ) { 6494 ui = ui || this._uiHash(); 6495 $.ui.plugin.call( this, type, [ event, ui, this ], true ); 6496 6497 // Absolute position and offset (see #6884 ) have to be recalculated after plugins 6498 if ( /^(drag|start|stop)/.test( type ) ) { 6499 this.positionAbs = this._convertPositionTo( "absolute" ); 6500 ui.offset = this.positionAbs; 6501 } 6502 return $.Widget.prototype._trigger.call( this, type, event, ui ); 6503 }, 6504 6505 plugins: {}, 6506 6507 _uiHash: function() { 6508 return { 6509 helper: this.helper, 6510 position: this.position, 6511 originalPosition: this.originalPosition, 6512 offset: this.positionAbs 6513 }; 6514 } 6515 6516}); 6517 6518$.ui.plugin.add( "draggable", "connectToSortable", { 6519 start: function( event, ui, draggable ) { 6520 var uiSortable = $.extend( {}, ui, { 6521 item: draggable.element 6522 }); 6523 6524 draggable.sortables = []; 6525 $( draggable.options.connectToSortable ).each(function() { 6526 var sortable = $( this ).sortable( "instance" ); 6527 6528 if ( sortable && !sortable.options.disabled ) { 6529 draggable.sortables.push( sortable ); 6530 6531 // refreshPositions is called at drag start to refresh the containerCache 6532 // which is used in drag. This ensures it's initialized and synchronized 6533 // with any changes that might have happened on the page since initialization. 6534 sortable.refreshPositions(); 6535 sortable._trigger("activate", event, uiSortable); 6536 } 6537 }); 6538 }, 6539 stop: function( event, ui, draggable ) { 6540 var uiSortable = $.extend( {}, ui, { 6541 item: draggable.element 6542 }); 6543 6544 draggable.cancelHelperRemoval = false; 6545 6546 $.each( draggable.sortables, function() { 6547 var sortable = this; 6548 6549 if ( sortable.isOver ) { 6550 sortable.isOver = 0; 6551 6552 // Allow this sortable to handle removing the helper 6553 draggable.cancelHelperRemoval = true; 6554 sortable.cancelHelperRemoval = false; 6555 6556 // Use _storedCSS To restore properties in the sortable, 6557 // as this also handles revert (#9675) since the draggable 6558 // may have modified them in unexpected ways (#8809) 6559 sortable._storedCSS = { 6560 position: sortable.placeholder.css( "position" ), 6561 top: sortable.placeholder.css( "top" ), 6562 left: sortable.placeholder.css( "left" ) 6563 }; 6564 6565 sortable._mouseStop(event); 6566 6567 // Once drag has ended, the sortable should return to using 6568 // its original helper, not the shared helper from draggable 6569 sortable.options.helper = sortable.options._helper; 6570 } else { 6571 // Prevent this Sortable from removing the helper. 6572 // However, don't set the draggable to remove the helper 6573 // either as another connected Sortable may yet handle the removal. 6574 sortable.cancelHelperRemoval = true; 6575 6576 sortable._trigger( "deactivate", event, uiSortable ); 6577 } 6578 }); 6579 }, 6580 drag: function( event, ui, draggable ) { 6581 $.each( draggable.sortables, function() { 6582 var innermostIntersecting = false, 6583 sortable = this; 6584 6585 // Copy over variables that sortable's _intersectsWith uses 6586 sortable.positionAbs = draggable.positionAbs; 6587 sortable.helperProportions = draggable.helperProportions; 6588 sortable.offset.click = draggable.offset.click; 6589 6590 if ( sortable._intersectsWith( sortable.containerCache ) ) { 6591 innermostIntersecting = true; 6592 6593 $.each( draggable.sortables, function() { 6594 // Copy over variables that sortable's _intersectsWith uses 6595 this.positionAbs = draggable.positionAbs; 6596 this.helperProportions = draggable.helperProportions; 6597 this.offset.click = draggable.offset.click; 6598 6599 if ( this !== sortable && 6600 this._intersectsWith( this.containerCache ) && 6601 $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) { 6602 innermostIntersecting = false; 6603 } 6604 6605 return innermostIntersecting; 6606 }); 6607 } 6608 6609 if ( innermostIntersecting ) { 6610 // If it intersects, we use a little isOver variable and set it once, 6611 // so that the move-in stuff gets fired only once. 6612 if ( !sortable.isOver ) { 6613 sortable.isOver = 1; 6614 6615
6615sortable.currentItem = ui.helper 6616 .appendTo( sortable.element ) 6617 .data( "ui-sortable-item", true ); 6618 6619 // Store helper option to later restore it
vendor: 10,652 bytes, lines 6620-6954
6620 sortable.options._helper = sortable.options.helper; 6621 6622 sortable.options.helper = function() { 6623 return ui.helper[ 0 ]; 6624 }; 6625 6626 // Fire the start events of the sortable with our passed browser event, 6627 // and our own helper (so it doesn't create a new one) 6628 event.target = sortable.currentItem[ 0 ]; 6629 sortable._mouseCapture( event, true ); 6630 sortable._mouseStart( event, true, true ); 6631 6632 // Because the browser event is way off the new appended portlet, 6633 // modify necessary variables to reflect the changes 6634 sortable.offset.click.top = draggable.offset.click.top; 6635 sortable.offset.click.left = draggable.offset.click.left; 6636 sortable.offset.parent.left -= draggable.offset.parent.left - 6637 sortable.offset.parent.left; 6638 sortable.offset.parent.top -= draggable.offset.parent.top - 6639 sortable.offset.parent.top; 6640 6641 draggable._trigger( "toSortable", event ); 6642 6643 // Inform draggable that the helper is in a valid drop zone, 6644 // used solely in the revert option to handle "valid/invalid". 6645 draggable.dropped = sortable.element; 6646 6647 // Need to refreshPositions of all sortables in the case that 6648 // adding to one sortable changes the location of the other sortables (#9675) 6649 $.each( draggable.sortables, function() { 6650 this.refreshPositions(); 6651 }); 6652 6653 // hack so receive/update callbacks work (mostly) 6654 draggable.currentItem = draggable.element; 6655 sortable.fromOutside = draggable; 6656 } 6657 6658 if ( sortable.currentItem ) { 6659 sortable._mouseDrag( event ); 6660 // Copy the sortable's position because the draggable's can potentially reflect 6661 // a relative position, while sortable is always absolute, which the dragged 6662 // element has now become. (#8809) 6663 ui.position = sortable.position; 6664 } 6665 } else { 6666 // If it doesn't intersect with the sortable, and it intersected before, 6667 // we fake the drag stop of the sortable, but make sure it doesn't remove 6668 // the helper by using cancelHelperRemoval. 6669 if ( sortable.isOver ) { 6670 6671 sortable.isOver = 0; 6672 sortable.cancelHelperRemoval = true; 6673 6674 // Calling sortable's mouseStop would trigger a revert, 6675 // so revert must be temporarily false until after mouseStop is called. 6676 sortable.options._revert = sortable.options.revert; 6677 sortable.options.revert = false; 6678 6679 sortable._trigger( "out", event, sortable._uiHash( sortable ) ); 6680 sortable._mouseStop( event, true ); 6681 6682 // restore sortable behaviors that were modfied 6683 // when the draggable entered the sortable area (#9481) 6684 sortable.options.revert = sortable.options._revert; 6685 sortable.options.helper = sortable.options._helper; 6686 6687 if ( sortable.placeholder ) { 6688 sortable.placeholder.remove(); 6689 } 6690 6691 // Recalculate the draggable's offset considering the sortable 6692 // may have modified them in unexpected ways (#8809) 6693 draggable._refreshOffsets( event ); 6694 ui.position = draggable._generatePosition( event, true ); 6695 6696 draggable._trigger( "fromSortable", event ); 6697 6698 // Inform draggable that the helper is no longer in a valid drop zone 6699 draggable.dropped = false; 6700 6701 // Need to refreshPositions of all sortables just in case removing 6702 // from one sortable changes the location of other sortables (#9675) 6703 $.each( draggable.sortables, function() { 6704 this.refreshPositions(); 6705 }); 6706 } 6707 } 6708 }); 6709 } 6710}); 6711 6712$.ui.plugin.add("draggable", "cursor", { 6713 start: function( event, ui, instance ) { 6714 var t = $( "body" ), 6715 o = instance.options; 6716 6717 if (t.css("cursor")) { 6718 o._cursor = t.css("cursor"); 6719 } 6720 t.css("cursor", o.cursor); 6721 }, 6722 stop: function( event, ui, instance ) { 6723 var o = instance.options; 6724 if (o._cursor) { 6725 $("body").css("cursor", o._cursor); 6726 } 6727 } 6728}); 6729 6730$.ui.plugin.add("draggable", "opacity", { 6731 start: function( event, ui, instance ) { 6732 var t = $( ui.helper ), 6733 o = instance.options; 6734 if (t.css("opacity")) { 6735 o._opacity = t.css("opacity"); 6736 } 6737 t.css("opacity", o.opacity); 6738 }, 6739 stop: function( event, ui, instance ) { 6740 var o = instance.options; 6741 if (o._opacity) { 6742 $(ui.helper).css("opacity", o._opacity); 6743 } 6744 } 6745}); 6746 6747$.ui.plugin.add("draggable", "scroll", { 6748 start: function( event, ui, i ) { 6749 if ( !i.scrollParentNotHidden ) { 6750 i.scrollParentNotHidden = i.helper.scrollParent( false ); 6751 } 6752 6753 if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) { 6754 i.overflowOffset = i.scrollParentNotHidden.offset(); 6755 } 6756 }, 6757 drag: function( event, ui, i ) { 6758 6759 var o = i.options, 6760 scrolled = false, 6761 scrollParent = i.scrollParentNotHidden[ 0 ], 6762 document = i.document[ 0 ]; 6763 6764 if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) { 6765 if ( !o.axis || o.axis !== "x" ) { 6766 if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) { 6767 scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed; 6768 } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) { 6769 scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed; 6770 } 6771 } 6772 6773 if ( !o.axis || o.axis !== "y" ) { 6774 if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) { 6775 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed; 6776 } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) { 6777 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed; 6778 } 6779 } 6780 6781 } else { 6782 6783 if (!o.axis || o.axis !== "x") { 6784 if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) { 6785 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); 6786 } else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { 6787 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); 6788 } 6789 } 6790 6791 if (!o.axis || o.axis !== "y") { 6792 if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { 6793 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); 6794 } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { 6795 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); 6796 } 6797 } 6798 6799 } 6800 6801 if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { 6802 $.ui.ddmanager.prepareOffsets(i, event); 6803 } 6804 6805 } 6806}); 6807 6808$.ui.plugin.add("draggable", "snap", { 6809 start: function( event, ui, i ) { 6810 6811 var o = i.options; 6812 6813 i.snapElements = []; 6814 6815 $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() { 6816 var $t = $(this), 6817 $o = $t.offset(); 6818 if (this !== i.element[0]) { 6819 i.snapElements.push({ 6820 item: this, 6821 width: $t.outerWidth(), height: $t.outerHeight(), 6822 top: $o.top, left: $o.left 6823 }); 6824 } 6825 }); 6826 6827 }, 6828 drag: function( event, ui, inst ) { 6829 6830 var ts, bs, ls, rs, l, r, t, b, i, first, 6831 o = inst.options, 6832 d = o.snapTolerance, 6833 x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, 6834 y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; 6835 6836 for (i = inst.snapElements.length - 1; i >= 0; i--){ 6837 6838 l = inst.snapElements[i].left - inst.margins.left; 6839 r = l + inst.snapElements[i].width; 6840 t = inst.snapElements[i].top - inst.margins.top; 6841 b = t + inst.snapElements[i].height; 6842 6843 if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) { 6844 if (inst.snapElements[i].snapping) { 6845 (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); 6846 } 6847 inst.snapElements[i].snapping = false; 6848 continue; 6849 } 6850 6851 if (o.snapMode !== "inner") { 6852 ts = Math.abs(t - y2) <= d; 6853 bs = Math.abs(b - y1) <= d; 6854 ls = Math.abs(l - x2) <= d; 6855 rs = Math.abs(r - x1) <= d; 6856 if (ts) { 6857 ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top; 6858 } 6859 if (bs) { 6860 ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top; 6861 } 6862 if (ls) { 6863 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left; 6864 } 6865 if (rs) { 6866 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left; 6867 } 6868 } 6869 6870 first = (ts || bs || ls || rs); 6871 6872 if (o.snapMode !== "outer") { 6873 ts = Math.abs(t - y1) <= d; 6874 bs = Math.abs(b - y2) <= d; 6875 ls = Math.abs(l - x1) <= d; 6876 rs = Math.abs(r - x2) <= d; 6877 if (ts) { 6878 ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top; 6879 } 6880 if (bs) { 6881 ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top; 6882 } 6883 if (ls) { 6884 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left; 6885 } 6886 if (rs) { 6887 ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left; 6888 } 6889 } 6890 6891 if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { 6892 (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); 6893 } 6894 inst.snapElements[i].snapping = (ts || bs || ls || rs || first); 6895 6896 } 6897 6898 } 6899}); 6900 6901$.ui.plugin.add("draggable", "stack", { 6902 start: function( event, ui, instance ) { 6903 var min, 6904 o = instance.options, 6905 group = $.makeArray($(o.stack)).sort(function(a, b) { 6906 return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0); 6907 }); 6908 6909 if (!group.length) { return; } 6910 6911 min = parseInt($(group[0]).css("zIndex"), 10) || 0; 6912 $(group).each(function(i) { 6913 $(this).css("zIndex", min + i); 6914 }); 6915 this.css("zIndex", (min + group.length)); 6916 } 6917}); 6918 6919$.ui.plugin.add("draggable", "zIndex", { 6920 start: function( event, ui, instance ) { 6921 var t = $( ui.helper ), 6922 o = instance.options; 6923 6924 if (t.css("zIndex")) { 6925 o._zIndex = t.css("zIndex"); 6926 } 6927 t.css("zIndex", o.zIndex); 6928 }, 6929 stop: function( event, ui, instance ) { 6930 var o = instance.options; 6931 6932 if (o._zIndex) { 6933 $(ui.helper).css("zIndex", o._zIndex); 6934 } 6935 } 6936}); 6937 6938var draggable = $.ui.draggable; 6939 6940 6941/*! 6942 * jQuery UI Resizable 1.11.2 6943 * http://jqueryui.com 6944 * 6945 * Copyright 2014 jQuery Foundation and other contributors 6946 * Released under the MIT license. 6947 * http://jquery.org/license 6948 * 6949 * http://api.jqueryui.com/resizable/ 6950 */ 6951 6952 6953$.widget("ui.resizable", $.ui.mouse, { 6954 version: "1.11.2
vendor: 28,472 bytes, lines 6954-8106
6954", 6955 widgetEventPrefix: "resize", 6956 options: { 6957 alsoResize: false, 6958 animate: false, 6959 animateDuration: "slow", 6960 animateEasing: "swing", 6961 aspectRatio: false, 6962 autoHide: false, 6963 containment: false, 6964 ghost: false, 6965 grid: false, 6966 handles: "e,s,se", 6967 helper: false, 6968 maxHeight: null, 6969 maxWidth: null, 6970 minHeight: 10, 6971 minWidth: 10, 6972 // See #7960 6973 zIndex: 90, 6974 6975 // callbacks 6976 resize: null, 6977 start: null, 6978 stop: null 6979 }, 6980 6981 _num: function( value ) { 6982 return parseInt( value, 10 ) || 0; 6983 }, 6984 6985 _isNumber: function( value ) { 6986 return !isNaN( parseInt( value, 10 ) ); 6987 }, 6988 6989 _hasScroll: function( el, a ) { 6990 6991 if ( $( el ).css( "overflow" ) === "hidden") { 6992 return false; 6993 } 6994 6995 var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", 6996 has = false; 6997 6998 if ( el[ scroll ] > 0 ) { 6999 return true; 7000 } 7001 7002 // TODO: determine which cases actually cause this to happen 7003 // if the element doesn't have the scroll set, see if it's possible to 7004 // set the scroll 7005 el[ scroll ] = 1; 7006 has = ( el[ scroll ] > 0 ); 7007 el[ scroll ] = 0; 7008 return has; 7009 }, 7010 7011 _create: function() { 7012 7013 var n, i, handle, axis, hname, 7014 that = this, 7015 o = this.options; 7016 this.element.addClass("ui-resizable"); 7017 7018 $.extend(this, { 7019 _aspectRatio: !!(o.aspectRatio), 7020 aspectRatio: o.aspectRatio, 7021 originalElement: this.element, 7022 _proportionallyResizeElements: [], 7023 _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null 7024 }); 7025 7026 // Wrap the element if it cannot hold child nodes 7027 if (this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { 7028 7029 this.element.wrap( 7030 $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({ 7031 position: this.element.css("position"), 7032 width: this.element.outerWidth(), 7033 height: this.element.outerHeight(), 7034 top: this.element.css("top"), 7035 left: this.element.css("left") 7036 }) 7037 ); 7038 7039 this.element = this.element.parent().data( 7040 "ui-resizable", this.element.resizable( "instance" ) 7041 ); 7042 7043 this.elementIsWrapper = true; 7044 7045 this.element.css({ 7046 marginLeft: this.originalElement.css("marginLeft"), 7047 marginTop: this.originalElement.css("marginTop"), 7048 marginRight: this.originalElement.css("marginRight"), 7049 marginBottom: this.originalElement.css("marginBottom") 7050 }); 7051 this.originalElement.css({ 7052 marginLeft: 0, 7053 marginTop: 0, 7054 marginRight: 0, 7055 marginBottom: 0 7056 }); 7057 // support: Safari 7058 // Prevent Safari textarea resize 7059 this.originalResizeStyle = this.originalElement.css("resize"); 7060 this.originalElement.css("resize", "none"); 7061 7062 this._proportionallyResizeElements.push( this.originalElement.css({ 7063 position: "static", 7064 zoom: 1, 7065 display: "block" 7066 }) ); 7067 7068 // support: IE9 7069 // avoid IE jump (hard set the margin) 7070 this.originalElement.css({ margin: this.originalElement.css("margin") }); 7071 7072 this._proportionallyResize(); 7073 } 7074 7075 this.handles = o.handles || 7076 ( !$(".ui-resizable-handle", this.element).length ? 7077 "e,s,se" : { 7078 n: ".ui-resizable-n", 7079 e: ".ui-resizable-e", 7080 s: ".ui-resizable-s", 7081 w: ".ui-resizable-w", 7082 se: ".ui-resizable-se", 7083 sw: ".ui-resizable-sw", 7084 ne: ".ui-resizable-ne", 7085 nw: ".ui-resizable-nw" 7086 } ); 7087 7088 if (this.handles.constructor === String) { 7089 7090 if ( this.handles === "all") { 7091 this.handles = "n,e,s,w,se,sw,ne,nw"; 7092 } 7093 7094 n = this.handles.split(","); 7095 this.handles = {}; 7096 7097 for (i = 0; i < n.length; i++) { 7098 7099 handle = $.trim(n[i]); 7100 hname = "ui-resizable-" + handle; 7101 axis = $("<div class='ui-resizable-handle " + hname + "'></div>"); 7102 7103 axis.css({ zIndex: o.zIndex }); 7104 7105 // TODO : What's going on here? 7106 if ("se" === handle) { 7107 axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se"); 7108 } 7109 7110 this.handles[handle] = ".ui-resizable-" + handle; 7111 this.element.append(axis); 7112 } 7113 7114 } 7115 7116 this._renderAxis = function(target) { 7117 7118 var i, axis, padPos, padWrapper; 7119 7120 target = target || this.element; 7121 7122 for (i in this.handles) { 7123 7124 if (this.handles[i].constructor === String) { 7125 this.handles[i] = this.element.children( this.handles[ i ] ).first().show(); 7126 } 7127 7128 if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { 7129 7130 axis = $(this.handles[i], this.element); 7131 7132 padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); 7133 7134 padPos = [ "padding", 7135 /ne|nw|n/.test(i) ? "Top" : 7136 /se|sw|s/.test(i) ? "Bottom" : 7137 /^e$/.test(i) ? "Right" : "Left" ].join(""); 7138 7139 target.css(padPos, padWrapper); 7140 7141 this._proportionallyResize(); 7142 7143 } 7144 7145 // TODO: What's that good for? There's not anything to be executed left 7146 if (!$(this.handles[i]).length) { 7147 continue; 7148 } 7149 } 7150 }; 7151 7152 // TODO: make renderAxis a prototype function 7153 this._renderAxis(this.element); 7154 7155 this._handles = $(".ui-resizable-handle", this.element) 7156 .disableSelection(); 7157 7158 this._handles.mouseover(function() { 7159 if (!that.resizing) { 7160 if (this.className) { 7161 axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); 7162 } 7163 that.axis = axis && axis[1] ? axis[1] : "se"; 7164 } 7165 }); 7166 7167 if (o.autoHide) { 7168 this._handles.hide(); 7169 $(this.element) 7170 .addClass("ui-resizable-autohide") 7171 .mouseenter(function() { 7172 if (o.disabled) { 7173 return; 7174 } 7175 $(this).removeClass("ui-resizable-autohide"); 7176 that._handles.show(); 7177 }) 7178 .mouseleave(function() { 7179 if (o.disabled) { 7180 return; 7181 } 7182 if (!that.resizing) { 7183 $(this).addClass("ui-resizable-autohide"); 7184 that._handles.hide(); 7185 } 7186 }); 7187 } 7188 7189 this._mouseInit(); 7190 7191 }, 7192 7193 _destroy: function() { 7194 7195 this._mouseDestroy(); 7196 7197 var wrapper, 7198 _destroy = function(exp) { 7199 $(exp) 7200 .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") 7201 .removeData("resizable") 7202 .removeData("ui-resizable") 7203 .unbind(".resizable") 7204 .find(".ui-resizable-handle") 7205 .remove(); 7206 }; 7207 7208 // TODO: Unwrap at same DOM position 7209 if (this.elementIsWrapper) { 7210 _destroy(this.element); 7211 wrapper = this.element; 7212 this.originalElement.css({ 7213 position: wrapper.css("position"), 7214 width: wrapper.outerWidth(), 7215 height: wrapper.outerHeight(), 7216 top: wrapper.css("top"), 7217 left: wrapper.css("left") 7218 }).insertAfter( wrapper ); 7219 wrapper.remove(); 7220 } 7221 7222 this.originalElement.css("resize", this.originalResizeStyle); 7223 _destroy(this.originalElement); 7224 7225 return this; 7226 }, 7227 7228 _mouseCapture: function(event) { 7229 var i, handle, 7230 capture = false; 7231 7232 for (i in this.handles) { 7233 handle = $(this.handles[i])[0]; 7234 if (handle === event.target || $.contains(handle, event.target)) { 7235 capture = true; 7236 } 7237 } 7238 7239 return !this.options.disabled && capture; 7240 }, 7241 7242 _mouseStart: function(event) { 7243 7244 var curleft, curtop, cursor, 7245 o = this.options, 7246 el = this.element; 7247 7248 this.resizing = true; 7249 7250 this._renderProxy(); 7251 7252 curleft = this._num(this.helper.css("left")); 7253 curtop = this._num(this.helper.css("top")); 7254 7255 if (o.containment) { 7256 curleft += $(o.containment).scrollLeft() || 0; 7257 curtop += $(o.containment).scrollTop() || 0; 7258 } 7259 7260 this.offset = this.helper.offset(); 7261 this.position = { left: curleft, top: curtop }; 7262 7263 this.size = this._helper ? { 7264 width: this.helper.width(), 7265 height: this.helper.height() 7266 } : { 7267 width: el.width(), 7268 height: el.height() 7269 }; 7270 7271 this.originalSize = this._helper ? { 7272 width: el.outerWidth(), 7273 height: el.outerHeight() 7274 } : { 7275 width: el.width(), 7276 height: el.height() 7277 }; 7278 7279 this.sizeDiff = { 7280 width: el.outerWidth() - el.width(), 7281 height: el.outerHeight() - el.height() 7282 }; 7283 7284 this.originalPosition = { left: curleft, top: curtop }; 7285 this.originalMousePosition = { left: event.pageX, top: event.pageY }; 7286 7287 this.aspectRatio = (typeof o.aspectRatio === "number") ? 7288 o.aspectRatio : 7289 ((this.originalSize.width / this.originalSize.height) || 1); 7290 7291 cursor = $(".ui-resizable-" + this.axis).css("cursor"); 7292 $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor); 7293 7294 el.addClass("ui-resizable-resizing"); 7295 this._propagate("start", event); 7296 return true; 7297 }, 7298 7299 _mouseDrag: function(event) { 7300 7301 var data, props, 7302 smp = this.originalMousePosition, 7303 a = this.axis, 7304 dx = (event.pageX - smp.left) || 0, 7305 dy = (event.pageY - smp.top) || 0, 7306 trigger = this._change[a]; 7307 7308 this._updatePrevProperties(); 7309 7310 if (!trigger) { 7311 return false; 7312 } 7313 7314 data = trigger.apply(this, [ event, dx, dy ]); 7315 7316 this._updateVirtualBoundaries(event.shiftKey); 7317 if (this._aspectRatio || event.shiftKey) { 7318 data = this._updateRatio(data, event); 7319 } 7320 7321 data = this._respectSize(data, event); 7322 7323 this._updateCache(data); 7324 7325 this._propagate("resize", event); 7326 7327 props = this._applyChanges(); 7328 7329 if ( !this._helper && this._proportionallyResizeElements.length ) { 7330 this._proportionallyResize(); 7331 } 7332 7333 if ( !$.isEmptyObject( props ) ) { 7334 this._updatePrevProperties(); 7335 this._trigger( "resize", event, this.ui() ); 7336 this._applyChanges(); 7337 } 7338 7339 return false; 7340 }, 7341 7342 _mouseStop: function(event) { 7343 7344 this.resizing = false; 7345 var pr, ista, soffseth, soffsetw, s, left, top, 7346 o = this.options, that = this; 7347 7348 if (this._helper) { 7349 7350 pr = this._proportionallyResizeElements; 7351 ista = pr.length && (/textarea/i).test(pr[0].nodeName); 7352 soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height; 7353 soffsetw = ista ? 0 : that.sizeDiff.width; 7354 7355 s = { 7356 width: (that.helper.width() - soffsetw), 7357 height: (that.helper.height() - soffseth) 7358 }; 7359 left = (parseInt(that.element.css("left"), 10) + 7360 (that.position.left - that.originalPosition.left)) || null; 7361 top = (parseInt(that.element.css("top"), 10) + 7362 (that.position.top - that.originalPosition.top)) || null; 7363 7364 if (!o.animate) { 7365 this.element.css($.extend(s, { top: top, left: left })); 7366 } 7367 7368 that.helper.height(that.size.height); 7369 that.helper.width(that.size.width); 7370 7371 if (this._helper && !o.animate) { 7372 this._proportionallyResize(); 7373 } 7374 } 7375 7376 $("body").css("cursor", "auto"); 7377 7378 this.element.removeClass("ui-resizable-resizing"); 7379 7380 this._propagate("stop", event); 7381 7382 if (this._helper) { 7383 this.helper.remove(); 7384 } 7385 7386 return false; 7387 7388 }, 7389 7390 _updatePrevProperties: function() { 7391 this.prevPosition = { 7392 top: this.position.top, 7393 left: this.position.left 7394 }; 7395 this.prevSize = { 7396 width: this.size.width, 7397 height: this.size.height 7398 }; 7399 }, 7400 7401 _applyChanges: function() { 7402 var props = {}; 7403 7404 if ( this.position.top !== this.prevPosition.top ) { 7405 props.top = this.position.top + "px"; 7406 } 7407 if ( this.position.left !== this.prevPosition.left ) { 7408 props.left = this.position.left + "px"; 7409 } 7410 if ( this.size.width !== this.prevSize.width ) { 7411 props.width = this.size.width + "px"; 7412 } 7413 if ( this.size.height !== this.prevSize.height ) { 7414 props.height = this.size.height + "px"; 7415 } 7416 7417 this.helper.css( props ); 7418 7419 return props; 7420 }, 7421 7422 _updateVirtualBoundaries: function(forceAspectRatio) { 7423 var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, 7424 o = this.options; 7425 7426 b = { 7427 minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0, 7428 maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity, 7429 minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0, 7430 maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity 7431 }; 7432 7433 if (this._aspectRatio || forceAspectRatio) { 7434 pMinWidth = b.minHeight * this.aspectRatio; 7435 pMinHeight = b.minWidth / this.aspectRatio; 7436 pMaxWidth = b.maxHeight * this.aspectRatio; 7437 pMaxHeight = b.maxWidth / this.aspectRatio; 7438 7439 if (pMinWidth > b.minWidth) { 7440 b.minWidth = pMinWidth; 7441 } 7442 if (pMinHeight > b.minHeight) { 7443 b.minHeight = pMinHeight; 7444 } 7445 if (pMaxWidth < b.maxWidth) { 7446 b.maxWidth = pMaxWidth; 7447 } 7448 if (pMaxHeight < b.maxHeight) { 7449 b.maxHeight = pMaxHeight; 7450 } 7451 } 7452 this._vBoundaries = b; 7453 }, 7454 7455 _updateCache: function(data) { 7456 this.offset = this.helper.offset(); 7457 if (this._isNumber(data.left)) { 7458 this.position.left = data.left; 7459 } 7460 if (this._isNumber(data.top)) { 7461 this.position.top = data.top; 7462 } 7463 if (this._isNumber(data.height)) { 7464 this.size.height = data.height; 7465 } 7466 if (this._isNumber(data.width)) { 7467 this.size.width = data.width; 7468 } 7469 }, 7470 7471 _updateRatio: function( data ) { 7472 7473 var cpos = this.position, 7474 csize = this.size, 7475 a = this.axis; 7476 7477 if (this._isNumber(data.height)) { 7478 data.width = (data.height * this.aspectRatio); 7479 } else if (this._isNumber(data.width)) { 7480 data.height = (data.width / this.aspectRatio); 7481 } 7482 7483 if (a === "sw") { 7484 data.left = cpos.left + (csize.width - data.width); 7485 data.top = null; 7486 } 7487 if (a === "nw") { 7488 data.top = cpos.top + (csize.height - data.height); 7489 data.left = cpos.left + (csize.width - data.width); 7490 } 7491 7492 return data; 7493 }, 7494 7495 _respectSize: function( data ) { 7496 7497 var o = this._vBoundaries, 7498 a = this.axis, 7499 ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), 7500 ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), 7501 isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width), 7502 isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height), 7503 dw = this.originalPosition.left + this.originalSize.width, 7504 dh = this.position.top + this.size.height, 7505 cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); 7506 if (isminw) { 7507 data.width = o.minWidth; 7508 } 7509 if (isminh) { 7510 data.height = o.minHeight; 7511 } 7512 if (ismaxw) { 7513 data.width = o.maxWidth; 7514 } 7515 if (ismaxh) { 7516 data.height = o.maxHeight; 7517 } 7518 7519 if (isminw && cw) { 7520 data.left = dw - o.minWidth; 7521 } 7522 if (ismaxw && cw) { 7523 data.left = dw - o.maxWidth; 7524 } 7525 if (isminh && ch) { 7526 data.top = dh - o.minHeight; 7527 } 7528 if (ismaxh && ch) { 7529 data.top = dh - o.maxHeight; 7530 } 7531 7532 // Fixing jump error on top/left - bug #2330 7533 if (!data.width && !data.height && !data.left && data.top) { 7534 data.top = null; 7535 } else if (!data.width && !data.height && !data.top && data.left) { 7536 data.left = null; 7537 } 7538 7539 return data; 7540 }, 7541 7542 _getPaddingPlusBorderDimensions: function( element ) { 7543 var i = 0, 7544 widths = [], 7545 borders = [ 7546 element.css( "borderTopWidth" ), 7547 element.css( "borderRightWidth" ), 7548 element.css( "borderBottomWidth" ), 7549 element.css( "borderLeftWidth" ) 7550 ], 7551 paddings = [ 7552 element.css( "paddingTop" ), 7553 element.css( "paddingRight" ), 7554 element.css( "paddingBottom" ), 7555 element.css( "paddingLeft" ) 7556 ]; 7557 7558 for ( ; i < 4; i++ ) { 7559 widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 ); 7560 widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 ); 7561 } 7562 7563 return { 7564 height: widths[ 0 ] + widths[ 2 ], 7565 width: widths[ 1 ] + widths[ 3 ] 7566 }; 7567 }, 7568 7569 _proportionallyResize: function() { 7570 7571 if (!this._proportionallyResizeElements.length) { 7572 return; 7573 } 7574 7575 var prel, 7576 i = 0, 7577 element = this.helper || this.element; 7578 7579 for ( ; i < this._proportionallyResizeElements.length; i++) { 7580 7581 prel = this._proportionallyResizeElements[i]; 7582 7583 // TODO: Seems like a bug to cache this.outerDimensions 7584 // considering that we are in a loop. 7585 if (!this.outerDimensions) { 7586 this.outerDimensions = this._getPaddingPlusBorderDimensions( prel ); 7587 } 7588 7589 prel.css({ 7590 height: (element.height() - this.outerDimensions.height) || 0, 7591 width: (element.width() - this.outerDimensions.width) || 0 7592 }); 7593 7594 } 7595 7596 }, 7597 7598 _renderProxy: function() { 7599 7600 var el = this.element, o = this.options; 7601 this.elementOffset = el.offset(); 7602 7603 if (this._helper) { 7604 7605 this.helper = this.helper || $("<div style='overflow:hidden;'></div>"); 7606 7607 this.helper.addClass(this._helper).css({ 7608 width: this.element.outerWidth() - 1, 7609 height: this.element.outerHeight() - 1, 7610 position: "absolute", 7611 left: this.elementOffset.left + "px", 7612 top: this.elementOffset.top + "px", 7613 zIndex: ++o.zIndex //TODO: Don't modify option 7614 }); 7615 7616 this.helper 7617 .appendTo("body") 7618 .disableSelection(); 7619 7620 } else { 7621 this.helper = this.element; 7622 } 7623 7624 }, 7625 7626 _change: { 7627 e: function(event, dx) { 7628 return { width: this.originalSize.width + dx }; 7629 }, 7630 w: function(event, dx) { 7631 var cs = this.originalSize, sp = this.originalPosition; 7632 return { left: sp.left + dx, width: cs.width - dx }; 7633 }, 7634 n: function(event, dx, dy) { 7635 var cs = this.originalSize, sp = this.originalPosition; 7636 return { top: sp.top + dy, height: cs.height - dy }; 7637 }, 7638 s: function(event, dx, dy) { 7639 return { height: this.originalSize.height + dy }; 7640 }, 7641 se: function(event, dx, dy) { 7642 return $.extend(this._change.s.apply(this, arguments), 7643 this._change.e.apply(this, [ event, dx, dy ])); 7644 }, 7645 sw: function(event, dx, dy) { 7646 return $.extend(this._change.s.apply(this, arguments), 7647 this._change.w.apply(this, [ event, dx, dy ])); 7648 }, 7649 ne: function(event, dx, dy) { 7650 return $.extend(this._change.n.apply(this, arguments), 7651 this._change.e.apply(this, [ event, dx, dy ])); 7652 }, 7653 nw: function(event, dx, dy) { 7654 return $.extend(this._change.n.apply(this, arguments), 7655 this._change.w.apply(this, [ event, dx, dy ])); 7656 } 7657 }, 7658 7659 _propagate: function(n, event) { 7660 $.ui.plugin.call(this, n, [ event, this.ui() ]); 7661 (n !== "resize" && this._trigger(n, event, this.ui())); 7662 }, 7663 7664 plugins: {}, 7665 7666 ui: function() { 7667 return { 7668 originalElement: this.originalElement, 7669 element: this.element, 7670 helper: this.helper, 7671 position: this.position, 7672 size: this.size, 7673 originalSize: this.originalSize, 7674 originalPosition: this.originalPosition 7675 }; 7676 } 7677 7678}); 7679 7680/* 7681 * Resizable Extensions 7682 */ 7683 7684$.ui.plugin.add("resizable", "animate", { 7685 7686 stop: function( event ) { 7687 var that = $(this).resizable( "instance" ), 7688 o = that.options, 7689 pr = that._proportionallyResizeElements, 7690 ista = pr.length && (/textarea/i).test(pr[0].nodeName), 7691 soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height, 7692 soffsetw = ista ? 0 : that.sizeDiff.width, 7693 style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) }, 7694 left = (parseInt(that.element.css("left"), 10) + 7695 (that.position.left - that.originalPosition.left)) || null, 7696 top = (parseInt(that.element.css("top"), 10) + 7697 (that.position.top - that.originalPosition.top)) || null; 7698 7699 that.element.animate( 7700 $.extend(style, top && left ? { top: top, left: left } : {}), { 7701 duration: o.animateDuration, 7702 easing: o.animateEasing, 7703 step: function() { 7704 7705 var data = { 7706 width: parseInt(that.element.css("width"), 10), 7707 height: parseInt(that.element.css("height"), 10), 7708 top: parseInt(that.element.css("top"), 10), 7709 left: parseInt(that.element.css("left"), 10) 7710 }; 7711 7712 if (pr && pr.length) { 7713 $(pr[0]).css({ width: data.width, height: data.height }); 7714 } 7715 7716 // propagating resize, and updating values for each animation step 7717 that._updateCache(data); 7718 that._propagate("resize", event); 7719 7720 } 7721 } 7722 ); 7723 } 7724 7725}); 7726 7727$.ui.plugin.add( "resizable", "containment", { 7728 7729 start: function() { 7730 var element, p, co, ch, cw, width, height, 7731 that = $( this ).resizable( "instance" ), 7732 o = that.options, 7733 el = that.element, 7734 oc = o.containment, 7735 ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc; 7736 7737 if ( !ce ) { 7738 return; 7739 } 7740 7741 that.containerElement = $( ce ); 7742 7743 if ( /document/.test( oc ) || oc === document ) { 7744 that.containerOffset = { 7745 left: 0, 7746 top: 0 7747 }; 7748 that.containerPosition = { 7749 left: 0, 7750 top: 0 7751 }; 7752 7753 that.parentData = { 7754 element: $( document ), 7755 left: 0, 7756 top: 0, 7757 width: $( document ).width(), 7758 height: $( document ).height() || document.body.parentNode.scrollHeight 7759 }; 7760 } else { 7761 element = $( ce ); 7762 p = []; 7763 $([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) { 7764 p[ i ] = that._num( element.css( "padding" + name ) ); 7765 }); 7766 7767 that.containerOffset = element.offset(); 7768 that.containerPosition = element.position(); 7769 that.containerSize = { 7770 height: ( element.innerHeight() - p[ 3 ] ), 7771 width: ( element.innerWidth() - p[ 1 ] ) 7772 }; 7773 7774 co = that.containerOffset; 7775 ch = that.containerSize.height; 7776 cw = that.containerSize.width; 7777 width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw ); 7778 height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ; 7779 7780 that.parentData = { 7781 element: ce, 7782 left: co.left, 7783 top: co.top, 7784 width: width, 7785 height: height 7786 }; 7787 } 7788 }, 7789 7790 resize: function( event ) { 7791 var woset, hoset, isParent, isOffsetRelative, 7792 that = $( this ).resizable( "instance" ), 7793 o = that.options, 7794 co = that.containerOffset, 7795 cp = that.position, 7796 pRatio = that._aspectRatio || event.shiftKey, 7797 cop = { 7798 top: 0, 7799 left: 0 7800 }, 7801 ce = that.containerElement, 7802 continueResize = true; 7803 7804 if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) { 7805 cop = co; 7806 } 7807 7808 if ( cp.left < ( that._helper ? co.left : 0 ) ) { 7809 that.size.width = that.size.width + 7810 ( that._helper ? 7811 ( that.position.left - co.left ) : 7812 ( that.position.left - cop.left ) ); 7813 7814 if ( pRatio ) { 7815 that.size.height = that.size.width / that.aspectRatio; 7816 continueResize = false; 7817 } 7818 that.position.left = o.helper ? co.left : 0; 7819 } 7820 7821 if ( cp.top < ( that._helper ? co.top : 0 ) ) { 7822 that.size.height = that.size.height + 7823 ( that._helper ? 7824 ( that.position.top - co.top ) : 7825 that.position.top ); 7826 7827 if ( pRatio ) { 7828 that.size.width = that.size.height * that.aspectRatio; 7829 continueResize = false; 7830 } 7831 that.position.top = that._helper ? co.top : 0; 7832 } 7833 7834 isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 ); 7835 isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) ); 7836 7837 if ( isParent && isOffsetRelative ) { 7838 that.offset.left = that.parentData.left + that.position.left; 7839 that.offset.top = that.parentData.top + that.position.top; 7840 } else { 7841 that.offset.left = that.element.offset().left; 7842 that.offset.top = that.element.offset().top; 7843 } 7844 7845 woset = Math.abs( that.sizeDiff.width + 7846 (that._helper ? 7847 that.offset.left - cop.left : 7848 (that.offset.left - co.left)) ); 7849 7850 hoset = Math.abs( that.sizeDiff.height + 7851 (that._helper ? 7852 that.offset.top - cop.top : 7853 (that.offset.top - co.top)) ); 7854 7855 if ( woset + that.size.width >= that.parentData.width ) { 7856 that.size.width = that.parentData.width - woset; 7857 if ( pRatio ) { 7858 that.size.height = that.size.width / that.aspectRatio; 7859 continueResize = false; 7860 } 7861 } 7862 7863 if ( hoset + that.size.height >= that.parentData.height ) { 7864 that.size.height = that.parentData.height - hoset; 7865 if ( pRatio ) { 7866 that.size.width = that.size.height * that.aspectRatio; 7867 continueResize = false; 7868 } 7869 } 7870 7871 if ( !continueResize ){ 7872 that.position.left = that.prevPosition.left; 7873 that.position.top = that.prevPosition.top; 7874 that.size.width = that.prevSize.width; 7875 that.size.height = that.prevSize.height; 7876 } 7877 }, 7878 7879 stop: function() { 7880 var that = $( this ).resizable( "instance" ), 7881 o = that.options, 7882 co = that.containerOffset, 7883 cop = that.containerPosition, 7884 ce = that.containerElement, 7885 helper = $( that.helper ), 7886 ho = helper.offset(), 7887 w = helper.outerWidth() - that.sizeDiff.width, 7888 h = helper.outerHeight() - that.sizeDiff.height; 7889 7890 if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) { 7891 $( this ).css({ 7892 left: ho.left - cop.left - co.left, 7893 width: w, 7894 height: h 7895 }); 7896 } 7897 7898 if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) { 7899 $( this ).css({ 7900 left: ho.left - cop.left - co.left, 7901 width: w, 7902 height: h 7903 }); 7904 } 7905 } 7906}); 7907 7908$.ui.plugin.add("resizable", "alsoResize", { 7909 7910 start: function() { 7911 var that = $(this).resizable( "instance" ), 7912 o = that.options, 7913 _store = function(exp) { 7914 $(exp).each(function() { 7915 var el = $(this); 7916 el.data("ui-resizable-alsoresize", { 7917 width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), 7918 left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10) 7919 }); 7920 }); 7921 }; 7922 7923 if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) { 7924 if (o.alsoResize.length) { 7925 o.alsoResize = o.alsoResize[0]; 7926 _store(o.alsoResize); 7927 } else { 7928 $.each(o.alsoResize, function(exp) { 7929 _store(exp); 7930 }); 7931 } 7932 } else { 7933 _store(o.alsoResize); 7934 } 7935 }, 7936 7937 resize: function(event, ui) { 7938 var that = $(this).resizable( "instance" ), 7939 o = that.options, 7940 os = that.originalSize, 7941 op = that.originalPosition, 7942 delta = { 7943 height: (that.size.height - os.height) || 0, 7944 width: (that.size.width - os.width) || 0, 7945 top: (that.position.top - op.top) || 0, 7946 left: (that.position.left - op.left) || 0 7947 }, 7948 7949 _alsoResize = function(exp, c) { 7950 $(exp).each(function() { 7951 var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, 7952 css = c && c.length ? 7953 c : 7954 el.parents(ui.originalElement[0]).length ? 7955 [ "width", "height" ] : 7956 [ "width", "height", "top", "left" ]; 7957 7958 $.each(css, function(i, prop) { 7959 var sum = (start[prop] || 0) + (delta[prop] || 0); 7960 if (sum && sum >= 0) { 7961 style[prop] = sum || null; 7962 } 7963 }); 7964 7965 el.css(style); 7966 }); 7967 }; 7968 7969 if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) { 7970 $.each(o.alsoResize, function(exp, c) { 7971 _alsoResize(exp, c); 7972 }); 7973 } else { 7974 _alsoResize(o.alsoResize); 7975 } 7976 }, 7977 7978 stop: function() { 7979 $(this).removeData("resizable-alsoresize"); 7980 } 7981}); 7982 7983$.ui.plugin.add("resizable", "ghost", { 7984 7985 start: function() { 7986 7987 var that = $(this).resizable( "instance" ), o = that.options, cs = that.size; 7988 7989 that.ghost = that.originalElement.clone(); 7990 that.ghost 7991 .css({ 7992 opacity: 0.25, 7993 display: "block", 7994 position: "relative", 7995 height: cs.height, 7996 width: cs.width, 7997 margin: 0, 7998 left: 0, 7999 top: 0 8000 }) 8001 .addClass("ui-resizable-ghost") 8002 .addClass(typeof o.ghost === "string" ? o.ghost : ""); 8003 8004 that.ghost.appendTo(that.helper); 8005 8006 }, 8007 8008 resize: function() { 8009 var that = $(this).resizable( "instance" ); 8010 if (that.ghost) { 8011 that.ghost.css({ 8012 position: "relative", 8013 height: that.size.height, 8014 width: that.size.width 8015 }); 8016 } 8017 }, 8018 8019 stop: function() { 8020 var that = $(this).resizable( "instance" ); 8021 if (that.ghost && that.helper) { 8022 that.helper.get(0).removeChild(that.ghost.get(0)); 8023 } 8024 } 8025 8026}); 8027 8028$.ui.plugin.add("resizable", "grid", { 8029 8030 resize: function() { 8031 var outerDimensions, 8032 that = $(this).resizable( "instance" ), 8033 o = that.options, 8034 cs = that.size, 8035 os = that.originalSize, 8036 op = that.originalPosition, 8037 a = that.axis, 8038 grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid, 8039 gridX = (grid[0] || 1), 8040 gridY = (grid[1] || 1), 8041 ox = Math.round((cs.width - os.width) / gridX) * gridX, 8042 oy = Math.round((cs.height - os.height) / gridY) * gridY, 8043 newWidth = os.width + ox, 8044 newHeight = os.height + oy, 8045 isMaxWidth = o.maxWidth && (o.maxWidth < newWidth), 8046 isMaxHeight = o.maxHeight && (o.maxHeight < newHeight), 8047 isMinWidth = o.minWidth && (o.minWidth > newWidth), 8048 isMinHeight = o.minHeight && (o.minHeight > newHeight); 8049 8050 o.grid = grid; 8051 8052 if (isMinWidth) { 8053 newWidth += gridX; 8054 } 8055 if (isMinHeight) { 8056 newHeight += gridY; 8057 } 8058 if (isMaxWidth) { 8059 newWidth -= gridX; 8060 } 8061 if (isMaxHeight) { 8062 newHeight -= gridY; 8063 } 8064 8065 if (/^(se|s|e)$/.test(a)) { 8066 that.size.width = newWidth; 8067 that.size.height = newHeight; 8068 } else if (/^(ne)$/.test(a)) { 8069 that.size.width = newWidth; 8070 that.size.height = newHeight; 8071 that.position.top = op.top - oy; 8072 } else if (/^(sw)$/.test(a)) { 8073 that.size.width = newWidth; 8074 that.size.height = newHeight; 8075 that.position.left = op.left - ox; 8076 } else { 8077 if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) { 8078 outerDimensions = that._getPaddingPlusBorderDimensions( this ); 8079 } 8080 8081 if ( newHeight - gridY > 0 ) { 8082 that.size.height = newHeight; 8083 that.position.top = op.top - oy; 8084 } else { 8085 newHeight = gridY - outerDimensions.height; 8086 that.size.height = newHeight; 8087 that.position.top = op.top + os.height - newHeight; 8088 } 8089 if ( newWidth - gridX > 0 ) { 8090 that.size.width = newWidth; 8091 that.position.left = op.left - ox; 8092 } else { 8093 newWidth = gridY - outerDimensions.height; 8094 that.size.width = newWidth; 8095 that.position.left = op.left + os.width - newWidth; 8096 } 8097 } 8098 } 8099 8100}); 8101 8102var resizable = $.ui.resizable; 8103 8104 8105/*! 8106 * jQuery UI Dialog 1.11.
81062 8107 * http://jqueryui.com 8108 * 8109 * Copyright 2014 jQuery Foundation and other contributors 8110 * Released under the MIT license. 8111 * http://jquery.org/license 8112 * 8113 * http://api.jqueryui.com/dialog/ 8114 */ 8115 8116 8117var dialog = $.widget( "ui.dialog", { 8118 version: "1.11.2
vendor: 21,198 bytes, lines 8118-8962
8118", 8119 options: { 8120 appendTo: "body", 8121 autoOpen: true, 8122 buttons: [], 8123 closeOnEscape: true, 8124 closeText: "Close", 8125 dialogClass: "", 8126 draggable: true, 8127 hide: null, 8128 height: "auto", 8129 maxHeight: null, 8130 maxWidth: null, 8131 minHeight: 150, 8132 minWidth: 150, 8133 modal: false, 8134 position: { 8135 my: "center", 8136 at: "center", 8137 of: window, 8138 collision: "fit", 8139 // Ensure the titlebar is always visible 8140 using: function( pos ) { 8141 var topOffset = $( this ).css( pos ).offset().top; 8142 if ( topOffset < 0 ) { 8143 $( this ).css( "top", pos.top - topOffset ); 8144 } 8145 } 8146 }, 8147 resizable: true, 8148 show: null, 8149 title: null, 8150 width: 300, 8151 8152 // callbacks 8153 beforeClose: null, 8154 close: null, 8155 drag: null, 8156 dragStart: null, 8157 dragStop: null, 8158 focus: null, 8159 open: null, 8160 resize: null, 8161 resizeStart: null, 8162 resizeStop: null 8163 }, 8164 8165 sizeRelatedOptions: { 8166 buttons: true, 8167 height: true, 8168 maxHeight: true, 8169 maxWidth: true, 8170 minHeight: true, 8171 minWidth: true, 8172 width: true 8173 }, 8174 8175 resizableRelatedOptions: { 8176 maxHeight: true, 8177 maxWidth: true, 8178 minHeight: true, 8179 minWidth: true 8180 }, 8181 8182 _create: function() { 8183 this.originalCss = { 8184 display: this.element[ 0 ].style.display, 8185 width: this.element[ 0 ].style.width, 8186 minHeight: this.element[ 0 ].style.minHeight, 8187 maxHeight: this.element[ 0 ].style.maxHeight, 8188 height: this.element[ 0 ].style.height 8189 }; 8190 this.originalPosition = { 8191 parent: this.element.parent(), 8192 index: this.element.parent().children().index( this.element ) 8193 }; 8194 this.originalTitle = this.element.attr( "title" ); 8195 this.options.title = this.options.title || this.originalTitle; 8196 8197 this._createWrapper(); 8198 8199 this.element 8200 .show() 8201 .removeAttr( "title" ) 8202 .addClass( "ui-dialog-content ui-widget-content" ) 8203 .appendTo( this.uiDialog ); 8204 8205 this._createTitlebar(); 8206 this._createButtonPane(); 8207 8208 if ( this.options.draggable && $.fn.draggable ) { 8209 this._makeDraggable(); 8210 } 8211 if ( this.options.resizable && $.fn.resizable ) { 8212 this._makeResizable(); 8213 } 8214 8215 this._isOpen = false; 8216 8217 this._trackFocus(); 8218 }, 8219 8220 _init: function() { 8221 if ( this.options.autoOpen ) { 8222 this.open(); 8223 } 8224 }, 8225 8226 _appendTo: function() { 8227 var element = this.options.appendTo; 8228 if ( element && (element.jquery || element.nodeType) ) { 8229 return $( element ); 8230 } 8231 return this.document.find( element || "body" ).eq( 0 ); 8232 }, 8233 8234 _destroy: function() { 8235 var next, 8236 originalPosition = this.originalPosition; 8237 8238 this._destroyOverlay(); 8239 8240 this.element 8241 .removeUniqueId() 8242 .removeClass( "ui-dialog-content ui-widget-content" ) 8243 .css( this.originalCss ) 8244 // Without detaching first, the following becomes really slow 8245 .detach(); 8246 8247 this.uiDialog.stop( true, true ).remove(); 8248 8249 if ( this.originalTitle ) { 8250 this.element.attr( "title", this.originalTitle ); 8251 } 8252 8253 next = originalPosition.parent.children().eq( originalPosition.index ); 8254 // Don't try to place the dialog next to itself (#8613) 8255 if ( next.length && next[ 0 ] !== this.element[ 0 ] ) { 8256 next.before( this.element ); 8257 } else { 8258 originalPosition.parent.append( this.element ); 8259 } 8260 }, 8261 8262 widget: function() { 8263 return this.uiDialog; 8264 }, 8265 8266 disable: $.noop, 8267 enable: $.noop, 8268 8269 close: function( event ) { 8270 var activeElement, 8271 that = this; 8272 8273 if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) { 8274 return; 8275 } 8276 8277 this._isOpen = false; 8278 this._focusedElement = null; 8279 this._destroyOverlay(); 8280 this._untrackInstance(); 8281 8282 if ( !this.opener.filter( ":focusable" ).focus().length ) { 8283 8284 // support: IE9 8285 // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> 8286 try { 8287 activeElement = this.document[ 0 ].activeElement; 8288 8289 // Support: IE9, IE10 8290 // If the <body> is blurred, IE will switch windows, see #4520 8291 if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) { 8292 8293 // Hiding a focused element doesn't trigger blur in WebKit 8294 // so in case we have nothing to focus on, explicitly blur the active element 8295 // https://bugs.webkit.org/show_bug.cgi?id=47182 8296 $( activeElement ).blur(); 8297 } 8298 } catch ( error ) {} 8299 } 8300 8301 this._hide( this.uiDialog, this.options.hide, function() { 8302 that._trigger( "close", event ); 8303 }); 8304 }, 8305 8306 isOpen: function() { 8307 return this._isOpen; 8308 }, 8309 8310 moveToTop: function() { 8311 this._moveToTop(); 8312 }, 8313 8314 _moveToTop: function( event, silent ) { 8315 var moved = false, 8316 zIndicies = this.uiDialog.siblings( ".ui-front:visible" ).map(function() { 8317 return +$( this ).css( "z-index" ); 8318 }).get(), 8319 zIndexMax = Math.max.apply( null, zIndicies ); 8320 8321 if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) { 8322 this.uiDialog.css( "z-index", zIndexMax + 1 ); 8323 moved = true; 8324 } 8325 8326 if ( moved && !silent ) { 8327 this._trigger( "focus", event ); 8328 } 8329 return moved; 8330 }, 8331 8332 open: function() { 8333 var that = this; 8334 if ( this._isOpen ) { 8335 if ( this._moveToTop() ) { 8336 this._focusTabbable(); 8337 } 8338 return; 8339 } 8340 8341 this._isOpen = true; 8342 this.opener = $( this.document[ 0 ].activeElement ); 8343 8344 this._size(); 8345 this._position(); 8346 this._createOverlay(); 8347 this._moveToTop( null, true ); 8348 8349 // Ensure the overlay is moved to the top with the dialog, but only when 8350 // opening. The overlay shouldn't move after the dialog is open so that 8351 // modeless dialogs opened after the modal dialog stack properly. 8352 if ( this.overlay ) { 8353 this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 ); 8354 } 8355 8356 this._show( this.uiDialog, this.options.show, function() { 8357 that._focusTabbable(); 8358 that._trigger( "focus" ); 8359 }); 8360 8361 // Track the dialog immediately upon openening in case a focus event 8362 // somehow occurs outside of the dialog before an element inside the 8363 // dialog is focused (#10152) 8364 this._makeFocusTarget(); 8365 8366 this._trigger( "open" ); 8367 }, 8368 8369 _focusTabbable: function() { 8370 // Set focus to the first match: 8371 // 1. An element that was focused previously 8372 // 2. First element inside the dialog matching [autofocus] 8373 // 3. Tabbable element inside the content element 8374 // 4. Tabbable element inside the buttonpane 8375 // 5. The close button 8376 // 6. The dialog itself 8377 var hasFocus = this._focusedElement; 8378 if ( !hasFocus ) { 8379 hasFocus = this.element.find( "[autofocus]" ); 8380 } 8381 if ( !hasFocus.length ) { 8382 hasFocus = this.element.find( ":tabbable" ); 8383 } 8384 if ( !hasFocus.length ) { 8385 hasFocus = this.uiDialogButtonPane.find( ":tabbable" ); 8386 } 8387 if ( !hasFocus.length ) { 8388 hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" ); 8389 } 8390 if ( !hasFocus.length ) { 8391 hasFocus = this.uiDialog; 8392 } 8393 hasFocus.eq( 0 ).focus(); 8394 }, 8395 8396 _keepFocus: function( event ) { 8397 function checkFocus() { 8398 var activeElement = this.document[0].activeElement, 8399 isActive = this.uiDialog[0] === activeElement || 8400 $.contains( this.uiDialog[0], activeElement ); 8401 if ( !isActive ) { 8402 this._focusTabbable(); 8403 } 8404 } 8405 event.preventDefault(); 8406 checkFocus.call( this ); 8407 // support: IE 8408 // IE <= 8 doesn't prevent moving focus even with event.preventDefault() 8409 // so we check again later 8410 this._delay( checkFocus ); 8411 }, 8412 8413 _createWrapper: function() { 8414 this.uiDialog = $("<div>") 8415 .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " + 8416 this.options.dialogClass ) 8417 .hide() 8418 .attr({ 8419 // Setting tabIndex makes the div focusable 8420 tabIndex: -1, 8421 role: "dialog" 8422 }) 8423 .appendTo( this._appendTo() ); 8424 8425 this._on( this.uiDialog, { 8426 keydown: function( event ) { 8427 if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && 8428 event.keyCode === $.ui.keyCode.ESCAPE ) { 8429 event.preventDefault(); 8430 this.close( event ); 8431 return; 8432 } 8433 8434 // prevent tabbing out of dialogs 8435 if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) { 8436 return; 8437 } 8438 var tabbables = this.uiDialog.find( ":tabbable" ), 8439 first = tabbables.filter( ":first" ), 8440 last = tabbables.filter( ":last" ); 8441 8442 if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) { 8443 this._delay(function() { 8444 first.focus(); 8445 }); 8446 event.preventDefault(); 8447 } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) { 8448 this._delay(function() { 8449 last.focus(); 8450 }); 8451 event.preventDefault(); 8452 } 8453 }, 8454 mousedown: function( event ) { 8455 if ( this._moveToTop( event ) ) { 8456 this._focusTabbable(); 8457 } 8458 } 8459 }); 8460 8461 // We assume that any existing aria-describedby attribute means 8462 // that the dialog content is marked up properly 8463 // otherwise we brute force the content as the description 8464 if ( !this.element.find( "[aria-describedby]" ).length ) { 8465 this.uiDialog.attr({ 8466 "aria-describedby": this.element.uniqueId().attr( "id" ) 8467 }); 8468 } 8469 }, 8470 8471 _createTitlebar: function() { 8472 var uiDialogTitle; 8473 8474 this.uiDialogTitlebar = $( "<div>" ) 8475 .addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" ) 8476 .prependTo( this.uiDialog ); 8477 this._on( this.uiDialogTitlebar, { 8478 mousedown: function( event ) { 8479 // Don't prevent click on close button (#8838) 8480 // Focusing a dialog that is partially scrolled out of view 8481 // causes the browser to scroll it into view, preventing the click event 8482 if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) { 8483 // Dialog isn't getting focus when dragging (#8063) 8484 this.uiDialog.focus(); 8485 } 8486 } 8487 }); 8488 8489 // support: IE 8490 // Use type="button" to prevent enter keypresses in textboxes from closing the 8491 // dialog in IE (#9312) 8492 this.uiDialogTitlebarClose = $( "<button type='button'></button>" ) 8493 .button({ 8494 label: this.options.closeText, 8495 icons: { 8496 primary: "ui-icon-closethick" 8497 }, 8498 text: false 8499 }) 8500 .addClass( "ui-dialog-titlebar-close" ) 8501 .appendTo( this.uiDialogTitlebar ); 8502 this._on( this.uiDialogTitlebarClose, { 8503 click: function( event ) { 8504 event.preventDefault(); 8505 this.close( event ); 8506 } 8507 }); 8508 8509 uiDialogTitle = $( "<span>" ) 8510 .uniqueId() 8511 .addClass( "ui-dialog-title" ) 8512 .prependTo( this.uiDialogTitlebar ); 8513 this._title( uiDialogTitle ); 8514 8515 this.uiDialog.attr({ 8516 "aria-labelledby": uiDialogTitle.attr( "id" ) 8517 }); 8518 }, 8519 8520 _title: function( title ) { 8521 if ( !this.options.title ) { 8522 title.html( " " ); 8523 } 8524 title.text( this.options.title ); 8525 }, 8526 8527 _createButtonPane: function() { 8528 this.uiDialogButtonPane = $( "<div>" ) 8529 .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" ); 8530 8531 this.uiButtonSet = $( "<div>" ) 8532 .addClass( "ui-dialog-buttonset" ) 8533 .appendTo( this.uiDialogButtonPane ); 8534 8535 this._createButtons(); 8536 }, 8537 8538 _createButtons: function() { 8539 var that = this, 8540 buttons = this.options.buttons; 8541 8542 // if we already have a button pane, remove it 8543 this.uiDialogButtonPane.remove(); 8544 this.uiButtonSet.empty(); 8545 8546 if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) { 8547 this.uiDialog.removeClass( "ui-dialog-buttons" ); 8548 return; 8549 } 8550 8551 $.each( buttons, function( name, props ) { 8552 var click, buttonOptions; 8553 props = $.isFunction( props ) ? 8554 { click: props, text: name } : 8555 props; 8556 // Default to a non-submitting button 8557 props = $.extend( { type: "button" }, props ); 8558 // Change the context for the click callback to be the main element 8559 click = props.click; 8560 props.click = function() { 8561 click.apply( that.element[ 0 ], arguments ); 8562 }; 8563 buttonOptions = { 8564 icons: props.icons, 8565 text: props.showText 8566 }; 8567 delete props.icons; 8568 delete props.showText; 8569 $( "<button></button>", props ) 8570 .button( buttonOptions ) 8571 .appendTo( that.uiButtonSet ); 8572 }); 8573 this.uiDialog.addClass( "ui-dialog-buttons" ); 8574 this.uiDialogButtonPane.appendTo( this.uiDialog ); 8575 }, 8576 8577 _makeDraggable: function() { 8578 var that = this, 8579 options = this.options; 8580 8581 function filteredUi( ui ) { 8582 return { 8583 position: ui.position, 8584 offset: ui.offset 8585 }; 8586 } 8587 8588 this.uiDialog.draggable({ 8589 cancel: ".ui-dialog-content, .ui-dialog-titlebar-close", 8590 handle: ".ui-dialog-titlebar", 8591 containment: "document", 8592 start: function( event, ui ) { 8593 $( this ).addClass( "ui-dialog-dragging" ); 8594 that._blockFrames(); 8595 that._trigger( "dragStart", event, filteredUi( ui ) ); 8596 }, 8597 drag: function( event, ui ) { 8598 that._trigger( "drag", event, filteredUi( ui ) ); 8599 }, 8600 stop: function( event, ui ) { 8601 var left = ui.offset.left - that.document.scrollLeft(), 8602 top = ui.offset.top - that.document.scrollTop(); 8603 8604 options.position = { 8605 my: "left top", 8606 at: "left" + (left >= 0 ? "+" : "") + left + " " + 8607 "top" + (top >= 0 ? "+" : "") + top, 8608 of: that.window 8609 }; 8610 $( this ).removeClass( "ui-dialog-dragging" ); 8611 that._unblockFrames(); 8612 that._trigger( "dragStop", event, filteredUi( ui ) ); 8613 } 8614 }); 8615 }, 8616 8617 _makeResizable: function() { 8618 var that = this, 8619 options = this.options, 8620 handles = options.resizable, 8621 // .ui-resizable has position: relative defined in the stylesheet 8622 // but dialogs have to use absolute or fixed positioning 8623 position = this.uiDialog.css("position"), 8624 resizeHandles = typeof handles === "string" ? 8625 handles : 8626 "n,e,s,w,se,sw,ne,nw"; 8627 8628 function filteredUi( ui ) { 8629 return { 8630 originalPosition: ui.originalPosition, 8631 originalSize: ui.originalSize, 8632 position: ui.position, 8633 size: ui.size 8634 }; 8635 } 8636 8637 this.uiDialog.resizable({ 8638 cancel: ".ui-dialog-content", 8639 containment: "document", 8640 alsoResize: this.element, 8641 maxWidth: options.maxWidth, 8642 maxHeight: options.maxHeight, 8643 minWidth: options.minWidth, 8644 minHeight: this._minHeight(), 8645 handles: resizeHandles, 8646 start: function( event, ui ) { 8647 $( this ).addClass( "ui-dialog-resizing" ); 8648 that._blockFrames(); 8649 that._trigger( "resizeStart", event, filteredUi( ui ) ); 8650 }, 8651 resize: function( event, ui ) { 8652 that._trigger( "resize", event, filteredUi( ui ) ); 8653 }, 8654 stop: function( event, ui ) { 8655 var offset = that.uiDialog.offset(), 8656 left = offset.left - that.document.scrollLeft(), 8657 top = offset.top - that.document.scrollTop(); 8658 8659 options.height = that.uiDialog.height(); 8660 options.width = that.uiDialog.width(); 8661 options.position = { 8662 my: "left top", 8663 at: "left" + (left >= 0 ? "+" : "") + left + " " + 8664 "top" + (top >= 0 ? "+" : "") + top, 8665 of: that.window 8666 }; 8667 $( this ).removeClass( "ui-dialog-resizing" ); 8668 that._unblockFrames(); 8669 that._trigger( "resizeStop", event, filteredUi( ui ) ); 8670 } 8671 }) 8672 .css( "position", position ); 8673 }, 8674 8675 _trackFocus: function() { 8676 this._on( this.widget(), { 8677 focusin: function( event ) { 8678 this._makeFocusTarget(); 8679 this._focusedElement = $( event.target ); 8680 } 8681 }); 8682 }, 8683 8684 _makeFocusTarget: function() { 8685 this._untrackInstance(); 8686 this._trackingInstances().unshift( this ); 8687 }, 8688 8689 _untrackInstance: function() { 8690 var instances = this._trackingInstances(), 8691 exists = $.inArray( this, instances ); 8692 if ( exists !== -1 ) { 8693 instances.splice( exists, 1 ); 8694 } 8695 }, 8696 8697 _trackingInstances: function() { 8698 var instances = this.document.data( "ui-dialog-instances" ); 8699 if ( !instances ) { 8700 instances = []; 8701 this.document.data( "ui-dialog-instances", instances ); 8702 } 8703 return instances; 8704 }, 8705 8706 _minHeight: function() { 8707 var options = this.options; 8708 8709 return options.height === "auto" ? 8710 options.minHeight : 8711 Math.min( options.minHeight, options.height ); 8712 }, 8713 8714 _position: function() { 8715 // Need to show the dialog to get the actual offset in the position plugin 8716 var isVisible = this.uiDialog.is( ":visible" ); 8717 if ( !isVisible ) { 8718 this.uiDialog.show(); 8719 } 8720 this.uiDialog.position( this.options.position ); 8721 if ( !isVisible ) { 8722 this.uiDialog.hide(); 8723 } 8724 }, 8725 8726 _setOptions: function( options ) { 8727 var that = this, 8728 resize = false, 8729 resizableOptions = {}; 8730 8731 $.each( options, function( key, value ) { 8732 that._setOption( key, value ); 8733 8734 if ( key in that.sizeRelatedOptions ) { 8735 resize = true; 8736 } 8737 if ( key in that.resizableRelatedOptions ) { 8738 resizableOptions[ key ] = value; 8739 } 8740 }); 8741 8742 if ( resize ) { 8743 this._size(); 8744 this._position(); 8745 } 8746 if ( this.uiDialog.is( ":data(ui-resizable)" ) ) { 8747 this.uiDialog.resizable( "option", resizableOptions ); 8748 } 8749 }, 8750 8751 _setOption: function( key, value ) { 8752 var isDraggable, isResizable, 8753 uiDialog = this.uiDialog; 8754 8755 if ( key === "dialogClass" ) { 8756 uiDialog 8757 .removeClass( this.options.dialogClass ) 8758 .addClass( value ); 8759 } 8760 8761 if ( key === "disabled" ) { 8762 return; 8763 } 8764 8765 this._super( key, value ); 8766 8767 if ( key === "appendTo" ) { 8768 this.uiDialog.appendTo( this._appendTo() ); 8769 } 8770 8771 if ( key === "buttons" ) { 8772 this._createButtons(); 8773 } 8774 8775 if ( key === "closeText" ) { 8776 this.uiDialogTitlebarClose.button({ 8777 // Ensure that we always pass a string 8778 label: "" + value 8779 }); 8780 } 8781 8782 if ( key === "draggable" ) { 8783 isDraggable = uiDialog.is( ":data(ui-draggable)" ); 8784 if ( isDraggable && !value ) { 8785 uiDialog.draggable( "destroy" ); 8786 } 8787 8788 if ( !isDraggable && value ) { 8789 this._makeDraggable(); 8790 } 8791 } 8792 8793 if ( key === "position" ) { 8794 this._position(); 8795 } 8796 8797 if ( key === "resizable" ) { 8798 // currently resizable, becoming non-resizable 8799 isResizable = uiDialog.is( ":data(ui-resizable)" ); 8800 if ( isResizable && !value ) { 8801 uiDialog.resizable( "destroy" ); 8802 } 8803 8804 // currently resizable, changing handles 8805 if ( isResizable && typeof value === "string" ) { 8806 uiDialog.resizable( "option", "handles", value ); 8807 } 8808 8809 // currently non-resizable, becoming resizable 8810 if ( !isResizable && value !== false ) { 8811 this._makeResizable(); 8812 } 8813 } 8814 8815 if ( key === "title" ) { 8816 this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) ); 8817 } 8818 }, 8819 8820 _size: function() { 8821 // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content 8822 // divs will both have width and height set, so we need to reset them 8823 var nonContentHeight, minContentHeight, maxContentHeight, 8824 options = this.options; 8825 8826 // Reset content sizing 8827 this.element.show().css({ 8828 width: "auto", 8829 minHeight: 0, 8830 maxHeight: "none", 8831 height: 0 8832 }); 8833 8834 if ( options.minWidth > options.width ) { 8835 options.width = options.minWidth; 8836 } 8837 8838 // reset wrapper sizing 8839 // determine the height of all the non-content elements 8840 nonContentHeight = this.uiDialog.css({ 8841 height: "auto", 8842 width: options.width 8843 }) 8844 .outerHeight(); 8845 minContentHeight = Math.max( 0, options.minHeight - nonContentHeight ); 8846 maxContentHeight = typeof options.maxHeight === "number" ? 8847 Math.max( 0, options.maxHeight - nonContentHeight ) : 8848 "none"; 8849 8850 if ( options.height === "auto" ) { 8851 this.element.css({ 8852 minHeight: minContentHeight, 8853 maxHeight: maxContentHeight, 8854 height: "auto" 8855 }); 8856 } else { 8857 this.element.height( Math.max( 0, options.height - nonContentHeight ) ); 8858 } 8859 8860 if ( this.uiDialog.is( ":data(ui-resizable)" ) ) { 8861 this.uiDialog.resizable( "option", "minHeight", this._minHeight() ); 8862 } 8863 }, 8864 8865 _blockFrames: function() { 8866 this.iframeBlocks = this.document.find( "iframe" ).map(function() { 8867 var iframe = $( this ); 8868 8869 return $( "<div>" ) 8870 .css({ 8871 position: "absolute", 8872 width: iframe.outerWidth(), 8873 height: iframe.outerHeight() 8874 }) 8875 .appendTo( iframe.parent() ) 8876 .offset( iframe.offset() )[0]; 8877 }); 8878 }, 8879 8880 _unblockFrames: function() { 8881 if ( this.iframeBlocks ) { 8882 this.iframeBlocks.remove(); 8883 delete this.iframeBlocks; 8884 } 8885 }, 8886 8887 _allowInteraction: function( event ) { 8888 if ( $( event.target ).closest( ".ui-dialog" ).length ) { 8889 return true; 8890 } 8891 8892 // TODO: Remove hack when datepicker implements 8893 // the .ui-front logic (#8989) 8894 return !!$( event.target ).closest( ".ui-datepicker" ).length; 8895 }, 8896 8897 _createOverlay: function() { 8898 if ( !this.options.modal ) { 8899 return; 8900 } 8901 8902 // We use a delay in case the overlay is created from an 8903 // event that we're going to be cancelling (#2804) 8904 var isOpening = true; 8905 this._delay(function() { 8906 isOpening = false; 8907 }); 8908 8909 if ( !this.document.data( "ui-dialog-overlays" ) ) { 8910 8911 // Prevent use of anchors and inputs 8912 // Using _on() for an event handler shared across many instances is 8913 // safe because the dialogs stack and must be closed in reverse order 8914 this._on( this.document, { 8915 focusin: function( event ) { 8916 if ( isOpening ) { 8917 return; 8918 } 8919 8920 if ( !this._allowInteraction( event ) ) { 8921 event.preventDefault(); 8922 this._trackingInstances()[ 0 ]._focusTabbable(); 8923 } 8924 } 8925 }); 8926 } 8927 8928 this.overlay = $( "<div>" ) 8929 .addClass( "ui-widget-overlay ui-front" ) 8930 .appendTo( this._appendTo() ); 8931 this._on( this.overlay, { 8932 mousedown: "_keepFocus" 8933 }); 8934 this.document.data( "ui-dialog-overlays", 8935 (this.document.data( "ui-dialog-overlays" ) || 0) + 1 ); 8936 }, 8937 8938 _destroyOverlay: function() { 8939 if ( !this.options.modal ) { 8940 return; 8941 } 8942 8943 if ( this.overlay ) { 8944 var overlays = this.document.data( "ui-dialog-overlays" ) - 1; 8945 8946 if ( !overlays ) { 8947 this.document 8948 .unbind( "focusin" ) 8949 .removeData( "ui-dialog-overlays" ); 8950 } else { 8951 this.document.data( "ui-dialog-overlays", overlays ); 8952 } 8953 8954 this.overlay.remove(); 8955 this.overlay = null; 8956 } 8957 } 8958}); 8959 8960 8961/*! 8962 * jQuery UI Droppable 1.11.
89622 8963 * http://jqueryui.com 8964 * 8965 * Copyright 2014 jQuery Foundation and other contributors 8966 * Released under the MIT license. 8967 * http://jquery.org/license 8968 * 8969 * http://api.jqueryui.com/droppable/ 8970 */ 8971 8972 8973$.widget( "ui.droppable", { 8974 version: "1.11.2
vendor: 11,129 bytes, lines 8974-9359
8974", 8975 widgetEventPrefix: "drop", 8976 options: { 8977 accept: "*", 8978 activeClass: false, 8979 addClasses: true, 8980 greedy: false, 8981 hoverClass: false, 8982 scope: "default", 8983 tolerance: "intersect", 8984 8985 // callbacks 8986 activate: null, 8987 deactivate: null, 8988 drop: null, 8989 out: null, 8990 over: null 8991 }, 8992 _create: function() { 8993 8994 var proportions, 8995 o = this.options, 8996 accept = o.accept; 8997 8998 this.isover = false; 8999 this.isout = true; 9000 9001 this.accept = $.isFunction( accept ) ? accept : function( d ) { 9002 return d.is( accept ); 9003 }; 9004 9005 this.proportions = function( /* valueToWrite */ ) { 9006 if ( arguments.length ) { 9007 // Store the droppable's proportions 9008 proportions = arguments[ 0 ]; 9009 } else { 9010 // Retrieve or derive the droppable's proportions 9011 return proportions ? 9012 proportions : 9013 proportions = { 9014 width: this.element[ 0 ].offsetWidth, 9015 height: this.element[ 0 ].offsetHeight 9016 }; 9017 } 9018 }; 9019 9020 this._addToManager( o.scope ); 9021 9022 o.addClasses && this.element.addClass( "ui-droppable" ); 9023 9024 }, 9025 9026 _addToManager: function( scope ) { 9027 // Add the reference and positions to the manager 9028 $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || []; 9029 $.ui.ddmanager.droppables[ scope ].push( this ); 9030 }, 9031 9032 _splice: function( drop ) { 9033 var i = 0; 9034 for ( ; i < drop.length; i++ ) { 9035 if ( drop[ i ] === this ) { 9036 drop.splice( i, 1 ); 9037 } 9038 } 9039 }, 9040 9041 _destroy: function() { 9042 var drop = $.ui.ddmanager.droppables[ this.options.scope ]; 9043 9044 this._splice( drop ); 9045 9046 this.element.removeClass( "ui-droppable ui-droppable-disabled" ); 9047 }, 9048 9049 _setOption: function( key, value ) { 9050 9051 if ( key === "accept" ) { 9052 this.accept = $.isFunction( value ) ? value : function( d ) { 9053 return d.is( value ); 9054 }; 9055 } else if ( key === "scope" ) { 9056 var drop = $.ui.ddmanager.droppables[ this.options.scope ]; 9057 9058 this._splice( drop ); 9059 this._addToManager( value ); 9060 } 9061 9062 this._super( key, value ); 9063 }, 9064 9065 _activate: function( event ) { 9066 var draggable = $.ui.ddmanager.current; 9067 if ( this.options.activeClass ) { 9068 this.element.addClass( this.options.activeClass ); 9069 } 9070 if ( draggable ){ 9071 this._trigger( "activate", event, this.ui( draggable ) ); 9072 } 9073 }, 9074 9075 _deactivate: function( event ) { 9076 var draggable = $.ui.ddmanager.current; 9077 if ( this.options.activeClass ) { 9078 this.element.removeClass( this.options.activeClass ); 9079 } 9080 if ( draggable ){ 9081 this._trigger( "deactivate", event, this.ui( draggable ) ); 9082 } 9083 }, 9084 9085 _over: function( event ) { 9086 9087 var draggable = $.ui.ddmanager.current; 9088 9089 // Bail if draggable and droppable are same element 9090 if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) { 9091 return; 9092 } 9093 9094 if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { 9095 if ( this.options.hoverClass ) { 9096 this.element.addClass( this.options.hoverClass ); 9097 } 9098 this._trigger( "over", event, this.ui( draggable ) ); 9099 } 9100 9101 }, 9102 9103 _out: function( event ) { 9104 9105 var draggable = $.ui.ddmanager.current; 9106 9107 // Bail if draggable and droppable are same element 9108 if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) { 9109 return; 9110 } 9111 9112 if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { 9113 if ( this.options.hoverClass ) { 9114 this.element.removeClass( this.options.hoverClass ); 9115 } 9116 this._trigger( "out", event, this.ui( draggable ) ); 9117 } 9118 9119 }, 9120 9121 _drop: function( event, custom ) { 9122 9123 var draggable = custom || $.ui.ddmanager.current, 9124 childrenIntersection = false; 9125 9126 // Bail if draggable and droppable are same element 9127 if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) { 9128 return false; 9129 } 9130 9131 this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() { 9132 var inst = $( this ).droppable( "instance" ); 9133 if ( 9134 inst.options.greedy && 9135 !inst.options.disabled && 9136 inst.options.scope === draggable.options.scope && 9137 inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) && 9138 $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event ) 9139 ) { childrenIntersection = true; return false; } 9140 }); 9141 if ( childrenIntersection ) { 9142 return false; 9143 } 9144 9145 if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { 9146 if ( this.options.activeClass ) { 9147 this.element.removeClass( this.options.activeClass ); 9148 } 9149 if ( this.options.hoverClass ) { 9150 this.element.removeClass( this.options.hoverClass ); 9151 } 9152 this._trigger( "drop", event, this.ui( draggable ) ); 9153 return this.element; 9154 } 9155 9156 return false; 9157 9158 }, 9159 9160 ui: function( c ) { 9161 return { 9162 draggable: ( c.currentItem || c.element ), 9163 helper: c.helper, 9164 position: c.position, 9165 offset: c.positionAbs 9166 }; 9167 } 9168 9169}); 9170 9171$.ui.intersect = (function() { 9172 function isOverAxis( x, reference, size ) { 9173 return ( x >= reference ) && ( x < ( reference + size ) ); 9174 } 9175 9176 return function( draggable, droppable, toleranceMode, event ) { 9177 9178 if ( !droppable.offset ) { 9179 return false; 9180 } 9181 9182 var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left, 9183 y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top, 9184 x2 = x1 + draggable.helperProportions.width, 9185 y2 = y1 + draggable.helperProportions.height, 9186 l = droppable.offset.left, 9187 t = droppable.offset.top, 9188 r = l + droppable.proportions().width, 9189 b = t + droppable.proportions().height; 9190 9191 switch ( toleranceMode ) { 9192 case "fit": 9193 return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b ); 9194 case "intersect": 9195 return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half 9196 x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half 9197 t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half 9198 y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half 9199 case "pointer": 9200 return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width ); 9201 case "touch": 9202 return ( 9203 ( y1 >= t && y1 <= b ) || // Top edge touching 9204 ( y2 >= t && y2 <= b ) || // Bottom edge touching 9205 ( y1 < t && y2 > b ) // Surrounded vertically 9206 ) && ( 9207 ( x1 >= l && x1 <= r ) || // Left edge touching 9208 ( x2 >= l && x2 <= r ) || // Right edge touching 9209 ( x1 < l && x2 > r ) // Surrounded horizontally 9210 ); 9211 default: 9212 return false; 9213 } 9214 }; 9215})(); 9216 9217/* 9218 This manager tracks offsets of draggables and droppables 9219*/ 9220$.ui.ddmanager = { 9221 current: null, 9222 droppables: { "default": [] }, 9223 prepareOffsets: function( t, event ) { 9224 9225 var i, j, 9226 m = $.ui.ddmanager.droppables[ t.options.scope ] || [], 9227 type = event ? event.type : null, // workaround for #2317 9228 list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack(); 9229 9230 droppablesLoop: for ( i = 0; i < m.length; i++ ) { 9231 9232 // No disabled and non-accepted 9233 if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) { 9234 continue; 9235 } 9236 9237 // Filter out elements in the current dragged item 9238 for ( j = 0; j < list.length; j++ ) { 9239 if ( list[ j ] === m[ i ].element[ 0 ] ) { 9240 m[ i ].proportions().height = 0; 9241 continue droppablesLoop; 9242 } 9243 } 9244 9245 m[ i ].visible = m[ i ].element.css( "display" ) !== "none"; 9246 if ( !m[ i ].visible ) { 9247 continue; 9248 } 9249 9250 // Activate the droppable if used directly from draggables 9251 if ( type === "mousedown" ) { 9252 m[ i ]._activate.call( m[ i ], event ); 9253 } 9254 9255 m[ i ].offset = m[ i ].element.offset(); 9256 m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight }); 9257 9258 } 9259 9260 }, 9261 drop: function( draggable, event ) { 9262 9263 var dropped = false; 9264 // Create a copy of the droppables in case the list changes during the drop (#9116) 9265 $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() { 9266 9267 if ( !this.options ) { 9268 return; 9269 } 9270 if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) { 9271 dropped = this._drop.call( this, event ) || dropped; 9272 } 9273 9274 if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { 9275 this.isout = true; 9276 this.isover = false; 9277 this._deactivate.call( this, event ); 9278 } 9279 9280 }); 9281 return dropped; 9282 9283 }, 9284 dragStart: function( draggable, event ) { 9285 // Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003) 9286 draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() { 9287 if ( !draggable.options.refreshPositions ) { 9288 $.ui.ddmanager.prepareOffsets( draggable, event ); 9289 } 9290 }); 9291 }, 9292 drag: function( draggable, event ) { 9293 9294 // If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. 9295 if ( draggable.options.refreshPositions ) { 9296 $.ui.ddmanager.prepareOffsets( draggable, event ); 9297 } 9298 9299 // Run through all droppables and check their positions based on specific tolerance options 9300 $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() { 9301 9302 if ( this.options.disabled || this.greedyChild || !this.visible ) { 9303 return; 9304 } 9305 9306 var parentInstance, scope, parent, 9307 intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ), 9308 c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null ); 9309 if ( !c ) { 9310 return; 9311 } 9312 9313 if ( this.options.greedy ) { 9314 // find droppable parents with same scope 9315 scope = this.options.scope; 9316 parent = this.element.parents( ":data(ui-droppable)" ).filter(function() { 9317 return $( this ).droppable( "instance" ).options.scope === scope; 9318 }); 9319 9320 if ( parent.length ) { 9321 parentInstance = $( parent[ 0 ] ).droppable( "instance" ); 9322 parentInstance.greedyChild = ( c === "isover" ); 9323 } 9324 } 9325 9326 // we just moved into a greedy child 9327 if ( parentInstance && c === "isover" ) { 9328 parentInstance.isover = false; 9329 parentInstance.isout = true; 9330 parentInstance._out.call( parentInstance, event ); 9331 } 9332 9333 this[ c ] = true; 9334 this[c === "isout" ? "isover" : "isout"] = false; 9335 this[c === "isover" ? "_over" : "_out"].call( this, event ); 9336 9337 // we just moved out of a greedy child 9338 if ( parentInstance && c === "isout" ) { 9339 parentInstance.isout = false; 9340 parentInstance.isover = true; 9341 parentInstance._over.call( parentInstance, event ); 9342 } 9343 }); 9344 9345 }, 9346 dragStop: function( draggable, event ) { 9347 draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" ); 9348 // Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003) 9349 if ( !draggable.options.refreshPositions ) { 9350 $.ui.ddmanager.prepareOffsets( draggable, event ); 9351 } 9352 } 9353}; 9354 9355var droppable = $.ui.droppable; 9356 9357 9358/*! 9359 * jQuery UI Effects 1.11.
93592
vendor: 15,438 bytes, lines 9359-9983
9359 9360 * http://jqueryui.com 9361 * 9362 * Copyright 2014 jQuery Foundation and other contributors 9363 * Released under the MIT license. 9364 * http://jquery.org/license 9365 * 9366 * http://api.jqueryui.com/category/effects-core/ 9367 */ 9368 9369 9370var dataSpace = "ui-effects-", 9371 9372 // Create a local jQuery because jQuery Color relies on it and the 9373 // global may not exist with AMD and a custom build (#10199) 9374 jQuery = $; 9375 9376$.effects = { 9377 effect: {} 9378}; 9379 9380/*! 9381 * jQuery Color Animations v2.1.2 9382 * https://github.com/jquery/jquery-color 9383 * 9384 * Copyright 2014 jQuery Foundation and other contributors 9385 * Released under the MIT license. 9386 * http://jquery.org/license 9387 * 9388 * Date: Wed Jan 16 08:47:09 2013 -0600 9389 */ 9390(function( jQuery, undefined ) { 9391 9392 var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", 9393 9394 // plusequals test for += 100 -= 100 9395 rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, 9396 // a set of RE's that can match strings and generate color tuples. 9397 stringParsers = [ { 9398 re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, 9399 parse: function( execResult ) { 9400 return [ 9401 execResult[ 1 ], 9402 execResult[ 2 ], 9403 execResult[ 3 ], 9404 execResult[ 4 ] 9405 ]; 9406 } 9407 }, { 9408 re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, 9409 parse: function( execResult ) { 9410 return [ 9411 execResult[ 1 ] * 2.55, 9412 execResult[ 2 ] * 2.55, 9413 execResult[ 3 ] * 2.55, 9414 execResult[ 4 ] 9415 ]; 9416 } 9417 }, { 9418 // this regex ignores A-F because it's compared against an already lowercased string 9419 re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, 9420 parse: function( execResult ) { 9421 return [ 9422 parseInt( execResult[ 1 ], 16 ), 9423 parseInt( execResult[ 2 ], 16 ), 9424 parseInt( execResult[ 3 ], 16 ) 9425 ]; 9426 } 9427 }, { 9428 // this regex ignores A-F because it's compared against an already lowercased string 9429 re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, 9430 parse: function( execResult ) { 9431 return [ 9432 parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), 9433 parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), 9434 parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) 9435 ]; 9436 } 9437 }, { 9438 re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, 9439 space: "hsla", 9440 parse: function( execResult ) { 9441 return [ 9442 execResult[ 1 ], 9443 execResult[ 2 ] / 100, 9444 execResult[ 3 ] / 100, 9445 execResult[ 4 ] 9446 ]; 9447 } 9448 } ], 9449 9450 // jQuery.Color( ) 9451 color = jQuery.Color = function( color, green, blue, alpha ) { 9452 return new jQuery.Color.fn.parse( color, green, blue, alpha ); 9453 }, 9454 spaces = { 9455 rgba: { 9456 props: { 9457 red: { 9458 idx: 0, 9459 type: "byte" 9460 }, 9461 green: { 9462 idx: 1, 9463 type: "byte" 9464 }, 9465 blue: { 9466 idx: 2, 9467 type: "byte" 9468 } 9469 } 9470 }, 9471 9472 hsla: { 9473 props: { 9474 hue: { 9475 idx: 0, 9476 type: "degrees" 9477 }, 9478 saturation: { 9479 idx: 1, 9480 type: "percent" 9481 }, 9482 lightness: { 9483 idx: 2, 9484 type: "percent" 9485 } 9486 } 9487 } 9488 }, 9489 propTypes = { 9490 "byte": { 9491 floor: true, 9492 max: 255 9493 }, 9494 "percent": { 9495 max: 1 9496 }, 9497 "degrees": { 9498 mod: 360, 9499 floor: true 9500 } 9501 }, 9502 support = color.support = {}, 9503 9504 // element for support tests 9505 supportElem = jQuery( "<p>" )[ 0 ], 9506 9507 // colors = jQuery.Color.names 9508 colors, 9509 9510 // local aliases of functions called often 9511 each = jQuery.each; 9512 9513// determine rgba support immediately 9514supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; 9515support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1; 9516 9517// define cache name and alpha properties 9518// for rgba and hsla spaces 9519each( spaces, function( spaceName, space ) { 9520 space.cache = "_" + spaceName; 9521 space.props.alpha = { 9522 idx: 3, 9523 type: "percent", 9524 def: 1 9525 }; 9526}); 9527 9528function clamp( value, prop, allowEmpty ) { 9529 var type = propTypes[ prop.type ] || {}; 9530 9531 if ( value == null ) { 9532 return (allowEmpty || !prop.def) ? null : prop.def; 9533 } 9534 9535 // ~~ is an short way of doing floor for positive numbers 9536 value = type.floor ? ~~value : parseFloat( value ); 9537 9538 // IE will pass in empty strings as value for alpha, 9539 // which will hit this case 9540 if ( isNaN( value ) ) { 9541 return prop.def; 9542 } 9543 9544 if ( type.mod ) { 9545 // we add mod before modding to make sure that negatives values 9546 // get converted properly: -10 -> 350 9547 return (value + type.mod) % type.mod; 9548 } 9549 9550 // for now all property types without mod have min and max 9551 return 0 > value ? 0 : type.max < value ? type.max : value; 9552} 9553 9554function stringParse( string ) { 9555 var inst = color(), 9556 rgba = inst._rgba = []; 9557 9558 string = string.toLowerCase(); 9559 9560 each( stringParsers, function( i, parser ) { 9561 var parsed, 9562 match = parser.re.exec( string ), 9563 values = match && parser.parse( match ), 9564 spaceName = parser.space || "rgba"; 9565 9566 if ( values ) { 9567 parsed = inst[ spaceName ]( values ); 9568 9569 // if this was an rgba parse the assignment might happen twice 9570 // oh well.... 9571 inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ]; 9572 rgba = inst._rgba = parsed._rgba; 9573 9574 // exit each( stringParsers ) here because we matched 9575 return false; 9576 } 9577 }); 9578 9579 // Found a stringParser that handled it 9580 if ( rgba.length ) { 9581 9582 // if this came from a parsed string, force "transparent" when alpha is 0 9583 // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) 9584 if ( rgba.join() === "0,0,0,0" ) { 9585 jQuery.extend( rgba, colors.transparent ); 9586 } 9587 return inst; 9588 } 9589 9590 // named colors 9591 return colors[ string ]; 9592} 9593 9594color.fn = jQuery.extend( color.prototype, { 9595 parse: function( red, green, blue, alpha ) { 9596 if ( red === undefined ) { 9597 this._rgba = [ null, null, null, null ]; 9598 return this; 9599 } 9600 if ( red.jquery || red.nodeType ) { 9601 red = jQuery( red ).css( green ); 9602 green = undefined; 9603 } 9604 9605 var inst = this, 9606 type = jQuery.type( red ), 9607 rgba = this._rgba = []; 9608 9609 // more than 1 argument specified - assume ( red, green, blue, alpha ) 9610 if ( green !== undefined ) { 9611 red = [ red, green, blue, alpha ]; 9612 type = "array"; 9613 } 9614 9615 if ( type === "string" ) { 9616 return this.parse( stringParse( red ) || colors._default ); 9617 } 9618 9619 if ( type === "array" ) { 9620 each( spaces.rgba.props, function( key, prop ) { 9621 rgba[ prop.idx ] = clamp( red[ prop.idx ], prop ); 9622 }); 9623 return this; 9624 } 9625 9626 if ( type === "object" ) { 9627 if ( red instanceof color ) { 9628 each( spaces, function( spaceName, space ) { 9629 if ( red[ space.cache ] ) { 9630 inst[ space.cache ] = red[ space.cache ].slice(); 9631 } 9632 }); 9633 } else { 9634 each( spaces, function( spaceName, space ) { 9635 var cache = space.cache; 9636 each( space.props, function( key, prop ) { 9637 9638 // if the cache doesn't exist, and we know how to convert 9639 if ( !inst[ cache ] && space.to ) { 9640 9641 // if the value was null, we don't need to copy it 9642 // if the key was alpha, we don't need to copy it either 9643 if ( key === "alpha" || red[ key ] == null ) { 9644 return; 9645 } 9646 inst[ cache ] = space.to( inst._rgba ); 9647 } 9648 9649 // this is the only case where we allow nulls for ALL properties. 9650 // call clamp with alwaysAllowEmpty 9651 inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true ); 9652 }); 9653 9654 // everything defined but alpha? 9655 if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) { 9656 // use the default of 1 9657 inst[ cache ][ 3 ] = 1; 9658 if ( space.from ) { 9659 inst._rgba = space.from( inst[ cache ] ); 9660 } 9661 } 9662 }); 9663 } 9664 return this; 9665 } 9666 }, 9667 is: function( compare ) { 9668 var is = color( compare ), 9669 same = true, 9670 inst = this; 9671 9672 each( spaces, function( _, space ) { 9673 var localCache, 9674 isCache = is[ space.cache ]; 9675 if (isCache) { 9676 localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || []; 9677 each( space.props, function( _, prop ) { 9678 if ( isCache[ prop.idx ] != null ) { 9679 same = ( isCache[ prop.idx ] === localCache[ prop.idx ] ); 9680 return same; 9681 } 9682 }); 9683 } 9684 return same; 9685 }); 9686 return same; 9687 }, 9688 _space: function() { 9689 var used = [], 9690 inst = this; 9691 each( spaces, function( spaceName, space ) { 9692 if ( inst[ space.cache ] ) { 9693 used.push( spaceName ); 9694 } 9695 }); 9696 return used.pop(); 9697 }, 9698 transition: function( other, distance ) { 9699 var end = color( other ), 9700 spaceName = end._space(), 9701 space = spaces[ spaceName ], 9702 startColor = this.alpha() === 0 ? color( "transparent" ) : this, 9703 start = startColor[ space.cache ] || space.to( startColor._rgba ), 9704 result = start.slice(); 9705 9706 end = end[ space.cache ]; 9707 each( space.props, function( key, prop ) { 9708 var index = prop.idx, 9709 startValue = start[ index ], 9710 endValue = end[ index ], 9711 type = propTypes[ prop.type ] || {}; 9712 9713 // if null, don't override start value 9714 if ( endValue === null ) { 9715 return; 9716 } 9717 // if null - use end 9718 if ( startValue === null ) { 9719 result[ index ] = endValue; 9720 } else { 9721 if ( type.mod ) { 9722 if ( endValue - startValue > type.mod / 2 ) { 9723 startValue += type.mod; 9724 } else if ( startValue - endValue > type.mod / 2 ) { 9725 startValue -= type.mod; 9726 } 9727 } 9728 result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop ); 9729 } 9730 }); 9731 return this[ spaceName ]( result ); 9732 }, 9733 blend: function( opaque ) { 9734 // if we are already opaque - return ourself 9735 if ( this._rgba[ 3 ] === 1 ) { 9736 return this; 9737 } 9738 9739 var rgb = this._rgba.slice(), 9740 a = rgb.pop(), 9741 blend = color( opaque )._rgba; 9742 9743 return color( jQuery.map( rgb, function( v, i ) { 9744 return ( 1 - a ) * blend[ i ] + a * v; 9745 })); 9746 }, 9747 toRgbaString: function() { 9748 var prefix = "rgba(", 9749 rgba = jQuery.map( this._rgba, function( v, i ) { 9750 return v == null ? ( i > 2 ? 1 : 0 ) : v; 9751 }); 9752 9753 if ( rgba[ 3 ] === 1 ) { 9754 rgba.pop(); 9755 prefix = "rgb("; 9756 } 9757 9758 return prefix + rgba.join() + ")"; 9759 }, 9760 toHslaString: function() { 9761 var prefix = "hsla(", 9762 hsla = jQuery.map( this.hsla(), function( v, i ) { 9763 if ( v == null ) { 9764 v = i > 2 ? 1 : 0; 9765 } 9766 9767 // catch 1 and 2 9768 if ( i && i < 3 ) { 9769 v = Math.round( v * 100 ) + "%"; 9770 } 9771 return v; 9772 }); 9773 9774 if ( hsla[ 3 ] === 1 ) { 9775 hsla.pop(); 9776 prefix = "hsl("; 9777 } 9778 return prefix + hsla.join() + ")"; 9779 }, 9780 toHexString: function( includeAlpha ) { 9781 var rgba = this._rgba.slice(), 9782 alpha = rgba.pop(); 9783 9784 if ( includeAlpha ) { 9785 rgba.push( ~~( alpha * 255 ) ); 9786 } 9787 9788 return "#" + jQuery.map( rgba, function( v ) { 9789 9790 // default to 0 when nulls exist 9791 v = ( v || 0 ).toString( 16 ); 9792 return v.length === 1 ? "0" + v : v; 9793 }).join(""); 9794 }, 9795 toString: function() { 9796 return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString(); 9797 } 9798}); 9799color.fn.parse.prototype = color.fn; 9800 9801// hsla conversions adapted from: 9802// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 9803 9804function hue2rgb( p, q, h ) { 9805 h = ( h + 1 ) % 1; 9806 if ( h * 6 < 1 ) { 9807 return p + ( q - p ) * h * 6; 9808 } 9809 if ( h * 2 < 1) { 9810 return q; 9811 } 9812 if ( h * 3 < 2 ) { 9813 return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6; 9814 } 9815 return p; 9816} 9817 9818spaces.hsla.to = function( rgba ) { 9819 if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) { 9820 return [ null, null, null, rgba[ 3 ] ]; 9821 } 9822 var r = rgba[ 0 ] / 255, 9823 g = rgba[ 1 ] / 255, 9824 b = rgba[ 2 ] / 255, 9825 a = rgba[ 3 ], 9826 max = Math.max( r, g, b ), 9827 min = Math.min( r, g, b ), 9828 diff = max - min, 9829 add = max + min, 9830 l = add * 0.5, 9831 h, s; 9832 9833 if ( min === max ) { 9834 h = 0; 9835 } else if ( r === max ) { 9836 h = ( 60 * ( g - b ) / diff ) + 360; 9837 } else if ( g === max ) { 9838 h = ( 60 * ( b - r ) / diff ) + 120; 9839 } else { 9840 h = ( 60 * ( r - g ) / diff ) + 240; 9841 } 9842 9843 // chroma (diff) == 0 means greyscale which, by definition, saturation = 0% 9844 // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) 9845 if ( diff === 0 ) { 9846 s = 0; 9847 } else if ( l <= 0.5 ) { 9848 s = diff / add; 9849 } else { 9850 s = diff / ( 2 - add ); 9851 } 9852 return [ Math.round(h) % 360, s, l, a == null ? 1 : a ]; 9853}; 9854 9855spaces.hsla.from = function( hsla ) { 9856 if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) { 9857 return [ null, null, null, hsla[ 3 ] ]; 9858 } 9859 var h = hsla[ 0 ] / 360, 9860 s = hsla[ 1 ], 9861 l = hsla[ 2 ], 9862 a = hsla[ 3 ], 9863 q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s, 9864 p = 2 * l - q; 9865 9866 return [ 9867 Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ), 9868 Math.round( hue2rgb( p, q, h ) * 255 ), 9869 Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ), 9870 a 9871 ]; 9872}; 9873 9874each( spaces, function( spaceName, space ) { 9875 var props = space.props, 9876 cache = space.cache, 9877 to = space.to, 9878 from = space.from; 9879 9880 // makes rgba() and hsla() 9881 color.fn[ spaceName ] = function( value ) { 9882 9883 // generate a cache for this space if it doesn't exist 9884 if ( to && !this[ cache ] ) { 9885 this[ cache ] = to( this._rgba ); 9886 } 9887 if ( value === undefined ) { 9888 return this[ cache ].slice(); 9889 } 9890 9891 var ret, 9892 type = jQuery.type( value ), 9893 arr = ( type === "array" || type === "object" ) ? value : arguments, 9894 local = this[ cache ].slice(); 9895 9896 each( props, function( key, prop ) { 9897 var val = arr[ type === "object" ? key : prop.idx ]; 9898 if ( val == null ) { 9899 val = local[ prop.idx ]; 9900 } 9901 local[ prop.idx ] = clamp( val, prop ); 9902 }); 9903 9904 if ( from ) { 9905 ret = color( from( local ) ); 9906 ret[ cache ] = local; 9907 return ret; 9908 } else { 9909 return color( local ); 9910 } 9911 }; 9912 9913 // makes red() green() blue() alpha() hue() saturation() lightness() 9914 each( props, function( key, prop ) { 9915 // alpha is included in more than one space 9916 if ( color.fn[ key ] ) { 9917 return; 9918 } 9919 color.fn[ key ] = function( value ) { 9920 var vtype = jQuery.type( value ), 9921 fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ), 9922 local = this[ fn ](), 9923 cur = local[ prop.idx ], 9924 match; 9925 9926 if ( vtype === "undefined" ) { 9927 return cur; 9928 } 9929 9930 if ( vtype === "function" ) { 9931 value = value.call( this, cur ); 9932 vtype = jQuery.type( value ); 9933 } 9934 if ( value == null && prop.empty ) { 9935 return this; 9936 } 9937 if ( vtype === "string" ) { 9938 match = rplusequals.exec( value ); 9939 if ( match ) { 9940 value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 ); 9941 } 9942 } 9943 local[ prop.idx ] = value; 9944 return this[ fn ]( local ); 9945 }; 9946 }); 9947}); 9948 9949// add cssHook and .fx.step function for each named hook. 9950// accept a space separated string of properties 9951color.hook = function( hook ) { 9952 var hooks = hook.split( " " ); 9953 each( hooks, function( i, hook ) { 9954 jQuery.cssHooks[ hook ] = { 9955 set: function( elem, value ) { 9956 var parsed, curElem, 9957 backgroundColor = ""; 9958 9959 if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) { 9960 value = color( parsed || value ); 9961 if ( !support.rgba && value._rgba[ 3 ] !== 1 ) { 9962 curElem = hook === "backgroundColor" ? elem.parentNode : elem; 9963 while ( 9964 (backgroundColor === "" || backgroundColor === "transparent") && 9965 curElem && curElem.style 9966 ) { 9967 try { 9968 backgroundColor = jQuery.css( curElem, "backgroundColor" ); 9969 curElem = curElem.parentNode; 9970 } catch ( e ) { 9971 } 9972 } 9973 9974 value = value.blend( backgroundColor && backgroundColor !== "transparent" ? 9975 backgroundColor : 9976 "_default" ); 9977 } 9978 9979 value = value.toRgbaString(); 9980 } 9981 try { 9982 elem.style[ hook ] = value; 9983 } catch
vendor: 6,818 bytes, lines 9983-10254
9983 ( e ) { 9984 // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit' 9985 } 9986 } 9987 }; 9988 jQuery.fx.step[ hook ] = function( fx ) { 9989 if ( !fx.colorInit ) { 9990 fx.start = color( fx.elem, hook ); 9991 fx.end = color( fx.end ); 9992 fx.colorInit = true; 9993 } 9994 jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) ); 9995 }; 9996 }); 9997 9998}; 9999 10000color.hook( stepHooks ); 10001 10002jQuery.cssHooks.borderColor = { 10003 expand: function( value ) { 10004 var expanded = {}; 10005 10006 each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) { 10007 expanded[ "border" + part + "Color" ] = value; 10008 }); 10009 return expanded; 10010 } 10011}; 10012 10013// Basic color names only. 10014// Usage of any of the other color names requires adding yourself or including 10015// jquery.color.svg-names.js. 10016colors = jQuery.Color.names = { 10017 // 4.1. Basic color keywords 10018 aqua: "#00ffff", 10019 black: "#000000", 10020 blue: "#0000ff", 10021 fuchsia: "#ff00ff", 10022 gray: "#808080", 10023 green: "#008000", 10024 lime: "#00ff00", 10025 maroon: "#800000", 10026 navy: "#000080", 10027 olive: "#808000", 10028 purple: "#800080", 10029 red: "#ff0000", 10030 silver: "#c0c0c0", 10031 teal: "#008080", 10032 white: "#ffffff", 10033 yellow: "#ffff00", 10034 10035 // 4.2.3. "transparent" color keyword 10036 transparent: [ null, null, null, 0 ], 10037 10038 _default: "#ffffff" 10039}; 10040 10041})( jQuery ); 10042 10043/******************************************************************************/ 10044/****************************** CLASS ANIMATIONS ******************************/ 10045/******************************************************************************/ 10046(function() { 10047 10048var classAnimationActions = [ "add", "remove", "toggle" ], 10049 shorthandStyles = { 10050 border: 1, 10051 borderBottom: 1, 10052 borderColor: 1, 10053 borderLeft: 1, 10054 borderRight: 1, 10055 borderTop: 1, 10056 borderWidth: 1, 10057 margin: 1, 10058 padding: 1 10059 }; 10060 10061$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) { 10062 $.fx.step[ prop ] = function( fx ) { 10063 if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { 10064 jQuery.style( fx.elem, prop, fx.end ); 10065 fx.setAttr = true; 10066 } 10067 }; 10068}); 10069 10070function getElementStyles( elem ) { 10071 var key, len, 10072 style = elem.ownerDocument.defaultView ? 10073 elem.ownerDocument.defaultView.getComputedStyle( elem, null ) : 10074 elem.currentStyle, 10075 styles = {}; 10076 10077 if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { 10078 len = style.length; 10079 while ( len-- ) { 10080 key = style[ len ]; 10081 if ( typeof style[ key ] === "string" ) { 10082 styles[ $.camelCase( key ) ] = style[ key ]; 10083 } 10084 } 10085 // support: Opera, IE <9 10086 } else { 10087 for ( key in style ) { 10088 if ( typeof style[ key ] === "string" ) { 10089 styles[ key ] = style[ key ]; 10090 } 10091 } 10092 } 10093 10094 return styles; 10095} 10096 10097function styleDifference( oldStyle, newStyle ) { 10098 var diff = {}, 10099 name, value; 10100 10101 for ( name in newStyle ) { 10102 value = newStyle[ name ]; 10103 if ( oldStyle[ name ] !== value ) { 10104 if ( !shorthandStyles[ name ] ) { 10105 if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { 10106 diff[ name ] = value; 10107 } 10108 } 10109 } 10110 } 10111 10112 return diff; 10113} 10114 10115// support: jQuery <1.8 10116if ( !$.fn.addBack ) { 10117 $.fn.addBack = function( selector ) { 10118 return this.add( selector == null ? 10119 this.prevObject : this.prevObject.filter( selector ) 10120 ); 10121 }; 10122} 10123 10124$.effects.animateClass = function( value, duration, easing, callback ) { 10125 var o = $.speed( duration, easing, callback ); 10126 10127 return this.queue( function() { 10128 var animated = $( this ), 10129 baseClass = animated.attr( "class" ) || "", 10130 applyClassChange, 10131 allAnimations = o.children ? animated.find( "*" ).addBack() : animated; 10132 10133 // map the animated objects to store the original styles. 10134 allAnimations = allAnimations.map(function() { 10135 var el = $( this ); 10136 return { 10137 el: el, 10138 start: getElementStyles( this ) 10139 }; 10140 }); 10141 10142 // apply class change 10143 applyClassChange = function() { 10144 $.each( classAnimationActions, function(i, action) { 10145 if ( value[ action ] ) { 10146 animated[ action + "Class" ]( value[ action ] ); 10147 } 10148 }); 10149 }; 10150 applyClassChange(); 10151 10152 // map all animated objects again - calculate new styles and diff 10153 allAnimations = allAnimations.map(function() { 10154 this.end = getElementStyles( this.el[ 0 ] ); 10155 this.diff = styleDifference( this.start, this.end ); 10156 return this; 10157 }); 10158 10159 // apply original class 10160 animated.attr( "class", baseClass ); 10161 10162 // map all animated objects again - this time collecting a promise 10163 allAnimations = allAnimations.map(function() { 10164 var styleInfo = this, 10165 dfd = $.Deferred(), 10166 opts = $.extend({}, o, { 10167 queue: false, 10168 complete: function() { 10169 dfd.resolve( styleInfo ); 10170 } 10171 }); 10172 10173 this.el.animate( this.diff, opts ); 10174 return dfd.promise(); 10175 }); 10176 10177 // once all animations have completed: 10178 $.when.apply( $, allAnimations.get() ).done(function() { 10179 10180 // set the final class 10181 applyClassChange(); 10182 10183 // for each animated element, 10184 // clear all css properties that were animated 10185 $.each( arguments, function() { 10186 var el = this.el; 10187 $.each( this.diff, function(key) { 10188 el.css( key, "" ); 10189 }); 10190 }); 10191 10192 // this is guarnteed to be there if you use jQuery.speed() 10193 // it also handles dequeuing the next anim... 10194 o.complete.call( animated[ 0 ] ); 10195 }); 10196 }); 10197}; 10198 10199$.fn.extend({ 10200 addClass: (function( orig ) { 10201 return function( classNames, speed, easing, callback ) { 10202 return speed ? 10203 $.effects.animateClass.call( this, 10204 { add: classNames }, speed, easing, callback ) : 10205 orig.apply( this, arguments ); 10206 }; 10207 })( $.fn.addClass ), 10208 10209 removeClass: (function( orig ) { 10210 return function( classNames, speed, easing, callback ) { 10211 return arguments.length > 1 ? 10212 $.effects.animateClass.call( this, 10213 { remove: classNames }, speed, easing, callback ) : 10214 orig.apply( this, arguments ); 10215 }; 10216 })( $.fn.removeClass ), 10217 10218 toggleClass: (function( orig ) { 10219 return function( classNames, force, speed, easing, callback ) { 10220 if ( typeof force === "boolean" || force === undefined ) { 10221 if ( !speed ) { 10222 // without speed parameter 10223 return orig.apply( this, arguments ); 10224 } else { 10225 return $.effects.animateClass.call( this, 10226 (force ? { add: classNames } : { remove: classNames }), 10227 speed, easing, callback ); 10228 } 10229 } else { 10230 // without force parameter 10231 return $.effects.animateClass.call( this, 10232 { toggle: classNames }, force, speed, easing ); 10233 } 10234 }; 10235 })( $.fn.toggleClass ), 10236 10237 switchClass: function( remove, add, speed, easing, callback) { 10238 return $.effects.animateClass.call( this, { 10239 add: add, 10240 remove: remove 10241 }, speed, easing, callback ); 10242 } 10243}); 10244 10245})(); 10246 10247/******************************************************************************/ 10248/*********************************** EFFECTS **********************************/ 10249/******************************************************************************/ 10250 10251(function() { 10252 10253$.extend( $.effects, { 10254 version: "1.11.2
vendor: 9,811 bytes, lines 10254-10650
10254", 10255 10256 // Saves a set of properties in a data storage 10257 save: function( element, set ) { 10258 for ( var i = 0; i < set.length; i++ ) { 10259 if ( set[ i ] !== null ) { 10260 element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); 10261 } 10262 } 10263 }, 10264 10265 // Restores a set of previously saved properties from a data storage 10266 restore: function( element, set ) { 10267 var val, i; 10268 for ( i = 0; i < set.length; i++ ) { 10269 if ( set[ i ] !== null ) { 10270 val = element.data( dataSpace + set[ i ] ); 10271 // support: jQuery 1.6.2 10272 // http://bugs.jquery.com/ticket/9917 10273 // jQuery 1.6.2 incorrectly returns undefined for any falsy value. 10274 // We can't differentiate between "" and 0 here, so we just assume 10275 // empty string since it's likely to be a more common value... 10276 if ( val === undefined ) { 10277 val = ""; 10278 } 10279 element.css( set[ i ], val ); 10280 } 10281 } 10282 }, 10283 10284 setMode: function( el, mode ) { 10285 if (mode === "toggle") { 10286 mode = el.is( ":hidden" ) ? "show" : "hide"; 10287 } 10288 return mode; 10289 }, 10290 10291 // Translates a [top,left] array into a baseline value 10292 // this should be a little more flexible in the future to handle a string & hash 10293 getBaseline: function( origin, original ) { 10294 var y, x; 10295 switch ( origin[ 0 ] ) { 10296 case "top": y = 0; break; 10297 case "middle": y = 0.5; break; 10298 case "bottom": y = 1; break; 10299 default: y = origin[ 0 ] / original.height; 10300 } 10301 switch ( origin[ 1 ] ) { 10302 case "left": x = 0; break; 10303 case "center": x = 0.5; break; 10304 case "right": x = 1; break; 10305 default: x = origin[ 1 ] / original.width; 10306 } 10307 return { 10308 x: x, 10309 y: y 10310 }; 10311 }, 10312 10313 // Wraps the element around a wrapper that copies position properties 10314 createWrapper: function( element ) { 10315 10316 // if the element is already wrapped, return it 10317 if ( element.parent().is( ".ui-effects-wrapper" )) { 10318 return element.parent(); 10319 } 10320 10321 // wrap the element 10322 var props = { 10323 width: element.outerWidth(true), 10324 height: element.outerHeight(true), 10325 "float": element.css( "float" ) 10326 }, 10327 wrapper = $( "<div></div>" ) 10328 .addClass( "ui-effects-wrapper" ) 10329 .css({ 10330 fontSize: "100%", 10331 background: "transparent", 10332 border: "none", 10333 margin: 0, 10334 padding: 0 10335 }), 10336 // Store the size in case width/height are defined in % - Fixes #5245 10337 size = { 10338 width: element.width(), 10339 height: element.height() 10340 }, 10341 active = document.activeElement; 10342 10343 // support: Firefox 10344 // Firefox incorrectly exposes anonymous content 10345 // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 10346 try { 10347 active.id; 10348 } catch ( e ) { 10349 active = document.body; 10350 } 10351 10352 element.wrap( wrapper ); 10353 10354 // Fixes #7595 - Elements lose focus when wrapped. 10355 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { 10356 $( active ).focus(); 10357 } 10358 10359 wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element 10360 10361 // transfer positioning properties to the wrapper 10362 if ( element.css( "position" ) === "static" ) { 10363 wrapper.css({ position: "relative" }); 10364 element.css({ position: "relative" }); 10365 } else { 10366 $.extend( props, { 10367 position: element.css( "position" ), 10368 zIndex: element.css( "z-index" ) 10369 }); 10370 $.each([ "top", "left", "bottom", "right" ], function(i, pos) { 10371 props[ pos ] = element.css( pos ); 10372 if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { 10373 props[ pos ] = "auto"; 10374 } 10375 }); 10376 element.css({ 10377 position: "relative", 10378 top: 0, 10379 left: 0, 10380 right: "auto", 10381 bottom: "auto" 10382 }); 10383 } 10384 element.css(size); 10385 10386 return wrapper.css( props ).show(); 10387 }, 10388 10389 removeWrapper: function( element ) { 10390 var active = document.activeElement; 10391 10392 if ( element.parent().is( ".ui-effects-wrapper" ) ) { 10393 element.parent().replaceWith( element ); 10394 10395 // Fixes #7595 - Elements lose focus when wrapped. 10396 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { 10397 $( active ).focus(); 10398 } 10399 } 10400 10401 return element; 10402 }, 10403 10404 setTransition: function( element, list, factor, value ) { 10405 value = value || {}; 10406 $.each( list, function( i, x ) { 10407 var unit = element.cssUnit( x ); 10408 if ( unit[ 0 ] > 0 ) { 10409 value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; 10410 } 10411 }); 10412 return value; 10413 } 10414}); 10415 10416// return an effect options object for the given parameters: 10417function _normalizeArguments( effect, options, speed, callback ) { 10418 10419 // allow passing all options as the first parameter 10420 if ( $.isPlainObject( effect ) ) { 10421 options = effect; 10422 effect = effect.effect; 10423 } 10424 10425 // convert to an object 10426 effect = { effect: effect }; 10427 10428 // catch (effect, null, ...) 10429 if ( options == null ) { 10430 options = {}; 10431 } 10432 10433 // catch (effect, callback) 10434 if ( $.isFunction( options ) ) { 10435 callback = options; 10436 speed = null; 10437 options = {}; 10438 } 10439 10440 // catch (effect, speed, ?) 10441 if ( typeof options === "number" || $.fx.speeds[ options ] ) { 10442 callback = speed; 10443 speed = options; 10444 options = {}; 10445 } 10446 10447 // catch (effect, options, callback) 10448 if ( $.isFunction( speed ) ) { 10449 callback = speed; 10450 speed = null; 10451 } 10452 10453 // add options to effect 10454 if ( options ) { 10455 $.extend( effect, options ); 10456 } 10457 10458 speed = speed || options.duration; 10459 effect.duration = $.fx.off ? 0 : 10460 typeof speed === "number" ? speed : 10461 speed in $.fx.speeds ? $.fx.speeds[ speed ] : 10462 $.fx.speeds._default; 10463 10464 effect.complete = callback || options.complete; 10465 10466 return effect; 10467} 10468 10469function standardAnimationOption( option ) { 10470 // Valid standard speeds (nothing, number, named speed) 10471 if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) { 10472 return true; 10473 } 10474 10475 // Invalid strings - treat as "normal" speed 10476 if ( typeof option === "string" && !$.effects.effect[ option ] ) { 10477 return true; 10478 } 10479 10480 // Complete callback 10481 if ( $.isFunction( option ) ) { 10482 return true; 10483 } 10484 10485 // Options hash (but not naming an effect) 10486 if ( typeof option === "object" && !option.effect ) { 10487 return true; 10488 } 10489 10490 // Didn't match any standard API 10491 return false; 10492} 10493 10494$.fn.extend({ 10495 effect: function( /* effect, options, speed, callback */ ) { 10496 var args = _normalizeArguments.apply( this, arguments ), 10497 mode = args.mode, 10498 queue = args.queue, 10499 effectMethod = $.effects.effect[ args.effect ]; 10500 10501 if ( $.fx.off || !effectMethod ) { 10502 // delegate to the original method (e.g., .show()) if possible 10503 if ( mode ) { 10504 return this[ mode ]( args.duration, args.complete ); 10505 } else { 10506 return this.each( function() { 10507 if ( args.complete ) { 10508 args.complete.call( this ); 10509 } 10510 }); 10511 } 10512 } 10513 10514 function run( next ) { 10515 var elem = $( this ), 10516 complete = args.complete, 10517 mode = args.mode; 10518 10519 function done() { 10520 if ( $.isFunction( complete ) ) { 10521 complete.call( elem[0] ); 10522 } 10523 if ( $.isFunction( next ) ) { 10524 next(); 10525 } 10526 } 10527 10528 // If the element already has the correct final state, delegate to 10529 // the core methods so the internal tracking of "olddisplay" works. 10530 if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { 10531 elem[ mode ](); 10532 done(); 10533 } else { 10534 effectMethod.call( elem[0], args, done ); 10535 } 10536 } 10537 10538 return queue === false ? this.each( run ) : this.queue( queue || "fx", run ); 10539 }, 10540 10541 show: (function( orig ) { 10542 return function( option ) { 10543 if ( standardAnimationOption( option ) ) { 10544 return orig.apply( this, arguments ); 10545 } else { 10546 var args = _normalizeArguments.apply( this, arguments ); 10547 args.mode = "show"; 10548 return this.effect.call( this, args ); 10549 } 10550 }; 10551 })( $.fn.show ), 10552 10553 hide: (function( orig ) { 10554 return function( option ) { 10555 if ( standardAnimationOption( option ) ) { 10556 return orig.apply( this, arguments ); 10557 } else { 10558 var args = _normalizeArguments.apply( this, arguments ); 10559 args.mode = "hide"; 10560 return this.effect.call( this, args ); 10561 } 10562 }; 10563 })( $.fn.hide ), 10564 10565 toggle: (function( orig ) { 10566 return function( option ) { 10567 if ( standardAnimationOption( option ) || typeof option === "boolean" ) { 10568 return orig.apply( this, arguments ); 10569 } else { 10570 var args = _normalizeArguments.apply( this, arguments ); 10571 args.mode = "toggle"; 10572 return this.effect.call( this, args ); 10573 } 10574 }; 10575 })( $.fn.toggle ), 10576 10577 // helper functions 10578 cssUnit: function(key) { 10579 var style = this.css( key ), 10580 val = []; 10581 10582 $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { 10583 if ( style.indexOf( unit ) > 0 ) { 10584 val = [ parseFloat( style ), unit ]; 10585 } 10586 }); 10587 return val; 10588 } 10589}); 10590 10591})(); 10592 10593/******************************************************************************/ 10594/*********************************** EASING ***********************************/ 10595/******************************************************************************/ 10596 10597(function() { 10598 10599// based on easing equations from Robert Penner (http://www.robertpenner.com/easing) 10600 10601var baseEasings = {}; 10602 10603$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) { 10604 baseEasings[ name ] = function( p ) { 10605 return Math.pow( p, i + 2 ); 10606 }; 10607}); 10608 10609$.extend( baseEasings, { 10610 Sine: function( p ) { 10611 return 1 - Math.cos( p * Math.PI / 2 ); 10612 }, 10613 Circ: function( p ) { 10614 return 1 - Math.sqrt( 1 - p * p ); 10615 }, 10616 Elastic: function( p ) { 10617 return p === 0 || p === 1 ? p : 10618 -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 ); 10619 }, 10620 Back: function( p ) { 10621 return p * p * ( 3 * p - 2 ); 10622 }, 10623 Bounce: function( p ) { 10624 var pow2, 10625 bounce = 4; 10626 10627 while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {} 10628 return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); 10629 } 10630}); 10631 10632$.each( baseEasings, function( name, easeIn ) { 10633 $.easing[ "easeIn" + name ] = easeIn; 10634 $.easing[ "easeOut" + name ] = function( p ) { 10635 return 1 - easeIn( 1 - p ); 10636 }; 10637 $.easing[ "easeInOut" + name ] = function( p ) { 10638 return p < 0.5 ? 10639 easeIn( p * 2 ) / 2 : 10640 1 - easeIn( p * -2 + 2 ) / 2; 10641 }; 10642}); 10643 10644})(); 10645 10646var effect = $.effects; 10647 10648 10649/*! 10650 * jQuery UI Effects Blind 1.11.
vendor: 31,073 bytes, lines 10650-11938
106502 10651 * http://jqueryui.com 10652 * 10653 * Copyright 2014 jQuery Foundation and other contributors 10654 * Released under the MIT license. 10655 * http://jquery.org/license 10656 * 10657 * http://api.jqueryui.com/blind-effect/ 10658 */ 10659 10660 10661var effectBlind = $.effects.effect.blind = function( o, done ) { 10662 // Create element 10663 var el = $( this ), 10664 rvertical = /up|down|vertical/, 10665 rpositivemotion = /up|left|vertical|horizontal/, 10666 props = [ "position", "top", "bottom", "left", "right", "height", "width" ], 10667 mode = $.effects.setMode( el, o.mode || "hide" ), 10668 direction = o.direction || "up", 10669 vertical = rvertical.test( direction ), 10670 ref = vertical ? "height" : "width", 10671 ref2 = vertical ? "top" : "left", 10672 motion = rpositivemotion.test( direction ), 10673 animation = {}, 10674 show = mode === "show", 10675 wrapper, distance, margin; 10676 10677 // if already wrapped, the wrapper's properties are my property. #6245 10678 if ( el.parent().is( ".ui-effects-wrapper" ) ) { 10679 $.effects.save( el.parent(), props ); 10680 } else { 10681 $.effects.save( el, props ); 10682 } 10683 el.show(); 10684 wrapper = $.effects.createWrapper( el ).css({ 10685 overflow: "hidden" 10686 }); 10687 10688 distance = wrapper[ ref ](); 10689 margin = parseFloat( wrapper.css( ref2 ) ) || 0; 10690 10691 animation[ ref ] = show ? distance : 0; 10692 if ( !motion ) { 10693 el 10694 .css( vertical ? "bottom" : "right", 0 ) 10695 .css( vertical ? "top" : "left", "auto" ) 10696 .css({ position: "absolute" }); 10697 10698 animation[ ref2 ] = show ? margin : distance + margin; 10699 } 10700 10701 // start at 0 if we are showing 10702 if ( show ) { 10703 wrapper.css( ref, 0 ); 10704 if ( !motion ) { 10705 wrapper.css( ref2, margin + distance ); 10706 } 10707 } 10708 10709 // Animate 10710 wrapper.animate( animation, { 10711 duration: o.duration, 10712 easing: o.easing, 10713 queue: false, 10714 complete: function() { 10715 if ( mode === "hide" ) { 10716 el.hide(); 10717 } 10718 $.effects.restore( el, props ); 10719 $.effects.removeWrapper( el ); 10720 done(); 10721 } 10722 }); 10723}; 10724 10725 10726/*! 10727 * jQuery UI Effects Bounce 1.11.2 10728 * http://jqueryui.com 10729 * 10730 * Copyright 2014 jQuery Foundation and other contributors 10731 * Released under the MIT license. 10732 * http://jquery.org/license 10733 * 10734 * http://api.jqueryui.com/bounce-effect/ 10735 */ 10736 10737 10738var effectBounce = $.effects.effect.bounce = function( o, done ) { 10739 var el = $( this ), 10740 props = [ "position", "top", "bottom", "left", "right", "height", "width" ], 10741 10742 // defaults: 10743 mode = $.effects.setMode( el, o.mode || "effect" ), 10744 hide = mode === "hide", 10745 show = mode === "show", 10746 direction = o.direction || "up", 10747 distance = o.distance, 10748 times = o.times || 5, 10749 10750 // number of internal animations 10751 anims = times * 2 + ( show || hide ? 1 : 0 ), 10752 speed = o.duration / anims, 10753 easing = o.easing, 10754 10755 // utility: 10756 ref = ( direction === "up" || direction === "down" ) ? "top" : "left", 10757 motion = ( direction === "up" || direction === "left" ), 10758 i, 10759 upAnim, 10760 downAnim, 10761 10762 // we will need to re-assemble the queue to stack our animations in place 10763 queue = el.queue(), 10764 queuelen = queue.length; 10765 10766 // Avoid touching opacity to prevent clearType and PNG issues in IE 10767 if ( show || hide ) { 10768 props.push( "opacity" ); 10769 } 10770 10771 $.effects.save( el, props ); 10772 el.show(); 10773 $.effects.createWrapper( el ); // Create Wrapper 10774 10775 // default distance for the BIGGEST bounce is the outer Distance / 3 10776 if ( !distance ) { 10777 distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; 10778 } 10779 10780 if ( show ) { 10781 downAnim = { opacity: 1 }; 10782 downAnim[ ref ] = 0; 10783 10784 // if we are showing, force opacity 0 and set the initial position 10785 // then do the "first" animation 10786 el.css( "opacity", 0 ) 10787 .css( ref, motion ? -distance * 2 : distance * 2 ) 10788 .animate( downAnim, speed, easing ); 10789 } 10790 10791 // start at the smallest distance if we are hiding 10792 if ( hide ) { 10793 distance = distance / Math.pow( 2, times - 1 ); 10794 } 10795 10796 downAnim = {}; 10797 downAnim[ ref ] = 0; 10798 // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here 10799 for ( i = 0; i < times; i++ ) { 10800 upAnim = {}; 10801 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; 10802 10803 el.animate( upAnim, speed, easing ) 10804 .animate( downAnim, speed, easing ); 10805 10806 distance = hide ? distance * 2 : distance / 2; 10807 } 10808 10809 // Last Bounce when Hiding 10810 if ( hide ) { 10811 upAnim = { opacity: 0 }; 10812 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; 10813 10814 el.animate( upAnim, speed, easing ); 10815 } 10816 10817 el.queue(function() { 10818 if ( hide ) { 10819 el.hide(); 10820 } 10821 $.effects.restore( el, props ); 10822 $.effects.removeWrapper( el ); 10823 done(); 10824 }); 10825 10826 // inject all the animations we just queued to be first in line (after "inprogress") 10827 if ( queuelen > 1) { 10828 queue.splice.apply( queue, 10829 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); 10830 } 10831 el.dequeue(); 10832 10833}; 10834 10835 10836/*! 10837 * jQuery UI Effects Clip 1.11.2 10838 * http://jqueryui.com 10839 * 10840 * Copyright 2014 jQuery Foundation and other contributors 10841 * Released under the MIT license. 10842 * http://jquery.org/license 10843 * 10844 * http://api.jqueryui.com/clip-effect/ 10845 */ 10846 10847 10848var effectClip = $.effects.effect.clip = function( o, done ) { 10849 // Create element 10850 var el = $( this ), 10851 props = [ "position", "top", "bottom", "left", "right", "height", "width" ], 10852 mode = $.effects.setMode( el, o.mode || "hide" ), 10853 show = mode === "show", 10854 direction = o.direction || "vertical", 10855 vert = direction === "vertical", 10856 size = vert ? "height" : "width", 10857 position = vert ? "top" : "left", 10858 animation = {}, 10859 wrapper, animate, distance; 10860 10861 // Save & Show 10862 $.effects.save( el, props ); 10863 el.show(); 10864 10865 // Create Wrapper 10866 wrapper = $.effects.createWrapper( el ).css({ 10867 overflow: "hidden" 10868 }); 10869 animate = ( el[0].tagName === "IMG" ) ? wrapper : el; 10870 distance = animate[ size ](); 10871 10872 // Shift 10873 if ( show ) { 10874 animate.css( size, 0 ); 10875 animate.css( position, distance / 2 ); 10876 } 10877 10878 // Create Animation Object: 10879 animation[ size ] = show ? distance : 0; 10880 animation[ position ] = show ? 0 : distance / 2; 10881 10882 // Animate 10883 animate.animate( animation, { 10884 queue: false, 10885 duration: o.duration, 10886 easing: o.easing, 10887 complete: function() { 10888 if ( !show ) { 10889 el.hide(); 10890 } 10891 $.effects.restore( el, props ); 10892 $.effects.removeWrapper( el ); 10893 done(); 10894 } 10895 }); 10896 10897}; 10898 10899 10900/*! 10901 * jQuery UI Effects Drop 1.11.2 10902 * http://jqueryui.com 10903 * 10904 * Copyright 2014 jQuery Foundation and other contributors 10905 * Released under the MIT license. 10906 * http://jquery.org/license 10907 * 10908 * http://api.jqueryui.com/drop-effect/ 10909 */ 10910 10911 10912var effectDrop = $.effects.effect.drop = function( o, done ) { 10913 10914 var el = $( this ), 10915 props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ], 10916 mode = $.effects.setMode( el, o.mode || "hide" ), 10917 show = mode === "show", 10918 direction = o.direction || "left", 10919 ref = ( direction === "up" || direction === "down" ) ? "top" : "left", 10920 motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg", 10921 animation = { 10922 opacity: show ? 1 : 0 10923 }, 10924 distance; 10925 10926 // Adjust 10927 $.effects.save( el, props ); 10928 el.show(); 10929 $.effects.createWrapper( el ); 10930 10931 distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2; 10932 10933 if ( show ) { 10934 el 10935 .css( "opacity", 0 ) 10936 .css( ref, motion === "pos" ? -distance : distance ); 10937 } 10938 10939 // Animation 10940 animation[ ref ] = ( show ? 10941 ( motion === "pos" ? "+=" : "-=" ) : 10942 ( motion === "pos" ? "-=" : "+=" ) ) + 10943 distance; 10944 10945 // Animate 10946 el.animate( animation, { 10947 queue: false, 10948 duration: o.duration, 10949 easing: o.easing, 10950 complete: function() { 10951 if ( mode === "hide" ) { 10952 el.hide(); 10953 } 10954 $.effects.restore( el, props ); 10955 $.effects.removeWrapper( el ); 10956 done(); 10957 } 10958 }); 10959}; 10960 10961 10962/*! 10963 * jQuery UI Effects Explode 1.11.2 10964 * http://jqueryui.com 10965 * 10966 * Copyright 2014 jQuery Foundation and other contributors 10967 * Released under the MIT license. 10968 * http://jquery.org/license 10969 * 10970 * http://api.jqueryui.com/explode-effect/ 10971 */ 10972 10973 10974var effectExplode = $.effects.effect.explode = function( o, done ) { 10975 10976 var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3, 10977 cells = rows, 10978 el = $( this ), 10979 mode = $.effects.setMode( el, o.mode || "hide" ), 10980 show = mode === "show", 10981 10982 // show and then visibility:hidden the element before calculating offset 10983 offset = el.show().css( "visibility", "hidden" ).offset(), 10984 10985 // width and height of a piece 10986 width = Math.ceil( el.outerWidth() / cells ), 10987 height = Math.ceil( el.outerHeight() / rows ), 10988 pieces = [], 10989 10990 // loop 10991 i, j, left, top, mx, my; 10992 10993 // children animate complete: 10994 function childComplete() { 10995 pieces.push( this ); 10996 if ( pieces.length === rows * cells ) { 10997 animComplete(); 10998 } 10999 } 11000 11001 // clone the element for each row and cell. 11002 for ( i = 0; i < rows ; i++ ) { // ===> 11003 top = offset.top + i * height; 11004 my = i - ( rows - 1 ) / 2 ; 11005 11006 for ( j = 0; j < cells ; j++ ) { // ||| 11007 left = offset.left + j * width; 11008 mx = j - ( cells - 1 ) / 2 ; 11009 11010 // Create a clone of the now hidden main element that will be absolute positioned 11011 // within a wrapper div off the -left and -top equal to size of our pieces 11012 el 11013 .clone() 11014 .appendTo( "body" ) 11015 .wrap( "<div></div>" ) 11016 .css({ 11017 position: "absolute", 11018 visibility: "visible", 11019 left: -j * width, 11020 top: -i * height 11021 }) 11022 11023 // select the wrapper - make it overflow: hidden and absolute positioned based on 11024 // where the original was located +left and +top equal to the size of pieces 11025 .parent() 11026 .addClass( "ui-effects-explode" ) 11027 .css({ 11028 position: "absolute", 11029 overflow: "hidden", 11030 width: width, 11031 height: height, 11032 left: left + ( show ? mx * width : 0 ), 11033 top: top + ( show ? my * height : 0 ), 11034 opacity: show ? 0 : 1 11035 }).animate({ 11036 left: left + ( show ? 0 : mx * width ), 11037 top: top + ( show ? 0 : my * height ), 11038 opacity: show ? 1 : 0 11039 }, o.duration || 500, o.easing, childComplete ); 11040 } 11041 } 11042 11043 function animComplete() { 11044 el.css({ 11045 visibility: "visible" 11046 }); 11047 $( pieces ).remove(); 11048 if ( !show ) { 11049 el.hide(); 11050 } 11051 done(); 11052 } 11053}; 11054 11055 11056/*! 11057 * jQuery UI Effects Fade 1.11.2 11058 * http://jqueryui.com 11059 * 11060 * Copyright 2014 jQuery Foundation and other contributors 11061 * Released under the MIT license. 11062 * http://jquery.org/license 11063 * 11064 * http://api.jqueryui.com/fade-effect/ 11065 */ 11066 11067 11068var effectFade = $.effects.effect.fade = function( o, done ) { 11069 var el = $( this ), 11070 mode = $.effects.setMode( el, o.mode || "toggle" ); 11071 11072 el.animate({ 11073 opacity: mode 11074 }, { 11075 queue: false, 11076 duration: o.duration, 11077 easing: o.easing, 11078 complete: done 11079 }); 11080}; 11081 11082 11083/*! 11084 * jQuery UI Effects Fold 1.11.2 11085 * http://jqueryui.com 11086 * 11087 * Copyright 2014 jQuery Foundation and other contributors 11088 * Released under the MIT license. 11089 * http://jquery.org/license 11090 * 11091 * http://api.jqueryui.com/fold-effect/ 11092 */ 11093 11094 11095var effectFold = $.effects.effect.fold = function( o, done ) { 11096 11097 // Create element 11098 var el = $( this ), 11099 props = [ "position", "top", "bottom", "left", "right", "height", "width" ], 11100 mode = $.effects.setMode( el, o.mode || "hide" ), 11101 show = mode === "show", 11102 hide = mode === "hide", 11103 size = o.size || 15, 11104 percent = /([0-9]+)%/.exec( size ), 11105 horizFirst = !!o.horizFirst, 11106 widthFirst = show !== horizFirst, 11107 ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ], 11108 duration = o.duration / 2, 11109 wrapper, distance, 11110 animation1 = {}, 11111 animation2 = {}; 11112 11113 $.effects.save( el, props ); 11114 el.show(); 11115 11116 // Create Wrapper 11117 wrapper = $.effects.createWrapper( el ).css({ 11118 overflow: "hidden" 11119 }); 11120 distance = widthFirst ? 11121 [ wrapper.width(), wrapper.height() ] : 11122 [ wrapper.height(), wrapper.width() ]; 11123 11124 if ( percent ) { 11125 size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ]; 11126 } 11127 if ( show ) { 11128 wrapper.css( horizFirst ? { 11129 height: 0, 11130 width: size 11131 } : { 11132 height: size, 11133 width: 0 11134 }); 11135 } 11136 11137 // Animation 11138 animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size; 11139 animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0; 11140 11141 // Animate 11142 wrapper 11143 .animate( animation1, duration, o.easing ) 11144 .animate( animation2, duration, o.easing, function() { 11145 if ( hide ) { 11146 el.hide(); 11147 } 11148 $.effects.restore( el, props ); 11149 $.effects.removeWrapper( el ); 11150 done(); 11151 }); 11152 11153}; 11154 11155 11156/*! 11157 * jQuery UI Effects Highlight 1.11.2 11158 * http://jqueryui.com 11159 * 11160 * Copyright 2014 jQuery Foundation and other contributors 11161 * Released under the MIT license. 11162 * http://jquery.org/license 11163 * 11164 * http://api.jqueryui.com/highlight-effect/ 11165 */ 11166 11167 11168var effectHighlight = $.effects.effect.highlight = function( o, done ) { 11169 var elem = $( this ), 11170 props = [ "backgroundImage", "backgroundColor", "opacity" ], 11171 mode = $.effects.setMode( elem, o.mode || "show" ), 11172 animation = { 11173 backgroundColor: elem.css( "backgroundColor" ) 11174 }; 11175 11176 if (mode === "hide") { 11177 animation.opacity = 0; 11178 } 11179 11180 $.effects.save( elem, props ); 11181 11182 elem 11183 .show() 11184 .css({ 11185 backgroundImage: "none", 11186 backgroundColor: o.color || "#ffff99" 11187 }) 11188 .animate( animation, { 11189 queue: false, 11190 duration: o.duration, 11191 easing: o.easing, 11192 complete: function() { 11193 if ( mode === "hide" ) { 11194 elem.hide(); 11195 } 11196 $.effects.restore( elem, props ); 11197 done(); 11198 } 11199 }); 11200}; 11201 11202 11203/*! 11204 * jQuery UI Effects Size 1.11.2 11205 * http://jqueryui.com 11206 * 11207 * Copyright 2014 jQuery Foundation and other contributors 11208 * Released under the MIT license. 11209 * http://jquery.org/license 11210 * 11211 * http://api.jqueryui.com/size-effect/ 11212 */ 11213 11214 11215var effectSize = $.effects.effect.size = function( o, done ) { 11216 11217 // Create element 11218 var original, baseline, factor, 11219 el = $( this ), 11220 props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ], 11221 11222 // Always restore 11223 props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ], 11224 11225 // Copy for children 11226 props2 = [ "width", "height", "overflow" ], 11227 cProps = [ "fontSize" ], 11228 vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ], 11229 hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ], 11230 11231 // Set options 11232 mode = $.effects.setMode( el, o.mode || "effect" ), 11233 restore = o.restore || mode !== "effect", 11234 scale = o.scale || "both", 11235 origin = o.origin || [ "middle", "center" ], 11236 position = el.css( "position" ), 11237 props = restore ? props0 : props1, 11238 zero = { 11239 height: 0, 11240 width: 0, 11241 outerHeight: 0, 11242 outerWidth: 0 11243 }; 11244 11245 if ( mode === "show" ) { 11246 el.show(); 11247 } 11248 original = { 11249 height: el.height(), 11250 width: el.width(), 11251 outerHeight: el.outerHeight(), 11252 outerWidth: el.outerWidth() 11253 }; 11254 11255 if ( o.mode === "toggle" && mode === "show" ) { 11256 el.from = o.to || zero; 11257 el.to = o.from || original; 11258 } else { 11259 el.from = o.from || ( mode === "show" ? zero : original ); 11260 el.to = o.to || ( mode === "hide" ? zero : original ); 11261 } 11262 11263 // Set scaling factor 11264 factor = { 11265 from: { 11266 y: el.from.height / original.height, 11267 x: el.from.width / original.width 11268 }, 11269 to: { 11270 y: el.to.height / original.height, 11271 x: el.to.width / original.width 11272 } 11273 }; 11274 11275 // Scale the css box 11276 if ( scale === "box" || scale === "both" ) { 11277 11278 // Vertical props scaling 11279 if ( factor.from.y !== factor.to.y ) { 11280 props = props.concat( vProps ); 11281 el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from ); 11282 el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to ); 11283 } 11284 11285 // Horizontal props scaling 11286 if ( factor.from.x !== factor.to.x ) { 11287 props = props.concat( hProps ); 11288 el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from ); 11289 el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to ); 11290 } 11291 } 11292 11293 // Scale the content 11294 if ( scale === "content" || scale === "both" ) { 11295 11296 // Vertical props scaling 11297 if ( factor.from.y !== factor.to.y ) { 11298 props = props.concat( cProps ).concat( props2 ); 11299 el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from ); 11300 el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to ); 11301 } 11302 } 11303 11304 $.effects.save( el, props ); 11305 el.show(); 11306 $.effects.createWrapper( el ); 11307 el.css( "overflow", "hidden" ).css( el.from ); 11308 11309 // Adjust 11310 if (origin) { // Calculate baseline shifts 11311 baseline = $.effects.getBaseline( origin, original ); 11312 el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y; 11313 el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x; 11314 el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y; 11315 el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x; 11316 } 11317 el.css( el.from ); // set top & left 11318 11319 // Animate 11320 if ( scale === "content" || scale === "both" ) { // Scale the children 11321 11322 // Add margins/font-size 11323 vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps); 11324 hProps = hProps.concat([ "marginLeft", "marginRight" ]); 11325 props2 = props0.concat(vProps).concat(hProps); 11326 11327 el.find( "*[width]" ).each( function() { 11328 var child = $( this ), 11329 c_original = { 11330 height: child.height(), 11331 width: child.width(), 11332 outerHeight: child.outerHeight(), 11333 outerWidth: child.outerWidth() 11334 }; 11335 if (restore) { 11336 $.effects.save(child, props2); 11337 } 11338 11339 child.from = { 11340 height: c_original.height * factor.from.y, 11341 width: c_original.width * factor.from.x, 11342 outerHeight: c_original.outerHeight * factor.from.y, 11343 outerWidth: c_original.outerWidth * factor.from.x 11344 }; 11345 child.to = { 11346 height: c_original.height * factor.to.y, 11347 width: c_original.width * factor.to.x, 11348 outerHeight: c_original.height * factor.to.y, 11349 outerWidth: c_original.width * factor.to.x 11350 }; 11351 11352 // Vertical props scaling 11353 if ( factor.from.y !== factor.to.y ) { 11354 child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from ); 11355 child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to ); 11356 } 11357 11358 // Horizontal props scaling 11359 if ( factor.from.x !== factor.to.x ) { 11360 child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from ); 11361 child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to ); 11362 } 11363 11364 // Animate children 11365 child.css( child.from ); 11366 child.animate( child.to, o.duration, o.easing, function() { 11367 11368 // Restore children 11369 if ( restore ) { 11370 $.effects.restore( child, props2 ); 11371 } 11372 }); 11373 }); 11374 } 11375 11376 // Animate 11377 el.animate( el.to, { 11378 queue: false, 11379 duration: o.duration, 11380 easing: o.easing, 11381 complete: function() { 11382 if ( el.to.opacity === 0 ) { 11383 el.css( "opacity", el.from.opacity ); 11384 } 11385 if ( mode === "hide" ) { 11386 el.hide(); 11387 } 11388 $.effects.restore( el, props ); 11389 if ( !restore ) { 11390 11391 // we need to calculate our new positioning based on the scaling 11392 if ( position === "static" ) { 11393 el.css({ 11394 position: "relative", 11395 top: el.to.top, 11396 left: el.to.left 11397 }); 11398 } else { 11399 $.each([ "top", "left" ], function( idx, pos ) { 11400 el.css( pos, function( _, str ) { 11401 var val = parseInt( str, 10 ), 11402 toRef = idx ? el.to.left : el.to.top; 11403 11404 // if original was "auto", recalculate the new value from wrapper 11405 if ( str === "auto" ) { 11406 return toRef + "px"; 11407 } 11408 11409 return val + toRef + "px"; 11410 }); 11411 }); 11412 } 11413 } 11414 11415 $.effects.removeWrapper( el ); 11416 done(); 11417 } 11418 }); 11419 11420}; 11421 11422 11423/*! 11424 * jQuery UI Effects Scale 1.11.2 11425 * http://jqueryui.com 11426 * 11427 * Copyright 2014 jQuery Foundation and other contributors 11428 * Released under the MIT license. 11429 * http://jquery.org/license 11430 * 11431 * http://api.jqueryui.com/scale-effect/ 11432 */ 11433 11434 11435var effectScale = $.effects.effect.scale = function( o, done ) { 11436 11437 // Create element 11438 var el = $( this ), 11439 options = $.extend( true, {}, o ), 11440 mode = $.effects.setMode( el, o.mode || "effect" ), 11441 percent = parseInt( o.percent, 10 ) || 11442 ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ), 11443 direction = o.direction || "both", 11444 origin = o.origin, 11445 original = { 11446 height: el.height(), 11447 width: el.width(), 11448 outerHeight: el.outerHeight(), 11449 outerWidth: el.outerWidth() 11450 }, 11451 factor = { 11452 y: direction !== "horizontal" ? (percent / 100) : 1, 11453 x: direction !== "vertical" ? (percent / 100) : 1 11454 }; 11455 11456 // We are going to pass this effect to the size effect: 11457 options.effect = "size"; 11458 options.queue = false; 11459 options.complete = done; 11460 11461 // Set default origin and restore for show/hide 11462 if ( mode !== "effect" ) { 11463 options.origin = origin || [ "middle", "center" ]; 11464 options.restore = true; 11465 } 11466 11467 options.from = o.from || ( mode === "show" ? { 11468 height: 0, 11469 width: 0, 11470 outerHeight: 0, 11471 outerWidth: 0 11472 } : original ); 11473 options.to = { 11474 height: original.height * factor.y, 11475 width: original.width * factor.x, 11476 outerHeight: original.outerHeight * factor.y, 11477 outerWidth: original.outerWidth * factor.x 11478 }; 11479 11480 // Fade option to support puff 11481 if ( options.fade ) { 11482 if ( mode === "show" ) { 11483 options.from.opacity = 0; 11484 options.to.opacity = 1; 11485 } 11486 if ( mode === "hide" ) { 11487 options.from.opacity = 1; 11488 options.to.opacity = 0; 11489 } 11490 } 11491 11492 // Animate 11493 el.effect( options ); 11494 11495}; 11496 11497 11498/*! 11499 * jQuery UI Effects Puff 1.11.2 11500 * http://jqueryui.com 11501 * 11502 * Copyright 2014 jQuery Foundation and other contributors 11503 * Released under the MIT license. 11504 * http://jquery.org/license 11505 * 11506 * http://api.jqueryui.com/puff-effect/ 11507 */ 11508 11509 11510var effectPuff = $.effects.effect.puff = function( o, done ) { 11511 var elem = $( this ), 11512 mode = $.effects.setMode( elem, o.mode || "hide" ), 11513 hide = mode === "hide", 11514 percent = parseInt( o.percent, 10 ) || 150, 11515 factor = percent / 100, 11516 original = { 11517 height: elem.height(), 11518 width: elem.width(), 11519 outerHeight: elem.outerHeight(), 11520 outerWidth: elem.outerWidth() 11521 }; 11522 11523 $.extend( o, { 11524 effect: "scale", 11525 queue: false, 11526 fade: true, 11527 mode: mode, 11528 complete: done, 11529 percent: hide ? percent : 100, 11530 from: hide ? 11531 original : 11532 { 11533 height: original.height * factor, 11534 width: original.width * factor, 11535 outerHeight: original.outerHeight * factor, 11536 outerWidth: original.outerWidth * factor 11537 } 11538 }); 11539 11540 elem.effect( o ); 11541}; 11542 11543 11544/*! 11545 * jQuery UI Effects Pulsate 1.11.2 11546 * http://jqueryui.com 11547 * 11548 * Copyright 2014 jQuery Foundation and other contributors 11549 * Released under the MIT license. 11550 * http://jquery.org/license 11551 * 11552 * http://api.jqueryui.com/pulsate-effect/ 11553 */ 11554 11555 11556var effectPulsate = $.effects.effect.pulsate = function( o, done ) { 11557 var elem = $( this ), 11558 mode = $.effects.setMode( elem, o.mode || "show" ), 11559 show = mode === "show", 11560 hide = mode === "hide", 11561 showhide = ( show || mode === "hide" ), 11562 11563 // showing or hiding leaves of the "last" animation 11564 anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ), 11565 duration = o.duration / anims, 11566 animateTo = 0, 11567 queue = elem.queue(), 11568 queuelen = queue.length, 11569 i; 11570 11571 if ( show || !elem.is(":visible")) { 11572 elem.css( "opacity", 0 ).show(); 11573 animateTo = 1; 11574 } 11575 11576 // anims - 1 opacity "toggles" 11577 for ( i = 1; i < anims; i++ ) { 11578 elem.animate({ 11579 opacity: animateTo 11580 }, duration, o.easing ); 11581 animateTo = 1 - animateTo; 11582 } 11583 11584 elem.animate({ 11585 opacity: animateTo 11586 }, duration, o.easing); 11587 11588 elem.queue(function() { 11589 if ( hide ) { 11590 elem.hide(); 11591 } 11592 done(); 11593 }); 11594 11595 // We just queued up "anims" animations, we need to put them next in the queue 11596 if ( queuelen > 1 ) { 11597 queue.splice.apply( queue, 11598 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); 11599 } 11600 elem.dequeue(); 11601}; 11602 11603 11604/*! 11605 * jQuery UI Effects Shake 1.11.2 11606 * http://jqueryui.com 11607 * 11608 * Copyright 2014 jQuery Foundation and other contributors 11609 * Released under the MIT license. 11610 * http://jquery.org/license 11611 * 11612 * http://api.jqueryui.com/shake-effect/ 11613 */ 11614 11615 11616var effectShake = $.effects.effect.shake = function( o, done ) { 11617 11618 var el = $( this ), 11619 props = [ "position", "top", "bottom", "left", "right", "height", "width" ], 11620 mode = $.effects.setMode( el, o.mode || "effect" ), 11621 direction = o.direction || "left", 11622 distance = o.distance || 20, 11623 times = o.times || 3, 11624 anims = times * 2 + 1, 11625 speed = Math.round( o.duration / anims ), 11626 ref = (direction === "up" || direction === "down") ? "top" : "left", 11627 positiveMotion = (direction === "up" || direction === "left"), 11628 animation = {}, 11629 animation1 = {}, 11630 animation2 = {}, 11631 i, 11632 11633 // we will need to re-assemble the queue to stack our animations in place 11634 queue = el.queue(), 11635 queuelen = queue.length; 11636 11637 $.effects.save( el, props ); 11638 el.show(); 11639 $.effects.createWrapper( el ); 11640 11641 // Animation 11642 animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance; 11643 animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2; 11644 animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2; 11645 11646 // Animate 11647 el.animate( animation, speed, o.easing ); 11648 11649 // Shakes 11650 for ( i = 1; i < times; i++ ) { 11651 el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing ); 11652 } 11653 el 11654 .animate( animation1, speed, o.easing ) 11655 .animate( animation, speed / 2, o.easing ) 11656 .queue(function() { 11657 if ( mode === "hide" ) { 11658 el.hide(); 11659 } 11660 $.effects.restore( el, props ); 11661 $.effects.removeWrapper( el ); 11662 done(); 11663 }); 11664 11665 // inject all the animations we just queued to be first in line (after "inprogress") 11666 if ( queuelen > 1) { 11667 queue.splice.apply( queue, 11668 [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); 11669 } 11670 el.dequeue(); 11671 11672}; 11673 11674 11675/*! 11676 * jQuery UI Effects Slide 1.11.2 11677 * http://jqueryui.com 11678 * 11679 * Copyright 2014 jQuery Foundation and other contributors 11680 * Released under the MIT license. 11681 * http://jquery.org/license 11682 * 11683 * http://api.jqueryui.com/slide-effect/ 11684 */ 11685 11686 11687var effectSlide = $.effects.effect.slide = function( o, done ) { 11688 11689 // Create element 11690 var el = $( this ), 11691 props = [ "position", "top", "bottom", "left", "right", "width", "height" ], 11692 mode = $.effects.setMode( el, o.mode || "show" ), 11693 show = mode === "show", 11694 direction = o.direction || "left", 11695 ref = (direction === "up" || direction === "down") ? "top" : "left", 11696 positiveMotion = (direction === "up" || direction === "left"), 11697 distance, 11698 animation = {}; 11699 11700 // Adjust 11701 $.effects.save( el, props ); 11702 el.show(); 11703 distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ); 11704 11705 $.effects.createWrapper( el ).css({ 11706 overflow: "hidden" 11707 }); 11708 11709 if ( show ) { 11710 el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance ); 11711 } 11712 11713 // Animation 11714 animation[ ref ] = ( show ? 11715 ( positiveMotion ? "+=" : "-=") : 11716 ( positiveMotion ? "-=" : "+=")) + 11717 distance; 11718 11719 // Animate 11720 el.animate( animation, { 11721 queue: false, 11722 duration: o.duration, 11723 easing: o.easing, 11724 complete: function() { 11725 if ( mode === "hide" ) { 11726 el.hide(); 11727 } 11728 $.effects.restore( el, props ); 11729 $.effects.removeWrapper( el ); 11730 done(); 11731 } 11732 }); 11733}; 11734 11735 11736/*! 11737 * jQuery UI Effects Transfer 1.11.2 11738 * http://jqueryui.com 11739 * 11740 * Copyright 2014 jQuery Foundation and other contributors 11741 * Released under the MIT license. 11742 * http://jquery.org/license 11743 * 11744 * http://api.jqueryui.com/transfer-effect/ 11745 */ 11746 11747 11748var effectTransfer = $.effects.effect.transfer = function( o, done ) { 11749 var elem = $( this ), 11750 target = $( o.to ), 11751 targetFixed = target.css( "position" ) === "fixed", 11752 body = $("body"), 11753 fixTop = targetFixed ? body.scrollTop() : 0, 11754 fixLeft = targetFixed ? body.scrollLeft() : 0, 11755 endPosition = target.offset(), 11756 animation = { 11757 top: endPosition.top - fixTop, 11758 left: endPosition.left - fixLeft, 11759 height: target.innerHeight(), 11760 width: target.innerWidth() 11761 }, 11762 startPosition = elem.offset(), 11763 transfer = $( "<div class='ui-effects-transfer'></div>" ) 11764 .appendTo( document.body ) 11765 .addClass( o.className ) 11766 .css({ 11767 top: startPosition.top - fixTop, 11768 left: startPosition.left - fixLeft, 11769 height: elem.innerHeight(), 11770 width: elem.innerWidth(), 11771 position: targetFixed ? "fixed" : "absolute" 11772 }) 11773 .animate( animation, o.duration, o.easing, function() { 11774 transfer.remove(); 11775 done(); 11776 }); 11777}; 11778 11779 11780/*! 11781 * jQuery UI Progressbar 1.11.2 11782 * http://jqueryui.com 11783 * 11784 * Copyright 2014 jQuery Foundation and other contributors 11785 * Released under the MIT license. 11786 * http://jquery.org/license 11787 * 11788 * http://api.jqueryui.com/progressbar/ 11789 */ 11790 11791 11792var progressbar = $.widget( "ui.progressbar", { 11793 version: "1.11.2", 11794 options: { 11795 max: 100, 11796 value: 0, 11797 11798 change: null, 11799 complete: null 11800 }, 11801 11802 min: 0, 11803 11804 _create: function() { 11805 // Constrain initial value 11806 this.oldValue = this.options.value = this._constrainedValue(); 11807 11808 this.element 11809 .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) 11810 .attr({ 11811 // Only set static values, aria-valuenow and aria-valuemax are 11812 // set inside _refreshValue() 11813 role: "progressbar", 11814 "aria-valuemin": this.min 11815 }); 11816 11817 this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" ) 11818 .appendTo( this.element ); 11819 11820 this._refreshValue(); 11821 }, 11822 11823 _destroy: function() { 11824 this.element 11825 .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) 11826 .removeAttr( "role" ) 11827 .removeAttr( "aria-valuemin" ) 11828 .removeAttr( "aria-valuemax" ) 11829 .removeAttr( "aria-valuenow" ); 11830 11831 this.valueDiv.remove(); 11832 }, 11833 11834 value: function( newValue ) { 11835 if ( newValue === undefined ) { 11836 return this.options.value; 11837 } 11838 11839 this.options.value = this._constrainedValue( newValue ); 11840 this._refreshValue(); 11841 }, 11842 11843 _constrainedValue: function( newValue ) { 11844 if ( newValue === undefined ) { 11845 newValue = this.options.value; 11846 } 11847 11848 this.indeterminate = newValue === false; 11849 11850 // sanitize value 11851 if ( typeof newValue !== "number" ) { 11852 newValue = 0; 11853 } 11854 11855 return this.indeterminate ? false : 11856 Math.min( this.options.max, Math.max( this.min, newValue ) ); 11857 }, 11858 11859 _setOptions: function( options ) { 11860 // Ensure "value" option is set after other values (like max) 11861 var value = options.value; 11862 delete options.value; 11863 11864 this._super( options ); 11865 11866 this.options.value = this._constrainedValue( value ); 11867 this._refreshValue(); 11868 }, 11869 11870 _setOption: function( key, value ) { 11871 if ( key === "max" ) { 11872 // Don't allow a max less than min 11873 value = Math.max( this.min, value ); 11874 } 11875 if ( key === "disabled" ) { 11876 this.element 11877 .toggleClass( "ui-state-disabled", !!value ) 11878 .attr( "aria-disabled", value ); 11879 } 11880 this._super( key, value ); 11881 }, 11882 11883 _percentage: function() { 11884 return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min ); 11885 }, 11886 11887 _refreshValue: function() { 11888 var value = this.options.value, 11889 percentage = this._percentage(); 11890 11891 this.valueDiv 11892 .toggle( this.indeterminate || value > this.min ) 11893 .toggleClass( "ui-corner-right", value === this.options.max ) 11894 .width( percentage.toFixed(0) + "%" ); 11895 11896 this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate ); 11897 11898 if ( this.indeterminate ) { 11899 this.element.removeAttr( "aria-valuenow" ); 11900 if ( !this.overlayDiv ) { 11901 this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv ); 11902 } 11903 } else { 11904 this.element.attr({ 11905 "aria-valuemax": this.options.max, 11906 "aria-valuenow": value 11907 }); 11908 if ( this.overlayDiv ) { 11909 this.overlayDiv.remove(); 11910 this.overlayDiv = null; 11911 } 11912 } 11913 11914 if ( this.oldValue !== value ) { 11915 this.oldValue = value; 11916 this._trigger( "change" ); 11917 } 11918 if ( value === this.options.max ) { 11919 this._trigger( "complete" ); 11920 } 11921 } 11922}); 11923 11924 11925/*! 11926 * jQuery UI Selectable 1.11.2 11927 * http://jqueryui.com 11928 * 11929 * Copyright 2014 jQuery Foundation and other contributors 11930 * Released under the MIT license. 11931 * http://jquery.org/license 11932 * 11933 * http://api.jqueryui.com/selectable/ 11934 */ 11935 11936 11937var selectable = $.widget("ui.selectable", $.ui.mouse, { 11938 version: "1.11.2
vendor: 6,600 bytes, lines 11938-12198
11938", 11939 options: { 11940 appendTo: "body", 11941 autoRefresh: true, 11942 distance: 0, 11943 filter: "*", 11944 tolerance: "touch", 11945 11946 // callbacks 11947 selected: null, 11948 selecting: null, 11949 start: null, 11950 stop: null, 11951 unselected: null, 11952 unselecting: null 11953 }, 11954 _create: function() { 11955 var selectees, 11956 that = this; 11957 11958 this.element.addClass("ui-selectable"); 11959 11960 this.dragged = false; 11961 11962 // cache selectee children based on filter 11963 this.refresh = function() { 11964 selectees = $(that.options.filter, that.element[0]); 11965 selectees.addClass("ui-selectee"); 11966 selectees.each(function() { 11967 var $this = $(this), 11968 pos = $this.offset(); 11969 $.data(this, "selectable-item", { 11970 element: this, 11971 $element: $this, 11972 left: pos.left, 11973 top: pos.top, 11974 right: pos.left + $this.outerWidth(), 11975 bottom: pos.top + $this.outerHeight(), 11976 startselected: false, 11977 selected: $this.hasClass("ui-selected"), 11978 selecting: $this.hasClass("ui-selecting"), 11979 unselecting: $this.hasClass("ui-unselecting") 11980 }); 11981 }); 11982 }; 11983 this.refresh(); 11984 11985 this.selectees = selectees.addClass("ui-selectee"); 11986 11987 this._mouseInit(); 11988 11989 this.helper = $("<div class='ui-selectable-helper'></div>"); 11990 }, 11991 11992 _destroy: function() { 11993 this.selectees 11994 .removeClass("ui-selectee") 11995 .removeData("selectable-item"); 11996 this.element 11997 .removeClass("ui-selectable ui-selectable-disabled"); 11998 this._mouseDestroy(); 11999 }, 12000 12001 _mouseStart: function(event) { 12002 var that = this, 12003 options = this.options; 12004 12005 this.opos = [ event.pageX, event.pageY ]; 12006 12007 if (this.options.disabled) { 12008 return; 12009 } 12010 12011 this.selectees = $(options.filter, this.element[0]); 12012 12013 this._trigger("start", event); 12014 12015 $(options.appendTo).append(this.helper); 12016 // position helper (lasso) 12017 this.helper.css({ 12018 "left": event.pageX, 12019 "top": event.pageY, 12020 "width": 0, 12021 "height": 0 12022 }); 12023 12024 if (options.autoRefresh) { 12025 this.refresh(); 12026 } 12027 12028 this.selectees.filter(".ui-selected").each(function() { 12029 var selectee = $.data(this, "selectable-item"); 12030 selectee.startselected = true; 12031 if (!event.metaKey && !event.ctrlKey) { 12032 selectee.$element.removeClass("ui-selected"); 12033 selectee.selected = false; 12034 selectee.$element.addClass("ui-unselecting"); 12035 selectee.unselecting = true; 12036 // selectable UNSELECTING callback 12037 that._trigger("unselecting", event, { 12038 unselecting: selectee.element 12039 }); 12040 } 12041 }); 12042 12043 $(event.target).parents().addBack().each(function() { 12044 var doSelect, 12045 selectee = $.data(this, "selectable-item"); 12046 if (selectee) { 12047 doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected"); 12048 selectee.$element 12049 .removeClass(doSelect ? "ui-unselecting" : "ui-selected") 12050 .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); 12051 selectee.unselecting = !doSelect; 12052 selectee.selecting = doSelect; 12053 selectee.selected = doSelect; 12054 // selectable (UN)SELECTING callback 12055 if (doSelect) { 12056 that._trigger("selecting", event, { 12057 selecting: selectee.element 12058 }); 12059 } else { 12060 that._trigger("unselecting", event, { 12061 unselecting: selectee.element 12062 }); 12063 } 12064 return false; 12065 } 12066 }); 12067 12068 }, 12069 12070 _mouseDrag: function(event) { 12071 12072 this.dragged = true; 12073 12074 if (this.options.disabled) { 12075 return; 12076 } 12077 12078 var tmp, 12079 that = this, 12080 options = this.options, 12081 x1 = this.opos[0], 12082 y1 = this.opos[1], 12083 x2 = event.pageX, 12084 y2 = event.pageY; 12085 12086 if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; } 12087 if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; } 12088 this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 }); 12089 12090 this.selectees.each(function() { 12091 var selectee = $.data(this, "selectable-item"), 12092 hit = false; 12093 12094 //prevent helper from being selected if appendTo: selectable 12095 if (!selectee || selectee.element === that.element[0]) { 12096 return; 12097 } 12098 12099 if (options.tolerance === "touch") { 12100 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); 12101 } else if (options.tolerance === "fit") { 12102 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); 12103 } 12104 12105 if (hit) { 12106 // SELECT 12107 if (selectee.selected) { 12108 selectee.$element.removeClass("ui-selected"); 12109 selectee.selected = false; 12110 } 12111 if (selectee.unselecting) { 12112 selectee.$element.removeClass("ui-unselecting"); 12113 selectee.unselecting = false; 12114 } 12115 if (!selectee.selecting) { 12116 selectee.$element.addClass("ui-selecting"); 12117 selectee.selecting = true; 12118 // selectable SELECTING callback 12119 that._trigger("selecting", event, { 12120 selecting: selectee.element 12121 }); 12122 } 12123 } else { 12124 // UNSELECT 12125 if (selectee.selecting) { 12126 if ((event.metaKey || event.ctrlKey) && selectee.startselected) { 12127 selectee.$element.removeClass("ui-selecting"); 12128 selectee.selecting = false; 12129 selectee.$element.addClass("ui-selected"); 12130 selectee.selected = true; 12131 } else { 12132 selectee.$element.removeClass("ui-selecting"); 12133 selectee.selecting = false; 12134 if (selectee.startselected) { 12135 selectee.$element.addClass("ui-unselecting"); 12136 selectee.unselecting = true; 12137 } 12138 // selectable UNSELECTING callback 12139 that._trigger("unselecting", event, { 12140 unselecting: selectee.element 12141 }); 12142 } 12143 } 12144 if (selectee.selected) { 12145 if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { 12146 selectee.$element.removeClass("ui-selected"); 12147 selectee.selected = false; 12148 12149 selectee.$element.addClass("ui-unselecting"); 12150 selectee.unselecting = true; 12151 // selectable UNSELECTING callback 12152 that._trigger("unselecting", event, { 12153 unselecting: selectee.element 12154 }); 12155 } 12156 } 12157 } 12158 }); 12159 12160 return false; 12161 }, 12162 12163 _mouseStop: function(event) { 12164 var that = this; 12165 12166 this.dragged = false; 12167 12168 $(".ui-unselecting", this.element[0]).each(function() { 12169 var selectee = $.data(this, "selectable-item"); 12170 selectee.$element.removeClass("ui-unselecting"); 12171 selectee.unselecting = false; 12172 selectee.startselected = false; 12173 that._trigger("unselected", event, { 12174 unselected: selectee.element 12175 }); 12176 }); 12177 $(".ui-selecting", this.element[0]).each(function() { 12178 var selectee = $.data(this, "selectable-item"); 12179 selectee.$element.removeClass("ui-selecting").addClass("ui-selected"); 12180 selectee.selecting = false; 12181 selectee.selected = true; 12182 selectee.startselected = true; 12183 that._trigger("selected", event, { 12184 selected: selectee.element 12185 }); 12186 }); 12187 this._trigger("stop", event); 12188 12189 this.helper.remove(); 12190 12191 return false; 12192 } 12193 12194}); 12195 12196 12197/*! 12198 * jQuery UI Selectmenu 1.11.
vendor: 1,451 bytes, lines 12198-12268
121982 12199 * http://jqueryui.com 12200 * 12201 * Copyright 2014 jQuery Foundation and other contributors 12202 * Released under the MIT license. 12203 * http://jquery.org/license 12204 * 12205 * http://api.jqueryui.com/selectmenu 12206 */ 12207 12208 12209var selectmenu = $.widget( "ui.selectmenu", { 12210 version: "1.11.2", 12211 defaultElement: "<select>", 12212 options: { 12213 appendTo: null, 12214 disabled: null, 12215 icons: { 12216 button: "ui-icon-triangle-1-s" 12217 }, 12218 position: { 12219 my: "left top", 12220 at: "left bottom", 12221 collision: "none" 12222 }, 12223 width: null, 12224 12225 // callbacks 12226 change: null, 12227 close: null, 12228 focus: null, 12229 open: null, 12230 select: null 12231 }, 12232 12233 _create: function() { 12234 var selectmenuId = this.element.uniqueId().attr( "id" ); 12235 this.ids = { 12236 element: selectmenuId, 12237 button: selectmenuId + "-button", 12238 menu: selectmenuId + "-menu" 12239 }; 12240 12241 this._drawButton(); 12242 this._drawMenu(); 12243 12244 if ( this.options.disabled ) { 12245 this.disable(); 12246 } 12247 }, 12248 12249 _drawButton: function() { 12250 var that = this, 12251 tabindex = this.element.attr( "tabindex" ); 12252 12253 // Associate existing label with the new button 12254 this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button ); 12255 this._on( this.label, { 12256 click: function( event ) { 12257 this.button.focus(); 12258 event.preventDefault(); 12259 } 12260 }); 12261 12262 // Hide original select element 12263 this.element.hide(); 12264 12265 // Create button 12266 this.button = $( "<span>", { 12267 "class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all", 12268 tabindex: tabindex ||
vendor: 11,686 bytes, lines 12268-12778
12268 this.options.disabled ? -1 : 0, 12269 id: this.ids.button, 12270 role: "combobox", 12271 "aria-expanded": "false", 12272 "aria-autocomplete": "list", 12273 "aria-owns": this.ids.menu, 12274 "aria-haspopup": "true" 12275 }) 12276 .insertAfter( this.element ); 12277 12278 $( "<span>", { 12279 "class": "ui-icon " + this.options.icons.button 12280 }) 12281 .prependTo( this.button ); 12282 12283 this.buttonText = $( "<span>", { 12284 "class": "ui-selectmenu-text" 12285 }) 12286 .appendTo( this.button ); 12287 12288 this._setText( this.buttonText, this.element.find( "option:selected" ).text() ); 12289 this._resizeButton(); 12290 12291 this._on( this.button, this._buttonEvents ); 12292 this.button.one( "focusin", function() { 12293 12294 // Delay rendering the menu items until the button receives focus. 12295 // The menu may have already been rendered via a programmatic open. 12296 if ( !that.menuItems ) { 12297 that._refreshMenu(); 12298 } 12299 }); 12300 this._hoverable( this.button ); 12301 this._focusable( this.button ); 12302 }, 12303 12304 _drawMenu: function() { 12305 var that = this; 12306 12307 // Create menu 12308 this.menu = $( "<ul>", { 12309 "aria-hidden": "true", 12310 "aria-labelledby": this.ids.button, 12311 id: this.ids.menu 12312 }); 12313 12314 // Wrap menu 12315 this.menuWrap = $( "<div>", { 12316 "class": "ui-selectmenu-menu ui-front" 12317 }) 12318 .append( this.menu ) 12319 .appendTo( this._appendTo() ); 12320 12321 // Initialize menu widget 12322 this.menuInstance = this.menu 12323 .menu({ 12324 role: "listbox", 12325 select: function( event, ui ) { 12326 event.preventDefault(); 12327 12328 // support: IE8 12329 // If the item was selected via a click, the text selection 12330 // will be destroyed in IE 12331 that._setSelection(); 12332 12333 that._select( ui.item.data( "ui-selectmenu-item" ), event ); 12334 }, 12335 focus: function( event, ui ) { 12336 var item = ui.item.data( "ui-selectmenu-item" ); 12337 12338 // Prevent inital focus from firing and check if its a newly focused item 12339 if ( that.focusIndex != null && item.index !== that.focusIndex ) { 12340 that._trigger( "focus", event, { item: item } ); 12341 if ( !that.isOpen ) { 12342 that._select( item, event ); 12343 } 12344 } 12345 that.focusIndex = item.index; 12346 12347 that.button.attr( "aria-activedescendant", 12348 that.menuItems.eq( item.index ).attr( "id" ) ); 12349 } 12350 }) 12351 .menu( "instance" ); 12352 12353 // Adjust menu styles to dropdown 12354 this.menu 12355 .addClass( "ui-corner-bottom" ) 12356 .removeClass( "ui-corner-all" ); 12357 12358 // Don't close the menu on mouseleave 12359 this.menuInstance._off( this.menu, "mouseleave" ); 12360 12361 // Cancel the menu's collapseAll on document click 12362 this.menuInstance._closeOnDocumentClick = function() { 12363 return false; 12364 }; 12365 12366 // Selects often contain empty items, but never contain dividers 12367 this.menuInstance._isDivider = function() { 12368 return false; 12369 }; 12370 }, 12371 12372 refresh: function() { 12373 this._refreshMenu(); 12374 this._setText( this.buttonText, this._getSelectedItem().text() ); 12375 if ( !this.options.width ) { 12376 this._resizeButton(); 12377 } 12378 }, 12379 12380 _refreshMenu: function() { 12381 this.menu.empty(); 12382 12383 var item, 12384 options = this.element.find( "option" ); 12385 12386 if ( !options.length ) { 12387 return; 12388 } 12389 12390 this._parseOptions( options ); 12391 this._renderMenu( this.menu, this.items ); 12392 12393 this.menuInstance.refresh(); 12394 this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" ); 12395 12396 item = this._getSelectedItem(); 12397 12398 // Update the menu to have the correct item focused 12399 this.menuInstance.focus( null, item ); 12400 this._setAria( item.data( "ui-selectmenu-item" ) ); 12401 12402 // Set disabled state 12403 this._setOption( "disabled", this.element.prop( "disabled" ) ); 12404 }, 12405 12406 open: function( event ) { 12407 if ( this.options.disabled ) { 12408 return; 12409 } 12410 12411 // If this is the first time the menu is being opened, render the items 12412 if ( !this.menuItems ) { 12413 this._refreshMenu(); 12414 } else { 12415 12416 // Menu clears focus on close, reset focus to selected item 12417 this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" ); 12418 this.menuInstance.focus( null, this._getSelectedItem() ); 12419 } 12420 12421 this.isOpen = true; 12422 this._toggleAttr(); 12423 this._resizeMenu(); 12424 this._position(); 12425 12426 this._on( this.document, this._documentClick ); 12427 12428 this._trigger( "open", event ); 12429 }, 12430 12431 _position: function() { 12432 this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) ); 12433 }, 12434 12435 close: function( event ) { 12436 if ( !this.isOpen ) { 12437 return; 12438 } 12439 12440 this.isOpen = false; 12441 this._toggleAttr(); 12442 12443 this.range = null; 12444 this._off( this.document ); 12445 12446 this._trigger( "close", event ); 12447 }, 12448 12449 widget: function() { 12450 return this.button; 12451 }, 12452 12453 menuWidget: function() { 12454 return this.menu; 12455 }, 12456 12457 _renderMenu: function( ul, items ) { 12458 var that = this, 12459 currentOptgroup = ""; 12460 12461 $.each( items, function( index, item ) { 12462 if ( item.optgroup !== currentOptgroup ) { 12463 $( "<li>", { 12464 "class": "ui-selectmenu-optgroup ui-menu-divider" + 12465 ( item.element.parent( "optgroup" ).prop( "disabled" ) ? 12466 " ui-state-disabled" : 12467 "" ), 12468 text: item.optgroup 12469 }) 12470 .appendTo( ul ); 12471 12472 currentOptgroup = item.optgroup; 12473 } 12474 12475 that._renderItemData( ul, item ); 12476 }); 12477 }, 12478 12479 _renderItemData: function( ul, item ) { 12480 return this._renderItem( ul, item ).data( "ui-selectmenu-item", item ); 12481 }, 12482 12483 _renderItem: function( ul, item ) { 12484 var li = $( "<li>" ); 12485 12486 if ( item.disabled ) { 12487 li.addClass( "ui-state-disabled" ); 12488 } 12489 this._setText( li, item.label ); 12490 12491 return li.appendTo( ul ); 12492 }, 12493 12494 _setText: function( element, value ) { 12495 if ( value ) { 12496 element.text( value ); 12497 } else { 12498 element.html( " " ); 12499 } 12500 }, 12501 12502 _move: function( direction, event ) { 12503 var item, next, 12504 filter = ".ui-menu-item"; 12505 12506 if ( this.isOpen ) { 12507 item = this.menuItems.eq( this.focusIndex ); 12508 } else { 12509 item = this.menuItems.eq( this.element[ 0 ].selectedIndex ); 12510 filter += ":not(.ui-state-disabled)"; 12511 } 12512 12513 if ( direction === "first" || direction === "last" ) { 12514 next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 ); 12515 } else { 12516 next = item[ direction + "All" ]( filter ).eq( 0 ); 12517 } 12518 12519 if ( next.length ) { 12520 this.menuInstance.focus( event, next ); 12521 } 12522 }, 12523 12524 _getSelectedItem: function() { 12525 return this.menuItems.eq( this.element[ 0 ].selectedIndex ); 12526 }, 12527 12528 _toggle: function( event ) { 12529 this[ this.isOpen ? "close" : "open" ]( event ); 12530 }, 12531 12532 _setSelection: function() { 12533 var selection; 12534 12535 if ( !this.range ) { 12536 return; 12537 } 12538 12539 if ( window.getSelection ) { 12540 selection = window.getSelection(); 12541 selection.removeAllRanges(); 12542 selection.addRange( this.range ); 12543 12544 // support: IE8 12545 } else { 12546 this.range.select(); 12547 } 12548 12549 // support: IE 12550 // Setting the text selection kills the button focus in IE, but 12551 // restoring the focus doesn't kill the selection. 12552 this.button.focus(); 12553 }, 12554 12555 _documentClick: { 12556 mousedown: function( event ) { 12557 if ( !this.isOpen ) { 12558 return; 12559 } 12560 12561 if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) { 12562 this.close( event ); 12563 } 12564 } 12565 }, 12566 12567 _buttonEvents: { 12568 12569 // Prevent text selection from being reset when interacting with the selectmenu (#10144) 12570 mousedown: function() { 12571 var selection; 12572 12573 if ( window.getSelection ) { 12574 selection = window.getSelection(); 12575 if ( selection.rangeCount ) { 12576 this.range = selection.getRangeAt( 0 ); 12577 } 12578 12579 // support: IE8 12580 } else { 12581 this.range = document.selection.createRange(); 12582 } 12583 }, 12584 12585 click: function( event ) { 12586 this._setSelection(); 12587 this._toggle( event ); 12588 }, 12589 12590 keydown: function( event ) { 12591 var preventDefault = true; 12592 switch ( event.keyCode ) { 12593 case $.ui.keyCode.TAB: 12594 case $.ui.keyCode.ESCAPE: 12595 this.close( event ); 12596 preventDefault = false; 12597 break; 12598 case $.ui.keyCode.ENTER: 12599 if ( this.isOpen ) { 12600 this._selectFocusedItem( event ); 12601 } 12602 break; 12603 case $.ui.keyCode.UP: 12604 if ( event.altKey ) { 12605 this._toggle( event ); 12606 } else { 12607 this._move( "prev", event ); 12608 } 12609 break; 12610 case $.ui.keyCode.DOWN: 12611 if ( event.altKey ) { 12612 this._toggle( event ); 12613 } else { 12614 this._move( "next", event ); 12615 } 12616 break; 12617 case $.ui.keyCode.SPACE: 12618 if ( this.isOpen ) { 12619 this._selectFocusedItem( event ); 12620 } else { 12621 this._toggle( event ); 12622 } 12623 break; 12624 case $.ui.keyCode.LEFT: 12625 this._move( "prev", event ); 12626 break; 12627 case $.ui.keyCode.RIGHT: 12628 this._move( "next", event ); 12629 break; 12630 case $.ui.keyCode.HOME: 12631 case $.ui.keyCode.PAGE_UP: 12632 this._move( "first", event ); 12633 break; 12634 case $.ui.keyCode.END: 12635 case $.ui.keyCode.PAGE_DOWN: 12636 this._move( "last", event ); 12637 break; 12638 default: 12639 this.menu.trigger( event ); 12640 preventDefault = false; 12641 } 12642 12643 if ( preventDefault ) { 12644 event.preventDefault(); 12645 } 12646 } 12647 }, 12648 12649 _selectFocusedItem: function( event ) { 12650 var item = this.menuItems.eq( this.focusIndex ); 12651 if ( !item.hasClass( "ui-state-disabled" ) ) { 12652 this._select( item.data( "ui-selectmenu-item" ), event ); 12653 } 12654 }, 12655 12656 _select: function( item, event ) { 12657 var oldIndex = this.element[ 0 ].selectedIndex; 12658 12659 // Change native select element 12660 this.element[ 0 ].selectedIndex = item.index; 12661 this._setText( this.buttonText, item.label ); 12662 this._setAria( item ); 12663 this._trigger( "select", event, { item: item } ); 12664 12665 if ( item.index !== oldIndex ) { 12666 this._trigger( "change", event, { item: item } ); 12667 } 12668 12669 this.close( event ); 12670 }, 12671 12672 _setAria: function( item ) { 12673 var id = this.menuItems.eq( item.index ).attr( "id" ); 12674 12675 this.button.attr({ 12676 "aria-labelledby": id, 12677 "aria-activedescendant": id 12678 }); 12679 this.menu.attr( "aria-activedescendant", id ); 12680 }, 12681 12682 _setOption: function( key, value ) { 12683 if ( key === "icons" ) { 12684 this.button.find( "span.ui-icon" ) 12685 .removeClass( this.options.icons.button ) 12686 .addClass( value.button ); 12687 } 12688 12689 this._super( key, value ); 12690 12691 if ( key === "appendTo" ) { 12692 this.menuWrap.appendTo( this._appendTo() ); 12693 } 12694 12695 if ( key === "disabled" ) { 12696 this.menuInstance.option( "disabled", value ); 12697 this.button 12698 .toggleClass( "ui-state-disabled", value ) 12699 .attr( "aria-disabled", value ); 12700 12701 this.element.prop( "disabled", value ); 12702 if ( value ) { 12703 this.button.attr( "tabindex", -1 ); 12704 this.close(); 12705 } else { 12706 this.button.attr( "tabindex", 0 ); 12707 } 12708 } 12709 12710 if ( key === "width" ) { 12711 this._resizeButton(); 12712 } 12713 }, 12714 12715 _appendTo: function() { 12716 var element = this.options.appendTo; 12717 12718 if ( element ) { 12719 element = element.jquery || element.nodeType ? 12720 $( element ) : 12721 this.document.find( element ).eq( 0 ); 12722 } 12723 12724 if ( !element || !element[ 0 ] ) { 12725 element = this.element.closest( ".ui-front" ); 12726 } 12727 12728 if ( !element.length ) { 12729 element = this.document[ 0 ].body; 12730 } 12731 12732 return element; 12733 }, 12734 12735 _toggleAttr: function() { 12736 this.button 12737 .toggleClass( "ui-corner-top", this.isOpen ) 12738 .toggleClass( "ui-corner-all", !this.isOpen ) 12739 .attr( "aria-expanded", this.isOpen ); 12740 this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen ); 12741 this.menu.attr( "aria-hidden", !this.isOpen ); 12742 }, 12743 12744 _resizeButton: function() { 12745 var width = this.options.width; 12746 12747 if ( !width ) { 12748 width = this.element.show().outerWidth(); 12749 this.element.hide(); 12750 } 12751 12752 this.button.outerWidth( width ); 12753 }, 12754 12755 _resizeMenu: function() { 12756 this.menu.outerWidth( Math.max( 12757 this.button.outerWidth(), 12758 12759 // support: IE10 12760 // IE10 wraps long text (possibly a rounding bug) 12761 // so we add 1px to avoid the wrapping 12762 this.menu.width( "" ).outerWidth() + 1 12763 ) ); 12764 }, 12765 12766 _getCreateOptions: function() { 12767 return { disabled: this.element.prop( "disabled" ) }; 12768 }, 12769 12770 _parseOptions: function( options ) { 12771 var data = []; 12772 options.each(function( index, item ) { 12773 var option = $( item ), 12774 optgroup = option.parent( "optgroup" ); 12775 data.push({ 12776 element: option, 12777 index: index, 12778 value: option.
12778attr( "value" ), 12779 label: option.text(), 12780 optgroup: optgroup.attr( "label" ) || "", 12781 disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" ) 12782 }); 12783 }); 12784 this.items = data; 12785 }, 12786 12787 _destroy: function() { 12788 this.menuWrap.remove(); 12789 this.button.remove(); 12790 this.element.show(); 12791 this.element.removeUniqueId(); 12792 this.label.attr( "for", this.ids.element ); 12793 } 12794}); 12795 12796 12797/*! 12798 * jQuery UI Slider 1.11.2 12799 * http://jqueryui.com 12800 * 12801 * Copyright 2014 jQuery Foundation and other contributors 12802 * Released under the MIT license. 12803 * http://jquery.org/license 12804 * 12805 * http://api.jqueryui.com/slider/ 12806 */ 12807 12808 12809var slider = $.widget( "ui.slider", $.ui.mouse, { 12810 version: "1.11.2
vendor: 4,654 bytes, lines 12810-12998
12810", 12811 widgetEventPrefix: "slide", 12812 12813 options: { 12814 animate: false, 12815 distance: 0, 12816 max: 100, 12817 min: 0, 12818 orientation: "horizontal", 12819 range: false, 12820 step: 1, 12821 value: 0, 12822 values: null, 12823 12824 // callbacks 12825 change: null, 12826 slide: null, 12827 start: null, 12828 stop: null 12829 }, 12830 12831 // number of pages in a slider 12832 // (how many times can you page up/down to go through the whole range) 12833 numPages: 5, 12834 12835 _create: function() { 12836 this._keySliding = false; 12837 this._mouseSliding = false; 12838 this._animateOff = true; 12839 this._handleIndex = null; 12840 this._detectOrientation(); 12841 this._mouseInit(); 12842 this._calculateNewMax(); 12843 12844 this.element 12845 .addClass( "ui-slider" + 12846 " ui-slider-" + this.orientation + 12847 " ui-widget" + 12848 " ui-widget-content" + 12849 " ui-corner-all"); 12850 12851 this._refresh(); 12852 this._setOption( "disabled", this.options.disabled ); 12853 12854 this._animateOff = false; 12855 }, 12856 12857 _refresh: function() { 12858 this._createRange(); 12859 this._createHandles(); 12860 this._setupEvents(); 12861 this._refreshValue(); 12862 }, 12863 12864 _createHandles: function() { 12865 var i, handleCount, 12866 options = this.options, 12867 existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ), 12868 handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>", 12869 handles = []; 12870 12871 handleCount = ( options.values && options.values.length ) || 1; 12872 12873 if ( existingHandles.length > handleCount ) { 12874 existingHandles.slice( handleCount ).remove(); 12875 existingHandles = existingHandles.slice( 0, handleCount ); 12876 } 12877 12878 for ( i = existingHandles.length; i < handleCount; i++ ) { 12879 handles.push( handle ); 12880 } 12881 12882 this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) ); 12883 12884 this.handle = this.handles.eq( 0 ); 12885 12886 this.handles.each(function( i ) { 12887 $( this ).data( "ui-slider-handle-index", i ); 12888 }); 12889 }, 12890 12891 _createRange: function() { 12892 var options = this.options, 12893 classes = ""; 12894 12895 if ( options.range ) { 12896 if ( options.range === true ) { 12897 if ( !options.values ) { 12898 options.values = [ this._valueMin(), this._valueMin() ]; 12899 } else if ( options.values.length && options.values.length !== 2 ) { 12900 options.values = [ options.values[0], options.values[0] ]; 12901 } else if ( $.isArray( options.values ) ) { 12902 options.values = options.values.slice(0); 12903 } 12904 } 12905 12906 if ( !this.range || !this.range.length ) { 12907 this.range = $( "<div></div>" ) 12908 .appendTo( this.element ); 12909 12910 classes = "ui-slider-range" + 12911 // note: this isn't the most fittingly semantic framework class for this element, 12912 // but worked best visually with a variety of themes 12913 " ui-widget-header ui-corner-all"; 12914 } else { 12915 this.range.removeClass( "ui-slider-range-min ui-slider-range-max" ) 12916 // Handle range switching from true to min/max 12917 .css({ 12918 "left": "", 12919 "bottom": "" 12920 }); 12921 } 12922 12923 this.range.addClass( classes + 12924 ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) ); 12925 } else { 12926 if ( this.range ) { 12927 this.range.remove(); 12928 } 12929 this.range = null; 12930 } 12931 }, 12932 12933 _setupEvents: function() { 12934 this._off( this.handles ); 12935 this._on( this.handles, this._handleEvents ); 12936 this._hoverable( this.handles ); 12937 this._focusable( this.handles ); 12938 }, 12939 12940 _destroy: function() { 12941 this.handles.remove(); 12942 if ( this.range ) { 12943 this.range.remove(); 12944 } 12945 12946 this.element 12947 .removeClass( "ui-slider" + 12948 " ui-slider-horizontal" + 12949 " ui-slider-vertical" + 12950 " ui-widget" + 12951 " ui-widget-content" + 12952 " ui-corner-all" ); 12953 12954 this._mouseDestroy(); 12955 }, 12956 12957 _mouseCapture: function( event ) { 12958 var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle, 12959 that = this, 12960 o = this.options; 12961 12962 if ( o.disabled ) { 12963 return false; 12964 } 12965 12966 this.elementSize = { 12967 width: this.element.outerWidth(), 12968 height: this.element.outerHeight() 12969 }; 12970 this.elementOffset = this.element.offset(); 12971 12972 position = { x: event.pageX, y: event.pageY }; 12973 normValue = this._normValueFromMouse( position ); 12974 distance = this._valueMax() - this._valueMin() + 1; 12975 this.handles.each(function( i ) { 12976 var thisDistance = Math.abs( normValue - that.values(i) ); 12977 if (( distance > thisDistance ) || 12978 ( distance === thisDistance && 12979 (i === that._lastChangedValue || that.values(i) === o.min ))) { 12980 distance = thisDistance; 12981 closestHandle = $( this ); 12982 index = i; 12983 } 12984 }); 12985 12986 allowed = this._start( event, index ); 12987 if ( allowed === false ) { 12988 return false; 12989 } 12990 this._mouseSliding = true; 12991 12992 this._handleIndex = index; 12993 12994 closestHandle 12995 .addClass( "ui-state-active" ) 12996 .focus(); 12997 12998 offset = closestHandle.offset();
vendor: 6,725 bytes, lines 12999-13257
12999 mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" ); 13000 this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { 13001 left: event.pageX - offset.left - ( closestHandle.width() / 2 ), 13002 top: event.pageY - offset.top - 13003 ( closestHandle.height() / 2 ) - 13004 ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) - 13005 ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) + 13006 ( parseInt( closestHandle.css("marginTop"), 10 ) || 0) 13007 }; 13008 13009 if ( !this.handles.hasClass( "ui-state-hover" ) ) { 13010 this._slide( event, index, normValue ); 13011 } 13012 this._animateOff = true; 13013 return true; 13014 }, 13015 13016 _mouseStart: function() { 13017 return true; 13018 }, 13019 13020 _mouseDrag: function( event ) { 13021 var position = { x: event.pageX, y: event.pageY }, 13022 normValue = this._normValueFromMouse( position ); 13023 13024 this._slide( event, this._handleIndex, normValue ); 13025 13026 return false; 13027 }, 13028 13029 _mouseStop: function( event ) { 13030 this.handles.removeClass( "ui-state-active" ); 13031 this._mouseSliding = false; 13032 13033 this._stop( event, this._handleIndex ); 13034 this._change( event, this._handleIndex ); 13035 13036 this._handleIndex = null; 13037 this._clickOffset = null; 13038 this._animateOff = false; 13039 13040 return false; 13041 }, 13042 13043 _detectOrientation: function() { 13044 this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; 13045 }, 13046 13047 _normValueFromMouse: function( position ) { 13048 var pixelTotal, 13049 pixelMouse, 13050 percentMouse, 13051 valueTotal, 13052 valueMouse; 13053 13054 if ( this.orientation === "horizontal" ) { 13055 pixelTotal = this.elementSize.width; 13056 pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 ); 13057 } else { 13058 pixelTotal = this.elementSize.height; 13059 pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 ); 13060 } 13061 13062 percentMouse = ( pixelMouse / pixelTotal ); 13063 if ( percentMouse > 1 ) { 13064 percentMouse = 1; 13065 } 13066 if ( percentMouse < 0 ) { 13067 percentMouse = 0; 13068 } 13069 if ( this.orientation === "vertical" ) { 13070 percentMouse = 1 - percentMouse; 13071 } 13072 13073 valueTotal = this._valueMax() - this._valueMin(); 13074 valueMouse = this._valueMin() + percentMouse * valueTotal; 13075 13076 return this._trimAlignValue( valueMouse ); 13077 }, 13078 13079 _start: function( event, index ) { 13080 var uiHash = { 13081 handle: this.handles[ index ], 13082 value: this.value() 13083 }; 13084 if ( this.options.values && this.options.values.length ) { 13085 uiHash.value = this.values( index ); 13086 uiHash.values = this.values(); 13087 } 13088 return this._trigger( "start", event, uiHash ); 13089 }, 13090 13091 _slide: function( event, index, newVal ) { 13092 var otherVal, 13093 newValues, 13094 allowed; 13095 13096 if ( this.options.values && this.options.values.length ) { 13097 otherVal = this.values( index ? 0 : 1 ); 13098 13099 if ( ( this.options.values.length === 2 && this.options.range === true ) && 13100 ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) ) 13101 ) { 13102 newVal = otherVal; 13103 } 13104 13105 if ( newVal !== this.values( index ) ) { 13106 newValues = this.values(); 13107 newValues[ index ] = newVal; 13108 // A slide can be canceled by returning false from the slide callback 13109 allowed = this._trigger( "slide", event, { 13110 handle: this.handles[ index ], 13111 value: newVal, 13112 values: newValues 13113 } ); 13114 otherVal = this.values( index ? 0 : 1 ); 13115 if ( allowed !== false ) { 13116 this.values( index, newVal ); 13117 } 13118 } 13119 } else { 13120 if ( newVal !== this.value() ) { 13121 // A slide can be canceled by returning false from the slide callback 13122 allowed = this._trigger( "slide", event, { 13123 handle: this.handles[ index ], 13124 value: newVal 13125 } ); 13126 if ( allowed !== false ) { 13127 this.value( newVal ); 13128 } 13129 } 13130 } 13131 }, 13132 13133 _stop: function( event, index ) { 13134 var uiHash = { 13135 handle: this.handles[ index ], 13136 value: this.value() 13137 }; 13138 if ( this.options.values && this.options.values.length ) { 13139 uiHash.value = this.values( index ); 13140 uiHash.values = this.values(); 13141 } 13142 13143 this._trigger( "stop", event, uiHash ); 13144 }, 13145 13146 _change: function( event, index ) { 13147 if ( !this._keySliding && !this._mouseSliding ) { 13148 var uiHash = { 13149 handle: this.handles[ index ], 13150 value: this.value() 13151 }; 13152 if ( this.options.values && this.options.values.length ) { 13153 uiHash.value = this.values( index ); 13154 uiHash.values = this.values(); 13155 } 13156 13157 //store the last changed value index for reference when handles overlap 13158 this._lastChangedValue = index; 13159 13160 this._trigger( "change", event, uiHash ); 13161 } 13162 }, 13163 13164 value: function( newValue ) { 13165 if ( arguments.length ) { 13166 this.options.value = this._trimAlignValue( newValue ); 13167 this._refreshValue(); 13168 this._change( null, 0 ); 13169 return; 13170 } 13171 13172 return this._value(); 13173 }, 13174 13175 values: function( index, newValue ) { 13176 var vals, 13177 newValues, 13178 i; 13179 13180 if ( arguments.length > 1 ) { 13181 this.options.values[ index ] = this._trimAlignValue( newValue ); 13182 this._refreshValue(); 13183 this._change( null, index ); 13184 return; 13185 } 13186 13187 if ( arguments.length ) { 13188 if ( $.isArray( arguments[ 0 ] ) ) { 13189 vals = this.options.values; 13190 newValues = arguments[ 0 ]; 13191 for ( i = 0; i < vals.length; i += 1 ) { 13192 vals[ i ] = this._trimAlignValue( newValues[ i ] ); 13193 this._change( null, i ); 13194 } 13195 this._refreshValue(); 13196 } else { 13197 if ( this.options.values && this.options.values.length ) { 13198 return this._values( index ); 13199 } else { 13200 return this.value(); 13201 } 13202 } 13203 } else { 13204 return this._values(); 13205 } 13206 }, 13207 13208 _setOption: function( key, value ) { 13209 var i, 13210 valsLength = 0; 13211 13212 if ( key === "range" && this.options.range === true ) { 13213 if ( value === "min" ) { 13214 this.options.value = this._values( 0 ); 13215 this.options.values = null; 13216 } else if ( value === "max" ) { 13217 this.options.value = this._values( this.options.values.length - 1 ); 13218 this.options.values = null; 13219 } 13220 } 13221 13222 if ( $.isArray( this.options.values ) ) { 13223 valsLength = this.options.values.length; 13224 } 13225 13226 if ( key === "disabled" ) { 13227 this.element.toggleClass( "ui-state-disabled", !!value ); 13228 } 13229 13230 this._super( key, value ); 13231 13232 switch ( key ) { 13233 case "orientation": 13234 this._detectOrientation(); 13235 this.element 13236 .removeClass( "ui-slider-horizontal ui-slider-vertical" ) 13237 .addClass( "ui-slider-" + this.orientation ); 13238 this._refreshValue(); 13239 13240 // Reset positioning from previous orientation 13241 this.handles.css( value === "horizontal" ? "bottom" : "left", "" ); 13242 break; 13243 case "value": 13244 this._animateOff = true; 13245 this._refreshValue(); 13246 this._change( null, 0 ); 13247 this._animateOff = false; 13248 break; 13249 case "values": 13250 this._animateOff = true; 13251 this._refreshValue(); 13252 for ( i = 0; i < valsLength; i += 1 ) { 13253 this._change( null, i ); 13254 } 13255 this._animateOff = false; 13256 break; 13257 case "
vendor: 7,044 bytes, lines 13257-13494
13257step": 13258 case "min": 13259 case "max": 13260 this._animateOff = true; 13261 this._calculateNewMax(); 13262 this._refreshValue(); 13263 this._animateOff = false; 13264 break; 13265 case "range": 13266 this._animateOff = true; 13267 this._refresh(); 13268 this._animateOff = false; 13269 break; 13270 } 13271 }, 13272 13273 //internal value getter 13274 // _value() returns value trimmed by min and max, aligned by step 13275 _value: function() { 13276 var val = this.options.value; 13277 val = this._trimAlignValue( val ); 13278 13279 return val; 13280 }, 13281 13282 //internal values getter 13283 // _values() returns array of values trimmed by min and max, aligned by step 13284 // _values( index ) returns single value trimmed by min and max, aligned by step 13285 _values: function( index ) { 13286 var val, 13287 vals, 13288 i; 13289 13290 if ( arguments.length ) { 13291 val = this.options.values[ index ]; 13292 val = this._trimAlignValue( val ); 13293 13294 return val; 13295 } else if ( this.options.values && this.options.values.length ) { 13296 // .slice() creates a copy of the array 13297 // this copy gets trimmed by min and max and then returned 13298 vals = this.options.values.slice(); 13299 for ( i = 0; i < vals.length; i += 1) { 13300 vals[ i ] = this._trimAlignValue( vals[ i ] ); 13301 } 13302 13303 return vals; 13304 } else { 13305 return []; 13306 } 13307 }, 13308 13309 // returns the step-aligned value that val is closest to, between (inclusive) min and max 13310 _trimAlignValue: function( val ) { 13311 if ( val <= this._valueMin() ) { 13312 return this._valueMin(); 13313 } 13314 if ( val >= this._valueMax() ) { 13315 return this._valueMax(); 13316 } 13317 var step = ( this.options.step > 0 ) ? this.options.step : 1, 13318 valModStep = (val - this._valueMin()) % step, 13319 alignValue = val - valModStep; 13320 13321 if ( Math.abs(valModStep) * 2 >= step ) { 13322 alignValue += ( valModStep > 0 ) ? step : ( -step ); 13323 } 13324 13325 // Since JavaScript has problems with large floats, round 13326 // the final value to 5 digits after the decimal point (see #4124) 13327 return parseFloat( alignValue.toFixed(5) ); 13328 }, 13329 13330 _calculateNewMax: function() { 13331 var remainder = ( this.options.max - this._valueMin() ) % this.options.step; 13332 this.max = this.options.max - remainder; 13333 }, 13334 13335 _valueMin: function() { 13336 return this.options.min; 13337 }, 13338 13339 _valueMax: function() { 13340 return this.max; 13341 }, 13342 13343 _refreshValue: function() { 13344 var lastValPercent, valPercent, value, valueMin, valueMax, 13345 oRange = this.options.range, 13346 o = this.options, 13347 that = this, 13348 animate = ( !this._animateOff ) ? o.animate : false, 13349 _set = {}; 13350 13351 if ( this.options.values && this.options.values.length ) { 13352 this.handles.each(function( i ) { 13353 valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100; 13354 _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; 13355 $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); 13356 if ( that.options.range === true ) { 13357 if ( that.orientation === "horizontal" ) { 13358 if ( i === 0 ) { 13359 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); 13360 } 13361 if ( i === 1 ) { 13362 that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); 13363 } 13364 } else { 13365 if ( i === 0 ) { 13366 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); 13367 } 13368 if ( i === 1 ) { 13369 that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); 13370 } 13371 } 13372 } 13373 lastValPercent = valPercent; 13374 }); 13375 } else { 13376 value = this.value(); 13377 valueMin = this._valueMin(); 13378 valueMax = this._valueMax(); 13379 valPercent = ( valueMax !== valueMin ) ? 13380 ( value - valueMin ) / ( valueMax - valueMin ) * 100 : 13381 0; 13382 _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; 13383 this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); 13384 13385 if ( oRange === "min" && this.orientation === "horizontal" ) { 13386 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate ); 13387 } 13388 if ( oRange === "max" && this.orientation === "horizontal" ) { 13389 this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); 13390 } 13391 if ( oRange === "min" && this.orientation === "vertical" ) { 13392 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate ); 13393 } 13394 if ( oRange === "max" && this.orientation === "vertical" ) { 13395 this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); 13396 } 13397 } 13398 }, 13399 13400 _handleEvents: { 13401 keydown: function( event ) { 13402 var allowed, curVal, newVal, step, 13403 index = $( event.target ).data( "ui-slider-handle-index" ); 13404 13405 switch ( event.keyCode ) { 13406 case $.ui.keyCode.HOME: 13407 case $.ui.keyCode.END: 13408 case $.ui.keyCode.PAGE_UP: 13409 case $.ui.keyCode.PAGE_DOWN: 13410 case $.ui.keyCode.UP: 13411 case $.ui.keyCode.RIGHT: 13412 case $.ui.keyCode.DOWN: 13413 case $.ui.keyCode.LEFT: 13414 event.preventDefault(); 13415 if ( !this._keySliding ) { 13416 this._keySliding = true; 13417 $( event.target ).addClass( "ui-state-active" ); 13418 allowed = this._start( event, index ); 13419 if ( allowed === false ) { 13420 return; 13421 } 13422 } 13423 break; 13424 } 13425 13426 step = this.options.step; 13427 if ( this.options.values && this.options.values.length ) { 13428 curVal = newVal = this.values( index ); 13429 } else { 13430 curVal = newVal = this.value(); 13431 } 13432 13433 switch ( event.keyCode ) { 13434 case $.ui.keyCode.HOME: 13435 newVal = this._valueMin(); 13436 break; 13437 case $.ui.keyCode.END: 13438 newVal = this._valueMax(); 13439 break; 13440 case $.ui.keyCode.PAGE_UP: 13441 newVal = this._trimAlignValue( 13442 curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages ) 13443 ); 13444 break; 13445 case $.ui.keyCode.PAGE_DOWN: 13446 newVal = this._trimAlignValue( 13447 curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) ); 13448 break; 13449 case $.ui.keyCode.UP: 13450 case $.ui.keyCode.RIGHT: 13451 if ( curVal === this._valueMax() ) { 13452 return; 13453 } 13454 newVal = this._trimAlignValue( curVal + step ); 13455 break; 13456 case $.ui.keyCode.DOWN: 13457 case $.ui.keyCode.LEFT: 13458 if ( curVal === this._valueMin() ) { 13459 return; 13460 } 13461 newVal = this._trimAlignValue( curVal - step ); 13462 break; 13463 } 13464 13465 this._slide( event, index, newVal ); 13466 }, 13467 keyup: function( event ) { 13468 var index = $( event.target ).data( "ui-slider-handle-index" ); 13469 13470 if ( this._keySliding ) { 13471 this._keySliding = false; 13472 this._stop( event, index ); 13473 this._change( event, index ); 13474 $( event.target ).removeClass( "ui-state-active" ); 13475 } 13476 } 13477 } 13478}); 13479 13480 13481/*! 13482 * jQuery UI Sortable 1.11.2 13483 * http://jqueryui.com 13484 * 13485 * Copyright 2014 jQuery Foundation and other contributors 13486 * Released under the MIT license. 13487 * http://jquery.org/license 13488 * 13489 * http://api.jqueryui.com/sortable/ 13490 */ 13491 13492 13493var sortable = $.widget("ui.sortable", $.ui.mouse, { 13494 version: "1.11.2
vendor: 26,801 bytes, lines 13494-14379
13494", 13495 widgetEventPrefix: "sort", 13496 ready: false, 13497 options: { 13498 appendTo: "parent", 13499 axis: false, 13500 connectWith: false, 13501 containment: false, 13502 cursor: "auto", 13503 cursorAt: false, 13504 dropOnEmpty: true, 13505 forcePlaceholderSize: false, 13506 forceHelperSize: false, 13507 grid: false, 13508 handle: false, 13509 helper: "original", 13510 items: "> *", 13511 opacity: false, 13512 placeholder: false, 13513 revert: false, 13514 scroll: true, 13515 scrollSensitivity: 20, 13516 scrollSpeed: 20, 13517 scope: "default", 13518 tolerance: "intersect", 13519 zIndex: 1000, 13520 13521 // callbacks 13522 activate: null, 13523 beforeStop: null, 13524 change: null, 13525 deactivate: null, 13526 out: null, 13527 over: null, 13528 receive: null, 13529 remove: null, 13530 sort: null, 13531 start: null, 13532 stop: null, 13533 update: null 13534 }, 13535 13536 _isOverAxis: function( x, reference, size ) { 13537 return ( x >= reference ) && ( x < ( reference + size ) ); 13538 }, 13539 13540 _isFloating: function( item ) { 13541 return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display")); 13542 }, 13543 13544 _create: function() { 13545 13546 var o = this.options; 13547 this.containerCache = {}; 13548 this.element.addClass("ui-sortable"); 13549 13550 //Get the items 13551 this.refresh(); 13552 13553 //Let's determine if the items are being displayed horizontally 13554 this.floating = this.items.length ? o.axis === "x" || this._isFloating(this.items[0].item) : false; 13555 13556 //Let's determine the parent's offset 13557 this.offset = this.element.offset(); 13558 13559 //Initialize mouse events for interaction 13560 this._mouseInit(); 13561 13562 this._setHandleClassName(); 13563 13564 //We're ready to go 13565 this.ready = true; 13566 13567 }, 13568 13569 _setOption: function( key, value ) { 13570 this._super( key, value ); 13571 13572 if ( key === "handle" ) { 13573 this._setHandleClassName(); 13574 } 13575 }, 13576 13577 _setHandleClassName: function() { 13578 this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" ); 13579 $.each( this.items, function() { 13580 ( this.instance.options.handle ? 13581 this.item.find( this.instance.options.handle ) : this.item ) 13582 .addClass( "ui-sortable-handle" ); 13583 }); 13584 }, 13585 13586 _destroy: function() { 13587 this.element 13588 .removeClass( "ui-sortable ui-sortable-disabled" ) 13589 .find( ".ui-sortable-handle" ) 13590 .removeClass( "ui-sortable-handle" ); 13591 this._mouseDestroy(); 13592 13593 for ( var i = this.items.length - 1; i >= 0; i-- ) { 13594 this.items[i].item.removeData(this.widgetName + "-item"); 13595 } 13596 13597 return this; 13598 }, 13599 13600 _mouseCapture: function(event, overrideHandle) { 13601 var currentItem = null, 13602 validHandle = false, 13603 that = this; 13604 13605 if (this.reverting) { 13606 return false; 13607 } 13608 13609 if(this.options.disabled || this.options.type === "static") { 13610 return false; 13611 } 13612 13613 //We have to refresh the items data once first 13614 this._refreshItems(event); 13615 13616 //Find out if the clicked node (or one of its parents) is a actual item in this.items 13617 $(event.target).parents().each(function() { 13618 if($.data(this, that.widgetName + "-item") === that) { 13619 currentItem = $(this); 13620 return false; 13621 } 13622 }); 13623 if($.data(event.target, that.widgetName + "-item") === that) { 13624 currentItem = $(event.target); 13625 } 13626 13627 if(!currentItem) { 13628 return false; 13629 } 13630 if(this.options.handle && !overrideHandle) { 13631 $(this.options.handle, currentItem).find("*").addBack().each(function() { 13632 if(this === event.target) { 13633 validHandle = true; 13634 } 13635 }); 13636 if(!validHandle) { 13637 return false; 13638 } 13639 } 13640 13641 this.currentItem = currentItem; 13642 this._removeCurrentsFromItems(); 13643 return true; 13644 13645 }, 13646 13647 _mouseStart: function(event, overrideHandle, noActivation) { 13648 13649 var i, body, 13650 o = this.options; 13651 13652 this.currentContainer = this; 13653 13654 //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture 13655 this.refreshPositions(); 13656 13657 //Create and append the visible helper 13658 this.helper = this._createHelper(event); 13659 13660 //Cache the helper size 13661 this._cacheHelperProportions(); 13662 13663 /* 13664 * - Position generation - 13665 * This block generates everything position related - it's the core of draggables. 13666 */ 13667 13668 //Cache the margins of the original element 13669 this._cacheMargins(); 13670 13671 //Get the next scrolling parent 13672 this.scrollParent = this.helper.scrollParent(); 13673 13674 //The element's absolute position on the page minus margins 13675 this.offset = this.currentItem.offset(); 13676 this.offset = { 13677 top: this.offset.top - this.margins.top, 13678 left: this.offset.left - this.margins.left 13679 }; 13680 13681 $.extend(this.offset, { 13682 click: { //Where the click happened, relative to the element 13683 left: event.pageX - this.offset.left, 13684 top: event.pageY - this.offset.top 13685 }, 13686 parent: this._getParentOffset(), 13687 relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper 13688 }); 13689 13690 // Only after we got the offset, we can change the helper's position to absolute 13691 // TODO: Still need to figure out a way to make relative sorting possible 13692 this.helper.css("position", "absolute"); 13693 this.cssPosition = this.helper.css("position"); 13694 13695 //Generate the original position 13696 this.originalPosition = this._generatePosition(event); 13697 this.originalPageX = event.pageX; 13698 this.originalPageY = event.pageY; 13699 13700 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied 13701 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); 13702 13703 //Cache the former DOM position 13704 this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; 13705 13706 //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 13707 if(this.helper[0] !== this.currentItem[0]) { 13708 this.currentItem.hide(); 13709 } 13710 13711 //Create the placeholder 13712 this._createPlaceholder(); 13713 13714 //Set a containment if given in the options 13715 if(o.containment) { 13716 this._setContainment(); 13717 } 13718 13719 if( o.cursor && o.cursor !== "auto" ) { // cursor option 13720 body = this.document.find( "body" ); 13721 13722 // support: IE 13723 this.storedCursor = body.css( "cursor" ); 13724 body.css( "cursor", o.cursor ); 13725 13726 this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body ); 13727 } 13728 13729 if(o.opacity) { // opacity option 13730 if (this.helper.css("opacity")) { 13731 this._storedOpacity = this.helper.css("opacity"); 13732 } 13733 this.helper.css("opacity", o.opacity); 13734 } 13735 13736 if(o.zIndex) { // zIndex option 13737 if (this.helper.css("zIndex")) { 13738 this._storedZIndex = this.helper.css("zIndex"); 13739 } 13740 this.helper.css("zIndex", o.zIndex); 13741 } 13742 13743 //Prepare scrolling 13744 if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") { 13745 this.overflowOffset = this.scrollParent.offset(); 13746 } 13747 13748 //Call callbacks 13749 this._trigger("start", event, this._uiHash()); 13750 13751 //Recache the helper size 13752 if(!this._preserveHelperProportions) { 13753 this._cacheHelperProportions(); 13754 } 13755 13756 13757 //Post "activate" events to possible containers 13758 if( !noActivation ) { 13759 for ( i = this.containers.length - 1; i >= 0; i-- ) { 13760 this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) ); 13761 } 13762 } 13763 13764 //Prepare possible droppables 13765 if($.ui.ddmanager) { 13766 $.ui.ddmanager.current = this; 13767 } 13768 13769 if ($.ui.ddmanager && !o.dropBehaviour) { 13770 $.ui.ddmanager.prepareOffsets(this, event); 13771 } 13772 13773 this.dragging = true; 13774 13775 this.helper.addClass("ui-sortable-helper"); 13776 this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position 13777 return true; 13778 13779 }, 13780 13781 _mouseDrag: function(event) { 13782 var i, item, itemElement, intersection, 13783 o = this.options, 13784 scrolled = false; 13785 13786 //Compute the helpers position 13787 this.position = this._generatePosition(event); 13788 this.positionAbs = this._convertPositionTo("absolute"); 13789 13790 if (!this.lastPositionAbs) { 13791 this.lastPositionAbs = this.positionAbs; 13792 } 13793 13794 //Do scrolling 13795 if(this.options.scroll) { 13796 if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") { 13797 13798 if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) { 13799 this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; 13800 } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) { 13801 this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; 13802 } 13803 13804 if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) { 13805 this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; 13806 } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) { 13807 this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; 13808 } 13809 13810 } else { 13811 13812 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) { 13813 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); 13814 } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { 13815 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); 13816 } 13817 13818 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { 13819 scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); 13820 } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { 13821 scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); 13822 } 13823 13824 } 13825 13826 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { 13827 $.ui.ddmanager.prepareOffsets(this, event); 13828 } 13829 } 13830 13831 //Regenerate the absolute position used for position checks 13832 this.positionAbs = this._convertPositionTo("absolute"); 13833 13834 //Set the helper position 13835 if(!this.options.axis || this.options.axis !== "y") { 13836 this.helper[0].style.left = this.position.left+"px"; 13837 } 13838 if(!this.options.axis || this.options.axis !== "x") { 13839 this.helper[0].style.top = this.position.top+"px"; 13840 } 13841 13842 //Rearrange 13843 for (i = this.items.length - 1; i >= 0; i--) { 13844 13845 //Cache variables and intersection, continue if no intersection 13846 item = this.items[i]; 13847 itemElement = item.item[0]; 13848 intersection = this._intersectsWithPointer(item); 13849 if (!intersection) { 13850 continue; 13851 } 13852 13853 // Only put the placeholder inside the current Container, skip all 13854 // items from other containers. This works because when moving 13855 // an item from one container to another the 13856 // currentContainer is switched before the placeholder is moved. 13857 // 13858 // Without this, moving items in "sub-sortables" can cause 13859 // the placeholder to jitter between the outer and inner container. 13860 if (item.instance !== this.currentContainer) { 13861 continue; 13862 } 13863 13864 // cannot intersect with itself 13865 // no useless actions that have been done before 13866 // no action if the item moved is the parent of the item checked 13867 if (itemElement !== this.currentItem[0] && 13868 this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement && 13869 !$.contains(this.placeholder[0], itemElement) && 13870 (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true) 13871 ) { 13872 13873 this.direction = intersection === 1 ? "down" : "up"; 13874 13875 if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) { 13876 this._rearrange(event, item); 13877 } else { 13878 break; 13879 } 13880 13881 this._trigger("change", event, this._uiHash()); 13882 break; 13883 } 13884 } 13885 13886 //Post events to containers 13887 this._contactContainers(event); 13888 13889 //Interconnect with droppables 13890 if($.ui.ddmanager) { 13891 $.ui.ddmanager.drag(this, event); 13892 } 13893 13894 //Call callbacks 13895 this._trigger("sort", event, this._uiHash()); 13896 13897 this.lastPositionAbs = this.positionAbs; 13898 return false; 13899 13900 }, 13901 13902 _mouseStop: function(event, noPropagation) { 13903 13904 if(!event) { 13905 return; 13906 } 13907 13908 //If we are using droppables, inform the manager about the drop 13909 if ($.ui.ddmanager && !this.options.dropBehaviour) { 13910 $.ui.ddmanager.drop(this, event); 13911 } 13912 13913 if(this.options.revert) { 13914 var that = this, 13915 cur = this.placeholder.offset(), 13916 axis = this.options.axis, 13917 animation = {}; 13918 13919 if ( !axis || axis === "x" ) { 13920 animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft); 13921 } 13922 if ( !axis || axis === "y" ) { 13923 animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop); 13924 } 13925 this.reverting = true; 13926 $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() { 13927 that._clear(event); 13928 }); 13929 } else { 13930 this._clear(event, noPropagation); 13931 } 13932 13933 return false; 13934 13935 }, 13936 13937 cancel: function() { 13938 13939 if(this.dragging) { 13940 13941 this._mouseUp({ target: null }); 13942 13943 if(this.options.helper === "original") { 13944 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); 13945 } else { 13946 this.currentItem.show(); 13947 } 13948 13949 //Post deactivating events to containers 13950 for (var i = this.containers.length - 1; i >= 0; i--){ 13951 this.containers[i]._trigger("deactivate", null, this._uiHash(this)); 13952 if(this.containers[i].containerCache.over) { 13953 this.containers[i]._trigger("out", null, this._uiHash(this)); 13954 this.containers[i].containerCache.over = 0; 13955 } 13956 } 13957 13958 } 13959 13960 if (this.placeholder) { 13961 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! 13962 if(this.placeholder[0].parentNode) { 13963 this.placeholder[0].parentNode.removeChild(this.placeholder[0]); 13964 } 13965 if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) { 13966 this.helper.remove(); 13967 } 13968 13969 $.extend(this, { 13970 helper: null, 13971 dragging: false, 13972 reverting: false, 13973 _noFinalSort: null 13974 }); 13975 13976 if(this.domPosition.prev) { 13977 $(this.domPosition.prev).after(this.currentItem); 13978 } else { 13979 $(this.domPosition.parent).prepend(this.currentItem); 13980 } 13981 } 13982 13983 return this; 13984 13985 }, 13986 13987 serialize: function(o) { 13988 13989 var items = this._getItemsAsjQuery(o && o.connected), 13990 str = []; 13991 o = o || {}; 13992 13993 $(items).each(function() { 13994 var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/)); 13995 if (res) { 13996 str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2])); 13997 } 13998 }); 13999 14000 if(!str.length && o.key) { 14001 str.push(o.key + "="); 14002 } 14003 14004 return str.join("&"); 14005 14006 }, 14007 14008 toArray: function(o) { 14009 14010 var items = this._getItemsAsjQuery(o && o.connected), 14011 ret = []; 14012 14013 o = o || {}; 14014 14015 items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); }); 14016 return ret; 14017 14018 }, 14019 14020 /* Be careful with the following core functions */ 14021 _intersectsWith: function(item) { 14022 14023 var x1 = this.positionAbs.left, 14024 x2 = x1 + this.helperProportions.width, 14025 y1 = this.positionAbs.top, 14026 y2 = y1 + this.helperProportions.height, 14027 l = item.left, 14028 r = l + item.width, 14029 t = item.top, 14030 b = t + item.height, 14031 dyClick = this.offset.click.top, 14032 dxClick = this.offset.click.left, 14033 isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ), 14034 isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ), 14035 isOverElement = isOverElementHeight && isOverElementWidth; 14036 14037 if ( this.options.tolerance === "pointer" || 14038 this.options.forcePointerForContainers || 14039 (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"]) 14040 ) { 14041 return isOverElement; 14042 } else { 14043 14044 return (l < x1 + (this.helperProportions.width / 2) && // Right Half 14045 x2 - (this.helperProportions.width / 2) < r && // Left Half 14046 t < y1 + (this.helperProportions.height / 2) && // Bottom Half 14047 y2 - (this.helperProportions.height / 2) < b ); // Top Half 14048 14049 } 14050 }, 14051 14052 _intersectsWithPointer: function(item) { 14053 14054 var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), 14055 isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), 14056 isOverElement = isOverElementHeight && isOverElementWidth, 14057 verticalDirection = this._getDragVerticalDirection(), 14058 horizontalDirection = this._getDragHorizontalDirection(); 14059 14060 if (!isOverElement) { 14061 return false; 14062 } 14063 14064 return this.floating ? 14065 ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 ) 14066 : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) ); 14067 14068 }, 14069 14070 _intersectsWithSides: function(item) { 14071 14072 var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), 14073 isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), 14074 verticalDirection = this._getDragVerticalDirection(), 14075 horizontalDirection = this._getDragHorizontalDirection(); 14076 14077 if (this.floating && horizontalDirection) { 14078 return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf)); 14079 } else { 14080 return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf)); 14081 } 14082 14083 }, 14084 14085 _getDragVerticalDirection: function() { 14086 var delta = this.positionAbs.top - this.lastPositionAbs.top; 14087 return delta !== 0 && (delta > 0 ? "down" : "up"); 14088 }, 14089 14090 _getDragHorizontalDirection: function() { 14091 var delta = this.positionAbs.left - this.lastPositionAbs.left; 14092 return delta !== 0 && (delta > 0 ? "right" : "left"); 14093 }, 14094 14095 refresh: function(event) { 14096 this._refreshItems(event); 14097 this._setHandleClassName(); 14098 this.refreshPositions(); 14099 return this; 14100 }, 14101 14102 _connectWith: function() { 14103 var options = this.options; 14104 return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith; 14105 }, 14106 14107 _getItemsAsjQuery: function(connected) { 14108 14109 var i, j, cur, inst, 14110 items = [], 14111 queries = [], 14112 connectWith = this._connectWith(); 14113 14114 if(connectWith && connected) { 14115 for (i = connectWith.length - 1; i >= 0; i--){ 14116 cur = $(connectWith[i]); 14117 for ( j = cur.length - 1; j >= 0; j--){ 14118 inst = $.data(cur[j], this.widgetFullName); 14119 if(inst && inst !== this && !inst.options.disabled) { 14120 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]); 14121 } 14122 } 14123 } 14124 } 14125 14126 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]); 14127 14128 function addItems() { 14129 items.push( this ); 14130 } 14131 for (i = queries.length - 1; i >= 0; i--){ 14132 queries[i][0].each( addItems ); 14133 } 14134 14135 return $(items); 14136 14137 }, 14138 14139 _removeCurrentsFromItems: function() { 14140 14141 var list = this.currentItem.find(":data(" + this.widgetName + "-item)"); 14142 14143 this.items = $.grep(this.items, function (item) { 14144 for (var j=0; j < list.length; j++) { 14145 if(list[j] === item.item[0]) { 14146 return false; 14147 } 14148 } 14149 return true; 14150 }); 14151 14152 }, 14153 14154 _refreshItems: function(event) { 14155 14156 this.items = []; 14157 this.containers = [this]; 14158 14159 var i, j, cur, inst, targetData, _queries, item, queriesLength, 14160 items = this.items, 14161 queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]], 14162 connectWith = this._connectWith(); 14163 14164 if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down 14165 for (i = connectWith.length - 1; i >= 0; i--){ 14166 cur = $(connectWith[i]); 14167 for (j = cur.length - 1; j >= 0; j--){ 14168 inst = $.data(cur[j], this.widgetFullName); 14169 if(inst && inst !== this && !inst.options.disabled) { 14170 queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); 14171 this.containers.push(inst); 14172 } 14173 } 14174 } 14175 } 14176 14177 for (i = queries.length - 1; i >= 0; i--) { 14178 targetData = queries[i][1]; 14179 _queries = queries[i][0]; 14180 14181 for (j=0, queriesLength = _queries.length; j < queriesLength; j++) { 14182 item = $(_queries[j]); 14183 14184 item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager) 14185 14186 items.push({ 14187 item: item, 14188 instance: targetData, 14189 width: 0, height: 0, 14190 left: 0, top: 0 14191 }); 14192 } 14193 } 14194 14195 }, 14196 14197 refreshPositions: function(fast) { 14198 14199 //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change 14200 if(this.offsetParent && this.helper) { 14201 this.offset.parent = this._getParentOffset(); 14202 } 14203 14204 var i, item, t, p; 14205 14206 for (i = this.items.length - 1; i >= 0; i--){ 14207 item = this.items[i]; 14208 14209 //We ignore calculating positions of all connected containers when we're not over them 14210 if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) { 14211 continue; 14212 } 14213 14214 t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; 14215 14216 if (!fast) { 14217 item.width = t.outerWidth(); 14218 item.height = t.outerHeight(); 14219 } 14220 14221 p = t.offset(); 14222 item.left = p.left; 14223 item.top = p.top; 14224 } 14225 14226 if(this.options.custom && this.options.custom.refreshContainers) { 14227 this.options.custom.refreshContainers.call(this); 14228 } else { 14229 for (i = this.containers.length - 1; i >= 0; i--){ 14230 p = this.containers[i].element.offset(); 14231 this.containers[i].containerCache.left = p.left; 14232 this.containers[i].containerCache.top = p.top; 14233 this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); 14234 this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); 14235 } 14236 } 14237 14238 return this; 14239 }, 14240 14241 _createPlaceholder: function(that) { 14242 that = that || this; 14243 var className, 14244 o = that.options; 14245 14246 if(!o.placeholder || o.placeholder.constructor === String) { 14247 className = o.placeholder; 14248 o.placeholder = { 14249 element: function() { 14250 14251 var nodeName = that.currentItem[0].nodeName.toLowerCase(), 14252 element = $( "<" + nodeName + ">", that.document[0] ) 14253 .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder") 14254 .removeClass("ui-sortable-helper"); 14255 14256 if ( nodeName === "tr" ) { 14257 that.currentItem.children().each(function() { 14258 $( "<td> </td>", that.document[0] ) 14259 .attr( "colspan", $( this ).attr( "colspan" ) || 1 ) 14260 .appendTo( element ); 14261 }); 14262 } else if ( nodeName === "img" ) { 14263 element.attr( "src", that.currentItem.attr( "src" ) ); 14264 } 14265 14266 if ( !className ) { 14267 element.css( "visibility", "hidden" ); 14268 } 14269 14270 return element; 14271 }, 14272 update: function(container, p) { 14273 14274 // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that 14275 // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified 14276 if(className && !o.forcePlaceholderSize) { 14277 return; 14278 } 14279 14280 //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 14281 if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); } 14282 if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); } 14283 } 14284 }; 14285 } 14286 14287 //Create the placeholder 14288 that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem)); 14289 14290 //Append it after the actual current item 14291 that.currentItem.after(that.placeholder); 14292 14293 //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) 14294 o.placeholder.update(that, that.placeholder); 14295 14296 }, 14297 14298 _contactContainers: function(event) { 14299 var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis, 14300 innermostContainer = null, 14301 innermostIndex = null; 14302 14303 // get innermost container that intersects with item 14304 for (i = this.containers.length - 1; i >= 0; i--) { 14305 14306 // never consider a container that's located within the item itself 14307 if($.contains(this.currentItem[0], this.containers[i].element[0])) { 14308 continue; 14309 } 14310 14311 if(this._intersectsWith(this.containers[i].containerCache)) { 14312 14313 // if we've already found a container and it's more "inner" than this, then continue 14314 if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) { 14315 continue; 14316 } 14317 14318 innermostContainer = this.containers[i]; 14319 innermostIndex = i; 14320 14321 } else { 14322 // container doesn't intersect. trigger "out" event if necessary 14323 if(this.containers[i].containerCache.over) { 14324 this.containers[i]._trigger("out", event, this._uiHash(this)); 14325 this.containers[i].containerCache.over = 0; 14326 } 14327 } 14328 14329 } 14330 14331 // if no intersecting containers found, return 14332 if(!innermostContainer) { 14333 return; 14334 } 14335 14336 // move the item into the container if it's not there already 14337 if(this.containers.length === 1) { 14338 if (!this.containers[innermostIndex].containerCache.over) { 14339 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 14340 this.containers[innermostIndex].containerCache.over = 1; 14341 } 14342 } else { 14343 14344 //When entering a new container, we will find the item with the least distance and append our item near it 14345 dist = 10000; 14346 itemWithLeastDistance = null; 14347 floating = innermostContainer.floating || this._isFloating(this.currentItem); 14348 posProperty = floating ? "left" : "top"; 14349 sizeProperty = floating ? "width" : "height"; 14350 axis = floating ? "clientX" : "clientY"; 14351 14352 for (j = this.items.length - 1; j >= 0; j--) { 14353 if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) { 14354 continue; 14355 } 14356 if(this.items[j].item[0] === this.currentItem[0]) { 14357 continue; 14358 } 14359 14360 cur = this.items[j].item.offset()[posProperty]; 14361 nearBottom = false; 14362 if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) { 14363 nearBottom = true; 14364 } 14365 14366 if ( Math.abs( event[ axis ] - cur ) < dist ) { 14367 dist = Math.abs( event[ axis ] - cur ); 14368 itemWithLeastDistance = this.items[ j ]; 14369 this.direction = nearBottom ? "up": "down"; 14370 } 14371 } 14372 14373 //Check if dropOnEmpty is enabled 14374 if(!itemWithLeastDistance && !this.options.dropOnEmpty) { 14375 return; 14376 } 14377 14378 if(this.currentContainer === this.containers[innermostIndex]) { 14379
14379if ( !this.currentContainer.containerCache.over ) { 14380 this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() ); 14381 this.currentContainer.containerCache.over = 1; 14382 }
vendor: 11,188 bytes, lines 14382-14641
14382 14383 return; 14384 } 14385 14386 itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 14387 this._trigger("change", event, this._uiHash()); 14388 this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 14389 this.currentContainer = this.containers[innermostIndex]; 14390 14391 //Update the placeholder 14392 this.options.placeholder.update(this.currentContainer, this.placeholder); 14393 14394 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 14395 this.containers[innermostIndex].containerCache.over = 1; 14396 } 14397 14398 14399 }, 14400 14401 _createHelper: function(event) { 14402 14403 var o = this.options, 14404 helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem); 14405 14406 //Add the helper to the DOM if that didn't happen already 14407 if(!helper.parents("body").length) { 14408 $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); 14409 } 14410 14411 if(helper[0] === this.currentItem[0]) { 14412 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") }; 14413 } 14414 14415 if(!helper[0].style.width || o.forceHelperSize) { 14416 helper.width(this.currentItem.width()); 14417 } 14418 if(!helper[0].style.height || o.forceHelperSize) { 14419 helper.height(this.currentItem.height()); 14420 } 14421 14422 return helper; 14423 14424 }, 14425 14426 _adjustOffsetFromHelper: function(obj) { 14427 if (typeof obj === "string") { 14428 obj = obj.split(" "); 14429 } 14430 if ($.isArray(obj)) { 14431 obj = {left: +obj[0], top: +obj[1] || 0}; 14432 } 14433 if ("left" in obj) { 14434 this.offset.click.left = obj.left + this.margins.left; 14435 } 14436 if ("right" in obj) { 14437 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; 14438 } 14439 if ("top" in obj) { 14440 this.offset.click.top = obj.top + this.margins.top; 14441 } 14442 if ("bottom" in obj) { 14443 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; 14444 } 14445 }, 14446 14447 _getParentOffset: function() { 14448 14449 14450 //Get the offsetParent and cache its position 14451 this.offsetParent = this.helper.offsetParent(); 14452 var po = this.offsetParent.offset(); 14453 14454 // This is a special case where we need to modify a offset calculated on start, since the following happened: 14455 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent 14456 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that 14457 // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag 14458 if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { 14459 po.left += this.scrollParent.scrollLeft(); 14460 po.top += this.scrollParent.scrollTop(); 14461 } 14462 14463 // This needs to be actually done for all browsers, since pageX/pageY includes this information 14464 // with an ugly IE fix 14465 if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { 14466 po = { top: 0, left: 0 }; 14467 } 14468 14469 return { 14470 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), 14471 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) 14472 }; 14473 14474 }, 14475 14476 _getRelativeOffset: function() { 14477 14478 if(this.cssPosition === "relative") { 14479 var p = this.currentItem.position(); 14480 return { 14481 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), 14482 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() 14483 }; 14484 } else { 14485 return { top: 0, left: 0 }; 14486 } 14487 14488 }, 14489 14490 _cacheMargins: function() { 14491 this.margins = { 14492 left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), 14493 top: (parseInt(this.currentItem.css("marginTop"),10) || 0) 14494 }; 14495 }, 14496 14497 _cacheHelperProportions: function() { 14498 this.helperProportions = { 14499 width: this.helper.outerWidth(), 14500 height: this.helper.outerHeight() 14501 }; 14502 }, 14503 14504 _setContainment: function() { 14505 14506 var ce, co, over, 14507 o = this.options; 14508 if(o.containment === "parent") { 14509 o.containment = this.helper[0].parentNode; 14510 } 14511 if(o.containment === "document" || o.containment === "window") { 14512 this.containment = [ 14513 0 - this.offset.relative.left - this.offset.parent.left, 14514 0 - this.offset.relative.top - this.offset.parent.top, 14515 $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left, 14516 ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top 14517 ]; 14518 } 14519 14520 if(!(/^(document|window|parent)$/).test(o.containment)) { 14521 ce = $(o.containment)[0]; 14522 co = $(o.containment).offset(); 14523 over = ($(ce).css("overflow") !== "hidden"); 14524 14525 this.containment = [ 14526 co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, 14527 co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, 14528 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, 14529 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 14530 ]; 14531 } 14532 14533 }, 14534 14535 _convertPositionTo: function(d, pos) { 14536 14537 if(!pos) { 14538 pos = this.position; 14539 } 14540 var mod = d === "absolute" ? 1 : -1, 14541 scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, 14542 scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); 14543 14544 return { 14545 top: ( 14546 pos.top + // The absolute mouse position 14547 this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent 14548 this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) 14549 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) 14550 ), 14551 left: ( 14552 pos.left + // The absolute mouse position 14553 this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent 14554 this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) 14555 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) 14556 ) 14557 }; 14558 14559 }, 14560 14561 _generatePosition: function(event) { 14562 14563 var top, left, 14564 o = this.options, 14565 pageX = event.pageX, 14566 pageY = event.pageY, 14567 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); 14568 14569 // This is another very weird special case that only happens for relative elements: 14570 // 1. If the css position is relative 14571 // 2. and the scroll parent is the document or similar to the offset parent 14572 // we have to refresh the relative offset during the scroll so there are no jumps 14573 if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) { 14574 this.offset.relative = this._getRelativeOffset(); 14575 } 14576 14577 /* 14578 * - Position constraining - 14579 * Constrain the position to a mix of grid, containment. 14580 */ 14581 14582 if(this.originalPosition) { //If we are not dragging yet, we won't check for options 14583 14584 if(this.containment) { 14585 if(event.pageX - this.offset.click.left < this.containment[0]) { 14586 pageX = this.containment[0] + this.offset.click.left; 14587 } 14588 if(event.pageY - this.offset.click.top < this.containment[1]) { 14589 pageY = this.containment[1] + this.offset.click.top; 14590 } 14591 if(event.pageX - this.offset.click.left > this.containment[2]) { 14592 pageX = this.containment[2] + this.offset.click.left; 14593 } 14594 if(event.pageY - this.offset.click.top > this.containment[3]) { 14595 pageY = this.containment[3] + this.offset.click.top; 14596 } 14597 } 14598 14599 if(o.grid) { 14600 top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; 14601 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; 14602 14603 left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; 14604 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; 14605 } 14606 14607 } 14608 14609 return { 14610 top: ( 14611 pageY - // The absolute mouse position 14612 this.offset.click.top - // Click offset (relative to the element) 14613 this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent 14614 this.offset.parent.top + // The offsetParent's offset without borders (offset + border) 14615 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) 14616 ), 14617 left: ( 14618 pageX - // The absolute mouse position 14619 this.offset.click.left - // Click offset (relative to the element) 14620 this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent 14621 this.offset.parent.left + // The offsetParent's offset without borders (offset + border) 14622 ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) 14623 ) 14624 }; 14625 14626 }, 14627 14628 _rearrange: function(event, i, a, hardRefresh) { 14629 14630 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)); 14631 14632 //Various things done here to improve the performance: 14633 // 1. we create a setTimeout, that calls refreshPositions 14634 // 2. on the instance, we have a counter variable, that get's higher after every append 14635 // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same 14636 // 4. this lets only the last addition to the timeout stack through 14637 this.counter = this.counter ? ++this.counter : 1; 14638 var counter = this.counter; 14639 14640 this._delay(function() { 14641 if(counter === this.counter) {
vendor: 4,194 bytes, lines 14642-14771
14642 this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove 14643 } 14644 }); 14645 14646 }, 14647 14648 _clear: function(event, noPropagation) { 14649 14650 this.reverting = false; 14651 // We delay all events that have to be triggered to after the point where the placeholder has been removed and 14652 // everything else normalized again 14653 var i, 14654 delayedTriggers = []; 14655 14656 // We first have to update the dom position of the actual currentItem 14657 // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) 14658 if(!this._noFinalSort && this.currentItem.parent().length) { 14659 this.placeholder.before(this.currentItem); 14660 } 14661 this._noFinalSort = null; 14662 14663 if(this.helper[0] === this.currentItem[0]) { 14664 for(i in this._storedCSS) { 14665 if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") { 14666 this._storedCSS[i] = ""; 14667 } 14668 } 14669 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); 14670 } else { 14671 this.currentItem.show(); 14672 } 14673 14674 if(this.fromOutside && !noPropagation) { 14675 delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); }); 14676 } 14677 if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) { 14678 delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed 14679 } 14680 14681 // Check if the items Container has Changed and trigger appropriate 14682 // events. 14683 if (this !== this.currentContainer) { 14684 if(!noPropagation) { 14685 delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); }); 14686 delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer)); 14687 delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer)); 14688 } 14689 } 14690 14691 14692 //Post events to containers 14693 function delayEvent( type, instance, container ) { 14694 return function( event ) { 14695 container._trigger( type, event, instance._uiHash( instance ) ); 14696 }; 14697 } 14698 for (i = this.containers.length - 1; i >= 0; i--){ 14699 if (!noPropagation) { 14700 delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); 14701 } 14702 if(this.containers[i].containerCache.over) { 14703 delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); 14704 this.containers[i].containerCache.over = 0; 14705 } 14706 } 14707 14708 //Do what was originally in plugins 14709 if ( this.storedCursor ) { 14710 this.document.find( "body" ).css( "cursor", this.storedCursor ); 14711 this.storedStylesheet.remove(); 14712 } 14713 if(this._storedOpacity) { 14714 this.helper.css("opacity", this._storedOpacity); 14715 } 14716 if(this._storedZIndex) { 14717 this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex); 14718 } 14719 14720 this.dragging = false; 14721 14722 if(!noPropagation) { 14723 this._trigger("beforeStop", event, this._uiHash()); 14724 } 14725 14726 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! 14727 this.placeholder[0].parentNode.removeChild(this.placeholder[0]); 14728 14729 if ( !this.cancelHelperRemoval ) { 14730 if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { 14731 this.helper.remove(); 14732 } 14733 this.helper = null; 14734 } 14735 14736 if(!noPropagation) { 14737 for (i=0; i < delayedTriggers.length; i++) { 14738 delayedTriggers[i].call(this, event); 14739 } //Trigger all delayed events 14740 this._trigger("stop", event, this._uiHash()); 14741 } 14742 14743 this.fromOutside = false; 14744 return !this.cancelHelperRemoval; 14745 14746 }, 14747 14748 _trigger: function() { 14749 if ($.Widget.prototype._trigger.apply(this, arguments) === false) { 14750 this.cancel(); 14751 } 14752 }, 14753 14754 _uiHash: function(_inst) { 14755 var inst = _inst || this; 14756 return { 14757 helper: inst.helper, 14758 placeholder: inst.placeholder || $([]), 14759 position: inst.position, 14760 originalPosition: inst.originalPosition, 14761 offset: inst.positionAbs, 14762 item: inst.currentItem, 14763 sender: _inst ? _inst.element : null 14764 }; 14765 } 14766 14767}); 14768 14769 14770/*! 14771 * jQuery UI Spinner 1.11.
147712 14772 * http://jqueryui.com 14773 * 14774 * Copyright 2014 jQuery Foundation and other contributors 14775 * Released under the MIT license. 14776 * http://jquery.org/license 14777 * 14778 * http://api.jqueryui.com/spinner/ 14779 */ 14780 14781 14782function spinner_modifier( fn ) { 14783 return function() { 14784 var previous = this.element.val(); 14785 fn.apply( this, arguments ); 14786 this._refresh(); 14787 if ( previous !== this.element.val() ) { 14788 this._trigger( "change" ); 14789 } 14790 }; 14791} 14792 14793var spinner = $.widget( "ui.spinner", { 14794 version: "1.11.2
vendor: 12,160 bytes, lines 14794-15270
14794", 14795 defaultElement: "<input>", 14796 widgetEventPrefix: "spin", 14797 options: { 14798 culture: null, 14799 icons: { 14800 down: "ui-icon-triangle-1-s", 14801 up: "ui-icon-triangle-1-n" 14802 }, 14803 incremental: true, 14804 max: null, 14805 min: null, 14806 numberFormat: null, 14807 page: 10, 14808 step: 1, 14809 14810 change: null, 14811 spin: null, 14812 start: null, 14813 stop: null 14814 }, 14815 14816 _create: function() { 14817 // handle string values that need to be parsed 14818 this._setOption( "max", this.options.max ); 14819 this._setOption( "min", this.options.min ); 14820 this._setOption( "step", this.options.step ); 14821 14822 // Only format if there is a value, prevents the field from being marked 14823 // as invalid in Firefox, see #9573. 14824 if ( this.value() !== "" ) { 14825 // Format the value, but don't constrain. 14826 this._value( this.element.val(), true ); 14827 } 14828 14829 this._draw(); 14830 this._on( this._events ); 14831 this._refresh(); 14832 14833 // turning off autocomplete prevents the browser from remembering the 14834 // value when navigating through history, so we re-enable autocomplete 14835 // if the page is unloaded before the widget is destroyed. #7790 14836 this._on( this.window, { 14837 beforeunload: function() { 14838 this.element.removeAttr( "autocomplete" ); 14839 } 14840 }); 14841 }, 14842 14843 _getCreateOptions: function() { 14844 var options = {}, 14845 element = this.element; 14846 14847 $.each( [ "min", "max", "step" ], function( i, option ) { 14848 var value = element.attr( option ); 14849 if ( value !== undefined && value.length ) { 14850 options[ option ] = value; 14851 } 14852 }); 14853 14854 return options; 14855 }, 14856 14857 _events: { 14858 keydown: function( event ) { 14859 if ( this._start( event ) && this._keydown( event ) ) { 14860 event.preventDefault(); 14861 } 14862 }, 14863 keyup: "_stop", 14864 focus: function() { 14865 this.previous = this.element.val(); 14866 }, 14867 blur: function( event ) { 14868 if ( this.cancelBlur ) { 14869 delete this.cancelBlur; 14870 return; 14871 } 14872 14873 this._stop(); 14874 this._refresh(); 14875 if ( this.previous !== this.element.val() ) { 14876 this._trigger( "change", event ); 14877 } 14878 }, 14879 mousewheel: function( event, delta ) { 14880 if ( !delta ) { 14881 return; 14882 } 14883 if ( !this.spinning && !this._start( event ) ) { 14884 return false; 14885 } 14886 14887 this._spin( (delta > 0 ? 1 : -1) * this.options.step, event ); 14888 clearTimeout( this.mousewheelTimer ); 14889 this.mousewheelTimer = this._delay(function() { 14890 if ( this.spinning ) { 14891 this._stop( event ); 14892 } 14893 }, 100 ); 14894 event.preventDefault(); 14895 }, 14896 "mousedown .ui-spinner-button": function( event ) { 14897 var previous; 14898 14899 // We never want the buttons to have focus; whenever the user is 14900 // interacting with the spinner, the focus should be on the input. 14901 // If the input is focused then this.previous is properly set from 14902 // when the input first received focus. If the input is not focused 14903 // then we need to set this.previous based on the value before spinning. 14904 previous = this.element[0] === this.document[0].activeElement ? 14905 this.previous : this.element.val(); 14906 function checkFocus() { 14907 var isActive = this.element[0] === this.document[0].activeElement; 14908 if ( !isActive ) { 14909 this.element.focus(); 14910 this.previous = previous; 14911 // support: IE 14912 // IE sets focus asynchronously, so we need to check if focus 14913 // moved off of the input because the user clicked on the button. 14914 this._delay(function() { 14915 this.previous = previous; 14916 }); 14917 } 14918 } 14919 14920 // ensure focus is on (or stays on) the text field 14921 event.preventDefault(); 14922 checkFocus.call( this ); 14923 14924 // support: IE 14925 // IE doesn't prevent moving focus even with event.preventDefault() 14926 // so we set a flag to know when we should ignore the blur event 14927 // and check (again) if focus moved off of the input. 14928 this.cancelBlur = true; 14929 this._delay(function() { 14930 delete this.cancelBlur; 14931 checkFocus.call( this ); 14932 }); 14933 14934 if ( this._start( event ) === false ) { 14935 return; 14936 } 14937 14938 this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event ); 14939 }, 14940 "mouseup .ui-spinner-button": "_stop", 14941 "mouseenter .ui-spinner-button": function( event ) { 14942 // button will add ui-state-active if mouse was down while mouseleave and kept down 14943 if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) { 14944 return; 14945 } 14946 14947 if ( this._start( event ) === false ) { 14948 return false; 14949 } 14950 this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event ); 14951 }, 14952 // TODO: do we really want to consider this a stop? 14953 // shouldn't we just stop the repeater and wait until mouseup before 14954 // we trigger the stop event? 14955 "mouseleave .ui-spinner-button": "_stop" 14956 }, 14957 14958 _draw: function() { 14959 var uiSpinner = this.uiSpinner = this.element 14960 .addClass( "ui-spinner-input" ) 14961 .attr( "autocomplete", "off" ) 14962 .wrap( this._uiSpinnerHtml() ) 14963 .parent() 14964 // add buttons 14965 .append( this._buttonHtml() ); 14966 14967 this.element.attr( "role", "spinbutton" ); 14968 14969 // button bindings 14970 this.buttons = uiSpinner.find( ".ui-spinner-button" ) 14971 .attr( "tabIndex", -1 ) 14972 .button() 14973 .removeClass( "ui-corner-all" ); 14974 14975 // IE 6 doesn't understand height: 50% for the buttons 14976 // unless the wrapper has an explicit height 14977 if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) && 14978 uiSpinner.height() > 0 ) { 14979 uiSpinner.height( uiSpinner.height() ); 14980 } 14981 14982 // disable spinner if element was already disabled 14983 if ( this.options.disabled ) { 14984 this.disable(); 14985 } 14986 }, 14987 14988 _keydown: function( event ) { 14989 var options = this.options, 14990 keyCode = $.ui.keyCode; 14991 14992 switch ( event.keyCode ) { 14993 case keyCode.UP: 14994 this._repeat( null, 1, event ); 14995 return true; 14996 case keyCode.DOWN: 14997 this._repeat( null, -1, event ); 14998 return true; 14999 case keyCode.PAGE_UP: 15000 this._repeat( null, options.page, event ); 15001 return true; 15002 case keyCode.PAGE_DOWN: 15003 this._repeat( null, -options.page, event ); 15004 return true; 15005 } 15006 15007 return false; 15008 }, 15009 15010 _uiSpinnerHtml: function() { 15011 return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"; 15012 }, 15013 15014 _buttonHtml: function() { 15015 return "" + 15016 "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" + 15017 "<span class='ui-icon " + this.options.icons.up + "'>▲</span>" + 15018 "</a>" + 15019 "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" + 15020 "<span class='ui-icon " + this.options.icons.down + "'>▼</span>" + 15021 "</a>"; 15022 }, 15023 15024 _start: function( event ) { 15025 if ( !this.spinning && this._trigger( "start", event ) === false ) { 15026 return false; 15027 } 15028 15029 if ( !this.counter ) { 15030 this.counter = 1; 15031 } 15032 this.spinning = true; 15033 return true; 15034 }, 15035 15036 _repeat: function( i, steps, event ) { 15037 i = i || 500; 15038 15039 clearTimeout( this.timer ); 15040 this.timer = this._delay(function() { 15041 this._repeat( 40, steps, event ); 15042 }, i ); 15043 15044 this._spin( steps * this.options.step, event ); 15045 }, 15046 15047 _spin: function( step, event ) { 15048 var value = this.value() || 0; 15049 15050 if ( !this.counter ) { 15051 this.counter = 1; 15052 } 15053 15054 value = this._adjustValue( value + step * this._increment( this.counter ) ); 15055 15056 if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) { 15057 this._value( value ); 15058 this.counter++; 15059 } 15060 }, 15061 15062 _increment: function( i ) { 15063 var incremental = this.options.incremental; 15064 15065 if ( incremental ) { 15066 return $.isFunction( incremental ) ? 15067 incremental( i ) : 15068 Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 ); 15069 } 15070 15071 return 1; 15072 }, 15073 15074 _precision: function() { 15075 var precision = this._precisionOf( this.options.step ); 15076 if ( this.options.min !== null ) { 15077 precision = Math.max( precision, this._precisionOf( this.options.min ) ); 15078 } 15079 return precision; 15080 }, 15081 15082 _precisionOf: function( num ) { 15083 var str = num.toString(), 15084 decimal = str.indexOf( "." ); 15085 return decimal === -1 ? 0 : str.length - decimal - 1; 15086 }, 15087 15088 _adjustValue: function( value ) { 15089 var base, aboveMin, 15090 options = this.options; 15091 15092 // make sure we're at a valid step 15093 // - find out where we are relative to the base (min or 0) 15094 base = options.min !== null ? options.min : 0; 15095 aboveMin = value - base; 15096 // - round to the nearest step 15097 aboveMin = Math.round(aboveMin / options.step) * options.step; 15098 // - rounding is based on 0, so adjust back to our base 15099 value = base + aboveMin; 15100 15101 // fix precision from bad JS floating point math 15102 value = parseFloat( value.toFixed( this._precision() ) ); 15103 15104 // clamp the value 15105 if ( options.max !== null && value > options.max) { 15106 return options.max; 15107 } 15108 if ( options.min !== null && value < options.min ) { 15109 return options.min; 15110 } 15111 15112 return value; 15113 }, 15114 15115 _stop: function( event ) { 15116 if ( !this.spinning ) { 15117 return; 15118 } 15119 15120 clearTimeout( this.timer ); 15121 clearTimeout( this.mousewheelTimer ); 15122 this.counter = 0; 15123 this.spinning = false; 15124 this._trigger( "stop", event ); 15125 }, 15126 15127 _setOption: function( key, value ) { 15128 if ( key === "culture" || key === "numberFormat" ) { 15129 var prevValue = this._parse( this.element.val() ); 15130 this.options[ key ] = value; 15131 this.element.val( this._format( prevValue ) ); 15132 return; 15133 } 15134 15135 if ( key === "max" || key === "min" || key === "step" ) { 15136 if ( typeof value === "string" ) { 15137 value = this._parse( value ); 15138 } 15139 } 15140 if ( key === "icons" ) { 15141 this.buttons.first().find( ".ui-icon" ) 15142 .removeClass( this.options.icons.up ) 15143 .addClass( value.up ); 15144 this.buttons.last().find( ".ui-icon" ) 15145 .removeClass( this.options.icons.down ) 15146 .addClass( value.down ); 15147 } 15148 15149 this._super( key, value ); 15150 15151 if ( key === "disabled" ) { 15152 this.widget().toggleClass( "ui-state-disabled", !!value ); 15153 this.element.prop( "disabled", !!value ); 15154 this.buttons.button( value ? "disable" : "enable" ); 15155 } 15156 }, 15157 15158 _setOptions: spinner_modifier(function( options ) { 15159 this._super( options ); 15160 }), 15161 15162 _parse: function( val ) { 15163 if ( typeof val === "string" && val !== "" ) { 15164 val = window.Globalize && this.options.numberFormat ? 15165 Globalize.parseFloat( val, 10, this.options.culture ) : +val; 15166 } 15167 return val === "" || isNaN( val ) ? null : val; 15168 }, 15169 15170 _format: function( value ) { 15171 if ( value === "" ) { 15172 return ""; 15173 } 15174 return window.Globalize && this.options.numberFormat ? 15175 Globalize.format( value, this.options.numberFormat, this.options.culture ) : 15176 value; 15177 }, 15178 15179 _refresh: function() { 15180 this.element.attr({ 15181 "aria-valuemin": this.options.min, 15182 "aria-valuemax": this.options.max, 15183 // TODO: what should we do with values that can't be parsed? 15184 "aria-valuenow": this._parse( this.element.val() ) 15185 }); 15186 }, 15187 15188 isValid: function() { 15189 var value = this.value(); 15190 15191 // null is invalid 15192 if ( value === null ) { 15193 return false; 15194 } 15195 15196 // if value gets adjusted, it's invalid 15197 return value === this._adjustValue( value ); 15198 }, 15199 15200 // update the value without triggering change 15201 _value: function( value, allowAny ) { 15202 var parsed; 15203 if ( value !== "" ) { 15204 parsed = this._parse( value ); 15205 if ( parsed !== null ) { 15206 if ( !allowAny ) { 15207 parsed = this._adjustValue( parsed ); 15208 } 15209 value = this._format( parsed ); 15210 } 15211 } 15212 this.element.val( value ); 15213 this._refresh(); 15214 }, 15215 15216 _destroy: function() { 15217 this.element 15218 .removeClass( "ui-spinner-input" ) 15219 .prop( "disabled", false ) 15220 .removeAttr( "autocomplete" ) 15221 .removeAttr( "role" ) 15222 .removeAttr( "aria-valuemin" ) 15223 .removeAttr( "aria-valuemax" ) 15224 .removeAttr( "aria-valuenow" ); 15225 this.uiSpinner.replaceWith( this.element ); 15226 }, 15227 15228 stepUp: spinner_modifier(function( steps ) { 15229 this._stepUp( steps ); 15230 }), 15231 _stepUp: function( steps ) { 15232 if ( this._start() ) { 15233 this._spin( (steps || 1) * this.options.step ); 15234 this._stop(); 15235 } 15236 }, 15237 15238 stepDown: spinner_modifier(function( steps ) { 15239 this._stepDown( steps ); 15240 }), 15241 _stepDown: function( steps ) { 15242 if ( this._start() ) { 15243 this._spin( (steps || 1) * -this.options.step ); 15244 this._stop(); 15245 } 15246 }, 15247 15248 pageUp: spinner_modifier(function( pages ) { 15249 this._stepUp( (pages || 1) * this.options.page ); 15250 }), 15251 15252 pageDown: spinner_modifier(function( pages ) { 15253 this._stepDown( (pages || 1) * this.options.page ); 15254 }), 15255 15256 value: function( newVal ) { 15257 if ( !arguments.length ) { 15258 return this._parse( this.element.val() ); 15259 } 15260 spinner_modifier( this._value ).call( this, newVal ); 15261 }, 15262 15263 widget: function() { 15264 return this.uiSpinner; 15265 } 15266}); 15267 15268 15269/*! 15270 * jQuery UI Tabs 1.11.
152702 15271 * http://jqueryui.com 15272 * 15273 * Copyright 2014 jQuery Foundation and other contributors 15274 * Released under the MIT license. 15275 * http://jquery.org/license 15276 * 15277 * http://api.jqueryui.com/tabs/ 15278 */ 15279 15280 15281var tabs = $.widget( "ui.tabs", { 15282 version: "1.11.2
vendor: 7,417 bytes, lines 15282-15569
15282", 15283 delay: 300, 15284 options: { 15285 active: null, 15286 collapsible: false, 15287 event: "click", 15288 heightStyle: "content", 15289 hide: null, 15290 show: null, 15291 15292 // callbacks 15293 activate: null, 15294 beforeActivate: null, 15295 beforeLoad: null, 15296 load: null 15297 }, 15298 15299 _isLocal: (function() { 15300 var rhash = /#.*$/; 15301 15302 return function( anchor ) { 15303 var anchorUrl, locationUrl; 15304 15305 // support: IE7 15306 // IE7 doesn't normalize the href property when set via script (#9317) 15307 anchor = anchor.cloneNode( false ); 15308 15309 anchorUrl = anchor.href.replace( rhash, "" ); 15310 locationUrl = location.href.replace( rhash, "" ); 15311 15312 // decoding may throw an error if the URL isn't UTF-8 (#9518) 15313 try { 15314 anchorUrl = decodeURIComponent( anchorUrl ); 15315 } catch ( error ) {} 15316 try { 15317 locationUrl = decodeURIComponent( locationUrl ); 15318 } catch ( error ) {} 15319 15320 return anchor.hash.length > 1 && anchorUrl === locationUrl; 15321 }; 15322 })(), 15323 15324 _create: function() { 15325 var that = this, 15326 options = this.options; 15327 15328 this.running = false; 15329 15330 this.element 15331 .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" ) 15332 .toggleClass( "ui-tabs-collapsible", options.collapsible ); 15333 15334 this._processTabs(); 15335 options.active = this._initialActive(); 15336 15337 // Take disabling tabs via class attribute from HTML 15338 // into account and update option properly. 15339 if ( $.isArray( options.disabled ) ) { 15340 options.disabled = $.unique( options.disabled.concat( 15341 $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) { 15342 return that.tabs.index( li ); 15343 }) 15344 ) ).sort(); 15345 } 15346 15347 // check for length avoids error when initializing empty list 15348 if ( this.options.active !== false && this.anchors.length ) { 15349 this.active = this._findActive( options.active ); 15350 } else { 15351 this.active = $(); 15352 } 15353 15354 this._refresh(); 15355 15356 if ( this.active.length ) { 15357 this.load( options.active ); 15358 } 15359 }, 15360 15361 _initialActive: function() { 15362 var active = this.options.active, 15363 collapsible = this.options.collapsible, 15364 locationHash = location.hash.substring( 1 ); 15365 15366 if ( active === null ) { 15367 // check the fragment identifier in the URL 15368 if ( locationHash ) { 15369 this.tabs.each(function( i, tab ) { 15370 if ( $( tab ).attr( "aria-controls" ) === locationHash ) { 15371 active = i; 15372 return false; 15373 } 15374 }); 15375 } 15376 15377 // check for a tab marked active via a class 15378 if ( active === null ) { 15379 active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) ); 15380 } 15381 15382 // no active tab, set to false 15383 if ( active === null || active === -1 ) { 15384 active = this.tabs.length ? 0 : false; 15385 } 15386 } 15387 15388 // handle numbers: negative, out of range 15389 if ( active !== false ) { 15390 active = this.tabs.index( this.tabs.eq( active ) ); 15391 if ( active === -1 ) { 15392 active = collapsible ? false : 0; 15393 } 15394 } 15395 15396 // don't allow collapsible: false and active: false 15397 if ( !collapsible && active === false && this.anchors.length ) { 15398 active = 0; 15399 } 15400 15401 return active; 15402 }, 15403 15404 _getCreateEventData: function() { 15405 return { 15406 tab: this.active, 15407 panel: !this.active.length ? $() : this._getPanelForTab( this.active ) 15408 }; 15409 }, 15410 15411 _tabKeydown: function( event ) { 15412 var focusedTab = $( this.document[0].activeElement ).closest( "li" ), 15413 selectedIndex = this.tabs.index( focusedTab ), 15414 goingForward = true; 15415 15416 if ( this._handlePageNav( event ) ) { 15417 return; 15418 } 15419 15420 switch ( event.keyCode ) { 15421 case $.ui.keyCode.RIGHT: 15422 case $.ui.keyCode.DOWN: 15423 selectedIndex++; 15424 break; 15425 case $.ui.keyCode.UP: 15426 case $.ui.keyCode.LEFT: 15427 goingForward = false; 15428 selectedIndex--; 15429 break; 15430 case $.ui.keyCode.END: 15431 selectedIndex = this.anchors.length - 1; 15432 break; 15433 case $.ui.keyCode.HOME: 15434 selectedIndex = 0; 15435 break; 15436 case $.ui.keyCode.SPACE: 15437 // Activate only, no collapsing 15438 event.preventDefault(); 15439 clearTimeout( this.activating ); 15440 this._activate( selectedIndex ); 15441 return; 15442 case $.ui.keyCode.ENTER: 15443 // Toggle (cancel delayed activation, allow collapsing) 15444 event.preventDefault(); 15445 clearTimeout( this.activating ); 15446 // Determine if we should collapse or activate 15447 this._activate( selectedIndex === this.options.active ? false : selectedIndex ); 15448 return; 15449 default: 15450 return; 15451 } 15452 15453 // Focus the appropriate tab, based on which key was pressed 15454 event.preventDefault(); 15455 clearTimeout( this.activating ); 15456 selectedIndex = this._focusNextTab( selectedIndex, goingForward ); 15457 15458 // Navigating with control key will prevent automatic activation 15459 if ( !event.ctrlKey ) { 15460 // Update aria-selected immediately so that AT think the tab is already selected. 15461 // Otherwise AT may confuse the user by stating that they need to activate the tab, 15462 // but the tab will already be activated by the time the announcement finishes. 15463 focusedTab.attr( "aria-selected", "false" ); 15464 this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" ); 15465 15466 this.activating = this._delay(function() { 15467 this.option( "active", selectedIndex ); 15468 }, this.delay ); 15469 } 15470 }, 15471 15472 _panelKeydown: function( event ) { 15473 if ( this._handlePageNav( event ) ) { 15474 return; 15475 } 15476 15477 // Ctrl+up moves focus to the current tab 15478 if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) { 15479 event.preventDefault(); 15480 this.active.focus(); 15481 } 15482 }, 15483 15484 // Alt+page up/down moves focus to the previous/next tab (and activates) 15485 _handlePageNav: function( event ) { 15486 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) { 15487 this._activate( this._focusNextTab( this.options.active - 1, false ) ); 15488 return true; 15489 } 15490 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) { 15491 this._activate( this._focusNextTab( this.options.active + 1, true ) ); 15492 return true; 15493 } 15494 }, 15495 15496 _findNextTab: function( index, goingForward ) { 15497 var lastTabIndex = this.tabs.length - 1; 15498 15499 function constrain() { 15500 if ( index > lastTabIndex ) { 15501 index = 0; 15502 } 15503 if ( index < 0 ) { 15504 index = lastTabIndex; 15505 } 15506 return index; 15507 } 15508 15509 while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) { 15510 index = goingForward ? index + 1 : index - 1; 15511 } 15512 15513 return index; 15514 }, 15515 15516 _focusNextTab: function( index, goingForward ) { 15517 index = this._findNextTab( index, goingForward ); 15518 this.tabs.eq( index ).focus(); 15519 return index; 15520 }, 15521 15522 _setOption: function( key, value ) { 15523 if ( key === "active" ) { 15524 // _activate() will handle invalid values and update this.options 15525 this._activate( value ); 15526 return; 15527 } 15528 15529 if ( key === "disabled" ) { 15530 // don't use the widget factory's disabled handling 15531 this._setupDisabled( value ); 15532 return; 15533 } 15534 15535 this._super( key, value); 15536 15537 if ( key === "collapsible" ) { 15538 this.element.toggleClass( "ui-tabs-collapsible", value ); 15539 // Setting collapsible: false while collapsed; open first panel 15540 if ( !value && this.options.active === false ) { 15541 this._activate( 0 ); 15542 } 15543 } 15544 15545 if ( key === "event" ) { 15546 this._setupEvents( value ); 15547 } 15548 15549 if ( key === "heightStyle" ) { 15550 this._setupHeightStyle( value ); 15551 } 15552 }, 15553 15554 _sanitizeSelector: function( hash ) { 15555 return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : ""; 15556 }, 15557 15558 refresh: function() { 15559 var options = this.options, 15560 lis = this.tablist.children( ":has(a[href])" ); 15561 15562 // get disabled tabs from class attribute from HTML 15563 // this will get converted to a boolean if needed in _refresh() 15564 options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) { 15565 return lis.index( tab ); 15566 }); 15567 15568 this._processTabs(); 15569
vendor: 4,870 bytes, lines 15570-15740
15570 // was collapsed or no tabs 15571 if ( options.active === false || !this.anchors.length ) { 15572 options.active = false; 15573 this.active = $(); 15574 // was active, but active tab is gone 15575 } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) { 15576 // all remaining tabs are disabled 15577 if ( this.tabs.length === options.disabled.length ) { 15578 options.active = false; 15579 this.active = $(); 15580 // activate previous tab 15581 } else { 15582 this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) ); 15583 } 15584 // was active, active tab still exists 15585 } else { 15586 // make sure active index is correct 15587 options.active = this.tabs.index( this.active ); 15588 } 15589 15590 this._refresh(); 15591 }, 15592 15593 _refresh: function() { 15594 this._setupDisabled( this.options.disabled ); 15595 this._setupEvents( this.options.event ); 15596 this._setupHeightStyle( this.options.heightStyle ); 15597 15598 this.tabs.not( this.active ).attr({ 15599 "aria-selected": "false", 15600 "aria-expanded": "false", 15601 tabIndex: -1 15602 }); 15603 this.panels.not( this._getPanelForTab( this.active ) ) 15604 .hide() 15605 .attr({ 15606 "aria-hidden": "true" 15607 }); 15608 15609 // Make sure one tab is in the tab order 15610 if ( !this.active.length ) { 15611 this.tabs.eq( 0 ).attr( "tabIndex", 0 ); 15612 } else { 15613 this.active 15614 .addClass( "ui-tabs-active ui-state-active" ) 15615 .attr({ 15616 "aria-selected": "true", 15617 "aria-expanded": "true", 15618 tabIndex: 0 15619 }); 15620 this._getPanelForTab( this.active ) 15621 .show() 15622 .attr({ 15623 "aria-hidden": "false" 15624 }); 15625 } 15626 }, 15627 15628 _processTabs: function() { 15629 var that = this, 15630 prevTabs = this.tabs, 15631 prevAnchors = this.anchors, 15632 prevPanels = this.panels; 15633 15634 this.tablist = this._getList() 15635 .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" ) 15636 .attr( "role", "tablist" ) 15637 15638 // Prevent users from focusing disabled tabs via click 15639 .delegate( "> li", "mousedown" + this.eventNamespace, function( event ) { 15640 if ( $( this ).is( ".ui-state-disabled" ) ) { 15641 event.preventDefault(); 15642 } 15643 }) 15644 15645 // support: IE <9 15646 // Preventing the default action in mousedown doesn't prevent IE 15647 // from focusing the element, so if the anchor gets focused, blur. 15648 // We don't have to worry about focusing the previously focused 15649 // element since clicking on a non-focusable element should focus 15650 // the body anyway. 15651 .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() { 15652 if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) { 15653 this.blur(); 15654 } 15655 }); 15656 15657 this.tabs = this.tablist.find( "> li:has(a[href])" ) 15658 .addClass( "ui-state-default ui-corner-top" ) 15659 .attr({ 15660 role: "tab", 15661 tabIndex: -1 15662 }); 15663 15664 this.anchors = this.tabs.map(function() { 15665 return $( "a", this )[ 0 ]; 15666 }) 15667 .addClass( "ui-tabs-anchor" ) 15668 .attr({ 15669 role: "presentation", 15670 tabIndex: -1 15671 }); 15672 15673 this.panels = $(); 15674 15675 this.anchors.each(function( i, anchor ) { 15676 var selector, panel, panelId, 15677 anchorId = $( anchor ).uniqueId().attr( "id" ), 15678 tab = $( anchor ).closest( "li" ), 15679 originalAriaControls = tab.attr( "aria-controls" ); 15680 15681 // inline tab 15682 if ( that._isLocal( anchor ) ) { 15683 selector = anchor.hash; 15684 panelId = selector.substring( 1 ); 15685 panel = that.element.find( that._sanitizeSelector( selector ) ); 15686 // remote tab 15687 } else { 15688 // If the tab doesn't already have aria-controls, 15689 // generate an id by using a throw-away element 15690 panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id; 15691 selector = "#" + panelId; 15692 panel = that.element.find( selector ); 15693 if ( !panel.length ) { 15694 panel = that._createPanel( panelId ); 15695 panel.insertAfter( that.panels[ i - 1 ] || that.tablist ); 15696 } 15697 panel.attr( "aria-live", "polite" ); 15698 } 15699 15700 if ( panel.length) { 15701 that.panels = that.panels.add( panel ); 15702 } 15703 if ( originalAriaControls ) { 15704 tab.data( "ui-tabs-aria-controls", originalAriaControls ); 15705 } 15706 tab.attr({ 15707 "aria-controls": panelId, 15708 "aria-labelledby": anchorId 15709 }); 15710 panel.attr( "aria-labelledby", anchorId ); 15711 }); 15712 15713 this.panels 15714 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) 15715 .attr( "role", "tabpanel" ); 15716 15717 // Avoid memory leaks (#10056) 15718 if ( prevTabs ) { 15719 this._off( prevTabs.not( this.tabs ) ); 15720 this._off( prevAnchors.not( this.anchors ) ); 15721 this._off( prevPanels.not( this.panels ) ); 15722 } 15723 }, 15724 15725 // allow overriding how to find the list for rare usage scenarios (#7715) 15726 _getList: function() { 15727 return this.tablist || this.element.find( "ol,ul" ).eq( 0 ); 15728 }, 15729 15730 _createPanel: function( id ) { 15731 return $( "<div>" ) 15732 .attr( "id", id ) 15733 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) 15734 .data( "ui-tabs-destroy", true ); 15735 }, 15736 15737 _setupDisabled: function( disabled ) { 15738 if ( $.isArray( disabled ) ) { 15739 if ( !disabled.length ) { 15740 disabled = false;
vendor: 10,211 bytes, lines 15741-16136
15741 } else if ( disabled.length === this.anchors.length ) { 15742 disabled = true; 15743 } 15744 } 15745 15746 // disable tabs 15747 for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) { 15748 if ( disabled === true || $.inArray( i, disabled ) !== -1 ) { 15749 $( li ) 15750 .addClass( "ui-state-disabled" ) 15751 .attr( "aria-disabled", "true" ); 15752 } else { 15753 $( li ) 15754 .removeClass( "ui-state-disabled" ) 15755 .removeAttr( "aria-disabled" ); 15756 } 15757 } 15758 15759 this.options.disabled = disabled; 15760 }, 15761 15762 _setupEvents: function( event ) { 15763 var events = {}; 15764 if ( event ) { 15765 $.each( event.split(" "), function( index, eventName ) { 15766 events[ eventName ] = "_eventHandler"; 15767 }); 15768 } 15769 15770 this._off( this.anchors.add( this.tabs ).add( this.panels ) ); 15771 // Always prevent the default action, even when disabled 15772 this._on( true, this.anchors, { 15773 click: function( event ) { 15774 event.preventDefault(); 15775 } 15776 }); 15777 this._on( this.anchors, events ); 15778 this._on( this.tabs, { keydown: "_tabKeydown" } ); 15779 this._on( this.panels, { keydown: "_panelKeydown" } ); 15780 15781 this._focusable( this.tabs ); 15782 this._hoverable( this.tabs ); 15783 }, 15784 15785 _setupHeightStyle: function( heightStyle ) { 15786 var maxHeight, 15787 parent = this.element.parent(); 15788 15789 if ( heightStyle === "fill" ) { 15790 maxHeight = parent.height(); 15791 maxHeight -= this.element.outerHeight() - this.element.height(); 15792 15793 this.element.siblings( ":visible" ).each(function() { 15794 var elem = $( this ), 15795 position = elem.css( "position" ); 15796 15797 if ( position === "absolute" || position === "fixed" ) { 15798 return; 15799 } 15800 maxHeight -= elem.outerHeight( true ); 15801 }); 15802 15803 this.element.children().not( this.panels ).each(function() { 15804 maxHeight -= $( this ).outerHeight( true ); 15805 }); 15806 15807 this.panels.each(function() { 15808 $( this ).height( Math.max( 0, maxHeight - 15809 $( this ).innerHeight() + $( this ).height() ) ); 15810 }) 15811 .css( "overflow", "auto" ); 15812 } else if ( heightStyle === "auto" ) { 15813 maxHeight = 0; 15814 this.panels.each(function() { 15815 maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() ); 15816 }).height( maxHeight ); 15817 } 15818 }, 15819 15820 _eventHandler: function( event ) { 15821 var options = this.options, 15822 active = this.active, 15823 anchor = $( event.currentTarget ), 15824 tab = anchor.closest( "li" ), 15825 clickedIsActive = tab[ 0 ] === active[ 0 ], 15826 collapsing = clickedIsActive && options.collapsible, 15827 toShow = collapsing ? $() : this._getPanelForTab( tab ), 15828 toHide = !active.length ? $() : this._getPanelForTab( active ), 15829 eventData = { 15830 oldTab: active, 15831 oldPanel: toHide, 15832 newTab: collapsing ? $() : tab, 15833 newPanel: toShow 15834 }; 15835 15836 event.preventDefault(); 15837 15838 if ( tab.hasClass( "ui-state-disabled" ) || 15839 // tab is already loading 15840 tab.hasClass( "ui-tabs-loading" ) || 15841 // can't switch durning an animation 15842 this.running || 15843 // click on active header, but not collapsible 15844 ( clickedIsActive && !options.collapsible ) || 15845 // allow canceling activation 15846 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { 15847 return; 15848 } 15849 15850 options.active = collapsing ? false : this.tabs.index( tab ); 15851 15852 this.active = clickedIsActive ? $() : tab; 15853 if ( this.xhr ) { 15854 this.xhr.abort(); 15855 } 15856 15857 if ( !toHide.length && !toShow.length ) { 15858 $.error( "jQuery UI Tabs: Mismatching fragment identifier." ); 15859 } 15860 15861 if ( toShow.length ) { 15862 this.load( this.tabs.index( tab ), event ); 15863 } 15864 this._toggle( event, eventData ); 15865 }, 15866 15867 // handles show/hide for selecting tabs 15868 _toggle: function( event, eventData ) { 15869 var that = this, 15870 toShow = eventData.newPanel, 15871 toHide = eventData.oldPanel; 15872 15873 this.running = true; 15874 15875 function complete() { 15876 that.running = false; 15877 that._trigger( "activate", event, eventData ); 15878 } 15879 15880 function show() { 15881 eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" ); 15882 15883 if ( toShow.length && that.options.show ) { 15884 that._show( toShow, that.options.show, complete ); 15885 } else { 15886 toShow.show(); 15887 complete(); 15888 } 15889 } 15890 15891 // start out by hiding, then showing, then completing 15892 if ( toHide.length && this.options.hide ) { 15893 this._hide( toHide, this.options.hide, function() { 15894 eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" ); 15895 show(); 15896 }); 15897 } else { 15898 eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" ); 15899 toHide.hide(); 15900 show(); 15901 } 15902 15903 toHide.attr( "aria-hidden", "true" ); 15904 eventData.oldTab.attr({ 15905 "aria-selected": "false", 15906 "aria-expanded": "false" 15907 }); 15908 // If we're switching tabs, remove the old tab from the tab order. 15909 // If we're opening from collapsed state, remove the previous tab from the tab order. 15910 // If we're collapsing, then keep the collapsing tab in the tab order. 15911 if ( toShow.length && toHide.length ) { 15912 eventData.oldTab.attr( "tabIndex", -1 ); 15913 } else if ( toShow.length ) { 15914 this.tabs.filter(function() { 15915 return $( this ).attr( "tabIndex" ) === 0; 15916 }) 15917 .attr( "tabIndex", -1 ); 15918 } 15919 15920 toShow.attr( "aria-hidden", "false" ); 15921 eventData.newTab.attr({ 15922 "aria-selected": "true", 15923 "aria-expanded": "true", 15924 tabIndex: 0 15925 }); 15926 }, 15927 15928 _activate: function( index ) { 15929 var anchor, 15930 active = this._findActive( index ); 15931 15932 // trying to activate the already active panel 15933 if ( active[ 0 ] === this.active[ 0 ] ) { 15934 return; 15935 } 15936 15937 // trying to collapse, simulate a click on the current active header 15938 if ( !active.length ) { 15939 active = this.active; 15940 } 15941 15942 anchor = active.find( ".ui-tabs-anchor" )[ 0 ]; 15943 this._eventHandler({ 15944 target: anchor, 15945 currentTarget: anchor, 15946 preventDefault: $.noop 15947 }); 15948 }, 15949 15950 _findActive: function( index ) { 15951 return index === false ? $() : this.tabs.eq( index ); 15952 }, 15953 15954 _getIndex: function( index ) { 15955 // meta-function to give users option to provide a href string instead of a numerical index. 15956 if ( typeof index === "string" ) { 15957 index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) ); 15958 } 15959 15960 return index; 15961 }, 15962 15963 _destroy: function() { 15964 if ( this.xhr ) { 15965 this.xhr.abort(); 15966 } 15967 15968 this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" ); 15969 15970 this.tablist 15971 .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" ) 15972 .removeAttr( "role" ); 15973 15974 this.anchors 15975 .removeClass( "ui-tabs-anchor" ) 15976 .removeAttr( "role" ) 15977 .removeAttr( "tabIndex" ) 15978 .removeUniqueId(); 15979 15980 this.tablist.unbind( this.eventNamespace ); 15981 15982 this.tabs.add( this.panels ).each(function() { 15983 if ( $.data( this, "ui-tabs-destroy" ) ) { 15984 $( this ).remove(); 15985 } else { 15986 $( this ) 15987 .removeClass( "ui-state-default ui-state-active ui-state-disabled " + 15988 "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" ) 15989 .removeAttr( "tabIndex" ) 15990 .removeAttr( "aria-live" ) 15991 .removeAttr( "aria-busy" ) 15992 .removeAttr( "aria-selected" ) 15993 .removeAttr( "aria-labelledby" ) 15994 .removeAttr( "aria-hidden" ) 15995 .removeAttr( "aria-expanded" ) 15996 .removeAttr( "role" ); 15997 } 15998 }); 15999 16000 this.tabs.each(function() { 16001 var li = $( this ), 16002 prev = li.data( "ui-tabs-aria-controls" ); 16003 if ( prev ) { 16004 li 16005 .attr( "aria-controls", prev ) 16006 .removeData( "ui-tabs-aria-controls" ); 16007 } else { 16008 li.removeAttr( "aria-controls" ); 16009 } 16010 }); 16011 16012 this.panels.show(); 16013 16014 if ( this.options.heightStyle !== "content" ) { 16015 this.panels.css( "height", "" ); 16016 } 16017 }, 16018 16019 enable: function( index ) { 16020 var disabled = this.options.disabled; 16021 if ( disabled === false ) { 16022 return; 16023 } 16024 16025 if ( index === undefined ) { 16026 disabled = false; 16027 } else { 16028 index = this._getIndex( index ); 16029 if ( $.isArray( disabled ) ) { 16030 disabled = $.map( disabled, function( num ) { 16031 return num !== index ? num : null; 16032 }); 16033 } else { 16034 disabled = $.map( this.tabs, function( li, num ) { 16035 return num !== index ? num : null; 16036 }); 16037 } 16038 } 16039 this._setupDisabled( disabled ); 16040 }, 16041 16042 disable: function( index ) { 16043 var disabled = this.options.disabled; 16044 if ( disabled === true ) { 16045 return; 16046 } 16047 16048 if ( index === undefined ) { 16049 disabled = true; 16050 } else { 16051 index = this._getIndex( index ); 16052 if ( $.inArray( index, disabled ) !== -1 ) { 16053 return; 16054 } 16055 if ( $.isArray( disabled ) ) { 16056 disabled = $.merge( [ index ], disabled ).sort(); 16057 } else { 16058 disabled = [ index ]; 16059 } 16060 } 16061 this._setupDisabled( disabled ); 16062 }, 16063 16064 load: function( index, event ) { 16065 index = this._getIndex( index ); 16066 var that = this, 16067 tab = this.tabs.eq( index ), 16068 anchor = tab.find( ".ui-tabs-anchor" ), 16069 panel = this._getPanelForTab( tab ), 16070 eventData = { 16071 tab: tab, 16072 panel: panel 16073 }; 16074 16075 // not remote 16076 if ( this._isLocal( anchor[ 0 ] ) ) { 16077 return; 16078 } 16079 16080 this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) ); 16081 16082 // support: jQuery <1.8 16083 // jQuery <1.8 returns false if the request is canceled in beforeSend, 16084 // but as of 1.8, $.ajax() always returns a jqXHR object. 16085 if ( this.xhr && this.xhr.statusText !== "canceled" ) { 16086 tab.addClass( "ui-tabs-loading" ); 16087 panel.attr( "aria-busy", "true" ); 16088 16089 this.xhr 16090 .success(function( response ) { 16091 // support: jQuery <1.8 16092 // http://bugs.jquery.com/ticket/11778 16093 setTimeout(function() { 16094 panel.html( response ); 16095 that._trigger( "load", event, eventData ); 16096 }, 1 ); 16097 }) 16098 .complete(function( jqXHR, status ) { 16099 // support: jQuery <1.8 16100 // http://bugs.jquery.com/ticket/11778 16101 setTimeout(function() { 16102 if ( status === "abort" ) { 16103 that.panels.stop( false, true ); 16104 } 16105 16106 tab.removeClass( "ui-tabs-loading" ); 16107 panel.removeAttr( "aria-busy" ); 16108 16109 if ( jqXHR === that.xhr ) { 16110 delete that.xhr; 16111 } 16112 }, 1 ); 16113 }); 16114 } 16115 }, 16116 16117 _ajaxSettings: function( anchor, event, eventData ) { 16118 var that = this; 16119 return { 16120 url: anchor.attr( "href" ), 16121 beforeSend: function( jqXHR, settings ) { 16122 return that._trigger( "beforeLoad", event, 16123 $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) ); 16124 } 16125 }; 16126 }, 16127 16128 _getPanelForTab: function( tab ) { 16129 var id = $( tab ).attr( "aria-controls" ); 16130 return this.element.find( this._sanitizeSelector( "#" + id ) ); 16131 } 16132}); 16133 16134 16135/*! 16136 * jQuery UI Tooltip 1.11.
vendor: 6,743 bytes, lines 16136-16379
161362 16137 * http://jqueryui.com 16138 * 16139 * Copyright 2014 jQuery Foundation and other contributors 16140 * Released under the MIT license. 16141 * http://jquery.org/license 16142 * 16143 * http://api.jqueryui.com/tooltip/ 16144 */ 16145 16146 16147var tooltip = $.widget( "ui.tooltip", { 16148 version: "1.11.2", 16149 options: { 16150 content: function() { 16151 // support: IE<9, Opera in jQuery <1.7 16152 // .text() can't accept undefined, so coerce to a string 16153 var title = $( this ).attr( "title" ) || ""; 16154 // Escape title, since we're going from an attribute to raw HTML 16155 return $( "<a>" ).text( title ).html(); 16156 }, 16157 hide: true, 16158 // Disabled elements have inconsistent behavior across browsers (#8661) 16159 items: "[title]:not([disabled])", 16160 position: { 16161 my: "left top+15", 16162 at: "left bottom", 16163 collision: "flipfit flip" 16164 }, 16165 show: true, 16166 tooltipClass: null, 16167 track: false, 16168 16169 // callbacks 16170 close: null, 16171 open: null 16172 }, 16173 16174 _addDescribedBy: function( elem, id ) { 16175 var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ); 16176 describedby.push( id ); 16177 elem 16178 .data( "ui-tooltip-id", id ) 16179 .attr( "aria-describedby", $.trim( describedby.join( " " ) ) ); 16180 }, 16181 16182 _removeDescribedBy: function( elem ) { 16183 var id = elem.data( "ui-tooltip-id" ), 16184 describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ), 16185 index = $.inArray( id, describedby ); 16186 16187 if ( index !== -1 ) { 16188 describedby.splice( index, 1 ); 16189 } 16190 16191 elem.removeData( "ui-tooltip-id" ); 16192 describedby = $.trim( describedby.join( " " ) ); 16193 if ( describedby ) { 16194 elem.attr( "aria-describedby", describedby ); 16195 } else { 16196 elem.removeAttr( "aria-describedby" ); 16197 } 16198 }, 16199 16200 _create: function() { 16201 this._on({ 16202 mouseover: "open", 16203 focusin: "open" 16204 }); 16205 16206 // IDs of generated tooltips, needed for destroy 16207 this.tooltips = {}; 16208 16209 // IDs of parent tooltips where we removed the title attribute 16210 this.parents = {}; 16211 16212 if ( this.options.disabled ) { 16213 this._disable(); 16214 } 16215 16216 // Append the aria-live region so tooltips announce correctly 16217 this.liveRegion = $( "<div>" ) 16218 .attr({ 16219 role: "log", 16220 "aria-live": "assertive", 16221 "aria-relevant": "additions" 16222 }) 16223 .addClass( "ui-helper-hidden-accessible" ) 16224 .appendTo( this.document[ 0 ].body ); 16225 }, 16226 16227 _setOption: function( key, value ) { 16228 var that = this; 16229 16230 if ( key === "disabled" ) { 16231 this[ value ? "_disable" : "_enable" ](); 16232 this.options[ key ] = value; 16233 // disable element style changes 16234 return; 16235 } 16236 16237 this._super( key, value ); 16238 16239 if ( key === "content" ) { 16240 $.each( this.tooltips, function( id, tooltipData ) { 16241 that._updateContent( tooltipData.element ); 16242 }); 16243 } 16244 }, 16245 16246 _disable: function() { 16247 var that = this; 16248 16249 // close open tooltips 16250 $.each( this.tooltips, function( id, tooltipData ) { 16251 var event = $.Event( "blur" ); 16252 event.target = event.currentTarget = tooltipData.element[ 0 ]; 16253 that.close( event, true ); 16254 }); 16255 16256 // remove title attributes to prevent native tooltips 16257 this.element.find( this.options.items ).addBack().each(function() { 16258 var element = $( this ); 16259 if ( element.is( "[title]" ) ) { 16260 element 16261 .data( "ui-tooltip-title", element.attr( "title" ) ) 16262 .removeAttr( "title" ); 16263 } 16264 }); 16265 }, 16266 16267 _enable: function() { 16268 // restore title attributes 16269 this.element.find( this.options.items ).addBack().each(function() { 16270 var element = $( this ); 16271 if ( element.data( "ui-tooltip-title" ) ) { 16272 element.attr( "title", element.data( "ui-tooltip-title" ) ); 16273 } 16274 }); 16275 }, 16276 16277 open: function( event ) { 16278 var that = this, 16279 target = $( event ? event.target : this.element ) 16280 // we need closest here due to mouseover bubbling, 16281 // but always pointing at the same event target 16282 .closest( this.options.items ); 16283 16284 // No element to show a tooltip for or the tooltip is already open 16285 if ( !target.length || target.data( "ui-tooltip-id" ) ) { 16286 return; 16287 } 16288 16289 if ( target.attr( "title" ) ) { 16290 target.data( "ui-tooltip-title", target.attr( "title" ) ); 16291 } 16292 16293 target.data( "ui-tooltip-open", true ); 16294 16295 // kill parent tooltips, custom or native, for hover 16296 if ( event && event.type === "mouseover" ) { 16297 target.parents().each(function() { 16298 var parent = $( this ), 16299 blurEvent; 16300 if ( parent.data( "ui-tooltip-open" ) ) { 16301 blurEvent = $.Event( "blur" ); 16302 blurEvent.target = blurEvent.currentTarget = this; 16303 that.close( blurEvent, true ); 16304 } 16305 if ( parent.attr( "title" ) ) { 16306 parent.uniqueId(); 16307 that.parents[ this.id ] = { 16308 element: this, 16309 title: parent.attr( "title" ) 16310 }; 16311 parent.attr( "title", "" ); 16312 } 16313 }); 16314 } 16315 16316 this._updateContent( target, event ); 16317 }, 16318 16319 _updateContent: function( target, event ) { 16320 var content, 16321 contentOption = this.options.content, 16322 that = this, 16323 eventType = event ? event.type : null; 16324 16325 if ( typeof contentOption === "string" ) { 16326 return this._open( event, target, contentOption ); 16327 } 16328 16329 content = contentOption.call( target[0], function( response ) { 16330 // ignore async response if tooltip was closed already 16331 if ( !target.data( "ui-tooltip-open" ) ) { 16332 return; 16333 } 16334 // IE may instantly serve a cached response for ajax requests 16335 // delay this call to _open so the other call to _open runs first 16336 that._delay(function() { 16337 // jQuery creates a special event for focusin when it doesn't 16338 // exist natively. To improve performance, the native event 16339 // object is reused and the type is changed. Therefore, we can't 16340 // rely on the type being correct after the event finished 16341 // bubbling, so we set it back to the previous value. (#8740) 16342 if ( event ) { 16343 event.type = eventType; 16344 } 16345 this._open( event, target, response ); 16346 }); 16347 }); 16348 if ( content ) { 16349 this._open( event, target, content ); 16350 } 16351 }, 16352 16353 _open: function( event, target, content ) { 16354 var tooltipData, tooltip, events, delayedShow, a11yContent, 16355 positionOption = $.extend( {}, this.options.position ); 16356 16357 if ( !content ) { 16358 return; 16359 } 16360 16361 // Content can be updated multiple times. If the tooltip already 16362 // exists, then just update the content and bail. 16363 tooltipData = this._find( target ); 16364 if ( tooltipData ) { 16365 tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content ); 16366 return; 16367 } 16368 16369 // if we have a title, clear it to prevent the native tooltip 16370 // we have to check first to avoid defining a title if none exists 16371 // (we don't want to cause an element to start matching [title]) 16372 // 16373 // We use removeAttr only for key events, to allow IE to export the correct 16374 // accessible attributes. For mouse events, set to empty string to avoid 16375 // native tooltip showing up (happens only when removing inside mouseover). 16376 if ( target.is( "[title]" ) ) { 16377 if ( event && event.type === "mouseover" ) { 16378 target.attr( "title", "" ); 16379 } else {
vendor: 5,532 bytes, lines 16380-16582
16380 target.removeAttr( "title" ); 16381 } 16382 } 16383 16384 tooltipData = this._tooltip( target ); 16385 tooltip = tooltipData.tooltip; 16386 this._addDescribedBy( target, tooltip.attr( "id" ) ); 16387 tooltip.find( ".ui-tooltip-content" ).html( content ); 16388 16389 // Support: Voiceover on OS X, JAWS on IE <= 9 16390 // JAWS announces deletions even when aria-relevant="additions" 16391 // Voiceover will sometimes re-read the entire log region's contents from the beginning 16392 this.liveRegion.children().hide(); 16393 if ( content.clone ) { 16394 a11yContent = content.clone(); 16395 a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" ); 16396 } else { 16397 a11yContent = content; 16398 } 16399 $( "<div>" ).html( a11yContent ).appendTo( this.liveRegion ); 16400 16401 function position( event ) { 16402 positionOption.of = event; 16403 if ( tooltip.is( ":hidden" ) ) { 16404 return; 16405 } 16406 tooltip.position( positionOption ); 16407 } 16408 if ( this.options.track && event && /^mouse/.test( event.type ) ) { 16409 this._on( this.document, { 16410 mousemove: position 16411 }); 16412 // trigger once to override element-relative positioning 16413 position( event ); 16414 } else { 16415 tooltip.position( $.extend({ 16416 of: target 16417 }, this.options.position ) ); 16418 } 16419 16420 tooltip.hide(); 16421 16422 this._show( tooltip, this.options.show ); 16423 // Handle tracking tooltips that are shown with a delay (#8644). As soon 16424 // as the tooltip is visible, position the tooltip using the most recent 16425 // event. 16426 if ( this.options.show && this.options.show.delay ) { 16427 delayedShow = this.delayedShow = setInterval(function() { 16428 if ( tooltip.is( ":visible" ) ) { 16429 position( positionOption.of ); 16430 clearInterval( delayedShow ); 16431 } 16432 }, $.fx.interval ); 16433 } 16434 16435 this._trigger( "open", event, { tooltip: tooltip } ); 16436 16437 events = { 16438 keyup: function( event ) { 16439 if ( event.keyCode === $.ui.keyCode.ESCAPE ) { 16440 var fakeEvent = $.Event(event); 16441 fakeEvent.currentTarget = target[0]; 16442 this.close( fakeEvent, true ); 16443 } 16444 } 16445 }; 16446 16447 // Only bind remove handler for delegated targets. Non-delegated 16448 // tooltips will handle this in destroy. 16449 if ( target[ 0 ] !== this.element[ 0 ] ) { 16450 events.remove = function() { 16451 this._removeTooltip( tooltip ); 16452 }; 16453 } 16454 16455 if ( !event || event.type === "mouseover" ) { 16456 events.mouseleave = "close"; 16457 } 16458 if ( !event || event.type === "focusin" ) { 16459 events.focusout = "close"; 16460 } 16461 this._on( true, target, events ); 16462 }, 16463 16464 close: function( event ) { 16465 var tooltip, 16466 that = this, 16467 target = $( event ? event.currentTarget : this.element ), 16468 tooltipData = this._find( target ); 16469 16470 // The tooltip may already be closed 16471 if ( !tooltipData ) { 16472 return; 16473 } 16474 16475 tooltip = tooltipData.tooltip; 16476 16477 // disabling closes the tooltip, so we need to track when we're closing 16478 // to avoid an infinite loop in case the tooltip becomes disabled on close 16479 if ( tooltipData.closing ) { 16480 return; 16481 } 16482 16483 // Clear the interval for delayed tracking tooltips 16484 clearInterval( this.delayedShow ); 16485 16486 // only set title if we had one before (see comment in _open()) 16487 // If the title attribute has changed since open(), don't restore 16488 if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) { 16489 target.attr( "title", target.data( "ui-tooltip-title" ) ); 16490 } 16491 16492 this._removeDescribedBy( target ); 16493 16494 tooltipData.hiding = true; 16495 tooltip.stop( true ); 16496 this._hide( tooltip, this.options.hide, function() { 16497 that._removeTooltip( $( this ) ); 16498 }); 16499 16500 target.removeData( "ui-tooltip-open" ); 16501 this._off( target, "mouseleave focusout keyup" ); 16502 16503 // Remove 'remove' binding only on delegated targets 16504 if ( target[ 0 ] !== this.element[ 0 ] ) { 16505 this._off( target, "remove" ); 16506 } 16507 this._off( this.document, "mousemove" ); 16508 16509 if ( event && event.type === "mouseleave" ) { 16510 $.each( this.parents, function( id, parent ) { 16511 $( parent.element ).attr( "title", parent.title ); 16512 delete that.parents[ id ]; 16513 }); 16514 } 16515 16516 tooltipData.closing = true; 16517 this._trigger( "close", event, { tooltip: tooltip } ); 16518 if ( !tooltipData.hiding ) { 16519 tooltipData.closing = false; 16520 } 16521 }, 16522 16523 _tooltip: function( element ) { 16524 var tooltip = $( "<div>" ) 16525 .attr( "role", "tooltip" ) 16526 .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " + 16527 ( this.options.tooltipClass || "" ) ), 16528 id = tooltip.uniqueId().attr( "id" ); 16529 16530 $( "<div>" ) 16531 .addClass( "ui-tooltip-content" ) 16532 .appendTo( tooltip ); 16533 16534 tooltip.appendTo( this.document[0].body ); 16535 16536 return this.tooltips[ id ] = { 16537 element: element, 16538 tooltip: tooltip 16539 }; 16540 }, 16541 16542 _find: function( target ) { 16543 var id = target.data( "ui-tooltip-id" ); 16544 return id ? this.tooltips[ id ] : null; 16545 }, 16546 16547 _removeTooltip: function( tooltip ) { 16548 tooltip.remove(); 16549 delete this.tooltips[ tooltip.attr( "id" ) ]; 16550 }, 16551 16552 _destroy: function() { 16553 var that = this; 16554 16555 // close open tooltips 16556 $.each( this.tooltips, function( id, tooltipData ) { 16557 // Delegate to close method to handle common cleanup 16558 var event = $.Event( "blur" ), 16559 element = tooltipData.element; 16560 event.target = event.currentTarget = element[ 0 ]; 16561 that.close( event, true ); 16562 16563 // Remove immediately; destroying an open tooltip doesn't use the 16564 // hide animation 16565 $( "#" + id ).remove(); 16566 16567 // Restore the title 16568 if ( element.data( "ui-tooltip-title" ) ) { 16569 // If the title attribute has changed since open(), don't restore 16570 if ( !element.attr( "title" ) ) { 16571 element.attr( "title", element.data( "ui-tooltip-title" ) ); 16572 } 16573 element.removeData( "ui-tooltip-title" ); 16574 } 16575 }); 16576 this.liveRegion.remove(); 16577 } 16578}); 16579 16580 16581 16582}));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.