pnotify-rails 2.0.1.1 → 3.0.0

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.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pnotify-rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/pnotify/index.js +5 -1
  4. data/vendor/assets/javascripts/pnotify/pnotify.animate.js +108 -0
  5. data/vendor/assets/javascripts/pnotify/pnotify.buttons.js +165 -121
  6. data/vendor/assets/javascripts/pnotify/pnotify.callbacks.js +42 -40
  7. data/vendor/assets/javascripts/pnotify/pnotify.confirm.js +145 -139
  8. data/vendor/assets/javascripts/pnotify/pnotify.desktop.js +144 -133
  9. data/vendor/assets/javascripts/pnotify/pnotify.history.js +172 -171
  10. data/vendor/assets/javascripts/pnotify/pnotify.js +873 -0
  11. data/vendor/assets/javascripts/pnotify/pnotify.mobile.js +121 -0
  12. data/vendor/assets/javascripts/pnotify/pnotify.nonblock.js +144 -139
  13. data/vendor/assets/javascripts/pnotify/pnotify.reference.js +131 -116
  14. data/vendor/assets/javascripts/pnotify/pnotify.tooltip.js +15 -0
  15. data/vendor/assets/stylesheets/pnotify/index.css +5 -2
  16. data/vendor/assets/stylesheets/pnotify/pnotify.brighttheme.css +165 -0
  17. data/vendor/assets/stylesheets/pnotify/pnotify.buttons.css +2 -2
  18. data/vendor/assets/stylesheets/pnotify/pnotify.css +112 -0
  19. data/vendor/assets/stylesheets/pnotify/pnotify.history.css +22 -22
  20. data/vendor/assets/stylesheets/pnotify/pnotify.material.css +121 -0
  21. data/vendor/assets/stylesheets/pnotify/pnotify.mobile.css +46 -0
  22. data/vendor/assets/stylesheets/pnotify/pnotify.nonblock.css +7 -0
  23. metadata +12 -6
  24. data/vendor/assets/javascripts/pnotify/pnotify.core.js +0 -778
  25. data/vendor/assets/stylesheets/pnotify/pnotify.core.css +0 -56
  26. data/vendor/assets/stylesheets/pnotify/pnotify.picon.css +0 -11
@@ -1,189 +1,190 @@
1
1
  // History
2
- // Uses AMD or browser globals for jQuery.
3
- (function (factory) {
2
+ (function (root, factory) {
4
3
  if (typeof define === 'function' && define.amd) {
5
4
  // AMD. Register as a module.
6
5
  define('pnotify.history', ['jquery', 'pnotify'], factory);
6
+ } else if (typeof exports === 'object' && typeof module !== 'undefined') {
7
+ // CommonJS
8
+ module.exports = factory(require('jquery'), require('./pnotify'));
7
9
  } else {
8
10
  // Browser globals
9
- factory(jQuery, PNotify);
11
+ factory(root.jQuery, root.PNotify);
10
12
  }
11
- }(function($, PNotify){
12
- var history_menu,
13
- history_handle_top;
14
- $(function(){
15
- $("body").on("pnotify.history-all", function(){
16
- // Display all notices. (Disregarding non-history notices.)
17
- $.each(PNotify.notices, function(){
18
- if (this.modules.history.inHistory) {
19
- if (this.elem.is(":visible")) {
20
- // The hide variable controls whether the history pull down should
21
- // queue a removal timer.
22
- if (this.options.hide)
23
- this.queueRemove();
24
- } else if (this.open)
25
- this.open();
26
- }
27
- });
28
- }).on("pnotify.history-last", function(){
29
- var pushTop = (PNotify.prototype.options.stack.push === "top");
13
+ }(this, function($, PNotify){
14
+ var history_menu,
15
+ history_handle_top;
16
+ $(function(){
17
+ $("body").on("pnotify.history-all", function(){
18
+ // Display all notices. (Disregarding non-history notices.)
19
+ $.each(PNotify.notices, function(){
20
+ if (this.modules.history.inHistory) {
21
+ if (this.elem.is(":visible")) {
22
+ // The hide variable controls whether the history pull down should
23
+ // queue a removal timer.
24
+ if (this.options.hide)
25
+ this.queueRemove();
26
+ } else if (this.open)
27
+ this.open();
28
+ }
29
+ });
30
+ }).on("pnotify.history-last", function(){
31
+ var pushTop = (PNotify.prototype.options.stack.push === "top");
30
32
 
31
- // Look up the last history notice, and display it.
32
- var i = (pushTop ? 0 : -1);
33
+ // Look up the last history notice, and display it.
34
+ var i = (pushTop ? 0 : -1);
33
35
 
34
- var notice;
35
- do {
36
- if (i === -1)
37
- notice = PNotify.notices.slice(i);
38
- else
39
- notice = PNotify.notices.slice(i, i+1);
40
- if (!notice[0])
41
- return false;
36
+ var notice;
37
+ do {
38
+ if (i === -1)
39
+ notice = PNotify.notices.slice(i);
40
+ else
41
+ notice = PNotify.notices.slice(i, i+1);
42
+ if (!notice[0])
43
+ return false;
42
44
 
43
- i = (pushTop ? i + 1 : i - 1);
44
- } while (!notice[0].modules.history.inHistory || notice[0].elem.is(":visible"));
45
- if (notice[0].open)
46
- notice[0].open();
47
- });
48
- });
49
- PNotify.prototype.options.history = {
50
- // Place the notice in the history.
51
- history: true,
52
- // Display a pull down menu to redisplay previous notices.
53
- menu: false,
54
- // Make the pull down menu fixed to the top of the viewport.
55
- fixed: true,
56
- // Maximum number of notifications to have onscreen.
57
- maxonscreen: Infinity,
58
- // The various displayed text, helps facilitating internationalization.
59
- labels: {
60
- redisplay: "Redisplay",
61
- all: "All",
62
- last: "Last"
63
- }
64
- };
65
- PNotify.prototype.modules.history = {
66
- // The history variable controls whether the notice gets redisplayed
67
- // by the history pull down.
68
- inHistory: false,
45
+ i = (pushTop ? i + 1 : i - 1);
46
+ } while (!notice[0].modules.history.inHistory || notice[0].elem.is(":visible"));
47
+ if (notice[0].open)
48
+ notice[0].open();
49
+ });
50
+ });
51
+ PNotify.prototype.options.history = {
52
+ // Place the notice in the history.
53
+ history: true,
54
+ // Display a pull down menu to redisplay previous notices.
55
+ menu: false,
56
+ // Make the pull down menu fixed to the top of the viewport.
57
+ fixed: true,
58
+ // Maximum number of notifications to have onscreen.
59
+ maxonscreen: Infinity,
60
+ // The various displayed text, helps facilitating internationalization.
61
+ labels: {
62
+ redisplay: "Redisplay",
63
+ all: "All",
64
+ last: "Last"
65
+ }
66
+ };
67
+ PNotify.prototype.modules.history = {
68
+ // The history variable controls whether the notice gets redisplayed
69
+ // by the history pull down.
70
+ inHistory: false,
69
71
 
70
- init: function(notice, options){
71
- // Make sure that no notices get destroyed.
72
- notice.options.destroy = false;
72
+ init: function(notice, options){
73
+ // Make sure that no notices get destroyed.
74
+ notice.options.destroy = false;
73
75
 
74
- this.inHistory = options.history;
76
+ this.inHistory = options.history;
75
77
 
76
- if (options.menu) {
77
- // If there isn't a history pull down, create one.
78
- if (typeof history_menu === "undefined") {
79
- history_menu = $("<div />", {
80
- "class": "ui-pnotify-history-container "+notice.styles.hi_menu,
81
- "mouseleave": function(){
82
- history_menu.animate({top: "-"+history_handle_top+"px"}, {duration: 100, queue: false});
83
- }
84
- })
85
- .append($("<div />", {"class": "ui-pnotify-history-header", "text": options.labels.redisplay}))
86
- .append($("<button />", {
87
- "class": "ui-pnotify-history-all "+notice.styles.hi_btn,
88
- "text": options.labels.all,
89
- "mouseenter": function(){
90
- $(this).addClass(notice.styles.hi_btnhov);
91
- },
92
- "mouseleave": function(){
93
- $(this).removeClass(notice.styles.hi_btnhov);
94
- },
95
- "click": function(){
96
- $(this).trigger("pnotify.history-all");
97
- return false;
98
- }
99
- }))
100
- .append($("<button />", {
101
- "class": "ui-pnotify-history-last "+notice.styles.hi_btn,
102
- "text": options.labels.last,
103
- "mouseenter": function(){
104
- $(this).addClass(notice.styles.hi_btnhov);
105
- },
106
- "mouseleave": function(){
107
- $(this).removeClass(notice.styles.hi_btnhov);
108
- },
109
- "click": function(){
110
- $(this).trigger("pnotify.history-last");
111
- return false;
112
- }
113
- }))
114
- .appendTo("body");
78
+ if (options.menu) {
79
+ // If there isn't a history pull down, create one.
80
+ if (typeof history_menu === "undefined") {
81
+ history_menu = $("<div />", {
82
+ "class": "ui-pnotify-history-container "+notice.styles.hi_menu,
83
+ "mouseleave": function(){
84
+ history_menu.animate({top: "-"+history_handle_top+"px"}, {duration: 100, queue: false});
85
+ }
86
+ })
87
+ .append($("<div />", {"class": "ui-pnotify-history-header", "text": options.labels.redisplay}))
88
+ .append($("<button />", {
89
+ "class": "ui-pnotify-history-all "+notice.styles.hi_btn,
90
+ "text": options.labels.all,
91
+ "mouseenter": function(){
92
+ $(this).addClass(notice.styles.hi_btnhov);
93
+ },
94
+ "mouseleave": function(){
95
+ $(this).removeClass(notice.styles.hi_btnhov);
96
+ },
97
+ "click": function(){
98
+ $(this).trigger("pnotify.history-all");
99
+ return false;
100
+ }
101
+ }))
102
+ .append($("<button />", {
103
+ "class": "ui-pnotify-history-last "+notice.styles.hi_btn,
104
+ "text": options.labels.last,
105
+ "mouseenter": function(){
106
+ $(this).addClass(notice.styles.hi_btnhov);
107
+ },
108
+ "mouseleave": function(){
109
+ $(this).removeClass(notice.styles.hi_btnhov);
110
+ },
111
+ "click": function(){
112
+ $(this).trigger("pnotify.history-last");
113
+ return false;
114
+ }
115
+ }))
116
+ .appendTo("body");
115
117
 
116
- // Make a handle so the user can pull down the history tab.
117
- var handle = $("<span />", {
118
- "class": "ui-pnotify-history-pulldown "+notice.styles.hi_hnd,
119
- "mouseenter": function(){
120
- history_menu.animate({top: "0"}, {duration: 100, queue: false});
121
- }
122
- })
123
- .appendTo(history_menu);
118
+ // Make a handle so the user can pull down the history tab.
119
+ var handle = $("<span />", {
120
+ "class": "ui-pnotify-history-pulldown "+notice.styles.hi_hnd,
121
+ "mouseenter": function(){
122
+ history_menu.animate({top: "0"}, {duration: 100, queue: false});
123
+ }
124
+ })
125
+ .appendTo(history_menu);
124
126
 
125
- // Get the top of the handle.
126
- console.log(handle.offset());
127
- history_handle_top = handle.offset().top + 2;
128
- // Hide the history pull down up to the top of the handle.
129
- history_menu.css({top: "-"+history_handle_top+"px"});
127
+ // Get the top of the handle.
128
+ history_handle_top = handle.offset().top + 2;
129
+ // Hide the history pull down up to the top of the handle.
130
+ history_menu.css({top: "-"+history_handle_top+"px"});
130
131
 
131
- // Apply the fixed styling.
132
- if (options.fixed) {
133
- history_menu.addClass('ui-pnotify-history-fixed');
134
- }
135
- }
136
- }
137
- },
138
- update: function(notice, options){
139
- // Update values for history menu access.
140
- this.inHistory = options.history;
141
- if (options.fixed && history_menu) {
142
- history_menu.addClass('ui-pnotify-history-fixed');
143
- } else if (history_menu) {
144
- history_menu.removeClass('ui-pnotify-history-fixed');
145
- }
146
- },
147
- beforeOpen: function(notice, options){
148
- // Remove oldest notifications leaving only options.maxonscreen on screen
149
- if (PNotify.notices && (PNotify.notices.length > options.maxonscreen)) {
150
- // Oldest are normally in front of array, or if stack.push=="top" then
151
- // they are at the end of the array! (issue #98)
152
- var el;
153
- if (notice.options.stack.push !== "top")
154
- el = PNotify.notices.slice(0, PNotify.notices.length - options.maxonscreen);
155
- else
156
- el = PNotify.notices.slice(options.maxonscreen, PNotify.notices.length);
132
+ // Apply the fixed styling.
133
+ if (options.fixed) {
134
+ history_menu.addClass('ui-pnotify-history-fixed');
135
+ }
136
+ }
137
+ }
138
+ },
139
+ update: function(notice, options){
140
+ // Update values for history menu access.
141
+ this.inHistory = options.history;
142
+ if (options.fixed && history_menu) {
143
+ history_menu.addClass('ui-pnotify-history-fixed');
144
+ } else if (history_menu) {
145
+ history_menu.removeClass('ui-pnotify-history-fixed');
146
+ }
147
+ },
148
+ beforeOpen: function(notice, options){
149
+ // Remove oldest notifications leaving only options.maxonscreen on screen
150
+ if (PNotify.notices && (PNotify.notices.length > options.maxonscreen)) {
151
+ // Oldest are normally in front of array, or if stack.push=="top" then
152
+ // they are at the end of the array! (issue #98)
153
+ var el;
154
+ if (notice.options.stack.push !== "top")
155
+ el = PNotify.notices.slice(0, PNotify.notices.length - options.maxonscreen);
156
+ else
157
+ el = PNotify.notices.slice(options.maxonscreen, PNotify.notices.length);
157
158
 
158
- $.each(el, function(){
159
- if (this.remove)
160
- this.remove();
161
- });
162
- }
163
- }
164
- };
165
- $.extend(PNotify.styling.jqueryui, {
166
- hi_menu: "ui-state-default ui-corner-bottom",
167
- hi_btn: "ui-state-default ui-corner-all",
168
- hi_btnhov: "ui-state-hover",
169
- hi_hnd: "ui-icon ui-icon-grip-dotted-horizontal"
170
- });
171
- $.extend(PNotify.styling.bootstrap2, {
172
- hi_menu: "well",
173
- hi_btn: "btn",
174
- hi_btnhov: "",
175
- hi_hnd: "icon-chevron-down"
176
- });
177
- $.extend(PNotify.styling.bootstrap3, {
178
- hi_menu: "well",
179
- hi_btn: "btn btn-default",
180
- hi_btnhov: "",
181
- hi_hnd: "glyphicon glyphicon-chevron-down"
182
- });
183
- $.extend(PNotify.styling.fontawesome, {
184
- hi_menu: "well",
185
- hi_btn: "btn btn-default",
186
- hi_btnhov: "",
187
- hi_hnd: "fa fa-chevron-down"
188
- });
159
+ $.each(el, function(){
160
+ if (this.remove)
161
+ this.remove();
162
+ });
163
+ }
164
+ }
165
+ };
166
+ $.extend(PNotify.styling.jqueryui, {
167
+ hi_menu: "ui-state-default ui-corner-bottom",
168
+ hi_btn: "ui-state-default ui-corner-all",
169
+ hi_btnhov: "ui-state-hover",
170
+ hi_hnd: "ui-icon ui-icon-grip-dotted-horizontal"
171
+ });
172
+ $.extend(PNotify.styling.bootstrap2, {
173
+ hi_menu: "well",
174
+ hi_btn: "btn",
175
+ hi_btnhov: "",
176
+ hi_hnd: "icon-chevron-down"
177
+ });
178
+ $.extend(PNotify.styling.bootstrap3, {
179
+ hi_menu: "well",
180
+ hi_btn: "btn btn-default",
181
+ hi_btnhov: "",
182
+ hi_hnd: "glyphicon glyphicon-chevron-down"
183
+ });
184
+ $.extend(PNotify.styling.fontawesome, {
185
+ hi_menu: "well",
186
+ hi_btn: "btn btn-default",
187
+ hi_btnhov: "",
188
+ hi_hnd: "fa fa-chevron-down"
189
+ });
189
190
  }));
@@ -0,0 +1,873 @@
1
+ /*
2
+ PNotify 3.0.0 sciactive.com/pnotify/
3
+ (C) 2015 Hunter Perrin; Google, Inc.
4
+ license Apache-2.0
5
+ */
6
+ /*
7
+ * ====== PNotify ======
8
+ *
9
+ * http://sciactive.com/pnotify/
10
+ *
11
+ * Copyright 2009-2015 Hunter Perrin
12
+ * Copyright 2015 Google, Inc.
13
+ *
14
+ * Licensed under Apache License, Version 2.0.
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ */
17
+
18
+ (function (root, factory) {
19
+ if (typeof define === 'function' && define.amd) {
20
+ // AMD. Register as a module.
21
+ define('pnotify', ['jquery'], function($){
22
+ return factory($, root);
23
+ });
24
+ } else if (typeof exports === 'object' && typeof module !== 'undefined') {
25
+ // CommonJS
26
+ module.exports = factory(require('jquery'), global || root);
27
+ } else {
28
+ // Browser globals
29
+ root.PNotify = factory(root.jQuery, root);
30
+ }
31
+ }(this, function($, root){
32
+ var init = function(root){
33
+ var default_stack = {
34
+ dir1: "down",
35
+ dir2: "left",
36
+ push: "bottom",
37
+ spacing1: 36,
38
+ spacing2: 36,
39
+ context: $("body"),
40
+ modal: false
41
+ };
42
+ var posTimer, // Position all timer.
43
+ body,
44
+ jwindow = $(root);
45
+ // Set global variables.
46
+ var do_when_ready = function(){
47
+ body = $("body");
48
+ PNotify.prototype.options.stack.context = body;
49
+ jwindow = $(root);
50
+ // Reposition the notices when the window resizes.
51
+ jwindow.bind('resize', function(){
52
+ if (posTimer) {
53
+ clearTimeout(posTimer);
54
+ }
55
+ posTimer = setTimeout(function(){
56
+ PNotify.positionAll(true);
57
+ }, 10);
58
+ });
59
+ };
60
+ var createStackOverlay = function(stack) {
61
+ var overlay = $("<div />", {"class": "ui-pnotify-modal-overlay"});
62
+ overlay.prependTo(stack.context);
63
+ if (stack.overlay_close) {
64
+ // Close the notices on overlay click.
65
+ overlay.click(function(){
66
+ PNotify.removeStack(stack);
67
+ });
68
+ }
69
+ return overlay;
70
+ };
71
+ var PNotify = function(options){
72
+ this.parseOptions(options);
73
+ this.init();
74
+ };
75
+ $.extend(PNotify.prototype, {
76
+ // The current version of PNotify.
77
+ version: "3.0.0",
78
+
79
+ // === Options ===
80
+
81
+ // Options defaults.
82
+ options: {
83
+ // The notice's title.
84
+ title: false,
85
+ // Whether to escape the content of the title. (Not allow HTML.)
86
+ title_escape: false,
87
+ // The notice's text.
88
+ text: false,
89
+ // Whether to escape the content of the text. (Not allow HTML.)
90
+ text_escape: false,
91
+ // What styling classes to use. (Can be either "brighttheme", "jqueryui", "bootstrap2", "bootstrap3", or "fontawesome".)
92
+ styling: "brighttheme",
93
+ // Additional classes to be added to the notice. (For custom styling.)
94
+ addclass: "",
95
+ // Class to be added to the notice for corner styling.
96
+ cornerclass: "",
97
+ // Display the notice when it is created.
98
+ auto_display: true,
99
+ // Width of the notice.
100
+ width: "300px",
101
+ // Minimum height of the notice. It will expand to fit content.
102
+ min_height: "16px",
103
+ // Type of the notice. "notice", "info", "success", or "error".
104
+ type: "notice",
105
+ // Set icon to true to use the default icon for the selected
106
+ // style/type, false for no icon, or a string for your own icon class.
107
+ icon: true,
108
+ // The animation to use when displaying and hiding the notice. "none"
109
+ // and "fade" are supported through CSS. Others are supported
110
+ // through the Animate module and Animate.css.
111
+ animation: "fade",
112
+ // Speed at which the notice animates in and out. "slow", "normal",
113
+ // or "fast". Respectively, 600ms, 400ms, 200ms.
114
+ animate_speed: "normal",
115
+ // Display a drop shadow.
116
+ shadow: true,
117
+ // After a delay, remove the notice.
118
+ hide: true,
119
+ // Delay in milliseconds before the notice is removed.
120
+ delay: 8000,
121
+ // Reset the hide timer if the mouse moves over the notice.
122
+ mouse_reset: true,
123
+ // Remove the notice's elements from the DOM after it is removed.
124
+ remove: true,
125
+ // Change new lines to br tags.
126
+ insert_brs: true,
127
+ // Whether to remove notices from the global array.
128
+ destroy: true,
129
+ // The stack on which the notices will be placed. Also controls the
130
+ // direction the notices stack.
131
+ stack: default_stack
132
+ },
133
+
134
+ // === Modules ===
135
+
136
+ // This object holds all the PNotify modules. They are used to provide
137
+ // additional functionality.
138
+ modules: {},
139
+ // This runs an event on all the modules.
140
+ runModules: function(event, arg){
141
+ var curArg;
142
+ for (var module in this.modules) {
143
+ curArg = ((typeof arg === "object" && module in arg) ? arg[module] : arg);
144
+ if (typeof this.modules[module][event] === 'function') {
145
+ this.modules[module].notice = this;
146
+ this.modules[module].options = typeof this.options[module] === 'object' ? this.options[module] : {};
147
+ this.modules[module][event](this, typeof this.options[module] === 'object' ? this.options[module] : {}, curArg);
148
+ }
149
+ }
150
+ },
151
+
152
+ // === Class Variables ===
153
+
154
+ state: "initializing", // The state can be "initializing", "opening", "open", "closing", and "closed".
155
+ timer: null, // Auto close timer.
156
+ animTimer: null, // Animation timer.
157
+ styles: null,
158
+ elem: null,
159
+ container: null,
160
+ title_container: null,
161
+ text_container: null,
162
+ animating: false, // Stores what is currently being animated (in or out).
163
+ timerHide: false, // Stores whether the notice was hidden by a timer.
164
+
165
+ // === Events ===
166
+
167
+ init: function(){
168
+ var that = this;
169
+
170
+ // First and foremost, we don't want our module objects all referencing the prototype.
171
+ this.modules = {};
172
+ $.extend(true, this.modules, PNotify.prototype.modules);
173
+
174
+ // Get our styling object.
175
+ if (typeof this.options.styling === "object") {
176
+ this.styles = this.options.styling;
177
+ } else {
178
+ this.styles = PNotify.styling[this.options.styling];
179
+ }
180
+
181
+ // Create our widget.
182
+ // Stop animation, reset the removal timer when the user mouses over.
183
+ this.elem = $("<div />", {
184
+ "class": "ui-pnotify "+this.options.addclass,
185
+ "css": {"display": "none"},
186
+ "aria-live": "assertive",
187
+ "aria-role": "alertdialog",
188
+ "mouseenter": function(e){
189
+ if (that.options.mouse_reset && that.animating === "out") {
190
+ if (!that.timerHide) {
191
+ return;
192
+ }
193
+ that.cancelRemove();
194
+ }
195
+ // Stop the close timer.
196
+ if (that.options.hide && that.options.mouse_reset) {
197
+ that.cancelRemove();
198
+ }
199
+ },
200
+ "mouseleave": function(e){
201
+ // Start the close timer.
202
+ if (that.options.hide && that.options.mouse_reset && that.animating !== "out") {
203
+ that.queueRemove();
204
+ }
205
+ PNotify.positionAll();
206
+ }
207
+ });
208
+ // Maybe we need to fade in/out.
209
+ if (this.options.animation === "fade") {
210
+ this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);
211
+ }
212
+ // Create a container for the notice contents.
213
+ this.container = $("<div />", {
214
+ "class": this.styles.container+" ui-pnotify-container "+(this.options.type === "error" ? this.styles.error : (this.options.type === "info" ? this.styles.info : (this.options.type === "success" ? this.styles.success : this.styles.notice))),
215
+ "role": "alert"
216
+ }).appendTo(this.elem);
217
+ if (this.options.cornerclass !== "") {
218
+ this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass);
219
+ }
220
+ // Create a drop shadow.
221
+ if (this.options.shadow) {
222
+ this.container.addClass("ui-pnotify-shadow");
223
+ }
224
+
225
+
226
+ // Add the appropriate icon.
227
+ if (this.options.icon !== false) {
228
+ $("<div />", {"class": "ui-pnotify-icon"})
229
+ .append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
230
+ .prependTo(this.container);
231
+ }
232
+
233
+ // Add a title.
234
+ this.title_container = $("<h4 />", {
235
+ "class": "ui-pnotify-title"
236
+ })
237
+ .appendTo(this.container);
238
+ if (this.options.title === false) {
239
+ this.title_container.hide();
240
+ } else if (this.options.title_escape) {
241
+ this.title_container.text(this.options.title);
242
+ } else {
243
+ this.title_container.html(this.options.title);
244
+ }
245
+
246
+ // Add text.
247
+ this.text_container = $("<div />", {
248
+ "class": "ui-pnotify-text",
249
+ "aria-role": "alert"
250
+ })
251
+ .appendTo(this.container);
252
+ if (this.options.text === false) {
253
+ this.text_container.hide();
254
+ } else if (this.options.text_escape) {
255
+ this.text_container.text(this.options.text);
256
+ } else {
257
+ this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
258
+ }
259
+
260
+ // Set width and min height.
261
+ if (typeof this.options.width === "string") {
262
+ this.elem.css("width", this.options.width);
263
+ }
264
+ if (typeof this.options.min_height === "string") {
265
+ this.container.css("min-height", this.options.min_height);
266
+ }
267
+
268
+
269
+ // Add the notice to the notice array.
270
+ if (this.options.stack.push === "top") {
271
+ PNotify.notices = $.merge([this], PNotify.notices);
272
+ } else {
273
+ PNotify.notices = $.merge(PNotify.notices, [this]);
274
+ }
275
+ // Now position all the notices if they are to push to the top.
276
+ if (this.options.stack.push === "top") {
277
+ this.queuePosition(false, 1);
278
+ }
279
+
280
+
281
+
282
+
283
+ // Mark the stack so it won't animate the new notice.
284
+ this.options.stack.animation = false;
285
+
286
+ // Run the modules.
287
+ this.runModules('init');
288
+
289
+ // Display the notice.
290
+ if (this.options.auto_display) {
291
+ this.open();
292
+ }
293
+ return this;
294
+ },
295
+
296
+ // This function is for updating the notice.
297
+ update: function(options){
298
+ // Save old options.
299
+ var oldOpts = this.options;
300
+ // Then update to the new options.
301
+ this.parseOptions(oldOpts, options);
302
+ // Maybe we need to fade in/out.
303
+ this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast");
304
+ if (this.options.animation === "fade") {
305
+ this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed);
306
+ }
307
+ // Update the corner class.
308
+ if (this.options.cornerclass !== oldOpts.cornerclass) {
309
+ this.container.removeClass("ui-corner-all "+oldOpts.cornerclass).addClass(this.options.cornerclass);
310
+ }
311
+ // Update the shadow.
312
+ if (this.options.shadow !== oldOpts.shadow) {
313
+ if (this.options.shadow) {
314
+ this.container.addClass("ui-pnotify-shadow");
315
+ } else {
316
+ this.container.removeClass("ui-pnotify-shadow");
317
+ }
318
+ }
319
+ // Update the additional classes.
320
+ if (this.options.addclass === false) {
321
+ this.elem.removeClass(oldOpts.addclass);
322
+ } else if (this.options.addclass !== oldOpts.addclass) {
323
+ this.elem.removeClass(oldOpts.addclass).addClass(this.options.addclass);
324
+ }
325
+ // Update the title.
326
+ if (this.options.title === false) {
327
+ this.title_container.slideUp("fast");
328
+ } else if (this.options.title !== oldOpts.title) {
329
+ if (this.options.title_escape) {
330
+ this.title_container.text(this.options.title);
331
+ } else {
332
+ this.title_container.html(this.options.title);
333
+ }
334
+ if (oldOpts.title === false) {
335
+ this.title_container.slideDown(200);
336
+ }
337
+ }
338
+ // Update the text.
339
+ if (this.options.text === false) {
340
+ this.text_container.slideUp("fast");
341
+ } else if (this.options.text !== oldOpts.text) {
342
+ if (this.options.text_escape) {
343
+ this.text_container.text(this.options.text);
344
+ } else {
345
+ this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text);
346
+ }
347
+ if (oldOpts.text === false) {
348
+ this.text_container.slideDown(200);
349
+ }
350
+ }
351
+ // Change the notice type.
352
+ if (this.options.type !== oldOpts.type)
353
+ this.container.removeClass(
354
+ this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info
355
+ ).addClass(this.options.type === "error" ?
356
+ this.styles.error :
357
+ (this.options.type === "info" ?
358
+ this.styles.info :
359
+ (this.options.type === "success" ?
360
+ this.styles.success :
361
+ this.styles.notice
362
+ )
363
+ )
364
+ );
365
+ if (this.options.icon !== oldOpts.icon || (this.options.icon === true && this.options.type !== oldOpts.type)) {
366
+ // Remove any old icon.
367
+ this.container.find("div.ui-pnotify-icon").remove();
368
+ if (this.options.icon !== false) {
369
+ // Build the new icon.
370
+ $("<div />", {"class": "ui-pnotify-icon"})
371
+ .append($("<span />", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon}))
372
+ .prependTo(this.container);
373
+ }
374
+ }
375
+ // Update the width.
376
+ if (this.options.width !== oldOpts.width) {
377
+ this.elem.animate({width: this.options.width});
378
+ }
379
+ // Update the minimum height.
380
+ if (this.options.min_height !== oldOpts.min_height) {
381
+ this.container.animate({minHeight: this.options.min_height});
382
+ }
383
+ // Update the timed hiding.
384
+ if (!this.options.hide) {
385
+ this.cancelRemove();
386
+ } else if (!oldOpts.hide) {
387
+ this.queueRemove();
388
+ }
389
+ this.queuePosition(true);
390
+
391
+ // Run the modules.
392
+ this.runModules('update', oldOpts);
393
+ return this;
394
+ },
395
+
396
+ // Display the notice.
397
+ open: function(){
398
+ this.state = "opening";
399
+ // Run the modules.
400
+ this.runModules('beforeOpen');
401
+
402
+ var that = this;
403
+ // If the notice is not in the DOM, append it.
404
+ if (!this.elem.parent().length) {
405
+ this.elem.appendTo(this.options.stack.context ? this.options.stack.context : body);
406
+ }
407
+ // Try to put it in the right position.
408
+ if (this.options.stack.push !== "top") {
409
+ this.position(true);
410
+ }
411
+ this.animateIn(function(){
412
+ that.queuePosition(true);
413
+
414
+ // Now set it to hide.
415
+ if (that.options.hide) {
416
+ that.queueRemove();
417
+ }
418
+
419
+ that.state = "open";
420
+
421
+ // Run the modules.
422
+ that.runModules('afterOpen');
423
+ });
424
+
425
+ return this;
426
+ },
427
+
428
+ // Remove the notice.
429
+ remove: function(timer_hide) {
430
+ this.state = "closing";
431
+ this.timerHide = !!timer_hide; // Make sure it's a boolean.
432
+ // Run the modules.
433
+ this.runModules('beforeClose');
434
+
435
+ var that = this;
436
+ if (this.timer) {
437
+ root.clearTimeout(this.timer);
438
+ this.timer = null;
439
+ }
440
+ this.animateOut(function(){
441
+ that.state = "closed";
442
+ // Run the modules.
443
+ that.runModules('afterClose');
444
+ that.queuePosition(true);
445
+ // If we're supposed to remove the notice from the DOM, do it.
446
+ if (that.options.remove) {
447
+ that.elem.detach();
448
+ }
449
+ // Run the modules.
450
+ that.runModules('beforeDestroy');
451
+ // Remove object from PNotify.notices to prevent memory leak (issue #49)
452
+ // unless destroy is off
453
+ if (that.options.destroy) {
454
+ if (PNotify.notices !== null) {
455
+ var idx = $.inArray(that,PNotify.notices);
456
+ if (idx !== -1) {
457
+ PNotify.notices.splice(idx,1);
458
+ }
459
+ }
460
+ }
461
+ // Run the modules.
462
+ that.runModules('afterDestroy');
463
+ });
464
+
465
+ return this;
466
+ },
467
+
468
+ // === Class Methods ===
469
+
470
+ // Get the DOM element.
471
+ get: function(){
472
+ return this.elem;
473
+ },
474
+
475
+ // Put all the options in the right places.
476
+ parseOptions: function(options, moreOptions){
477
+ this.options = $.extend(true, {}, PNotify.prototype.options);
478
+ // This is the only thing that *should* be copied by reference.
479
+ this.options.stack = PNotify.prototype.options.stack;
480
+ var optArray = [options, moreOptions], curOpts;
481
+ for (var curIndex=0; curIndex < optArray.length; curIndex++) {
482
+ curOpts = optArray[curIndex];
483
+ if (typeof curOpts === "undefined") {
484
+ break;
485
+ }
486
+ if (typeof curOpts !== 'object') {
487
+ this.options.text = curOpts;
488
+ } else {
489
+ for (var option in curOpts) {
490
+ if (this.modules[option]) {
491
+ // Avoid overwriting module defaults.
492
+ $.extend(true, this.options[option], curOpts[option]);
493
+ } else {
494
+ this.options[option] = curOpts[option];
495
+ }
496
+ }
497
+ }
498
+ }
499
+ },
500
+
501
+ // Animate the notice in.
502
+ animateIn: function(callback){
503
+ // Declare that the notice is animating in.
504
+ this.animating = "in";
505
+ var that = this;
506
+ callback = (function(){
507
+ if (that.animTimer) {
508
+ clearTimeout(that.animTimer);
509
+ }
510
+ if (that.animating !== "in") {
511
+ return;
512
+ }
513
+ if (that.elem.is(":visible")) {
514
+ if (this) {
515
+ this.call();
516
+ }
517
+ // Declare that the notice has completed animating.
518
+ that.animating = false;
519
+ } else {
520
+ that.animTimer = setTimeout(callback, 40);
521
+ }
522
+ }).bind(callback);
523
+
524
+ if (this.options.animation === "fade") {
525
+ this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', callback).addClass("ui-pnotify-in");
526
+ this.elem.css("opacity"); // This line is necessary for some reason. Some notices don't fade without it.
527
+ this.elem.addClass("ui-pnotify-fade-in");
528
+ // Just in case the event doesn't fire, call it after 650 ms.
529
+ this.animTimer = setTimeout(callback, 650);
530
+ } else {
531
+ this.elem.addClass("ui-pnotify-in");
532
+ callback();
533
+ }
534
+ },
535
+
536
+ // Animate the notice out.
537
+ animateOut: function(callback){
538
+ // Declare that the notice is animating out.
539
+ this.animating = "out";
540
+ var that = this;
541
+ callback = (function(){
542
+ if (that.animTimer) {
543
+ clearTimeout(that.animTimer);
544
+ }
545
+ if (that.animating !== "out") {
546
+ return;
547
+ }
548
+ if (that.elem.css("opacity") == "0" || !that.elem.is(":visible")) {
549
+ that.elem.removeClass("ui-pnotify-in");
550
+ if (this) {
551
+ this.call();
552
+ }
553
+ // Declare that the notice has completed animating.
554
+ that.animating = false;
555
+ } else {
556
+ // In case this was called before the notice finished animating.
557
+ that.animTimer = setTimeout(callback, 40);
558
+ }
559
+ }).bind(callback);
560
+
561
+ if (this.options.animation === "fade") {
562
+ this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', callback).removeClass("ui-pnotify-fade-in");
563
+ // Just in case the event doesn't fire, call it after 650 ms.
564
+ this.animTimer = setTimeout(callback, 650);
565
+ } else {
566
+ this.elem.removeClass("ui-pnotify-in");
567
+ callback();
568
+ }
569
+ },
570
+
571
+ // Position the notice. dont_skip_hidden causes the notice to
572
+ // position even if it's not visible.
573
+ position: function(dontSkipHidden){
574
+ // Get the notice's stack.
575
+ var stack = this.options.stack,
576
+ elem = this.elem;
577
+ if (typeof stack.context === "undefined") {
578
+ stack.context = body;
579
+ }
580
+ if (!stack) {
581
+ return;
582
+ }
583
+ if (typeof stack.nextpos1 !== "number") {
584
+ stack.nextpos1 = stack.firstpos1;
585
+ }
586
+ if (typeof stack.nextpos2 !== "number") {
587
+ stack.nextpos2 = stack.firstpos2;
588
+ }
589
+ if (typeof stack.addpos2 !== "number") {
590
+ stack.addpos2 = 0;
591
+ }
592
+ var hidden = !elem.hasClass("ui-pnotify-in");
593
+ // Skip this notice if it's not shown.
594
+ if (!hidden || dontSkipHidden) {
595
+ if (stack.modal) {
596
+ if (stack.overlay) {
597
+ stack.overlay.show();
598
+ } else {
599
+ stack.overlay = createStackOverlay(stack);
600
+ }
601
+ }
602
+ // Add animate class by default.
603
+ elem.addClass("ui-pnotify-move");
604
+ var curpos1, curpos2;
605
+ // Calculate the current pos1 value.
606
+ var csspos1;
607
+ switch (stack.dir1) {
608
+ case "down":
609
+ csspos1 = "top";
610
+ break;
611
+ case "up":
612
+ csspos1 = "bottom";
613
+ break;
614
+ case "left":
615
+ csspos1 = "right";
616
+ break;
617
+ case "right":
618
+ csspos1 = "left";
619
+ break;
620
+ }
621
+ curpos1 = parseInt(elem.css(csspos1).replace(/(?:\..*|[^0-9.])/g, ''));
622
+ if (isNaN(curpos1)) {
623
+ curpos1 = 0;
624
+ }
625
+ // Remember the first pos1, so the first visible notice goes there.
626
+ if (typeof stack.firstpos1 === "undefined" && !hidden) {
627
+ stack.firstpos1 = curpos1;
628
+ stack.nextpos1 = stack.firstpos1;
629
+ }
630
+ // Calculate the current pos2 value.
631
+ var csspos2;
632
+ switch (stack.dir2) {
633
+ case "down":
634
+ csspos2 = "top";
635
+ break;
636
+ case "up":
637
+ csspos2 = "bottom";
638
+ break;
639
+ case "left":
640
+ csspos2 = "right";
641
+ break;
642
+ case "right":
643
+ csspos2 = "left";
644
+ break;
645
+ }
646
+ curpos2 = parseInt(elem.css(csspos2).replace(/(?:\..*|[^0-9.])/g, ''));
647
+ if (isNaN(curpos2)) {
648
+ curpos2 = 0;
649
+ }
650
+ // Remember the first pos2, so the first visible notice goes there.
651
+ if (typeof stack.firstpos2 === "undefined" && !hidden) {
652
+ stack.firstpos2 = curpos2;
653
+ stack.nextpos2 = stack.firstpos2;
654
+ }
655
+ // Check that it's not beyond the viewport edge.
656
+ if (
657
+ (stack.dir1 === "down" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) ||
658
+ (stack.dir1 === "up" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) ||
659
+ (stack.dir1 === "left" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) ) ||
660
+ (stack.dir1 === "right" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) )
661
+ ) {
662
+ // If it is, it needs to go back to the first pos1, and over on pos2.
663
+ stack.nextpos1 = stack.firstpos1;
664
+ stack.nextpos2 += stack.addpos2 + (typeof stack.spacing2 === "undefined" ? 25 : stack.spacing2);
665
+ stack.addpos2 = 0;
666
+ }
667
+ if (typeof stack.nextpos2 === "number") {
668
+ if (!stack.animation) {
669
+ elem.removeClass("ui-pnotify-move");
670
+ elem.css(csspos2, stack.nextpos2+"px");
671
+ elem.css(csspos2);
672
+ elem.addClass("ui-pnotify-move");
673
+ } else {
674
+ elem.css(csspos2, stack.nextpos2+"px");
675
+ }
676
+ }
677
+ // Keep track of the widest/tallest notice in the column/row, so we can push the next column/row.
678
+ switch (stack.dir2) {
679
+ case "down":
680
+ case "up":
681
+ if (elem.outerHeight(true) > stack.addpos2) {
682
+ stack.addpos2 = elem.height();
683
+ }
684
+ break;
685
+ case "left":
686
+ case "right":
687
+ if (elem.outerWidth(true) > stack.addpos2) {
688
+ stack.addpos2 = elem.width();
689
+ }
690
+ break;
691
+ }
692
+ // Move the notice on dir1.
693
+ if (typeof stack.nextpos1 === "number") {
694
+ if (!stack.animation) {
695
+ elem.removeClass("ui-pnotify-move");
696
+ elem.css(csspos1, stack.nextpos1+"px");
697
+ elem.css(csspos1);
698
+ elem.addClass("ui-pnotify-move");
699
+ } else {
700
+ elem.css(csspos1, stack.nextpos1+"px");
701
+ }
702
+ }
703
+ // Calculate the next dir1 position.
704
+ switch (stack.dir1) {
705
+ case "down":
706
+ case "up":
707
+ stack.nextpos1 += elem.height() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1);
708
+ break;
709
+ case "left":
710
+ case "right":
711
+ stack.nextpos1 += elem.width() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1);
712
+ break;
713
+ }
714
+ }
715
+ return this;
716
+ },
717
+ // Queue the position all function so it doesn't run repeatedly and
718
+ // use up resources.
719
+ queuePosition: function(animate, milliseconds){
720
+ if (posTimer) {
721
+ clearTimeout(posTimer);
722
+ }
723
+ if (!milliseconds) {
724
+ milliseconds = 10;
725
+ }
726
+ posTimer = setTimeout(function(){
727
+ PNotify.positionAll(animate);
728
+ }, milliseconds);
729
+ return this;
730
+ },
731
+
732
+
733
+ // Cancel any pending removal timer.
734
+ cancelRemove: function(){
735
+ if (this.timer) {
736
+ root.clearTimeout(this.timer);
737
+ }
738
+ if (this.animTimer) {
739
+ root.clearTimeout(this.animTimer);
740
+ }
741
+ if (this.state === "closing") {
742
+ // If it's animating out, stop it.
743
+ this.state = "open";
744
+ this.animating = false;
745
+ this.elem.addClass("ui-pnotify-in");
746
+ if (this.options.animation === "fade") {
747
+ this.elem.addClass("ui-pnotify-fade-in");
748
+ }
749
+ }
750
+ return this;
751
+ },
752
+ // Queue a removal timer.
753
+ queueRemove: function(){
754
+ var that = this;
755
+ // Cancel any current removal timer.
756
+ this.cancelRemove();
757
+ this.timer = root.setTimeout(function(){
758
+ that.remove(true);
759
+ }, (isNaN(this.options.delay) ? 0 : this.options.delay));
760
+ return this;
761
+ }
762
+ });
763
+ // These functions affect all notices.
764
+ $.extend(PNotify, {
765
+ // This holds all the notices.
766
+ notices: [],
767
+ reload: init,
768
+ removeAll: function(){
769
+ $.each(PNotify.notices, function(){
770
+ if (this.remove) {
771
+ this.remove(false);
772
+ }
773
+ });
774
+ },
775
+ removeStack: function(stack){
776
+ $.each(PNotify.notices, function(){
777
+ if (this.remove && this.options.stack === stack) {
778
+ this.remove(false);
779
+ }
780
+ });
781
+ },
782
+ positionAll: function(animate){
783
+ // This timer is used for queueing this function so it doesn't run
784
+ // repeatedly.
785
+ if (posTimer) {
786
+ clearTimeout(posTimer);
787
+ }
788
+ posTimer = null;
789
+ // Reset the next position data.
790
+ if (PNotify.notices && PNotify.notices.length) {
791
+ $.each(PNotify.notices, function(){
792
+ var s = this.options.stack;
793
+ if (!s) {
794
+ return;
795
+ }
796
+ if (s.overlay) {
797
+ s.overlay.hide();
798
+ }
799
+ s.nextpos1 = s.firstpos1;
800
+ s.nextpos2 = s.firstpos2;
801
+ s.addpos2 = 0;
802
+ s.animation = animate;
803
+ });
804
+ $.each(PNotify.notices, function(){
805
+ this.position();
806
+ });
807
+ } else {
808
+ var s = PNotify.prototype.options.stack;
809
+ if (s) {
810
+ delete s.nextpos1;
811
+ delete s.nextpos2;
812
+ }
813
+ }
814
+ },
815
+ styling: {
816
+ brighttheme: {
817
+ // Bright Theme doesn't require any UI libraries.
818
+ container: "brighttheme",
819
+ notice: "brighttheme-notice",
820
+ notice_icon: "brighttheme-icon-notice",
821
+ info: "brighttheme-info",
822
+ info_icon: "brighttheme-icon-info",
823
+ success: "brighttheme-success",
824
+ success_icon: "brighttheme-icon-success",
825
+ error: "brighttheme-error",
826
+ error_icon: "brighttheme-icon-error"
827
+ },
828
+ jqueryui: {
829
+ container: "ui-widget ui-widget-content ui-corner-all",
830
+ notice: "ui-state-highlight",
831
+ // (The actual jQUI notice icon looks terrible.)
832
+ notice_icon: "ui-icon ui-icon-info",
833
+ info: "",
834
+ info_icon: "ui-icon ui-icon-info",
835
+ success: "ui-state-default",
836
+ success_icon: "ui-icon ui-icon-circle-check",
837
+ error: "ui-state-error",
838
+ error_icon: "ui-icon ui-icon-alert"
839
+ },
840
+ bootstrap3: {
841
+ container: "alert",
842
+ notice: "alert-warning",
843
+ notice_icon: "glyphicon glyphicon-exclamation-sign",
844
+ info: "alert-info",
845
+ info_icon: "glyphicon glyphicon-info-sign",
846
+ success: "alert-success",
847
+ success_icon: "glyphicon glyphicon-ok-sign",
848
+ error: "alert-danger",
849
+ error_icon: "glyphicon glyphicon-warning-sign"
850
+ }
851
+ }
852
+ });
853
+ /*
854
+ * uses icons from http://fontawesome.io/
855
+ * version 4.0.3
856
+ */
857
+ PNotify.styling.fontawesome = $.extend({}, PNotify.styling.bootstrap3);
858
+ $.extend(PNotify.styling.fontawesome, {
859
+ notice_icon: "fa fa-exclamation-circle",
860
+ info_icon: "fa fa-info",
861
+ success_icon: "fa fa-check",
862
+ error_icon: "fa fa-warning"
863
+ });
864
+
865
+ if (root.document.body) {
866
+ do_when_ready();
867
+ } else {
868
+ $(do_when_ready);
869
+ }
870
+ return PNotify;
871
+ };
872
+ return init(root);
873
+ }));