lobiboxing-rails 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c0727d59b996f0aee955b6d76b2b3edcd1df463
4
+ data.tar.gz: dcb1806e6c8fb8d4ee6b936a5e12349cf919ac64
5
+ SHA512:
6
+ metadata.gz: 37f2a6261ee69cc405067f61676b52172fd302087079170558bbec1f7bd2f5420cd9264422ccfb9087d5c1eed364e18f40757014476bebd52f2158f7ba9dff66
7
+ data.tar.gz: 1a983a2b93c1f1e3024b3748824ad6b2882038af714d0a7aab75b848191ec2349d6b5162e7226987aaab449aa3edee810ba9ec55960bc3756245d870316268c6
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Adam Griffis
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ # lobiboxrails
2
+
3
+ lobiboxrails wraps the [lobibox](https://github.com/arboshiki/lobibox) library in a rails engine for simple
4
+ use with the asset pipeline provided by rails 4.0. The gem includes the development (non-minified)
5
+ source for ease of exploration. The asset pipeline will minify in production.
6
+
7
+ ## Usage
8
+
9
+ Add the following to your gemfile:
10
+
11
+ gem 'lobiboxrails'
12
+
13
+ Add the following directive to your Javascript manifest file (application.js):
14
+
15
+ //= require lobibox
16
+ //= require lobibox/messageboxes
17
+ //= require lobibox/notifications
18
+
19
+ Application.css
20
+
21
+ //= require lobibox
22
+
23
+ ## Versioning
24
+
25
+ lobiboxrails 1.2.4 == lobibox.js 1.2.4
@@ -0,0 +1,8 @@
1
+ require "lobiboxing/rails/version"
2
+
3
+ module Lobibox
4
+ module Rails
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Lobibox
2
+ module Rails
3
+ VERSION = "1.2.4"
4
+ end
5
+ end
@@ -0,0 +1,1572 @@
1
+ //Author : @arboshiki
2
+ //create lobibox object
3
+ var Lobibox = Lobibox || {};
4
+ (function () {
5
+
6
+ Lobibox.counter = 0;
7
+ //------------------------------------------------------------------------------
8
+ //------------------------------------------------------------------------------
9
+
10
+ //User can set default properties for prompt in the following way
11
+ //Lobibox.prompt.DEFAULT_OPTIONS = object;
12
+ Lobibox.prompt = function (type, options) {
13
+ return new LobiboxPrompt(type, options);
14
+ };
15
+ //User can set default properties for confirm in the following way
16
+ //Lobibox.confirm.DEFAULT_OPTIONS = object;
17
+ Lobibox.confirm = function (options) {
18
+ return new LobiboxConfirm(options);
19
+ };
20
+ //User can set default properties for progress in the following way
21
+ //Lobibox.progress.DEFAULT_OPTIONS = object;
22
+ Lobibox.progress = function (options) {
23
+ return new LobiboxProgress(options);
24
+ };
25
+ //Create empty objects in order user to be able to set default options in the following way
26
+ //Lobibox.error.DEFAULT_OPTIONS = object;
27
+ //Lobibox.success.DEFAULT_OPTIONS = object;
28
+ //Lobibox.warning.DEFAULT_OPTIONS = object;
29
+ //Lobibox.info.DEFAULT_OPTIONS = object;
30
+
31
+ Lobibox.error = {};
32
+ Lobibox.success = {};
33
+ Lobibox.warning = {};
34
+ Lobibox.info = {};
35
+
36
+ //User can set default properties for alert in the following way
37
+ //Lobibox.alert.DEFAULT_OPTIONS = object;
38
+ Lobibox.alert = function (type, options) {
39
+ if (["success", "error", "warning", "info"].indexOf(type) > -1) {
40
+ return new LobiboxAlert(type, options);
41
+ }
42
+ };
43
+ //User can set default properties for window in the following way
44
+ //Lobibox.window.DEFAULT_OPTIONS = object;
45
+ Lobibox.window = function (options) {
46
+ return new LobiboxWindow('window', options);
47
+ };
48
+
49
+
50
+ /**
51
+ * Base prototype for all messageboxes and window
52
+ */
53
+ var LobiboxBase = {
54
+ $type: null,
55
+ $el: null,
56
+ $options: null,
57
+ debug: function () {
58
+ if (this.$options.debug) {
59
+ window.console.debug.apply(window.console, arguments);
60
+ }
61
+ },
62
+ _processInput: function (options) {
63
+ if ($.isArray(options.buttons)) {
64
+ var btns = {};
65
+ for (var i = 0; i < options.buttons.length; i++) {
66
+ btns[options.buttons[i]] = Lobibox.base.OPTIONS.buttons[options.buttons[i]];
67
+ }
68
+ options.buttons = btns;
69
+ }
70
+ options.customBtnClass = options.customBtnClass ? options.customBtnClass : Lobibox.base.DEFAULTS.customBtnClass;
71
+ for (var i in options.buttons) {
72
+ if (options.buttons.hasOwnProperty(i)) {
73
+ var btn = options.buttons[i];
74
+ btn = $.extend({}, Lobibox.base.OPTIONS.buttons[i], btn);
75
+ if (!btn['class']) {
76
+ btn['class'] = options.customBtnClass;
77
+ }
78
+ options.buttons[i] = btn;
79
+ }
80
+ }
81
+ options = $.extend({}, Lobibox.base.DEFAULTS, options);
82
+ if (options.showClass === undefined) {
83
+ options.showClass = Lobibox.base.OPTIONS.showClass;
84
+ }
85
+ if (options.hideClass === undefined) {
86
+ options.hideClass = Lobibox.base.OPTIONS.hideClass;
87
+ }
88
+ if (options.baseClass === undefined) {
89
+ options.baseClass = Lobibox.base.OPTIONS.baseClass;
90
+ }
91
+ if (options.delayToRemove === undefined) {
92
+ options.delayToRemove = Lobibox.base.OPTIONS.delayToRemove;
93
+ }
94
+ if (!options.iconClass) {
95
+ options.iconClass = Lobibox.base.OPTIONS.icons[options.iconSource][this.$type];
96
+ }
97
+ return options;
98
+ },
99
+ _init: function () {
100
+ var me = this;
101
+
102
+ me._createMarkup();
103
+ me.setTitle(me.$options.title);
104
+ if (me.$options.draggable && !me._isMobileScreen()) {
105
+ me.$el.addClass('draggable');
106
+ me._enableDrag();
107
+ }
108
+ if (me.$options.closeButton) {
109
+ me._addCloseButton();
110
+ }
111
+ if (me.$options.closeOnEsc) {
112
+ $(document).on('keyup.lobibox', function (ev) {
113
+ if (ev.which === 27) {
114
+ me.destroy();
115
+ }
116
+ });
117
+ }
118
+ if (me.$options.baseClass) {
119
+ me.$el.addClass(me.$options.baseClass);
120
+ }
121
+ if (me.$options.showClass) {
122
+ me.$el.removeClass(me.$options.hideClass);
123
+ me.$el.addClass(me.$options.showClass);
124
+ }
125
+ me.$el.data('lobibox', me);
126
+ },
127
+
128
+ /**
129
+ * Calculate top, left position based on string keyword
130
+ *
131
+ * @param {string} position "'top', 'center', 'bottom'"
132
+ * @returns {{left: number, top: number}}
133
+ * @private
134
+ */
135
+ _calculatePosition: function (position) {
136
+ var me = this;
137
+ var top;
138
+ if (position === 'top') {
139
+ top = 30;
140
+ } else if (position === 'bottom') {
141
+ top = $(window).outerHeight() - me.$el.outerHeight() - 30;
142
+ } else {
143
+ top = ($(window).outerHeight() - me.$el.outerHeight()) / 2;
144
+ }
145
+ var left = ($(window).outerWidth() - me.$el.outerWidth()) / 2;
146
+ return {
147
+ left: left,
148
+ top: top
149
+ };
150
+ },
151
+
152
+ _createButton: function (type, op) {
153
+ var me = this;
154
+ var btn = $('<button></button>')
155
+ .addClass(op['class'])
156
+ .attr('data-type', type)
157
+ .html(op.text);
158
+ if (me.$options.callback && typeof me.$options.callback === 'function') {
159
+ btn.on('click.lobibox', function (ev) {
160
+ var bt = $(this);
161
+ me._onButtonClick(me.$options.buttons[type], type);
162
+ me.$options.callback(me, bt.data('type'), ev);
163
+ });
164
+ }
165
+ btn.click(function () {
166
+ me._onButtonClick(me.$options.buttons[type], type);
167
+ });
168
+ return btn;
169
+ },
170
+
171
+ _onButtonClick: function (buttonOptions, type) {
172
+ var me = this;
173
+
174
+ if ((type === 'ok' && me.$type === 'prompt' && me.isValid() || me.$type !== 'prompt' || type !== 'ok')
175
+ && buttonOptions && buttonOptions.closeOnClick) {
176
+ me.destroy();
177
+ }
178
+ },
179
+
180
+ _generateButtons: function () {
181
+ var me = this;
182
+ var btns = [];
183
+ for (var i in me.$options.buttons) {
184
+ if (me.$options.buttons.hasOwnProperty(i)) {
185
+ var op = me.$options.buttons[i];
186
+ var btn = me._createButton(i, op);
187
+ btns.push(btn);
188
+ }
189
+ }
190
+ return btns;
191
+ },
192
+ _createMarkup: function () {
193
+ var me = this;
194
+ var lobibox = $('<div class="lobibox"></div>');
195
+ lobibox.attr('data-is-modal', me.$options.modal);
196
+ var header = $('<div class="lobibox-header"></div>')
197
+ .append('<span class="lobibox-title"></span>')
198
+ ;
199
+ var body = $('<div class="lobibox-body"></div>');
200
+ lobibox.append(header);
201
+ lobibox.append(body);
202
+ if (me.$options.buttons && !$.isEmptyObject(me.$options.buttons)) {
203
+ var footer = $('<div class="lobibox-footer"></div>');
204
+ footer.append(me._generateButtons());
205
+ lobibox.append(footer);
206
+ if (Lobibox.base.OPTIONS.buttonsAlign.indexOf(me.$options.buttonsAlign) > -1) {
207
+ footer.addClass('text-' + me.$options.buttonsAlign);
208
+ }
209
+ }
210
+ me.$el = lobibox
211
+ .addClass(Lobibox.base.OPTIONS.modalClasses[me.$type])
212
+ ;
213
+ },
214
+ _setSize: function () {
215
+ var me = this;
216
+ me.setWidth(me.$options.width);
217
+ if (me.$options.height === 'auto') {
218
+ me.setHeight(me.$el.outerHeight());
219
+ } else {
220
+ me.setHeight(me.$options.height);
221
+ }
222
+ },
223
+ _calculateBodyHeight: function (height) {
224
+ var me = this;
225
+ var headerHeight = me.$el.find('.lobibox-header').outerHeight();
226
+ var footerHeight = me.$el.find('.lobibox-footer').outerHeight();
227
+ return height - (headerHeight ? headerHeight : 0) - (footerHeight ? footerHeight : 0);
228
+
229
+ },
230
+
231
+ /**
232
+ * Add backdrop in case if backdrop does not exist
233
+ *
234
+ * @private
235
+ */
236
+ _addBackdrop: function () {
237
+ if ($('.lobibox-backdrop').length === 0) {
238
+ $('body').append('<div class="lobibox-backdrop"></div>');
239
+ }
240
+ },
241
+
242
+ _triggerEvent: function (type) {
243
+ var me = this;
244
+ if (me.$options[type] && typeof me.$options[type] === 'function') {
245
+ me.$options[type](me);
246
+ }
247
+ },
248
+
249
+ _calculateWidth: function (width) {
250
+ var me = this;
251
+ width = Math.min(Math.max(width, me.$options.width), $(window).outerWidth());
252
+ if (width === $(window).outerWidth()) {
253
+ width -= 2 * me.$options.horizontalOffset;
254
+ }
255
+ return width;
256
+ },
257
+
258
+ _calculateHeight: function (height) {
259
+ var me = this;
260
+ console.log(me.$options.height);
261
+ height = Math.min(Math.max(height, me.$options.height), $(window).outerHeight());
262
+ if (height === $(window).outerHeight()) {
263
+ height -= 2 * me.$options.verticalOffset;
264
+ }
265
+ return height;
266
+ },
267
+
268
+ _addCloseButton: function () {
269
+ var me = this;
270
+ var closeBtn = $('<span class="btn-close">&times;</span>');
271
+ me.$el.find('.lobibox-header').append(closeBtn);
272
+ closeBtn.on('mousedown', function (ev) {
273
+ ev.stopPropagation();
274
+ });
275
+ closeBtn.on('click.lobibox', function () {
276
+ me.destroy();
277
+ });
278
+ },
279
+ _position: function () {
280
+ var me = this;
281
+
282
+ me._setSize();
283
+ var pos = me._calculatePosition();
284
+ me.setPosition(pos.left, pos.top);
285
+ },
286
+ _isMobileScreen: function () {
287
+ return $(window).outerWidth() < 768;
288
+ },
289
+ _enableDrag: function () {
290
+ var el = this.$el,
291
+ heading = el.find('.lobibox-header');
292
+
293
+ heading.on('mousedown.lobibox', function (ev) {
294
+ el.attr('offset-left', ev.offsetX);
295
+ el.attr('offset-top', ev.offsetY);
296
+ el.attr('allow-drag', 'true');
297
+ });
298
+ $(document).on('mouseup.lobibox', function () {
299
+ el.attr('allow-drag', 'false');
300
+ });
301
+ $(document).on('mousemove.lobibox', function (ev) {
302
+ if (el.attr('allow-drag') === 'true') {
303
+ var left = ev.clientX - parseInt(el.attr('offset-left'), 10) - parseInt(el.css('border-left-width'), 10);
304
+ var top = ev.clientY - parseInt(el.attr('offset-top'), 10) - parseInt(el.css('border-top-width'), 10);
305
+ el.css({
306
+ left: left,
307
+ top: top
308
+ });
309
+ }
310
+ });
311
+ },
312
+
313
+ /**
314
+ * Set the message of messagebox
315
+ *
316
+ * @param {string} msg "new message of messagebox"
317
+ * @returns {LobiboxBase}
318
+ * @private
319
+ */
320
+ _setContent: function (msg) {
321
+ var me = this;
322
+ me.$el.find('.lobibox-body').html(msg);
323
+ return me;
324
+ },
325
+
326
+ _beforeShow: function () {
327
+ var me = this;
328
+ me._triggerEvent('onShow');
329
+ },
330
+
331
+ _afterShow: function () {
332
+ var me = this;
333
+ Lobibox.counter++;
334
+ me.$el.attr('data-nth', Lobibox.counter);
335
+ if (!me.$options.draggable){
336
+ $(window).on('resize.lobibox-'+me.$el.attr('data-nth'), function(){
337
+ me.refreshWidth();
338
+ me.refreshHeight();
339
+ me.$el.css('left', '50%').css('margin-left', '-'+(me.$el.width()/2)+'px');
340
+ me.$el.css('top', '50%').css('margin-top', '-'+(me.$el.height()/2)+'px');
341
+ });
342
+ }
343
+
344
+ me._triggerEvent('shown');
345
+ },
346
+
347
+ _beforeClose: function () {
348
+ var me = this;
349
+ me._triggerEvent('beforeClose');
350
+ },
351
+
352
+ _afterClose: function () {
353
+ var me = this;
354
+ if (!me.$options.draggable){
355
+ $(window).off('resize.lobibox-'+me.$el.attr('data-nth'));
356
+ }
357
+ me._triggerEvent('closed');
358
+ },
359
+ //------------------------------------------------------------------------------
360
+ //--------------------------PUBLIC METHODS--------------------------------------
361
+ //------------------------------------------------------------------------------
362
+
363
+ /**
364
+ * Hide the messagebox
365
+ *
366
+ * @returns {LobiboxBase}
367
+ */
368
+ hide: function () {
369
+ var me = this;
370
+ if (me.$options.hideClass) {
371
+ me.$el.removeClass(me.$options.showClass);
372
+ me.$el.addClass(me.$options.hideClass);
373
+ setTimeout(function () {
374
+ callback();
375
+ }, me.$options.delayToRemove);
376
+ } else {
377
+ callback();
378
+ }
379
+ function callback() {
380
+ me.$el.addClass('lobibox-hidden');
381
+ if ($('.lobibox[data-is-modal=true]:not(.lobibox-hidden)').length === 0) {
382
+ $('.lobibox-backdrop').remove();
383
+ $('body').removeClass(Lobibox.base.OPTIONS.bodyClass);
384
+ }
385
+ }
386
+
387
+ return this;
388
+ },
389
+
390
+ /**
391
+ * Removes the messagebox from document
392
+ *
393
+ * @returns {LobiboxBase}
394
+ */
395
+ destroy: function () {
396
+ var me = this;
397
+ me._beforeClose();
398
+ if (me.$options.hideClass) {
399
+ me.$el.removeClass(me.$options.showClass).addClass(me.$options.hideClass);
400
+ setTimeout(function () {
401
+ callback();
402
+ }, me.$options.delayToRemove);
403
+ } else {
404
+ callback();
405
+ }
406
+ function callback() {
407
+ me.$el.remove();
408
+ if ($('.lobibox[data-is-modal=true]').length === 0) {
409
+ $('.lobibox-backdrop').remove();
410
+ $('body').removeClass(Lobibox.base.OPTIONS.bodyClass);
411
+ }
412
+ me._afterClose();
413
+ }
414
+
415
+ return this;
416
+ },
417
+
418
+ /**
419
+ * Set the width of messagebox
420
+ *
421
+ * @param {number} width "new width of messagebox"
422
+ * @returns {LobiboxBase}
423
+ */
424
+ setWidth: function (width) {
425
+ var me = this;
426
+ me.$el.css('width', me._calculateWidth(width));
427
+ return me;
428
+ },
429
+
430
+ refreshWidth: function(){
431
+ this.setWidth(this.$el.width());
432
+ },
433
+
434
+ refreshHeight: function(){
435
+ this.setHeight(this.$el.height());
436
+ },
437
+
438
+ /**
439
+ * Set the height of messagebox
440
+ *
441
+ * @param {number} height "new height of messagebox"
442
+ * @returns {LobiboxBase}
443
+ */
444
+ setHeight: function (height) {
445
+ var me = this;
446
+ me.$el.css('height', me._calculateHeight(height))
447
+ .find('.lobibox-body')
448
+ .css('height', me._calculateBodyHeight(me.$el.innerHeight()));
449
+ return me;
450
+ },
451
+
452
+ /**
453
+ * Set the width and height of messagebox
454
+ *
455
+ * @param {number} width "new width of messagebox"
456
+ * @param {number} height "new height of messagebox"
457
+ * @returns {LobiboxBase}
458
+ */
459
+ setSize: function (width, height) {
460
+ var me = this;
461
+ me.setWidth(width);
462
+ me.setHeight(height);
463
+ return me;
464
+ },
465
+
466
+ /**
467
+ * Set position of messagebox
468
+ *
469
+ * @param {number|String} left "left coordinate of messsagebox or string representaing position. Available: ('top', 'center', 'bottom')"
470
+ * @param {number} top
471
+ * @returns {LobiboxBase}
472
+ */
473
+ setPosition: function (left, top) {
474
+ var pos;
475
+ if (typeof left === 'number' && typeof top === 'number') {
476
+ pos = {
477
+ left: left,
478
+ top: top
479
+ };
480
+ } else if (typeof left === 'string') {
481
+ pos = this._calculatePosition(left);
482
+ }
483
+ this.$el.css(pos);
484
+ return this;
485
+ },
486
+ /**
487
+ * Set the title of messagebox
488
+ *
489
+ * @param {string} title "new title of messagebox"
490
+ * @returns {LobiboxBase}
491
+ */
492
+ setTitle: function (title) {
493
+ return this.$el.find('.lobibox-title').html(title);
494
+ },
495
+
496
+ /**
497
+ * Get the title of messagebox
498
+ *
499
+ * @returns {string}
500
+ */
501
+ getTitle: function () {
502
+ return this.$el.find('.lobibox-title').html();
503
+ },
504
+
505
+ /**
506
+ * Show messagebox
507
+ *
508
+ * @returns {LobiboxBase}
509
+ */
510
+ show: function () {
511
+ var me = this,
512
+ $body = $('body');
513
+
514
+ me._beforeShow();
515
+
516
+ me.$el.removeClass('lobibox-hidden');
517
+ $body.append(me.$el);
518
+ if (me.$options.buttons) {
519
+ var buttons = me.$el.find('.lobibox-footer').children();
520
+ buttons[0].focus();
521
+ }
522
+ if (me.$options.modal) {
523
+ $body.addClass(Lobibox.base.OPTIONS.bodyClass);
524
+ me._addBackdrop();
525
+ }
526
+ if (me.$options.delay !== false) {
527
+ setTimeout(function () {
528
+ me.destroy();
529
+ }, me.$options.delay);
530
+ }
531
+ me._afterShow();
532
+ return me;
533
+ }
534
+ };
535
+ //User can set default options by this variable
536
+ Lobibox.base = {};
537
+ Lobibox.base.OPTIONS = {
538
+ bodyClass: 'lobibox-open',
539
+
540
+ modalClasses: {
541
+ 'error': 'lobibox-error',
542
+ 'success': 'lobibox-success',
543
+ 'info': 'lobibox-info',
544
+ 'warning': 'lobibox-warning',
545
+ 'confirm': 'lobibox-confirm',
546
+ 'progress': 'lobibox-progress',
547
+ 'prompt': 'lobibox-prompt',
548
+ 'default': 'lobibox-default',
549
+ 'window': 'lobibox-window'
550
+ },
551
+ buttonsAlign: ['left', 'center', 'right'],
552
+ buttons: {
553
+ ok: {
554
+ 'class': 'lobibox-btn lobibox-btn-default',
555
+ text: 'OK',
556
+ closeOnClick: true
557
+ },
558
+ cancel: {
559
+ 'class': 'lobibox-btn lobibox-btn-cancel',
560
+ text: 'Cancel',
561
+ closeOnClick: true
562
+ },
563
+ yes: {
564
+ 'class': 'lobibox-btn lobibox-btn-yes',
565
+ text: 'Yes',
566
+ closeOnClick: true
567
+ },
568
+ no: {
569
+ 'class': 'lobibox-btn lobibox-btn-no',
570
+ text: 'No',
571
+ closeOnClick: true
572
+ }
573
+ },
574
+ icons: {
575
+ bootstrap: {
576
+ confirm: 'glyphicon glyphicon-question-sign',
577
+ success: 'glyphicon glyphicon-ok-sign',
578
+ error: 'glyphicon glyphicon-remove-sign',
579
+ warning: 'glyphicon glyphicon-exclamation-sign',
580
+ info: 'glyphicon glyphicon-info-sign'
581
+ },
582
+ fontAwesome: {
583
+ confirm: 'fa fa-question-circle',
584
+ success: 'fa fa-check-circle',
585
+ error: 'fa fa-times-circle',
586
+ warning: 'fa fa-exclamation-circle',
587
+ info: 'fa fa-info-circle'
588
+ }
589
+ }
590
+ };
591
+ Lobibox.base.DEFAULTS = {
592
+ horizontalOffset: 5, //If the messagebox is larger (in width) than window's width. The messagebox's width is reduced to window width - 2 * horizontalOffset
593
+ verticalOffset: 5, //If the messagebox is larger (in height) than window's height. The messagebox's height is reduced to window height - 2 * verticalOffset
594
+ width: 600,
595
+ height: 'auto', // Height is automatically calculated by width
596
+ closeButton: true, // Show close button or not
597
+ draggable: false, // Make messagebox draggable
598
+ customBtnClass: 'lobibox-btn lobibox-btn-default', // Class for custom buttons
599
+ modal: true,
600
+ debug: false,
601
+ buttonsAlign: 'center', // Position where buttons should be aligned
602
+ closeOnEsc: true, // Close messagebox on Esc press
603
+ delayToRemove: 200, // Time after which lobibox will be removed after remove call. (This option is for hide animation to finish)
604
+ delay: false, // Time to remove lobibox after shown
605
+ baseClass: 'animated-super-fast', // Base class to add all messageboxes
606
+ showClass: 'zoomIn', // Show animation class
607
+ hideClass: 'zoomOut', // Hide animation class
608
+ iconSource: 'bootstrap', // "bootstrap" or "fontAwesome" the library which will be used for icons
609
+
610
+ //events
611
+ //When messagebox show is called but before it is actually shown
612
+ onShow: null,
613
+ //After messagebox is shown
614
+ shown: null,
615
+ //When messagebox remove method is called but before it is actually hidden
616
+ beforeClose: null,
617
+ //After messagebox is hidden
618
+ closed: null
619
+ };
620
+ //------------------------------------------------------------------------------
621
+ //-------------------------LobiboxPrompt----------------------------------------
622
+ //------------------------------------------------------------------------------
623
+ function LobiboxPrompt(type, options) {
624
+ this.$input = null;
625
+ this.$type = 'prompt';
626
+ this.$promptType = type;
627
+
628
+ options = $.extend({}, Lobibox.prompt.DEFAULT_OPTIONS, options);
629
+
630
+ this.$options = this._processInput(options);
631
+
632
+ this._init();
633
+ this.debug(this);
634
+ }
635
+
636
+ LobiboxPrompt.prototype = $.extend({}, LobiboxBase, {
637
+ constructor: LobiboxPrompt,
638
+
639
+ _processInput: function (options) {
640
+ var me = this;
641
+
642
+ var mergedOptions = LobiboxBase._processInput.call(me, options);
643
+ mergedOptions.buttons = {
644
+ ok: Lobibox.base.OPTIONS.buttons.ok,
645
+ cancel: Lobibox.base.OPTIONS.buttons.cancel
646
+ };
647
+ options = $.extend({}, mergedOptions, LobiboxPrompt.DEFAULT_OPTIONS, options);
648
+ return options;
649
+ },
650
+
651
+ _init: function () {
652
+ var me = this;
653
+ LobiboxBase._init.call(me);
654
+ me.show();
655
+ },
656
+
657
+ _afterShow: function () {
658
+ var me = this;
659
+ me._setContent(me._createInput())._position();
660
+ me.$input.focus();
661
+ LobiboxBase._afterShow.call(me);
662
+ },
663
+
664
+ _createInput: function () {
665
+ var me = this,
666
+ label;
667
+ if (me.$options.multiline) {
668
+ me.$input = $('<textarea></textarea>').attr('rows', me.$options.lines);
669
+ } else {
670
+ me.$input = $('<input type="' + me.$promptType + '"/>');
671
+ }
672
+ me.$input.addClass('lobibox-input').attr(me.$options.attrs);
673
+ if (me.$options.value) {
674
+ me.setValue(me.$options.value);
675
+ }
676
+ if (me.$options.label) {
677
+ label = $('<label>' + me.$options.label + '</label>');
678
+ }
679
+ return $('<div></div>').append(label, me.$input);
680
+ },
681
+
682
+ /**
683
+ * Set value of input
684
+ *
685
+ * @param {string} val "value of input"
686
+ * @returns {LobiboxPrompt}
687
+ */
688
+ setValue: function (val) {
689
+ this.$input.val(val);
690
+ return this;
691
+ },
692
+
693
+ /**
694
+ * Get value of input
695
+ *
696
+ * @returns {String}
697
+ */
698
+ getValue: function () {
699
+ return this.$input.val();
700
+ },
701
+
702
+ isValid: function () {
703
+ var me = this,
704
+ $error = me.$el.find('.lobibox-input-error-message');
705
+
706
+ if (me.$options.required && !me.getValue()){
707
+ me.$input.addClass('invalid');
708
+ if ($error.length === 0){
709
+ me.$el.find('.lobibox-body').append('<p class="lobibox-input-error-message">'+me.$options.errorMessage+'</p>');
710
+ me._position();
711
+ me.$input.focus();
712
+ }
713
+ return false;
714
+ }
715
+ me.$input.removeClass('invalid');
716
+ $error.remove();
717
+ me._position();
718
+ me.$input.focus();
719
+
720
+ return true;
721
+ }
722
+ });
723
+
724
+ LobiboxPrompt.DEFAULT_OPTIONS = {
725
+ width: 400,
726
+ attrs: {}, // Object of any valid attribute of input field
727
+ value: '', // Value which is given to textfield when messagebox is created
728
+ multiline: false, // Set this true for multiline prompt
729
+ lines: 3, // This works only for multiline prompt. Number of lines
730
+ type: 'text', // Prompt type. Available types (text|number|color)
731
+ label: '', // Set some text which will be shown exactly on top of textfield
732
+ required: true,
733
+ errorMessage: 'The field is required'
734
+ };
735
+ //------------------------------------------------------------------------------
736
+ //-------------------------LobiboxConfirm---------------------------------------
737
+ //------------------------------------------------------------------------------
738
+ function LobiboxConfirm(options) {
739
+ this.$type = 'confirm';
740
+
741
+ // options = $.extend({}, Lobibox.confirm.DEFAULT_OPTIONS, options);
742
+
743
+ this.$options = this._processInput(options);
744
+ this._init();
745
+ this.debug(this);
746
+ }
747
+
748
+ LobiboxConfirm.prototype = $.extend({}, LobiboxBase, {
749
+ constructor: LobiboxConfirm,
750
+
751
+ _processInput: function (options) {
752
+ var me = this;
753
+
754
+ var mergedOptions = LobiboxBase._processInput.call(me, options);
755
+ mergedOptions.buttons = {
756
+ yes: Lobibox.base.OPTIONS.buttons.yes,
757
+ no: Lobibox.base.OPTIONS.buttons.no
758
+ };
759
+ options = $.extend({}, mergedOptions, Lobibox.confirm.DEFAULTS, options);
760
+ return options;
761
+ },
762
+
763
+ _init: function () {
764
+ var me = this;
765
+
766
+ LobiboxBase._init.call(me);
767
+ me.show();
768
+ },
769
+
770
+ _afterShow: function () {
771
+ var me = this;
772
+
773
+ var d = $('<div></div>');
774
+ if (me.$options.iconClass) {
775
+ d.append($('<div class="lobibox-icon-wrapper"></div>')
776
+ .append('<i class="lobibox-icon ' + me.$options.iconClass + '"></i>'))
777
+ ;
778
+ }
779
+ d.append('<div class="lobibox-body-text-wrapper"><span class="lobibox-body-text">' + me.$options.msg + '</span></div>');
780
+ me._setContent(d.html());
781
+
782
+ me._position();
783
+
784
+ LobiboxBase._afterShow.call(me);
785
+ }
786
+ });
787
+
788
+ Lobibox.confirm.DEFAULTS = {
789
+ title: 'Question',
790
+ width: 500
791
+ };
792
+ //------------------------------------------------------------------------------
793
+ //-------------------------LobiboxAlert------------------------------------------
794
+ //------------------------------------------------------------------------------
795
+ function LobiboxAlert(type, options) {
796
+ this.$type = type;
797
+
798
+ // options = $.extend({}, Lobibox.alert.DEFAULT_OPTIONS, Lobibox[type].DEFAULT_OPTIONS, options);
799
+
800
+ this.$options = this._processInput(options);
801
+
802
+ this._init();
803
+ this.debug(this);
804
+ }
805
+
806
+ LobiboxAlert.prototype = $.extend({}, LobiboxBase, {
807
+ constructor: LobiboxAlert,
808
+
809
+ _processInput: function (options) {
810
+
811
+ // ALERT_OPTIONS = $.extend({}, LobiboxAlert.OPTIONS, Lobibox.alert.DEFAULTS);
812
+ var me = this;
813
+ var mergedOptions = LobiboxBase._processInput.call(me, options);
814
+ mergedOptions.buttons = {
815
+ ok: Lobibox.base.OPTIONS.buttons.ok
816
+ };
817
+
818
+ options = $.extend({}, mergedOptions, Lobibox.alert.OPTIONS[me.$type], Lobibox.alert.DEFAULTS, options);
819
+
820
+ return options;
821
+ },
822
+
823
+ _init: function () {
824
+ var me = this;
825
+ LobiboxBase._init.call(me);
826
+ me.show();
827
+ },
828
+
829
+ _afterShow: function () {
830
+ var me = this;
831
+
832
+ var d = $('<div></div>');
833
+ if (me.$options.iconClass) {
834
+ d.append($('<div class="lobibox-icon-wrapper"></div>')
835
+ .append('<i class="lobibox-icon ' + me.$options.iconClass + '"></i>'))
836
+ ;
837
+ }
838
+ d.append('<div class="lobibox-body-text-wrapper"><span class="lobibox-body-text">' + me.$options.msg + '</span></div>');
839
+ me._setContent(d.html());
840
+ me._position();
841
+
842
+ LobiboxBase._afterShow.call(me);
843
+ }
844
+ });
845
+ Lobibox.alert.OPTIONS = {
846
+ warning: {
847
+ title: 'Warning'
848
+ },
849
+ info: {
850
+ title: 'Information'
851
+ },
852
+ success: {
853
+ title: 'Success'
854
+ },
855
+ error: {
856
+ title: 'Error'
857
+ }
858
+ };
859
+ //User can set default options by this variable
860
+ Lobibox.alert.DEFAULTS = {};
861
+ //------------------------------------------------------------------------------
862
+ //-------------------------LobiboxProgress--------------------------------------
863
+ //------------------------------------------------------------------------------
864
+ function LobiboxProgress(options) {
865
+ this.$type = 'progress';
866
+ this.$progressBarElement = null;
867
+ this.$options = this._processInput(options);
868
+ this.$progress = 0;
869
+
870
+ this._init();
871
+ this.debug(this);
872
+ }
873
+
874
+ LobiboxProgress.prototype = $.extend({}, LobiboxBase, {
875
+ constructor: LobiboxProgress,
876
+
877
+ _processInput: function (options) {
878
+ var me = this;
879
+ var mergedOptions = LobiboxBase._processInput.call(me, options);
880
+
881
+ options = $.extend({}, mergedOptions, Lobibox.progress.DEFAULTS, options);
882
+ return options;
883
+ },
884
+
885
+ _init: function () {
886
+ var me = this;
887
+
888
+ LobiboxBase._init.call(me);
889
+ me.show();
890
+ },
891
+
892
+ _afterShow: function () {
893
+ var me = this;
894
+
895
+ if (me.$options.progressTpl) {
896
+ me.$progressBarElement = $(me.$options.progressTpl);
897
+ } else {
898
+ me.$progressBarElement = me._createProgressbar();
899
+ }
900
+ var label;
901
+ if (me.$options.label) {
902
+ label = $('<label>' + me.$options.label + '</label>');
903
+ }
904
+ var innerHTML = $('<div></div>').append(label, me.$progressBarElement);
905
+ me._setContent(innerHTML);
906
+ me._position();
907
+
908
+ LobiboxBase._afterShow.call(me);
909
+ },
910
+
911
+ _createProgressbar: function () {
912
+ var me = this;
913
+ var outer = $('<div class="lobibox-progress-bar-wrapper lobibox-progress-outer"></div>')
914
+ .append('<div class="lobibox-progress-bar lobibox-progress-element"></div>')
915
+ ;
916
+ if (me.$options.showProgressLabel) {
917
+ outer.append('<span class="lobibox-progress-text" data-role="progress-text"></span>');
918
+ }
919
+
920
+ return outer;
921
+ },
922
+
923
+ /**
924
+ * Set progress value
925
+ *
926
+ * @param {number} progress "progress value"
927
+ * @returns {LobiboxProgress}
928
+ */
929
+ setProgress: function (progress) {
930
+ var me = this;
931
+ if (me.$progress === 100) {
932
+ return;
933
+ }
934
+ progress = Math.min(100, Math.max(0, progress));
935
+ me.$progress = progress;
936
+ me._triggerEvent('progressUpdated');
937
+ if (me.$progress === 100) {
938
+ me._triggerEvent('progressCompleted');
939
+ }
940
+ me.$el.find('.lobibox-progress-element').css('width', progress.toFixed(1) + "%");
941
+ me.$el.find('[data-role="progress-text"]').html(progress.toFixed(1) + "%");
942
+ return me;
943
+ },
944
+
945
+ /**
946
+ * Get progress value
947
+ *
948
+ * @returns {number}
949
+ */
950
+ getProgress: function () {
951
+ return this.$progress;
952
+ }
953
+ });
954
+
955
+ Lobibox.progress.DEFAULTS = {
956
+ width: 500,
957
+ showProgressLabel: true, // Show percentage of progress
958
+ label: '', // Show progress label
959
+ progressTpl: false, //Template of progress bar
960
+
961
+ //Events
962
+ progressUpdated: null,
963
+ progressCompleted: null
964
+ };
965
+ //------------------------------------------------------------------------------
966
+ //-------------------------LobiboxWindow----------------------------------------
967
+ //------------------------------------------------------------------------------
968
+ function LobiboxWindow(type, options) {
969
+ this.$type = type;
970
+
971
+ this.$options = this._processInput(options);
972
+
973
+ this._init();
974
+ this.debug(this);
975
+ }
976
+
977
+ LobiboxWindow.prototype = $.extend({}, LobiboxBase, {
978
+ constructor: LobiboxWindow,
979
+ _processInput: function (options) {
980
+ var me = this;
981
+ var mergedOptions = LobiboxBase._processInput.call(me, options);
982
+
983
+ if (options.content && typeof options.content === 'function') {
984
+ options.content = options.content();
985
+ }
986
+ if (options.content instanceof jQuery) {
987
+ options.content = options.content.clone();
988
+ }
989
+ options = $.extend({}, mergedOptions, Lobibox.window.DEFAULTS, options);
990
+ return options;
991
+ },
992
+
993
+ _init: function () {
994
+ var me = this;
995
+
996
+ LobiboxBase._init.call(me);
997
+ me.setContent(me.$options.content);
998
+ if (me.$options.url && me.$options.autoload) {
999
+ if (!me.$options.showAfterLoad) {
1000
+ me.show();
1001
+ }
1002
+ me.load(function () {
1003
+ if (me.$options.showAfterLoad) {
1004
+ me.show();
1005
+ }
1006
+ });
1007
+ } else {
1008
+ me.show();
1009
+ }
1010
+ },
1011
+
1012
+ _afterShow: function () {
1013
+ var me = this;
1014
+
1015
+ me._position();
1016
+
1017
+ LobiboxBase._afterShow.call(me);
1018
+ },
1019
+
1020
+ /**
1021
+ * Setter method for <code>params</code> option
1022
+ *
1023
+ * @param {object} params "new params"
1024
+ * @returns {LobiboxWindow}
1025
+ */
1026
+ setParams: function (params) {
1027
+ var me = this;
1028
+ me.$options.params = params;
1029
+ return me;
1030
+ },
1031
+ /**
1032
+ * Getter method for <code>params</code>
1033
+ *
1034
+ * @returns {object}
1035
+ */
1036
+ getParams: function () {
1037
+ var me = this;
1038
+ return me.$options.params;
1039
+ },
1040
+ /**
1041
+ * Setter method of <code>loadMethod</code> option
1042
+ *
1043
+ * @param {string} method "new method"
1044
+ * @returns {LobiboxWindow}
1045
+ */
1046
+ setLoadMethod: function (method) {
1047
+ var me = this;
1048
+ me.$options.loadMethod = method;
1049
+ return me;
1050
+ },
1051
+ /**
1052
+ * Getter method for <code>loadMethod</code> option
1053
+ *
1054
+ * @returns {string}
1055
+ */
1056
+ getLoadMethod: function () {
1057
+ var me = this;
1058
+ return me.$options.loadMethod;
1059
+ },
1060
+ /**
1061
+ * Setter method of <code>content</code> option.
1062
+ * Change the content of window
1063
+ *
1064
+ * @param {string} content "new content"
1065
+ * @returns {LobiboxWindow}
1066
+ */
1067
+ setContent: function (content) {
1068
+ var me = this;
1069
+ me.$options.content = content;
1070
+ me.$el.find('.lobibox-body').html('').append(content);
1071
+ return me;
1072
+ },
1073
+ /**
1074
+ * Getter method of <code>content</code> option
1075
+ *
1076
+ * @returns {string}
1077
+ */
1078
+ getContent: function () {
1079
+ var me = this;
1080
+ return me.$options.content;
1081
+ },
1082
+ /**
1083
+ * Setter method of <code>url</code> option
1084
+ *
1085
+ * @param {string} url "new url"
1086
+ * @returns {LobiboxWindow}
1087
+ */
1088
+ setUrl: function (url) {
1089
+ this.$options.url = url;
1090
+ return this;
1091
+ },
1092
+ /**
1093
+ * Getter method of <code>url</code> option
1094
+ *
1095
+ * @returns {String}
1096
+ */
1097
+ getUrl: function () {
1098
+ return this.$options.url;
1099
+ },
1100
+ /**
1101
+ * Loads content to window by ajax from specific url
1102
+ *
1103
+ * @param {Function} callback "callback function"
1104
+ * @returns {LobiboxWindow}
1105
+ */
1106
+ load: function (callback) {
1107
+ var me = this;
1108
+ if (!me.$options.url) {
1109
+ return me;
1110
+ }
1111
+ $.ajax(me.$options.url, {
1112
+ method: me.$options.loadMethod,
1113
+ data: me.$options.params
1114
+ }).done(function (res) {
1115
+ me.setContent(res);
1116
+ if (callback && typeof callback === 'function') {
1117
+ callback(res);
1118
+ }
1119
+ });
1120
+ return me;
1121
+ }
1122
+ });
1123
+
1124
+ Lobibox.window.DEFAULTS = {
1125
+ width: 480,
1126
+ height: 600,
1127
+ content: '', // HTML Content of window
1128
+ url: '', // URL which will be used to load content
1129
+ draggable: true, // Override default option
1130
+ autoload: true, // Auto load from given url when window is created
1131
+ loadMethod: 'GET', // Ajax method to load content
1132
+ showAfterLoad: true, // Show window after content is loaded or show and then load content
1133
+ params: {} // Parameters which will be send by ajax for loading content
1134
+ };
1135
+
1136
+ })();
1137
+
1138
+ //Author : @arboshiki
1139
+ /**
1140
+ * Generates random string of n length.
1141
+ * String contains only letters and numbers
1142
+ *
1143
+ * @param {int} n
1144
+ * @returns {String}
1145
+ */
1146
+ Math.randomString = function (n) {
1147
+ var text = "";
1148
+ var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
1149
+
1150
+ for (var i = 0; i < n; i++)
1151
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
1152
+
1153
+ return text;
1154
+ };
1155
+ var Lobibox = Lobibox || {};
1156
+ (function () {
1157
+
1158
+ var LobiboxNotify = function (type, options) {
1159
+ //------------------------------------------------------------------------------
1160
+ //----------------PROTOTYPE VARIABLES-------------------------------------------
1161
+ //------------------------------------------------------------------------------
1162
+ this.$type = null;
1163
+ this.$options = null;
1164
+ this.$el = null;
1165
+ //------------------------------------------------------------------------------
1166
+ //-----------------PRIVATE VARIABLES--------------------------------------------
1167
+ //------------------------------------------------------------------------------
1168
+ var me = this;
1169
+ //------------------------------------------------------------------------------
1170
+ //-----------------PRIVATE FUNCTIONS--------------------------------------------
1171
+ //------------------------------------------------------------------------------
1172
+ var _processInput = function (options) {
1173
+
1174
+ if (options.size === 'mini' || options.size === 'large') {
1175
+ options = $.extend({}, Lobibox.notify.OPTIONS[options.size], options);
1176
+ }
1177
+ options = $.extend({}, Lobibox.notify.OPTIONS[me.$type], Lobibox.notify.DEFAULTS, options);
1178
+
1179
+ if (options.size !== 'mini' && options.title === true) {
1180
+ options.title = Lobibox.notify.OPTIONS[me.$type].title;
1181
+ } else if (options.size === 'mini' && options.title === true) {
1182
+ options.title = false;
1183
+ }
1184
+ if (options.icon === true) {
1185
+ options.icon = Lobibox.notify.OPTIONS.icons[options.iconSource][me.$type];
1186
+ }
1187
+ if (options.sound === true) {
1188
+ options.sound = Lobibox.notify.OPTIONS[me.$type].sound;
1189
+ }
1190
+ if (options.sound) {
1191
+ options.sound = options.soundPath + options.sound + options.soundExt;
1192
+ }
1193
+ return options;
1194
+ };
1195
+
1196
+ var _appendInWrapper = function ($el, $wrapper) {
1197
+ if (me.$options.size === 'normal') {
1198
+ if ($wrapper.hasClass('bottom')) {
1199
+ $wrapper.prepend($el);
1200
+ } else {
1201
+ $wrapper.append($el);
1202
+ }
1203
+
1204
+ } else if (me.$options.size === 'mini') {
1205
+ if ($wrapper.hasClass('bottom')) {
1206
+ $wrapper.prepend($el);
1207
+ } else {
1208
+ $wrapper.append($el);
1209
+ }
1210
+ } else if (me.$options.size === 'large') {
1211
+ var tabPane = _createTabPane().append($el);
1212
+ var $li = _createTabControl(tabPane.attr('id'));
1213
+ $wrapper.find('.lb-notify-wrapper').append(tabPane);
1214
+ $wrapper.find('.lb-notify-tabs').append($li);
1215
+ _activateTab($li);
1216
+ $li.find('>a').click(function () {
1217
+ _activateTab($li);
1218
+ });
1219
+ }
1220
+ };
1221
+ var _activateTab = function ($li) {
1222
+ $li.closest('.lb-notify-tabs').find('>li').removeClass('active');
1223
+ $li.addClass('active');
1224
+ var $current = $($li.find('>a').attr('href'));
1225
+ $current.closest('.lb-notify-wrapper').find('>.lb-tab-pane').removeClass('active');
1226
+ $current.addClass('active')
1227
+ };
1228
+ var _createTabControl = function (tabPaneId) {
1229
+ var $li = $('<li></li>', {
1230
+ 'class': Lobibox.notify.OPTIONS[me.$type]['class']
1231
+ });
1232
+ $('<a></a>', {
1233
+ 'href': '#' + tabPaneId
1234
+ }).append('<i class="tab-control-icon ' + me.$options.icon + '"></i>')
1235
+ .appendTo($li);
1236
+ return $li;
1237
+ };
1238
+ var _createTabPane = function () {
1239
+ return $('<div></div>', {
1240
+ 'class': 'lb-tab-pane',
1241
+ 'id': Math.randomString(10)
1242
+ })
1243
+ };
1244
+ var _createNotifyWrapper = function () {
1245
+ var selector = (me.$options.size === 'large' ? '.lobibox-notify-wrapper-large' : '.lobibox-notify-wrapper')
1246
+ + "." + me.$options.position.replace(/\s/gi, '.'),
1247
+ $wrapper;
1248
+
1249
+ //var classes = me.$options.position.split(" ");
1250
+ $wrapper = $(selector);
1251
+ if ($wrapper.length === 0) {
1252
+ $wrapper = $('<div></div>')
1253
+ .addClass(selector.replace(/\./g, ' ').trim())
1254
+ .appendTo($('body'));
1255
+ if (me.$options.size === 'large') {
1256
+ $wrapper.append($('<ul class="lb-notify-tabs"></ul>'))
1257
+ .append($('<div class="lb-notify-wrapper"></div>'));
1258
+ }
1259
+ }
1260
+ return $wrapper;
1261
+ };
1262
+ var _createNotify = function () {
1263
+ var OPTS = Lobibox.notify.OPTIONS,
1264
+ $iconEl,
1265
+ $innerIconEl,
1266
+ $iconWrapper,
1267
+ $body,
1268
+ $msg,
1269
+ $notify = $('<div></div>', {
1270
+ 'class': 'lobibox-notify ' + OPTS[me.$type]['class'] + ' ' + OPTS['class'] + ' ' + me.$options.showClass
1271
+ });
1272
+
1273
+ $iconWrapper = $('<div class="lobibox-notify-icon-wrapper"></div>').appendTo($notify);
1274
+ $iconEl = $('<div class="lobibox-notify-icon"></div>').appendTo($iconWrapper);
1275
+ $innerIconEl = $('<div></div>').appendTo($iconEl);
1276
+
1277
+ // Add image or icon depending on given parameters
1278
+ if (me.$options.img) {
1279
+ $innerIconEl.append('<img src="' + me.$options.img + '"/>');
1280
+ } else if (me.$options.icon) {
1281
+ $innerIconEl.append('<div class="icon-el"><i class="' + me.$options.icon + '"></i></div>');
1282
+ } else {
1283
+ $notify.addClass('without-icon');
1284
+ }
1285
+ // Create body, append title and message in body and append body in notification
1286
+ $msg = $('<div class="lobibox-notify-msg">' + me.$options.msg + '</div>');
1287
+
1288
+ if (me.$options.messageHeight !== false) {
1289
+ $msg.css('max-height', me.$options.messageHeight);
1290
+ }
1291
+
1292
+ $body = $('<div></div>', {
1293
+ 'class': 'lobibox-notify-body'
1294
+ }).append($msg).appendTo($notify);
1295
+
1296
+ if (me.$options.title) {
1297
+ $body.prepend('<div class="lobibox-notify-title">' + me.$options.title + '<div>');
1298
+ }
1299
+ _addCloseButton($notify);
1300
+ if (me.$options.size === 'normal' || me.$options.size === 'mini') {
1301
+ _addCloseOnClick($notify);
1302
+ _addDelay($notify);
1303
+ }
1304
+
1305
+ // Give width to notification
1306
+ if (me.$options.width) {
1307
+ $notify.css('width', _calculateWidth(me.$options.width));
1308
+ }
1309
+
1310
+ return $notify;
1311
+ };
1312
+ var _addCloseButton = function ($el) {
1313
+ if (!me.$options.closable) {
1314
+ return;
1315
+ }
1316
+ $('<span class="lobibox-close">&times;</span>').click(function () {
1317
+ me.remove();
1318
+ }).appendTo($el);
1319
+ };
1320
+ var _addCloseOnClick = function ($el) {
1321
+ if (!me.$options.closeOnClick) {
1322
+ return;
1323
+ }
1324
+ $el.click(function () {
1325
+ me.remove();
1326
+ });
1327
+ };
1328
+ var _addDelay = function ($el) {
1329
+ if (!me.$options.delay) {
1330
+ return;
1331
+ }
1332
+ if (me.$options.delayIndicator) {
1333
+ var delay = $('<div class="lobibox-delay-indicator"><div></div></div>');
1334
+ $el.append(delay);
1335
+ }
1336
+ var time = 0;
1337
+ var interval = 1000 / 30;
1338
+ var currentTime = new Date().getTime();
1339
+ var timer = setInterval(function () {
1340
+ if (me.$options.continueDelayOnInactiveTab){
1341
+ time = new Date().getTime() - currentTime;
1342
+ } else {
1343
+ time += interval;
1344
+ }
1345
+
1346
+ var width = 100 * time / me.$options.delay;
1347
+ if (width >= 100) {
1348
+ width = 100;
1349
+ me.remove();
1350
+ timer = clearInterval(timer);
1351
+ }
1352
+ if (me.$options.delayIndicator) {
1353
+ delay.find('div').css('width', width + "%");
1354
+ }
1355
+
1356
+ }, interval);
1357
+
1358
+ if (me.$options.pauseDelayOnHover) {
1359
+ $el.on('mouseenter.lobibox', function () {
1360
+ interval = 0;
1361
+ }).on('mouseleave.lobibox', function () {
1362
+ interval = 1000 / 30;
1363
+ });
1364
+ }
1365
+ };
1366
+ var _findTabToActivate = function ($li) {
1367
+ var $itemToActivate = $li.prev();
1368
+ if ($itemToActivate.length === 0) {
1369
+ $itemToActivate = $li.next();
1370
+ }
1371
+ if ($itemToActivate.length === 0) {
1372
+ return null;
1373
+ }
1374
+ return $itemToActivate;
1375
+ };
1376
+ var _calculateWidth = function (width) {
1377
+ width = Math.min($(window).outerWidth(), width);
1378
+ return width;
1379
+ };
1380
+ //------------------------------------------------------------------------------
1381
+ //----------------PROTOTYPE FUNCTIONS-------------------------------------------
1382
+ //------------------------------------------------------------------------------
1383
+ /**
1384
+ * Delete the notification
1385
+ *
1386
+ * @returns {LobiboxNotify}
1387
+ */
1388
+ this.remove = function () {
1389
+ me.$el.removeClass(me.$options.showClass)
1390
+ .addClass(me.$options.hideClass);
1391
+ var parent = me.$el.parent();
1392
+ var wrapper = parent.closest('.lobibox-notify-wrapper-large');
1393
+
1394
+ var href = '#' + parent.attr('id');
1395
+
1396
+ var $li = wrapper.find('>.lb-notify-tabs>li:has(a[href="' + href + '"])');
1397
+ $li.addClass(Lobibox.notify.OPTIONS['class'])
1398
+ .addClass(me.$options.hideClass);
1399
+ setTimeout(function () {
1400
+ if (me.$options.size === 'normal' || me.$options.size === 'mini') {
1401
+ me.$el.remove();
1402
+ } else if (me.$options.size === 'large') {
1403
+
1404
+ var $newLi = _findTabToActivate($li);
1405
+ if ($newLi) {
1406
+ _activateTab($newLi);
1407
+ }
1408
+ $li.remove();
1409
+ parent.remove();
1410
+ }
1411
+ var list = Lobibox.notify.list;
1412
+ var ind = list.indexOf(me);
1413
+ list.splice(ind, 1);
1414
+ var next = list[ind];
1415
+ if (next && next.$options.showAfterPrevious){
1416
+ next._init();
1417
+ }
1418
+ }, 500);
1419
+ return me;
1420
+ };
1421
+ me._init = function () {
1422
+ // Create notification
1423
+ var $notify = _createNotify();
1424
+ if (me.$options.size === 'mini') {
1425
+ $notify.addClass('notify-mini');
1426
+ }
1427
+
1428
+ if (typeof me.$options.position === 'string') {
1429
+ var $wrapper = _createNotifyWrapper();
1430
+ _appendInWrapper($notify, $wrapper);
1431
+ if ($wrapper.hasClass('center')) {
1432
+ $wrapper.css('margin-left', '-' + ($wrapper.width() / 2) + "px");
1433
+ }
1434
+ } else {
1435
+ $('body').append($notify);
1436
+ $notify.css({
1437
+ 'position': 'fixed',
1438
+ left: me.$options.position.left,
1439
+ top: me.$options.position.top
1440
+ })
1441
+ }
1442
+
1443
+ me.$el = $notify;
1444
+ if (me.$options.sound) {
1445
+ var snd = new Audio(me.$options.sound); // buffers automatically when created
1446
+ snd.play();
1447
+ }
1448
+ if (me.$options.rounded) {
1449
+ me.$el.addClass('rounded');
1450
+ }
1451
+ me.$el.on('click.lobibox', function(ev){
1452
+ if (me.$options.onClickUrl){
1453
+ window.location.href = me.$options.onClickUrl;
1454
+ }
1455
+ if (me.$options.onClick && typeof me.$options.onClick === 'function'){
1456
+ me.$options.onClick.call(me, ev);
1457
+ }
1458
+ });
1459
+ me.$el.data('lobibox', me);
1460
+ };
1461
+ //------------------------------------------------------------------------------
1462
+ //------------------------------------------------------------------------------
1463
+ //------------------------------------------------------------------------------
1464
+ this.$type = type;
1465
+ this.$options = _processInput(options);
1466
+ if (!me.$options.showAfterPrevious || Lobibox.notify.list.length === 0){
1467
+ this._init();
1468
+ }
1469
+
1470
+ };
1471
+
1472
+ Lobibox.notify = function (type, options) {
1473
+ if (["default", "info", "warning", "error", "success"].indexOf(type) > -1) {
1474
+ var lobibox = new LobiboxNotify(type, options);
1475
+ Lobibox.notify.list.push(lobibox);
1476
+ return lobibox;
1477
+ }
1478
+ };
1479
+ Lobibox.notify.list = [];
1480
+ Lobibox.notify.closeAll = function () {
1481
+ var list = Lobibox.notify.list;
1482
+ for (var i in list){
1483
+ list[i].remove();
1484
+ }
1485
+ };
1486
+ //User can set default options to this variable
1487
+ Lobibox.notify.DEFAULTS = {
1488
+ title: true, // Title of notification. If you do not include the title in options it will automatically takes its value
1489
+ //from Lobibox.notify.OPTIONS object depending of the type of the notifications or set custom string. Set this false to disable title
1490
+ size: 'normal', // normal, mini, large
1491
+ soundPath: 'sounds/', // The folder path where sounds are located
1492
+ soundExt: '.ogg', // Default extension for all sounds
1493
+ showClass: 'fadeInDown', // Show animation class.
1494
+ hideClass: 'zoomOut', // Hide animation class.
1495
+ icon: true, // Icon of notification. Leave as is for default icon or set custom string
1496
+ msg: '', // Message of notification
1497
+ img: null, // Image source string
1498
+ closable: true, // Make notifications closable
1499
+ hideCloseButton: false, // Notification may be closable but you can hide close button and it will be closed by clicking on notification itsef
1500
+ delay: 5000, // Hide notification after this time (in miliseconds)
1501
+ delayIndicator: true, // Show timer indicator
1502
+ closeOnClick: true, // Close notifications by clicking on them
1503
+ width: 400, // Width of notification box
1504
+ sound: true, // Sound of notification. Set this false to disable sound. Leave as is for default sound or set custom soud path
1505
+ // Place to show notification. Available options: "top left", "top right", "bottom left", "bottom right", "center top", "center bottom"
1506
+ // It can also be object {left: number, top: number} to position notification at any place
1507
+ position: "bottom right",
1508
+ iconSource: 'bootstrap', // "bootstrap" or "fontAwesome" the library which will be used for icons
1509
+ rounded: false, // Whether to make notification corners rounded
1510
+ messageHeight: 60, // Notification message maximum height. This is not for notification itself, this is for <code>.lobibox-notify-msg</code>
1511
+ pauseDelayOnHover: true, // When you mouse over on notification delay (if it is enabled) will be paused.
1512
+ onClickUrl: null, // The url which will be opened when notification is clicked
1513
+ showAfterPrevious: false, // Set this to true if you want notification not to be shown until previous notification is closed. This is useful for notification queues
1514
+ continueDelayOnInactiveTab: true, // Continue delay when browser tab is inactive
1515
+
1516
+ // Events
1517
+ onClick: null
1518
+ };
1519
+ //This variable is necessary.
1520
+ Lobibox.notify.OPTIONS = {
1521
+ 'class': 'animated-fast',
1522
+ large: {
1523
+ width: 500,
1524
+ messageHeight: 96
1525
+ },
1526
+ mini: {
1527
+ 'class': 'notify-mini',
1528
+ messageHeight: 32
1529
+ },
1530
+ default: {
1531
+ 'class': 'lobibox-notify-default',
1532
+ 'title': 'Default',
1533
+ sound: false
1534
+ },
1535
+ success: {
1536
+ 'class': 'lobibox-notify-success',
1537
+ 'title': 'Success',
1538
+ sound: 'sound2'
1539
+ },
1540
+ error: {
1541
+ 'class': 'lobibox-notify-error',
1542
+ 'title': 'Error',
1543
+ sound: 'sound4'
1544
+ },
1545
+ warning: {
1546
+ 'class': 'lobibox-notify-warning',
1547
+ 'title': 'Warning',
1548
+ sound: 'sound5'
1549
+ },
1550
+ info: {
1551
+ 'class': 'lobibox-notify-info',
1552
+ 'title': 'Information',
1553
+ sound: 'sound6'
1554
+ },
1555
+ icons: {
1556
+ bootstrap: {
1557
+ success: 'glyphicon glyphicon-ok-sign',
1558
+ error: 'glyphicon glyphicon-remove-sign',
1559
+ warning: 'glyphicon glyphicon-exclamation-sign',
1560
+ info: 'glyphicon glyphicon-info-sign'
1561
+ },
1562
+ fontAwesome: {
1563
+ success: 'fa fa-check-circle',
1564
+ error: 'fa fa-times-circle',
1565
+ warning: 'fa fa-exclamation-circle',
1566
+ info: 'fa fa-info-circle'
1567
+ }
1568
+ }
1569
+ };
1570
+ })();
1571
+
1572
+