+$.queue = {};
+
+$.dequeue = function(elem,type){
+ type = type || 'fx';
+
+ if ( elem.$$queue && elem.$$queue[type] ) {
+ // Remove self
+ elem.$$queue[type].shift();
+
+ // Get next function
+ var f = elem.$$queue[type][0];
+
+ if ( f ) {
+ $.apply( elem, f );
+ }
+ }
+};
+
+$.fn.queue = function(type,fn){
+ if ( !fn ) {
+ fn = type;
+ type = 'fx';
+ }
+
+ return this.each(function(){
+ if ( !this.$$queue ) {
+ this.$$queue = {};
+ }
+
+ if ( !this.$$queue[type] ) {
+ this.$$queue[type] = [];
+ }
+
+ this.$$queue[type].push( fn );
+
+ if ( this.$$queue[type].length == 1 ) {
+ $.apply(this,fn);
+ }
+ });
+};
+
+$.fn._hide = $.fn.hide;
+