var econda;
(function (econda) {
    var util;
    (function (util) {
        /**
         * Array helper functions
         * @class econda.util.ArrayUtils
         * @static
         */
        var ArrayUtils = (function () {
            function ArrayUtils() {
            }
            /**
             * Returns index of needle in array obj
             *
             * @method
             * @param {Array} arr array to search in
             * @param {Object/string/number} needle array item to search for
             * @return {number} needle found at index or -1 if needle was not found
             */
            ArrayUtils.indexOf = function (arr, needle) {
                if (Array.prototype.indexOf) {
                    return arr.indexOf(needle);
                }
                else {
                    for (var n = 0; n < arr.length; n++) {
                        if (arr[n] == needle) {
                            return n;
                        }
                    }
                    return -1;
                }
            };
            /**
             * Returns true if array contains needle.
             *
             *     var myArr = ["one", "two"];
             *     console.log(econda.util.ArrayUtils.contains('one'));
             *     // => true
             *
             * @method
             * @param {Array} arr array to search in
             * @param {Object/string/number} needle array item to search for
             * @return {number} true if needle was found
             */
            ArrayUtils.contains = function (arr, needle) {
                return (ArrayUtils.indexOf(arr, needle) > -1);
            };
            /**
             * Check if parm is an array
             * @param {Mixed} obj
             * @returns {Boolean}
             */
            ArrayUtils.isArray = function (obj) {
                if (!this.isArrayFn) {
                    this.isArrayFn = (typeof Array.isArray != "undefined") ? Array.isArray : function (obj) {
                        return Object.prototype.toString.call(obj) === '[object Array]';
                    };
                }
                return this.isArrayFn(obj);
            };
            /**
             * Shuffels the items in an array.
             * @param {Array} arr
             */
            ArrayUtils.shuffle = function (arr) {
                var m = arr.length, t, i;
                while (m) {
                    // pick a remaining element
                    i = Math.floor(Math.random() * m--);
                    // swap it with the current element
                    t = arr[m];
                    arr[m] = arr[i];
                    arr[i] = t;
                }
                return arr;
            };
            /**
             * Remove one or multiple items from an array
             * @param {Object[]} arr
             * @param {Object/Object[]} itemOrItemsToRemove
             */
            ArrayUtils.remove = function (arr, itemOrItemsToRemove) {
                if (typeof itemOrItemsToRemove === 'function') {
                    return this._removeByFunction(arr, itemOrItemsToRemove);
                }
                var itemsToRemove = ArrayUtils.isArray(itemOrItemsToRemove) ? itemOrItemsToRemove : [itemOrItemsToRemove];
                return this._removeItems(arr, itemsToRemove);
            };
            /// @private
            ArrayUtils._removeItems = function (arr, itemsToRemove) {
                var itemsRemoved = [];
                for (var i = 0; i < itemsToRemove.length; i++) {
                    var index = arr.indexOf(itemsToRemove[i]);
                    if (index > -1) {
                        itemsRemoved = itemsRemoved.concat(arr.splice(index, 1));
                    }
                }
                return itemsRemoved;
            };
            /// @private
            ArrayUtils._removeByFunction = function (arr, filterFunction) {
                var itemsRemoved = [];
                for (var n = 0; n < arr.length; n++) {
                    if (filterFunction(arr[n], n, arr) === true) {
                        itemsRemoved = itemsRemoved.concat(arr.splice(n, 1));
                        n--;
                    }
                }
                return itemsRemoved;
            };
            /**
             * Filter array using a callback function. Will return a filtered array and not modify the input array.
             * @param {Object[]} arr array to filter
             * @param {Function} filterFunction callback function
             * @returns {Object[]} filtered array
             */
            ArrayUtils.filter = function (arr, filterFunction) {
                if (typeof filterFunction !== 'function') {
                    return arr;
                }
                if (typeof arr.filter === 'function') {
                    return arr.filter(filterFunction);
                }
                var ret = [];
                for (var n = 0; n < arr.length; n++) {
                    if (filterFunction(arr[n], n, arr) === true) {
                        ret.push(arr[n]);
                    }
                }
                return ret;
            };
            ArrayUtils.isArrayFn = null;
            return ArrayUtils;
        }());
        util.ArrayUtils = ArrayUtils; // end of class
    })(util = econda.util || (econda.util = {}));
})(econda || (econda = {})); // end of module