/**
 * DevExtreme (esm/localization/ldml/date.formatter.js)
 * Version: 22.2.7 (build 23185-0311)
 * Build date: Tue Jul 04 2023
 *
 * Copyright (c) 2012 - 2023 Developer Express Inc. ALL RIGHTS RESERVED
 * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
 */
function leftPad(text, length) {
    while (text.length < length) {
        text = "0" + text
    }
    return text
}
var FORMAT_TYPES = {
    3: "abbreviated",
    4: "wide",
    5: "narrow"
};
var LDML_FORMATTERS = {
    y: function(date, count, useUtc) {
        var year = date[useUtc ? "getUTCFullYear" : "getFullYear"]();
        if (2 === count) {
            year %= 100
        }
        return leftPad(year.toString(), count)
    },
    M: function(date, count, useUtc, dateParts) {
        var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
        var formatType = FORMAT_TYPES[count];
        if (formatType) {
            return dateParts.getMonthNames(formatType, "format")[month]
        }
        return leftPad((month + 1).toString(), Math.min(count, 2))
    },
    L: function(date, count, useUtc, dateParts) {
        var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
        var formatType = FORMAT_TYPES[count];
        if (formatType) {
            return dateParts.getMonthNames(formatType, "standalone")[month]
        }
        return leftPad((month + 1).toString(), Math.min(count, 2))
    },
    Q: function(date, count, useUtc, dateParts) {
        var month = date[useUtc ? "getUTCMonth" : "getMonth"]();
        var quarter = Math.floor(month / 3);
        var formatType = FORMAT_TYPES[count];
        if (formatType) {
            return dateParts.getQuarterNames(formatType)[quarter]
        }
        return leftPad((quarter + 1).toString(), Math.min(count, 2))
    },
    E: function(date, count, useUtc, dateParts) {
        var day = date[useUtc ? "getUTCDay" : "getDay"]();
        var formatType = FORMAT_TYPES[count < 3 ? 3 : count];
        return dateParts.getDayNames(formatType)[day]
    },
    a: function(date, count, useUtc, dateParts) {
        var hours = date[useUtc ? "getUTCHours" : "getHours"]();
        var period = hours < 12 ? 0 : 1;
        var formatType = FORMAT_TYPES[count];
        return dateParts.getPeriodNames(formatType)[period]
    },
    d: function(date, count, useUtc) {
        return leftPad(date[useUtc ? "getUTCDate" : "getDate"]().toString(), Math.min(count, 2))
    },
    H: function(date, count, useUtc) {
        return leftPad(date[useUtc ? "getUTCHours" : "getHours"]().toString(), Math.min(count, 2))
    },
    h: function(date, count, useUtc) {
        var hours = date[useUtc ? "getUTCHours" : "getHours"]();
        return leftPad((hours % 12 || 12).toString(), Math.min(count, 2))
    },
    m: function(date, count, useUtc) {
        return leftPad(date[useUtc ? "getUTCMinutes" : "getMinutes"]().toString(), Math.min(count, 2))
    },
    s: function(date, count, useUtc) {
        return leftPad(date[useUtc ? "getUTCSeconds" : "getSeconds"]().toString(), Math.min(count, 2))
    },
    S: function(date, count, useUtc) {
        return leftPad(date[useUtc ? "getUTCMilliseconds" : "getMilliseconds"]().toString(), 3).substr(0, count)
    },
    x: function(date, count, useUtc) {
        var timezoneOffset = useUtc ? 0 : date.getTimezoneOffset();
        var signPart = timezoneOffset > 0 ? "-" : "+";
        var timezoneOffsetAbs = Math.abs(timezoneOffset);
        var hours = Math.floor(timezoneOffsetAbs / 60);
        var minutes = timezoneOffsetAbs % 60;
        var hoursPart = leftPad(hours.toString(), 2);
        var minutesPart = leftPad(minutes.toString(), 2);
        return signPart + hoursPart + (count >= 3 ? ":" : "") + (count > 1 || minutes ? minutesPart : "")
    },
    X: function(date, count, useUtc) {
        if (useUtc || !date.getTimezoneOffset()) {
            return "Z"
        }
        return LDML_FORMATTERS.x(date, count, useUtc)
    },
    Z: function(date, count, useUtc) {
        return LDML_FORMATTERS.X(date, count >= 5 ? 3 : 2, useUtc)
    }
};
export var getFormatter = function(format, dateParts) {
    return function(date) {
        var charIndex;
        var formatter;
        var char;
        var charCount = 0;
        var isEscaping = false;
        var isCurrentCharEqualsNext;
        var result = "";
        if (!date) {
            return null
        }
        if (!format) {
            return date
        }
        var useUtc = "Z" === format[format.length - 1] || "'Z'" === format.slice(-3);
        for (charIndex = 0; charIndex < format.length; charIndex++) {
            char = format[charIndex];
            formatter = LDML_FORMATTERS[char];
            isCurrentCharEqualsNext = char === format[charIndex + 1];
            charCount++;
            if (!isCurrentCharEqualsNext) {
                if (formatter && !isEscaping) {
                    result += formatter(date, charCount, useUtc, dateParts)
                }
                charCount = 0
            }
            if ("'" === char && !isCurrentCharEqualsNext) {
                isEscaping = !isEscaping
            } else if (isEscaping || !formatter) {
                result += char
            }
            if ("'" === char && isCurrentCharEqualsNext) {
                charIndex++
            }
        }
        return result
    }
};
