jQuery.fn.extend({everyTime:function(b,a,c,d,e){return this.each(function(){jQuery.timer.add(this,b,a,c,d,e)})},oneTime:function(b,a,c){return this.each(function(){jQuery.timer.add(this,b,a,c,1)})},stopTime:function(b,a){return this.each(function(){jQuery.timer.remove(this,b,a)})}}); jQuery.extend({timer:{guid:1,global:{},regex:/^([0-9]+)\s*(.*s)?$/,powers:{ms:1,cs:10,ds:100,s:1E3,das:1E4,hs:1E5,ks:1E6},timeParse:function(b){if(b==undefined||b==null)return null;var a=this.regex.exec(jQuery.trim(b.toString()));return a[2]?parseInt(a[1],10)*(this.powers[a[2]]||1):b},add:function(b,a,c,d,e,f){var g=0;if(jQuery.isFunction(c)){e||(e=d);d=c;c=a}a=jQuery.timer.timeParse(a);if(!(typeof a!="number"||isNaN(a)||a<=0)){if(e&&e.constructor!=Number){f=!!e;e=0}e=e||0;f=f||false;if(!b.$timers)b.$timers= {};b.$timers[c]||(b.$timers[c]={});d.$timerID=d.$timerID||this.guid++;var h=function(){if(!(f&&this.inProgress)){this.inProgress=true;if(++g>e&&e!==0||d.call(b,g)===false)jQuery.timer.remove(b,c,d);this.inProgress=false}};h.$timerID=d.$timerID;b.$timers[c][d.$timerID]||(b.$timers[c][d.$timerID]=window.setInterval(h,a));this.global[c]||(this.global[c]=[]);this.global[c].push(b)}},remove:function(b,a,c){var d=b.$timers,e;if(d){if(a){if(d[a]){if(c){if(c.$timerID){window.clearInterval(d[a][c.$timerID]); delete d[a][c.$timerID]}}else for(c in d[a]){window.clearInterval(d[a][c]);delete d[a][c]}for(e in d[a])break;if(!e){e=null;delete d[a]}}}else for(a in d)this.remove(b,a,c);for(e in d)break;if(!e)b.$timers=null}}}});jQuery.browser.msie&&jQuery(window).one("unload",function(){var b=jQuery.timer.global;for(var a in b)for(var c=b[a],d=c.length;--d;)jQuery.timer.remove(c[d],a)});
