/**
 объединение массивов без дублирования элементов
 * Array.prototype.union
 *
 * @syntax
 * object.union(array)
 *
 * @description
 * Appends the right handed array to the left handed, 
 * whereas duplicated keys are NOT overwritten.
 * The callback defines unique criteria of array items.
 * By default, unique criteria is value1 != value2
 *
 * @example
 * <code>
 * var arr1 = [1, 2, 3, 4];
 * var arr2 = [1, 4, 5, 6];
 * var arr3 = arr1.union(arr2); // arr3 == [1, 2, 3, 4, 5, 6]
 *
 * var arr4 = [].union([1, 1, 3, 1, 4, 3, 5]); // arr4 == [1, 3, 4, 5]
 * </code>
 *
 * @param        Array                list
 * @param        Function        callback
 * @return        Array
 * @access        public
 */
Array.prototype.union = function(list, callback)
{
        if ( 'function' != typeof callback ) {
                callback = function(value1, value2)
                {
                        return value1 != value2;
                }
        }

        var result = this;
        for (var i = 0; i < list.length; i++) {
                var j = 0;
                var u = true;
                while ( j < result.length ) {
                        u = callback(result[j], list[i]);
                        if ( ! u ) {
                                break;
                        }
                        j++;
                }
                if ( ! u ) {
                        continue;
                }

                result[result.length] = list[i];
        }
        return result;
}
