// Depends on Init.js
DARTY = DARTY || {};
DARTY.util = DARTY.util || {};
// <dependencies checking>
(function(){// Depends on Init.js
    var from = "DARTY.util.Array";
    var libs = ["DARTY.util.Init"];    
	if (DARTY && DARTY.util && DARTY.util.required) {    
        DARTY.util.required(libs, from);
    }
    else {
      if(DARTY && DARTY.DEBUG) {	
        alert("Missing library : DARTY.util.Init in " + from);
      }  
    }
})();
// </dependencies checking>
DARTY.util.Array = {};
Array.methods({
    each: function(visitor_function){
        for (var i = 0; i < this.length; i += 1) {
            visitor_function(this[i]);
        }
		return this;
    },
    select: function(selector_function){
		var result = [];        
        
        if (Array.filter && typeof Array.filter === 'function') {
           result = this.filter(selector_function);
        }
        else {
            this.each(function(element){
                if (selector_function(element)) {
                    result.push(element);
                }
            });
        }
        return result;
    },
    inject: function(initial_value, injector_function){
        var result = initial_value;
        this.each(function(element){
            result = injector_function(result, element);
        });
        return result;
    },
    sum: function(){
        return this.inject(0, function(a, b){
            return a + b;
        });
    },
    mult: function(){
        return this.inject(1, function(a, b){
            return a * b;
        });
    }
});
//  --------------------------------------------------------------- 
Array.is_array = function (value) {
    return value &&
        typeof value === 'object' &&
        typeof value.length === 'number' &&
        typeof value.splice === 'function' &&
        !(value.propertyIsEnumerable('length'));
};

Array.dim = function (dimension, initial) {
    var a = [], i;
    for (i = 0; i < dimension; i += 1) {
        a[i] = initial;
    }
    return a;
};


