summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/content/markByDate.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/base/content/markByDate.js')
-rw-r--r--comm/mailnews/base/content/markByDate.js120
1 files changed, 120 insertions, 0 deletions
diff --git a/comm/mailnews/base/content/markByDate.js b/comm/mailnews/base/content/markByDate.js
new file mode 100644
index 0000000000..672897f1e1
--- /dev/null
+++ b/comm/mailnews/base/content/markByDate.js
@@ -0,0 +1,120 @@
+/* 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 dateFormat.js */
+
+var MILLISECONDS_PER_HOUR = 60 * 60 * 1000;
+var MICROSECONDS_PER_DAY = 1000 * MILLISECONDS_PER_HOUR * 24;
+
+window.addEventListener("load", onLoad);
+
+document.addEventListener("dialogaccept", onAccept);
+
+function onLoad() {
+ var upperDateBox = document.getElementById("upperDate");
+ // focus the upper bound control - this is where we expect most users to enter
+ // a date
+ upperDateBox.focus();
+
+ // and give it an initial date - "yesterday"
+ var initialDate = new Date();
+ initialDate.setHours(0);
+ initialDate.setTime(initialDate.getTime() - MILLISECONDS_PER_HOUR);
+ // note that this is sufficient - though it is at the end of the previous day,
+ // we convert it to a date string, and then the time part is truncated
+ upperDateBox.value = convertDateToString(initialDate);
+ upperDateBox.select(); // allows to start overwriting immediately
+}
+
+function onAccept() {
+ // get the times as entered by the user
+ var lowerDateString = document.getElementById("lowerDate").value;
+ // the fallback for the lower bound, if not entered, is the "beginning of
+ // time" (1970-01-01), which actually is simply 0 :)
+ var prLower = lowerDateString ? convertStringToPRTime(lowerDateString) : 0;
+
+ var upperDateString = document.getElementById("upperDate").value;
+ var prUpper;
+ if (upperDateString == "") {
+ // for the upper bound, the fallback is "today".
+ var dateThisMorning = new Date();
+ dateThisMorning.setMilliseconds(0);
+ dateThisMorning.setSeconds(0);
+ dateThisMorning.setMinutes(0);
+ dateThisMorning.setHours(0);
+ // Javascript time is in milliseconds, PRTime is in microseconds
+ prUpper = dateThisMorning.getTime() * 1000;
+ } else {
+ prUpper = convertStringToPRTime(upperDateString);
+ }
+
+ // for the upper date, we have to do a correction:
+ // if the user enters a date, then she means (hopefully) that all messages sent
+ // at this day should be marked, too, but the PRTime calculated from this would
+ // point to the beginning of the day. So we need to increment it by
+ // [number of micro seconds per day]. This will denote the first microsecond of
+ // the next day then, which is later used as exclusive boundary
+ prUpper += MICROSECONDS_PER_DAY;
+
+ markInDatabase(prLower, prUpper);
+}
+
+/**
+ * M arks all headers in the database, whose time is between the two given
+ * times, as read.
+ *
+ * @param {integer} lower - PRTime for the lower bound (inclusive).
+ * @param {integer} upper - PRTime for the upper bound (exclusive).
+ */
+function markInDatabase(lower, upper) {
+ let messageFolder;
+ let messageDatabase;
+ // extract the database
+ if (window.arguments && window.arguments[0]) {
+ messageFolder = window.arguments[0];
+ messageDatabase = messageFolder.msgDatabase;
+ }
+
+ if (!messageDatabase) {
+ dump("markByDate::markInDatabase: there /is/ no database to operate on!\n");
+ return;
+ }
+
+ let searchSession = Cc[
+ "@mozilla.org/messenger/searchSession;1"
+ ].createInstance(Ci.nsIMsgSearchSession);
+ let searchTerms = [];
+ searchSession.addScopeTerm(Ci.nsMsgSearchScope.offlineMail, messageFolder);
+
+ const nsMsgSearchAttrib = Ci.nsMsgSearchAttrib;
+ const nsMsgSearchOp = Ci.nsMsgSearchOp;
+
+ let searchTerm = searchSession.createTerm();
+ searchTerm.attrib = nsMsgSearchAttrib.Date;
+ searchTerm.op = nsMsgSearchOp.IsBefore;
+ let value = searchTerm.value;
+ value.attrib = nsMsgSearchAttrib.Date;
+ value.date = upper;
+ searchTerm.value = value;
+ searchTerms.push(searchTerm);
+
+ if (lower) {
+ searchTerm = searchSession.createTerm();
+ searchTerm.booleanAnd = true;
+ searchTerm.attrib = nsMsgSearchAttrib.Date;
+ searchTerm.op = nsMsgSearchOp.IsAfter;
+ value = searchTerm.value;
+ value.attrib = nsMsgSearchAttrib.Date;
+ value.date = lower;
+ searchTerm.value = value;
+ searchTerms.push(searchTerm);
+ }
+
+ let msgEnumerator = messageDatabase.getFilterEnumerator(searchTerms);
+ let headers = [...msgEnumerator];
+
+ if (headers.length) {
+ messageFolder.markMessagesRead(headers, true);
+ }
+}