/**
 *$Id: array.js 82 2008-10-08 14:07:18Z aanpilogov $
 *
 * Неймспейс для работы с массивами
 */
PuskFramework.arr = new function()
{
    var pf = PuskFramework;

    /**
     * Фукнкция возвращает индекс элемента в массиве
     *
     * @param {Object} array массив, в котором будет произведен поиск
     * @param {Object} item элемент для поиска
     * @return {Integer} индекс элемента, соответствующего аргументу
     */
    this.indexOf = function(array, item)
    {
        if (!array || !array.length || typeof(item) == 'undefined') return -1;
        for (var i = 0, len = array.length; i < len; i++)
        {
            if (array[i] === item) return i;
        }
        return -1;
    };

    /**
     * Реализация цикла foreach для массивов
     *
     * @param {Object} array массив для прохода
     * @param {Object} iterator функция, выполняющаяся над каждым элементом
     * @param {Object} context контекст вызова функции
     */
    this.forEach = function(array, iterator, context)
    {
        if (array && array.length && pf.$type(iterator) == "function")
        {
            for (var i = 0, len = array.length; i < len; i++)
            {
                iterator.call(context, array[i], i, array);
            }
        }
    };

    /**
     * Возвращает массив, отфильтрованный по условию (функции)
     *
     * @param {Object} array исходный массив
     * @param {Object} callback функция фильтрации
     * @param {Object} context контекст вызова функции
     * @return {Array}
     */
    this.filter = function(array, callback, context)
    {
        if (!array || !array.length || !callback || !pf.$type(callback) == "function") return array;
        var val, result = [];
        for (var i = 0, len = array.length; i < len; i++)
        {
            if (i in array)
            {
                val = array[i]; // in case fun mutates this
                if (callback.call(context, val, i, array))
                {
                    result.push(val);
                }
            }
        }
        return result;
    };

    /**
     * Создает копию массива
     *
     * @param {Object} array
     * @return {Array}
     */
    this.clone = function(array)
    {
        if (!array) return null;
        return [].concat(array);
    };

    /**
     * Возвращает значение последнего элемента массива
     *
     * @param {Object} array
     * @return {Object}
     */
    this.getLast = function(array)
    {
        return array ? array[array.length - 1] : null;
    };

    /**
     * Возвращает случайный элемент массива
     *
     * @param {Object} array
     * @return {Object}
     */
    this.getRandom = function(array)
    {
        return array ? array[Math.rand(0, array.length - 1)] : null;
    };

    /**
     * Удаляет заданный элемент из массива
     *
     * @param {Object} array входной массив
     * @param {Object} index индекс элемента
     * @return {Array}
     */
    this.remove = function(array, index)
    {
        if (pf.$type(array) != 'array') return array;
        array.splice(index, 1);
        return array;
    };

    /**
    * Сравнить два массива по содержимому
    */
    this.compare = function(first, second)
    {
        if (first && second && first.length == second.length)
        {
            for (var i=0, len=first.length; i<len; i++)
                if (first[i] != second[i]) return false;
            return true;
        };
        return false;
    }
};

