You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
12 KiB
432 lines
12 KiB
/*!
|
|
* Noty Helpers Javascript From JQuery Javascript Library
|
|
*
|
|
* Ported by Maksim Pecherskiy. Original Licensing:
|
|
*
|
|
* http://jquery.com/
|
|
*
|
|
* Copyright 2011, John Resig
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://jquery.org/license
|
|
*
|
|
* Includes Sizzle.js
|
|
* http://sizzlejs.com/
|
|
* Copyright 2011, The Dojo Foundation
|
|
* Released under the MIT, BSD, and GPL Licenses.
|
|
*
|
|
* Date: Mon Nov 21 21:11:03 2011 -0500
|
|
*/
|
|
|
|
|
|
(function(){
|
|
|
|
// String to Object flags format cache
|
|
var flagsCache = {};
|
|
|
|
// Convert String-formatted flags into Object-formatted ones and store in cache
|
|
function createFlags( flags ) {
|
|
var object = flagsCache[ flags ] = {},
|
|
i, length;
|
|
flags = flags.split( /\s+/ );
|
|
for ( i = 0, length = flags.length; i < length; i++ ) {
|
|
object[ flags[i] ] = true;
|
|
}
|
|
return object;
|
|
}
|
|
|
|
jQuery.extend({
|
|
|
|
_mark: function( elem, type ) {
|
|
if ( elem ) {
|
|
type = (type || "fx") + "mark";
|
|
jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
|
|
}
|
|
},
|
|
|
|
_unmark: function( force, elem, type ) {
|
|
if ( force !== true ) {
|
|
type = elem;
|
|
elem = force;
|
|
force = false;
|
|
}
|
|
if ( elem ) {
|
|
type = type || "fx";
|
|
var key = type + "mark",
|
|
count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
|
|
if ( count ) {
|
|
jQuery.data( elem, key, count, true );
|
|
} else {
|
|
jQuery.removeData( elem, key, true );
|
|
handleQueueMarkDefer( elem, type, "mark" );
|
|
}
|
|
}
|
|
},
|
|
|
|
queue: function( elem, type, data ) {
|
|
if ( elem ) {
|
|
type = (type || "fx") + "queue";
|
|
var q = jQuery.data( elem, type, undefined, true );
|
|
// Speed up dequeue by getting out quickly if this is just a lookup
|
|
if ( data ) {
|
|
if ( !q || jQuery.isArray(data) ) {
|
|
q = jQuery.data( elem, type, jQuery.makeArray(data), true );
|
|
} else {
|
|
q.push( data );
|
|
}
|
|
}
|
|
return q || [];
|
|
}
|
|
},
|
|
|
|
dequeue: function( elem, type ) {
|
|
type = type || "fx";
|
|
|
|
var queue = jQuery.queue( elem, type ),
|
|
fn = queue.shift(),
|
|
defer;
|
|
|
|
// If the fx queue is dequeued, always remove the progress sentinel
|
|
if ( fn === "inprogress" ) {
|
|
fn = queue.shift();
|
|
}
|
|
|
|
if ( fn ) {
|
|
// Add a progress sentinel to prevent the fx queue from being
|
|
// automatically dequeued
|
|
if ( type === "fx" ) {
|
|
queue.unshift("inprogress");
|
|
}
|
|
|
|
fn.call(elem, function() {
|
|
jQuery.dequeue(elem, type);
|
|
});
|
|
}
|
|
|
|
if ( !queue.length ) {
|
|
jQuery.removeData( elem, type + "queue", true );
|
|
handleQueueMarkDefer( elem, type, "queue" );
|
|
}
|
|
}
|
|
});
|
|
|
|
jQuery.fn.extend({
|
|
queue: function( type, data ) {
|
|
if ( typeof type !== "string" ) {
|
|
data = type;
|
|
type = "fx";
|
|
}
|
|
|
|
if ( data === undefined ) {
|
|
return jQuery.queue( this[0], type );
|
|
}
|
|
return this.each(function() {
|
|
var queue = jQuery.queue( this, type, data );
|
|
|
|
if ( type === "fx" && queue[0] !== "inprogress" ) {
|
|
jQuery.dequeue( this, type );
|
|
}
|
|
});
|
|
},
|
|
dequeue: function( type ) {
|
|
return this.each(function() {
|
|
jQuery.dequeue( this, type );
|
|
});
|
|
},
|
|
// Based off of the plugin by Clint Helfers, with permission.
|
|
// http://blindsignals.com/index.php/2009/07/jquery-delay/
|
|
delay: function( time, type ) {
|
|
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
|
|
type = type || "fx";
|
|
|
|
return this.queue( type, function() {
|
|
var elem = this;
|
|
setTimeout(function() {
|
|
jQuery.dequeue( elem, type );
|
|
}, time );
|
|
});
|
|
},
|
|
clearQueue: function( type ) {
|
|
return this.queue( type || "fx", [] );
|
|
},
|
|
// Get a promise resolved when queues of a certain type
|
|
// are emptied (fx is the type by default)
|
|
promise: function( type, object ) {
|
|
if ( typeof type !== "string" ) {
|
|
object = type;
|
|
type = undefined;
|
|
}
|
|
type = type || "fx";
|
|
var defer = jQuery.Deferred(),
|
|
elements = this,
|
|
i = elements.length,
|
|
count = 1,
|
|
deferDataKey = type + "defer",
|
|
queueDataKey = type + "queue",
|
|
markDataKey = type + "mark",
|
|
tmp;
|
|
function resolve() {
|
|
if ( !( --count ) ) {
|
|
defer.resolveWith( elements, [ elements ] );
|
|
}
|
|
}
|
|
while( i-- ) {
|
|
if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
|
|
( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
|
|
jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
|
|
jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
|
|
count++;
|
|
tmp.done( resolve );
|
|
}
|
|
}
|
|
resolve();
|
|
return defer.promise();
|
|
}
|
|
});
|
|
|
|
function handleQueueMarkDefer( elem, type, src ) {
|
|
var deferDataKey = type + "defer",
|
|
queueDataKey = type + "queue",
|
|
markDataKey = type + "mark",
|
|
defer = jQuery._data( elem, deferDataKey );
|
|
if ( defer &&
|
|
( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
|
|
( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
|
|
// Give room for hard-coded callbacks to fire first
|
|
// and eventually mark/queue something else on the element
|
|
setTimeout( function() {
|
|
if ( !jQuery._data( elem, queueDataKey ) &&
|
|
!jQuery._data( elem, markDataKey ) ) {
|
|
jQuery.removeData( elem, deferDataKey, true );
|
|
defer.fire();
|
|
}
|
|
}, 0 );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
jQuery.Callbacks = function( flags ) {
|
|
|
|
// Convert flags from String-formatted to Object-formatted
|
|
// (we check in cache first)
|
|
flags = flags ? ( /*flagsCache[ flags ] || */createFlags( flags ) ) : {};
|
|
|
|
var // Actual callback list
|
|
list = [],
|
|
// Stack of fire calls for repeatable lists
|
|
stack = [],
|
|
// Last fire value (for non-forgettable lists)
|
|
memory,
|
|
// Flag to know if list is currently firing
|
|
firing,
|
|
// First callback to fire (used internally by add and fireWith)
|
|
firingStart,
|
|
// End of the loop when firing
|
|
firingLength,
|
|
// Index of currently firing callback (modified by remove if needed)
|
|
firingIndex,
|
|
// Add one or several callbacks to the list
|
|
add = function( args ) {
|
|
var i,
|
|
length,
|
|
elem,
|
|
type,
|
|
actual;
|
|
for ( i = 0, length = args.length; i < length; i++ ) {
|
|
elem = args[ i ];
|
|
type = jQuery.type( elem );
|
|
if ( type === "array" ) {
|
|
// Inspect recursively
|
|
add( elem );
|
|
} else if ( type === "function" ) {
|
|
// Add if not in unique mode and callback is not in
|
|
if ( !flags.unique || !self.has( elem ) ) {
|
|
list.push( elem );
|
|
}
|
|
}
|
|
}
|
|
},
|
|
// Fire callbacks
|
|
fire = function( context, args ) {
|
|
args = args || [];
|
|
memory = !flags.memory || [ context, args ];
|
|
firing = true;
|
|
firingIndex = firingStart || 0;
|
|
firingStart = 0;
|
|
firingLength = list.length;
|
|
for ( ; list && firingIndex < firingLength; firingIndex++ ) {
|
|
if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
|
|
memory = true; // Mark as halted
|
|
break;
|
|
}
|
|
}
|
|
firing = false;
|
|
if ( list ) {
|
|
if ( !flags.once ) {
|
|
if ( stack && stack.length ) {
|
|
memory = stack.shift();
|
|
self.fireWith( memory[ 0 ], memory[ 1 ] );
|
|
}
|
|
} else if ( memory === true ) {
|
|
self.disable();
|
|
} else {
|
|
list = [];
|
|
}
|
|
}
|
|
},
|
|
// Actual Callbacks object
|
|
self = {
|
|
// Add a callback or a collection of callbacks to the list
|
|
add: function() {
|
|
if ( list ) {
|
|
var length = list.length;
|
|
add( arguments );
|
|
// Do we need to add the callbacks to the
|
|
// current firing batch?
|
|
if ( firing ) {
|
|
firingLength = list.length;
|
|
// With memory, if we're not firing then
|
|
// we should call right away, unless previous
|
|
// firing was halted (stopOnFalse)
|
|
} else if ( memory && memory !== true ) {
|
|
firingStart = length;
|
|
fire( memory[ 0 ], memory[ 1 ] );
|
|
}
|
|
}
|
|
return this;
|
|
},
|
|
// Remove a callback from the list
|
|
remove: function() {
|
|
if ( list ) {
|
|
var args = arguments,
|
|
argIndex = 0,
|
|
argLength = args.length;
|
|
for ( ; argIndex < argLength ; argIndex++ ) {
|
|
for ( var i = 0; i < list.length; i++ ) {
|
|
if ( args[ argIndex ] === list[ i ] ) {
|
|
// Handle firingIndex and firingLength
|
|
if ( firing ) {
|
|
if ( i <= firingLength ) {
|
|
firingLength--;
|
|
if ( i <= firingIndex ) {
|
|
firingIndex--;
|
|
}
|
|
}
|
|
}
|
|
// Remove the element
|
|
list.splice( i--, 1 );
|
|
// If we have some unicity property then
|
|
// we only need to do this once
|
|
if ( flags.unique ) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return this;
|
|
},
|
|
// Control if a given callback is in the list
|
|
has: function( fn ) {
|
|
if ( list ) {
|
|
var i = 0,
|
|
length = list.length;
|
|
for ( ; i < length; i++ ) {
|
|
if ( fn === list[ i ] ) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
// Remove all callbacks from the list
|
|
empty: function() {
|
|
list = [];
|
|
return this;
|
|
},
|
|
// Have the list do nothing anymore
|
|
disable: function() {
|
|
list = stack = memory = undefined;
|
|
return this;
|
|
},
|
|
// Is it disabled?
|
|
disabled: function() {
|
|
return !list;
|
|
},
|
|
// Lock the list in its current state
|
|
lock: function() {
|
|
stack = undefined;
|
|
if ( !memory || memory === true ) {
|
|
self.disable();
|
|
}
|
|
return this;
|
|
},
|
|
// Is it locked?
|
|
locked: function() {
|
|
return !stack;
|
|
},
|
|
// Call all callbacks with the given context and arguments
|
|
fireWith: function( context, args ) {
|
|
if ( stack ) {
|
|
if ( firing ) {
|
|
if ( !flags.once ) {
|
|
stack.push( [ context, args ] );
|
|
}
|
|
} else if ( !( flags.once && memory ) ) {
|
|
fire( context, args );
|
|
}
|
|
}
|
|
return this;
|
|
},
|
|
// Call all the callbacks with the given arguments
|
|
fire: function() {
|
|
self.fireWith( this, arguments );
|
|
return this;
|
|
},
|
|
// To know if the callbacks have already been called at least once
|
|
fired: function() {
|
|
return !!memory;
|
|
}
|
|
};
|
|
|
|
return self;
|
|
};
|
|
|
|
|
|
|
|
jQuery.fn.extend({
|
|
// Get a promise resolved when queues of a certain type
|
|
// are emptied (fx is the type by default)
|
|
promise: function( type, object ) {
|
|
if ( typeof type !== "string" ) {
|
|
object = type;
|
|
type = undefined;
|
|
}
|
|
type = type || "fx";
|
|
var defer = jQuery.Deferred(),
|
|
elements = this,
|
|
i = elements.length,
|
|
count = 1,
|
|
deferDataKey = type + "defer",
|
|
queueDataKey = type + "queue",
|
|
markDataKey = type + "mark",
|
|
tmp;
|
|
function resolve() {
|
|
if ( !( --count ) ) {
|
|
defer.resolveWith( elements, [ elements ] );
|
|
}
|
|
}
|
|
while( i-- ) {
|
|
if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
|
|
( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
|
|
jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
|
|
jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
|
|
count++;
|
|
tmp.add( resolve );
|
|
}
|
|
}
|
|
resolve();
|
|
return defer.promise();
|
|
}
|
|
});
|
|
})();
|