<?xml version="1.0"?>
<!DOCTYPE window>
<!-- DO NOT LOCALIZE: this file is source documentation; not part of the build -->
<!-- dialog containing a control requiring initial setup, expecting
     initial settings to be passed in as parameters -->
<xul:window
    xmlns:html="http://www.w3.org/1999/xhtml"
    xmlns:xul ="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    onload = "SetFromParams()"
    title = "Things to do"
    height = "200" width = "300">

  <script>
    <![CDATA[
    var debug = true;
    // Initialize controls from parameters sent through the URL
    function SetFromURL() {
      // dump a bunch of diagnostics
      if (debug) {
        dump("In SetFromURL...\n");
        dump("param string is '" + location.search + "', length " +
            location.search.length + "\n");
        var debugSetting = GetNamedParam(location.search.substring(1,location.search.length), "remind");
        if (debugSetting) {
          dump("'remind' parameter = '" + debugSetting + "'\n");
        } else
          dump("'remind' setting not found\n");
        if (document.getElementById("remind"))
          dump("found 'remind' element in document\n");
        else
          dump("'remind' element missing from document\n");
        dump("Finishing SetFromURL...\n");
      }

      // set checkbox from "remind=xxx" name=value pair
      var params = location.search.substring(1, location.search.length);
      var setting = GetNamedParam(params, "remind");
      if (setting)
        setting = setting.toLowerCase() == "true";
      else
        setting = false;
      var checkbox = document.getElementById("remind");
      if (checkbox)
        checkbox.checked = setting;

      // set prompt text from "prompt=xxx" name=value pair
      var setting = GetNamedParam(params, "prompt");
      control = document.getElementById("prompt");
      if (control && setting) {
        control = control.firstChild;
        if (control && control.nodeType == 3) // TEXT_NODE
          control.data = setting;
      }
    }

    // Initialize controls from parameters sent through openDialog
    function SetFromParams() {
      // dump a bunch of diagnostics
      if (debug) {
        var debugSetting;
        var debugControl;
        dump("In SetFromParams...\n");
        if (window.arguments) {
          dump("arguments exist\n");
          if (window.arguments[0]) {
            dump("  arguments[0] exists\n");
            if (window.arguments[0].remind) {
              dump("  arguments[0].remind exists\n");
              debugSetting = window.arguments[0].remind;
              dump("  it's " + debugSetting +
                ", type " + typeof debugSetting + "\n");
            } else
              dump("arguments[0].remind does not exist\n");
            if (window.arguments[0].prompt) {
              dump("  arguments[0].prompt exists\n");
              debugSetting = window.arguments[0].prompt;
              dump("  it's " + debugSetting +
                ", type " + typeof debugSetting + "\n");
            } else
              dump("arguments[0].prompt does not exist (or it's just false)\n");
          } else
            dump("arguments[0] does not exist\n");
        } else
          dump("no arguments\n");
        debugControl = document.getElementById("remind");
        if (debugControl)
          dump("found 'remind' element in document "+
            typeof debugControl+"\n");
        else
          dump("'remind' element missing from document\n");
        debugControl = document.getElementById("prompt");
        if (debugControl) {
          dump("found 'prompt' element in document "+
            typeof debugControl+"\n");
          debugControl = debugControl.firstChild;
          if (debugControl) {
            dump("found prompt's first child. type " + debugControl.nodeName + "\n");
          } else
            dump("couldn't find prompt's first child\n");
        } else
          dump("'prompt' element missing from document\n");
        dump("Finishing SetFromParams...\n");
      }

      // look in arguments[0] for an object with interesting properties and values
      // set checkbox from its value, if present
      if (window.arguments && window.arguments[0]) {
        var setting;
        var control;
        // set checkbox from the value of argment[0]'s "value" property
        setting = window.arguments[0].remind;
        if (setting) { // (exists and true)
          control = document.getElementById("remind");
          if (control)
            control.checked = setting;
        }
        // set prompt from the value of argment[0]'s "prompt" property
        setting = window.arguments[0].prompt;
        if (setting) {
          if (typeof setting == "string") {
            control = document.getElementById("prompt");
            if (control) {
              control = control.firstChild;
              if (control && control.nodeType == 3) // TEXT_NODE
                control.data = setting;
            }
          }
        }
      }
    }

    // OK button handler
    // return the setting of the "remind" checkbox in two equivalent ways
    // and then close the window (disabled for now, since that crashes)
    function DoOK() {
      var checkbox = document.getElementById("remind");
      if (checkbox) {

        // attach a property to ourselves, which can be queried from outside
        window.returnArguments = checkbox.checked;

        // additionally, if we were given an openDialog parameter, set its value
        if (window.arguments && window.arguments[0])
          window.arguments[0].remind = checkbox.checked;
      }
//    var toolkitCore = GetToolkitCore();
//    if (toolkitCore)
//      toolkitCore.CloseWindow(window);
      window.close();
    }

    function GetToolkitCore() {
      var toolkitCore = XPAppCoresManager.Find("ToolkitCore");
      if (!toolkitCore) {
        toolkitCore = new ToolkitCore();
        if (toolkitCore)
          toolkitCore.Init("ToolkitCore");
      }
      return toolkitCore;
    }

    // params is a list of name=value parameters separated by semicolons
    // or ampersands. To pass parameters containing either character,
    // string together parameters escape()d separately, separated by ;.
    // this function returns the value of the named pair, or null
    // if it found nothing.
    function GetNamedParam(params, name) {
      if (debug)
        dump("GetNamedParam looking for '" + name + "' in '" + params + "'\n");
      var re = new RegExp(name+" *=([^&;]+)");
      var match = re(params);
      if (match) {
        if (debug)
          dump("  matched regexp. found '" + match[1] + "'\n");
        return unescape(match[1]);
      }
      return null;
    }

    function DumpWindow() {
      dump("**********************************************\n");
      for (prop in window)
        dump(prop + "\n");
      dump("----------------------------------------------\n");
    }
    ]]>
  </script>

  <html:table>
    <html:tr>
      <html:td html:id="prompt">Give me your money</html:td>
    </html:tr>
    <html:tr>
      <html:td>
        <!-- note the html namespace on the id attribute, which
             seems at this time to be required by getAttribute() -->
        <html:input type="checkbox" html:id="remind"/>Remind me
      </html:td>
    </html:tr>
    <html:tr>
      <html:td>
        <html:button onclick="DoOK()">OK</html:button>
      </html:td>
    </html:tr>
    <html:tr>
      <html:td>
        <html:button onclick="SetFromURL()">Startup from URL</html:button>
      </html:td>
    </html:tr>
    <html:tr>
      <html:td>
        <html:button onclick="SetFromParams()">Startup from Params</html:button>
      </html:td>
    </html:tr>
    <html:tr>
      <html:td>
        <html:button onclick="sizeToContent()">Size To Content</html:button>
      </html:td>
    </html:tr>
    <html:tr>
      <html:td>
        <html:button onclick="DumpWindow()">Dump Window</html:button>
      </html:td>
    </html:tr>
  </html:table>

</xul:window>
