| /** |
| * jQuery.timers - Timer abstractions for jQuery |
| * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com) |
| * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/). |
| * Date: 2009/10/16 |
| * |
| * @author Blair Mitchelmore |
| * @version 1.2 |
| * |
| **/ |
| |
| 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: { |
| // Yeah this is major overkill... |
| '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); |
| }); |
| }); |