Code Duplication    Length = 936-936 lines in 2 locations

public/lib/semantic/semantic.js 1 location

@@ 8906-9841 (lines=936) @@
8903
 *
8904
 */
8905
8906
;(function ($, window, document, undefined) {
8907
8908
"use strict";
8909
8910
window = (typeof window != 'undefined' && window.Math == Math)
8911
  ? window
8912
  : (typeof self != 'undefined' && self.Math == Math)
8913
    ? self
8914
    : Function('return this')()
8915
;
8916
8917
$.fn.modal = function(parameters) {
8918
  var
8919
    $allModules    = $(this),
8920
    $window        = $(window),
8921
    $document      = $(document),
8922
    $body          = $('body'),
8923
8924
    moduleSelector = $allModules.selector || '',
8925
8926
    time           = new Date().getTime(),
8927
    performance    = [],
8928
8929
    query          = arguments[0],
8930
    methodInvoked  = (typeof query == 'string'),
8931
    queryArguments = [].slice.call(arguments, 1),
8932
8933
    requestAnimationFrame = window.requestAnimationFrame
8934
      || window.mozRequestAnimationFrame
8935
      || window.webkitRequestAnimationFrame
8936
      || window.msRequestAnimationFrame
8937
      || function(callback) { setTimeout(callback, 0); },
8938
8939
    returnedValue
8940
  ;
8941
8942
  $allModules
8943
    .each(function() {
8944
      var
8945
        settings    = ( $.isPlainObject(parameters) )
8946
          ? $.extend(true, {}, $.fn.modal.settings, parameters)
8947
          : $.extend({}, $.fn.modal.settings),
8948
8949
        selector        = settings.selector,
8950
        className       = settings.className,
8951
        namespace       = settings.namespace,
8952
        error           = settings.error,
8953
8954
        eventNamespace  = '.' + namespace,
8955
        moduleNamespace = 'module-' + namespace,
8956
8957
        $module         = $(this),
8958
        $context        = $(settings.context),
8959
        $close          = $module.find(selector.close),
8960
8961
        $allModals,
8962
        $otherModals,
8963
        $focusedElement,
8964
        $dimmable,
8965
        $dimmer,
8966
8967
        element         = this,
8968
        instance        = $module.data(moduleNamespace),
8969
8970
        ignoreRepeatedEvents = false,
8971
8972
        elementEventNamespace,
8973
        id,
8974
        observer,
8975
        module
8976
      ;
8977
      module  = {
8978
8979
        initialize: function() {
8980
          module.verbose('Initializing dimmer', $context);
8981
8982
          module.create.id();
8983
          module.create.dimmer();
8984
          module.refreshModals();
8985
8986
          module.bind.events();
8987
          if(settings.observeChanges) {
8988
            module.observeChanges();
8989
          }
8990
          module.instantiate();
8991
        },
8992
8993
        instantiate: function() {
8994
          module.verbose('Storing instance of modal');
8995
          instance = module;
8996
          $module
8997
            .data(moduleNamespace, instance)
8998
          ;
8999
        },
9000
9001
        create: {
9002
          dimmer: function() {
9003
            var
9004
              defaultSettings = {
9005
                debug      : settings.debug,
9006
                dimmerName : 'modals'
9007
              },
9008
              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
9009
            ;
9010
            if($.fn.dimmer === undefined) {
9011
              module.error(error.dimmer);
9012
              return;
9013
            }
9014
            module.debug('Creating dimmer');
9015
            $dimmable = $context.dimmer(dimmerSettings);
9016
            if(settings.detachable) {
9017
              module.verbose('Modal is detachable, moving content into dimmer');
9018
              $dimmable.dimmer('add content', $module);
9019
            }
9020
            else {
9021
              module.set.undetached();
9022
            }
9023
            $dimmer = $dimmable.dimmer('get dimmer');
9024
          },
9025
          id: function() {
9026
            id = (Math.random().toString(16) + '000000000').substr(2,8);
9027
            elementEventNamespace = '.' + id;
9028
            module.verbose('Creating unique id for element', id);
9029
          }
9030
        },
9031
9032
        destroy: function() {
9033
          module.verbose('Destroying previous modal');
9034
          $module
9035
            .removeData(moduleNamespace)
9036
            .off(eventNamespace)
9037
          ;
9038
          $window.off(elementEventNamespace);
9039
          $dimmer.off(elementEventNamespace);
9040
          $close.off(eventNamespace);
9041
          $context.dimmer('destroy');
9042
        },
9043
9044
        observeChanges: function() {
9045
          if('MutationObserver' in window) {
9046
            observer = new MutationObserver(function(mutations) {
9047
              module.debug('DOM tree modified, refreshing');
9048
              module.refresh();
9049
            });
9050
            observer.observe(element, {
9051
              childList : true,
9052
              subtree   : true
9053
            });
9054
            module.debug('Setting up mutation observer', observer);
9055
          }
9056
        },
9057
9058
        refresh: function() {
9059
          module.remove.scrolling();
9060
          module.cacheSizes();
9061
          module.set.screenHeight();
9062
          module.set.type();
9063
          module.set.position();
9064
        },
9065
9066
        refreshModals: function() {
9067
          $otherModals = $module.siblings(selector.modal);
9068
          $allModals   = $otherModals.add($module);
9069
        },
9070
9071
        attachEvents: function(selector, event) {
9072
          var
9073
            $toggle = $(selector)
9074
          ;
9075
          event = $.isFunction(module[event])
9076
            ? module[event]
9077
            : module.toggle
9078
          ;
9079
          if($toggle.length > 0) {
9080
            module.debug('Attaching modal events to element', selector, event);
9081
            $toggle
9082
              .off(eventNamespace)
9083
              .on('click' + eventNamespace, event)
9084
            ;
9085
          }
9086
          else {
9087
            module.error(error.notFound, selector);
9088
          }
9089
        },
9090
9091
        bind: {
9092
          events: function() {
9093
            module.verbose('Attaching events');
9094
            $module
9095
              .on('click' + eventNamespace, selector.close, module.event.close)
9096
              .on('click' + eventNamespace, selector.approve, module.event.approve)
9097
              .on('click' + eventNamespace, selector.deny, module.event.deny)
9098
            ;
9099
            $window
9100
              .on('resize' + elementEventNamespace, module.event.resize)
9101
            ;
9102
          }
9103
        },
9104
9105
        get: {
9106
          id: function() {
9107
            return (Math.random().toString(16) + '000000000').substr(2,8);
9108
          }
9109
        },
9110
9111
        event: {
9112
          approve: function() {
9113
            if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {
9114
              module.verbose('Approve callback returned false cancelling hide');
9115
              return;
9116
            }
9117
            ignoreRepeatedEvents = true;
9118
            module.hide(function() {
9119
              ignoreRepeatedEvents = false;
9120
            });
9121
          },
9122
          deny: function() {
9123
            if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
9124
              module.verbose('Deny callback returned false cancelling hide');
9125
              return;
9126
            }
9127
            ignoreRepeatedEvents = true;
9128
            module.hide(function() {
9129
              ignoreRepeatedEvents = false;
9130
            });
9131
          },
9132
          close: function() {
9133
            module.hide();
9134
          },
9135
          click: function(event) {
9136
            var
9137
              $target   = $(event.target),
9138
              isInModal = ($target.closest(selector.modal).length > 0),
9139
              isInDOM   = $.contains(document.documentElement, event.target)
9140
            ;
9141
            if(!isInModal && isInDOM) {
9142
              module.debug('Dimmer clicked, hiding all modals');
9143
              if( module.is.active() ) {
9144
                module.remove.clickaway();
9145
                if(settings.allowMultiple) {
9146
                  module.hide();
9147
                }
9148
                else {
9149
                  module.hideAll();
9150
                }
9151
              }
9152
            }
9153
          },
9154
          debounce: function(method, delay) {
9155
            clearTimeout(module.timer);
9156
            module.timer = setTimeout(method, delay);
9157
          },
9158
          keyboard: function(event) {
9159
            var
9160
              keyCode   = event.which,
9161
              escapeKey = 27
9162
            ;
9163
            if(keyCode == escapeKey) {
9164
              if(settings.closable) {
9165
                module.debug('Escape key pressed hiding modal');
9166
                module.hide();
9167
              }
9168
              else {
9169
                module.debug('Escape key pressed, but closable is set to false');
9170
              }
9171
              event.preventDefault();
9172
            }
9173
          },
9174
          resize: function() {
9175
            if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {
9176
              requestAnimationFrame(module.refresh);
9177
            }
9178
          }
9179
        },
9180
9181
        toggle: function() {
9182
          if( module.is.active() || module.is.animating() ) {
9183
            module.hide();
9184
          }
9185
          else {
9186
            module.show();
9187
          }
9188
        },
9189
9190
        show: function(callback) {
9191
          callback = $.isFunction(callback)
9192
            ? callback
9193
            : function(){}
9194
          ;
9195
          module.refreshModals();
9196
          module.set.dimmerSettings();
9197
          module.showModal(callback);
9198
        },
9199
9200
        hide: function(callback) {
9201
          callback = $.isFunction(callback)
9202
            ? callback
9203
            : function(){}
9204
          ;
9205
          module.refreshModals();
9206
          module.hideModal(callback);
9207
        },
9208
9209
        showModal: function(callback) {
9210
          callback = $.isFunction(callback)
9211
            ? callback
9212
            : function(){}
9213
          ;
9214
          if( module.is.animating() || !module.is.active() ) {
9215
9216
            module.showDimmer();
9217
            module.cacheSizes();
9218
            module.set.position();
9219
            module.set.screenHeight();
9220
            module.set.type();
9221
            module.set.clickaway();
9222
9223
            if( !settings.allowMultiple && module.others.active() ) {
9224
              module.hideOthers(module.showModal);
9225
            }
9226
            else {
9227
              settings.onShow.call(element);
9228
              if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
9229
                module.debug('Showing modal with css animations');
9230
                $module
9231
                  .transition({
9232
                    debug       : settings.debug,
9233
                    animation   : settings.transition + ' in',
9234
                    queue       : settings.queue,
9235
                    duration    : settings.duration,
9236
                    useFailSafe : true,
9237
                    onComplete : function() {
9238
                      settings.onVisible.apply(element);
9239
                      if(settings.keyboardShortcuts) {
9240
                        module.add.keyboardShortcuts();
9241
                      }
9242
                      module.save.focus();
9243
                      module.set.active();
9244
                      if(settings.autofocus) {
9245
                        module.set.autofocus();
9246
                      }
9247
                      callback();
9248
                    }
9249
                  })
9250
                ;
9251
              }
9252
              else {
9253
                module.error(error.noTransition);
9254
              }
9255
            }
9256
          }
9257
          else {
9258
            module.debug('Modal is already visible');
9259
          }
9260
        },
9261
9262
        hideModal: function(callback, keepDimmed) {
9263
          callback = $.isFunction(callback)
9264
            ? callback
9265
            : function(){}
9266
          ;
9267
          module.debug('Hiding modal');
9268
          if(settings.onHide.call(element, $(this)) === false) {
9269
            module.verbose('Hide callback returned false cancelling hide');
9270
            return;
9271
          }
9272
9273
          if( module.is.animating() || module.is.active() ) {
9274
            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
9275
              module.remove.active();
9276
              $module
9277
                .transition({
9278
                  debug       : settings.debug,
9279
                  animation   : settings.transition + ' out',
9280
                  queue       : settings.queue,
9281
                  duration    : settings.duration,
9282
                  useFailSafe : true,
9283
                  onStart     : function() {
9284
                    if(!module.others.active() && !keepDimmed) {
9285
                      module.hideDimmer();
9286
                    }
9287
                    if(settings.keyboardShortcuts) {
9288
                      module.remove.keyboardShortcuts();
9289
                    }
9290
                  },
9291
                  onComplete : function() {
9292
                    settings.onHidden.call(element);
9293
                    module.restore.focus();
9294
                    callback();
9295
                  }
9296
                })
9297
              ;
9298
            }
9299
            else {
9300
              module.error(error.noTransition);
9301
            }
9302
          }
9303
        },
9304
9305
        showDimmer: function() {
9306
          if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {
9307
            module.debug('Showing dimmer');
9308
            $dimmable.dimmer('show');
9309
          }
9310
          else {
9311
            module.debug('Dimmer already visible');
9312
          }
9313
        },
9314
9315
        hideDimmer: function() {
9316
          if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {
9317
            $dimmable.dimmer('hide', function() {
9318
              module.remove.clickaway();
9319
              module.remove.screenHeight();
9320
            });
9321
          }
9322
          else {
9323
            module.debug('Dimmer is not visible cannot hide');
9324
            return;
9325
          }
9326
        },
9327
9328
        hideAll: function(callback) {
9329
          var
9330
            $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)
9331
          ;
9332
          callback = $.isFunction(callback)
9333
            ? callback
9334
            : function(){}
9335
          ;
9336
          if( $visibleModals.length > 0 ) {
9337
            module.debug('Hiding all visible modals');
9338
            module.hideDimmer();
9339
            $visibleModals
9340
              .modal('hide modal', callback)
9341
            ;
9342
          }
9343
        },
9344
9345
        hideOthers: function(callback) {
9346
          var
9347
            $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)
9348
          ;
9349
          callback = $.isFunction(callback)
9350
            ? callback
9351
            : function(){}
9352
          ;
9353
          if( $visibleModals.length > 0 ) {
9354
            module.debug('Hiding other modals', $otherModals);
9355
            $visibleModals
9356
              .modal('hide modal', callback, true)
9357
            ;
9358
          }
9359
        },
9360
9361
        others: {
9362
          active: function() {
9363
            return ($otherModals.filter('.' + className.active).length > 0);
9364
          },
9365
          animating: function() {
9366
            return ($otherModals.filter('.' + className.animating).length > 0);
9367
          }
9368
        },
9369
9370
9371
        add: {
9372
          keyboardShortcuts: function() {
9373
            module.verbose('Adding keyboard shortcuts');
9374
            $document
9375
              .on('keyup' + eventNamespace, module.event.keyboard)
9376
            ;
9377
          }
9378
        },
9379
9380
        save: {
9381
          focus: function() {
9382
            $focusedElement = $(document.activeElement).blur();
9383
          }
9384
        },
9385
9386
        restore: {
9387
          focus: function() {
9388
            if($focusedElement && $focusedElement.length > 0) {
9389
              $focusedElement.focus();
9390
            }
9391
          }
9392
        },
9393
9394
        remove: {
9395
          active: function() {
9396
            $module.removeClass(className.active);
9397
          },
9398
          clickaway: function() {
9399
            if(settings.closable) {
9400
              $dimmer
9401
                .off('click' + elementEventNamespace)
9402
              ;
9403
            }
9404
          },
9405
          bodyStyle: function() {
9406
            if($body.attr('style') === '') {
9407
              module.verbose('Removing style attribute');
9408
              $body.removeAttr('style');
9409
            }
9410
          },
9411
          screenHeight: function() {
9412
            module.debug('Removing page height');
9413
            $body
9414
              .css('height', '')
9415
            ;
9416
          },
9417
          keyboardShortcuts: function() {
9418
            module.verbose('Removing keyboard shortcuts');
9419
            $document
9420
              .off('keyup' + eventNamespace)
9421
            ;
9422
          },
9423
          scrolling: function() {
9424
            $dimmable.removeClass(className.scrolling);
9425
            $module.removeClass(className.scrolling);
9426
          }
9427
        },
9428
9429
        cacheSizes: function() {
9430
          var
9431
            modalHeight = $module.outerHeight()
9432
          ;
9433
          if(module.cache === undefined || modalHeight !== 0) {
9434
            module.cache = {
9435
              pageHeight    : $(document).outerHeight(),
9436
              height        : modalHeight + settings.offset,
9437
              contextHeight : (settings.context == 'body')
9438
                ? $(window).height()
9439
                : $dimmable.height()
9440
            };
9441
          }
9442
          module.debug('Caching modal and container sizes', module.cache);
9443
        },
9444
9445
        can: {
9446
          fit: function() {
9447
            return ( ( module.cache.height + (settings.padding * 2) ) < module.cache.contextHeight);
9448
          }
9449
        },
9450
9451
        is: {
9452
          active: function() {
9453
            return $module.hasClass(className.active);
9454
          },
9455
          animating: function() {
9456
            return $module.transition('is supported')
9457
              ? $module.transition('is animating')
9458
              : $module.is(':visible')
9459
            ;
9460
          },
9461
          scrolling: function() {
9462
            return $dimmable.hasClass(className.scrolling);
9463
          },
9464
          modernBrowser: function() {
9465
            // appName for IE11 reports 'Netscape' can no longer use
9466
            return !(window.ActiveXObject || "ActiveXObject" in window);
9467
          }
9468
        },
9469
9470
        set: {
9471
          autofocus: function() {
9472
            var
9473
              $inputs    = $module.find('[tabindex], :input').filter(':visible'),
9474
              $autofocus = $inputs.filter('[autofocus]'),
9475
              $input     = ($autofocus.length > 0)
9476
                ? $autofocus.first()
9477
                : $inputs.first()
9478
            ;
9479
            if($input.length > 0) {
9480
              $input.focus();
9481
            }
9482
          },
9483
          clickaway: function() {
9484
            if(settings.closable) {
9485
              $dimmer
9486
                .on('click' + elementEventNamespace, module.event.click)
9487
              ;
9488
            }
9489
          },
9490
          dimmerSettings: function() {
9491
            if($.fn.dimmer === undefined) {
9492
              module.error(error.dimmer);
9493
              return;
9494
            }
9495
            var
9496
              defaultSettings = {
9497
                debug      : settings.debug,
9498
                dimmerName : 'modals',
9499
                variation  : false,
9500
                closable   : 'auto',
9501
                duration   : {
9502
                  show     : settings.duration,
9503
                  hide     : settings.duration
9504
                }
9505
              },
9506
              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
9507
            ;
9508
            if(settings.inverted) {
9509
              dimmerSettings.variation = (dimmerSettings.variation !== undefined)
9510
                ? dimmerSettings.variation + ' inverted'
9511
                : 'inverted'
9512
              ;
9513
              $dimmer.addClass(className.inverted);
9514
            }
9515
            else {
9516
              $dimmer.removeClass(className.inverted);
9517
            }
9518
            if(settings.blurring) {
9519
              $dimmable.addClass(className.blurring);
9520
            }
9521
            else {
9522
              $dimmable.removeClass(className.blurring);
9523
            }
9524
            $context.dimmer('setting', dimmerSettings);
9525
          },
9526
          screenHeight: function() {
9527
            if( module.can.fit() ) {
9528
              $body.css('height', '');
9529
            }
9530
            else {
9531
              module.debug('Modal is taller than page content, resizing page height');
9532
              $body
9533
                .css('height', module.cache.height + (settings.padding * 2) )
9534
              ;
9535
            }
9536
          },
9537
          active: function() {
9538
            $module.addClass(className.active);
9539
          },
9540
          scrolling: function() {
9541
            $dimmable.addClass(className.scrolling);
9542
            $module.addClass(className.scrolling);
9543
          },
9544
          type: function() {
9545
            if(module.can.fit()) {
9546
              module.verbose('Modal fits on screen');
9547
              if(!module.others.active() && !module.others.animating()) {
9548
                module.remove.scrolling();
9549
              }
9550
            }
9551
            else {
9552
              module.verbose('Modal cannot fit on screen setting to scrolling');
9553
              module.set.scrolling();
9554
            }
9555
          },
9556
          position: function() {
9557
            module.verbose('Centering modal on page', module.cache);
9558
            if(module.can.fit()) {
9559
              $module
9560
                .css({
9561
                  top: '',
9562
                  marginTop: -(module.cache.height / 2)
9563
                })
9564
              ;
9565
            }
9566
            else {
9567
              $module
9568
                .css({
9569
                  marginTop : '',
9570
                  top       : $document.scrollTop()
9571
                })
9572
              ;
9573
            }
9574
          },
9575
          undetached: function() {
9576
            $dimmable.addClass(className.undetached);
9577
          }
9578
        },
9579
9580
        setting: function(name, value) {
9581
          module.debug('Changing setting', name, value);
9582
          if( $.isPlainObject(name) ) {
9583
            $.extend(true, settings, name);
9584
          }
9585
          else if(value !== undefined) {
9586
            if($.isPlainObject(settings[name])) {
9587
              $.extend(true, settings[name], value);
9588
            }
9589
            else {
9590
              settings[name] = value;
9591
            }
9592
          }
9593
          else {
9594
            return settings[name];
9595
          }
9596
        },
9597
        internal: function(name, value) {
9598
          if( $.isPlainObject(name) ) {
9599
            $.extend(true, module, name);
9600
          }
9601
          else if(value !== undefined) {
9602
            module[name] = value;
9603
          }
9604
          else {
9605
            return module[name];
9606
          }
9607
        },
9608
        debug: function() {
9609
          if(!settings.silent && settings.debug) {
9610
            if(settings.performance) {
9611
              module.performance.log(arguments);
9612
            }
9613
            else {
9614
              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
9615
              module.debug.apply(console, arguments);
9616
            }
9617
          }
9618
        },
9619
        verbose: function() {
9620
          if(!settings.silent && settings.verbose && settings.debug) {
9621
            if(settings.performance) {
9622
              module.performance.log(arguments);
9623
            }
9624
            else {
9625
              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
9626
              module.verbose.apply(console, arguments);
9627
            }
9628
          }
9629
        },
9630
        error: function() {
9631
          if(!settings.silent) {
9632
            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
9633
            module.error.apply(console, arguments);
9634
          }
9635
        },
9636
        performance: {
9637
          log: function(message) {
9638
            var
9639
              currentTime,
9640
              executionTime,
9641
              previousTime
9642
            ;
9643
            if(settings.performance) {
9644
              currentTime   = new Date().getTime();
9645
              previousTime  = time || currentTime;
9646
              executionTime = currentTime - previousTime;
9647
              time          = currentTime;
9648
              performance.push({
9649
                'Name'           : message[0],
9650
                'Arguments'      : [].slice.call(message, 1) || '',
9651
                'Element'        : element,
9652
                'Execution Time' : executionTime
9653
              });
9654
            }
9655
            clearTimeout(module.performance.timer);
9656
            module.performance.timer = setTimeout(module.performance.display, 500);
9657
          },
9658
          display: function() {
9659
            var
9660
              title = settings.name + ':',
9661
              totalTime = 0
9662
            ;
9663
            time = false;
9664
            clearTimeout(module.performance.timer);
9665
            $.each(performance, function(index, data) {
9666
              totalTime += data['Execution Time'];
9667
            });
9668
            title += ' ' + totalTime + 'ms';
9669
            if(moduleSelector) {
9670
              title += ' \'' + moduleSelector + '\'';
9671
            }
9672
            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
9673
              console.groupCollapsed(title);
9674
              if(console.table) {
9675
                console.table(performance);
9676
              }
9677
              else {
9678
                $.each(performance, function(index, data) {
9679
                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
9680
                });
9681
              }
9682
              console.groupEnd();
9683
            }
9684
            performance = [];
9685
          }
9686
        },
9687
        invoke: function(query, passedArguments, context) {
9688
          var
9689
            object = instance,
9690
            maxDepth,
9691
            found,
9692
            response
9693
          ;
9694
          passedArguments = passedArguments || queryArguments;
9695
          context         = element         || context;
9696
          if(typeof query == 'string' && object !== undefined) {
9697
            query    = query.split(/[\. ]/);
9698
            maxDepth = query.length - 1;
9699
            $.each(query, function(depth, value) {
9700
              var camelCaseValue = (depth != maxDepth)
9701
                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
9702
                : query
9703
              ;
9704
              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
9705
                object = object[camelCaseValue];
9706
              }
9707
              else if( object[camelCaseValue] !== undefined ) {
9708
                found = object[camelCaseValue];
9709
                return false;
9710
              }
9711
              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
9712
                object = object[value];
9713
              }
9714
              else if( object[value] !== undefined ) {
9715
                found = object[value];
9716
                return false;
9717
              }
9718
              else {
9719
                return false;
9720
              }
9721
            });
9722
          }
9723
          if ( $.isFunction( found ) ) {
9724
            response = found.apply(context, passedArguments);
9725
          }
9726
          else if(found !== undefined) {
9727
            response = found;
9728
          }
9729
          if($.isArray(returnedValue)) {
9730
            returnedValue.push(response);
9731
          }
9732
          else if(returnedValue !== undefined) {
9733
            returnedValue = [returnedValue, response];
9734
          }
9735
          else if(response !== undefined) {
9736
            returnedValue = response;
9737
          }
9738
          return found;
9739
        }
9740
      };
9741
9742
      if(methodInvoked) {
9743
        if(instance === undefined) {
9744
          module.initialize();
9745
        }
9746
        module.invoke(query);
9747
      }
9748
      else {
9749
        if(instance !== undefined) {
9750
          instance.invoke('destroy');
9751
        }
9752
        module.initialize();
9753
      }
9754
    })
9755
  ;
9756
9757
  return (returnedValue !== undefined)
9758
    ? returnedValue
9759
    : this
9760
  ;
9761
};
9762
9763
$.fn.modal.settings = {
9764
9765
  name           : 'Modal',
9766
  namespace      : 'modal',
9767
9768
  silent         : false,
9769
  debug          : false,
9770
  verbose        : false,
9771
  performance    : true,
9772
9773
  observeChanges : false,
9774
9775
  allowMultiple  : false,
9776
  detachable     : true,
9777
  closable       : true,
9778
  autofocus      : true,
9779
9780
  inverted       : false,
9781
  blurring       : false,
9782
9783
  dimmerSettings : {
9784
    closable : false,
9785
    useCSS   : true
9786
  },
9787
9788
  // whether to use keyboard shortcuts
9789
  keyboardShortcuts: true,
9790
9791
  context    : 'body',
9792
9793
  queue      : false,
9794
  duration   : 500,
9795
  offset     : 0,
9796
  transition : 'scale',
9797
9798
  // padding with edge of page
9799
  padding    : 50,
9800
9801
  // called before show animation
9802
  onShow     : function(){},
9803
9804
  // called after show animation
9805
  onVisible  : function(){},
9806
9807
  // called before hide animation
9808
  onHide     : function(){ return true; },
9809
9810
  // called after hide animation
9811
  onHidden   : function(){},
9812
9813
  // called after approve selector match
9814
  onApprove  : function(){ return true; },
9815
9816
  // called after deny selector match
9817
  onDeny     : function(){ return true; },
9818
9819
  selector    : {
9820
    close    : '> .close',
9821
    approve  : '.actions .positive, .actions .approve, .actions .ok',
9822
    deny     : '.actions .negative, .actions .deny, .actions .cancel',
9823
    modal    : '.ui.modal'
9824
  },
9825
  error : {
9826
    dimmer    : 'UI Dimmer, a required component is not included in this page',
9827
    method    : 'The method you called is not defined.',
9828
    notFound  : 'The element you specified could not be found'
9829
  },
9830
  className : {
9831
    active     : 'active',
9832
    animating  : 'animating',
9833
    blurring   : 'blurring',
9834
    inverted   : 'inverted',
9835
    scrolling  : 'scrolling',
9836
    undetached : 'undetached'
9837
  }
9838
};
9839
9840
9841
})( jQuery, window, document );
9842
9843
/*!
9844
 * # Semantic UI 2.2.11 - Nag

public/lib/semantic/components/modal.js 1 location

@@ 11-946 (lines=936) @@
8
 *
9
 */
10
11
;(function ($, window, document, undefined) {
12
13
"use strict";
14
15
window = (typeof window != 'undefined' && window.Math == Math)
16
  ? window
17
  : (typeof self != 'undefined' && self.Math == Math)
18
    ? self
19
    : Function('return this')()
20
;
21
22
$.fn.modal = function(parameters) {
23
  var
24
    $allModules    = $(this),
25
    $window        = $(window),
26
    $document      = $(document),
27
    $body          = $('body'),
28
29
    moduleSelector = $allModules.selector || '',
30
31
    time           = new Date().getTime(),
32
    performance    = [],
33
34
    query          = arguments[0],
35
    methodInvoked  = (typeof query == 'string'),
36
    queryArguments = [].slice.call(arguments, 1),
37
38
    requestAnimationFrame = window.requestAnimationFrame
39
      || window.mozRequestAnimationFrame
40
      || window.webkitRequestAnimationFrame
41
      || window.msRequestAnimationFrame
42
      || function(callback) { setTimeout(callback, 0); },
43
44
    returnedValue
45
  ;
46
47
  $allModules
48
    .each(function() {
49
      var
50
        settings    = ( $.isPlainObject(parameters) )
51
          ? $.extend(true, {}, $.fn.modal.settings, parameters)
52
          : $.extend({}, $.fn.modal.settings),
53
54
        selector        = settings.selector,
55
        className       = settings.className,
56
        namespace       = settings.namespace,
57
        error           = settings.error,
58
59
        eventNamespace  = '.' + namespace,
60
        moduleNamespace = 'module-' + namespace,
61
62
        $module         = $(this),
63
        $context        = $(settings.context),
64
        $close          = $module.find(selector.close),
65
66
        $allModals,
67
        $otherModals,
68
        $focusedElement,
69
        $dimmable,
70
        $dimmer,
71
72
        element         = this,
73
        instance        = $module.data(moduleNamespace),
74
75
        ignoreRepeatedEvents = false,
76
77
        elementEventNamespace,
78
        id,
79
        observer,
80
        module
81
      ;
82
      module  = {
83
84
        initialize: function() {
85
          module.verbose('Initializing dimmer', $context);
86
87
          module.create.id();
88
          module.create.dimmer();
89
          module.refreshModals();
90
91
          module.bind.events();
92
          if(settings.observeChanges) {
93
            module.observeChanges();
94
          }
95
          module.instantiate();
96
        },
97
98
        instantiate: function() {
99
          module.verbose('Storing instance of modal');
100
          instance = module;
101
          $module
102
            .data(moduleNamespace, instance)
103
          ;
104
        },
105
106
        create: {
107
          dimmer: function() {
108
            var
109
              defaultSettings = {
110
                debug      : settings.debug,
111
                dimmerName : 'modals'
112
              },
113
              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
114
            ;
115
            if($.fn.dimmer === undefined) {
116
              module.error(error.dimmer);
117
              return;
118
            }
119
            module.debug('Creating dimmer');
120
            $dimmable = $context.dimmer(dimmerSettings);
121
            if(settings.detachable) {
122
              module.verbose('Modal is detachable, moving content into dimmer');
123
              $dimmable.dimmer('add content', $module);
124
            }
125
            else {
126
              module.set.undetached();
127
            }
128
            $dimmer = $dimmable.dimmer('get dimmer');
129
          },
130
          id: function() {
131
            id = (Math.random().toString(16) + '000000000').substr(2,8);
132
            elementEventNamespace = '.' + id;
133
            module.verbose('Creating unique id for element', id);
134
          }
135
        },
136
137
        destroy: function() {
138
          module.verbose('Destroying previous modal');
139
          $module
140
            .removeData(moduleNamespace)
141
            .off(eventNamespace)
142
          ;
143
          $window.off(elementEventNamespace);
144
          $dimmer.off(elementEventNamespace);
145
          $close.off(eventNamespace);
146
          $context.dimmer('destroy');
147
        },
148
149
        observeChanges: function() {
150
          if('MutationObserver' in window) {
151
            observer = new MutationObserver(function(mutations) {
152
              module.debug('DOM tree modified, refreshing');
153
              module.refresh();
154
            });
155
            observer.observe(element, {
156
              childList : true,
157
              subtree   : true
158
            });
159
            module.debug('Setting up mutation observer', observer);
160
          }
161
        },
162
163
        refresh: function() {
164
          module.remove.scrolling();
165
          module.cacheSizes();
166
          module.set.screenHeight();
167
          module.set.type();
168
          module.set.position();
169
        },
170
171
        refreshModals: function() {
172
          $otherModals = $module.siblings(selector.modal);
173
          $allModals   = $otherModals.add($module);
174
        },
175
176
        attachEvents: function(selector, event) {
177
          var
178
            $toggle = $(selector)
179
          ;
180
          event = $.isFunction(module[event])
181
            ? module[event]
182
            : module.toggle
183
          ;
184
          if($toggle.length > 0) {
185
            module.debug('Attaching modal events to element', selector, event);
186
            $toggle
187
              .off(eventNamespace)
188
              .on('click' + eventNamespace, event)
189
            ;
190
          }
191
          else {
192
            module.error(error.notFound, selector);
193
          }
194
        },
195
196
        bind: {
197
          events: function() {
198
            module.verbose('Attaching events');
199
            $module
200
              .on('click' + eventNamespace, selector.close, module.event.close)
201
              .on('click' + eventNamespace, selector.approve, module.event.approve)
202
              .on('click' + eventNamespace, selector.deny, module.event.deny)
203
            ;
204
            $window
205
              .on('resize' + elementEventNamespace, module.event.resize)
206
            ;
207
          }
208
        },
209
210
        get: {
211
          id: function() {
212
            return (Math.random().toString(16) + '000000000').substr(2,8);
213
          }
214
        },
215
216
        event: {
217
          approve: function() {
218
            if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {
219
              module.verbose('Approve callback returned false cancelling hide');
220
              return;
221
            }
222
            ignoreRepeatedEvents = true;
223
            module.hide(function() {
224
              ignoreRepeatedEvents = false;
225
            });
226
          },
227
          deny: function() {
228
            if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
229
              module.verbose('Deny callback returned false cancelling hide');
230
              return;
231
            }
232
            ignoreRepeatedEvents = true;
233
            module.hide(function() {
234
              ignoreRepeatedEvents = false;
235
            });
236
          },
237
          close: function() {
238
            module.hide();
239
          },
240
          click: function(event) {
241
            var
242
              $target   = $(event.target),
243
              isInModal = ($target.closest(selector.modal).length > 0),
244
              isInDOM   = $.contains(document.documentElement, event.target)
245
            ;
246
            if(!isInModal && isInDOM) {
247
              module.debug('Dimmer clicked, hiding all modals');
248
              if( module.is.active() ) {
249
                module.remove.clickaway();
250
                if(settings.allowMultiple) {
251
                  module.hide();
252
                }
253
                else {
254
                  module.hideAll();
255
                }
256
              }
257
            }
258
          },
259
          debounce: function(method, delay) {
260
            clearTimeout(module.timer);
261
            module.timer = setTimeout(method, delay);
262
          },
263
          keyboard: function(event) {
264
            var
265
              keyCode   = event.which,
266
              escapeKey = 27
267
            ;
268
            if(keyCode == escapeKey) {
269
              if(settings.closable) {
270
                module.debug('Escape key pressed hiding modal');
271
                module.hide();
272
              }
273
              else {
274
                module.debug('Escape key pressed, but closable is set to false');
275
              }
276
              event.preventDefault();
277
            }
278
          },
279
          resize: function() {
280
            if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {
281
              requestAnimationFrame(module.refresh);
282
            }
283
          }
284
        },
285
286
        toggle: function() {
287
          if( module.is.active() || module.is.animating() ) {
288
            module.hide();
289
          }
290
          else {
291
            module.show();
292
          }
293
        },
294
295
        show: function(callback) {
296
          callback = $.isFunction(callback)
297
            ? callback
298
            : function(){}
299
          ;
300
          module.refreshModals();
301
          module.set.dimmerSettings();
302
          module.showModal(callback);
303
        },
304
305
        hide: function(callback) {
306
          callback = $.isFunction(callback)
307
            ? callback
308
            : function(){}
309
          ;
310
          module.refreshModals();
311
          module.hideModal(callback);
312
        },
313
314
        showModal: function(callback) {
315
          callback = $.isFunction(callback)
316
            ? callback
317
            : function(){}
318
          ;
319
          if( module.is.animating() || !module.is.active() ) {
320
321
            module.showDimmer();
322
            module.cacheSizes();
323
            module.set.position();
324
            module.set.screenHeight();
325
            module.set.type();
326
            module.set.clickaway();
327
328
            if( !settings.allowMultiple && module.others.active() ) {
329
              module.hideOthers(module.showModal);
330
            }
331
            else {
332
              settings.onShow.call(element);
333
              if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
334
                module.debug('Showing modal with css animations');
335
                $module
336
                  .transition({
337
                    debug       : settings.debug,
338
                    animation   : settings.transition + ' in',
339
                    queue       : settings.queue,
340
                    duration    : settings.duration,
341
                    useFailSafe : true,
342
                    onComplete : function() {
343
                      settings.onVisible.apply(element);
344
                      if(settings.keyboardShortcuts) {
345
                        module.add.keyboardShortcuts();
346
                      }
347
                      module.save.focus();
348
                      module.set.active();
349
                      if(settings.autofocus) {
350
                        module.set.autofocus();
351
                      }
352
                      callback();
353
                    }
354
                  })
355
                ;
356
              }
357
              else {
358
                module.error(error.noTransition);
359
              }
360
            }
361
          }
362
          else {
363
            module.debug('Modal is already visible');
364
          }
365
        },
366
367
        hideModal: function(callback, keepDimmed) {
368
          callback = $.isFunction(callback)
369
            ? callback
370
            : function(){}
371
          ;
372
          module.debug('Hiding modal');
373
          if(settings.onHide.call(element, $(this)) === false) {
374
            module.verbose('Hide callback returned false cancelling hide');
375
            return;
376
          }
377
378
          if( module.is.animating() || module.is.active() ) {
379
            if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
380
              module.remove.active();
381
              $module
382
                .transition({
383
                  debug       : settings.debug,
384
                  animation   : settings.transition + ' out',
385
                  queue       : settings.queue,
386
                  duration    : settings.duration,
387
                  useFailSafe : true,
388
                  onStart     : function() {
389
                    if(!module.others.active() && !keepDimmed) {
390
                      module.hideDimmer();
391
                    }
392
                    if(settings.keyboardShortcuts) {
393
                      module.remove.keyboardShortcuts();
394
                    }
395
                  },
396
                  onComplete : function() {
397
                    settings.onHidden.call(element);
398
                    module.restore.focus();
399
                    callback();
400
                  }
401
                })
402
              ;
403
            }
404
            else {
405
              module.error(error.noTransition);
406
            }
407
          }
408
        },
409
410
        showDimmer: function() {
411
          if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {
412
            module.debug('Showing dimmer');
413
            $dimmable.dimmer('show');
414
          }
415
          else {
416
            module.debug('Dimmer already visible');
417
          }
418
        },
419
420
        hideDimmer: function() {
421
          if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {
422
            $dimmable.dimmer('hide', function() {
423
              module.remove.clickaway();
424
              module.remove.screenHeight();
425
            });
426
          }
427
          else {
428
            module.debug('Dimmer is not visible cannot hide');
429
            return;
430
          }
431
        },
432
433
        hideAll: function(callback) {
434
          var
435
            $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)
436
          ;
437
          callback = $.isFunction(callback)
438
            ? callback
439
            : function(){}
440
          ;
441
          if( $visibleModals.length > 0 ) {
442
            module.debug('Hiding all visible modals');
443
            module.hideDimmer();
444
            $visibleModals
445
              .modal('hide modal', callback)
446
            ;
447
          }
448
        },
449
450
        hideOthers: function(callback) {
451
          var
452
            $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)
453
          ;
454
          callback = $.isFunction(callback)
455
            ? callback
456
            : function(){}
457
          ;
458
          if( $visibleModals.length > 0 ) {
459
            module.debug('Hiding other modals', $otherModals);
460
            $visibleModals
461
              .modal('hide modal', callback, true)
462
            ;
463
          }
464
        },
465
466
        others: {
467
          active: function() {
468
            return ($otherModals.filter('.' + className.active).length > 0);
469
          },
470
          animating: function() {
471
            return ($otherModals.filter('.' + className.animating).length > 0);
472
          }
473
        },
474
475
476
        add: {
477
          keyboardShortcuts: function() {
478
            module.verbose('Adding keyboard shortcuts');
479
            $document
480
              .on('keyup' + eventNamespace, module.event.keyboard)
481
            ;
482
          }
483
        },
484
485
        save: {
486
          focus: function() {
487
            $focusedElement = $(document.activeElement).blur();
488
          }
489
        },
490
491
        restore: {
492
          focus: function() {
493
            if($focusedElement && $focusedElement.length > 0) {
494
              $focusedElement.focus();
495
            }
496
          }
497
        },
498
499
        remove: {
500
          active: function() {
501
            $module.removeClass(className.active);
502
          },
503
          clickaway: function() {
504
            if(settings.closable) {
505
              $dimmer
506
                .off('click' + elementEventNamespace)
507
              ;
508
            }
509
          },
510
          bodyStyle: function() {
511
            if($body.attr('style') === '') {
512
              module.verbose('Removing style attribute');
513
              $body.removeAttr('style');
514
            }
515
          },
516
          screenHeight: function() {
517
            module.debug('Removing page height');
518
            $body
519
              .css('height', '')
520
            ;
521
          },
522
          keyboardShortcuts: function() {
523
            module.verbose('Removing keyboard shortcuts');
524
            $document
525
              .off('keyup' + eventNamespace)
526
            ;
527
          },
528
          scrolling: function() {
529
            $dimmable.removeClass(className.scrolling);
530
            $module.removeClass(className.scrolling);
531
          }
532
        },
533
534
        cacheSizes: function() {
535
          var
536
            modalHeight = $module.outerHeight()
537
          ;
538
          if(module.cache === undefined || modalHeight !== 0) {
539
            module.cache = {
540
              pageHeight    : $(document).outerHeight(),
541
              height        : modalHeight + settings.offset,
542
              contextHeight : (settings.context == 'body')
543
                ? $(window).height()
544
                : $dimmable.height()
545
            };
546
          }
547
          module.debug('Caching modal and container sizes', module.cache);
548
        },
549
550
        can: {
551
          fit: function() {
552
            return ( ( module.cache.height + (settings.padding * 2) ) < module.cache.contextHeight);
553
          }
554
        },
555
556
        is: {
557
          active: function() {
558
            return $module.hasClass(className.active);
559
          },
560
          animating: function() {
561
            return $module.transition('is supported')
562
              ? $module.transition('is animating')
563
              : $module.is(':visible')
564
            ;
565
          },
566
          scrolling: function() {
567
            return $dimmable.hasClass(className.scrolling);
568
          },
569
          modernBrowser: function() {
570
            // appName for IE11 reports 'Netscape' can no longer use
571
            return !(window.ActiveXObject || "ActiveXObject" in window);
572
          }
573
        },
574
575
        set: {
576
          autofocus: function() {
577
            var
578
              $inputs    = $module.find('[tabindex], :input').filter(':visible'),
579
              $autofocus = $inputs.filter('[autofocus]'),
580
              $input     = ($autofocus.length > 0)
581
                ? $autofocus.first()
582
                : $inputs.first()
583
            ;
584
            if($input.length > 0) {
585
              $input.focus();
586
            }
587
          },
588
          clickaway: function() {
589
            if(settings.closable) {
590
              $dimmer
591
                .on('click' + elementEventNamespace, module.event.click)
592
              ;
593
            }
594
          },
595
          dimmerSettings: function() {
596
            if($.fn.dimmer === undefined) {
597
              module.error(error.dimmer);
598
              return;
599
            }
600
            var
601
              defaultSettings = {
602
                debug      : settings.debug,
603
                dimmerName : 'modals',
604
                variation  : false,
605
                closable   : 'auto',
606
                duration   : {
607
                  show     : settings.duration,
608
                  hide     : settings.duration
609
                }
610
              },
611
              dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
612
            ;
613
            if(settings.inverted) {
614
              dimmerSettings.variation = (dimmerSettings.variation !== undefined)
615
                ? dimmerSettings.variation + ' inverted'
616
                : 'inverted'
617
              ;
618
              $dimmer.addClass(className.inverted);
619
            }
620
            else {
621
              $dimmer.removeClass(className.inverted);
622
            }
623
            if(settings.blurring) {
624
              $dimmable.addClass(className.blurring);
625
            }
626
            else {
627
              $dimmable.removeClass(className.blurring);
628
            }
629
            $context.dimmer('setting', dimmerSettings);
630
          },
631
          screenHeight: function() {
632
            if( module.can.fit() ) {
633
              $body.css('height', '');
634
            }
635
            else {
636
              module.debug('Modal is taller than page content, resizing page height');
637
              $body
638
                .css('height', module.cache.height + (settings.padding * 2) )
639
              ;
640
            }
641
          },
642
          active: function() {
643
            $module.addClass(className.active);
644
          },
645
          scrolling: function() {
646
            $dimmable.addClass(className.scrolling);
647
            $module.addClass(className.scrolling);
648
          },
649
          type: function() {
650
            if(module.can.fit()) {
651
              module.verbose('Modal fits on screen');
652
              if(!module.others.active() && !module.others.animating()) {
653
                module.remove.scrolling();
654
              }
655
            }
656
            else {
657
              module.verbose('Modal cannot fit on screen setting to scrolling');
658
              module.set.scrolling();
659
            }
660
          },
661
          position: function() {
662
            module.verbose('Centering modal on page', module.cache);
663
            if(module.can.fit()) {
664
              $module
665
                .css({
666
                  top: '',
667
                  marginTop: -(module.cache.height / 2)
668
                })
669
              ;
670
            }
671
            else {
672
              $module
673
                .css({
674
                  marginTop : '',
675
                  top       : $document.scrollTop()
676
                })
677
              ;
678
            }
679
          },
680
          undetached: function() {
681
            $dimmable.addClass(className.undetached);
682
          }
683
        },
684
685
        setting: function(name, value) {
686
          module.debug('Changing setting', name, value);
687
          if( $.isPlainObject(name) ) {
688
            $.extend(true, settings, name);
689
          }
690
          else if(value !== undefined) {
691
            if($.isPlainObject(settings[name])) {
692
              $.extend(true, settings[name], value);
693
            }
694
            else {
695
              settings[name] = value;
696
            }
697
          }
698
          else {
699
            return settings[name];
700
          }
701
        },
702
        internal: function(name, value) {
703
          if( $.isPlainObject(name) ) {
704
            $.extend(true, module, name);
705
          }
706
          else if(value !== undefined) {
707
            module[name] = value;
708
          }
709
          else {
710
            return module[name];
711
          }
712
        },
713
        debug: function() {
714
          if(!settings.silent && settings.debug) {
715
            if(settings.performance) {
716
              module.performance.log(arguments);
717
            }
718
            else {
719
              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
720
              module.debug.apply(console, arguments);
721
            }
722
          }
723
        },
724
        verbose: function() {
725
          if(!settings.silent && settings.verbose && settings.debug) {
726
            if(settings.performance) {
727
              module.performance.log(arguments);
728
            }
729
            else {
730
              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
731
              module.verbose.apply(console, arguments);
732
            }
733
          }
734
        },
735
        error: function() {
736
          if(!settings.silent) {
737
            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
738
            module.error.apply(console, arguments);
739
          }
740
        },
741
        performance: {
742
          log: function(message) {
743
            var
744
              currentTime,
745
              executionTime,
746
              previousTime
747
            ;
748
            if(settings.performance) {
749
              currentTime   = new Date().getTime();
750
              previousTime  = time || currentTime;
751
              executionTime = currentTime - previousTime;
752
              time          = currentTime;
753
              performance.push({
754
                'Name'           : message[0],
755
                'Arguments'      : [].slice.call(message, 1) || '',
756
                'Element'        : element,
757
                'Execution Time' : executionTime
758
              });
759
            }
760
            clearTimeout(module.performance.timer);
761
            module.performance.timer = setTimeout(module.performance.display, 500);
762
          },
763
          display: function() {
764
            var
765
              title = settings.name + ':',
766
              totalTime = 0
767
            ;
768
            time = false;
769
            clearTimeout(module.performance.timer);
770
            $.each(performance, function(index, data) {
771
              totalTime += data['Execution Time'];
772
            });
773
            title += ' ' + totalTime + 'ms';
774
            if(moduleSelector) {
775
              title += ' \'' + moduleSelector + '\'';
776
            }
777
            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
778
              console.groupCollapsed(title);
779
              if(console.table) {
780
                console.table(performance);
781
              }
782
              else {
783
                $.each(performance, function(index, data) {
784
                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
785
                });
786
              }
787
              console.groupEnd();
788
            }
789
            performance = [];
790
          }
791
        },
792
        invoke: function(query, passedArguments, context) {
793
          var
794
            object = instance,
795
            maxDepth,
796
            found,
797
            response
798
          ;
799
          passedArguments = passedArguments || queryArguments;
800
          context         = element         || context;
801
          if(typeof query == 'string' && object !== undefined) {
802
            query    = query.split(/[\. ]/);
803
            maxDepth = query.length - 1;
804
            $.each(query, function(depth, value) {
805
              var camelCaseValue = (depth != maxDepth)
806
                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
807
                : query
808
              ;
809
              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
810
                object = object[camelCaseValue];
811
              }
812
              else if( object[camelCaseValue] !== undefined ) {
813
                found = object[camelCaseValue];
814
                return false;
815
              }
816
              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
817
                object = object[value];
818
              }
819
              else if( object[value] !== undefined ) {
820
                found = object[value];
821
                return false;
822
              }
823
              else {
824
                return false;
825
              }
826
            });
827
          }
828
          if ( $.isFunction( found ) ) {
829
            response = found.apply(context, passedArguments);
830
          }
831
          else if(found !== undefined) {
832
            response = found;
833
          }
834
          if($.isArray(returnedValue)) {
835
            returnedValue.push(response);
836
          }
837
          else if(returnedValue !== undefined) {
838
            returnedValue = [returnedValue, response];
839
          }
840
          else if(response !== undefined) {
841
            returnedValue = response;
842
          }
843
          return found;
844
        }
845
      };
846
847
      if(methodInvoked) {
848
        if(instance === undefined) {
849
          module.initialize();
850
        }
851
        module.invoke(query);
852
      }
853
      else {
854
        if(instance !== undefined) {
855
          instance.invoke('destroy');
856
        }
857
        module.initialize();
858
      }
859
    })
860
  ;
861
862
  return (returnedValue !== undefined)
863
    ? returnedValue
864
    : this
865
  ;
866
};
867
868
$.fn.modal.settings = {
869
870
  name           : 'Modal',
871
  namespace      : 'modal',
872
873
  silent         : false,
874
  debug          : false,
875
  verbose        : false,
876
  performance    : true,
877
878
  observeChanges : false,
879
880
  allowMultiple  : false,
881
  detachable     : true,
882
  closable       : true,
883
  autofocus      : true,
884
885
  inverted       : false,
886
  blurring       : false,
887
888
  dimmerSettings : {
889
    closable : false,
890
    useCSS   : true
891
  },
892
893
  // whether to use keyboard shortcuts
894
  keyboardShortcuts: true,
895
896
  context    : 'body',
897
898
  queue      : false,
899
  duration   : 500,
900
  offset     : 0,
901
  transition : 'scale',
902
903
  // padding with edge of page
904
  padding    : 50,
905
906
  // called before show animation
907
  onShow     : function(){},
908
909
  // called after show animation
910
  onVisible  : function(){},
911
912
  // called before hide animation
913
  onHide     : function(){ return true; },
914
915
  // called after hide animation
916
  onHidden   : function(){},
917
918
  // called after approve selector match
919
  onApprove  : function(){ return true; },
920
921
  // called after deny selector match
922
  onDeny     : function(){ return true; },
923
924
  selector    : {
925
    close    : '> .close',
926
    approve  : '.actions .positive, .actions .approve, .actions .ok',
927
    deny     : '.actions .negative, .actions .deny, .actions .cancel',
928
    modal    : '.ui.modal'
929
  },
930
  error : {
931
    dimmer    : 'UI Dimmer, a required component is not included in this page',
932
    method    : 'The method you called is not defined.',
933
    notFound  : 'The element you specified could not be found'
934
  },
935
  className : {
936
    active     : 'active',
937
    animating  : 'animating',
938
    blurring   : 'blurring',
939
    inverted   : 'inverted',
940
    scrolling  : 'scrolling',
941
    undetached : 'undetached'
942
  }
943
};
944
945
946
})( jQuery, window, document );
947