123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /* jQuery Notify UI Widget 1.5 by Eric Hynds
- * http://www.erichynds.com/jquery/a-jquery-ui-growl-ubuntu-notification-widget/
- *
- * Depends:
- * - jQuery 1.4+
- * - jQuery UI 1.8 widget factory
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
- (function($){
- $.widget("ech.notify", {
- options: {
- speed: 500,
- expires: 5000,
- stack: "below",
- custom: false,
- queue: false
- },
- _create: function(){
- var self = this;
- this.templates = {};
- this.keys = [];
- // build and save templates
- this.element.addClass("ui-notify").children().addClass("ui-notify-message ui-notify-message-style").each(function(i){
- var key = this.id || i;
- self.keys.push(key);
- self.templates[key] = $(this).removeAttr("id").wrap("<div></div>").parent().html(); // because $(this).andSelf().html() no workie
- }).end().empty().show();
- },
- create: function(template, msg, opts){
- if(typeof template === "object"){
- opts = msg;
- msg = template;
- template = null;
- }
- var tpl = this.templates[ template || this.keys[0]];
- // remove default styling class if rolling w/ custom classes
- if(opts && opts.custom){
- tpl = $(tpl).removeClass("ui-notify-message-style").wrap("<div></div>").parent().html();
- }
- this.openNotifications = this.openNotifications || 0;
- // return a new notification instance
- return new $.ech.notify.instance(this)._create(msg, $.extend({}, this.options, opts), tpl);
- }
- });
- // instance constructor
- $.extend($.ech.notify, {
- instance: function(widget){
- this.__super = widget;
- this.isOpen = false;
- }
- });
- // instance methods
- $.extend($.ech.notify.instance.prototype, {
- _create: function(params, options, template){
- this.options = options;
- var self = this,
- // build html template
- html = template.replace(/#(?:\{|%7B)(.*?)(?:\}|%7D)/g, function($1, $2){
- return ($2 in params) ? params[$2] : '';
- }),
- // the actual message
- m = (this.element = $(html)),
- // close link
- closelink = m.find(".ui-notify-close");
- // clickable?
- if(typeof this.options.click === "function"){
- m.addClass("ui-notify-click").bind("click", function(e){
- self._trigger("click", e, self);
- });
- }
- // show close link?
- if(closelink.length){
- closelink.bind("click", function(){
- self.close();
- return false;
- });
- }
- this.__super.element.queue("notify", function(){
- self.open();
- // auto expire?
- if(typeof options.expires === "number" && options.expires > 0){
- setTimeout($.proxy(self.close, self), options.expires);
- }
- });
- if(!this.options.queue || this.__super.openNotifications <= this.options.queue - 1) {
- this.__super.element.dequeue("notify");
- }
- return this;
- },
- close: function(){
- var speed = this.options.speed;
- this.element.fadeTo(speed, 0).slideUp(speed, $.proxy(function(){
- this._trigger("close");
- this.isOpen = false;
- this.element.remove();
- this.__super.openNotifications -= 1;
- this.__super.element.dequeue("notify");
- }, this));
- return this;
- },
- open: function(){
- if(this.isOpen || this._trigger("beforeopen") === false){
- return this;
- }
- var self = this;
- this.__super.openNotifications += 1;
- this.element[this.options.stack === "above" ? "prependTo" : "appendTo"](this.__super.element).css({ display:"none", opacity:"" }).fadeIn(this.options.speed, function(){
- self._trigger("open");
- self.isOpen = true;
- });
- return this;
- },
- widget: function(){
- return this.element;
- },
- _trigger: function(type, e, instance){
- return this.__super._trigger.call( this, type, e, instance );
- }
- });
- })(jQuery);
|