Array.prototype.remove = function(dx) {
    if (isNaN(dx) || dx > this.length)
        return null;
    var el = this[dx];
    for (var i = 0,n = 0; i < this.length; i++)
        if (i != dx)
            this[n++] = this[i];
    this.length -= 1;
    return el;
};

Array.prototype.insertAt = function(index, obj) {
    this.splice(index, 0, obj);
};

Array.prototype.removeItem = function(item) {
    for (var i = 0; i < this.length; i++)
        if (this[i] == item) {
            this.remove(i);
            break;
        }
};

Array.prototype.indexOf = function(item, i) {
    i || (i = 0);
    var length = this.length;
    if (i < 0) i = length + i;
    for (; i < length; i++)
        if (this[i] === item) return i;
    return -1;
};

String.prototype.replaceAll  = function(s1,s2){   
     return this.replace(new RegExp(s1,"gm"),s2);
}



function HashMap() {
    var size = 0;
    var entry = new Object();
    this.put = function (key, value) {
        if (!this.containsKey(key)) {
            size ++;
        }
        entry[key] = value;
    }
    this.get = function (key) {
        return this.containsKey(key) ? entry[key] : null;
    }
    this.remove = function (key) {
        if (this.containsKey(key) && ( delete entry[key] )) {
            size --;
        }
    }
    this.containsKey = function (key) {
        return (key in entry);
    }
    this.containsValue = function (value) {
        for (var prop in entry) {
            if (entry[prop] == value) {
                return true;
            }
        }
        return false;
    }
    this.values = function () {
        var values = new Array();
        for (var prop in entry) {
            values.push(entry[prop]);
        }
        return values;
    }
    this.keys = function () {
        var keys = new Array();
        for (var prop in entry) {
            keys.push(prop);
        }
        return keys;
    }
    this.size = function () {
        return size;
    }
    this.clear = function () {
        size = 0;
        entry = new Object();
    }
}
