
function $each(arr, fn) {
    var res = [];
    switch(fn.length) {
    case 1:
        for(var i=0; i<arr.length; i++)
            res.push(fn(arr[i]));
        break;
    case 2:
        for(var i=0; i<arr.length; i++)
            res.push(i, fn(arr[i]));
        break;
    default:
        throw new Error("Invalid arguments count.");
    }
    return res;
}

/**
 * Generate unique identifier.
 */
function $uid() {
    $uid.val = $uid.val ? $uid.val+1 : 1;
    var date = new Date();
    return Math.floor(Math.random()*99999).toString()
            + "-" + date.getMilliseconds() + '-'
            + date.getSeconds() + '-' + $uid.val;
}

/**
 * @param delay - время между вызовами
 * @param handler - обработчик событий таймера (this - таймер)
 * @param ... - аргументы обработчика
 */
function $timer(delay, handler) {
    var internal_handler = function() {
        var timer = arguments.callee.timer;
        timer.handler.apply(timer, timer.params);
    }
    var res = {
        "delay": delay,
        "handler": handler,
        "params": [],
        "close": function() {
            window.clearTimeout(this.id);
        }
    };
    for(var i=2; i<arguments.length; i++)
        res.params.push(arguments[i]);
    internal_handler.timer = res;
    res.id = window.setTimeout(internal_handler, delay);
    return res;
}







