summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/addrbook/content/abSearchDialog.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/addrbook/content/abSearchDialog.js')
-rw-r--r--comm/mail/components/addrbook/content/abSearchDialog.js408
1 files changed, 408 insertions, 0 deletions
diff --git a/comm/mail/components/addrbook/content/abSearchDialog.js b/comm/mail/components/addrbook/content/abSearchDialog.js
new file mode 100644
index 0000000000..694d17c12b
--- /dev/null
+++ b/comm/mail/components/addrbook/content/abSearchDialog.js
@@ -0,0 +1,408 @@
+/* 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/. */
+
+/* import-globals-from ../../../../mailnews/addrbook/content/abResultsPane.js */
+/* import-globals-from ../../../../mailnews/base/content/dateFormat.js */
+/* import-globals-from ../../../../mailnews/search/content/searchTerm.js */
+/* import-globals-from ../../../base/content/globalOverlay.js */
+/* import-globals-from abCommon.js */
+
+var { encodeABTermValue } = ChromeUtils.import(
+ "resource:///modules/ABQueryUtils.jsm"
+);
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+var { PluralForm } = ChromeUtils.importESModule(
+ "resource://gre/modules/PluralForm.sys.mjs"
+);
+
+var searchSessionContractID = "@mozilla.org/messenger/searchSession;1";
+var gSearchSession;
+
+var nsMsgSearchScope = Ci.nsMsgSearchScope;
+var nsMsgSearchOp = Ci.nsMsgSearchOp;
+var nsMsgSearchAttrib = Ci.nsMsgSearchAttrib;
+
+var gStatusText;
+var gSearchBundle;
+var gAddressBookBundle;
+
+var gSearchStopButton;
+var gPropertiesCmd;
+var gComposeCmd;
+var gDeleteCmd;
+var gSearchPhoneticName = "false";
+
+var gSearchAbViewListener = {
+ onSelectionChanged() {
+ UpdateCardView();
+ },
+ onCountChanged(aTotal) {
+ let statusText;
+ if (aTotal == 0) {
+ statusText = gAddressBookBundle.GetStringFromName("noMatchFound");
+ } else {
+ statusText = PluralForm.get(
+ aTotal,
+ gAddressBookBundle.GetStringFromName("matchesFound1")
+ ).replace("#1", aTotal);
+ }
+
+ gStatusText.setAttribute("value", statusText);
+ },
+};
+
+function searchOnLoad() {
+ initializeSearchWidgets();
+ initializeSearchWindowWidgets();
+
+ gSearchBundle = Services.strings.createBundle(
+ "chrome://messenger/locale/search.properties"
+ );
+ gSearchStopButton.setAttribute(
+ "label",
+ gSearchBundle.GetStringFromName("labelForSearchButton")
+ );
+ gSearchStopButton.setAttribute(
+ "accesskey",
+ gSearchBundle.GetStringFromName("labelForSearchButton.accesskey")
+ );
+ gAddressBookBundle = Services.strings.createBundle(
+ "chrome://messenger/locale/addressbook/addressBook.properties"
+ );
+ gSearchSession = Cc[searchSessionContractID].createInstance(
+ Ci.nsIMsgSearchSession
+ );
+
+ // initialize a flag for phonetic name search
+ gSearchPhoneticName = Services.prefs.getComplexValue(
+ "mail.addr_book.show_phonetic_fields",
+ Ci.nsIPrefLocalizedString
+ ).data;
+
+ if (window.arguments && window.arguments[0]) {
+ SelectDirectory(window.arguments[0].directory);
+ } else {
+ SelectDirectory(
+ document.getElementById("abPopup-menupopup").firstElementChild.value
+ );
+ }
+
+ onMore(null);
+}
+
+function searchOnUnload() {
+ CloseAbView();
+}
+
+function disableCommands() {
+ gPropertiesCmd.setAttribute("disabled", "true");
+ gComposeCmd.setAttribute("disabled", "true");
+ gDeleteCmd.setAttribute("disabled", "true");
+}
+
+function initializeSearchWindowWidgets() {
+ gSearchStopButton = document.getElementById("search-button");
+ gPropertiesCmd = document.getElementById("cmd_properties");
+ gComposeCmd = document.getElementById("cmd_compose");
+ gDeleteCmd = document.getElementById("cmd_deleteCard");
+ gStatusText = document.getElementById("statusText");
+ disableCommands();
+ // matchAll doesn't make sense for address book search
+ hideMatchAllItem();
+}
+
+function onSearchStop() {}
+
+function onAbSearchReset(event) {
+ disableCommands();
+ CloseAbView();
+
+ onReset(event);
+ gStatusText.setAttribute("value", "");
+}
+
+function SelectDirectory(aURI) {
+ // set popup with address book names
+ let abPopup = document.getElementById("abPopup");
+ if (abPopup) {
+ if (aURI) {
+ abPopup.value = aURI;
+ } else {
+ abPopup.selectedIndex = 0;
+ }
+ }
+
+ setSearchScope(GetScopeForDirectoryURI(aURI));
+}
+
+function GetScopeForDirectoryURI(aURI) {
+ let directory;
+ if (aURI && aURI != "moz-abdirectory://?") {
+ directory = MailServices.ab.getDirectory(aURI);
+ }
+ let booleanAnd = gSearchBooleanRadiogroup.selectedItem.value == "and";
+
+ if (directory?.isRemote) {
+ if (booleanAnd) {
+ return nsMsgSearchScope.LDAPAnd;
+ }
+ return nsMsgSearchScope.LDAP;
+ }
+
+ if (booleanAnd) {
+ return nsMsgSearchScope.LocalABAnd;
+ }
+ return nsMsgSearchScope.LocalAB;
+}
+
+function onEnterInSearchTerm() {
+ // on enter
+ // if not searching, start the search
+ // if searching, stop and then start again
+ if (
+ gSearchStopButton.getAttribute("label") ==
+ gSearchBundle.GetStringFromName("labelForSearchButton")
+ ) {
+ onSearch();
+ } else {
+ onSearchStop();
+ onSearch();
+ }
+}
+
+function onSearch() {
+ gStatusText.setAttribute("value", "");
+ disableCommands();
+
+ gSearchSession.clearScopes();
+
+ var currentAbURI = document.getElementById("abPopup").getAttribute("value");
+
+ gSearchSession.addDirectoryScopeTerm(GetScopeForDirectoryURI(currentAbURI));
+ gSearchSession.searchTerms = saveSearchTerms(
+ gSearchSession.searchTerms,
+ gSearchSession
+ );
+
+ let searchUri = "?(";
+ for (let i = 0; i < gSearchSession.searchTerms.length; i++) {
+ let searchTerm = gSearchSession.searchTerms[i];
+ if (!searchTerm.value.str) {
+ continue;
+ }
+ // get the "and" / "or" value from the first term
+ if (i == 0) {
+ if (searchTerm.booleanAnd) {
+ searchUri += "and";
+ } else {
+ searchUri += "or";
+ }
+ }
+
+ var attrs;
+
+ switch (searchTerm.attrib) {
+ case nsMsgSearchAttrib.Name:
+ if (gSearchPhoneticName != "true") {
+ attrs = [
+ "DisplayName",
+ "FirstName",
+ "LastName",
+ "NickName",
+ "_AimScreenName",
+ ];
+ } else {
+ attrs = [
+ "DisplayName",
+ "FirstName",
+ "LastName",
+ "NickName",
+ "_AimScreenName",
+ "PhoneticFirstName",
+ "PhoneticLastName",
+ ];
+ }
+ break;
+ case nsMsgSearchAttrib.DisplayName:
+ attrs = ["DisplayName"];
+ break;
+ case nsMsgSearchAttrib.Email:
+ attrs = ["PrimaryEmail"];
+ break;
+ case nsMsgSearchAttrib.PhoneNumber:
+ attrs = [
+ "HomePhone",
+ "WorkPhone",
+ "FaxNumber",
+ "PagerNumber",
+ "CellularNumber",
+ ];
+ break;
+ case nsMsgSearchAttrib.Organization:
+ attrs = ["Company"];
+ break;
+ case nsMsgSearchAttrib.Department:
+ attrs = ["Department"];
+ break;
+ case nsMsgSearchAttrib.City:
+ attrs = ["WorkCity"];
+ break;
+ case nsMsgSearchAttrib.Street:
+ attrs = ["WorkAddress"];
+ break;
+ case nsMsgSearchAttrib.Nickname:
+ attrs = ["NickName"];
+ break;
+ case nsMsgSearchAttrib.WorkPhone:
+ attrs = ["WorkPhone"];
+ break;
+ case nsMsgSearchAttrib.HomePhone:
+ attrs = ["HomePhone"];
+ break;
+ case nsMsgSearchAttrib.Fax:
+ attrs = ["FaxNumber"];
+ break;
+ case nsMsgSearchAttrib.Pager:
+ attrs = ["PagerNumber"];
+ break;
+ case nsMsgSearchAttrib.Mobile:
+ attrs = ["CellularNumber"];
+ break;
+ case nsMsgSearchAttrib.Title:
+ attrs = ["JobTitle"];
+ break;
+ case nsMsgSearchAttrib.AdditionalEmail:
+ attrs = ["SecondEmail"];
+ break;
+ case nsMsgSearchAttrib.ScreenName:
+ attrs = ["_AimScreenName"];
+ break;
+ default:
+ dump("XXX " + searchTerm.attrib + " not a supported search attr!\n");
+ attrs = ["DisplayName"];
+ break;
+ }
+
+ var opStr;
+
+ switch (searchTerm.op) {
+ case nsMsgSearchOp.Contains:
+ opStr = "c";
+ break;
+ case nsMsgSearchOp.DoesntContain:
+ opStr = "!c";
+ break;
+ case nsMsgSearchOp.Is:
+ opStr = "=";
+ break;
+ case nsMsgSearchOp.Isnt:
+ opStr = "!=";
+ break;
+ case nsMsgSearchOp.BeginsWith:
+ opStr = "bw";
+ break;
+ case nsMsgSearchOp.EndsWith:
+ opStr = "ew";
+ break;
+ case nsMsgSearchOp.SoundsLike:
+ opStr = "~=";
+ break;
+ default:
+ opStr = "c";
+ break;
+ }
+
+ // currently, we can't do "and" and "or" searches at the same time
+ // (it's either all "and"s or all "or"s)
+ var max_attrs = attrs.length;
+
+ for (var j = 0; j < max_attrs; j++) {
+ // append the term(s) to the searchUri
+ searchUri +=
+ "(" +
+ attrs[j] +
+ "," +
+ opStr +
+ "," +
+ encodeABTermValue(searchTerm.value.str) +
+ ")";
+ }
+ }
+
+ searchUri += ")";
+ if (searchUri == "?()") {
+ // Empty search.
+ searchUri = "";
+ }
+ SetAbView(currentAbURI, searchUri, "");
+}
+
+// used to toggle functionality for Search/Stop button.
+function onSearchButton(event) {
+ if (
+ event.target.label ==
+ gSearchBundle.GetStringFromName("labelForSearchButton")
+ ) {
+ onSearch();
+ } else {
+ onSearchStop();
+ }
+}
+
+function GetAbViewListener() {
+ return gSearchAbViewListener;
+}
+
+function onProperties() {
+ if (!gPropertiesCmd.hasAttribute("disabled")) {
+ window.opener.toAddressBook({ action: "display", card: GetSelectedCard() });
+ }
+}
+
+function onCompose() {
+ if (!gComposeCmd.hasAttribute("disabled")) {
+ AbNewMessage();
+ }
+}
+
+function onDelete() {
+ if (!gDeleteCmd.hasAttribute("disabled")) {
+ AbDelete();
+ }
+}
+
+function AbResultsPaneKeyPress(event) {
+ switch (event.keyCode) {
+ case KeyEvent.DOM_VK_RETURN:
+ onProperties();
+ break;
+ case KeyEvent.DOM_VK_DELETE:
+ case KeyEvent.DOM_VK_BACK_SPACE:
+ onDelete();
+ }
+}
+
+function AbResultsPaneDoubleClick(card) {
+ // Kept for abResultsPane.js.
+}
+
+function UpdateCardView() {
+ disableCommands();
+ let numSelected = GetNumSelectedCards();
+
+ if (!numSelected) {
+ return;
+ }
+
+ if (MailServices.accounts.allIdentities.length > 0) {
+ gComposeCmd.removeAttribute("disabled");
+ }
+
+ gDeleteCmd.removeAttribute("disabled");
+ if (numSelected == 1) {
+ gPropertiesCmd.removeAttribute("disabled");
+ }
+}