/* ***** 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 Communicator client code, released
 * March 31, 1998.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998-1999
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Ben Goodger (30/09/99)
 *   Brant Gurganus (23/03/03)
 *   Stefan Borggraefe (17/10/03)
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of 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 ***** */

var gProfile = Components.classes["@mozilla.org/profile/manager;1"].getService(Components.interfaces.nsIProfileInternal);
var gProfileManagerBundle;

// The directory where the profile will be created.
var gProfileRoot;

// Text node to display the location and name of the profile to create.
var gProfileDisplay;

// Called once when the wizard is opened.
function initWizard()
{ 
  gProfileManagerBundle = document.getElementById("bundle_profileManager");
    
  // Initialize the profile location display.
  gProfileDisplay = document.getElementById("profileDisplay").firstChild;
  setDisplayToDefaultFolder();
}

// Called every time the second wizard page is displayed.
function initSecondWizardPage() 
{
  var profileName = document.getElementById("profileName");
  profileName.select();
  profileName.focus();

  // Initialize profile name validation.
  checkCurrentInput(profileName.value);
}

function setDisplayToDefaultFolder()
{
  setDisplayToFolder(gProfile.defaultProfileParentDir);
  document.getElementById("useDefault").disabled = true;
}

function setDisplayToFolder(profileRoot)
{
  var profileName = document.getElementById("profileName");
  profileName.focus();
  gProfileRoot = profileRoot;
}

function updateProfileDisplay()
{
  var currentProfileName = document.getElementById("profileName").value;
  var profilePathAndName = gProfileRoot.clone();

  profilePathAndName.append(currentProfileName);
  gProfileDisplay.data = profilePathAndName.path;
}

// Shows the Language/Region Selection dialog and updates the data-Attributes to 
// the selected values.
function showLangDialog()
{
  var languageCode = document.getElementById("profileLanguage").getAttribute("data");
  var regionCode = document.getElementById("profileRegion").getAttribute("data");
  window.openDialog("chrome://communicator/content/profile/selectLang.xul",
                    "", "centerscreen,modal,titlebar",
                    languageCode, regionCode);
}

// Invoke a folder selection dialog for choosing the directory of profile storage.
function chooseProfileFolder()
{
  var newProfileRoot;
  
  try {
    var dirChooser = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
    dirChooser.init(window, gProfileManagerBundle.getString("chooseFolder"), Components.interfaces.nsIFilePicker.modeGetFolder);
    dirChooser.appendFilters(Components.interfaces.nsIFilePicker.filterAll);
    if (dirChooser.show() == dirChooser.returnCancel)
      return;
    newProfileRoot = dirChooser.file;
  }
  catch(e) {
    // If something fails, change nothing.
    return;
  }

  // Disable the "Default Folder..." button when the default profile folder
  // was selected manually in the File Picker.
  document.getElementById("useDefault").disabled = (newProfileRoot.equals(gProfile.defaultProfileParentDir));

  setDisplayToFolder(newProfileRoot);
  updateProfileDisplay();
}

// Checks the current user input for validity and triggers an error message accordingly.
function checkCurrentInput(currentInput)
{
  var finishButton = document.documentElement.getButton("finish");
  var finishText = document.getElementById("finishText");
  var canAdvance;

  var errorMessage = checkProfileName(currentInput);
  if (!errorMessage) {
    finishText.className = "";
    finishText.firstChild.data = gProfileManagerBundle.getString("profileFinishText");
    canAdvance = true;
  }
  else {
    finishText.className = "error";
    finishText.firstChild.data = errorMessage;
    canAdvance = false;
  }

  document.documentElement.canAdvance = canAdvance;
  finishButton.disabled = !canAdvance;

  updateProfileDisplay();
}

// Checks whether the given string is a valid profile name.
// Returns an error message describing the error in the name or "" when it's valid.
function checkProfileName(profileNameToCheck)
{
  // Check for emtpy profile name.
  if (!/\S/.test(profileNameToCheck))
    return gProfileManagerBundle.getString("profileNameEmpty");

  // Check whether all characters in the profile name are allowed.
  if (/([\\*:?<>|\/\"])/.test(profileNameToCheck))
    return gProfileManagerBundle.getFormattedString("invalidChar", [RegExp.$1]);

  // Check whether a profile with the same name already exists.
  if (gProfile.profileExists(profileNameToCheck))
    return gProfileManagerBundle.getString("profileExists");

  // profileNameToCheck is valid.
  return "";
}

// Called when the first wizard page is shown.
function enableNextButton()
{
  document.documentElement.canAdvance = true;
}

function onCancel()
{
  // window.opener is false if the Create Profile Wizard was opened from the command line.
  if (!window.opener)
    return true;

  try {
    gProfile.forgetCurrentProfile();
  }
  catch (ex) {
  }

  return true;
}

function onFinish() 
{
  var profileName = document.getElementById("profileName").value;
  var languageCode = document.getElementById("profileLanguage").getAttribute("data");
  var regionCode = document.getElementById("profileRegion").getAttribute("data");

  var proceed = processCreateProfileData(profileName, gProfileRoot, languageCode, regionCode);
  // Error on profile creation. Don't leave the wizard so the user can correct his input.
  if (!proceed)
    return false;

  // window.opener is false if the Create Profile Wizard was opened from the command line.
  if (window.opener)
    // Add new profile to the list in the Profile Manager.
    window.opener.CreateProfile(profileName, gProfileRoot);
  else {
    // Use the newly created Profile.
    gProfile.currentProfile = profileName;
    var dialogParams = window.arguments[0].QueryInterface(Components.interfaces.nsIDialogParamBlock);
    dialogParams.SetInt(0, 1); //set the newly created profile as the default
  }

  // Exit the wizard.
  return true;
}

// Create profile named profileName in profileRoot.
function processCreateProfileData(profileName, profileRoot, languageCode, regionCode)
{
  try {
    var profileLocation = profileRoot.clone();
    profileLocation.append(profileName);
    gProfile.createNewProfileWithLocales(profileName, profileRoot.path, languageCode, regionCode, profileLocation.exists());

    return true;
  }
  catch (e) {
    var profileCreationFailed = gProfileManagerBundle.getString("profileCreationFailed");
    var profileCreationFailedTitle = gProfileManagerBundle.getString("profileCreationFailedTitle");
    var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
    promptService.alert(window, profileCreationFailedTitle, profileCreationFailed);

    return false;
  }
}
