diff options
Diffstat (limited to 'mailnews/base/content/dateFormat.js')
-rw-r--r-- | mailnews/base/content/dateFormat.js | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/mailnews/base/content/dateFormat.js b/mailnews/base/content/dateFormat.js new file mode 100644 index 000000000..71c628697 --- /dev/null +++ b/mailnews/base/content/dateFormat.js @@ -0,0 +1,225 @@ +/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* 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/. */ + +Components.utils.import("resource://gre/modules/Services.jsm"); + +var gSearchDateFormat = 0; +var gSearchDateSeparator; +var gSearchDateLeadingZeros; + +/** + * Get the short date format option of the current locale. + * This supports the common case which the date separator is + * either '/', '-', '.' and using Christian year. + */ +function initLocaleShortDateFormat() +{ + // default to mm/dd/yyyy + gSearchDateFormat = 3; + gSearchDateSeparator = "/"; + gSearchDateLeadingZeros = true; + + try { + var dateFormatService = Components.classes["@mozilla.org/intl/scriptabledateformat;1"] + .getService(Components.interfaces.nsIScriptableDateFormat); + var dateString = dateFormatService.FormatDate("", + dateFormatService.dateFormatShort, + 1999, + 12, + 1); + + // find out the separator + var possibleSeparators = "/-."; + var arrayOfStrings; + for ( var i = 0; i < possibleSeparators.length; ++i ) + { + arrayOfStrings = dateString.split( possibleSeparators[i] ); + if ( arrayOfStrings.length == 3 ) + { + gSearchDateSeparator = possibleSeparators[i]; + break; + } + } + + // check the format option + if ( arrayOfStrings.length != 3 ) // no successfull split + { + dump("getLocaleShortDateFormat: could not analyze the date format, defaulting to mm/dd/yyyy\n"); + } + else + { + // the date will contain a zero if that system settings include leading zeros + gSearchDateLeadingZeros = dateString.includes("0"); + + // match 1 as number, since that will match both "1" and "01" + if ( arrayOfStrings[0] == 1 ) + { + // 01.12.1999 or 01.1999.12 + gSearchDateFormat = arrayOfStrings[1] == "12" ? 5 : 6; + } + else if ( arrayOfStrings[1] == 1 ) + { + // 12.01.1999 or 1999.01.12 + gSearchDateFormat = arrayOfStrings[0] == "12" ? 3 : 2; + } + else // implies arrayOfStrings[2] == 1 + { + // 12.1999.01 or 1999.12.01 + gSearchDateFormat = arrayOfStrings[0] == "12" ? 4 : 1; + } + } + } + catch (e) + { + dump("getLocaleShortDateFormat: caught an exception!\n"); + } +} + +function initializeSearchDateFormat() +{ + if (gSearchDateFormat) + return; + + // get a search date format option and a seprator + try { + gSearchDateFormat = + Services.prefs.getComplexValue("mailnews.search_date_format", + Components.interfaces.nsIPrefLocalizedString); + gSearchDateFormat = parseInt(gSearchDateFormat); + + // if the option is 0 then try to use the format of the current locale + if (gSearchDateFormat == 0) + initLocaleShortDateFormat(); + else + { + // initialize the search date format based on preferences + if ( gSearchDateFormat < 1 || gSearchDateFormat > 6 ) + gSearchDateFormat = 3; + + gSearchDateSeparator = + Services.prefs.getComplexValue("mailnews.search_date_separator", + Components.interfaces.nsIPrefLocalizedString); + + gSearchDateLeadingZeros = + (Services.prefs.getComplexValue( + "mailnews.search_date_leading_zeros", + Components.interfaces.nsIPrefLocalizedString).data == "true"); + } + } + catch (e) + { + Components.utils.reportError("initializeSearchDateFormat: caught an exception: " + e); + // set to mm/dd/yyyy in case of error + gSearchDateFormat = 3; + gSearchDateSeparator = "/"; + gSearchDateLeadingZeros = true; + } +} + +function convertPRTimeToString(tm) +{ + var time = new Date(); + // PRTime is in microseconds, JavaScript time is in milliseconds + // so divide by 1000 when converting + time.setTime(tm / 1000); + + return convertDateToString(time); +} + +function convertDateToString(time) +{ + initializeSearchDateFormat(); + + var year = time.getFullYear(); + var month = time.getMonth() + 1; // since js month is 0-11 + if ( gSearchDateLeadingZeros && month < 10 ) + month = "0" + month; + var date = time.getDate(); + if ( gSearchDateLeadingZeros && date < 10 ) + date = "0" + date; + + var dateStr; + var sep = gSearchDateSeparator; + + switch (gSearchDateFormat) + { + case 1: + dateStr = year + sep + month + sep + date; + break; + case 2: + dateStr = year + sep + date + sep + month; + break; + case 3: + dateStr = month + sep + date + sep + year; + break; + case 4: + dateStr = month + sep + year + sep + date; + break; + case 5: + dateStr = date + sep + month + sep + year; + break; + case 6: + dateStr = date + sep + year + sep + month; + break; + default: + dump("valid search date format option is 1-6\n"); + } + + return dateStr; +} + +function convertStringToPRTime(str) +{ + initializeSearchDateFormat(); + + var arrayOfStrings = str.split(gSearchDateSeparator); + var year, month, date; + + // set year, month, date based on the format option + switch (gSearchDateFormat) + { + case 1: + year = arrayOfStrings[0]; + month = arrayOfStrings[1]; + date = arrayOfStrings[2]; + break; + case 2: + year = arrayOfStrings[0]; + month = arrayOfStrings[2]; + date = arrayOfStrings[1]; + break; + case 3: + year = arrayOfStrings[2]; + month = arrayOfStrings[0]; + date = arrayOfStrings[1]; + break; + case 4: + year = arrayOfStrings[1]; + month = arrayOfStrings[0]; + date = arrayOfStrings[2]; + break; + case 5: + year = arrayOfStrings[2]; + month = arrayOfStrings[1]; + date = arrayOfStrings[0]; + break; + case 6: + year = arrayOfStrings[1]; + month = arrayOfStrings[2]; + date = arrayOfStrings[0]; + break; + default: + dump("valid search date format option is 1-6\n"); + } + + month -= 1; // since js month is 0-11 + + var time = new Date(year, month, date); + + // JavaScript time is in milliseconds, PRTime is in microseconds + // so multiply by 1000 when converting + return (time.getTime() * 1000); +} + |