/**
 * ARRAYS
 * Added are:
 *  map(func) - map a function over a the array elements
 *  ormap(func) 
 *  andmap(func)
 *  contains(value)
 *  filter(func)
 *  indexOf(value)
 *  copy() 
 */

Array.prototype.map = function(func) {
  var mapped = new Array();
  for (var x = 0; x < this.length; x++) {
    mapped.push(func(this[x]));
  }

  return mapped;
}

Array.prototype.filter = function(func) {
  var filtered = new Array();
  for (var x = 0; x < this.length; x++) {
    if (func(this[x]))
    filtered.push(this[x]);
  }
  return filtered;
}

Array.prototype.ormap = function(func) {
  for (var x = 0; x < this.length; x++) 
    if (func(this[x])) 
      return true;

  return false;
}

Array.prototype.contains = function(value) {
  return this.ormap(function(x) { return value == x; });
}

Array.prototype.andmap = function(func) {
  for (var x = 0; x < this.length; x++) 
    if (!func(this[x])) 
      return false;

  return true;
}

Array.prototype.indexOf = function(value) {
  for (var x = 0; x < this.length; x++) {
    if (this[x] == value) { return x; }
  }

  return false;
}

Array.prototype.copy = function() {
  var newarray = new Array();
  for (var x = 0; x < this.length; x++) {
    newarray[x] = this[x];
  }
  return newarray;
}

/**
 * STRINGS
 * Added are:
 *   toArray() - returns an array of characters... necessary for compatability with IE
 *   pad(length[, character[, method]]) - 
 *   + character (space " " is default)
 *   + method = {String.STR_PAD_LEFT | String.STR_PAD_RIGHT} (left is default)
 */

String.prototype.toArray = function() {
  var chars = new Array();
  for (var x = 0; x < this.length; x++) 
    chars.push(this.charAt(x));

  return chars;
}

String.STR_PAD_LEFT = 1;
String.STR_PAD_RIGHT = 2;
String.prototype.pad = function(length, character, method) {
  if (!character) { character = " "; }
  if (!method) { method = String.STR_PAD_LEFT; }

  var chars = this.toArray();
  while (chars.length < length) {
    if (method == String.STR_PAD_LEFT) {
      chars.unshift(character);
    } else {
      chars.push(character);
    }
  }

  return chars.join("");
}

/**
 * Math
 * Added:
 *  toBase - takes a positive base 10 integer and converts it to the target base
 */
Math.toBase = function(x, base) {
  var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];
  var chars = new Array();
  var q, r;

  while (x > 0) {
    r = x % base;
    q = Math.floor(x / base);
    x = q;
    chars.unshift(numbers[r]);
  }

  return chars.join("");
}

Math.numberFormat = function(num, dec) {
  var mult = Math.pow(10, dec);
  num = Math.round(num * mult) / mult;
  return num;
}
