export function safeJSONStringify (input, maxDepth)
{

  var output,
  refs = [],
  refsPaths = [];

  maxDepth = maxDepth || 5;

  function recursion (input, path, depth)
  {
    var output = {},
    pPath,
    refIdx;

    path  = path  || "";
    depth = depth || 0;
    depth++;

    if (maxDepth && depth > maxDepth)
    {
      return "{depth over " + maxDepth + "}";
    }

    for (var p in input)
    {
      pPath = (path ? (path+".") : "") + p;
      if (typeof input[p] === "function")
      {
        //output[p] = "{function}";
      }
      else if (typeof input[p] === "object")
      {
        /*
        refIdx = refs.indexOf(input[p]);

        if (-1 !== refIdx)
        {
          output[p] = recursion(input[p])"{reference to " + refsPaths[refIdx]  + "}";
        }
        else
        {
        */
          refs.push(input[p]);
          refsPaths.push(pPath);
          output[p] = recursion(input[p], pPath, depth);
        //}
      }
      else
      {
        output[p] = input[p];
      }
    }

    return output;
  }

  if (typeof input === "object")
  {
    output = recursion(input);
  }
  else
  {
    output = input;
  }

  return JSON.stringify(output);
}