﻿//======================================= Properties ========================================
Hashtable.prototype.hash         = null;
Hashtable.prototype.keys        = null;
Hashtable.prototype.location    = null;
/**
 * Hashtable - Constructor
 * Create a new Hashtable object.
 */
function Hashtable(){
    this.hash = new Array();
    this.keys = new Array();
    this.location = 0;
}
/**
 * put
 * Add new key
 * param: key - String, key name
 * param: value - Object, the object to insert
 */
Hashtable.prototype.put = function (key, value){
    if (value == null)
        return;
    if (this.hash[key] == null)
        this.keys[this.keys.length] = key;
    this.hash[key] = value;
}
/**
 * get
 * Return an element
 * param: key - String, key name
 * Return: object - The requested object
 */
Hashtable.prototype.get = function (key){
        return this.hash[key];
}
/**
 * remove
 * Remove an element
 * param: key - String, key name
 */
Hashtable.prototype.remove = function (key){
    for (var i = 0; i < this.keys.length; i++){
        //did we found our key?
        if (key == this.keys[i]){
            //remove it from the hash
            this.hash[this.keys[i]] = null;
            //and throw away the key...
            this.keys.splice(i ,1);
            return;
        }
    }
}
/**
 * size
 * Return: Number of elements in the hashtable
 */
Hashtable.prototype.size = function (){
    return this.keys.length;
}
/**
 * populateItems
 * Deprecated
 */
Hashtable.prototype.populateItems = function (){}
/**
 * next
 * Return: true if theres more items
 */
Hashtable.prototype.next = function (){
    if (++this.location < this.keys.length)
        return true;
    else
        return false;
}
/**
 * moveFirst
 * Move to the first item.
 */
Hashtable.prototype.moveFirst = function (){
    try {
        this.location = -1;
    } catch(e) {/*//do nothing here :-)*/}
}
/**
 * moveLast
 * Move to the last item.
 */
Hashtable.prototype.moveLast = function (){
    try {
        this.location = this.keys.length - 1;
    } catch(e) {/*//do nothing here :-)*/}
}
/**
 * getKey
 * Return: The value of item in the hash
 */
Hashtable.prototype.getKey = function (){
    try {
        return this.keys[this.location];
    } catch(e) {
        return null;
    }
}
/**
 * getValue
 * Return: The value of item in the hash
 */
Hashtable.prototype.getValue = function (){
    try {
        return this.hash[this.keys[this.location]];
    } catch(e) {
        return null;
    }
}
/**
 * getKey
 * Return: The first key contains the given value, or null if not found
 */
Hashtable.prototype.getKeyOfValue = function (value){
    for (var i = 0; i < this.keys.length; i++)
        if (this.hash[this.keys[i]] == value)
            return this.keys[i]
    return null;
}

/**
 * toString
 * Returns a string representation of this Hashtable object in the form of a set of entries,
 * enclosed in braces and separated by the ASCII characters ", " (comma and space).
 * Each entry is rendered as the key, an equals sign =, and the associated element,
 * where the toString method is used to convert the key and element to strings.
 * Return: a string representation of this hashtable.
 */
Hashtable.prototype.toString = function (){
    try {
        var s = new Array(this.keys.length);
        s[s.length] = "{";
        for (var i = 0; i < this.keys.length; i++){
            s[s.length] = this.keys[i];
            s[s.length] = "=";
            var v = this.hash[this.keys[i]];
            if (v)
                s[s.length] = v.toString();
            else
                s[s.length] = "null";
            if (i != this.keys.length-1)
                s[s.length] = ", ";
        }
    } catch(e) {
        //do nothing here :-)
    }finally{
        s[s.length] = "}";
    }
    return s.join("");
}
/**
 * add
 * Concatanates hashtable to another hashtable.
 */
Hashtable.prototype.add = function(ht){
    try {
        ht.moveFirst();
        while(ht.next()){
            var key = ht.getKey();
            //put the new value in both cases (exists or not).
            this.hash[key] = ht.getValue();
            //but if it is a new key also increase the key set
            if (this.get(key) != null){
                this.keys[this.keys.length] = key;
            }
        }
    } catch(e) {
        //do nothing here :-)
    } finally {
        return this;
    }
};
