var _si_nativeSetInterval = window.setInterval;
var _si_nativeClearInterval = window.clearInterval;
var _si_intervalTime = 10;
var _si_counter = 1;
var _si_length = 0;
var _si_functions = {};
var _si_counters = {};
var _si_numbers = {};
var _si_intervalId = undefined;
var _si_loop = function(){
	var f = _si_functions, c = _si_counters, n = _si_numbers;
	for(var i in f){
		if(!--c[i]){
			f[i]();
			c[i] = n[i];
		}
	}
};
window.setInterval = function(handler, time){
	if(typeof(handler)=='string') handler = new Function(handler);
	_si_functions[_si_counter] = handler;
	_si_counters[_si_counter] = _si_numbers[_si_counter] = Math.ceil(time / _si_intervalTime);
	if(++_si_length&&!_si_intervalId) _si_intervalId = _si_nativeSetInterval(_si_loop, _si_intervalTime);
	return _si_counter++;
};
window.clearInterval = function(id){
	if(_si_functions[id]){
		delete _si_functions[id];
		delete _si_numbers[id];
		delete _si_counters[id];
		if(!--_si_length&&_si_intervalId){
			_si_nativeClearInterval(_si_intervalId);
			_si_intervalId = undefined;
		}
	}
};
