﻿jQuery.fn.extend({everyTime: function(interval,label,fn,times){return this.each(function(){jQuery.timer.add(this,interval,label,fn,times);});},oneTime: function(interval,label,fn){return this.each(function(){jQuery.timer.add(this,interval,label,fn,1);});},stopTime: function(label,fn){return this.each(function(){jQuery.timer.remove(this,label,fn);});}});jQuery.extend({timer:{global: [],guid: 1,dataKey: "jQuery.timer",regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,powers:{'ms': 1,'cs': 10,'ds': 100,'s': 1000,'das': 10000,'hs': 100000,'ks': 1000000},timeParse: function(value){if (value==undefined||value==null)return null;var result=this.regex.exec(jQuery.trim(value.toString()));if (result[2]){var num=parseFloat(result[1]);var mult=this.powers[result[2]]||1;return num * mult;} else{return value;}},add: function(element,interval,label,fn,times){var counter=0;if (jQuery.isFunction(label)){if (!times) times=fn;fn=label;label=interval;}interval=jQuery.timer.timeParse(interval);if (typeof interval !='number'||isNaN(interval)||interval<0)return;if (typeof times !='number'||isNaN(times)||times<0) times=0;times=times||0;var timers=jQuery.data(element,this.dataKey)||jQuery.data(element,this.dataKey,{});if (!timers[label])timers[label]={};fn.timerID=fn.timerID||this.guid++;var handler=function(){if ((++counter>times && times !==0)||fn.call(element,counter)===false)jQuery.timer.remove(element,label,fn);};handler.timerID=fn.timerID;if (!timers[label][fn.timerID])timers[label][fn.timerID]=window.setInterval(handler,interval);this.global.push(element);},remove: function(element,label,fn){var timers=jQuery.data(element,this.dataKey),ret;if (timers){if (!label){for (label in timers)this.remove(element,label,fn);} else if (timers[label]){if (fn){if (fn.timerID){window.clearInterval(timers[label][fn.timerID]);delete timers[label][fn.timerID];}} else{for (var fn in timers[label]){window.clearInterval(timers[label][fn]);delete timers[label][fn];}}for (ret in timers[label]) break;if (!ret){ret=null;delete timers[label];}}for (ret in timers) break;if (!ret) jQuery.removeData(element,this.dataKey);}}}});jQuery(window).bind("unload",function(){jQuery.each(jQuery.timer.global,function(index,item){jQuery.timer.remove(item);});});
