(function($) {
/** jGrowl Wrapper - Establish a base jGrowl Container for compatibility with older releases. **/
$.jGrowl = function(m, o) {
// To maintain compatibility with older version that only supported one instance we'll create the base container.
if ($('#jGrowl').size() == 0) $('
').addClass($.jGrowl.defaults.position).appendTo('body');
// Create a notification on the container.
$('#jGrowl').jGrowl(m, o);
};
/** Raise jGrowl Notification on a jGrowl Container **/
$.fn.jGrowl = function(m, o) {
if ($.isFunction(this.each)) {
var args = arguments;
return this.each(function() {
var self = this;
/** Create a jGrowl Instance on the Container if it does not exist **/
if ($(this).data('jGrowl.instance') == undefined) {
$(this).data('jGrowl.instance', new $.fn.jGrowl());
$(this).data('jGrowl.instance').startup(this);
}
/** Optionally call jGrowl instance methods, or just raise a normal notification **/
if ($.isFunction($(this).data('jGrowl.instance')[m])) {
$(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'), $.makeArray(args).slice(1));
} else {
$(this).data('jGrowl.instance').notification(m, o);
}
});
};
};
$.extend($.fn.jGrowl.prototype, {
/** Default JGrowl Settings **/
defaults: {
sticky: false,
position: 'bottom-left', // Is this still needed?
glue: 'after',
theme: 'default',
corners: '10px',
check: 500,
life: 3000,
speed: 'normal',
easing: 'swing',
log: function(e, m, o) { },
beforeOpen: function(e, m, o) { },
open: function(e, m, o) { },
beforeClose: function(e, m, o) { },
close: function(e, m, o) { },
type: 'info',
animateOpen: {
opacity: 'show'
},
animateClose: {
opacity: 'hide'
}
},
/** jGrowl Container Node **/
element: null,
/** Interval Function **/
interval: null,
/** Create a Notification **/
notification: function(message, o) {
var self = this;
var o = $.extend({}, this.defaults, o);
o.log.apply(this.element, [this.element, message, o]);
var notification = $('')
.data("jGrowl", o).addClass(o.theme).children('div.close').bind("click.jGrowl", function() {
$(this).unbind('click.jGrowl').parent().trigger('jGrowl.beforeClose').animate(o.animateClose, o.speed, o.easing, function() {
$(this).trigger('jGrowl.close').remove();
});
}).parent();
/*
if (o.type == 'info') { notification.attr('title', "Information: " + message); }
else if (o.type == 'warning') { notification.attr('title', "Warning: " + message); }
else if (o.type == 'help') { notification.attr('title', "Help: " + message); }
else if (o.type == 'ok') { notification.attr('title', "Ok: " + message); }
*/
if (o.sticky) {
notification.css("background", "#797979").attr('title', notification.attr('title') + ' - Click the x to close');
}
(o.glue == 'after') ? $('div.jGrowl-notification:last', this.element).after(notification) : $('div.jGrowl-notification:first', this.element).before(notification);
/** Notification Actions **/
$(notification).bind("mouseover.jGrowl", function() {
$(this).data("jGrowl").pause = true;
}).bind("mouseout.jGrowl", function() {
$(this).data("jGrowl").pause = false;
}).bind('jGrowl.beforeOpen', function() {
o.beforeOpen.apply(self.element, [self.element, message, o]);
}).bind('jGrowl.open', function() {
o.open.apply(self.element, [self.element, message, o]);
}).bind('jGrowl.beforeClose', function() {
o.beforeClose.apply(self.element, [self.element, message, o]);
}).bind('jGrowl.close', function() {
o.close.apply(self.element, [self.element, message, o]);
}).trigger('jGrowl.beforeOpen').animate(o.animateOpen, o.speed, o.easing, function() {
$(this).data("jGrowl").created = new Date();
}).trigger('jGrowl.open');
},
/** Update the jGrowl Container, removing old jGrowl notifications **/
update: function() {
$(this.element).find('div.jGrowl-notification:parent').each(function() {
if ($(this).data("jGrowl") != undefined && $(this).data("jGrowl").created != undefined && ($(this).data("jGrowl").created.getTime() + $(this).data("jGrowl").life) < (new Date()).getTime() && $(this).data("jGrowl").sticky != true &&
($(this).data("jGrowl").pause == undefined || $(this).data("jGrowl").pause != true)) {
$(this).children('div.close').trigger('click.jGrowl');
}
});
},
/** Setup the jGrowl Notification Container **/
startup: function(e) {
this.element = $(e).addClass('jGrowl').append('');
this.interval = setInterval(function() { jQuery(e).data('jGrowl.instance').update(); }, this.defaults.check);
if ($.browser.msie && parseInt($.browser.version) < 7) $(this.element).addClass('ie6');
},
/** Shutdown jGrowl, removing it and clearing the interval **/
shutdown: function() {
$(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove();
clearInterval(this.interval);
}
});
/** Reference the Defaults Object for compatibility with older versions of jGrowl **/
$.jGrowl.defaults = $.fn.jGrowl.prototype.defaults;
})(jQuery);