1!(function($, jING, undefined) { 2 'use strict'; 3 4 $.warningBar = { 5 _PLUGIN_NAME: 'warningBar', 6 _setFn: function(fn, def) { 7 8 def = def || function() {}; 9 10 if ( typeof fn !== 'function' ) { 11 fn = def; 12 } 13 14 return fn; 15 }, 16 getContainer: function(el) { 17 18 return $(el).parents(this.container).eq(0); 19 }, 20 getTop: function(el, settings, showHide) { 21 22 showHide = showHide || false; 23 24 var h = $(el).outerHeight() * (showHide ? 1 : -1 ), 25 oldH = parseInt($(settings.container).data('wbPos'), 10) || 0; 26 27 $(settings.container).data('wbPos', oldH + h); 28 29 return oldH + h; // parseInt($(settings.page).css(settings.cssAttr), 10) + h; 30 }, 31 s: function(el) { 32 33 var settings = el.wbSettings, 34 t = this.getTop(el, settings, true); 35 if ( t === false ) { 36 return false; 37 } 38 39 var o = {}; 40 o[settings.cssAttr] = t + 'px'; 41 $(settings.page).animate(o, settings.animSpeed); 42 }, 43 h: function(el) { 44 45 var settings = el.wbSettings, 46 t = this.getTop(el, settings, false); 47 if ( t === false ) { 48 return false; 49 } 50 51 var o = {}; 52 o[settings.cssAttr] = t + 'px'; 53 $(settings.page).animate(o, settings.animSpeed); 54 }, 55 _show: function(el, fn) { 56 57 if ( el.wbSettings.isOpen ) { 58 return this; 59 } 60 61 fn = this._setFn(fn, el.wbSettings.onShow); 62 63 this.s.call(this, el); 64 $(el).slideDown(el.wbSettings.animSpeed, function() { 65 fn.call(el, this); 66 el.wbSettings.isOpen = true; 67 $(el).trigger('show.warningbar'); 68 }); 69 70 return this; 71 }, 72 _hide: function(el, fn) { 73 74 if ( !el.wbSettings.isOpen ) { 75 return this; 76 } 77 78 fn = this._setFn(fn, el.wbSettings.onHide); 79 80 this.h.call(this, el); 81 $(el).slideUp(el.wbSettings.animSpeed, function() { 82 fn.call(el, this); 83 el.wbSettings.isOpen = false; 84 $(el).trigger('hide.warningbar'); 85 }); 86 87 return this; 88 }, 89 combineElementOptions: function(el, options) { 90 91 var opts = $.extend({}, options), 92 data = $(el).data(), 93 optl; 94 95 if ( data || data.length ) { 96 for ( var opt in opts ) { 97 if ( opts.hasOwnProperty(opt) ) { 98 if ( data.hasOwnProperty(opt) || data.hasOwnProperty(optl = opt.toLowerCase()) ) { 99 opts[opt] = data.hasOwnProperty(opt) ? data[opt] : data[optl]; 100 } 101 } 102 } 103 } 104 105 return opts; 106 } 107 }; 108 $.fn.warningbar = function(opts) { 109 110 var base = $.warningBar; 111 112 if ( typeof opts === 'string' ) { 113 114 var fn = base['_' + opts], 115 args = null; 116 if ( fn ) { 117 args = Array.prototype.slice.call(arguments); 118 args[0] = this[0]; 119 fn.apply(base, args); 120 } 121 122 return this; 123 } 124 125 var options = $.extend({}, { 126 cssAttr: 'top', 127 delay: false, 128 container: '.warningbar-container', 129 page: '#viewport', 130 animSpeed: 600, 131 onShow: function(base) {}, 132 onHide: function(base) {}, 133 isOpen: false 134 }, opts); 135 136 var o = { 137 'position': 'relative' 138 }; 139 o[options.cssAttr] = 0; 140 $(options.page).css(o); 141 142 return this.each(function() { 143 144 var el = this; 145 146 if ( $(el).data(base._PLUGIN_NAME) ) { 147 return this; 148 } 149 150 var settings = base.combineElementOptions(el, options); 151 settings.container = base.getContainer(el); 152 settings.container[0].wbPos = 0; 153 if ( typeof settings.onShow === 'string' ) { 154 settings.onShow = window[settings.onShow]; 155 } 156 if ( typeof settings.onHide === 'string' ) { 157 settings.onShow = window[settings.onHide]; 158 } 159 160 el.wbSettings = settings; 161 162 $(el).data(base._PLUGIN_NAME, true); 163 164 $('[data-role=btn-close]', $(this)).on('click.warningBar', function(e) { 165 e.preventDefault(); 166 e.stopPropagation(); 167 base._hide.call(base, el); 168 }); 169 170 if ( $(el).hasClass('active') ) { 171 var o = {}; 172 o[settings.cssAttr] = base.getTop(el, settings, true); 173 $(settings.page).css(o); 174 settings.isOpen = true; 175 } 176 177 if ( settings.delay ) { 178 setTimeout(function() { 179 base._show.call(base, el); 180 }, settings.delay); 181 } 182 }); 183 }; 184 185 jING.init = jING.init || {}; 186 187 jING.loginBar = { 188 defaults: { 189 expireDate: null, 190 alertOn: 60, 191 alertClass: 'red', 192 container: '#login-bar', 193 canvas: '#login-bar div.remaining em', 194 btnClose: '.close', 195 onComplete: function(options) {}, 196 onAlert: function(diff, options) {}, 197 onUpdate: function(options) {}, 198 run: true, 199 fnExpireDate: null 200 }, 201 isReady: false, 202 _timer: null, 203 getTimeLeft: function(expireDate) { 204 205 var now = (new Date()).getTime() / 1000, 206 diff = Math.floor(expireDate - now); 207 208 var min = parseInt(diff / 60, 10), 209 sec = Math.round(diff % 60);
210 211 min = min < 10 ? '0' + min : min; 212 sec = sec < 10 ? '0' + sec : sec; 213 214 return { 215 now: now, 216 seconds: diff, 217 str: min + ':' + sec 218 }; 219 }, 220 init: function(options) { 221 222 var base = this; 223 224 this.settings = $.extend({}, this.defaults, options); 225 if ( $(this.settings.container).length < 1 ) { 226 return; 227 } 228 229 var c = $(this.settings.container); 230 this.settings.barHeight = c.height() + 10; 231 232 this.settings.run = this.settings.run && c.is(':visible'); 233 234 base.isReady = true; 235 236 if ( this.settings.expireDate && $(this.settings.canvas).length ) { 237 if ( this.settings.run ) { 238 $('body.warning-bar #viewport').css({ 239 'margin-top': this.settings.barHeight 240 }); 241 this.run(); 242 } 243 } else { 244 if ( !this.settings.run ) { 245 c.removeClass('hidden').css({ 246 'top': -this.settings.barHeight 247 }); 248 } 249 } 250 251 c.on('hide.warningbar', function() { 252 clearTimeout(base._timer); 253 }); 254 $(this.settings.btnClose, c).on('click', function(e) { 255 base.close(); 256 }); 257 }, 258 update: function() { 259 260 var base = this, 261 options = base.settings; 262 263 if ( $.isFunction(base.settings.onUpdate) ) { 264 clearTimeout(base._timer); 265 base.isReady = false; 266 $(options.container).removeClass(options.alertClass); 267 base.settings.expireDate = base.settings.onUpdate.call(base, options); 268 base.isReady = true; 269 } 270 271 base.run(); 272 }, 273 animate: function(inv) { 274 275 if ( !jING.loginBar.isReady ) { 276 return; 277 } 278 279 var base = jING.loginBar, 280 opts = base.settings; 281 282 inv = inv || 600; 283 284 $(document.body).animate({ 285 'margin-top': opts.barHeight 286 }, inv, function() { 287 $(document.body).addClass('warning-bar'); 288 }); 289 $(opts.container).css({ 290 opacity: 0 291 }).show().animate({ 292 top: 0, 293 opacity: 1 294 }, inv); 295 296 opts.expireDate && base.run(); 297 }, 298 run: function() { 299 300 if ( !this.isReady ) { 301 return; 302 } 303 var base = this, 304 opts = base.settings, 305 timeLeft = base.getTimeLeft(opts.expireDate); 306 if (!opts || !opts.expireDate || timeLeft.seconds < 1 || opts.expireDate < timeLeft.now) { 307 base.settings.onComplete.call(base, opts); 308 return; 309 } 310 311 if ( parseInt(timeLeft.seconds - opts.alertOn, 10) === 0 ) { 312 base.settings.onAlert.call(base, timeLeft, opts); 313 } 314 315 $(opts.canvas).text(timeLeft.str); 316 317 clearTimeout(base._timer); 318 base._timer = setTimeout(function() { 319 base.isReady && base.run(); 320 }, 999); 321 }, 322 reset: function() { 323 324 var base = this; 325 326 clearTimeout(base._timer); 327 328 $(document.body).css({ 329 'margin-top': 0 330 }).removeClass('warning-bar'); 331 $(base.settings.container).hide(); 332 }, 333 close: function(inv) { 334 335 inv = inv || 600; 336 337 var base = this, 338 opts = base.settings; 339 340 clearTimeout(base._timer); 341 342 $(document.body).animate({ 343 marginTop: '0' 344 }, inv, function() { 345 $(document.body).removeClass('warning-bar'); 346 }); 347 $(opts.container).animate({ 348 top: -opts.barHeight, 349 opacity: 0 350 }, inv, function() { 351 $(opts.container).hide().css({ 352 opacity: 1 353 }); 354 }); 355 } 356 }; 357 jING.init.loginBar = function(opts) { 358 359 var options = $.extend({ 360 container: '#login-bar', 361 canvas: '#login-bar div.remaining em', 362 expireDate: window.logoutTime, 363 alertOn: 15, 364 onComplete: function(options) { 365 var c = $(options.container); 366 c.removeClass(options.alertClass) 367 .addClass('logged-out'); 368 $(document.body).addClass('logged-out'); 369 $('div.online a', c).fadeOut(100, function() { 370 $('div.online em', c).fadeIn(200); 371 }); 372 }, 373 onAlert: window.logoutOnAlert || function(timeLeft, options) { 374 $(options.container).addClass(options.alertClass); 375 }, 376 run: !( !window.logoutTime || isNaN(window.logoutTime) ) 377 }, window.loginBarOptions, opts); 378 379 if ( !$(options.container).length ) { 380 return; 381 } 382 383 jING.loginBar.init(options); 384 }; 385 386 jING.init.logoutBar = jING.init.loginBar; 387})(jQuery, window.jING = window.jING || {});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.