github.com/fanux/shipyard@v0.0.0-20161009071005-6515ce223235/controller/static/semantic/dist/components/nag.js (about)

     1  /*!
     2   * # Semantic UI x.x - Nag
     3   * http://github.com/semantic-org/semantic-ui/
     4   *
     5   *
     6   * Copyright 2014 Contributors
     7   * Released under the MIT license
     8   * http://opensource.org/licenses/MIT
     9   *
    10   */
    11  
    12  ;(function ($, window, document, undefined) {
    13  
    14  "use strict";
    15  
    16  $.fn.nag = function(parameters) {
    17    var
    18      $allModules    = $(this),
    19      moduleSelector = $allModules.selector || '',
    20  
    21      time           = new Date().getTime(),
    22      performance    = [],
    23  
    24      query          = arguments[0],
    25      methodInvoked  = (typeof query == 'string'),
    26      queryArguments = [].slice.call(arguments, 1),
    27      returnedValue
    28    ;
    29    $allModules
    30      .each(function() {
    31        var
    32          settings          = ( $.isPlainObject(parameters) )
    33            ? $.extend(true, {}, $.fn.nag.settings, parameters)
    34            : $.extend({}, $.fn.nag.settings),
    35  
    36          className       = settings.className,
    37          selector        = settings.selector,
    38          error           = settings.error,
    39          namespace       = settings.namespace,
    40  
    41          eventNamespace  = '.' + namespace,
    42          moduleNamespace = namespace + '-module',
    43  
    44          $module         = $(this),
    45  
    46          $close          = $module.find(selector.close),
    47          $context        = (settings.context)
    48            ? $(settings.context)
    49            : $('body'),
    50  
    51          element         = this,
    52          instance        = $module.data(moduleNamespace),
    53  
    54          moduleOffset,
    55          moduleHeight,
    56  
    57          contextWidth,
    58          contextHeight,
    59          contextOffset,
    60  
    61          yOffset,
    62          yPosition,
    63  
    64          timer,
    65          module,
    66  
    67          requestAnimationFrame = window.requestAnimationFrame
    68            || window.mozRequestAnimationFrame
    69            || window.webkitRequestAnimationFrame
    70            || window.msRequestAnimationFrame
    71            || function(callback) { setTimeout(callback, 0); }
    72        ;
    73        module = {
    74  
    75          initialize: function() {
    76            module.verbose('Initializing element');
    77  
    78            $module
    79              .data(moduleNamespace, module)
    80            ;
    81            $close
    82              .on('click' + eventNamespace, module.dismiss)
    83            ;
    84  
    85            if(settings.detachable && $module.parent()[0] !== $context[0]) {
    86              $module
    87                .detach()
    88                .prependTo($context)
    89              ;
    90            }
    91  
    92            if(settings.displayTime > 0) {
    93              setTimeout(module.hide, settings.displayTime);
    94            }
    95            module.show();
    96          },
    97  
    98          destroy: function() {
    99            module.verbose('Destroying instance');
   100            $module
   101              .removeData(moduleNamespace)
   102              .off(eventNamespace)
   103            ;
   104          },
   105  
   106          show: function() {
   107            if( module.should.show() && !$module.is(':visible') ) {
   108              module.debug('Showing nag', settings.animation.show);
   109              if(settings.animation.show == 'fade') {
   110                $module
   111                  .fadeIn(settings.duration, settings.easing)
   112                ;
   113              }
   114              else {
   115                $module
   116                  .slideDown(settings.duration, settings.easing)
   117                ;
   118              }
   119            }
   120          },
   121  
   122          hide: function() {
   123            module.debug('Showing nag', settings.animation.hide);
   124            if(settings.animation.show == 'fade') {
   125              $module
   126                .fadeIn(settings.duration, settings.easing)
   127              ;
   128            }
   129            else {
   130              $module
   131                .slideUp(settings.duration, settings.easing)
   132              ;
   133            }
   134          },
   135  
   136          onHide: function() {
   137            module.debug('Removing nag', settings.animation.hide);
   138            $module.remove();
   139            if (settings.onHide) {
   140              settings.onHide();
   141            }
   142          },
   143  
   144          dismiss: function(event) {
   145            if(settings.storageMethod) {
   146              module.storage.set(settings.key, settings.value);
   147            }
   148            module.hide();
   149            event.stopImmediatePropagation();
   150            event.preventDefault();
   151          },
   152  
   153          should: {
   154            show: function() {
   155              if(settings.persist) {
   156                module.debug('Persistent nag is set, can show nag');
   157                return true;
   158              }
   159              if( module.storage.get(settings.key) != settings.value.toString() ) {
   160                module.debug('Stored value is not set, can show nag', module.storage.get(settings.key));
   161                return true;
   162              }
   163              module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key));
   164              return false;
   165            }
   166          },
   167  
   168          get: {
   169            storageOptions: function() {
   170              var
   171                options = {}
   172              ;
   173              if(settings.expires) {
   174                options.expires = settings.expires;
   175              }
   176              if(settings.domain) {
   177                options.domain = settings.domain;
   178              }
   179              if(settings.path) {
   180                options.path = settings.path;
   181              }
   182              return options;
   183            }
   184          },
   185  
   186          clear: function() {
   187            module.storage.remove(settings.key);
   188          },
   189  
   190          storage: {
   191            set: function(key, value) {
   192              var
   193                options = module.get.storageOptions()
   194              ;
   195              if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {
   196                window.localStorage.setItem(key, value);
   197                module.debug('Value stored using local storage', key, value);
   198              }
   199              else if($.cookie !== undefined) {
   200                $.cookie(key, value, options);
   201                module.debug('Value stored using cookie', key, value, options);
   202              }
   203              else {
   204                module.error(error.noCookieStorage);
   205                return;
   206              }
   207            },
   208            get: function(key, value) {
   209              var
   210                storedValue
   211              ;
   212              if(settings.storageMethod == 'localstorage' && window.localStorage !== undefined) {
   213                storedValue = window.localStorage.getItem(key);
   214              }
   215              // get by cookie
   216              else if($.cookie !== undefined) {
   217                storedValue = $.cookie(key);
   218              }
   219              else {
   220                module.error(error.noCookieStorage);
   221              }
   222              if(storedValue == 'undefined' || storedValue == 'null' || storedValue === undefined || storedValue === null) {
   223                storedValue = undefined;
   224              }
   225              return storedValue;
   226            },
   227            remove: function(key) {
   228              var
   229                options = module.get.storageOptions()
   230              ;
   231              if(settings.storageMethod == 'local' && window.store !== undefined) {
   232                window.localStorage.removeItem(key);
   233              }
   234              // store by cookie
   235              else if($.cookie !== undefined) {
   236                $.removeCookie(key, options);
   237              }
   238              else {
   239                module.error(error.noStorage);
   240              }
   241            }
   242          },
   243  
   244          setting: function(name, value) {
   245            module.debug('Changing setting', name, value);
   246            if( $.isPlainObject(name) ) {
   247              $.extend(true, settings, name);
   248            }
   249            else if(value !== undefined) {
   250              settings[name] = value;
   251            }
   252            else {
   253              return settings[name];
   254            }
   255          },
   256          internal: function(name, value) {
   257            if( $.isPlainObject(name) ) {
   258              $.extend(true, module, name);
   259            }
   260            else if(value !== undefined) {
   261              module[name] = value;
   262            }
   263            else {
   264              return module[name];
   265            }
   266          },
   267          debug: function() {
   268            if(settings.debug) {
   269              if(settings.performance) {
   270                module.performance.log(arguments);
   271              }
   272              else {
   273                module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
   274                module.debug.apply(console, arguments);
   275              }
   276            }
   277          },
   278          verbose: function() {
   279            if(settings.verbose && settings.debug) {
   280              if(settings.performance) {
   281                module.performance.log(arguments);
   282              }
   283              else {
   284                module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
   285                module.verbose.apply(console, arguments);
   286              }
   287            }
   288          },
   289          error: function() {
   290            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
   291            module.error.apply(console, arguments);
   292          },
   293          performance: {
   294            log: function(message) {
   295              var
   296                currentTime,
   297                executionTime,
   298                previousTime
   299              ;
   300              if(settings.performance) {
   301                currentTime   = new Date().getTime();
   302                previousTime  = time || currentTime;
   303                executionTime = currentTime - previousTime;
   304                time          = currentTime;
   305                performance.push({
   306                  'Name'           : message[0],
   307                  'Arguments'      : [].slice.call(message, 1) || '',
   308                  'Element'        : element,
   309                  'Execution Time' : executionTime
   310                });
   311              }
   312              clearTimeout(module.performance.timer);
   313              module.performance.timer = setTimeout(module.performance.display, 100);
   314            },
   315            display: function() {
   316              var
   317                title = settings.name + ':',
   318                totalTime = 0
   319              ;
   320              time = false;
   321              clearTimeout(module.performance.timer);
   322              $.each(performance, function(index, data) {
   323                totalTime += data['Execution Time'];
   324              });
   325              title += ' ' + totalTime + 'ms';
   326              if(moduleSelector) {
   327                title += ' \'' + moduleSelector + '\'';
   328              }
   329              if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
   330                console.groupCollapsed(title);
   331                if(console.table) {
   332                  console.table(performance);
   333                }
   334                else {
   335                  $.each(performance, function(index, data) {
   336                    console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
   337                  });
   338                }
   339                console.groupEnd();
   340              }
   341              performance = [];
   342            }
   343          },
   344          invoke: function(query, passedArguments, context) {
   345            var
   346              object = instance,
   347              maxDepth,
   348              found,
   349              response
   350            ;
   351            passedArguments = passedArguments || queryArguments;
   352            context         = element         || context;
   353            if(typeof query == 'string' && object !== undefined) {
   354              query    = query.split(/[\. ]/);
   355              maxDepth = query.length - 1;
   356              $.each(query, function(depth, value) {
   357                var camelCaseValue = (depth != maxDepth)
   358                  ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
   359                  : query
   360                ;
   361                if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
   362                  object = object[camelCaseValue];
   363                }
   364                else if( object[camelCaseValue] !== undefined ) {
   365                  found = object[camelCaseValue];
   366                  return false;
   367                }
   368                else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
   369                  object = object[value];
   370                }
   371                else if( object[value] !== undefined ) {
   372                  found = object[value];
   373                  return false;
   374                }
   375                else {
   376                  module.error(error.method, query);
   377                  return false;
   378                }
   379              });
   380            }
   381            if ( $.isFunction( found ) ) {
   382              response = found.apply(context, passedArguments);
   383            }
   384            else if(found !== undefined) {
   385              response = found;
   386            }
   387            if($.isArray(returnedValue)) {
   388              returnedValue.push(response);
   389            }
   390            else if(returnedValue !== undefined) {
   391              returnedValue = [returnedValue, response];
   392            }
   393            else if(response !== undefined) {
   394              returnedValue = response;
   395            }
   396            return found;
   397          }
   398        };
   399  
   400        if(methodInvoked) {
   401          if(instance === undefined) {
   402            module.initialize();
   403          }
   404          module.invoke(query);
   405        }
   406        else {
   407          if(instance !== undefined) {
   408            instance.invoke('destroy');
   409          }
   410          module.initialize();
   411        }
   412      })
   413    ;
   414  
   415    return (returnedValue !== undefined)
   416      ? returnedValue
   417      : this
   418    ;
   419  };
   420  
   421  $.fn.nag.settings = {
   422  
   423    name        : 'Nag',
   424  
   425    debug       : false,
   426    verbose     : true,
   427    performance : true,
   428  
   429    namespace   : 'Nag',
   430  
   431    // allows cookie to be overriden
   432    persist     : false,
   433  
   434    // set to zero to require manually dismissal, otherwise hides on its own
   435    displayTime : 0,
   436  
   437    animation   : {
   438      show : 'slide',
   439      hide : 'slide'
   440    },
   441  
   442    context       : false,
   443    detachable    : false,
   444  
   445    expires       : 30,
   446    domain        : false,
   447    path          : '/',
   448  
   449    // type of storage to use
   450    storageMethod : 'cookie',
   451  
   452    // value to store in dismissed localstorage/cookie
   453    key           : 'nag',
   454    value         : 'dismiss',
   455  
   456    error: {
   457      noStorage : 'Neither $.cookie or store is defined. A storage solution is required for storing state',
   458      method    : 'The method you called is not defined.'
   459    },
   460  
   461    className     : {
   462      bottom : 'bottom',
   463      fixed  : 'fixed'
   464    },
   465  
   466    selector      : {
   467      close : '.close.icon'
   468    },
   469  
   470    speed         : 500,
   471    easing        : 'easeOutQuad',
   472  
   473    onHide: function() {}
   474  
   475  };
   476  
   477  })( jQuery, window , document );