function FolderManager() {
  this.IsOneToOne = false;
  this.FIndexToTPImageId = [];
  this.TPImageIdToFIndex = [];
  this.FIndexToIvid = [];
  this.Tag = null;
  this.NumMembers = 0;

  this.Init = FolderManagerInit;
  this.ToggleMembership = FolderManagerToggleMembership;
  this.GetNumMembers = function() { return this.NumMembers; };
  this.IsMember = FolderManagerIsMember;
  this.GetFIndexIvid = FolderManagerGetFIndexIvid;
  this.GetFIndexTPImageId = FolderManagerGetFIndexTPImageId;
  this.GetTPImageIDFIndex = FolderManagerGetTPImageIDFIndex;
}

function FolderManagerInit(one_to_one_count) {
  if (one_to_one_count != null) {
    this.IsOneToOne = true;
    this.NumMembers = one_to_one_count;
  }
  else {
    this.NumMembers = this.FIndexToTPImageId.length;
  }
}

function FolderManagerToggleMembership(image_desc) {
  if (this.IsOneToOne) return;
  var id = image_desc.Index;

  var tFIndexToTPImageId = this.FIndexToTPImageId;
  var tFIndexToIvid = this.FIndexToIvid;
  if (this.TPImageIdToFIndex[id] == null) {
    tFIndexToTPImageId.push(id);
    tFIndexToIvid.push(image_desc.FavoriteId);
  }
  else {
    tFIndexToTPImageId.splice(this.TPImageIdToFIndex[id], 1);
    tFIndexToIvid.splice(this.TPImageIdToFIndex[id], 1);
  }

  tFIndexToTPImageId = tFIndexToTPImageId.sort(function(a, b) { return a - b; });
  var tTPImageIdToFIndex = [];
  for (var i = 0; i < tFIndexToTPImageId.length; i++) {
    if (tFIndexToTPImageId[i] != undefined) {
      tTPImageIdToFIndex[tFIndexToTPImageId[i]] = i;
    }
  }
  this.FIndexToTPImageId = tFIndexToTPImageId;
  this.FIndexToIvid = tFIndexToIvid;
  this.TPImageIdToFIndex = tTPImageIdToFIndex;

  this.NumMembers = this.FIndexToTPImageId.length;
}

function FolderManagerIsMember(id) {
  if (this.IsOneToOne) return true;
  return this.TPImageIdToFIndex[id] != null;
}

function FolderManagerGetFIndexTPImageId(index) {
  if (this.IsOneToOne) return index;
  return this.FIndexToTPImageId[index];
}

function FolderManagerGetTPImageIDFIndex(tp_image_id) {
  if (this.IsOneToOne) return tp_image_id;
  return this.TPImageIdToFIndex[tp_image_id];
}

function FolderManagerGetFIndexIvid(f_index) {
  return this.FIndexToIvid[f_index];
}

