gritter 0.6.3 → 1.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.
data/README.md CHANGED
@@ -1,30 +1,27 @@
1
1
  # gritter
2
2
 
3
- version 0.6.3
3
+ version 1.0.0
4
4
  Robin Brouwer
5
5
  Daniël Zwijnenburg
6
6
  45north
7
7
 
8
8
  This Ruby on Rails gem allows you to easily add Growl-like notifications to your application using a jQuery plugin called 'gritter'.
9
9
 
10
- ## Installation
11
-
12
- You can use this gem by putting the following inside your Gemfile:
10
+ ## Note
13
11
 
14
- gem "gritter", "0.6.2"
12
+ This is a Rails 3.1 gem. Are you using Rails 3.0 or lower? Check out [the 'old' branch on Github](https://github.com/RobinBrouwer/gritter/tree/old). Want support for IE6?
13
+ Also check out that branch, because the newer version of gritter inside this gem dropped support for it.
15
14
 
16
- You can also install this as a plugin with the following command:
17
15
 
18
- rails plugin install git://github.com/RobinBrouwer/gritter.git
16
+ ## Installation
19
17
 
20
- This is a Rails 3 gem. When you're using Rails 2 you should use version 0.3 (this is a plugin):
18
+ You can use this gem by putting the following inside your Gemfile:
21
19
 
22
- script/plugin install git://github.com/RobinBrouwer/gritter.git -r 'tag v0.3'
20
+ gem "gritter", "1.0.0"
23
21
 
24
- ## Rails 3.1 installation
22
+ Now generate the locale for gritter:
25
23
 
26
- Gritter now also supports Rails 3.1, thanks to [finist](https://github.com/finist).
27
- Adding the JavaScript and CSS files is accomplished in a different way, because of the new 'assets' folder inside /app.
24
+ rails g gritter:locale
28
25
 
29
26
  Add the following to `/app/assets/javascripts/application.js`:
30
27
 
@@ -34,64 +31,23 @@ And the following to `/app/assets/stylesheets/application.css`:
34
31
 
35
32
  *= require gritter
36
33
 
37
- And that's it! It now works with Rails 3.1. No need to add `include_gritter` to your layout.
38
-
39
- ## Rails 3.0 installation
40
-
41
- Start your server and you'll see that three folders are added to your /javascripts, /stylesheets and /images folders.
42
- Now you can use gritter inside your Rails 3.0 application.
43
-
44
- Now add the following to your head-tag inside the layout:
45
-
46
- <%= include_gritter %>
47
-
48
- If you also want to add jQuery together with gritter (from googleapis.com) you can use the following helper:
49
-
50
- <%= include_gritter_and_jquery %>
51
-
52
- You can pass extra arguments to these functions to set the default options for gritter.
53
-
54
- :fade_in_speed => "medium" # => Allows you to set the fade-in-speed. Can be String or Integer (in ms).
55
- :fade_out_speed => 1000 # => Allows you to set the fade-out-speed. Can be String or Integer (in ms).
56
- :time => 8000 # => Allows you to set the time the notification stays. Must be an Integer (in ms).
57
-
58
- The :fade_in_speed and :fade_out_speed options accept the following Strings:
59
-
60
- "slow"
61
- "medium"
62
- "fast"
63
-
64
- Now you can use gritter inside your Rails application.
65
- You should really check out the gflash helper. It's really handy!
66
-
34
+ And that's it!
67
35
 
68
36
  ## Changes
69
37
 
70
- Version 0.6.3 changes:
38
+ Version 1.0.0 changes (17/11/2011):
71
39
 
72
- - Calling gflash multiple times won't override older messages.
73
- - You can set the time, sticky and class_name per gflash message.
74
-
75
- Version 0.6.2 changes:
76
-
77
- - Reduced the size of all images;
78
- - Also works with Rails 3.1.
79
-
80
- Version 0.6 changes:
81
-
82
- - Added locales support for gflash (see README);
83
- - README changes.
84
-
85
- Version 0.5 changes:
86
-
87
- - Works with Ruby 1.9 now (the Array.to_s was causing problems);
88
- - Refactored a lot of code to make everything a bit more logical;
89
- - The js helper doesn't add a semicolon (;) after the script anymore;
90
- - The js helper accepts several scripts as options;
91
- - Changed the way linebreaks (\n) are created;
92
- - Added an 'e' variable for all the callbacks;
93
- - Added String support for :fade_out_speed;
94
- - Changed the README.
40
+ - Gritter now only works in Rails 3.1. You should check out the 'old' branch for other Rails versions.
41
+ - Removed everything that isn't needed for Rails 3.1.
42
+ - Added new version for the gritter jQuery plugin (1.7.1).
43
+ - Added position option for your gritter messages.
44
+ - Locale isn't automatically generated. You need to use the gritter:locale generator.
45
+ - Adding locale-based gflash messages got a bit easier.
46
+ - You can now use a :gflash option inside the redirect_to method.
47
+ - Using SCSS image_path instead of ERB image_path inside the CSS.
48
+ - Added CSS3 support for gritter.
49
+ - Refactored some parts of the gem.
50
+ - Changed the README quite a bit.
95
51
 
96
52
 
97
53
  ## Usage
@@ -105,7 +61,8 @@ There are several helpers you can use with gritter. All of them print out Javasc
105
61
  To add the script-tags we added another function called `js`. It allows you to easily add script-tags around your javascript.
106
62
  It can be used in combination with gritter, but also other Javascript you want to run.
107
63
 
108
- Since version 0.3 we also added a `gflash` helper. This helper supports locales since version 0.6. You can read more about this helper below.
64
+ The most popular feature of this gem is `gflash`. This replaces the regular flash messages in Rails and
65
+ automatically puts these in gritter boxes. Read further to learn more about gflash.
109
66
 
110
67
 
111
68
  ### add_gritter
@@ -171,8 +128,29 @@ You can also use the `js` helper to add script-tags around this helper.
171
128
 
172
129
  ### extend_gritter
173
130
 
174
- The `extend_gritter` helper allows you to set the default gritter options, just like you can do with the `include_gritter` helpers.
175
- To see what arguments you can pass to this helper just check the `include_gritter` helper.
131
+ The `extend_gritter` helper allows you to set the default gritter options.
132
+
133
+ <%= extend_gritter :time => 1000 %>
134
+
135
+ These are the options you can pass to `extend_gritter`:
136
+
137
+ :fade_in_speed => "medium" # => Allows you to set the fade-in-speed. Can be String or Integer (in ms).
138
+ :fade_out_speed => 1000 # => Allows you to set the fade-out-speed. Can be String or Integer (in ms).
139
+ :time => 8000 # => Allows you to set the time the notification stays. Must be an Integer (in ms).
140
+ :position => :bottom_left # => Allows you to set the position for all gritter messages.
141
+
142
+ The :fade_in_speed and :fade_out_speed options accept the following Strings:
143
+
144
+ "slow"
145
+ "medium"
146
+ "fast"
147
+
148
+ The :position option accepts four different Symbols:
149
+
150
+ :top_left
151
+ :top_right # Default
152
+ :bottom_left
153
+ :bottom_right
176
154
 
177
155
  You can also use the `js` helper to add script-tags around this helper.
178
156
 
@@ -189,13 +167,17 @@ It uses a session to remember the flash messages. Add the following inside your
189
167
  Now you can add the following to your layout view inside the body-tag:
190
168
 
191
169
  <%= gflash %>
192
-
170
+
193
171
  The flash-message will be shown with 'success.png' as the image and 'Success' as the title.
194
172
  To change the title you can add the following to the `gflash` helper inside the layout:
195
173
 
196
174
  <%= gflash :success => "It has been successful!" %>
197
-
198
- Now the default title will be overwritten. You can use the following gflash options:
175
+
176
+ Now the default title will be overwritten. You can also use gflash inside `js.erb` files:
177
+
178
+ <%= gflash :js => true %>
179
+
180
+ The :success key isn't the only option supported by gflash. You can use the following gflash options:
199
181
 
200
182
  :success
201
183
  :warning
@@ -231,23 +213,40 @@ Now you can do the following inside your Controller:
231
213
  gflash :notice => true
232
214
  end
233
215
 
234
- The locales for the `:notice` title and message will now be used. You can still pass a `String` to overwrite a locale.
235
-
236
- You can also use gflash inside `js.erb` files:
216
+ The locales for the `:notice` title and message will now be used. You can still pass a `String` to override a locale.
217
+ Since gritter version 1.0 you can also do the following to add the gritter messages:
237
218
 
238
- <%= gflash :js => true %>
219
+ def create
220
+ gflash :notice, :success, :error
221
+ end
239
222
 
240
- And that's how you add gflash to your Rails application.
241
- Just remember that you can only set which gflash message you want shown inside the controller.
242
- The gflash helper inside the views will show the notification and change the title when you pass extra arguments.
243
- It will not change the message.
223
+ No need to pass `true` to each key.
244
224
 
245
- Since 0.6.3 you can change the default time, sticky and class_name options for each gflash message.
225
+ You can change the default time, sticky and class_name options for each gritter message.
246
226
  This is done inside the Controller and works like this:
247
227
 
228
+ gflash :success => { :time => 2000, :class_name => "my_class", :sticky => true }
248
229
  gflash :success => { :value => true, :time => 2000, :class_name => "my_class", :sticky => true }
249
230
  gflash :error => { :value => "Custom error", :time => 3000, :class_name => "my_error_class", :sticky => false }
250
231
 
232
+ When you don't pass a `:value` it uses the locale. Same goes for when you pass `true` to `:value`.
233
+
234
+ You can also use gflash directly inside the `redirect_to` method.
235
+
236
+ def create
237
+ redirect_to @post, :gflash => [:notice, :success]
238
+ end
239
+
240
+ def destroy
241
+ redirect_to :posts, :gflash => { :warning => "You just deleted something important." }
242
+ end
243
+
244
+ def logged_in?
245
+ redirect_to :login, :gflash => { :error => { :value => "You are not logged in!", :sticky => true } }
246
+ end
247
+
248
+ And that's how you add gflash to your Rails application!
249
+
251
250
 
252
251
  ## Special Thanks
253
252
 
File without changes
@@ -1,19 +1,475 @@
1
- (function($){$.gritter={};$.gritter.options={fade_in_speed:'medium',fade_out_speed:1000,time:6000}
2
- $.gritter.add=function(params){try{return Gritter.add(params||{});}catch(e){var err='Gritter Error: '+e;(typeof(console)!='undefined'&&console.error)?console.error(err,params):alert(err);}}
3
- $.gritter.remove=function(id,params){Gritter.removeSpecific(id,params||{});}
4
- $.gritter.removeAll=function(params){Gritter.stop(params||{});}
5
- var Gritter={fade_in_speed:'',fade_out_speed:'',time:'',_custom_timer:0,_item_count:0,_is_setup:0,_tpl_close:'<div class="gritter-close"></div>',_tpl_item:'<div id="gritter-item-[[number]]" class="gritter-item-wrapper [[item_class]]" style="display:none"><div class="gritter-top"></div><div class="gritter-item">[[image]]<div class="[[class_name]]"><span class="gritter-title">[[username]]</span><p>[[text]]</p></div><div style="clear:both"></div></div><div class="gritter-bottom"></div></div>',_tpl_wrap:'<div id="gritter-notice-wrapper"></div>',add:function(params){if(!params.title||!params.text){throw'You need to fill out the first 2 params: "title" and "text"';}
6
- if(!this._is_setup){this._runSetup();}
7
- var user=params.title,text=params.text,image=params.image||'',sticky=params.sticky||false,item_class=params.class_name||'',time_alive=params.time||'';this._verifyWrapper();this._item_count++;var number=this._item_count,tmp=this._tpl_item;$(['before_open','after_open','before_close','after_close']).each(function(i,val){Gritter['_'+val+'_'+number]=($.isFunction(params[val]))?params[val]:function(){}});this._custom_timer=0;if(time_alive){this._custom_timer=time_alive;}
8
- var image_str=(image!='')?'<img src="'+image+'" class="gritter-image" />':'',class_name=(image!='')?'gritter-with-image':'gritter-without-image';tmp=this._str_replace(['[[username]]','[[text]]','[[image]]','[[number]]','[[class_name]]','[[item_class]]'],[user,text,image_str,this._item_count,class_name,item_class],tmp);this['_before_open_'+number]();$('#gritter-notice-wrapper').append(tmp);var item=$('#gritter-item-'+this._item_count);item.fadeIn(this.fade_in_speed,function(){Gritter['_after_open_'+number]($(this));});if(!sticky){this._setFadeTimer(item,number);}
9
- $(item).bind('mouseenter mouseleave',function(event){if(event.type=='mouseenter'){if(!sticky){Gritter._restoreItemIfFading($(this),number);}}
10
- else{if(!sticky){Gritter._setFadeTimer($(this),number);}}
11
- Gritter._hoverState($(this),event.type);});return number;},_countRemoveWrapper:function(unique_id,e){e.remove();this['_after_close_'+unique_id](e);if($('.gritter-item-wrapper').length==0){$('#gritter-notice-wrapper').remove();}},_fade:function(e,unique_id,params,unbind_events){var params=params||{},fade=(typeof(params.fade)!='undefined')?params.fade:true;fade_out_speed=params.speed||this.fade_out_speed;this['_before_close_'+unique_id](e);if(unbind_events){e.unbind('mouseenter mouseleave');}
12
- if(fade){e.animate({opacity:0},fade_out_speed,function(){e.animate({height:0},300,function(){Gritter._countRemoveWrapper(unique_id,e);})})}
13
- else{this._countRemoveWrapper(unique_id,e);}},_hoverState:function(e,type){if(type=='mouseenter'){e.addClass('hover');var find_img=e.find('img');(find_img.length)?find_img.before(this._tpl_close):e.find('span').before(this._tpl_close);e.find('.gritter-close').click(function(){var unique_id=e.attr('id').split('-')[2];Gritter.removeSpecific(unique_id,{},e,true);});}
14
- else{e.removeClass('hover');e.find('.gritter-close').remove();}},removeSpecific:function(unique_id,params,e,unbind_events){if(!e){var e=$('#gritter-item-'+unique_id);}
15
- this._fade(e,unique_id,params||{},unbind_events);},_restoreItemIfFading:function(e,unique_id){clearTimeout(this['_int_id_'+unique_id]);e.stop().css({opacity:''});},_runSetup:function(){for(opt in $.gritter.options){this[opt]=$.gritter.options[opt];}
16
- this._is_setup=1;},_setFadeTimer:function(e,unique_id){var timer_str=(this._custom_timer)?this._custom_timer:this.time;this['_int_id_'+unique_id]=setTimeout(function(){Gritter._fade(e,unique_id);},timer_str);},stop:function(params){var before_close=($.isFunction(params.before_close))?params.before_close:function(){};var after_close=($.isFunction(params.after_close))?params.after_close:function(){};var wrap=$('#gritter-notice-wrapper');before_close(wrap);wrap.fadeOut(function(){$(this).remove();after_close();});},_str_replace:function(search,replace,subject,count){var i=0,j=0,temp='',repl='',sl=0,fl=0,f=[].concat(search),r=[].concat(replace),s=subject,ra=r instanceof Array,sa=s instanceof Array;s=[].concat(s);if(count){this.window[count]=0;}
17
- for(i=0,sl=s.length;i<sl;i++){if(s[i]===''){continue;}
18
- for(j=0,fl=f.length;j<fl;j++){temp=s[i]+'';repl=ra?(r[j]!==undefined?r[j]:''):r[0];s[i]=(temp).split(f[j]).join(repl);if(count&&s[i]!==temp){this.window[count]+=(temp.length-s[i].length)/f[j].length;}}}
19
- return sa?s:s[0];},_verifyWrapper:function(){if($('#gritter-notice-wrapper').length==0){$('body').append(this._tpl_wrap);}}}})(jQuery);
1
+ /*
2
+ * Gritter for jQuery
3
+ * http://www.boedesign.com/
4
+ *
5
+ * Copyright (c) 2011 Jordan Boesch
6
+ * Dual licensed under the MIT and GPL licenses.
7
+ *
8
+ * Date: March 29, 2011
9
+ * Version: 1.7.1
10
+ */
11
+
12
+ // Modernizr for CSS3 support check.
13
+ window.Modernizr = function (a, b, c) {
14
+ function A(a, b) {
15
+ var c = a.charAt(0).toUpperCase() + a.substr(1),
16
+ d = (a + " " + m.join(c + " ") + c).split(" ");
17
+ return z(d, b)
18
+ }
19
+ function z(a, b) {
20
+ for (var d in a) if (j[a[d]] !== c) return b == "pfx" ? a[d] : !0;
21
+ return !1
22
+ }
23
+ function y(a, b) {
24
+ return !!~ ("" + a).indexOf(b)
25
+ }
26
+ function x(a, b) {
27
+ return typeof a === b
28
+ }
29
+ function w(a, b) {
30
+ return v(prefixes.join(a + ";") + (b || ""))
31
+ }
32
+ function v(a) {
33
+ j.cssText = a
34
+ }
35
+ var d = "2.0.6",
36
+ e = {},
37
+ f = b.documentElement,
38
+ g = b.head || b.getElementsByTagName("head")[0],
39
+ h = "modernizr",
40
+ i = b.createElement(h),
41
+ j = i.style,
42
+ k, l = Object.prototype.toString,
43
+ m = "Webkit Moz O ms Khtml".split(" "),
44
+ n = {},
45
+ o = {},
46
+ p = {},
47
+ q = [],
48
+ r = function (a, c, d, e) {
49
+ var g, i, j, k = b.createElement("div");
50
+ if (parseInt(d, 10)) while (d--) j = b.createElement("div"), j.id = e ? e[d] : h + (d + 1), k.appendChild(j);
51
+ g = ["&shy;", "<style>", a, "</style>"].join(""), k.id = h, k.innerHTML += g, f.appendChild(k), i = c(k, a), k.parentNode.removeChild(k);
52
+ return !!i
53
+ },
54
+ s, t = {}.hasOwnProperty,
55
+ u;
56
+ !x(t, c) && !x(t.call, c) ? u = function (a, b) {
57
+ return t.call(a, b)
58
+ } : u = function (a, b) {
59
+ return b in a && x(a.constructor.prototype[b], c)
60
+ }, n.rgba = function () {
61
+ v("background-color:rgba(150,255,150,.5)");
62
+ return y(j.backgroundColor, "rgba")
63
+ }, n.borderradius = function () {
64
+ return A("borderRadius")
65
+ };
66
+ for (var B in n) u(n, B) && (s = B.toLowerCase(), e[s] = n[B](), q.push((e[s] ? "" : "no-") + s));
67
+ v(""), i = k = null, e._version = d, e._domPrefixes = m, e.testProp = function (a) {
68
+ return z([a])
69
+ }, e.testAllProps = A, e.testStyles = r;
70
+ return e
71
+ }(this, this.document);
72
+
73
+ (function($){
74
+
75
+ /**
76
+ * Set it up as an object under the jQuery namespace
77
+ */
78
+ $.gritter = {};
79
+
80
+ /**
81
+ * Set up global options that the user can over-ride
82
+ */
83
+ $.gritter.options = {
84
+ position: '',
85
+ fade_in_speed: 'medium', // how fast notifications fade in
86
+ fade_out_speed: 1000, // how fast the notices fade out
87
+ time: 6000 // hang on the screen for...
88
+ }
89
+
90
+ /**
91
+ * Add a gritter notification to the screen
92
+ * @see Gritter#add();
93
+ */
94
+ $.gritter.add = function(params){
95
+
96
+ try {
97
+ return Gritter.add(params || {});
98
+ } catch(e) {
99
+
100
+ var err = 'Gritter Error: ' + e;
101
+ (typeof(console) != 'undefined' && console.error) ?
102
+ console.error(err, params) :
103
+ alert(err);
104
+
105
+ }
106
+
107
+ }
108
+
109
+ /**
110
+ * Remove a gritter notification from the screen
111
+ * @see Gritter#removeSpecific();
112
+ */
113
+ $.gritter.remove = function(id, params){
114
+ Gritter.removeSpecific(id, params || {});
115
+ }
116
+
117
+ /**
118
+ * Remove all notifications
119
+ * @see Gritter#stop();
120
+ */
121
+ $.gritter.removeAll = function(params){
122
+ Gritter.stop(params || {});
123
+ }
124
+
125
+ /**
126
+ * CSS3 check
127
+ */
128
+ var gritter_item;
129
+ var gritter_content = '[[close]][[image]]<div class="[[class_name]]"><span class="gritter-title">[[username]]</span><p>[[text]]</p></div><div style="clear:both"></div>';
130
+ if(Modernizr.borderradius && Modernizr.rgba) {
131
+ gritter_item = '<div class="gritter-item gritter-css3">'+ gritter_content +'</div>';
132
+ } else {
133
+ gritter_item = '<div class="gritter-top"></div><div class="gritter-item gritter-css2">'+ gritter_content +'</div><div class="gritter-bottom"></div>';
134
+ }
135
+
136
+ /**
137
+ * Big fat Gritter object
138
+ * @constructor (not really since it's object literal)
139
+ */
140
+ var Gritter = {
141
+
142
+ // Public - options to over-ride with $.gritter.options in "add"
143
+ position: '',
144
+ fade_in_speed: '',
145
+ fade_out_speed: '',
146
+ time: '',
147
+
148
+ // Private - no touchy the private parts
149
+ _custom_timer: 0,
150
+ _item_count: 0,
151
+ _is_setup: 0,
152
+ _tpl_close: '<div class="gritter-close"></div>',
153
+ _tpl_item: '<div id="gritter-item-[[number]]" class="gritter-item-wrapper [[item_class]]" style="display:none">'+ gritter_item +'</div>',
154
+ _tpl_wrap: '<div id="gritter-notice-wrapper"></div>',
155
+
156
+ /**
157
+ * Add a gritter notification to the screen
158
+ * @param {Object} params The object that contains all the options for drawing the notification
159
+ * @return {Integer} The specific numeric id to that gritter notification
160
+ */
161
+ add: function(params){
162
+
163
+ // We might have some issues if we don't have a title or text!
164
+ if(!params.title || !params.text){
165
+ throw 'You need to fill out the first 2 params: "title" and "text"';
166
+ }
167
+
168
+ // Check the options and set them once
169
+ if(!this._is_setup){
170
+ this._runSetup();
171
+ }
172
+
173
+ // Basics
174
+ var user = params.title,
175
+ text = params.text,
176
+ image = params.image || '',
177
+ sticky = params.sticky || false,
178
+ item_class = params.class_name || '',
179
+ position = $.gritter.options.position,
180
+ time_alive = params.time || '';
181
+
182
+ this._verifyWrapper();
183
+
184
+ this._item_count++;
185
+ var number = this._item_count,
186
+ tmp = this._tpl_item;
187
+
188
+ // Assign callbacks
189
+ $(['before_open', 'after_open', 'before_close', 'after_close']).each(function(i, val){
190
+ Gritter['_' + val + '_' + number] = ($.isFunction(params[val])) ? params[val] : function(){}
191
+ });
192
+
193
+ // Reset
194
+ this._custom_timer = 0;
195
+
196
+ // A custom fade time set
197
+ if(time_alive){
198
+ this._custom_timer = time_alive;
199
+ }
200
+
201
+ var image_str = (image != '') ? '<img src="' + image + '" class="gritter-image" />' : '',
202
+ class_name = (image != '') ? 'gritter-with-image' : 'gritter-without-image';
203
+
204
+ // String replacements on the template
205
+ tmp = this._str_replace(
206
+ ['[[username]]', '[[text]]', '[[close]]', '[[image]]', '[[number]]', '[[class_name]]', '[[item_class]]'],
207
+ [user, text, this._tpl_close, image_str, this._item_count, class_name, item_class], tmp
208
+ );
209
+
210
+ this['_before_open_' + number]();
211
+ $('#gritter-notice-wrapper').addClass(position).append(tmp);
212
+
213
+ var item = $('#gritter-item-' + this._item_count);
214
+
215
+ item.fadeIn(this.fade_in_speed, function(){
216
+ Gritter['_after_open_' + number]($(this));
217
+ });
218
+
219
+ if(!sticky){
220
+ this._setFadeTimer(item, number);
221
+ }
222
+
223
+ // Bind the hover/unhover states
224
+ $(item).bind('mouseenter mouseleave', function(event){
225
+ if(event.type == 'mouseenter'){
226
+ if(!sticky){
227
+ Gritter._restoreItemIfFading($(this), number);
228
+ }
229
+ }
230
+ else {
231
+ if(!sticky){
232
+ Gritter._setFadeTimer($(this), number);
233
+ }
234
+ }
235
+ Gritter._hoverState($(this), event.type);
236
+ });
237
+
238
+ return number;
239
+
240
+ },
241
+
242
+ /**
243
+ * If we don't have any more gritter notifications, get rid of the wrapper using this check
244
+ * @private
245
+ * @param {Integer} unique_id The ID of the element that was just deleted, use it for a callback
246
+ * @param {Object} e The jQuery element that we're going to perform the remove() action on
247
+ * @param {Boolean} manual_close Did we close the gritter dialog with the (X) button
248
+ */
249
+ _countRemoveWrapper: function(unique_id, e, manual_close){
250
+
251
+ // Remove it then run the callback function
252
+ e.remove();
253
+ this['_after_close_' + unique_id](e, manual_close);
254
+
255
+ // Check if the wrapper is empty, if it is.. remove the wrapper
256
+ if($('.gritter-item-wrapper').length == 0){
257
+ $('#gritter-notice-wrapper').remove();
258
+ }
259
+
260
+ },
261
+
262
+ /**
263
+ * Fade out an element after it's been on the screen for x amount of time
264
+ * @private
265
+ * @param {Object} e The jQuery element to get rid of
266
+ * @param {Integer} unique_id The id of the element to remove
267
+ * @param {Object} params An optional list of params to set fade speeds etc.
268
+ * @param {Boolean} unbind_events Unbind the mouseenter/mouseleave events if they click (X)
269
+ */
270
+ _fade: function(e, unique_id, params, unbind_events){
271
+
272
+ var params = params || {},
273
+ fade = (typeof(params.fade) != 'undefined') ? params.fade : true;
274
+ fade_out_speed = params.speed || this.fade_out_speed,
275
+ manual_close = unbind_events;
276
+
277
+ this['_before_close_' + unique_id](e, manual_close);
278
+
279
+ // If this is true, then we are coming from clicking the (X)
280
+ if(unbind_events){
281
+ e.unbind('mouseenter mouseleave');
282
+ }
283
+
284
+ // Fade it out or remove it
285
+ if(fade){
286
+
287
+ e.fadeOut(fade_out_speed, function(){
288
+ e.animate({ height: 0 }, 300, function(){
289
+ Gritter._countRemoveWrapper(unique_id, e, manual_close);
290
+ })
291
+ })
292
+
293
+ }
294
+ else {
295
+
296
+ this._countRemoveWrapper(unique_id, e);
297
+
298
+ }
299
+
300
+ },
301
+
302
+ /**
303
+ * Perform actions based on the type of bind (mouseenter, mouseleave)
304
+ * @private
305
+ * @param {Object} e The jQuery element
306
+ * @param {String} type The type of action we're performing: mouseenter or mouseleave
307
+ */
308
+ _hoverState: function(e, type){
309
+
310
+ // Change the border styles and add the (X) close button when you hover
311
+ if(type == 'mouseenter'){
312
+
313
+ e.addClass('hover');
314
+
315
+ // Show close button
316
+ e.find('.gritter-close').show();
317
+
318
+ // Clicking (X) makes the perdy thing close
319
+ e.find('.gritter-close').click(function(){
320
+
321
+ var unique_id = e.attr('id').split('-')[2];
322
+ Gritter.removeSpecific(unique_id, {}, e, true);
323
+
324
+ });
325
+
326
+ }
327
+ // Remove the border styles and hide (X) close button when you mouse out
328
+ else {
329
+
330
+ e.removeClass('hover');
331
+
332
+ // Hide close button
333
+ e.find('.gritter-close').hide();
334
+
335
+ }
336
+
337
+ },
338
+
339
+ /**
340
+ * Remove a specific notification based on an ID
341
+ * @param {Integer} unique_id The ID used to delete a specific notification
342
+ * @param {Object} params A set of options passed in to determine how to get rid of it
343
+ * @param {Object} e The jQuery element that we're "fading" then removing
344
+ * @param {Boolean} unbind_events If we clicked on the (X) we set this to true to unbind mouseenter/mouseleave
345
+ */
346
+ removeSpecific: function(unique_id, params, e, unbind_events){
347
+
348
+ if(!e){
349
+ var e = $('#gritter-item-' + unique_id);
350
+ }
351
+
352
+ // We set the fourth param to let the _fade function know to
353
+ // unbind the "mouseleave" event. Once you click (X) there's no going back!
354
+ this._fade(e, unique_id, params || {}, unbind_events);
355
+
356
+ },
357
+
358
+ /**
359
+ * If the item is fading out and we hover over it, restore it!
360
+ * @private
361
+ * @param {Object} e The HTML element to remove
362
+ * @param {Integer} unique_id The ID of the element
363
+ */
364
+ _restoreItemIfFading: function(e, unique_id){
365
+
366
+ clearTimeout(this['_int_id_' + unique_id]);
367
+ e.stop().css({ opacity: '' });
368
+
369
+ },
370
+
371
+ /**
372
+ * Setup the global options - only once
373
+ * @private
374
+ */
375
+ _runSetup: function(){
376
+
377
+ for(opt in $.gritter.options){
378
+ this[opt] = $.gritter.options[opt];
379
+ }
380
+ this._is_setup = 1;
381
+
382
+ },
383
+
384
+ /**
385
+ * Set the notification to fade out after a certain amount of time
386
+ * @private
387
+ * @param {Object} item The HTML element we're dealing with
388
+ * @param {Integer} unique_id The ID of the element
389
+ */
390
+ _setFadeTimer: function(e, unique_id){
391
+
392
+ var timer_str = (this._custom_timer) ? this._custom_timer : this.time;
393
+ this['_int_id_' + unique_id] = setTimeout(function(){
394
+ Gritter._fade(e, unique_id);
395
+ }, timer_str);
396
+
397
+ },
398
+
399
+ /**
400
+ * Bring everything to a halt
401
+ * @param {Object} params A list of callback functions to pass when all notifications are removed
402
+ */
403
+ stop: function(params){
404
+
405
+ // callbacks (if passed)
406
+ var before_close = ($.isFunction(params.before_close)) ? params.before_close : function(){};
407
+ var after_close = ($.isFunction(params.after_close)) ? params.after_close : function(){};
408
+
409
+ var wrap = $('#gritter-notice-wrapper');
410
+ before_close(wrap);
411
+ wrap.fadeOut(function(){
412
+ $(this).remove();
413
+ after_close();
414
+ });
415
+
416
+ },
417
+
418
+ /**
419
+ * An extremely handy PHP function ported to JS, works well for templating
420
+ * @private
421
+ * @param {String/Array} search A list of things to search for
422
+ * @param {String/Array} replace A list of things to replace the searches with
423
+ * @return {String} sa The output
424
+ */
425
+ _str_replace: function(search, replace, subject, count){
426
+
427
+ var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
428
+ f = [].concat(search),
429
+ r = [].concat(replace),
430
+ s = subject,
431
+ ra = r instanceof Array, sa = s instanceof Array;
432
+ s = [].concat(s);
433
+
434
+ if(count){
435
+ this.window[count] = 0;
436
+ }
437
+
438
+ for(i = 0, sl = s.length; i < sl; i++){
439
+
440
+ if(s[i] === ''){
441
+ continue;
442
+ }
443
+
444
+ for (j = 0, fl = f.length; j < fl; j++){
445
+
446
+ temp = s[i] + '';
447
+ repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
448
+ s[i] = (temp).split(f[j]).join(repl);
449
+
450
+ if(count && s[i] !== temp){
451
+ this.window[count] += (temp.length-s[i].length) / f[j].length;
452
+ }
453
+
454
+ }
455
+ }
456
+
457
+ return sa ? s : s[0];
458
+
459
+ },
460
+
461
+ /**
462
+ * A check to make sure we have something to wrap our notices with
463
+ * @private
464
+ */
465
+ _verifyWrapper: function(){
466
+
467
+ if($('#gritter-notice-wrapper').length == 0){
468
+ $('body').append(this._tpl_wrap);
469
+ }
470
+
471
+ }
472
+
473
+ }
474
+
475
+ })(jQuery);