{"version":3,"file":"timezoneconverter-a27fffb4.js","names":["define","Moduler","create","defaults","dateElementSelector","utcStartTime","utcEndTime","currentLanguage","nativeFormat","init","self","this","lang","options","document","documentElement","elements","el","querySelectorAll","push","i","length","element","elementSettings","utils","parseSettings","getAttribute","startTime","getDateFromString","endTime","time","toLocaleString","isSameDate","getFullYear","getMonth","getDate","fullDateFormat","month","day","year","shouldFormatSameMonth","formatSameMonthDate","isSameYear","shouldFormatSameYear","formatSeparator","innerHTML","indexOf","sep","start","end","replace","trim","startDate","endDate","fullDate","dateString","Date"],"sources":["timezoneconverter.js"],"mappings":"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","sourcesContent":["define(['moduler'], function (Moduler) {\r\n 'use strict';\r\n\r\n return Moduler.create({\r\n defaults: {\r\n dateElementSelector: null, // set as a selector if there are multiple elements with date in the module container\r\n utcStartTime: null,\r\n utcEndTime: null,\r\n currentLanguage: null,\r\n nativeFormat: null // if set, this will be used to display the date(s), set this to the native JS format option object: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString\r\n },\r\n\r\n init: function () {\r\n var self = this;\r\n\r\n let lang = self.options.currentLanguage ?? document.documentElement.lang;\r\n\r\n var elements = [];\r\n if (self.options.dateElementSelector != null) {\r\n elements = self.el.querySelectorAll('[data-timezoneconverter]');\r\n } else if (self.options.utcStartTime != null) {\r\n elements.push(self.el);\r\n }\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n\r\n // load these from the element itself instead of the module so each individual item can have a different date when dateElementSelector is used\r\n var elementSettings = Moduler.utils.parseSettings(element.getAttribute('data-timezoneconverter'));\r\n\r\n var startTime = self.getDateFromString(elementSettings.utcStartTime);\r\n\r\n var endTime = self.options.utcEndTime ? self.getDateFromString(elementSettings.utcEndTime) : null;\r\n\r\n let time = '';\r\n\r\n if (self.options.nativeFormat != null) {\r\n time = startTime.toLocaleString(lang, self.options.nativeFormat);\r\n if (endTime != null) {\r\n time += '-' + endTime.toLocaleString(lang, self.options.nativeFormat);\r\n }\r\n } else {\r\n // the getXXX uses the local timezone\r\n let isSameDate = endTime == null ||\r\n (startTime.getFullYear() === endTime.getFullYear() &&\r\n startTime.getMonth() === endTime.getMonth() &&\r\n startTime.getDate() === endTime.getDate());\r\n\r\n const fullDateFormat = { month: 'long', day: 'numeric', year: 'numeric' };\r\n if (endTime == null || isSameDate) {\r\n time = startTime.toLocaleString(lang, fullDateFormat);\r\n } else {\r\n // if start and end is the same month, use the special same month format\r\n let isSameMonth = startTime.getMonth() === endTime.getMonth() && startTime.getFullYear() === endTime.getFullYear();\r\n if (isSameMonth && self.shouldFormatSameMonth(lang)) {\r\n time = self.formatSameMonthDate(startTime, endTime, lang);\r\n } else {\r\n let isSameYear = self.shouldFormatSameYear(lang) && startTime.getFullYear() === endTime.getFullYear();\r\n time = startTime.toLocaleString(lang, isSameYear ? { month: 'long', day: 'numeric' } : fullDateFormat);\r\n let sep = self.formatSeparator(' - ', lang);\r\n time += sep;\r\n time += endTime.toLocaleString(lang, fullDateFormat);\r\n }\r\n }\r\n }\r\n\r\n element.innerHTML = time;\r\n }\r\n },\r\n\r\n shouldFormatSameYear: function (lang) {\r\n if (lang.indexOf('ja') == 0) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n shouldFormatSameMonth: function (lang) {\r\n if (lang.indexOf('ja') == 0) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n formatSeparator: function(sep, lang) {\r\n if (lang.indexOf('es') == 0) {\r\n sep = ' al ';\r\n }\r\n return sep;\r\n },\r\n\r\n formatSameMonthDate: function (start, end, lang) {\r\n var self = this;\r\n let month = start.toLocaleString(lang, { month: 'long', day: 'numeric' })\r\n .replace(start.toLocaleString(lang, { day: 'numeric' }), '')\r\n .trim();\r\n let sep = self.formatSeparator('-', lang);\r\n const startDate = start.toLocaleString(lang, { month: 'long', day: 'numeric' });\r\n const endDate = end.toLocaleString(lang, { month: 'long', day: 'numeric', year: 'numeric' });\r\n\r\n let fullDate;\r\n\r\n //if startdate starts with the month, the best format is 'month day1-day2'', otherwise 'day1-day2 month' is better\r\n if (startDate.indexOf(month) > 0) {\r\n fullDate = startDate.replace(month, '').trim() + sep + endDate;\r\n } else {\r\n fullDate = startDate + sep + endDate.replace(month, '').trim();\r\n }\r\n\r\n return fullDate;\r\n },\r\n\r\n getDateFromString: function (dateString) {\r\n //iso8601 says a date can be \"yyyy-mm-ddThh:mm:ssz\", so replace space with T\r\n return new Date(dateString.replace(/[ ]/g, \"T\"));\r\n }\r\n /*,\r\n\r\n getFormattedDate: function (date, lang, format) {\r\n var self = this;\r\n var result = \"\";\r\n var chunks = self.getDateFormats(format);\r\n for (var i = 0; i < chunks.length; i++) {\r\n // if the chunk is a string, it is not a format directive and should just be printed out as-is\r\n if (typeof chunks[i] === 'string' || chunks[i] instanceof String) {\r\n result += chunks[i];\r\n } else {\r\n result += date.toLocaleString(lang, chunks[i]);\r\n }\r\n }\r\n return result;\r\n },\r\n getDateFormats: function (format) {\r\n if (format == null) {\r\n return [];\r\n }\r\n var self = this;\r\n var chunks = [];\r\n var f = format;\r\n // this will pick items from the format string and parse them either as a format string or filler text\r\n // the format strings are parsed by reading the same character until another appear. This should cover\r\n // the basic aspects of a conversion table from c# style date formatting to javascript\r\n // the final string is created by applying all different formats to the same date\r\n while (f.length > 0) {\r\n var i = 0;\r\n if (!self.isFormatCharacter(f[i])) {// if its just filler, add it as a string to the chunks\r\n var part = '';\r\n while (f.length > i && !self.isFormatCharacter(f[i])) { // keep adding non-format chars\r\n part += f[i];\r\n i++;\r\n }\r\n chunks.push(part);\r\n f = f.substr(part.length);\r\n } else {\r\n i++;\r\n while (f.length > i && f[i] == f[0]) {\r\n i++;\r\n }\r\n var part = f.substr(0, i);\r\n var chunk = self.getFormatChunk(part);\r\n if (chunk != null) {\r\n chunks.push(chunk);\r\n } else { // if the formatting fails, assume its filler content and just add it as string\r\n chunks.push(part);\r\n }\r\n f = f.substr(i);\r\n }\r\n }\r\n return chunks;\r\n },\r\n isFormatCharacter: function (c) {\r\n var valid = 'MmDdHhsyY';\r\n return valid.indexOf(c) > -1;\r\n },\r\n getFormatChunk: function (i) {\r\n if (i.length == 0) {\r\n return null;\r\n }\r\n var l = i.length - 1; // zero-based length of format as we pick values from an array\r\n if (i[0] == 'M') { // month - M, MM, MMM or MMMM\r\n const m = ['numeric', '2-digit', 'short', 'long'];\r\n return { month: l > 3 ? m[3] : m[l] };\r\n }\r\n if (i[0] == 'D' || i[0] == 'd') { // day - d, dd or ddd, we dont use the single character day format that exist in js\r\n switch (l) {\r\n case 0: return { day: 'numeric' };\r\n case 1: return { day: '2-digit' };\r\n case 2: return { weekday: 'short' };\r\n }\r\n return { weekday: 'long' };\r\n }\r\n if (i[0] == 'y' || i[0] == 'Y') { // year - all above y are treated as numeric. which will just print out the year, ex. 2022\r\n return { year: l > 0 ? 'numeric' : '2-digit' };\r\n }\r\n\r\n // time is slightly easier as they are all max 2 chars and we only have to worry about 12/24hr for special cases\r\n // single character formats, like 's' will display without leading zero\r\n const t = ['numeric', '2-digit'];\r\n l = l > 1 ? 1 : l;\r\n if (i[0] == 'm') { // minute\r\n return { minute: t[l] };\r\n }\r\n if (i[0] == 's' || i[0] == 'S') { // second\r\n return { second: t[l] };\r\n }\r\n\r\n if (i[0] == 'h' || i[0] == 'H') { // lowercase is 12hr clock, uppercase 24h\r\n return { hour: t[l], hour12: i[0] == 'h' };\r\n }\r\n }\r\n */\r\n });\r\n});"]}