/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

Components.utils.import("resource://gre/modules/Services.jsm");

var gAddButton;
var gRemoveButton;
var gHeaderInputElement;
var gArrayHdrs;
var gHdrsList;
var gContainer;
var gFilterBundle=null;
var gCustomBundle=null;

function onLoad()
{
    let hdrs = Services.prefs.getCharPref("mailnews.customHeaders");
    gHeaderInputElement = document.getElementById("headerInput");
    gHeaderInputElement.focus();

    gHdrsList = document.getElementById("headerList");
    gArrayHdrs = new Array();
    gAddButton = document.getElementById("addButton");
    gRemoveButton = document.getElementById("removeButton");

    initializeDialog(hdrs);
    updateAddButton(true);
    updateRemoveButton();
}

function initializeDialog(hdrs)
{
  if (hdrs)
  {
    hdrs = hdrs.replace(/\s+/g,'');  //remove white spaces before splitting
    gArrayHdrs = hdrs.split(":");
    for (var i = 0; i < gArrayHdrs.length; i++)
      if (!gArrayHdrs[i])
        gArrayHdrs.splice(i,1);  //remove any null elements
    initializeRows();
  }
}

function initializeRows()
{
  for (var i = 0; i < gArrayHdrs.length; i++)
    addRow(TrimString(gArrayHdrs[i]));
}

function onTextInput()
{
  // enable the add button if the user has started to type text
  updateAddButton( (gHeaderInputElement.value == "") );
}

function onOk()
{
  if (gArrayHdrs.length)
  {
    var hdrs;
    if (gArrayHdrs.length == 1)
      hdrs = gArrayHdrs;
    else
      hdrs = gArrayHdrs.join(": ");
    Services.prefs.setCharPref("mailnews.customHeaders", hdrs);
    // flush prefs to disk, in case we crash, to avoid dataloss and problems with filters that use the custom headers
    Services.prefs.savePrefFile(null);
  }
  else
  {
    Services.prefs.clearUserPref("mailnews.customHeaders"); //clear the pref, no custom headers
  }

  window.arguments[0].selectedVal = gHdrsList.selectedItem ? gHdrsList.selectedItem.label : null;
  return true;
}

function customHeaderOverflow()
{
  var nsMsgSearchAttrib = Components.interfaces.nsMsgSearchAttrib;
  if (gArrayHdrs.length >= (nsMsgSearchAttrib.kNumMsgSearchAttributes - nsMsgSearchAttrib.OtherHeader - 1))
  {
    if (!gFilterBundle)
      gFilterBundle = document.getElementById("bundle_filter");

    var alertText = gFilterBundle.getString("customHeaderOverflow");
    Services.prompt.alert(window, null, alertText);
    return true;
  }
  return false;
}

function onAddHeader()
{
  var newHdr = TrimString(gHeaderInputElement.value);

  if (!isRFC2822Header(newHdr))  // if user entered an invalid rfc822 header field name, bail out.
  {
    if (!gCustomBundle)
      gCustomBundle = document.getElementById("bundle_custom");

    var alertText = gCustomBundle.getString("colonInHeaderName");
    Services.prompt.alert(window, null, alertText);
    return;
  }

  gHeaderInputElement.value = "";
  if (!newHdr || customHeaderOverflow())
    return;
  if (!duplicateHdrExists(newHdr))
  {
    gArrayHdrs[gArrayHdrs.length] = newHdr;
    var newItem = addRow(newHdr);
    gHdrsList.selectItem (newItem); // make sure the new entry is selected in the tree
    // now disable the add button
    updateAddButton(true);
    gHeaderInputElement.focus(); // refocus the input field for the next custom header
  }
}

function isRFC2822Header(hdr)
{
  var charCode;
  for (var i = 0; i < hdr.length; i++)
  {
    charCode = hdr.charCodeAt(i);
    //58 is for colon and 33 and 126 are us-ascii bounds that should be used for header field name, as per rfc2822

    if (charCode < 33 || charCode == 58 || charCode > 126)
      return false;
  }
  return true;
}

function duplicateHdrExists(hdr)
{
  for (var i = 0;i < gArrayHdrs.length; i++)
  {
    if (gArrayHdrs[i] == hdr)
      return true;
  }
  return false;
}
 
function onRemoveHeader()
{
  var listitem = gHdrsList.selectedItems[0]
  if (!listitem) return;
  listitem.remove();
  var selectedHdr = GetListItemAttributeStr(listitem);
  var j=0;
  for (var i = 0; i < gArrayHdrs.length; i++)
  {
    if (gArrayHdrs[i] == selectedHdr)
    {
      gArrayHdrs.splice(i,1);
      break;
    }
  }
}

function GetListItemAttributeStr(listitem)
{
   if (listitem)
     return TrimString(listitem.getAttribute("label"));

   return "";
}

function addRow(newHdr)
{
  var listitem = document.createElement("listitem");
  listitem.setAttribute("label", newHdr);
  gHdrsList.appendChild(listitem);
  return listitem;
}

function updateAddButton(aDisable)
{
  // only update the button if the disabled state changed
  if (aDisable == gAddButton.disabled)
    return;

  gAddButton.disabled = aDisable;
  document.documentElement.defaultButton = aDisable ? "accept" : "extra1";
}

function updateRemoveButton()
{
  var headerSelected = (gHdrsList.selectedItems.length > 0);
  gRemoveButton.disabled = !headerSelected;
  if (gRemoveButton.disabled)
    gHeaderInputElement.focus();
}

//Remove whitespace from both ends of a string
function TrimString(string)
{
  if (!string) return "";
  return string.trim();
}
