Project

General

Profile

Download (8.05 KB) Statistics
| Branch: | Tag: | Revision:
/*!
* jNotify jQuery Plug-in
*
* Copyright 2010 Giva, Inc. (http://www.givainc.com/labs/)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Date: 2010-09-30
* Rev: 1.1.00
*/
;(function($){
$.jnotify = function (m, o, d){
return new jNotify(m, o, d);
};

// set the version of the plug-in
$.jnotify.version = "1.1.00";

var $jnotify, queue = [], count = 0, playing = false, paused = false, queuedId, queuedNote,
// define default settings
defaults = {
// define core settings
type: "" // if a type is specified, then an additional class of classNotification + type is created for each notification
, delay: 2000 // the default time to show each notification (in milliseconds)
, sticky: false // determines if the message should be considered "sticky" (user must manually close notification)
, closeLabel: "×" // the HTML to use for the "Close" link
, showClose: true // determines if the "Close" link should be shown if notification is also sticky
, fadeSpeed: 1000 // the speed to fade messages out (in milliseconds)
, slideSpeed: 250 // the speed used to slide messages out (in milliseconds)

// define the class statements
, classContainer: "jnotify-container" // className to use for the outer most container--this is where all the notifications appear
, classNotification: "jnotify-notification" // className of the individual notification containers
, classBackground: "jnotify-background" // className of the background layer for each notification container
, classClose: "jnotify-close" // className to use for the "Close" link
, classMessage: "jnotify-message" // className to use for the actual notification text container--this is where the message is actually written

// event handlers
, init: null // callback that occurs when the main jnotify container is created
, create: null // callback that occurs when when the note is created (occurs just before appearing in DOM)
, beforeRemove: null // callback that occurs when before the notification starts to fade away
, remove: null // callback that occurs when notification is removed
, transition: null // allows you to overwrite how the transitions between messages are handled
// receives the following arguments:
// container - jQuery object containing the notification
// message - jQuery object of the actual message
// count - the number of items left in queue
// callback - a function you must execute once your transition has executed
// options - the options used for this jnotify instance
};

// override the defaults
$.jnotify.setup = function (o){
defaults = $.extend({}, defaults, o) ;
};

$.jnotify.play = function (f, d){
if( playing && (f !== true ) || (queue.length == 0) ) return;
playing = true;

// get first note
var note = queue.shift();
queuedNote = note;

// determine delay to use
var delay = (arguments.length >= 2) ? parseInt(d, 10) : note.options.delay;

// run delay before removing message
queuedId = setTimeout(function(){
// clear timeout id
queuedId = 0;
note.remove(function (){
// makr that the queue is empty
if( queue.length == 0 ) playing = false;
// force playing the next item in queue
else if( !paused ) $.jnotify.play(true);
});
}, delay);
};

$.jnotify.pause = function(){
clearTimeout(queuedId);
// push the item back into the queue
if( queuedId ) queue.unshift(queuedNote);
// mark that we're playing (so it doesn't automatically start playing)
paused = playing = true;
}

$.jnotify.resume = function(){
// mark that we're no longer pause
paused = false;

// resume playing
$.jnotify.play(true, 0);
}


function jNotify(message, options){
// a reference to the jNotify object
var self = this, TO = typeof options;

if( TO == "number" ){
options = $.extend({}, defaults, {delay: options});
} else if( TO == "boolean" ){
options = $.extend({}, defaults, {sticky: true}) ;
} else if( TO == "string" ){
options = $.extend({}, defaults, {type: options, delay: ((arguments.length > 2) && (typeof arguments[2] == "number")) ? arguments[2] : defaults.delay, sticky: ((arguments.length > 2) && (typeof arguments[2] == "boolean")) ? arguments[2] : defaults.sticky}) ;
} else {
options = $.extend({}, defaults, options);
}

// store the options
this.options = options;

// if the container doesn't exist, create it
if( !$jnotify ){
// we want to use one single container, so always use the default container class
$jnotify = $('<div class="' + defaults.classContainer + '" />').appendTo("body");
if( $.isFunction(options.init) ) options.init.apply(self, [$jnotify]);
}

// create the notification
function create(message){
var html = '<div class="' + options.classNotification + (options.type.length ? (" " + options.classNotification + "-" + options.type) : "") + '">'
+ '<div class="' + options.classBackground + '"></div>'
+ (options.sticky && options.showClose ? ('<a class="' + options.classClose + '">' + options.closeLabel + '</a>') : '')
+ '<div class="' + options.classMessage + '">'
+ '<div>' + message + '</div>'
+ '</div></div>';

// increase the counter tracking the notification instances
count++;

// create the note
var $note = $(html);

if( options.sticky ){
// add click handler to remove the sticky notification
$note.find("a." + options.classClose).bind("click.jnotify", function (){
self.remove();
});
}

// run callback
if( $.isFunction(options.create) ) options.create.apply(self, [$note]);

// return the new note
return $note.appendTo($jnotify);
}

// remove the notification
this.remove = function (callback){
var $msg = $note.find("." + options.classMessage), $parent = $msg.parent();
// remove message from counter
var index = count--;

// run callback
if( $.isFunction(options.beforeRemove) ) options.beforeRemove.apply(self, [$msg]);

// cleans up notification
function finished(){
// remove the parent container
$parent.remove();

// if there's a callback, run it
if( $.isFunction(callback) ) callback.apply(self, [$msg]);
if( $.isFunction(options.remove) ) options.remove.apply(self, [$msg]);
}

// check if a custom transition has been specified
if( $.isFunction(options.transition) ) options.transition.apply(self, [$parent, $msg, index, finished, options]);
else {
$msg.fadeTo(options.fadeSpeed, 0.01, function (){
// if last item, just remove
if( index <= 1 ) finished();
// slide the parent closed
else $parent.slideUp(options.slideSpeed, finished);
});

// if the last notification, fade out the container
if( count <= 0 ) $parent.fadeOut(options.fadeSpeed);
}
}

// create the note
var $note = create(message);

// if not a sticky, add to show queue
if( !options.sticky ){
// add the message to the queue
queue.push(this);
// play queue
$.jnotify.play();
}

return this;
};

})(jQuery);
(7-7/12)