(function ($) { $.extend($.fn, { livequery: function (type, fn, fn2) { var self = this, q; if ($.isFunction(type)) fn2 = fn, fn = type, type = undefined; $.each($.livequery.queries, function (i, query) { if (self.selector == query.selector && self.context == query.context && type == query.type && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid)) return (q = query) && false }); q = q || new $.livequery(this.selector, this.context, type, fn, fn2); q.stopped = false; q.run(); return this }, expire: function (type, fn, fn2) { var self = this; if ($.isFunction(type)) fn2 = fn, fn = type, type = undefined; $.each($.livequery.queries, function (i, query) { if (self.selector == query.selector && self.context == query.context && (!type || type == query.type) && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) && !this.stopped) $.livequery.stop(query.id) }); return this } }); $.livequery = function (selector, context, type, fn, fn2) { this.selector = selector; this.context = context || document; this.type = type; this.fn = fn; this.fn2 = fn2; this.elements = []; this.stopped = false; this.id = $.livequery.queries.push(this) - 1; fn.$lqguid = fn.$lqguid || $.livequery.guid++; if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++; return this }; $.livequery.prototype = { stop: function () { var query = this; if (this.type) this.elements.unbind(this.type, this.fn); else if (this.fn2) this.elements.each(function (i, el) { query.fn2.apply(el) }); this.elements = []; this.stopped = true }, run: function () { if (this.stopped) return; var query = this; var oEls = this.elements, els = $(this.selector, this.context), nEls = els.not(oEls); this.elements = els; if (this.type) { nEls.bind(this.type, this.fn); if (oEls.length > 0) $.each(oEls, function (i, el) { if ($.inArray(el, els) < 0) $.event.remove(el, query.type, query.fn) }) } else { nEls.each(function () { query.fn.apply(this) }); if (this.fn2 && oEls.length > 0) $.each(oEls, function (i, el) { if ($.inArray(el, els) < 0) query.fn2.apply(el) }) } } }; $.extend($.livequery, { guid: 0, queries: [], queue: [], running: false, timeout: null, checkQueue: function () { if ($.livequery.running && $.livequery.queue.length) { var length = $.livequery.queue.length; while (length--) $.livequery.queries[$.livequery.queue.shift()].run() } }, pause: function () { $.livequery.running = false }, play: function () { $.livequery.running = true; $.livequery.run() }, registerPlugin: function () { $.each(arguments, function (i, n) { if (!$.fn[n]) return; var old = $.fn[n]; $.fn[n] = function () { var r = old.apply(this, arguments); $.livequery.run(); return r } }) }, run: function (id) { if (id != undefined) { if ($.inArray(id, $.livequery.queue) < 0) $.livequery.queue.push(id) } else $.each($.livequery.queries, function (id) { if ($.inArray(id, $.livequery.queue) < 0) $.livequery.queue.push(id) }); if ($.livequery.timeout) clearTimeout($.livequery.timeout); $.livequery.timeout = setTimeout($.livequery.checkQueue, 20) }, stop: function (id) { if (id != undefined) $.livequery.queries[id].stop(); else $.each($.livequery.queries, function (id) { $.livequery.queries[id].stop() }) } }); $.livequery.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove'); $(function () { $.livequery.play() }); var init = $.prototype.init; $.prototype.init = function (a, c) { var r = init.apply(this, arguments); if (a && a.selector) r.context = a.context, r.selector = a.selector; if (typeof a == 'string') r.context = c || document, r.selector = a; return r }; $.prototype.init.prototype = $.prototype })(jQuery);