Your IP : 18.216.161.178


Current Path : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/js/main/date/
Upload File :
Current File : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/js/main/date/main.date.js

this.BX = this.BX || {};
(function (exports,main_core) {
	'use strict';

	function convertBitrixFormat(format) {
	  if (!main_core.Type.isStringFilled(format)) {
	    return '';
	  }
	  return format.replace('YYYY', 'Y') // 1999
	  .replace('MMMM', 'F') // January - December
	  .replace('MM', 'm') // 01 - 12
	  .replace('M', 'M') // Jan - Dec
	  .replace('DD', 'd') // 01 - 31
	  .replace('G', 'g') //  1 - 12
	  .replace(/GG/i, 'G') //  0 - 23
	  .replace('H', 'h') // 01 - 12
	  .replace(/HH/i, 'H') // 00 - 24
	  .replace('MI', 'i') // 00 - 59
	  .replace('SS', 's') // 00 - 59
	  .replace('TT', 'A') // AM - PM
	  .replace('T', 'a'); // am - pm
	}

	const formatsCache = new main_core.Cache.MemoryCache();

	/**
	 * Returns culture-specific datetime format by code.
	 * The full list with examples can be found in config.php of this extension in ['settings']['formats'].
	 * All formats are compatible with this.format() without any additional transformations.
	 *
	 * @param code
	 * @returns {string|null}
	 */
	function getFormat(code) {
	  return formatsCache.remember(`main.date.format.${code}`, () => {
	    let format = main_core.Extension.getSettings('main.date').get(`formats.${code}`);
	    if (main_core.Type.isStringFilled(format) && (code === 'FORMAT_DATE' || code === 'FORMAT_DATETIME')) {
	      format = convertBitrixFormat(format);
	    }
	    return format;
	  });
	}

	/**
	 * @memberOf BX.Main
	 * @alias Date
	 */
	let DateTimeFormat = /*#__PURE__*/function () {
	  function DateTimeFormat() {
	    babelHelpers.classCallCheck(this, DateTimeFormat);
	  }
	  babelHelpers.createClass(DateTimeFormat, null, [{
	    key: "isAmPmMode",
	    value: function isAmPmMode(returnConst) {
	      if (returnConst === true) {
	        return this._getMessage('AMPM_MODE');
	      }
	      return this._getMessage('AMPM_MODE') !== false;
	    }
	  }, {
	    key: "convertToUTC",
	    value: function convertToUTC(date) {
	      if (!main_core.Type.isDate(date)) {
	        return null;
	      }
	      return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));
	    }
	    /**
	     * Function creates and returns Javascript Date() object from server timestamp regardless of local browser (system) timezone.
	     * For example can be used to convert timestamp from some exact date on server to the JS Date object with the same value.
	     *
	     * @param timestamp - timestamp in seconds
	     * @returns {Date}
	     */
	  }, {
	    key: "getNewDate",
	    value: function getNewDate(timestamp) {
	      return new Date(this.getBrowserTimestamp(timestamp));
	    }
	    /**
	     * Function transforms server timestamp (in sec) to javascript timestamp (calculated depend on local browser timezone offset). Returns timestamp in milliseconds.
	     * Also see BX.Main.Date.getNewDate description.
	     *
	     * @param timestamp - timestamp in seconds
	     * @returns {number}
	     */
	  }, {
	    key: "getBrowserTimestamp",
	    value: function getBrowserTimestamp(timestamp) {
	      timestamp = parseInt(timestamp, 10);
	      const browserOffset = new Date(timestamp * 1000).getTimezoneOffset() * 60;
	      return (parseInt(timestamp, 10) + parseInt(this._getMessage('SERVER_TZ_OFFSET')) + browserOffset) * 1000;
	    }
	    /**
	     * Function transforms local browser timestamp (in ms) to server timestamp (calculated depend on local browser timezone offset). Returns timestamp in seconds.
	     *
	     * @param timestamp - timestamp in milliseconds
	     * @returns {number}
	     */
	  }, {
	    key: "getServerTimestamp",
	    value: function getServerTimestamp(timestamp) {
	      timestamp = parseInt(timestamp, 10);
	      const browserOffset = new Date(timestamp).getTimezoneOffset() * 60;
	      return Math.round(timestamp / 1000 - (parseInt(this._getMessage('SERVER_TZ_OFFSET'), 10) + parseInt(browserOffset, 10)));
	    }
	  }, {
	    key: "formatLastActivityDate",
	    value: function formatLastActivityDate(timestamp, now, utc) {
	      const ampm = this.isAmPmMode(true);
	      const timeFormat = ampm === this.AM_PM_MODE.LOWER ? 'g:i a' : ampm === this.AM_PM_MODE.UPPER ? 'g:i A' : 'H:i';
	      const format = [['tomorrow', '#01#' + timeFormat], ['now', '#02#'], ['todayFuture', '#03#' + timeFormat], ['yesterday', '#04#' + timeFormat], ['-', this.convertBitrixFormat(this._getMessage('FORMAT_DATETIME')).replace(/:s/g, '')], ['s60', 'sago'], ['i60', 'iago'], ['H5', 'Hago'], ['H24', '#03#' + timeFormat], ['d31', 'dago'], ['m12>1', 'mago'], ['m12>0', 'dago'], ['', '#05#']];
	      let formattedDate = this.format(format, timestamp, now, utc);
	      let match = null;
	      if ((match = /^#(\d+)#(.*)/.exec(formattedDate)) != null) {
	        switch (match[1]) {
	          case '01':
	            formattedDate = this._getMessage('FD_LAST_SEEN_TOMORROW').replace('#TIME#', match[2]);
	            break;
	          case '02':
	            formattedDate = this._getMessage('FD_LAST_SEEN_NOW');
	            break;
	          case '03':
	            formattedDate = this._getMessage('FD_LAST_SEEN_TODAY').replace('#TIME#', match[2]);
	            break;
	          case '04':
	            formattedDate = this._getMessage('FD_LAST_SEEN_YESTERDAY').replace('#TIME#', match[2]);
	            break;
	          case '05':
	            formattedDate = this._getMessage('FD_LAST_SEEN_MORE_YEAR');
	            break;
	          default:
	            formattedDate = match[2];
	            break;
	        }
	      }
	      return formattedDate;
	    }
	    /**
	     * The method is designed to replace the localization storage on sites without Bitrix Framework.
	     * It gets overloaded with custom implementation:
	     *
	     * const CustomDate = Object.create(BX.Main.Date);
	     * CustomDate._getMessage = () => ...new implementation...;
	     *
	     * This class should get messages only via this method.
	     * Otherwise, the class won't work on sites without Bitrix Framework.
	     *
	     * @param message
	     * @returns {*}
	     * @private
	     */
	  }, {
	    key: "_getMessage",
	    value: function _getMessage(message) {
	      return main_core.Loc.getMessage(message);
	    }
	    /**
	     * The method used to parse date from string by given format.
	     *
	     * @param {string} str - date in given format
	     * @param {boolean} isUTC - is date in UTC
	     * @param {string} formatDate - format of the date without time
	     * @param {string} formatDatetime - format of the date with time
	     * @returns {Date|null} - returns Date object if string was parsed or null
	     */
	  }, {
	    key: "parse",
	    value: function parse(str, isUTC, formatDate, formatDatetime) {
	      if (main_core.Type.isStringFilled(str)) {
	        if (!formatDate) {
	          formatDate = this._getMessage('FORMAT_DATE');
	        }
	        if (!formatDatetime) {
	          formatDatetime = this._getMessage('FORMAT_DATETIME');
	        }
	        let regMonths = '';
	        for (let i = 1; i <= 12; i++) {
	          regMonths = regMonths + '|' + this._getMessage('MON_' + i);
	        }
	        const expr = new RegExp('([0-9]+|[a-z]+' + regMonths + ')', 'ig');
	        const aDate = str.match(expr);
	        let aFormat = formatDate.match(/(DD|MI|MMMM|MM|M|YYYY)/ig);
	        const aDateArgs = [];
	        const aFormatArgs = [];
	        const aResult = {};
	        if (!aDate) {
	          return null;
	        }
	        if (aDate.length > aFormat.length) {
	          aFormat = formatDatetime.match(/(DD|MI|MMMM|MM|M|YYYY|HH|H|SS|TT|T|GG|G)/ig);
	        }
	        for (let i = 0, cnt = aDate.length; i < cnt; i++) {
	          if (aDate[i].trim() !== '') {
	            aDateArgs[aDateArgs.length] = aDate[i];
	          }
	        }
	        for (let i = 0, cnt = aFormat.length; i < cnt; i++) {
	          if (aFormat[i].trim() !== '') {
	            aFormatArgs[aFormatArgs.length] = aFormat[i];
	          }
	        }
	        let m = aFormatArgs.findIndex(item => item === 'MMMM');
	        if (m > 0) {
	          aDateArgs[m] = this.getMonthIndex(aDateArgs[m]);
	          aFormatArgs[m] = 'MM';
	        } else {
	          m = aFormatArgs.findIndex(item => item === 'M');
	          if (m > 0) {
	            aDateArgs[m] = this.getMonthIndex(aDateArgs[m]);
	            aFormatArgs[m] = 'MM';
	          }
	        }
	        for (let i = 0, cnt = aFormatArgs.length; i < cnt; i++) {
	          const k = aFormatArgs[i].toUpperCase();
	          aResult[k] = k === 'T' || k === 'TT' ? aDateArgs[i] : parseInt(aDateArgs[i], 10);
	        }
	        if (aResult['DD'] > 0 && aResult['MM'] > 0 && aResult['YYYY'] > 0) {
	          const d = new Date();
	          if (isUTC) {
	            d.setUTCDate(1);
	            d.setUTCFullYear(aResult['YYYY']);
	            d.setUTCMonth(aResult['MM'] - 1);
	            d.setUTCDate(aResult['DD']);
	            d.setUTCHours(0, 0, 0, 0);
	          } else {
	            d.setDate(1);
	            d.setFullYear(aResult['YYYY']);
	            d.setMonth(aResult['MM'] - 1);
	            d.setDate(aResult['DD']);
	            d.setHours(0, 0, 0, 0);
	          }
	          if ((!isNaN(aResult['HH']) || !isNaN(aResult['GG']) || !isNaN(aResult['H']) || !isNaN(aResult['G'])) && !isNaN(aResult['MI'])) {
	            if (!isNaN(aResult['H']) || !isNaN(aResult['G'])) {
	              const bPM = (aResult['T'] || aResult['TT'] || 'am').toUpperCase() === 'PM',
	                h = parseInt(aResult['H'] || aResult['G'] || 0, 10);
	              if (bPM) {
	                aResult['HH'] = h + (h === 12 ? 0 : 12);
	              } else {
	                aResult['HH'] = h < 12 ? h : 0;
	              }
	            } else {
	              aResult['HH'] = parseInt(aResult['HH'] || aResult['GG'] || 0, 10);
	            }
	            if (isNaN(aResult['SS'])) {
	              aResult['SS'] = 0;
	            }
	            if (isUTC) {
	              d.setUTCHours(aResult['HH'], aResult['MI'], aResult['SS']);
	            } else {
	              d.setHours(aResult['HH'], aResult['MI'], aResult['SS']);
	            }
	          }
	          return d;
	        }
	      }
	      return null;
	    }
	  }, {
	    key: "getMonthIndex",
	    value: function getMonthIndex(month) {
	      const q = month.toUpperCase();
	      const wordMonthCut = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
	      const wordMonth = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
	      for (let i = 1; i <= 12; i++) {
	        if (q === this._getMessage('MON_' + i).toUpperCase() || q === this._getMessage('MONTH_' + i).toUpperCase() || q === wordMonthCut[i - 1].toUpperCase() || q === wordMonth[i - 1].toUpperCase()) {
	          return i;
	        }
	      }
	      return month;
	    }
	  }, {
	    key: "format",
	    value: function format(_format, timestamp, now, utc) {
	      /*
	      PHP to Javascript:
	      	time() = new Date()
	      	mktime(...) = new Date(...)
	      	gmmktime(...) = new Date(Date.UTC(...))
	      	mktime(0,0,0, 1, 1, 1970) != 0          new Date(1970,0,1).getTime() != 0
	      	gmmktime(0,0,0, 1, 1, 1970) == 0        new Date(Date.UTC(1970,0,1)).getTime() == 0
	      	date('d.m.Y H:i:s') = BX.Main.Date.format('d.m.Y H:i:s')
	      	gmdate('d.m.Y H:i:s') = BX.Main.Date.format('d.m.Y H:i:s', null, null, true);
	      */
	      const date = main_core.Type.isDate(timestamp) ? new Date(timestamp.getTime()) : main_core.Type.isNumber(timestamp) ? new Date(timestamp * 1000) : new Date();
	      const nowDate = main_core.Type.isDate(now) ? new Date(now.getTime()) : main_core.Type.isNumber(now) ? new Date(now * 1000) : new Date();
	      const isUTC = !!utc;
	      // used in hoisting inner functions, like _formatDateInterval
	      const thisDateTimeFormat = this;
	      if (main_core.Type.isArray(_format)) {
	        return _formatDateInterval(_format, date, nowDate, isUTC);
	      } else {
	        if (!main_core.Type.isStringFilled(_format)) {
	          return '';
	        }
	      }
	      const replaceMap = (_format.match(/{{([^{}]*)}}/g) || []).map(x => {
	        return (x.match(/[^{}]+/) || [''])[0];
	      });
	      if (replaceMap.length > 0) {
	        replaceMap.forEach((element, index) => {
	          _format = _format.replace('{{' + element + '}}', '{{' + index + '}}');
	        });
	      }
	      const formatRegex = /\\?(sago|iago|isago|Hago|dago|mago|Yago|sdiff|idiff|Hdiff|ddiff|mdiff|Ydiff|sshort|ishort|Hshort|dshort|mhort|Yshort|yesterday|today|tommorow|tomorrow|[a-z])/gi;
	      const dateFormats = {
	        d: () => {
	          // Day of the month 01 to 31
	          return getDate(date).toString().padStart(2, '0');
	        },
	        D: () => {
	          //Mon through Sun
	          return this._getMessage('DOW_' + getDay(date));
	        },
	        j: () => {
	          //Day of the month 1 to 31
	          return getDate(date);
	        },
	        l: () => {
	          //Sunday through Saturday
	          return this._getMessage('DAY_OF_WEEK_' + getDay(date));
	        },
	        N: () => {
	          //1 (for Monday) through 7 (for Sunday)
	          return getDay(date) || 7;
	        },
	        S: () => {
	          //st, nd, rd or th. Works well with j
	          if (getDate(date) % 10 == 1 && getDate(date) != 11) {
	            return 'st';
	          } else if (getDate(date) % 10 == 2 && getDate(date) != 12) {
	            return 'nd';
	          } else if (getDate(date) % 10 == 3 && getDate(date) != 13) {
	            return 'rd';
	          } else {
	            return 'th';
	          }
	        },
	        w: () => {
	          //0 (for Sunday) through 6 (for Saturday)
	          return getDay(date);
	        },
	        z: () => {
	          //0 through 365
	          const firstDay = new Date(getFullYear(date), 0, 1);
	          const currentDay = new Date(getFullYear(date), getMonth(date), getDate(date));
	          return Math.ceil((currentDay - firstDay) / (24 * 3600 * 1000));
	        },
	        W: () => {
	          //ISO-8601 week number of year
	          const newDate = new Date(date.getTime());
	          const dayNumber = (getDay(date) + 6) % 7;
	          setDate(newDate, getDate(newDate) - dayNumber + 3);
	          const firstThursday = newDate.getTime();
	          setMonth(newDate, 0, 1);
	          if (getDay(newDate) != 4) {
	            setMonth(newDate, 0, 1 + (4 - getDay(newDate) + 7) % 7);
	          }
	          const weekNumber = 1 + Math.ceil((firstThursday - newDate) / (7 * 24 * 3600 * 1000));
	          return weekNumber.toString().padStart(2, '0');
	        },
	        F: () => {
	          //January through December
	          return this._getMessage('MONTH_' + (getMonth(date) + 1) + '_S');
	        },
	        f: () => {
	          //January through December
	          return this._getMessage('MONTH_' + (getMonth(date) + 1));
	        },
	        m: () => {
	          //Numeric representation of a month 01 through 12
	          return (getMonth(date) + 1).toString().padStart(2, '0');
	        },
	        M: () => {
	          //A short textual representation of a month, three letters Jan through Dec
	          return this._getMessage('MON_' + (getMonth(date) + 1));
	        },
	        n: () => {
	          //Numeric representation of a month 1 through 12
	          return getMonth(date) + 1;
	        },
	        t: () => {
	          //Number of days in the given month 28 through 31
	          const lastMonthDay = isUTC ? new Date(Date.UTC(getFullYear(date), getMonth(date) + 1, 0)) : new Date(getFullYear(date), getMonth(date) + 1, 0);
	          return getDate(lastMonthDay);
	        },
	        L: () => {
	          //1 if it is a leap year, 0 otherwise.
	          const year = getFullYear(date);
	          return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 1 : 0;
	        },
	        o: () => {
	          //ISO-8601 year number
	          const correctDate = new Date(date.getTime());
	          setDate(correctDate, getDate(correctDate) - (getDay(date) + 6) % 7 + 3);
	          return getFullYear(correctDate);
	        },
	        Y: () => {
	          //A full numeric representation of a year, 4 digits
	          return getFullYear(date);
	        },
	        y: () => {
	          //A two digit representation of a year
	          return getFullYear(date).toString().slice(2);
	        },
	        a: () => {
	          //am or pm
	          return getHours(date) > 11 ? 'pm' : 'am';
	        },
	        A: () => {
	          //AM or PM
	          return getHours(date) > 11 ? 'PM' : 'AM';
	        },
	        B: () => {
	          //000 through 999
	          const swatch = (date.getUTCHours() + 1) % 24 + date.getUTCMinutes() / 60 + date.getUTCSeconds() / 3600;
	          return Math.floor(swatch * 1000 / 24).toString().padStart(3, '0');
	        },
	        g: () => {
	          //12-hour format of an hour without leading zeros 1 through 12
	          return getHours(date) % 12 || 12;
	        },
	        G: () => {
	          //24-hour format of an hour without leading zeros 0 through 23
	          return getHours(date);
	        },
	        h: () => {
	          //12-hour format of an hour with leading zeros 01 through 12
	          return (getHours(date) % 12 || 12).toString().padStart(2, '0');
	        },
	        H: () => {
	          //24-hour format of an hour with leading zeros 00 through 23
	          return getHours(date).toString().padStart(2, '0');
	        },
	        i: () => {
	          //Minutes with leading zeros 00 to 59
	          return getMinutes(date).toString().padStart(2, '0');
	        },
	        s: () => {
	          //Seconds, with leading zeros 00 through 59
	          return getSeconds(date).toString().padStart(2, '0');
	        },
	        u: () => {
	          //Microseconds
	          return (getMilliseconds(date) * 1000).toString().padStart(6, '0');
	        },
	        e: () => {
	          if (isUTC) {
	            return 'UTC';
	          }
	          return '';
	        },
	        I: () => {
	          if (isUTC) {
	            return 0;
	          }

	          //Whether or not the date is in daylight saving time 1 if Daylight Saving Time, 0 otherwise
	          const firstJanuary = new Date(getFullYear(date), 0, 1);
	          const firstJanuaryUTC = Date.UTC(getFullYear(date), 0, 1);
	          const firstJuly = new Date(getFullYear(date), 6, 0);
	          const firstJulyUTC = Date.UTC(getFullYear(date), 6, 0);
	          return 0 + (firstJanuary - firstJanuaryUTC !== firstJuly - firstJulyUTC);
	        },
	        O: () => {
	          if (isUTC) {
	            return '+0000';
	          }

	          //Difference to Greenwich time (GMT) in hours +0200
	          const timezoneOffset = date.getTimezoneOffset();
	          const timezoneOffsetAbs = Math.abs(timezoneOffset);
	          return (timezoneOffset > 0 ? '-' : '+') + (Math.floor(timezoneOffsetAbs / 60) * 100 + timezoneOffsetAbs % 60).toString().padStart(4, '0');
	        },
	        //this method references 'O' method of the same object, arrow function is not suitable here
	        P: function () {
	          if (isUTC) {
	            return '+00:00';
	          }

	          //Difference to Greenwich time (GMT) with colon between hours and minutes +02:00
	          const difference = this.O();
	          return difference.substr(0, 3) + ':' + difference.substr(3);
	        },
	        Z: () => {
	          if (isUTC) {
	            return 0;
	          }
	          //Timezone offset in seconds. The offset for timezones west of UTC is always negative,
	          //and for those east of UTC is always positive.
	          return -date.getTimezoneOffset() * 60;
	        },
	        c: () => {
	          //ISO 8601 date
	          return 'Y-m-d\\TH:i:sP'.replace(formatRegex, _replaceDateFormat);
	        },
	        r: () => {
	          //RFC 2822 formatted date
	          return 'D, d M Y H:i:s O'.replace(formatRegex, _replaceDateFormat);
	        },
	        U: () => {
	          //Seconds since the Unix Epoch
	          return Math.floor(date.getTime() / 1000);
	        },
	        sago: () => {
	          return _formatDateMessage(intval((nowDate - date) / 1000), {
	            '0': 'FD_SECOND_AGO_0',
	            '1': 'FD_SECOND_AGO_1',
	            '10_20': 'FD_SECOND_AGO_10_20',
	            'MOD_1': 'FD_SECOND_AGO_MOD_1',
	            'MOD_2_4': 'FD_SECOND_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_SECOND_AGO_MOD_OTHER'
	          });
	        },
	        sdiff: () => {
	          return _formatDateMessage(intval((nowDate - date) / 1000), {
	            '0': 'FD_SECOND_DIFF_0',
	            '1': 'FD_SECOND_DIFF_1',
	            '10_20': 'FD_SECOND_DIFF_10_20',
	            'MOD_1': 'FD_SECOND_DIFF_MOD_1',
	            'MOD_2_4': 'FD_SECOND_DIFF_MOD_2_4',
	            'MOD_OTHER': 'FD_SECOND_DIFF_MOD_OTHER'
	          });
	        },
	        sshort: () => {
	          return this._getMessage('FD_SECOND_SHORT').replace(/#VALUE#/g, intval((nowDate - date) / 1000));
	        },
	        iago: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 1000), {
	            '0': 'FD_MINUTE_AGO_0',
	            '1': 'FD_MINUTE_AGO_1',
	            '10_20': 'FD_MINUTE_AGO_10_20',
	            'MOD_1': 'FD_MINUTE_AGO_MOD_1',
	            'MOD_2_4': 'FD_MINUTE_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_MINUTE_AGO_MOD_OTHER'
	          });
	        },
	        idiff: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 1000), {
	            '0': 'FD_MINUTE_DIFF_0',
	            '1': 'FD_MINUTE_DIFF_1',
	            '10_20': 'FD_MINUTE_DIFF_10_20',
	            'MOD_1': 'FD_MINUTE_DIFF_MOD_1',
	            'MOD_2_4': 'FD_MINUTE_DIFF_MOD_2_4',
	            'MOD_OTHER': 'FD_MINUTE_DIFF_MOD_OTHER'
	          });
	        },
	        isago: () => {
	          const minutesAgo = intval((nowDate - date) / 60 / 1000);
	          let result = _formatDateMessage(minutesAgo, {
	            '0': 'FD_MINUTE_0',
	            '1': 'FD_MINUTE_1',
	            '10_20': 'FD_MINUTE_10_20',
	            'MOD_1': 'FD_MINUTE_MOD_1',
	            'MOD_2_4': 'FD_MINUTE_MOD_2_4',
	            'MOD_OTHER': 'FD_MINUTE_MOD_OTHER'
	          });
	          result += ' ';
	          const secondsAgo = intval((nowDate - date) / 1000) - minutesAgo * 60;
	          result += _formatDateMessage(secondsAgo, {
	            '0': 'FD_SECOND_AGO_0',
	            '1': 'FD_SECOND_AGO_1',
	            '10_20': 'FD_SECOND_AGO_10_20',
	            'MOD_1': 'FD_SECOND_AGO_MOD_1',
	            'MOD_2_4': 'FD_SECOND_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_SECOND_AGO_MOD_OTHER'
	          });
	          return result;
	        },
	        ishort: () => {
	          return this._getMessage('FD_MINUTE_SHORT').replace(/#VALUE#/g, intval((nowDate - date) / 60 / 1000));
	        },
	        Hago: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 1000), {
	            '0': 'FD_HOUR_AGO_0',
	            '1': 'FD_HOUR_AGO_1',
	            '10_20': 'FD_HOUR_AGO_10_20',
	            'MOD_1': 'FD_HOUR_AGO_MOD_1',
	            'MOD_2_4': 'FD_HOUR_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_HOUR_AGO_MOD_OTHER'
	          });
	        },
	        Hdiff: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 1000), {
	            '0': 'FD_HOUR_DIFF_0',
	            '1': 'FD_HOUR_DIFF_1',
	            '10_20': 'FD_HOUR_DIFF_10_20',
	            'MOD_1': 'FD_HOUR_DIFF_MOD_1',
	            'MOD_2_4': 'FD_HOUR_DIFF_MOD_2_4',
	            'MOD_OTHER': 'FD_HOUR_DIFF_MOD_OTHER'
	          });
	        },
	        Hshort: () => {
	          return this._getMessage('FD_HOUR_SHORT').replace(/#VALUE#/g, intval((nowDate - date) / 60 / 60 / 1000));
	        },
	        yesterday: () => {
	          return this._getMessage('FD_YESTERDAY');
	        },
	        today: () => {
	          return this._getMessage('FD_TODAY');
	        },
	        tommorow: () => {
	          return this._getMessage('FD_TOMORROW');
	        },
	        tomorrow: () => {
	          return this._getMessage('FD_TOMORROW');
	        },
	        dago: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 1000), {
	            '0': 'FD_DAY_AGO_0',
	            '1': 'FD_DAY_AGO_1',
	            '10_20': 'FD_DAY_AGO_10_20',
	            'MOD_1': 'FD_DAY_AGO_MOD_1',
	            'MOD_2_4': 'FD_DAY_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_DAY_AGO_MOD_OTHER'
	          });
	        },
	        ddiff: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 1000), {
	            '0': 'FD_DAY_DIFF_0',
	            '1': 'FD_DAY_DIFF_1',
	            '10_20': 'FD_DAY_DIFF_10_20',
	            'MOD_1': 'FD_DAY_DIFF_MOD_1',
	            'MOD_2_4': 'FD_DAY_DIFF_MOD_2_4',
	            'MOD_OTHER': 'FD_DAY_DIFF_MOD_OTHER'
	          });
	        },
	        dshort: () => {
	          return this._getMessage('FD_DAY_SHORT').replace(/#VALUE#/g, intval((nowDate - date) / 60 / 60 / 24 / 1000));
	        },
	        mago: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 31 / 1000), {
	            '0': 'FD_MONTH_AGO_0',
	            '1': 'FD_MONTH_AGO_1',
	            '10_20': 'FD_MONTH_AGO_10_20',
	            'MOD_1': 'FD_MONTH_AGO_MOD_1',
	            'MOD_2_4': 'FD_MONTH_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_MONTH_AGO_MOD_OTHER'
	          });
	        },
	        mdiff: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 31 / 1000), {
	            '0': 'FD_MONTH_DIFF_0',
	            '1': 'FD_MONTH_DIFF_1',
	            '10_20': 'FD_MONTH_DIFF_10_20',
	            'MOD_1': 'FD_MONTH_DIFF_MOD_1',
	            'MOD_2_4': 'FD_MONTH_DIFF_MOD_2_4',
	            'MOD_OTHER': 'FD_MONTH_DIFF_MOD_OTHER'
	          });
	        },
	        mshort: () => {
	          return this._getMessage('FD_MONTH_SHORT').replace(/#VALUE#/g, intval((nowDate - date) / 60 / 60 / 24 / 31 / 1000));
	        },
	        Yago: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 365 / 1000), {
	            '0': 'FD_YEARS_AGO_0',
	            '1': 'FD_YEARS_AGO_1',
	            '10_20': 'FD_YEARS_AGO_10_20',
	            'MOD_1': 'FD_YEARS_AGO_MOD_1',
	            'MOD_2_4': 'FD_YEARS_AGO_MOD_2_4',
	            'MOD_OTHER': 'FD_YEARS_AGO_MOD_OTHER'
	          });
	        },
	        Ydiff: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 365 / 1000), {
	            '0': 'FD_YEARS_DIFF_0',
	            '1': 'FD_YEARS_DIFF_1',
	            '10_20': 'FD_YEARS_DIFF_10_20',
	            'MOD_1': 'FD_YEARS_DIFF_MOD_1',
	            'MOD_2_4': 'FD_YEARS_DIFF_MOD_2_4',
	            'MOD_OTHER': 'FD_YEARS_DIFF_MOD_OTHER'
	          });
	        },
	        Yshort: () => {
	          return _formatDateMessage(intval((nowDate - date) / 60 / 60 / 24 / 365 / 1000), {
	            '0': 'FD_YEARS_SHORT_0',
	            '1': 'FD_YEARS_SHORT_1',
	            '10_20': 'FD_YEARS_SHORT_10_20',
	            'MOD_1': 'FD_YEARS_SHORT_MOD_1',
	            'MOD_2_4': 'FD_YEARS_SHORT_MOD_2_4',
	            'MOD_OTHER': 'FD_YEARS_SHORT_MOD_OTHER'
	          });
	        },
	        x: () => {
	          const ampm = this.isAmPmMode(true);
	          const timeFormat = ampm === this.AM_PM_MODE.LOWER ? 'g:i a' : ampm === this.AM_PM_MODE.UPPER ? 'g:i A' : 'H:i';
	          return this.format([['tomorrow', 'tomorrow, ' + timeFormat], ['-', this.convertBitrixFormat(this._getMessage('FORMAT_DATETIME')).replace(/:s/g, '')], ['s', 'sago'], ['i', 'iago'], ['today', 'today, ' + timeFormat], ['yesterday', 'yesterday, ' + timeFormat], ['', this.convertBitrixFormat(this._getMessage('FORMAT_DATETIME')).replace(/:s/g, '')]], date, nowDate, isUTC);
	        },
	        X: () => {
	          const ampm = this.isAmPmMode(true);
	          const timeFormat = ampm === this.AM_PM_MODE.LOWER ? 'g:i a' : ampm === this.AM_PM_MODE.UPPER ? 'g:i A' : 'H:i';
	          const day = this.format([['tomorrow', 'tomorrow'], ['-', this.convertBitrixFormat(this._getMessage('FORMAT_DATE'))], ['today', 'today'], ['yesterday', 'yesterday'], ['', this.convertBitrixFormat(this._getMessage('FORMAT_DATE'))]], date, nowDate, isUTC);
	          const time = this.format([['tomorrow', timeFormat], ['today', timeFormat], ['yesterday', timeFormat], ['', '']], date, nowDate, isUTC);
	          if (time.length > 0) {
	            return this._getMessage('FD_DAY_AT_TIME').replace(/#DAY#/g, day).replace(/#TIME#/g, time);
	          } else {
	            return day;
	          }
	        },
	        Q: () => {
	          const daysAgo = intval((nowDate - date) / 60 / 60 / 24 / 1000);
	          if (daysAgo == 0) {
	            return this._getMessage('FD_DAY_DIFF_1').replace(/#VALUE#/g, 1);
	          } else {
	            return this.format([['d', 'ddiff'], ['m', 'mdiff'], ['', 'Ydiff']], date, nowDate);
	          }
	        }
	      };
	      let cutZeroTime = false;
	      if (_format[0] && _format[0] == '^') {
	        cutZeroTime = true;
	        _format = _format.substr(1);
	      }
	      let result = _format.replace(formatRegex, _replaceDateFormat);
	      if (cutZeroTime) {
	        /* 	15.04.12 13:00:00 => 15.04.12 13:00
	        	00:01:00 => 00:01
	        	4 may 00:00:00 => 4 may
	        	01-01-12 00:00 => 01-01-12
	        */

	        result = result.replace(/\s*00:00:00\s*/g, '').replace(/(\d\d:\d\d)(:00)/g, '$1').replace(/(\s*00:00\s*)(?!:)/g, '');
	      }
	      if (replaceMap.length > 0) {
	        replaceMap.forEach(function (element, index) {
	          result = result.replace('{{' + index + '}}', element);
	        });
	      }
	      return result;
	      function _formatDateInterval(formats, date, nowDate, isUTC) {
	        const secondsAgo = intval((nowDate - date) / 1000);
	        for (let i = 0; i < formats.length; i++) {
	          const formatInterval = formats[i][0];
	          const formatValue = formats[i][1];
	          let match = null;
	          if (formatInterval == 's') {
	            if (secondsAgo < 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if ((match = /^s(\d+)\>?(\d+)?/.exec(formatInterval)) != null) {
	            if (match[1] && match[2]) {
	              if (secondsAgo < match[1] && secondsAgo > match[2]) {
	                return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	              }
	            } else if (secondsAgo < match[1]) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'i') {
	            if (secondsAgo < 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if ((match = /^i(\d+)\>?(\d+)?/.exec(formatInterval)) != null) {
	            if (match[1] && match[2]) {
	              if (secondsAgo < match[1] * 60 && secondsAgo > match[2] * 60) {
	                return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	              }
	            } else if (secondsAgo < match[1] * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'H') {
	            if (secondsAgo < 24 * 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if ((match = /^H(\d+)\>?(\d+)?/.exec(formatInterval)) != null) {
	            if (match[1] && match[2]) {
	              if (secondsAgo < match[1] * 60 * 60 && secondsAgo > match[2] * 60 * 60) {
	                return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	              }
	            } else if (secondsAgo < match[1] * 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'd') {
	            if (secondsAgo < 31 * 24 * 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if ((match = /^d(\d+)\>?(\d+)?/.exec(formatInterval)) != null) {
	            if (match[1] && match[2]) {
	              if (secondsAgo < match[1] * 24 * 60 * 60 && secondsAgo > match[2] * 24 * 60 * 60) {
	                return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	              }
	            } else if (secondsAgo < match[1] * 24 * 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'm') {
	            if (secondsAgo < 365 * 24 * 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if ((match = /^m(\d+)\>?(\d+)?/.exec(formatInterval)) != null) {
	            if (match[1] && match[2]) {
	              if (secondsAgo < match[1] * 31 * 24 * 60 * 60 && secondsAgo > match[2] * 31 * 24 * 60 * 60) {
	                return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	              }
	            } else if (secondsAgo < match[1] * 31 * 24 * 60 * 60) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'now') {
	            if (date.getTime() == nowDate.getTime()) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'today') {
	            const year = getFullYear(nowDate);
	            const month = getMonth(nowDate);
	            const day = getDate(nowDate);
	            const todayStart = isUTC ? new Date(Date.UTC(year, month, day, 0, 0, 0, 0)) : new Date(year, month, day, 0, 0, 0, 0);
	            const todayEnd = isUTC ? new Date(Date.UTC(year, month, day + 1, 0, 0, 0, 0)) : new Date(year, month, day + 1, 0, 0, 0, 0);
	            if (date >= todayStart && date < todayEnd) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'todayFuture') {
	            const year = getFullYear(nowDate);
	            const month = getMonth(nowDate);
	            const day = getDate(nowDate);
	            const todayStart = nowDate.getTime();
	            const todayEnd = isUTC ? new Date(Date.UTC(year, month, day + 1, 0, 0, 0, 0)) : new Date(year, month, day + 1, 0, 0, 0, 0);
	            if (date >= todayStart && date < todayEnd) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'yesterday') {
	            const year = getFullYear(nowDate);
	            const month = getMonth(nowDate);
	            const day = getDate(nowDate);
	            const yesterdayStart = isUTC ? new Date(Date.UTC(year, month, day - 1, 0, 0, 0, 0)) : new Date(year, month, day - 1, 0, 0, 0, 0);
	            const yesterdayEnd = isUTC ? new Date(Date.UTC(year, month, day, 0, 0, 0, 0)) : new Date(year, month, day, 0, 0, 0, 0);
	            if (date >= yesterdayStart && date < yesterdayEnd) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == 'tommorow' || formatInterval == 'tomorrow') {
	            const year = getFullYear(nowDate);
	            const month = getMonth(nowDate);
	            const day = getDate(nowDate);
	            const tomorrowStart = isUTC ? new Date(Date.UTC(year, month, day + 1, 0, 0, 0, 0)) : new Date(year, month, day + 1, 0, 0, 0, 0);
	            const tomorrowEnd = isUTC ? new Date(Date.UTC(year, month, day + 2, 0, 0, 0, 0)) : new Date(year, month, day + 2, 0, 0, 0, 0);
	            if (date >= tomorrowStart && date < tomorrowEnd) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          } else if (formatInterval == '-') {
	            if (secondsAgo < 0) {
	              return thisDateTimeFormat.format(formatValue, date, nowDate, isUTC);
	            }
	          }
	        }

	        //return formats.length > 0 ? thisDateTimeFormat.format(formats.pop()[1], date, nowDate, isUTC) : '';
	        return formats.length > 0 ? thisDateTimeFormat.format(formats[formats.length - 1][1], date, nowDate, isUTC) : '';
	      }
	      function getFullYear(date) {
	        return isUTC ? date.getUTCFullYear() : date.getFullYear();
	      }
	      function getDate(date) {
	        return isUTC ? date.getUTCDate() : date.getDate();
	      }
	      function getMonth(date) {
	        return isUTC ? date.getUTCMonth() : date.getMonth();
	      }
	      function getHours(date) {
	        return isUTC ? date.getUTCHours() : date.getHours();
	      }
	      function getMinutes(date) {
	        return isUTC ? date.getUTCMinutes() : date.getMinutes();
	      }
	      function getSeconds(date) {
	        return isUTC ? date.getUTCSeconds() : date.getSeconds();
	      }
	      function getMilliseconds(date) {
	        return isUTC ? date.getUTCMilliseconds() : date.getMilliseconds();
	      }
	      function getDay(date) {
	        return isUTC ? date.getUTCDay() : date.getDay();
	      }
	      function setDate(date, dayValue) {
	        return isUTC ? date.setUTCDate(dayValue) : date.setDate(dayValue);
	      }
	      function setMonth(date, monthValue, dayValue) {
	        return isUTC ? date.setUTCMonth(monthValue, dayValue) : date.setMonth(monthValue, dayValue);
	      }
	      function _formatDateMessage(value, messages) {
	        const val = value < 100 ? Math.abs(value) : Math.abs(value % 100);
	        const dec = val % 10;
	        let message = '';
	        if (val == 0) {
	          message = thisDateTimeFormat._getMessage(messages['0']);
	        } else if (val == 1) {
	          message = thisDateTimeFormat._getMessage(messages['1']);
	        } else if (val >= 10 && val <= 20) {
	          message = thisDateTimeFormat._getMessage(messages['10_20']);
	        } else if (dec == 1) {
	          message = thisDateTimeFormat._getMessage(messages['MOD_1']);
	        } else if (2 <= dec && dec <= 4) {
	          message = thisDateTimeFormat._getMessage(messages['MOD_2_4']);
	        } else {
	          message = thisDateTimeFormat._getMessage(messages['MOD_OTHER']);
	        }
	        return message.replace(/#VALUE#/g, value);
	      }
	      function _replaceDateFormat(match, matchFull) {
	        if (dateFormats[match]) {
	          return dateFormats[match]();
	        } else {
	          return matchFull;
	        }
	      }
	      function intval(number) {
	        return number >= 0 ? Math.floor(number) : Math.ceil(number);
	      }
	    }
	  }]);
	  return DateTimeFormat;
	}();
	babelHelpers.defineProperty(DateTimeFormat, "AM_PM_MODE", {
	  UPPER: 1,
	  LOWER: 2,
	  NONE: false
	});
	babelHelpers.defineProperty(DateTimeFormat, "convertBitrixFormat", convertBitrixFormat);
	babelHelpers.defineProperty(DateTimeFormat, "getFormat", getFormat);

	const cache = new main_core.Cache.MemoryCache();

	/**
	 * @memberOf BX.Main.Timezone
	 *
	 * WARNING! Don't use this class or any classes from Timezone namespace on sites without Bitrix Framework.
	 * It is not designed to handle this case and will definitely break.
	 */
	const Offset = {
	  get SERVER_TO_UTC() {
	    return cache.remember('SERVER_TO_UTC', () => {
	      return main_core.Text.toInteger(main_core.Loc.getMessage('SERVER_TZ_OFFSET'));
	    });
	  },
	  get USER_TO_SERVER() {
	    return cache.remember('USER_TO_SERVER', () => {
	      return main_core.Text.toInteger(main_core.Loc.getMessage('USER_TZ_OFFSET'));
	    });
	  },
	  // Date returns timezone offset in minutes by default, change it to seconds
	  // Also offset is negative in UTC+ timezones and positive in UTC- timezones.
	  // By convention Bitrix uses the opposite approach, so change offset sign.
	  get BROWSER_TO_UTC() {
	    return cache.remember('BROWSER_TO_UTC', () => {
	      return main_core.Text.toInteger(new Date().getTimezoneOffset() * 60);
	    });
	  }
	};
	Object.freeze(Offset);

	function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess(receiver, classConstructor); return method; }
	function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } }

	/**
	 * @memberOf BX.Main.Timezone
	 *
	 * WARNING! Don't use this class or any classes from Timezone namespace on sites without Bitrix Framework.
	 * It is not designed to handle this case and will definitely break.
	 */
	let BrowserTime = /*#__PURE__*/function () {
	  function BrowserTime() {
	    babelHelpers.classCallCheck(this, BrowserTime);
	  }
	  babelHelpers.createClass(BrowserTime, null, [{
	    key: "getTimestamp",
	    /**
	     * Returns timestamp with current time in browser timezone.
	     *
	     * @returns {number} timestamp in seconds
	     */
	    value: function getTimestamp() {
	      return Math.round(Date.now() / 1000);
	    }
	    /**
	     * Returns Date object with current time in browser timezone.
	     *
	     * @returns {Date}
	     */
	  }, {
	    key: "getDate",
	    value: function getDate() {
	      return new Date(this.getTimestamp() * 1000);
	    }
	    /**
	     * Converts timestamp in browser timezone to timestamp in user timezone.
	     *
	     * @param browserTimestamp timestamp in browser timezone in seconds
	     * @returns {number} timestamp in user timezone in seconds
	     */
	  }, {
	    key: "toUser",
	    value: function toUser(browserTimestamp) {
	      return main_core.Text.toInteger(browserTimestamp) + Offset.USER_TO_SERVER;
	    }
	    /**
	     * Converts timestamp in browser timezone to timestamp in server timezone.
	     *
	     * @param browserTimestamp timestamp in browser timezone in seconds
	     * @returns {number} timestamp in server timezone in seconds
	     */
	  }, {
	    key: "toServer",
	    value: function toServer(browserTimestamp) {
	      return _classStaticPrivateMethodGet(this, BrowserTime, _toUTC).call(this, browserTimestamp) + Offset.SERVER_TO_UTC;
	    }
	  }]);
	  return BrowserTime;
	}();
	function _toUTC(browserTimestamp) {
	  return main_core.Text.toInteger(browserTimestamp) - Offset.BROWSER_TO_UTC;
	}

	/**
	 * @memberOf BX.Main.Timezone
	 *
	 * WARNING! Don't use this class or any classes from Timezone namespace on sites without Bitrix Framework.
	 * It is not designed to handle this case and will definitely break.
	 *
	 * ATTENTION! In Bitrix user timezone !== browser timezone. Users can change their timezone from their profile settings
	 * and the timezone will be different from browser timezone.
	 */
	let UserTime = /*#__PURE__*/function () {
	  function UserTime() {
	    babelHelpers.classCallCheck(this, UserTime);
	  }
	  babelHelpers.createClass(UserTime, null, [{
	    key: "getTimestamp",
	    /**
	     * Returns timestamp with current time in user timezone.
	     *
	     * @returns {number} timestamp in seconds
	     */
	    value: function getTimestamp() {
	      return BrowserTime.toUser(BrowserTime.getTimestamp());
	    }
	    /**
	     * Returns Date object with current time in user timezone. If you need to get 'now' in a user's perspective,
	     * use this method instead of 'new Date()'.
	     *
	     * Note that 'getTimezoneOffset' will not return correct user timezone, its always returns browser offset
	     *
	     * @returns {Date}
	     */
	  }, {
	    key: "getDate",
	    value: function getDate() {
	      return new Date(this.getTimestamp() * 1000);
	    }
	    /**
	     * Converts timestamp in user timezone to timestamp in browser timezone.
	     *
	     * @param userTimestamp timestamp in user timezone in seconds
	     * @returns {number} timestamp in browser timezone in seconds
	     */
	  }, {
	    key: "toBrowser",
	    value: function toBrowser(userTimestamp) {
	      return main_core.Text.toInteger(userTimestamp) + Offset.BROWSER_TO_UTC - Offset.SERVER_TO_UTC - Offset.USER_TO_SERVER;
	    }
	    /**
	     * Converts timestamp in user timezone to timestamp in server timezone.
	     *
	     * @param userTimestamp timestamp in user timezone in seconds
	     * @returns {number} timestamp in server timezone in seconds
	     */
	  }, {
	    key: "toServer",
	    value: function toServer(userTimestamp) {
	      return main_core.Text.toInteger(userTimestamp) - Offset.USER_TO_SERVER;
	    }
	  }]);
	  return UserTime;
	}();

	/**
	 * @memberOf BX.Main.Timezone
	 *
	 * WARNING! Don't use this class or any classes from Timezone namespace on sites without Bitrix Framework.
	 * It is not designed to handle this case and will definitely break.
	 */
	let ServerTime = /*#__PURE__*/function () {
	  function ServerTime() {
	    babelHelpers.classCallCheck(this, ServerTime);
	  }
	  babelHelpers.createClass(ServerTime, null, [{
	    key: "getTimestamp",
	    /**
	     * Returns timestamp with current time in server timezone.
	     *
	     * @returns {number} timestamp in seconds
	     */
	    value: function getTimestamp() {
	      return BrowserTime.toServer(BrowserTime.getTimestamp());
	    }
	    /**
	     * Returns Date object with current time in server timezone.
	     *
	     * Note that 'getTimezoneOffset' will not return correct server timezone, its always returns browser offset
	     *
	     * @returns {Date}
	     */
	  }, {
	    key: "getDate",
	    value: function getDate() {
	      return new Date(this.getTimestamp() * 1000);
	    }
	    /**
	     * Converts timestamp in server timezone to timestamp in user timezone.
	     *
	     * @param serverTimestamp timestamp in server timezone in seconds
	     * @returns {number} timestamp in user timezone in seconds
	     */
	  }, {
	    key: "toUser",
	    value: function toUser(serverTimestamp) {
	      return main_core.Text.toInteger(serverTimestamp) + Offset.USER_TO_SERVER;
	    }
	    /**
	     * Converts timestamp in server timezone to timestamp in browser timezone.
	     *
	     * @param serverTimestamp timestamp in server timezone in seconds
	     * @returns {number} timestamp in browser timezone in seconds
	     */
	  }, {
	    key: "toBrowser",
	    value: function toBrowser(serverTimestamp) {
	      return main_core.Text.toInteger(serverTimestamp) + Offset.BROWSER_TO_UTC - Offset.SERVER_TO_UTC;
	    }
	  }]);
	  return ServerTime;
	}();

	//compatibility alias
	const Date$1 = DateTimeFormat;
	const Timezone = Object.freeze({
	  Offset,
	  BrowserTime,
	  UserTime,
	  ServerTime
	});

	exports.DateTimeFormat = DateTimeFormat;
	exports.Date = Date$1;
	exports.Timezone = Timezone;

}((this.BX.Main = this.BX.Main || {}),BX));
//# sourceMappingURL=main.date.js.map