/* ----------------------------------------------------------------------------
 * Name: mapObject
 * Creates an object for a map.
 * Parameters:
 *   k: Map key.
 *   v: Map value.
 * Returns: Pointer to object
 */
function mapObject(k, v) {
  this.key = k;
  this.value = v;

  return this;
}

/* ----------------------------------------------------------------------------
 * Name: Map (obect)
 * Creates a Vars object.
 * Parameters: none
 * Returns: Pointer to itself
 */
function Map() {
  this.objectMap = [];

  return this;
} // Map

/* ----------------------------------------------------------------------------
 * Name: Map::listKeys
 * Lists the variables currently stored in Vars object.
 * Parameters: none
 * Returns: n/a
 */
Map.prototype.listKeys = function() {
  var ret = "List: ";
  var i = "";

  for(i=0; i < this.objectMap.length; i++) {
    if (i > 0)
      ret += ", ";

    ret += this.objectMap[i]["key"];
  } // for

  return ret;
} // Map::listKeys

/* ----------------------------------------------------------------------------
 * Name: isKey
 * Looks up the validity of a key.
 * Parameters:
 *   k: Map key
 * Returns: True if key name exists.
 */
Map.prototype.isKey = function(k) {
  var i;

  for(i=0; i < this.objectMap.length; i++) {
    if (this.objectMap[i]["key"] == k)
      return true;
  } // for

  return false;
} // Map::isKey

/* ----------------------------------------------------------------------------
 * Name: add
 * Adds a key and value to the varMap.
 * Parameters:
 *   k: Map key.
 *   v: Map value.
 * Returns: True if add was succesful, false if key already existed.
 */
Map.prototype.add = function(k, v) {

  if (this.isKey(k))
    return false;

  this.objectMap.push(new mapObject(k, v));

  return true;
} // Map::add

/* ----------------------------------------------------------------------------
 * Name: remove
 * Removes a key and value from the varMap.
 * Parameters:
 *   k: Map key.
 * Returns: True if remove was succesful, false if key didn't exist.
 */
Map.prototype.remove = function(k) {
  var i;
  var tmp = [];

  if (!this.isKey(k))
    return false;

  for(i=0; i < this.objectMap.length; i++) {
    if (this.objectMap[i]["key"] == k)
      continue;

    tmp.push(this.objectMap[i]);
  } // for

  this.objectMap = tmp;

  return true;
} // Map::remove

/* ----------------------------------------------------------------------------
 * Name: length
 * Get the size of the Vars map.
 * Parameters: none
 * Returns: Size of varMap.
 */
Map.prototype.length = function() {
  return this.objectMap.length;
} // Map::length

/* ----------------------------------------------------------------------------
 * Name: clear
 * Clears objectMap.
 * Parameters: none
 * Returns: Previous size of varMap.
 */
Map.prototype.clear = function() {
  var ret = this.objectMap.length;

  this.objectMap = [];

  return ret;
} // Map::clear

/* ----------------------------------------------------------------------------
 * Name: get
 * Gets the field for a given key.
 * Parameters:
 *   k: Map key
 * Returns: Value of key or empty string on error.
 */
Map.prototype.get = function(k) {
  var i;

  for(i=0; i < this.objectMap.length; i++) {
    if (this.objectMap[i]["key"] == k)
      return this.objectMap[i]["value"];
  } // for

  return undefined;
} // Map::get

/* ----------------------------------------------------------------------------
 * Name: getKeys
 * Gets the field for a given key.
 * Parameters:
 *   none
 * Returns: Array of keys.
 */
Map.prototype.getKeys = function() {
  var keys = [];

  for(i=0; i < this.objectMap.length; i++) {
    keys.push(this.objectMap[i]["key"]);
  } // for

  return keys;
} // Map::getKeys
