// 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/.

var gNewtabUrl = {
  /**
   * Writes browser.newtab.url with the appropriate value.
   * If the choice is "my home page", get and sanitize
   * the browser home page URL to make it suitable for newtab use.
   *
   * Called from prefwindow ondialogaccept in preferences.xul,
   * newtabPage oncommand in tabs.xul, browserHomePage oninput,
   * useCurrent, useBookmark and restoreDefaultHomePage oncommand
   * in main.xul to consider instantApply.
   */
  writeNewtabUrl: function(newtabUrlChoice, browserHomepageUrl) {
    try {
      if (newtabUrlChoice) {
        if (Services.prefs.getBoolPref("browser.preferences.instantApply")) {
          newtabUrlChoice = parseInt(newtabUrlChoice);
        } else {
          return;
        }
      } else {
        if (this.newtabUrlChoiceIsSet) {
          newtabUrlChoice = Services.prefs.getIntPref("browser.newtab.choice");
        } else {
          newtabUrlChoice = this.getNewtabChoice();
        }
      }
      if (browserHomepageUrl || browserHomepageUrl == "") {
        if (Services.prefs.getBoolPref("browser.preferences.instantApply")) {
          if (browserHomepageUrl == "") {
            browserHomepageUrl = "about:home";
          }
        } else {
          return;
        }
      } else {
        browserHomepageUrl = Services.prefs.getComplexValue("browser.startup.homepage",
                              Components.interfaces.nsIPrefLocalizedString).data;
      }
      let newtabUrlPref = Services.prefs.getCharPref("browser.newtab.url");
      switch (newtabUrlChoice) {
        case 1:
          newtabUrlPref = "about:logopage";
          break;
        case 2:
          newtabUrlPref = Services.prefs.getDefaultBranch("browser.")
                            .getComplexValue("startup.homepage",
                              Components.interfaces.nsIPrefLocalizedString).data;
          break;
        case 3:
          // If url is a pipe-delimited set of pages, just take the first one.
          let newtabUrlSanitizedPref=browserHomepageUrl.split("|")[0];
          // XXX: do we need extra sanitation here, e.g. for invalid URLs?
          Services.prefs.setCharPref("browser.newtab.myhome", newtabUrlSanitizedPref);
          newtabUrlPref = newtabUrlSanitizedPref;
          break;
        case 4:
          newtabUrlPref = "about:newtab";
          break;
        default:
          // In case of any other value it's a custom URL, consider instantApply.
          if (this.newtabPageCustom) {
            newtabUrlPref = this.newtabPageCustom;
          }
      } 
      Services.prefs.setCharPref("browser.newtab.url",newtabUrlPref);
    } catch(e) { console.error(e); }
  },

  /**
   * Determines the value of browser.newtab.choice based
   * on the value of browser.newtab.url
   *
   * @returns the value of browser.newtab.choice
   */
  getNewtabChoice: function() {
    let newtabUrlPref = Services.prefs.getCharPref("browser.newtab.url");
    let browserHomepageUrl = Services.prefs.getComplexValue("browser.startup.homepage",
                              Components.interfaces.nsIPrefLocalizedString).data;
    let newtabUrlSanitizedPref = browserHomepageUrl.split("|")[0];
    let defaultStartupHomepage = Services.prefs.getDefaultBranch("browser.")
                                  .getComplexValue("startup.homepage",
                                    Components.interfaces.nsIPrefLocalizedString).data;
    switch (newtabUrlPref) {
      case "about:logopage": 
        return 1;
      case defaultStartupHomepage:
        return 2;
      case newtabUrlSanitizedPref:
        return 3;
      case "about:newtab":
        return 4;
      default: // Custom URL entered.
        // We need this to consider instantApply.
        this.newtabPageCustom = newtabUrlPref;
        return 0;
    }
  }
};
