/**
 *
 * get (key, [default])
 *
 * get erwartet den key, sollte dieser Schlüssel nicht vorhanden sein,
 * so wird im Falle, das default übergeben wurde, default zurückgegeben.
 * Ansonsten wird der Wert für key zurückgegeben.
 *
 */
function propertiesGet (key) {

  if (arguments.length == 2) {
    // Default Wert wurde mit übergeben

    return this.has (key, arguments[1]);

  }

  return this.has (key);
}

/**
 *
 * has (key, [default])
 *
 * has erwartet den key, sollte dieser Schlüssel nicht vorhanden sein,
 * so wird im Falle, das default übergeben wurde, default zurückgegeben.
 * Ansonsten wird der Wert für key zurückgegeben.
 *
 */
function propertiesHas (key) {
  
  if (this.props != null) {
    //if (this.props[key] || this.props[key] != undefined || this.props[key] != null) {
      return this.props[key];
      //} 
  }

  if (arguments.length == 2) {
    return arguments[1];
  }

  return null;
}

/**
 *
 * set (key, value)
 *
 * set setzt den
 */
function propertiesSet (key, value) {
  
  this.props[key] = value;
}

function propertiesToString () {

  var key;
  var out = "[Properties]";

  for (key in this.props) {
    out += "\n" + key + " = " + this.props[key];
  }

  return out;
}

function propertiesEval (evalstr) {

  var rg = /%([A-Za-z])*/g;
  var rrg;
  var out;
  var keys, pos, i;
  var key;
  var obj;

  keys = evalstr.match (rg);
  pos = evalstr.search (rg);
  out = evalstr;
  
  for (i = 0; i < keys.length; i++) {
    key = keys[i].substr (1, keys[i].length - 1);
    rrg = new RegExp (keys[i]);
    //evalstr.replace (keys[i], this.get(keys[i].substr (1, keys[i].length - 1)), "error");
    obj = this.get(key, "[! properties-error !]");

    if (obj != "[! properties-error !]" && obj.src && obj.width && obj.height) {
      obj = "<img src=\"" + obj.src + "\" width=\"" + obj.width + "\" height=\"" + obj.height + "\" border=\"0\">";
    }

    out = out.replace (rrg, obj);
  }
    
  return out;
}

function properties () {
  this.props = new Array();
  this.set = propertiesSet;
  this.get = propertiesGet;
  this.has = propertiesHas;
  this.eval = propertiesEval;
  this.toString = propertiesToString;
}
