var _si_Interval            = 10;
var _si_ProcessCounter      = 0;
var _si_Counter             = 0;
var _SI_MESSAGE_ERROR       = '第一引数が不正です。';
var _SI_TYPE_STRING         = 'string';
var _SI_TYPE_FUNCTION       = 'function';
var _si_NativeSetInterval   = window.setInterval;
var _si_ProcessArray        = [];
var _si_TimingArray         = [];

window.setInterval = function(process, delay) {
    if(typeof process == _SI_TYPE_STRING) {
        process = new Function(process);
    }
    else if(typeof process != _SI_TYPE_FUNCTION) {
        throw Error(_SI_MESSAGE_ERROR);
    }
    var id;
    for(id = 0; ; id ++) {
        if(!_si_ProcessArray[id]) {
            break;
        }
    }
    _si_TimingArray[id]  = Math.floor(delay / _si_Interval) || 1;
    _si_ProcessArray[id] = process;
    if(_si_ProcessCounter == id) {
        _si_ProcessCounter ++;
    }
    return ++id;
};

window.clearInterval = function(id) {
    id--; _si_ProcessArray[id] = undefined;
    if(!((-- _si_ProcessCounter) == id)) {
        _si_ProcessCounter ++;
    }
};

_si_NativeSetInterval(
    function() {
        _si_Counter ++;
        for(var i = 0; i < _si_ProcessCounter; i ++){
            var process = _si_ProcessArray[i];
            if(!(_si_Counter % _si_TimingArray[i]) && process) {
                process();
            }
        }
    },
    _si_Interval
);
