/*-*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Mozilla Roaming code.
 *
 * The Initial Developer of the Original Code is 
 *   Ben Bucksch <http://www.bucksch.org> of
 *   Beonex <http://www.beonex.com>
 * Portions created by the Initial Developer are Copyright (C) 2002-2004
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

/* See all.js */

var _elementIDs = []; // no prefs (nsIPrefBranch) needed, see above
var addedHandler = false; // see top.js

function Load()
{
  parent.initPanel('chrome://sroaming/content/prefs/files.xul');

  FileLabels();
  SetFiles();
  // dataManager.pageData doesn't work, because it needs to work on both panes
  if (!parent.roaming)
    parent.roaming = new RoamingPrefs();
  DataToUI();

  if (parent != null && "firefox" in parent)
  {
    if (!parent.firefox.filesLoad)
      parent.firefox.filesLoad = Load;
    if (!parent.firefox.filesUnload)
      parent.firefox.filesUnload = Unload;
  }

  if (!addedHandler)
  {
    addedHandler = true;
    parent.hPrefWindow.registerOKCallbackFunc(function()
    {
      UIToData();
      parent.roaming.okClicked();
    });
  }
}


// Logic

// some files have a non-static name. set these filenames here.
function SetFiles()
{
  var prefs = Components.classes["@mozilla.org/preferences-service;1"]
                .getService(Components.interfaces.nsIPrefBranch);
  try
  {
    SetFile("filePassword", prefs.getCharPref("signon.SignonFileName"));
    SetFile("fileWallet", prefs.getCharPref("wallet.SchemaValueFileName"));
  } catch (e) {}

  // disable the nodes which are still invalid
  var children = E("filesList").childNodes;
  for (var i = 0; i < children.length; i++)
  {
    var checkbox = children[i];
    if (!("getAttribute" in checkbox) ||
        checkbox.getAttribute("type") != "checkbox")
      continue;
    if (checkbox.getAttribute("filename") == "")
      checkbox.disabled = true;
  }
}

function SetFile(elementID, filename)
{
  var listitem = document.getElementById(elementID);
  listitem.setAttribute("filename", filename);
}


// UI

// write data to widgets
function DataToUI()
{
  var data = parent.roaming;
  var filesList = E("filesList");

  EnableTree(data.Enabled, filesList);

  // first, disable all by default
  var children = filesList.childNodes;
  for (var i = 0, l = children.length; i < l; i++)
  {
    var checkbox = children[i];
    if (!("getAttribute" in checkbox) ||
        checkbox.getAttribute("type") != "checkbox")
      // Somebody adds unwanted nodes as children to listbox :-(
      continue;
    checkbox.checked = false;
  }
  // then check for each file in the list, if it's in the checkboxes.
  // enabled it, if so, otherwise create and enable it (for files added by
  // the user).
  for (i = 0, l = data.Files.length; i < l; i++)
  {
    var file = data.Files[i];
    var found = false;
    for (var i2 = 0, l2 = children.length; i2 < l2; i2++)
    {
      checkbox = children[i2];
      if ("getAttribute" in checkbox
          && checkbox.getAttribute("type") == "checkbox"
          // Somebody adds unwanted nodes as children to listbox :-(
          && checkbox.getAttribute("filename") == file)
      {
        checkbox.checked = true;
        found = true;
      }
    }
    if (!found)
    {
      var li = document.createElement("listitem");
      if (li)
      {
        li.setAttribute("type", "checkbox");
        li.setAttribute("id", file);
        li.setAttribute("filename", file);
        li.setAttribute("label", file);
        li.setAttribute("checked", "true");
        filesList.appendChild(li);
      }
    }
  }
}

// write widget content to data
function UIToData()
{
  var data = parent.roaming;
  data.Files = new Array(); // clear list
  var children = E("filesList").childNodes;
  for (var i = 0; i < children.length; i++)
  {
    var checkbox = children.item(i);
    if (checkbox.checked)
      data.Files.push(checkbox.getAttribute("filename"));
  }
  data.changed = true; // excessive
}

/* read human-readable names for profile files from filedescr.properties
   and use them as labels */
function FileLabels()
{
  var children = E("filesList").childNodes;
  for (var i = 0; i < children.length; i++)
  {
    var checkbox = children[i];
    if (!("getAttribute" in checkbox) ||
        checkbox.getAttribute("type") != "checkbox")
      continue;

    checkbox.setAttribute("label",
                          GetFileDescription(checkbox.getAttribute("filename"),
                                             checkbox.getAttribute("id")));
  }
}
