function itemCodeGen(obj) {
  if (obj instanceof Item) {
    return obj.codeGen();
  }
  else {
    return codeGen(obj,itemCodeGen);
  }
}

function crippledCodeGen(obj) {
  if (obj instanceof Item) {
    return codeGen(obj.properties,crippledCodeGen);
  }
  else {
    return codeGen(obj,crippledCodeGen);
  }
}

function codeGen(obj,recurseGen) {
  if (!recurseGen) {
    recurseGen = codeGen;
  }
  switch (typeof obj) {
    case "object":
      if (!(obj instanceof Array)) {
        if (obj === null) {
          return "null";
        }
        else {
          var retVal = '{';
          for(var prop in obj) {
            if (retVal.length > 1) {
              retVal += ',';
            }
            retVal += quote(prop) + ':' + recurseGen(obj[prop]);
          }
          retVal += '}';
          return retVal;
        }
      }
      else {
        var retVal = '[';
        for(var i = 0 ; i < obj.length ; i++) {
          if (retVal.length > 1) {
            retVal += ',';
          }
          retVal += recurseGen(obj[i]);
        }
        retVal += ']';
        return retVal;
      }
    case "number":
      return obj.toString();
    case "string":
      return quote(obj);
      break;
    case "boolean":
      if (obj) {
        return "true";
      }
      else {
        return "false";
      }
    case "undefined":
      return "undefined";
    case "function":
      return obj.toString();
    default:
      return '';
  }
  return '';
}

function quote(str,quoteChar) {
  var retVal = '';
  if (!quoteChar || quoteChar.length == 0) {
    quoteChar = "'";
  }
  var c;  
  for(var i = 0 ; i < str.length ; i++) {
    c = str.charAt(i);
    if (c == "\\") {
      retVal += "\\"+c
    }
    else if (c == quoteChar) {
      retVal += "\\"+c;
    }
    else {
      retVal += c;
    }
  }
  return quoteChar + retVal + quoteChar;
}