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 );