gecko-dev/editor/ui/dialogs/content/EditorPublish.js

598 строки
18 KiB
JavaScript

/* ***** 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) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Charley Manske (cmanske@netscape.com)
* Ryan Cassin (rcassin@supernova.org)
*
* 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 gPublishSiteData;
var gReturnData;
var gDefaultSiteIndex = -1;
var gDefaultSiteName;
var gPreviousDefaultDir;
var gPreviousTitle;
var gSettingsChanged = false;
var gInitialSiteName;
var gInitialSiteIndex = -1;
var gPasswordManagerOn = true;
// Dialog initialization code
function Startup()
{
window.opener.ok = false;
// Element to edit is passed in
gInitialSiteName = window.arguments[1];
gReturnData = window.arguments[2];
if (!gReturnData || !GetCurrentEditor())
{
dump("Publish: No editor or return data object not supplied\n");
window.close();
return;
}
gDialog.TabBox = document.getElementById("TabBox");
gDialog.PublishTab = document.getElementById("PublishTab");
gDialog.SettingsTab = document.getElementById("SettingsTab");
// Publish panel
gDialog.PageTitleInput = document.getElementById("PageTitleInput");
gDialog.FilenameInput = document.getElementById("FilenameInput");
gDialog.SiteList = document.getElementById("SiteList");
gDialog.DocDirList = document.getElementById("DocDirList");
gDialog.OtherDirCheckbox = document.getElementById("OtherDirCheckbox");
gDialog.OtherDirRadiogroup = document.getElementById("OtherDirRadiogroup");
gDialog.SameLocationRadio = document.getElementById("SameLocationRadio");
gDialog.UseSubdirRadio = document.getElementById("UseSubdirRadio");
gDialog.OtherDirList = document.getElementById("OtherDirList");
// Settings Panel
gDialog.SiteNameInput = document.getElementById("SiteNameInput");
gDialog.PublishUrlInput = document.getElementById("PublishUrlInput");
gDialog.BrowseUrlInput = document.getElementById("BrowseUrlInput");
gDialog.UsernameInput = document.getElementById("UsernameInput");
gDialog.PasswordInput = document.getElementById("PasswordInput");
gDialog.SavePassword = document.getElementById("SavePassword");
gPasswordManagerOn = GetBoolPref("signon.rememberSignons");
gDialog.SavePassword.disabled = !gPasswordManagerOn;
gPublishSiteData = GetPublishSiteData();
gDefaultSiteName = GetDefaultPublishSiteName();
var addNewSite = false;
if (gPublishSiteData)
{
FillSiteList();
}
else
{
// No current site data, start a new item in the Settings panel
AddNewSite();
addNewSite = true;
}
var docUrl = GetDocumentUrl();
var scheme = GetScheme(docUrl);
var filename = "";
if (scheme)
{
filename = GetFilename(docUrl);
if (scheme != "file")
{
var siteFound = false;
// Editing a remote URL.
// Attempt to find doc URL in Site Data
if (gPublishSiteData)
{
var dirObj = {};
var siteIndex = FindSiteIndexAndDocDir(gPublishSiteData, docUrl, dirObj);
// Select this site only if the same as user's intended site, or there wasn't one
if (siteIndex != -1 && (gInitialSiteIndex == -1 || siteIndex == gInitialSiteIndex))
{
siteFound = true;
// Select the site we found
gDialog.SiteList.selectedIndex = siteIndex;
var docDir = dirObj.value;
// Use the directory within site in the editable menulist
gPublishSiteData[siteIndex].docDir = docDir;
//XXX HOW DO WE DECIDE WHAT "OTHER" DIR TO USE?
//gPublishSiteData[siteIndex].otherDir = docDir;
}
}
if (!siteFound)
{
// Not found in site database
// Setup for a new site and use data from a remote URL
if (!addNewSite)
AddNewSite();
addNewSite = true;
var publishData = CreatePublishDataFromUrl(docUrl);
if (publishData)
{
filename = publishData.filename;
gDialog.SiteNameInput.value = publishData.siteName;
gDialog.PublishUrlInput.value = publishData.publishUrl;
gDialog.BrowseUrlInput.value = publishData.browseUrl;
gDialog.UsernameInput.value = publishData.username;
gDialog.PasswordInput.value = publishData.password;
gDialog.SavePassword.checked = false;
}
}
}
}
try {
gPreviousTitle = GetDocumentTitle();
} catch (e) {}
gDialog.PageTitleInput.value = gPreviousTitle;
gDialog.FilenameInput.value = decodeURIComponent(filename);
if (!addNewSite)
{
// If not adding a site and we haven't selected a site -- use initial or default site
if (gDialog.SiteList.selectedIndex == -1)
gDialog.SiteList.selectedIndex = (gInitialSiteIndex != -1) ? gInitialSiteIndex : gDefaultSiteIndex;
// Fill in all the site data for currently-selected site
SelectSiteList();
SetTextboxFocus(gDialog.PageTitleInput);
}
if (gDialog.SiteList.selectedIndex == -1)
{
// No selected site -- assume same directory
gDialog.OtherDirRadiogroup.selectedItem = gDialog.SameLocationRadio;
}
else if (gPublishSiteData[gDialog.SiteList.selectedIndex].docDir ==
gPublishSiteData[gDialog.SiteList.selectedIndex].otherDir)
{
// For now, check "same location" if dirs are already set to same directory
gDialog.OtherDirRadiogroup.selectedItem = gDialog.SameLocationRadio;
}
else
{
gDialog.OtherDirRadiogroup.selectedItem = gDialog.UseSubdirRadio;
}
doEnabling();
SetWindowLocation();
}
function FillSiteList()
{
gDialog.SiteList.removeAllItems();
gDefaultSiteIndex = -1;
// Fill the site lists
var count = gPublishSiteData.length;
var i;
for (i = 0; i < count; i++)
{
var name = gPublishSiteData[i].siteName;
var menuitem = gDialog.SiteList.appendItem(name);
// Highlight the default site
if (name == gDefaultSiteName)
{
gDefaultSiteIndex = i;
if (menuitem)
{
menuitem.setAttribute("class", "menuitem-highlight-1");
menuitem.setAttribute("default", "true");
}
}
// Find initial site location
if (name == gInitialSiteName)
gInitialSiteIndex = i;
}
}
function doEnabling()
{
var disableOther = !gDialog.OtherDirCheckbox.checked;
gDialog.SameLocationRadio.disabled = disableOther;
gDialog.UseSubdirRadio.disabled = disableOther;
gDialog.OtherDirList.disabled = (disableOther || gDialog.SameLocationRadio.selected);
}
function SelectSiteList()
{
var selectedSiteIndex = gDialog.SiteList.selectedIndex;
var siteName = "";
var publishUrl = "";
var browseUrl = "";
var username = "";
var password = "";
var savePassword = false;
var publishOtherFiles = true;
gDialog.DocDirList.removeAllItems();
gDialog.OtherDirList.removeAllItems();
if (gPublishSiteData && selectedSiteIndex != -1)
{
siteName = gPublishSiteData[selectedSiteIndex].siteName;
publishUrl = gPublishSiteData[selectedSiteIndex].publishUrl;
browseUrl = gPublishSiteData[selectedSiteIndex].browseUrl;
username = gPublishSiteData[selectedSiteIndex].username;
savePassword = gPasswordManagerOn ? gPublishSiteData[selectedSiteIndex].savePassword : false;
if (savePassword)
password = gPublishSiteData[selectedSiteIndex].password;
// Fill the directory menulists
if (gPublishSiteData[selectedSiteIndex].dirList.length)
{
for (var i = 0; i < gPublishSiteData[selectedSiteIndex].dirList.length; i++)
{
gDialog.DocDirList.appendItem(gPublishSiteData[selectedSiteIndex].dirList[i]);
gDialog.OtherDirList.appendItem(gPublishSiteData[selectedSiteIndex].dirList[i]);
}
}
gDialog.DocDirList.value = FormatDirForPublishing(gPublishSiteData[selectedSiteIndex].docDir);
gDialog.OtherDirList.value = FormatDirForPublishing(gPublishSiteData[selectedSiteIndex].otherDir);
publishOtherFiles = gPublishSiteData[selectedSiteIndex].publishOtherFiles;
}
else
{
gDialog.DocDirList.value = "";
gDialog.OtherDirList.value = "";
}
gDialog.SiteNameInput.value = siteName;
gDialog.PublishUrlInput.value = publishUrl;
gDialog.BrowseUrlInput.value = browseUrl;
gDialog.UsernameInput.value = username;
gDialog.PasswordInput.value = password;
gDialog.SavePassword.checked = savePassword;
gDialog.OtherDirCheckbox.checked = publishOtherFiles;
doEnabling();
}
function AddNewSite()
{
// Button in Publish panel allows user
// to automatically switch to "Settings" panel
// to enter data for new site
SwitchPanel(gDialog.SettingsTab);
gDialog.SiteList.selectedIndex = -1;
SelectSiteList();
gSettingsChanged = true;
SetTextboxFocus(gDialog.SiteNameInput);
}
function SelectPublishTab()
{
if (gSettingsChanged && !ValidateSettings())
return;
SwitchPanel(gDialog.PublishTab);
SetTextboxFocus(gDialog.PageTitleInput);
}
function SelectSettingsTab()
{
SwitchPanel(gDialog.SettingsTab);
SetTextboxFocus(gDialog.SiteNameInput);
}
function SwitchPanel(tab)
{
if (gDialog.TabBox.selectedTab != tab)
gDialog.TabBox.selectedTab = tab;
}
function onInputSettings()
{
// TODO: Save current data during SelectSite and compare here
// to detect if real change has occured?
gSettingsChanged = true;
}
function GetPublishUrlInput()
{
gDialog.PublishUrlInput.value = FormatUrlForPublishing(gDialog.PublishUrlInput.value);
return gDialog.PublishUrlInput.value;
}
function GetBrowseUrlInput()
{
gDialog.BrowseUrlInput.value = FormatUrlForPublishing(gDialog.BrowseUrlInput.value);
return gDialog.BrowseUrlInput.value;
}
function GetDocDirInput()
{
gDialog.DocDirList.value = FormatDirForPublishing(gDialog.DocDirList.value);
return gDialog.DocDirList.value;
}
function GetOtherDirInput()
{
gDialog.OtherDirList.value = FormatDirForPublishing(gDialog.OtherDirList.value);
return gDialog.OtherDirList.value;
}
function ChooseDir(menulist)
{
//TODO: For FTP publish destinations, get file listing of just dirs
// and build a tree to let user select dir
}
function ValidateSettings()
{
var siteName = TrimString(gDialog.SiteNameInput.value);
if (!siteName)
{
ShowErrorInPanel(gDialog.SettingsTab, "MissingSiteNameError", gDialog.SiteNameInput);
return false;
}
if (PublishSiteNameExists(siteName, gPublishSiteData, gDialog.SiteList.selectedIndex))
{
SwitchPanel(gDialog.SettingsTab);
ShowInputErrorMessage(GetString("DuplicateSiteNameError").replace(/%name%/, siteName));
SetTextboxFocus(gDialog.SiteNameInput);
return false;
}
// Extract username and password while removing them from publishingUrl
var urlUserObj = {};
var urlPassObj = {};
var publishUrl = StripUsernamePassword(gDialog.PublishUrlInput.value, urlUserObj, urlPassObj);
if (publishUrl)
{
publishUrl = FormatUrlForPublishing(publishUrl);
// Assume scheme = "ftp://" if missing
// This compensates when user enters hostname w/o scheme (as most ISPs provide)
if (!GetScheme(publishUrl))
publishUrl = "ftp://" + publishUrl;
gDialog.PublishUrlInput.value = publishUrl;
}
else
{
ShowErrorInPanel(gDialog.SettingsTab, "MissingPublishUrlError", gDialog.PublishUrlInput);
return false;
}
var browseUrl = GetBrowseUrlInput();
var username = TrimString(gDialog.UsernameInput.value);
var savePassword = gDialog.SavePassword.checked;
var password = gDialog.PasswordInput.value;
var publishOtherFiles = gDialog.OtherDirCheckbox.checked;
//XXX If there was a username and/or password in the publishUrl
// AND in the input field, which do we use?
// Let's use those in url only if input is empty
if (!username)
{
username = urlUserObj.value;
gDialog.UsernameInput.value = username;
gSettingsChanged = true;
}
if (!password)
{
password = urlPassObj.value;
gDialog.PasswordInput.value = password;
gSettingsChanged = true;
}
// Update or add data for a site
var siteIndex = gDialog.SiteList.selectedIndex;
var newSite = false;
if (siteIndex == -1)
{
// No site is selected, add a new site at the end
if (gPublishSiteData)
{
siteIndex = gPublishSiteData.length;
}
else
{
// First time: start entire site array
gPublishSiteData = new Array(1);
siteIndex = 0;
gDefaultSiteIndex = 0;
gDefaultSiteName = siteName;
}
gPublishSiteData[siteIndex] = {};
gPublishSiteData[siteIndex].docDir = "";
gPublishSiteData[siteIndex].otherDir = "";
gPublishSiteData[siteIndex].dirList = [""];
gPublishSiteData[siteIndex].publishOtherFiles = true;
gPublishSiteData[siteIndex].previousSiteName = siteName;
newSite = true;
}
gPublishSiteData[siteIndex].siteName = siteName;
gPublishSiteData[siteIndex].publishUrl = publishUrl;
gPublishSiteData[siteIndex].browseUrl = browseUrl;
gPublishSiteData[siteIndex].username = username;
// Don't save password in data that will be saved in prefs
gPublishSiteData[siteIndex].password = savePassword ? password : "";
gPublishSiteData[siteIndex].savePassword = savePassword;
if (publishOtherFiles != gPublishSiteData[siteIndex].publishOtherFiles)
gSettingsChanged = true;
gPublishSiteData[siteIndex].publishOtherFiles = publishOtherFiles;
gDialog.SiteList.selectedIndex = siteIndex;
if (siteIndex == gDefaultSiteIndex)
gDefaultSiteName = siteName;
// Should never be empty, but be sure we have a default site
if (!gDefaultSiteName)
{
gDefaultSiteName = gPublishSiteData[0].siteName;
gDefaultSiteIndex = 0;
}
// Rebuild the site menulist if we added a new site
if (newSite)
{
FillSiteList();
gDialog.SiteList.selectedIndex = siteIndex;
}
else
{
// Update selected item if sitename changed
var selectedItem = gDialog.SiteList.selectedItem;
if (selectedItem)
{
var oldName = selectedItem.getAttribute("label");
if (oldName != siteName)
{
selectedItem.setAttribute("label", siteName);
gDialog.SiteList.setAttribute("label", siteName);
gSettingsChanged = true;
if (oldName == gDefaultSiteName)
gDefaultSiteName = siteName;
}
}
}
// Get the directory name in site to publish to
var docDir = GetDocDirInput();
gPublishSiteData[siteIndex].docDir = docDir;
// And directory for images and other files
var otherDir = GetOtherDirInput();
if (gDialog.SameLocationRadio.selected)
otherDir = docDir;
else
otherDir = GetOtherDirInput();
gPublishSiteData[siteIndex].otherDir = otherDir;
// Fill return data object
gReturnData.siteName = siteName;
gReturnData.previousSiteName = gPublishSiteData[siteIndex].previousSiteName;
gReturnData.publishUrl = publishUrl;
gReturnData.browseUrl = browseUrl;
gReturnData.username = username;
// Note that we use the password for the next publish action
// even if savePassword is false; but we won't save it in PasswordManager database
gReturnData.password = password;
gReturnData.savePassword = savePassword;
gReturnData.docDir = gPublishSiteData[siteIndex].docDir;
gReturnData.otherDir = gPublishSiteData[siteIndex].otherDir;
gReturnData.publishOtherFiles = publishOtherFiles;
gReturnData.dirList = gPublishSiteData[siteIndex].dirList;
return true;
}
function ValidateData()
{
if (!ValidateSettings())
return false;
var siteIndex = gDialog.SiteList.selectedIndex;
if (siteIndex == -1)
return false;
var filename = TrimString(gDialog.FilenameInput.value);
if (!filename)
{
ShowErrorInPanel(gDialog.PublishTab, "MissingPublishFilename", gDialog.FilenameInput);
return false;
}
gReturnData.filename = filename;
return true;
}
function ShowErrorInPanel(tab, errorMsgId, widgetWithError)
{
SwitchPanel(tab);
ShowInputErrorMessage(GetString(errorMsgId));
if (widgetWithError)
SetTextboxFocus(widgetWithError);
}
function doHelpButton()
{
if (gDialog.TabBox.selectedTab == gDialog.PublishTab)
openHelp("comp-doc-publish-publishtab");
else
openHelp("comp-doc-publish-settingstab");
}
function onAccept()
{
if (ValidateData())
{
// DON'T save the docDir and otherDir before trying to publish
gReturnData.saveDirs = false;
// We save new site data to prefs only if we are attempting to publish
if (gSettingsChanged)
SavePublishDataToPrefs(gReturnData);
// Set flag to resave data after publishing
// so we save docDir and otherDir if we published successfully
gReturnData.savePublishData = true;
var title = TrimString(gDialog.PageTitleInput.value);
if (title != gPreviousTitle)
SetDocumentTitle(title);
SaveWindowLocation();
window.opener.ok = true;
return true;
}
return false;
}