/*
 * The contents of this file are subject to the Netscape 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/NPL/
 *
 * 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 Communicator client code, released
 * March 31, 1998.
 *
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation. Portions created by Netscape are
 * Copyright (C) 1998-1999 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s):
 *   Pete Collins
 *   Brian King
 *   Ben Goodger
 */

var gAnchorElement = null;
var gOriginalHref = "";
var gHNodeArray = [];

// dialog initialization code

function Startup()
{
  if (!InitEditorShell())
    return;

  ImageStartup();
  gDialog.hrefInput        = document.getElementById("hrefInput");
  gDialog.makeRelativeLink = document.getElementById("MakeRelativeLink");
  gDialog.showLinkBorder   = document.getElementById("showLinkBorder");
  gDialog.linkTab          = document.getElementById("imageLinkTab");

  // Get a single selected image element
  var tagName = "img";
  if ("arguments" in window && window.arguments[0])
  {
    imageElement = window.arguments[0];
    // We've been called from form field propertes, so we can't insert a link
    gDialog.linkTab.parentNode.removeChild(gDialog.linkTab);
    gDialog.linkTab = null;
  }
  else
  {
    // First check for <input type="image">
    imageElement = editorShell.GetSelectedElement("input");
    if (!imageElement || imageElement.getAttribute("type") != "image") {
      // Get a single selected image element
      imageElement = editorShell.GetSelectedElement(tagName);
      if (imageElement)
        gAnchorElement = editorShell.GetElementOrParentByTagName("href", imageElement);
    }
  }

  if (imageElement)
  {
    // We found an element and don't need to insert one
    if (imageElement.hasAttribute("src"))
    {
      gInsertNewImage = false;
      gActualWidth  = imageElement.naturalWidth;
      gActualHeight = imageElement.naturalHeight;
    }
  }
  else
  {
    gInsertNewImage = true;

    // We don't have an element selected,
    //  so create one with default attributes

    imageElement = editorShell.CreateElementWithDefaults(tagName);
    if (!imageElement)
    {
      dump("Failed to get selected element or create a new one!\n");
      window.close();
      return;
    }
    gAnchorElement = editorShell.GetSelectedElement(tagName);
  }

  // Make a copy to use for AdvancedEdit
  globalElement = imageElement.cloneNode(false);

  // We only need to test for this once per dialog load
  gHaveDocumentUrl = GetDocumentBaseUrl();

  InitDialog();
  if (gAnchorElement)
    gOriginalHref = gAnchorElement.getAttribute("href");
  gDialog.hrefInput.value = gOriginalHref;

  FillLinkMenulist(gDialog.hrefInput, gHNodeArray);
  ChangeLinkLocation();

  // Save initial source URL
  gOriginalSrc = gDialog.srcInput.value;

  // By default turn constrain on, but both width and height must be in pixels
  gDialog.constrainCheckbox.checked =
    gDialog.widthUnitsMenulist.selectedIndex == 0 &&
    gDialog.heightUnitsMenulist.selectedIndex == 0;

  // Start in "Link" tab if 2nd arguement is true
  if (gDialog.linkTab && "arguments" in window && window.arguments[1])
  {
    document.getElementById("TabBox").selectedTab = gDialog.linkTab;
    SetTextboxFocus(gDialog.hrefInput);
  }
  else
    SetTextboxFocus(gDialog.srcInput);

  SetWindowLocation();
}

// Set dialog widgets with attribute data
// We get them from globalElement copy so this can be used
//   by AdvancedEdit(), which is shared by all property dialogs
function InitDialog()
{
  InitImage();
  var border = TrimString(gDialog.border.value);
  gDialog.showLinkBorder.checked = border != "" && border > 0;
}

function ChangeLinkLocation()
{
  SetRelativeCheckbox(gDialog.makeRelativeLink);
  gDialog.showLinkBorder.disabled = !TrimString(gDialog.hrefInput.value);
}

function ToggleShowLinkBorder()
{
  if (gDialog.showLinkBorder.checked)
  {
    var border = TrimString(gDialog.border.value);
    if (!border || border == "0")
      gDialog.border.value = "2";
  }
  else
  {
    gDialog.border.value = "0";
  }
}

// Get data from widgets, validate, and set for the global element
//   accessible to AdvancedEdit() [in EdDialogCommon.js]
function ValidateData()
{
  return ValidateImage();
}

function doHelpButton()
{
  openHelp("image_properties");
  return true;
}

function onAccept()
{
  // Use this now (default = false) so Advanced Edit button dialog doesn't trigger error message
  gDoAltTextError = true;

  if (ValidateData())
  {
    if ("arguments" in window && window.arguments[0])
    {
      SaveWindowLocation();
      return true;
    }

    editorShell.BeginBatchChanges();

    try
    {
      if (gRemoveImageMap)
      {
        globalElement.removeAttribute("usemap");
        if (gImageMap)
        {
          editorShell.DeleteElement(gImageMap);
          gInsertNewIMap = true;
          gImageMap = null;
        }
      }
      else if (gImageMap)
      {
        // Assign to map if there is one
        var mapName = gImageMap.getAttribute("name");
        if (mapName != "")
        {
          globalElement.setAttribute("usemap", ("#"+mapName));
          if (globalElement.getAttribute("border") == "")
            globalElement.setAttribute("border", 0);
        }

        if (gInsertNewIMap)
        {
          editorShell.editorDocument.body.appendChild(gImageMap);
        //editorShell.InsertElementAtSelection(gImageMap, false);
        }
      }

      // Create or remove the link as appropriate
      var href = gDialog.hrefInput.value;
      if (href != gOriginalHref)
      {
        if (href)
          EditorSetTextProperty("a", "href", href);
        else
          EditorRemoveTextProperty("href", "");
      }

      // If inside a link, always write the 'border' attribute
      if (href)
      {
        if (gDialog.showLinkBorder.checked)
        {
          // Use default = 2 if border attribute is empty
          if (!globalElement.hasAttribute("border"))
            globalElement.setAttribute("border", "2");
        }
        else
          globalElement.setAttribute("border", "0");
      }

      // All values are valid - copy to actual element in doc or
      //   element created to insert
      editorShell.CloneAttributes(imageElement, globalElement);
      if (gInsertNewImage)
      {
        // 'true' means delete the selection before inserting
        editorShell.InsertElementAtSelection(imageElement, true);
        // Also move the insertion point out of the link
        if (href)
          setTimeout(editorShell.RemoveTextProperty, 0, "href", "");
      }

      // Check to see if the link was to a heading
      // Do this last because it moves the caret (BAD!)
      var index = gDialog.hrefInput.selectedIndex;
      if (index in gHNodeArray && gHNodeArray[index])
      {
        var anchorNode = editorShell.editorDocument.createElement("a");
        if (anchorNode)
        {
          anchorNode.name = href.substr(1);
          // Remember to use editorShell method so it is undoable!
          editorShell.InsertElement(anchorNode, gHNodeArray[index], 0, false);
        }
      }

      // un-comment to see that inserting image maps does not work!
      /*test = editorShell.CreateElementWithDefaults("map");
      test.setAttribute("name", "testing");
      testArea = editorShell.CreateElementWithDefaults("area");
      testArea.setAttribute("shape", "circle");
      testArea.setAttribute("coords", "86,102,52");
      testArea.setAttribute("href", "test");
      test.appendChild(testArea);
      editorShell.InsertElementAtSelection(test, false);*/
    }
    catch (e)
    {
      dump(e);
    }

    editorShell.EndBatchChanges();

    SaveWindowLocation();
    return true;
  }

  gDoAltTextError = false;

  return false;
}
