/*
	The below work is licensed under Creative Commons GNU LGPL License.

	License:     http://creativecommons.org/licenses/LGPL/2.1/
	Author:      Michael Schøler/2008-01-29
	Version:     0.1, JSLint verified (no strict whitespace)
	Web:         http://michael.hinnerup.net/blog/2008/01/29/trimming_values_from_json_objects/
*/

// Param "json": Json object to trim (changes will be made in this object!)
// Param "trimValuesAry": Array of values to trim out from the json object
// Param "bDeleteEmptyObjects": Omit, true or false. If set to true, trimJson will deep-delete all empty objects.
function trimJson(json, trimValuesAry, bDeleteEmptyObjects) {
  if (typeof bDeleteEmptyObjects === "undefined" || ((bDeleteEmptyObjects !== false) && (bDeleteEmptyObjects !== true))) {
    // Param omitted or wrong, default to false
    bDeleteEmptyObjects = false;
  }
  if (typeof trimValuesAry === "undefined" || (!(trimValuesAry instanceof Array))) {
    // Param omitted or wrong, default to [null]
    trimValuesAry = [null];
  }
  var res = true;
  for (var key in json) if (json.hasOwnProperty(key)) {
    var deleteValue = false;
    for (var i = 0; i < trimValuesAry.length; i += 1) {
      if (trimValuesAry[i] instanceof Array && json[key] instanceof Array) {
        var array1 = json[key], array2 = trimValuesAry[i];
        if (array1.length !== array2.length) {
          deleteValue = false;
        }
        else if (array1.length === 0) {
          deleteValue = true;
        }
        else {
          for (var j = 0; j < array1.length; j += 1) {
            deleteValue = true;
            if (array1[j] !== array2[j]) {
              deleteValue = false;
              break;
            }
          }
        }
      }
      else {
        deleteValue = (json[key] === trimValuesAry[i]);
      }
      if (deleteValue === true) {
        break;
      }
    }
    if (deleteValue) {
      delete json[key];
      res = false;
    } else if (typeof json[key] === "object") {
      res = true;
      var recursionContent = trimJson(json[key], trimValuesAry, bDeleteEmptyObjects);
      if ((bDeleteEmptyObjects === true) && (recursionContent === false)) {
        delete json[key];
      }
    }
  }
  return res;
}