Code Duplication    Length = 698-698 lines in 2 locations

public/lib/semantic/semantic.js 1 location

@@ 3659-4356 (lines=698) @@
3656
 *
3657
 */
3658
3659
;(function ($, window, document, undefined) {
3660
3661
"use strict";
3662
3663
window = (typeof window != 'undefined' && window.Math == Math)
3664
  ? window
3665
  : (typeof self != 'undefined' && self.Math == Math)
3666
    ? self
3667
    : Function('return this')()
3668
;
3669
3670
$.fn.dimmer = function(parameters) {
3671
  var
3672
    $allModules     = $(this),
3673
3674
    time            = new Date().getTime(),
3675
    performance     = [],
3676
3677
    query           = arguments[0],
3678
    methodInvoked   = (typeof query == 'string'),
3679
    queryArguments  = [].slice.call(arguments, 1),
3680
3681
    returnedValue
3682
  ;
3683
3684
  $allModules
3685
    .each(function() {
3686
      var
3687
        settings        = ( $.isPlainObject(parameters) )
3688
          ? $.extend(true, {}, $.fn.dimmer.settings, parameters)
3689
          : $.extend({}, $.fn.dimmer.settings),
3690
3691
        selector        = settings.selector,
3692
        namespace       = settings.namespace,
3693
        className       = settings.className,
3694
        error           = settings.error,
3695
3696
        eventNamespace  = '.' + namespace,
3697
        moduleNamespace = 'module-' + namespace,
3698
        moduleSelector  = $allModules.selector || '',
3699
3700
        clickEvent      = ('ontouchstart' in document.documentElement)
3701
          ? 'touchstart'
3702
          : 'click',
3703
3704
        $module = $(this),
3705
        $dimmer,
3706
        $dimmable,
3707
3708
        element   = this,
3709
        instance  = $module.data(moduleNamespace),
3710
        module
3711
      ;
3712
3713
      module = {
3714
3715
        preinitialize: function() {
3716
          if( module.is.dimmer() ) {
3717
3718
            $dimmable = $module.parent();
3719
            $dimmer   = $module;
3720
          }
3721
          else {
3722
            $dimmable = $module;
3723
            if( module.has.dimmer() ) {
3724
              if(settings.dimmerName) {
3725
                $dimmer = $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName);
3726
              }
3727
              else {
3728
                $dimmer = $dimmable.find(selector.dimmer);
3729
              }
3730
            }
3731
            else {
3732
              $dimmer = module.create();
3733
            }
3734
            module.set.variation();
3735
          }
3736
        },
3737
3738
        initialize: function() {
3739
          module.debug('Initializing dimmer', settings);
3740
3741
          module.bind.events();
3742
          module.set.dimmable();
3743
          module.instantiate();
3744
        },
3745
3746
        instantiate: function() {
3747
          module.verbose('Storing instance of module', module);
3748
          instance = module;
3749
          $module
3750
            .data(moduleNamespace, instance)
3751
          ;
3752
        },
3753
3754
        destroy: function() {
3755
          module.verbose('Destroying previous module', $dimmer);
3756
          module.unbind.events();
3757
          module.remove.variation();
3758
          $dimmable
3759
            .off(eventNamespace)
3760
          ;
3761
        },
3762
3763
        bind: {
3764
          events: function() {
3765
            if(settings.on == 'hover') {
3766
              $dimmable
3767
                .on('mouseenter' + eventNamespace, module.show)
3768
                .on('mouseleave' + eventNamespace, module.hide)
3769
              ;
3770
            }
3771
            else if(settings.on == 'click') {
3772
              $dimmable
3773
                .on(clickEvent + eventNamespace, module.toggle)
3774
              ;
3775
            }
3776
            if( module.is.page() ) {
3777
              module.debug('Setting as a page dimmer', $dimmable);
3778
              module.set.pageDimmer();
3779
            }
3780
3781
            if( module.is.closable() ) {
3782
              module.verbose('Adding dimmer close event', $dimmer);
3783
              $dimmable
3784
                .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)
3785
              ;
3786
            }
3787
          }
3788
        },
3789
3790
        unbind: {
3791
          events: function() {
3792
            $module
3793
              .removeData(moduleNamespace)
3794
            ;
3795
            $dimmable
3796
              .off(eventNamespace)
3797
            ;
3798
          }
3799
        },
3800
3801
        event: {
3802
          click: function(event) {
3803
            module.verbose('Determining if event occured on dimmer', event);
3804
            if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) {
3805
              module.hide();
3806
              event.stopImmediatePropagation();
3807
            }
3808
          }
3809
        },
3810
3811
        addContent: function(element) {
3812
          var
3813
            $content = $(element)
3814
          ;
3815
          module.debug('Add content to dimmer', $content);
3816
          if($content.parent()[0] !== $dimmer[0]) {
3817
            $content.detach().appendTo($dimmer);
3818
          }
3819
        },
3820
3821
        create: function() {
3822
          var
3823
            $element = $( settings.template.dimmer() )
3824
          ;
3825
          if(settings.dimmerName) {
3826
            module.debug('Creating named dimmer', settings.dimmerName);
3827
            $element.addClass(settings.dimmerName);
3828
          }
3829
          $element
3830
            .appendTo($dimmable)
3831
          ;
3832
          return $element;
3833
        },
3834
3835
        show: function(callback) {
3836
          callback = $.isFunction(callback)
3837
            ? callback
3838
            : function(){}
3839
          ;
3840
          module.debug('Showing dimmer', $dimmer, settings);
3841
          if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {
3842
            module.animate.show(callback);
3843
            settings.onShow.call(element);
3844
            settings.onChange.call(element);
3845
          }
3846
          else {
3847
            module.debug('Dimmer is already shown or disabled');
3848
          }
3849
        },
3850
3851
        hide: function(callback) {
3852
          callback = $.isFunction(callback)
3853
            ? callback
3854
            : function(){}
3855
          ;
3856
          if( module.is.dimmed() || module.is.animating() ) {
3857
            module.debug('Hiding dimmer', $dimmer);
3858
            module.animate.hide(callback);
3859
            settings.onHide.call(element);
3860
            settings.onChange.call(element);
3861
          }
3862
          else {
3863
            module.debug('Dimmer is not visible');
3864
          }
3865
        },
3866
3867
        toggle: function() {
3868
          module.verbose('Toggling dimmer visibility', $dimmer);
3869
          if( !module.is.dimmed() ) {
3870
            module.show();
3871
          }
3872
          else {
3873
            module.hide();
3874
          }
3875
        },
3876
3877
        animate: {
3878
          show: function(callback) {
3879
            callback = $.isFunction(callback)
3880
              ? callback
3881
              : function(){}
3882
            ;
3883
            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
3884
              if(settings.opacity !== 'auto') {
3885
                module.set.opacity();
3886
              }
3887
              $dimmer
3888
                .transition({
3889
                  animation   : settings.transition + ' in',
3890
                  queue       : false,
3891
                  duration    : module.get.duration(),
3892
                  useFailSafe : true,
3893
                  onStart     : function() {
3894
                    module.set.dimmed();
3895
                  },
3896
                  onComplete  : function() {
3897
                    module.set.active();
3898
                    callback();
3899
                  }
3900
                })
3901
              ;
3902
            }
3903
            else {
3904
              module.verbose('Showing dimmer animation with javascript');
3905
              module.set.dimmed();
3906
              if(settings.opacity == 'auto') {
3907
                settings.opacity = 0.8;
3908
              }
3909
              $dimmer
3910
                .stop()
3911
                .css({
3912
                  opacity : 0,
3913
                  width   : '100%',
3914
                  height  : '100%'
3915
                })
3916
                .fadeTo(module.get.duration(), settings.opacity, function() {
3917
                  $dimmer.removeAttr('style');
3918
                  module.set.active();
3919
                  callback();
3920
                })
3921
              ;
3922
            }
3923
          },
3924
          hide: function(callback) {
3925
            callback = $.isFunction(callback)
3926
              ? callback
3927
              : function(){}
3928
            ;
3929
            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
3930
              module.verbose('Hiding dimmer with css');
3931
              $dimmer
3932
                .transition({
3933
                  animation   : settings.transition + ' out',
3934
                  queue       : false,
3935
                  duration    : module.get.duration(),
3936
                  useFailSafe : true,
3937
                  onStart     : function() {
3938
                    module.remove.dimmed();
3939
                  },
3940
                  onComplete  : function() {
3941
                    module.remove.active();
3942
                    callback();
3943
                  }
3944
                })
3945
              ;
3946
            }
3947
            else {
3948
              module.verbose('Hiding dimmer with javascript');
3949
              module.remove.dimmed();
3950
              $dimmer
3951
                .stop()
3952
                .fadeOut(module.get.duration(), function() {
3953
                  module.remove.active();
3954
                  $dimmer.removeAttr('style');
3955
                  callback();
3956
                })
3957
              ;
3958
            }
3959
          }
3960
        },
3961
3962
        get: {
3963
          dimmer: function() {
3964
            return $dimmer;
3965
          },
3966
          duration: function() {
3967
            if(typeof settings.duration == 'object') {
3968
              if( module.is.active() ) {
3969
                return settings.duration.hide;
3970
              }
3971
              else {
3972
                return settings.duration.show;
3973
              }
3974
            }
3975
            return settings.duration;
3976
          }
3977
        },
3978
3979
        has: {
3980
          dimmer: function() {
3981
            if(settings.dimmerName) {
3982
              return ($module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0);
3983
            }
3984
            else {
3985
              return ( $module.find(selector.dimmer).length > 0 );
3986
            }
3987
          }
3988
        },
3989
3990
        is: {
3991
          active: function() {
3992
            return $dimmer.hasClass(className.active);
3993
          },
3994
          animating: function() {
3995
            return ( $dimmer.is(':animated') || $dimmer.hasClass(className.animating) );
3996
          },
3997
          closable: function() {
3998
            if(settings.closable == 'auto') {
3999
              if(settings.on == 'hover') {
4000
                return false;
4001
              }
4002
              return true;
4003
            }
4004
            return settings.closable;
4005
          },
4006
          dimmer: function() {
4007
            return $module.hasClass(className.dimmer);
4008
          },
4009
          dimmable: function() {
4010
            return $module.hasClass(className.dimmable);
4011
          },
4012
          dimmed: function() {
4013
            return $dimmable.hasClass(className.dimmed);
4014
          },
4015
          disabled: function() {
4016
            return $dimmable.hasClass(className.disabled);
4017
          },
4018
          enabled: function() {
4019
            return !module.is.disabled();
4020
          },
4021
          page: function () {
4022
            return $dimmable.is('body');
4023
          },
4024
          pageDimmer: function() {
4025
            return $dimmer.hasClass(className.pageDimmer);
4026
          }
4027
        },
4028
4029
        can: {
4030
          show: function() {
4031
            return !$dimmer.hasClass(className.disabled);
4032
          }
4033
        },
4034
4035
        set: {
4036
          opacity: function(opacity) {
4037
            var
4038
              color      = $dimmer.css('background-color'),
4039
              colorArray = color.split(','),
4040
              isRGB      = (colorArray && colorArray.length == 3),
4041
              isRGBA     = (colorArray && colorArray.length == 4)
4042
            ;
4043
            opacity    = settings.opacity === 0 ? 0 : settings.opacity || opacity;
4044
            if(isRGB || isRGBA) {
4045
              colorArray[3] = opacity + ')';
4046
              color         = colorArray.join(',');
4047
            }
4048
            else {
4049
              color = 'rgba(0, 0, 0, ' + opacity + ')';
4050
            }
4051
            module.debug('Setting opacity to', opacity);
4052
            $dimmer.css('background-color', color);
4053
          },
4054
          active: function() {
4055
            $dimmer.addClass(className.active);
4056
          },
4057
          dimmable: function() {
4058
            $dimmable.addClass(className.dimmable);
4059
          },
4060
          dimmed: function() {
4061
            $dimmable.addClass(className.dimmed);
4062
          },
4063
          pageDimmer: function() {
4064
            $dimmer.addClass(className.pageDimmer);
4065
          },
4066
          disabled: function() {
4067
            $dimmer.addClass(className.disabled);
4068
          },
4069
          variation: function(variation) {
4070
            variation = variation || settings.variation;
4071
            if(variation) {
4072
              $dimmer.addClass(variation);
4073
            }
4074
          }
4075
        },
4076
4077
        remove: {
4078
          active: function() {
4079
            $dimmer
4080
              .removeClass(className.active)
4081
            ;
4082
          },
4083
          dimmed: function() {
4084
            $dimmable.removeClass(className.dimmed);
4085
          },
4086
          disabled: function() {
4087
            $dimmer.removeClass(className.disabled);
4088
          },
4089
          variation: function(variation) {
4090
            variation = variation || settings.variation;
4091
            if(variation) {
4092
              $dimmer.removeClass(variation);
4093
            }
4094
          }
4095
        },
4096
4097
        setting: function(name, value) {
4098
          module.debug('Changing setting', name, value);
4099
          if( $.isPlainObject(name) ) {
4100
            $.extend(true, settings, name);
4101
          }
4102
          else if(value !== undefined) {
4103
            if($.isPlainObject(settings[name])) {
4104
              $.extend(true, settings[name], value);
4105
            }
4106
            else {
4107
              settings[name] = value;
4108
            }
4109
          }
4110
          else {
4111
            return settings[name];
4112
          }
4113
        },
4114
        internal: function(name, value) {
4115
          if( $.isPlainObject(name) ) {
4116
            $.extend(true, module, name);
4117
          }
4118
          else if(value !== undefined) {
4119
            module[name] = value;
4120
          }
4121
          else {
4122
            return module[name];
4123
          }
4124
        },
4125
        debug: function() {
4126
          if(!settings.silent && settings.debug) {
4127
            if(settings.performance) {
4128
              module.performance.log(arguments);
4129
            }
4130
            else {
4131
              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
4132
              module.debug.apply(console, arguments);
4133
            }
4134
          }
4135
        },
4136
        verbose: function() {
4137
          if(!settings.silent && settings.verbose && settings.debug) {
4138
            if(settings.performance) {
4139
              module.performance.log(arguments);
4140
            }
4141
            else {
4142
              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
4143
              module.verbose.apply(console, arguments);
4144
            }
4145
          }
4146
        },
4147
        error: function() {
4148
          if(!settings.silent) {
4149
            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
4150
            module.error.apply(console, arguments);
4151
          }
4152
        },
4153
        performance: {
4154
          log: function(message) {
4155
            var
4156
              currentTime,
4157
              executionTime,
4158
              previousTime
4159
            ;
4160
            if(settings.performance) {
4161
              currentTime   = new Date().getTime();
4162
              previousTime  = time || currentTime;
4163
              executionTime = currentTime - previousTime;
4164
              time          = currentTime;
4165
              performance.push({
4166
                'Name'           : message[0],
4167
                'Arguments'      : [].slice.call(message, 1) || '',
4168
                'Element'        : element,
4169
                'Execution Time' : executionTime
4170
              });
4171
            }
4172
            clearTimeout(module.performance.timer);
4173
            module.performance.timer = setTimeout(module.performance.display, 500);
4174
          },
4175
          display: function() {
4176
            var
4177
              title = settings.name + ':',
4178
              totalTime = 0
4179
            ;
4180
            time = false;
4181
            clearTimeout(module.performance.timer);
4182
            $.each(performance, function(index, data) {
4183
              totalTime += data['Execution Time'];
4184
            });
4185
            title += ' ' + totalTime + 'ms';
4186
            if(moduleSelector) {
4187
              title += ' \'' + moduleSelector + '\'';
4188
            }
4189
            if($allModules.length > 1) {
4190
              title += ' ' + '(' + $allModules.length + ')';
4191
            }
4192
            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
4193
              console.groupCollapsed(title);
4194
              if(console.table) {
4195
                console.table(performance);
4196
              }
4197
              else {
4198
                $.each(performance, function(index, data) {
4199
                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
4200
                });
4201
              }
4202
              console.groupEnd();
4203
            }
4204
            performance = [];
4205
          }
4206
        },
4207
        invoke: function(query, passedArguments, context) {
4208
          var
4209
            object = instance,
4210
            maxDepth,
4211
            found,
4212
            response
4213
          ;
4214
          passedArguments = passedArguments || queryArguments;
4215
          context         = element         || context;
4216
          if(typeof query == 'string' && object !== undefined) {
4217
            query    = query.split(/[\. ]/);
4218
            maxDepth = query.length - 1;
4219
            $.each(query, function(depth, value) {
4220
              var camelCaseValue = (depth != maxDepth)
4221
                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
4222
                : query
4223
              ;
4224
              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
4225
                object = object[camelCaseValue];
4226
              }
4227
              else if( object[camelCaseValue] !== undefined ) {
4228
                found = object[camelCaseValue];
4229
                return false;
4230
              }
4231
              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
4232
                object = object[value];
4233
              }
4234
              else if( object[value] !== undefined ) {
4235
                found = object[value];
4236
                return false;
4237
              }
4238
              else {
4239
                module.error(error.method, query);
4240
                return false;
4241
              }
4242
            });
4243
          }
4244
          if ( $.isFunction( found ) ) {
4245
            response = found.apply(context, passedArguments);
4246
          }
4247
          else if(found !== undefined) {
4248
            response = found;
4249
          }
4250
          if($.isArray(returnedValue)) {
4251
            returnedValue.push(response);
4252
          }
4253
          else if(returnedValue !== undefined) {
4254
            returnedValue = [returnedValue, response];
4255
          }
4256
          else if(response !== undefined) {
4257
            returnedValue = response;
4258
          }
4259
          return found;
4260
        }
4261
      };
4262
4263
      module.preinitialize();
4264
4265
      if(methodInvoked) {
4266
        if(instance === undefined) {
4267
          module.initialize();
4268
        }
4269
        module.invoke(query);
4270
      }
4271
      else {
4272
        if(instance !== undefined) {
4273
          instance.invoke('destroy');
4274
        }
4275
        module.initialize();
4276
      }
4277
    })
4278
  ;
4279
4280
  return (returnedValue !== undefined)
4281
    ? returnedValue
4282
    : this
4283
  ;
4284
};
4285
4286
$.fn.dimmer.settings = {
4287
4288
  name        : 'Dimmer',
4289
  namespace   : 'dimmer',
4290
4291
  silent      : false,
4292
  debug       : false,
4293
  verbose     : false,
4294
  performance : true,
4295
4296
  // name to distinguish between multiple dimmers in context
4297
  dimmerName  : false,
4298
4299
  // whether to add a variation type
4300
  variation   : false,
4301
4302
  // whether to bind close events
4303
  closable    : 'auto',
4304
4305
  // whether to use css animations
4306
  useCSS      : true,
4307
4308
  // css animation to use
4309
  transition  : 'fade',
4310
4311
  // event to bind to
4312
  on          : false,
4313
4314
  // overriding opacity value
4315
  opacity     : 'auto',
4316
4317
  // transition durations
4318
  duration    : {
4319
    show : 500,
4320
    hide : 500
4321
  },
4322
4323
  onChange    : function(){},
4324
  onShow      : function(){},
4325
  onHide      : function(){},
4326
4327
  error   : {
4328
    method   : 'The method you called is not defined.'
4329
  },
4330
4331
  className : {
4332
    active     : 'active',
4333
    animating  : 'animating',
4334
    dimmable   : 'dimmable',
4335
    dimmed     : 'dimmed',
4336
    dimmer     : 'dimmer',
4337
    disabled   : 'disabled',
4338
    hide       : 'hide',
4339
    pageDimmer : 'page',
4340
    show       : 'show'
4341
  },
4342
4343
  selector: {
4344
    dimmer   : '> .ui.dimmer',
4345
    content  : '.ui.dimmer > .content, .ui.dimmer > .content > .center'
4346
  },
4347
4348
  template: {
4349
    dimmer: function() {
4350
     return $('<div />').attr('class', 'ui dimmer');
4351
    }
4352
  }
4353
4354
};
4355
4356
})( jQuery, window, document );
4357
4358
/*!
4359
 * # Semantic UI 2.2.11 - Dropdown

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

@@ 11-708 (lines=698) @@
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.dimmer = function(parameters) {
23
  var
24
    $allModules     = $(this),
25
26
    time            = new Date().getTime(),
27
    performance     = [],
28
29
    query           = arguments[0],
30
    methodInvoked   = (typeof query == 'string'),
31
    queryArguments  = [].slice.call(arguments, 1),
32
33
    returnedValue
34
  ;
35
36
  $allModules
37
    .each(function() {
38
      var
39
        settings        = ( $.isPlainObject(parameters) )
40
          ? $.extend(true, {}, $.fn.dimmer.settings, parameters)
41
          : $.extend({}, $.fn.dimmer.settings),
42
43
        selector        = settings.selector,
44
        namespace       = settings.namespace,
45
        className       = settings.className,
46
        error           = settings.error,
47
48
        eventNamespace  = '.' + namespace,
49
        moduleNamespace = 'module-' + namespace,
50
        moduleSelector  = $allModules.selector || '',
51
52
        clickEvent      = ('ontouchstart' in document.documentElement)
53
          ? 'touchstart'
54
          : 'click',
55
56
        $module = $(this),
57
        $dimmer,
58
        $dimmable,
59
60
        element   = this,
61
        instance  = $module.data(moduleNamespace),
62
        module
63
      ;
64
65
      module = {
66
67
        preinitialize: function() {
68
          if( module.is.dimmer() ) {
69
70
            $dimmable = $module.parent();
71
            $dimmer   = $module;
72
          }
73
          else {
74
            $dimmable = $module;
75
            if( module.has.dimmer() ) {
76
              if(settings.dimmerName) {
77
                $dimmer = $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName);
78
              }
79
              else {
80
                $dimmer = $dimmable.find(selector.dimmer);
81
              }
82
            }
83
            else {
84
              $dimmer = module.create();
85
            }
86
            module.set.variation();
87
          }
88
        },
89
90
        initialize: function() {
91
          module.debug('Initializing dimmer', settings);
92
93
          module.bind.events();
94
          module.set.dimmable();
95
          module.instantiate();
96
        },
97
98
        instantiate: function() {
99
          module.verbose('Storing instance of module', module);
100
          instance = module;
101
          $module
102
            .data(moduleNamespace, instance)
103
          ;
104
        },
105
106
        destroy: function() {
107
          module.verbose('Destroying previous module', $dimmer);
108
          module.unbind.events();
109
          module.remove.variation();
110
          $dimmable
111
            .off(eventNamespace)
112
          ;
113
        },
114
115
        bind: {
116
          events: function() {
117
            if(settings.on == 'hover') {
118
              $dimmable
119
                .on('mouseenter' + eventNamespace, module.show)
120
                .on('mouseleave' + eventNamespace, module.hide)
121
              ;
122
            }
123
            else if(settings.on == 'click') {
124
              $dimmable
125
                .on(clickEvent + eventNamespace, module.toggle)
126
              ;
127
            }
128
            if( module.is.page() ) {
129
              module.debug('Setting as a page dimmer', $dimmable);
130
              module.set.pageDimmer();
131
            }
132
133
            if( module.is.closable() ) {
134
              module.verbose('Adding dimmer close event', $dimmer);
135
              $dimmable
136
                .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)
137
              ;
138
            }
139
          }
140
        },
141
142
        unbind: {
143
          events: function() {
144
            $module
145
              .removeData(moduleNamespace)
146
            ;
147
            $dimmable
148
              .off(eventNamespace)
149
            ;
150
          }
151
        },
152
153
        event: {
154
          click: function(event) {
155
            module.verbose('Determining if event occured on dimmer', event);
156
            if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) {
157
              module.hide();
158
              event.stopImmediatePropagation();
159
            }
160
          }
161
        },
162
163
        addContent: function(element) {
164
          var
165
            $content = $(element)
166
          ;
167
          module.debug('Add content to dimmer', $content);
168
          if($content.parent()[0] !== $dimmer[0]) {
169
            $content.detach().appendTo($dimmer);
170
          }
171
        },
172
173
        create: function() {
174
          var
175
            $element = $( settings.template.dimmer() )
176
          ;
177
          if(settings.dimmerName) {
178
            module.debug('Creating named dimmer', settings.dimmerName);
179
            $element.addClass(settings.dimmerName);
180
          }
181
          $element
182
            .appendTo($dimmable)
183
          ;
184
          return $element;
185
        },
186
187
        show: function(callback) {
188
          callback = $.isFunction(callback)
189
            ? callback
190
            : function(){}
191
          ;
192
          module.debug('Showing dimmer', $dimmer, settings);
193
          if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {
194
            module.animate.show(callback);
195
            settings.onShow.call(element);
196
            settings.onChange.call(element);
197
          }
198
          else {
199
            module.debug('Dimmer is already shown or disabled');
200
          }
201
        },
202
203
        hide: function(callback) {
204
          callback = $.isFunction(callback)
205
            ? callback
206
            : function(){}
207
          ;
208
          if( module.is.dimmed() || module.is.animating() ) {
209
            module.debug('Hiding dimmer', $dimmer);
210
            module.animate.hide(callback);
211
            settings.onHide.call(element);
212
            settings.onChange.call(element);
213
          }
214
          else {
215
            module.debug('Dimmer is not visible');
216
          }
217
        },
218
219
        toggle: function() {
220
          module.verbose('Toggling dimmer visibility', $dimmer);
221
          if( !module.is.dimmed() ) {
222
            module.show();
223
          }
224
          else {
225
            module.hide();
226
          }
227
        },
228
229
        animate: {
230
          show: function(callback) {
231
            callback = $.isFunction(callback)
232
              ? callback
233
              : function(){}
234
            ;
235
            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
236
              if(settings.opacity !== 'auto') {
237
                module.set.opacity();
238
              }
239
              $dimmer
240
                .transition({
241
                  animation   : settings.transition + ' in',
242
                  queue       : false,
243
                  duration    : module.get.duration(),
244
                  useFailSafe : true,
245
                  onStart     : function() {
246
                    module.set.dimmed();
247
                  },
248
                  onComplete  : function() {
249
                    module.set.active();
250
                    callback();
251
                  }
252
                })
253
              ;
254
            }
255
            else {
256
              module.verbose('Showing dimmer animation with javascript');
257
              module.set.dimmed();
258
              if(settings.opacity == 'auto') {
259
                settings.opacity = 0.8;
260
              }
261
              $dimmer
262
                .stop()
263
                .css({
264
                  opacity : 0,
265
                  width   : '100%',
266
                  height  : '100%'
267
                })
268
                .fadeTo(module.get.duration(), settings.opacity, function() {
269
                  $dimmer.removeAttr('style');
270
                  module.set.active();
271
                  callback();
272
                })
273
              ;
274
            }
275
          },
276
          hide: function(callback) {
277
            callback = $.isFunction(callback)
278
              ? callback
279
              : function(){}
280
            ;
281
            if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
282
              module.verbose('Hiding dimmer with css');
283
              $dimmer
284
                .transition({
285
                  animation   : settings.transition + ' out',
286
                  queue       : false,
287
                  duration    : module.get.duration(),
288
                  useFailSafe : true,
289
                  onStart     : function() {
290
                    module.remove.dimmed();
291
                  },
292
                  onComplete  : function() {
293
                    module.remove.active();
294
                    callback();
295
                  }
296
                })
297
              ;
298
            }
299
            else {
300
              module.verbose('Hiding dimmer with javascript');
301
              module.remove.dimmed();
302
              $dimmer
303
                .stop()
304
                .fadeOut(module.get.duration(), function() {
305
                  module.remove.active();
306
                  $dimmer.removeAttr('style');
307
                  callback();
308
                })
309
              ;
310
            }
311
          }
312
        },
313
314
        get: {
315
          dimmer: function() {
316
            return $dimmer;
317
          },
318
          duration: function() {
319
            if(typeof settings.duration == 'object') {
320
              if( module.is.active() ) {
321
                return settings.duration.hide;
322
              }
323
              else {
324
                return settings.duration.show;
325
              }
326
            }
327
            return settings.duration;
328
          }
329
        },
330
331
        has: {
332
          dimmer: function() {
333
            if(settings.dimmerName) {
334
              return ($module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0);
335
            }
336
            else {
337
              return ( $module.find(selector.dimmer).length > 0 );
338
            }
339
          }
340
        },
341
342
        is: {
343
          active: function() {
344
            return $dimmer.hasClass(className.active);
345
          },
346
          animating: function() {
347
            return ( $dimmer.is(':animated') || $dimmer.hasClass(className.animating) );
348
          },
349
          closable: function() {
350
            if(settings.closable == 'auto') {
351
              if(settings.on == 'hover') {
352
                return false;
353
              }
354
              return true;
355
            }
356
            return settings.closable;
357
          },
358
          dimmer: function() {
359
            return $module.hasClass(className.dimmer);
360
          },
361
          dimmable: function() {
362
            return $module.hasClass(className.dimmable);
363
          },
364
          dimmed: function() {
365
            return $dimmable.hasClass(className.dimmed);
366
          },
367
          disabled: function() {
368
            return $dimmable.hasClass(className.disabled);
369
          },
370
          enabled: function() {
371
            return !module.is.disabled();
372
          },
373
          page: function () {
374
            return $dimmable.is('body');
375
          },
376
          pageDimmer: function() {
377
            return $dimmer.hasClass(className.pageDimmer);
378
          }
379
        },
380
381
        can: {
382
          show: function() {
383
            return !$dimmer.hasClass(className.disabled);
384
          }
385
        },
386
387
        set: {
388
          opacity: function(opacity) {
389
            var
390
              color      = $dimmer.css('background-color'),
391
              colorArray = color.split(','),
392
              isRGB      = (colorArray && colorArray.length == 3),
393
              isRGBA     = (colorArray && colorArray.length == 4)
394
            ;
395
            opacity    = settings.opacity === 0 ? 0 : settings.opacity || opacity;
396
            if(isRGB || isRGBA) {
397
              colorArray[3] = opacity + ')';
398
              color         = colorArray.join(',');
399
            }
400
            else {
401
              color = 'rgba(0, 0, 0, ' + opacity + ')';
402
            }
403
            module.debug('Setting opacity to', opacity);
404
            $dimmer.css('background-color', color);
405
          },
406
          active: function() {
407
            $dimmer.addClass(className.active);
408
          },
409
          dimmable: function() {
410
            $dimmable.addClass(className.dimmable);
411
          },
412
          dimmed: function() {
413
            $dimmable.addClass(className.dimmed);
414
          },
415
          pageDimmer: function() {
416
            $dimmer.addClass(className.pageDimmer);
417
          },
418
          disabled: function() {
419
            $dimmer.addClass(className.disabled);
420
          },
421
          variation: function(variation) {
422
            variation = variation || settings.variation;
423
            if(variation) {
424
              $dimmer.addClass(variation);
425
            }
426
          }
427
        },
428
429
        remove: {
430
          active: function() {
431
            $dimmer
432
              .removeClass(className.active)
433
            ;
434
          },
435
          dimmed: function() {
436
            $dimmable.removeClass(className.dimmed);
437
          },
438
          disabled: function() {
439
            $dimmer.removeClass(className.disabled);
440
          },
441
          variation: function(variation) {
442
            variation = variation || settings.variation;
443
            if(variation) {
444
              $dimmer.removeClass(variation);
445
            }
446
          }
447
        },
448
449
        setting: function(name, value) {
450
          module.debug('Changing setting', name, value);
451
          if( $.isPlainObject(name) ) {
452
            $.extend(true, settings, name);
453
          }
454
          else if(value !== undefined) {
455
            if($.isPlainObject(settings[name])) {
456
              $.extend(true, settings[name], value);
457
            }
458
            else {
459
              settings[name] = value;
460
            }
461
          }
462
          else {
463
            return settings[name];
464
          }
465
        },
466
        internal: function(name, value) {
467
          if( $.isPlainObject(name) ) {
468
            $.extend(true, module, name);
469
          }
470
          else if(value !== undefined) {
471
            module[name] = value;
472
          }
473
          else {
474
            return module[name];
475
          }
476
        },
477
        debug: function() {
478
          if(!settings.silent && settings.debug) {
479
            if(settings.performance) {
480
              module.performance.log(arguments);
481
            }
482
            else {
483
              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
484
              module.debug.apply(console, arguments);
485
            }
486
          }
487
        },
488
        verbose: function() {
489
          if(!settings.silent && settings.verbose && settings.debug) {
490
            if(settings.performance) {
491
              module.performance.log(arguments);
492
            }
493
            else {
494
              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
495
              module.verbose.apply(console, arguments);
496
            }
497
          }
498
        },
499
        error: function() {
500
          if(!settings.silent) {
501
            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
502
            module.error.apply(console, arguments);
503
          }
504
        },
505
        performance: {
506
          log: function(message) {
507
            var
508
              currentTime,
509
              executionTime,
510
              previousTime
511
            ;
512
            if(settings.performance) {
513
              currentTime   = new Date().getTime();
514
              previousTime  = time || currentTime;
515
              executionTime = currentTime - previousTime;
516
              time          = currentTime;
517
              performance.push({
518
                'Name'           : message[0],
519
                'Arguments'      : [].slice.call(message, 1) || '',
520
                'Element'        : element,
521
                'Execution Time' : executionTime
522
              });
523
            }
524
            clearTimeout(module.performance.timer);
525
            module.performance.timer = setTimeout(module.performance.display, 500);
526
          },
527
          display: function() {
528
            var
529
              title = settings.name + ':',
530
              totalTime = 0
531
            ;
532
            time = false;
533
            clearTimeout(module.performance.timer);
534
            $.each(performance, function(index, data) {
535
              totalTime += data['Execution Time'];
536
            });
537
            title += ' ' + totalTime + 'ms';
538
            if(moduleSelector) {
539
              title += ' \'' + moduleSelector + '\'';
540
            }
541
            if($allModules.length > 1) {
542
              title += ' ' + '(' + $allModules.length + ')';
543
            }
544
            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
545
              console.groupCollapsed(title);
546
              if(console.table) {
547
                console.table(performance);
548
              }
549
              else {
550
                $.each(performance, function(index, data) {
551
                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
552
                });
553
              }
554
              console.groupEnd();
555
            }
556
            performance = [];
557
          }
558
        },
559
        invoke: function(query, passedArguments, context) {
560
          var
561
            object = instance,
562
            maxDepth,
563
            found,
564
            response
565
          ;
566
          passedArguments = passedArguments || queryArguments;
567
          context         = element         || context;
568
          if(typeof query == 'string' && object !== undefined) {
569
            query    = query.split(/[\. ]/);
570
            maxDepth = query.length - 1;
571
            $.each(query, function(depth, value) {
572
              var camelCaseValue = (depth != maxDepth)
573
                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
574
                : query
575
              ;
576
              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
577
                object = object[camelCaseValue];
578
              }
579
              else if( object[camelCaseValue] !== undefined ) {
580
                found = object[camelCaseValue];
581
                return false;
582
              }
583
              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
584
                object = object[value];
585
              }
586
              else if( object[value] !== undefined ) {
587
                found = object[value];
588
                return false;
589
              }
590
              else {
591
                module.error(error.method, query);
592
                return false;
593
              }
594
            });
595
          }
596
          if ( $.isFunction( found ) ) {
597
            response = found.apply(context, passedArguments);
598
          }
599
          else if(found !== undefined) {
600
            response = found;
601
          }
602
          if($.isArray(returnedValue)) {
603
            returnedValue.push(response);
604
          }
605
          else if(returnedValue !== undefined) {
606
            returnedValue = [returnedValue, response];
607
          }
608
          else if(response !== undefined) {
609
            returnedValue = response;
610
          }
611
          return found;
612
        }
613
      };
614
615
      module.preinitialize();
616
617
      if(methodInvoked) {
618
        if(instance === undefined) {
619
          module.initialize();
620
        }
621
        module.invoke(query);
622
      }
623
      else {
624
        if(instance !== undefined) {
625
          instance.invoke('destroy');
626
        }
627
        module.initialize();
628
      }
629
    })
630
  ;
631
632
  return (returnedValue !== undefined)
633
    ? returnedValue
634
    : this
635
  ;
636
};
637
638
$.fn.dimmer.settings = {
639
640
  name        : 'Dimmer',
641
  namespace   : 'dimmer',
642
643
  silent      : false,
644
  debug       : false,
645
  verbose     : false,
646
  performance : true,
647
648
  // name to distinguish between multiple dimmers in context
649
  dimmerName  : false,
650
651
  // whether to add a variation type
652
  variation   : false,
653
654
  // whether to bind close events
655
  closable    : 'auto',
656
657
  // whether to use css animations
658
  useCSS      : true,
659
660
  // css animation to use
661
  transition  : 'fade',
662
663
  // event to bind to
664
  on          : false,
665
666
  // overriding opacity value
667
  opacity     : 'auto',
668
669
  // transition durations
670
  duration    : {
671
    show : 500,
672
    hide : 500
673
  },
674
675
  onChange    : function(){},
676
  onShow      : function(){},
677
  onHide      : function(){},
678
679
  error   : {
680
    method   : 'The method you called is not defined.'
681
  },
682
683
  className : {
684
    active     : 'active',
685
    animating  : 'animating',
686
    dimmable   : 'dimmable',
687
    dimmed     : 'dimmed',
688
    dimmer     : 'dimmer',
689
    disabled   : 'disabled',
690
    hide       : 'hide',
691
    pageDimmer : 'page',
692
    show       : 'show'
693
  },
694
695
  selector: {
696
    dimmer   : '> .ui.dimmer',
697
    content  : '.ui.dimmer > .content, .ui.dimmer > .content > .center'
698
  },
699
700
  template: {
701
    dimmer: function() {
702
     return $('<div />').attr('class', 'ui dimmer');
703
    }
704
  }
705
706
};
707
708
})( jQuery, window, document );
709