{"version":3,"sources":["jsdelivr-header.js","/npm/jsuites@6.4.0/dist/jsuites.js"],"names":[],"mappings":"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,KACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,KAAQ,CACJ,KACA,IACA,KAEJ,KAAQ,CACJ,OACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,KAAQ,CACJ,IACA,IACA,KAEJ,KAAQ,CACJ,KACA,IACA,KAEJ,KAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,KAAQ,CACJ,MACA,IACA,KAEJ,KAAQ,CACJ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","file":"/npm/jsuites@6.4.0/dist/jsuites.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /npm/jsuites@6.4.0/dist/jsuites.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.jSuites = factory();\n}(this, (function () {\n\nvar jSuites;\n/******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 791:\n/***/ (function(module) {\n\n/**\r\n * (c) jSuites Javascript Plugins and Web Components (v6)\r\n *\r\n * Website: https://jsuites.net\r\n * Description: Create amazing web based applications.\r\n *\r\n * MIT License\r\n */\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    'use strict';\r\n\r\n    const Helpers = (function () {\r\n        const component = {};\r\n\r\n        // Excel like dates\r\n        const excelInitialTime = Date.UTC(1900, 0, 0);\r\n        const excelLeapYearBug = Date.UTC(1900, 1, 29);\r\n        const millisecondsPerDay = 86400000;\r\n\r\n        // Transform in two digits\r\n        component.two = function (value) {\r\n            value = '' + value;\r\n            if (value.length === 1) {\r\n                value = '0' + value;\r\n            }\r\n            return value;\r\n        };\r\n\r\n        component.isValidDate = function (d) {\r\n            return d instanceof Date && !isNaN(d.getTime());\r\n        };\r\n\r\n        component.isValidDateFormat = function(date) {\r\n            if (typeof date === 'string') {\r\n                // Check format: YYYY-MM-DD using regex\r\n                const match = date.substring(0, 10).match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n                if (match) {\r\n                    const year = Number(match[1]);\r\n                    const month = Number(match[2]) - 1;\r\n                    const day = Number(match[3]);\r\n                    const parsed = new Date(Date.UTC(year, month, day));\r\n                    // Return\r\n                    return parsed.getUTCFullYear() === year && parsed.getUTCMonth() === month && parsed.getUTCDate() === day;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        component.toString = function (date, dateOnly) {\r\n            let y = null;\r\n            let m = null;\r\n            let d = null;\r\n            let h = null;\r\n            let i = null;\r\n            let s = null;\r\n\r\n            if (Array.isArray(date)) {\r\n                y = date[0];\r\n                m = date[1];\r\n                d = date[2];\r\n                h = date[3];\r\n                i = date[4];\r\n                s = date[5];\r\n            } else {\r\n                if (!date) {\r\n                    date = new Date();\r\n                }\r\n                y = date.getUTCFullYear();\r\n                m = date.getUTCMonth() + 1;\r\n                d = date.getUTCDate();\r\n                h = date.getUTCHours();\r\n                i = date.getUTCMinutes();\r\n                s = date.getUTCSeconds();\r\n            }\r\n\r\n            if (dateOnly === true) {\r\n                return component.two(y) + '-' + component.two(m) + '-' + component.two(d);\r\n            } else {\r\n                return (\r\n                    component.two(y) + '-' + component.two(m) + '-' + component.two(d) + ' ' + component.two(h) + ':' + component.two(i) + ':' + component.two(s)\r\n                );\r\n            }\r\n        };\r\n\r\n        component.toArray = function (value) {\r\n            let date = value.split(value.indexOf('T') !== -1 ? 'T' : ' ');\r\n            let time = date[1];\r\n\r\n            date = date[0].split('-');\r\n            let y = parseInt(date[0]);\r\n            let m = parseInt(date[1]);\r\n            let d = parseInt(date[2]);\r\n            let h = 0;\r\n            let i = 0;\r\n\r\n            if (time) {\r\n                time = time.split(':');\r\n                h = parseInt(time[0]);\r\n                i = parseInt(time[1]);\r\n            }\r\n            return [y, m, d, h, i, 0];\r\n        };\r\n\r\n        component.arrayToStringDate = function (arr) {\r\n            return component.toString(arr, false);\r\n        };\r\n\r\n        component.dateToNum = function (jsDate) {\r\n            if (typeof jsDate === 'string') {\r\n                jsDate = new Date(jsDate.trim().replace(' ', 'T') + 'Z');\r\n            }\r\n            let jsDateInMilliseconds = jsDate.getTime();\r\n            if (jsDateInMilliseconds >= excelLeapYearBug) {\r\n                jsDateInMilliseconds += millisecondsPerDay;\r\n            }\r\n            jsDateInMilliseconds -= excelInitialTime;\r\n\r\n            return jsDateInMilliseconds / millisecondsPerDay;\r\n        };\r\n\r\n        component.numToDate = function (excelSerialNumber, asArray) {\r\n            // allow 0; only bail on null/undefined/empty\r\n            if (excelSerialNumber === null || excelSerialNumber === undefined || excelSerialNumber === '') {\r\n                return '';\r\n            }\r\n\r\n            const MS_PER_DAY = 86_400_000;\r\n            const SEC_PER_DAY = 86_400;\r\n\r\n            // Excel day 0 is 1899-12-31 (with the fake 1900-02-29 at serial 60)\r\n            const EXCEL_DAY0_UTC_MS = Date.UTC(1899, 11, 31);\r\n\r\n            let wholeDays = Math.floor(excelSerialNumber);\r\n            let fractionalDay = excelSerialNumber - wholeDays;\r\n\r\n            // Fix the 1900 leap-year bug: shift serials >= 60 back one day\r\n            if (wholeDays >= 60) wholeDays -= 1;\r\n\r\n            // Build midnight UTC of the day\r\n            let ms = EXCEL_DAY0_UTC_MS + wholeDays * MS_PER_DAY;\r\n\r\n            // Add time part using integer seconds to avoid FP jitter\r\n            const seconds = Math.round(fractionalDay * SEC_PER_DAY);\r\n            ms += seconds * 1000;\r\n\r\n            const d = new Date(ms);\r\n\r\n            const arr = [\r\n                d.getUTCFullYear(),\r\n                component.two(d.getUTCMonth() + 1),\r\n                component.two(d.getUTCDate()),\r\n                component.two(d.getUTCHours()),\r\n                component.two(d.getUTCMinutes()),\r\n                component.two(d.getUTCSeconds()),\r\n            ];\r\n\r\n            return asArray ? arr : component.toString(arr, false);\r\n        };\r\n\r\n        component.prettify = function (d, texts) {\r\n            if (!texts) {\r\n                texts = {\r\n                    justNow: 'Just now',\r\n                    xMinutesAgo: '{0}m ago',\r\n                    xHoursAgo: '{0}h ago',\r\n                    xDaysAgo: '{0}d ago',\r\n                    xWeeksAgo: '{0}w ago',\r\n                    xMonthsAgo: '{0} mon ago',\r\n                    xYearsAgo: '{0}y ago',\r\n                };\r\n            }\r\n\r\n            if (d.indexOf('GMT') === -1 && d.indexOf('Z') === -1) {\r\n                d += ' GMT';\r\n            }\r\n\r\n            let d1 = new Date();\r\n            let d2 = new Date(d);\r\n            let total = parseInt((d1 - d2) / 1000 / 60);\r\n\r\n            const format = (t, o) => {\r\n                return t.replace('{0}', o);\r\n            };\r\n\r\n            if (!total) {\r\n                return texts.justNow;\r\n            } else if (total < 90) {\r\n                return format(texts.xMinutesAgo, total);\r\n            } else if (total < 1440) {\r\n                // One day\r\n                return format(texts.xHoursAgo, Math.round(total / 60));\r\n            } else if (total < 20160) {\r\n                // 14 days\r\n                return format(texts.xDaysAgo, Math.round(total / 1440));\r\n            } else if (total < 43200) {\r\n                // 30 days\r\n                return format(texts.xWeeksAgo, Math.round(total / 10080));\r\n            } else if (total < 1036800) {\r\n                // 24 months\r\n                return format(texts.xMonthsAgo, Math.round(total / 43200));\r\n            } else {\r\n                // 24 months+\r\n                return format(texts.xYearsAgo, Math.round(total / 525600));\r\n            }\r\n        };\r\n\r\n        component.prettifyAll = function () {\r\n            let elements = document.querySelectorAll('.prettydate');\r\n            for (let i = 0; i < elements.length; i++) {\r\n                if (elements[i].getAttribute('data-date')) {\r\n                    elements[i].innerHTML = component.prettify(elements[i].getAttribute('data-date'));\r\n                } else {\r\n                    if (elements[i].innerHTML) {\r\n                        elements[i].setAttribute('title', elements[i].innerHTML);\r\n                        elements[i].setAttribute('data-date', elements[i].innerHTML);\r\n                        elements[i].innerHTML = component.prettify(elements[i].innerHTML);\r\n                    }\r\n                }\r\n            }\r\n        };\r\n\r\n        // Compatibility with jSuites\r\n        component.now = component.toString;\r\n\r\n        const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n        const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n\r\n        const translate = function (t) {\r\n            if (typeof document !== 'undefined' && document.dictionary) {\r\n                return document.dictionary[t] || t;\r\n            } else {\r\n                return t;\r\n            }\r\n        };\r\n\r\n        Object.defineProperty(component, 'weekdays', {\r\n            get: function () {\r\n                return weekdays.map(function (v) {\r\n                    return translate(v);\r\n                });\r\n            },\r\n        });\r\n\r\n        Object.defineProperty(component, 'weekdaysShort', {\r\n            get: function () {\r\n                return weekdays.map(function (v) {\r\n                    return translate(v).substring(0, 3);\r\n                });\r\n            },\r\n        });\r\n\r\n        Object.defineProperty(component, 'months', {\r\n            get: function () {\r\n                return months.map(function (v) {\r\n                    return translate(v);\r\n                });\r\n            },\r\n        });\r\n\r\n        Object.defineProperty(component, 'monthsShort', {\r\n            get: function () {\r\n                return months.map(function (v) {\r\n                    return translate(v).substring(0, 3);\r\n                });\r\n            },\r\n        });\r\n\r\n        return component;\r\n    })();\r\n\r\n    const Mask = (function() {\r\n        // Currency\r\n        const tokens = {\r\n            // Escape\r\n            escape: [ '\\\\\\\\[.\\\\s\\\\S]' ],\r\n            // Text\r\n            text: [ '@', '&' ],\r\n            // Number\r\n            fraction: [ '#{0,1}.*?\\\\?+\\\\/[0-9?]+' ],\r\n            // Currency tokens\r\n            currency: [ '#(.{1})##0?(.{1}[0#]+)?( ?;(.*)?)?' ],\r\n            // Scientific\r\n            scientific: [ '[0#]+([.,]{1}0*#*)?E{1}\\\\+0+' ],\r\n            // Percentage\r\n            percentage: [ '[0#]+([.,]{1}0*#*)?%' ],\r\n            // Number\r\n            numeric: [ '[0#]+([.,]{1}0*#*)?', '#+' ],\r\n            // Data tokens\r\n            datetime: [ 'YYYY', 'YYY', 'YY', 'MMMMM', 'MMMM', 'MMM', 'MM', 'DDDDD', 'DDDD', 'DDD', 'DD', 'DY', 'DAY', 'WD', 'D', 'Q', 'MONTH', 'MON', 'HH24', 'HH12', 'HH', '\\\\[H\\\\]', 'H', 'AM/PM', 'MI', 'SS', 'MS', 'S', 'Y', 'M', 'I' ],\r\n            // Other\r\n            general: [ 'A', '0', '\\\\?', '\\\\*', ',,M', ',,,B', '[a-zA-Z\\\\$]+', '_[.\\\\s\\\\S]', '\\\\(', '\\\\)', '.']\r\n        }\r\n\r\n        const countryCodes = {\r\n            \"0409\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0809\": [\r\n                \"£\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0C09\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1009\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1409\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1809\": [\r\n                \"€\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1C09\": [\r\n                \"R\",\r\n                \" \",\r\n                \".\"\r\n            ],\r\n            \"040C\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"080C\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"100C\": [\r\n                \"CHF\",\r\n                \"'\",\r\n                \".\"\r\n            ],\r\n            \"140C\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0C0C\": [\r\n                \"$\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0407\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0C07\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0807\": [\r\n                \"CHF\",\r\n                \"'\",\r\n                \".\"\r\n            ],\r\n            \"1007\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0413\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0813\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0410\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0810\": [\r\n                \"CHF\",\r\n                \"'\",\r\n                \".\"\r\n            ],\r\n            \"0C0A\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"080A\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2C0A\": [\r\n                \"$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"340A\": [\r\n                \"$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"240A\": [\r\n                \"$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"300A\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"280A\": [\r\n                \"S/\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"200A\": [\r\n                \"Bs.\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"140A\": [\r\n                \"₡\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"100A\": [\r\n                \"Q\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1C0A\": [\r\n                \"RD$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3C0A\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"440A\": [\r\n                \"C$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"4C0A\": [\r\n                \"B/.\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"480A\": [\r\n                \"L\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0816\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0416\": [\r\n                \"R$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0406\": [\r\n                \"kr\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"041D\": [\r\n                \"kr\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0414\": [\r\n                \"kr\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"040B\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"040F\": [\r\n                \"kr\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0415\": [\r\n                \"zł\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0405\": [\r\n                \"Kč\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"041B\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"040E\": [\r\n                \"Ft\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0424\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"041A\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0418\": [\r\n                \"lei\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0402\": [\r\n                \"лв.\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0425\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0426\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0427\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0408\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"043A\": [\r\n                \"€\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"043C\": [\r\n                \"€\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0419\": [\r\n                \"₽\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0422\": [\r\n                \"₴\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0423\": [\r\n                \"Br\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"041F\": [\r\n                \"₺\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"042C\": [\r\n                \"₼\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"042F\": [\r\n                \"ден\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0441\": [\r\n                \"Lek\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"141A\": [\r\n                \"KM\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0401\": [\r\n                \"ر.س\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0C01\": [\r\n                \"ج.م\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1401\": [\r\n                \"دج\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"1801\": [\r\n                \"د.م.\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"1C01\": [\r\n                \"د.ت\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"2001\": [\r\n                \"﷼\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3401\": [\r\n                \"KD\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3801\": [\r\n                \"د.إ\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3C01\": [\r\n                \"BD\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"4001\": [\r\n                \"ر.ق\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2801\": [\r\n                \"£\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2C01\": [\r\n                \"د.ا\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3001\": [\r\n                \"ل.ل\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2401\": [\r\n                \"﷼\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1001\": [\r\n                \"ل.د\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0429\": [\r\n                \"﷼\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"040D\": [\r\n                \"₪\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0439\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0445\": [\r\n                \"৳\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0461\": [\r\n                \"रु\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"045B\": [\r\n                \"Rs\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"044E\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0444\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0449\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"044B\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0421\": [\r\n                \"Rp\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"043E\": [\r\n                \"RM\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0464\": [\r\n                \"₱\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"041E\": [\r\n                \"฿\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"042A\": [\r\n                \"₫\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0453\": [\r\n                \"៛\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0454\": [\r\n                \"₭\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0455\": [\r\n                \"K\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0404\": [\r\n                \"NT$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0C04\": [\r\n                \"HK$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0804\": [\r\n                \"¥\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0411\": [\r\n                \"¥\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0412\": [\r\n                \"₩\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0437\": [\r\n                \"₾\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"042B\": [\r\n                \"֏\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"043F\": [\r\n                \"₸\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0443\": [\r\n                \"so'm\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0428\": [\r\n                \"ЅМ\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0440\": [\r\n                \"сом\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0466\": [\r\n                \"₦\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0469\": [\r\n                \"₦\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0468\": [\r\n                \"GH₵\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"180C\": [\r\n                \"F CFA\",\r\n                \" \",\r\n                \",\"\r\n            ]\r\n        }\r\n\r\n        /**\r\n         * Detect decimal and thousand separators in a mask pattern\r\n         */\r\n        const detectMaskSeparators = function(mask) {\r\n            // Decimal: separator in pattern 0[sep]0+ (can have trailing chars like _ )\r\n            // Look for the rightmost occurrence of this pattern\r\n            const decimalMatches = mask.match(/0([.,\\s'])0+/g);\r\n            let decimal = null;\r\n            if (decimalMatches && decimalMatches.length > 0) {\r\n                // Get the last match (rightmost decimal pattern)\r\n                const lastMatch = decimalMatches[decimalMatches.length - 1];\r\n                const sepMatch = lastMatch.match(/0([.,\\s'])0/);\r\n                decimal = sepMatch ? sepMatch[1] : null;\r\n            }\r\n\r\n            // Thousand: other separator that appears in #[sep]# or 0[sep]# patterns\r\n            let thousand = null;\r\n            for (const sep of [',', '.', ' ', \"'\"]) {\r\n                if (sep !== decimal) {\r\n                    const escapedSep = sep === '.' ? '\\\\.' : sep;\r\n                    const regex = new RegExp('[#0]' + escapedSep + '[#0]');\r\n                    if (regex.test(mask)) {\r\n                        thousand = sep;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return { decimal, thousand };\r\n        }\r\n\r\n        /**\r\n         * Transform Excel currency locale patterns like [$$-409]#,##0.00\r\n         * countryCodes format: { \"0409\": [\"$\", \",\", \".\"] } // [currency, thousand, decimal]\r\n         * [$$ = use locale's default currency, [$X = use literal X]\r\n         */\r\n        const transformExcelLocaleMask = function(mask) {\r\n            // Handle multiple patterns (e.g., positive;negative)\r\n            // Accept any alphanumeric for locale code to handle invalid codes gracefully\r\n            const pattern = /\\[\\$(.?)-([0-9A-Z]+)\\]/gi;\r\n            let transformation = null;\r\n\r\n            // Find first pattern to determine locale\r\n            const firstMatch = mask.match(/\\[\\$(.?)-([0-9A-Z]+)\\]/i);\r\n            if (!firstMatch) return mask;\r\n\r\n            const symbolChar = firstMatch[1] || '';\r\n            let localeCode = firstMatch[2].toUpperCase();\r\n\r\n            // Pad with leading zero if 3 digits (e.g., \"409\" → \"0409\")\r\n            if (localeCode.length === 3) {\r\n                localeCode = '0' + localeCode;\r\n            }\r\n\r\n            // Look up locale in countryCodes\r\n            const localeData = countryCodes[localeCode];\r\n\r\n            if (!localeData) {\r\n                // Unknown locale - fallback: strip ALL patterns, use literal symbol (or $)\r\n                const fallbackSymbol = symbolChar || '';\r\n                // Replace all occurrences of the pattern with the symbol\r\n                return mask.replace(/\\[\\$(.?)-([0-9A-Z]+)\\]/gi, fallbackSymbol);\r\n            }\r\n\r\n            // Extract from array: [currency, thousand, decimal]\r\n            const localeCurrency = localeData[0];\r\n            const localeThousand = localeData[1];\r\n            const localeDecimal = localeData[2];\r\n\r\n            // Determine currency symbol: $$ means use locale's default, else use literal\r\n            let currencySymbol;\r\n            if (symbolChar === '$') {\r\n                // $$ pattern - use locale's default currency\r\n                currencySymbol = localeCurrency;\r\n            } else {\r\n                // Literal symbol provided (e.g., [$€-407])\r\n                currencySymbol = symbolChar;\r\n            }\r\n\r\n            // Replace all locale patterns with currency symbol\r\n            let result = mask.replace(pattern, currencySymbol);\r\n\r\n            // Detect current separators in mask (after removing patterns)\r\n            const current = detectMaskSeparators(result);\r\n\r\n            // Transform separators to match locale using placeholders to avoid conflicts\r\n            const temp1 = '\\uFFF0';  // Placeholder for thousand\r\n            const temp2 = '\\uFFF1';  // Placeholder for decimal\r\n\r\n            // Step 1: Replace current separators with placeholders\r\n            if (current.thousand && current.thousand !== localeThousand) {\r\n                const from = current.thousand === '.' ? '\\\\.' : (current.thousand === ' ' ? ' ' : current.thousand);\r\n                result = result.replace(new RegExp(from, 'g'), temp1);\r\n            }\r\n            if (current.decimal && current.decimal !== localeDecimal) {\r\n                const from = current.decimal === '.' ? '\\\\.' : (current.decimal === ' ' ? ' ' : current.decimal);\r\n                result = result.replace(new RegExp(from, 'g'), temp2);\r\n            }\r\n\r\n            // Step 2: Replace placeholders with target separators\r\n            result = result.replace(new RegExp(temp1, 'g'), localeThousand);\r\n            result = result.replace(new RegExp(temp2, 'g'), localeDecimal);\r\n\r\n            return result;\r\n        }\r\n\r\n        // All expressions\r\n        const allExpressions = [].concat(tokens.escape, tokens.fraction, tokens.currency, tokens.datetime, tokens.percentage, tokens.scientific, tokens.numeric, tokens.text, tokens.general).join('|');\r\n\r\n        // Pre-compile all regexes once at initialization for better performance\r\n        const compiledTokens = {};\r\n        const tokenPriority = ['escape', 'fraction', 'currency', 'scientific', 'percentage', 'numeric', 'datetime', 'text', 'general'];\r\n\r\n        // Cache for getMethod results\r\n        const methodCache = {};\r\n        // Cache for getTokens results\r\n        const tokensCache = {};\r\n        // Cache for autoCasting results\r\n        const autoCastingCache = {};\r\n\r\n        // Initialize compiled regexes\r\n        for (const type of tokenPriority) {\r\n            compiledTokens[type] = tokens[type].map(pattern => ({\r\n                regex: new RegExp('^' + pattern + '$', 'i'),\r\n                method: pattern\r\n            }));\r\n        }\r\n\r\n        // Pre-compile regex for getTokens function\r\n        const allExpressionsRegex = new RegExp(allExpressions, 'gi');\r\n        const hiddenCaret = \"\\u200B\";\r\n        // Locale for date parsing\r\n        const userLocale = (typeof navigator !== 'undefined' && navigator.language) || 'en-US';\r\n\r\n        // Helpers\r\n        const focus = function(el) {\r\n            if (el.textContent.length) {\r\n                // Handle contenteditable elements\r\n                const range = document.createRange();\r\n                const sel = window.getSelection();\r\n\r\n                let node = el;\r\n                // Go as deep as possible to the last text node\r\n                while (node.lastChild) node = node.lastChild;\r\n                // Ensure it's a text node\r\n                if (node.nodeType === Node.TEXT_NODE) {\r\n                    range.setStart(node, node.length);\r\n                } else {\r\n                    range.setStart(node, node.childNodes.length);\r\n                }\r\n                range.collapse(true);\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n\r\n                el.scrollLeft = el.scrollWidth;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Returns if the given value is considered blank\r\n         */\r\n        const isBlank = function(v) {\r\n            return v === null || v === '' || typeof(v) === 'undefined';\r\n        }\r\n\r\n        /**\r\n         * Clean mask - extremely fast implementation using only char operations\r\n         * Removes quotes, detects parenthesis for negative numbers, and removes brackets (except time format codes)\r\n         * Sets control.parenthesisForNegativeNumbers and returns cleaned mask\r\n         */\r\n        const cleanMask = function(mask, control) {\r\n            const len = mask.length;\r\n            let result = '';\r\n\r\n            for (let i = 0; i < len; i++) {\r\n                const char = mask[i];\r\n\r\n                // Remove quotes\r\n                if (char === '\"') {\r\n                    continue;\r\n                }\r\n\r\n                // Handle brackets - remove them unless they're time format codes\r\n                if (char === '[') {\r\n                    // Check if it's a time format code: [s], [ss], [h], [hh], [m], [mm]\r\n                    let isTimeFormat = false;\r\n                    if (i + 2 < len && mask[i + 2] === ']') {\r\n                        const c = mask[i + 1];\r\n                        if (c === 's' || c === 'h' || c === 'm') {\r\n                            isTimeFormat = true;\r\n                        }\r\n                    } else if (i + 3 < len && mask[i + 3] === ']') {\r\n                        const c1 = mask[i + 1];\r\n                        const c2 = mask[i + 2];\r\n                        if ((c1 === 's' && c2 === 's') || (c1 === 'h' && c2 === 'h') || (c1 === 'm' && c2 === 'm')) {\r\n                            isTimeFormat = true;\r\n                        }\r\n                    }\r\n\r\n                    if (isTimeFormat) {\r\n                        result += char;\r\n                    } else {\r\n                        // Skip content and closing bracket\r\n                        while (i < len && mask[i] !== ']') {\r\n                            i++;\r\n                        }\r\n                        continue;\r\n                    }\r\n                }\r\n                // Check for parenthesis (not preceded by underscore and no underscore inside)\r\n                else if (char === '(') {\r\n                    if (i === 0 || mask[i - 1] !== '_') {\r\n                        let hasUnderscore = false;\r\n                        let depth = 1;\r\n                        for (let j = i + 1; j < len && depth > 0; j++) {\r\n                            if (mask[j] === '(') depth++;\r\n                            if (mask[j] === ')') depth--;\r\n                            if (mask[j] === '_') {\r\n                                hasUnderscore = true;\r\n                                break;\r\n                            }\r\n                        }\r\n                        if (! hasUnderscore) {\r\n                            control.parenthesisForNegativeNumbers = true;\r\n                        }\r\n                    }\r\n                    result += char;\r\n                } else {\r\n                    result += char;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /**\r\n         * Receives a string from a method type and returns if it's a numeric method\r\n         */\r\n        const isNumeric = function(t) {\r\n            return t === 'currency' || t === 'percentage' || t === 'numeric' || t === 'scientific';\r\n        }\r\n\r\n        const adjustPrecision = function(num) {\r\n            if (typeof num === 'number' && ! Number.isInteger(num)) {\r\n                const v = num.toString().split('.');\r\n\r\n                if (v[1] && v[1].length > 10) {\r\n                    let t0 = 0;\r\n                    const t1 = v[1][v[1].length - 2];\r\n\r\n                    if (t1 == 0 || t1 == 9) {\r\n                        for (let i = v[1].length - 2; i > 0; i--) {\r\n                            if (t0 >= 0 && v[1][i] == t1) {\r\n                                t0++;\r\n                                if (t0 > 6) {\r\n                                    break;\r\n                                }\r\n                            } else {\r\n                                t0 = 0;\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if (t0) {\r\n                            return parseFloat(parseFloat(num).toFixed(v[1].length - 1));\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return num;\r\n        }\r\n\r\n        /**\r\n         * Get the decimal defined in the mask configuration\r\n         */\r\n        const getDecimal = function(v) {\r\n            let decimal;\r\n            if (this.decimal) {\r\n                decimal = this.decimal;\r\n            } else {\r\n                if (this.locale) {\r\n                    let t = Intl.NumberFormat(this.locale).format(1.1);\r\n                    decimal = t[1];\r\n                } else {\r\n                    if (! v) {\r\n                        v = this.mask;\r\n                    }\r\n\r\n                    // Fixed regex: 0* means zero or more 0s before decimal separator\r\n                    let e = new RegExp('0*([,.])0+', 'ig');\r\n                    let t = e.exec(v);\r\n                    if (t && t[1] && t[1].length === 1) {\r\n                        decimal = t[1];\r\n                    } else {\r\n                        // Try the second pattern for # formats\r\n                        e = new RegExp('#{1}(.{1})#+', 'ig');\r\n                        t = e.exec(v);\r\n                        if (t && t[1] && t[1].length === 1) {\r\n                            if (t[1] === ',') {\r\n                                decimal = '.';\r\n                            } else if (t[1] === \"'\" || t[1] === '.') {\r\n                                decimal = ',';\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (! decimal) {\r\n                        decimal = '1.1'.toLocaleString().substring(1, 2);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (decimal) {\r\n                return decimal;\r\n            } else {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Caret position getter\r\n         * `this` in this function should be the element with a caret\r\n         */\r\n        const getCaretPosition = function(editableDiv) {\r\n            let caretPos = 0;\r\n            let sel = window.getSelection();\r\n            if (sel && sel.rangeCount > 0) {\r\n                let range = sel.getRangeAt(0);\r\n                let preRange = range.cloneRange();\r\n                preRange.selectNodeContents(editableDiv);\r\n                preRange.setEnd(range.endContainer, range.endOffset);\r\n                caretPos = preRange.toString().length;\r\n            }\r\n            return caretPos;\r\n        }\r\n\r\n        /**\r\n         * Caret position getter\r\n         * `this` in this function should be the element with a caret\r\n         */\r\n        const getCaret = function(el) {\r\n            if (el.tagName === 'DIV') {\r\n                return getCaretPosition(el);\r\n            } else {\r\n                return el.selectionStart;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Caret position setter\r\n         * `this` should be the element (input/textarea or contenteditable div)\r\n         */\r\n        const setCaret = function(index) {\r\n            if (typeof index !== 'number') index = Number(index) || 0;\r\n\r\n            if (this.tagName !== 'DIV' || this.isContentEditable !== true) {\r\n                const n = this.value ?? '';\r\n                if (index < 0) index = 0;\r\n                if (index > n.length) index = n.length;\r\n                this.focus();\r\n                this.selectionStart = index;\r\n                this.selectionEnd = index;\r\n                return;\r\n            }\r\n\r\n            // Contenteditable DIV\r\n            const el = /** @type {HTMLElement} */ (this);\r\n            const totalLen = (el.textContent || '').length;\r\n\r\n            if (index < 0) index = 0;\r\n            if (index > totalLen) index = totalLen;\r\n\r\n            const sel = window.getSelection();\r\n            if (!sel) return;\r\n\r\n            const range = document.createRange();\r\n            el.focus();\r\n\r\n            // Empty element → ensure a text node to place the caret into\r\n            if (totalLen === 0) {\r\n                if (!el.firstChild) el.appendChild(document.createTextNode(''));\r\n                // place at start\r\n                range.setStart(el.firstChild, 0);\r\n                range.collapse(true);\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n                return;\r\n            }\r\n\r\n            // If caret is at the very end, this is fastest/cleanest\r\n            if (index === totalLen) {\r\n                range.selectNodeContents(el);\r\n                range.collapse(false);\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n                return;\r\n            }\r\n\r\n            // Walk text nodes to find the node that contains the index-th character\r\n            const walker = document.createTreeWalker(\r\n                el,\r\n                NodeFilter.SHOW_TEXT,\r\n                {\r\n                    acceptNode(node) {\r\n                        // skip empty/whitespace-only nodes if you want; or just accept all text\r\n                        return node.nodeValue ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\r\n                    }\r\n                }\r\n            );\r\n\r\n            let pos = 0;\r\n            let node = walker.nextNode();\r\n            while (node) {\r\n                const nextPos = pos + node.nodeValue.length;\r\n                if (index <= nextPos) {\r\n                    const offset = index - pos; // char offset within this text node\r\n                    range.setStart(node, offset);\r\n                    range.collapse(true);\r\n                    sel.removeAllRanges();\r\n                    sel.addRange(range);\r\n                    return;\r\n                }\r\n                pos = nextPos;\r\n                node = walker.nextNode();\r\n            }\r\n\r\n            // Fallback: collapse at end if something unexpected happened\r\n            range.selectNodeContents(el);\r\n            range.collapse(false);\r\n            sel.removeAllRanges();\r\n            sel.addRange(range);\r\n        };\r\n\r\n        /**\r\n         * Methods to deal with different types of data\r\n         */\r\n        const parseMethods = {\r\n            'FIND': function(v, a) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                // TODO: tratar eventos\r\n                if (this.event && this.event.inputType && this.event.inputType.indexOf('delete') > -1) {\r\n                    this.values[this.index] += v;\r\n                    return;\r\n                }\r\n                let pos = 0;\r\n                let count = 0;\r\n                let value = (this.values[this.index] + v).toLowerCase();\r\n                for (let i = 0; i < a.length; i++) {\r\n                    if (a[i].toLowerCase().indexOf(value) === 0) {\r\n                        pos = i;\r\n                        count++;\r\n                    }\r\n                }\r\n                if (count > 1) {\r\n                    this.values[this.index] += v;\r\n                } else if (count === 1) {\r\n                    // Jump a number of chars\r\n                    let t = (a[pos].length - this.values[this.index].length) - 1;\r\n                    this.position += t;\r\n                    this.values[this.index] = a[pos];\r\n                    this.index++;\r\n                    return pos;\r\n                }\r\n            },\r\n            'YEAR': function(v, s) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (number >= 0 && number <= 10) {\r\n                    if (this.values[this.index].length < s) {\r\n                        this.values[this.index] += v;\r\n                    }\r\n                }\r\n                if (this.values[this.index].length === s) {\r\n                    let y = new Date().getFullYear().toString();\r\n                    if (s === 2) {\r\n                        y = y.substring(0,2) + this.values[this.index];\r\n                    } else if (s === 3) {\r\n                        y = y.substring(0,1) + this.values[this.index];\r\n                    } else if (s === 4) {\r\n                        y = this.values[this.index];\r\n                    }\r\n                    this.date[0] = y;\r\n                    this.index++;\r\n                }\r\n            },\r\n            'YYYY': function(v) {\r\n                parseMethods.YEAR.call(this, v, 4);\r\n            },\r\n            'YYY': function(v) {\r\n                parseMethods.YEAR.call(this, v, 3);\r\n            },\r\n            'YY': function(v) {\r\n                parseMethods.YEAR.call(this, v, 2);\r\n            },\r\n            'MMMMM': function(v) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                let value = (this.values[this.index] + v).toLowerCase();\r\n                for (var i = 0; i < Helpers.months.length; i++) {\r\n                    if (Helpers.months[i][0].toLowerCase().indexOf(value) === 0) {\r\n                        this.values[this.index] = Helpers.months[i][0];\r\n                        this.date[1] = i + 1;\r\n                        this.index++;\r\n                        break;\r\n                    }\r\n                }\r\n            },\r\n            'MMMM': function(v) {\r\n                let ret = parseMethods.FIND.call(this, v, Helpers.months);\r\n                if (typeof(ret) !== 'undefined') {\r\n                    this.date[1] = ret + 1;\r\n                }\r\n            },\r\n            'MMM': function(v) {\r\n                let ret = parseMethods.FIND.call(this, v, Helpers.monthsShort);\r\n                if (typeof(ret) !== 'undefined') {\r\n                    this.date[1] = ret + 1;\r\n                }\r\n            },\r\n            'MM': function(v, single) {\r\n                const commit = () => {\r\n                    this.date[1] = this.values[this.index];\r\n                    this.index++;\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    if (number > 1 && number < 10) {\r\n                        if (! single) {\r\n                            v = '0' + v;\r\n                        }\r\n                        this.values[this.index] = v;\r\n                        commit();\r\n                    } else if (number < 2) {\r\n                        this.values[this.index] = v;\r\n                    }\r\n                } else {\r\n                    if (this.values[this.index] == 1 && number < 3) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else if (this.values[this.index] == 0 && number > 0 && number < 10) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else {\r\n                        let test = parseInt(this.values[this.index]);\r\n                        if (test > 0 && test <= 12) {\r\n                            if (! single) {\r\n                                test = '0' + test;\r\n                            }\r\n                            this.values[this.index] = test;\r\n                            commit();\r\n                            return false;\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            'M': function(v) {\r\n                return parseMethods['MM'].call(this, v, true);\r\n            },\r\n            'MONTH': function(v) {\r\n                return parseMethods['MMMM'].call(this, v);\r\n            },\r\n            'MON': function(v) {\r\n                return parseMethods['MMM'].call(this, v);\r\n            },\r\n            'DDDD': function(v) {\r\n                return parseMethods.FIND.call(this, v, Helpers.weekdays);\r\n            },\r\n            'DDD': function(v) {\r\n                return parseMethods.FIND.call(this, v, Helpers.weekdaysShort);\r\n            },\r\n            'DD': function(v, single) {\r\n                const commit = () => {\r\n                    this.date[2] = this.values[this.index];\r\n                    this.index++;\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    if (number > 3 && number < 10) {\r\n                        if (! single) {\r\n                            v = '0' + v;\r\n                        }\r\n                        this.values[this.index] = v;\r\n                        commit();\r\n                    } else if (number < 10) {\r\n                        this.values[this.index] = v;\r\n                    }\r\n                } else {\r\n                    if (this.values[this.index] == 3 && number < 2) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else if ((this.values[this.index] == 1 || this.values[this.index] == 2) && number < 10) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else if (this.values[this.index] == 0 && number > 0 && number < 10) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else {\r\n                        let test = parseInt(this.values[this.index]);\r\n                        if (test > 0 && test <= 31) {\r\n                            if (! single) {\r\n                                test = '0' + test;\r\n                            }\r\n                            this.values[this.index] = test;\r\n                            commit();\r\n                            return false;\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            'D': function(v) {\r\n                return parseMethods['DD'].call(this, v, true);\r\n            },\r\n            'DY': function(v) {\r\n                return parseMethods['DDD'].call(this, v);\r\n            },\r\n            'DAY': function(v) {\r\n                return parseMethods['DDDD'].call(this, v);\r\n            },\r\n            'HH12': function(v, two) {\r\n                let test = false;\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    if (number > 1 && number < 10) {\r\n                        if (two) {\r\n                            v = 0 + v;\r\n                        }\r\n                        this.date[3] = this.values[this.index] = v;\r\n                        this.index++;\r\n                    } else if (number < 10) {\r\n                        this.values[this.index] = v;\r\n                    }\r\n                } else {\r\n                    if (this.values[this.index] == 1 && number < 3) {\r\n                        this.date[3] = this.values[this.index] += v;\r\n                        this.index++;\r\n                    } else if (this.values[this.index] < 1 && number < 10) {\r\n                        this.date[3] = this.values[this.index] += v;\r\n                        this.index++;\r\n                    } else {\r\n                        test = true;\r\n                    }\r\n                }\r\n\r\n                // Re-test\r\n                if (test === true) {\r\n                    var t = parseInt(this.values[this.index]);\r\n                    if (t >= 0 && t <= 12) {\r\n                        this.date[3] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'HH24': function(v, two = true) {\r\n                let test = false;\r\n\r\n                let number = parseInt(v)\r\n\r\n                if (number >= 0 && number < 10) {\r\n                    if (isBlank(this.values[this.index])) {\r\n                        if (number > 2 && number < 10) {\r\n                            if (two !== false) {\r\n                                v = 0 + v;\r\n                            }\r\n                            this.date[3] = this.values[this.index] = v;\r\n                            this.index++;\r\n                        } else if (number < 10) {\r\n                            this.values[this.index] = v;\r\n                        }\r\n                    } else {\r\n                        if (this.values[this.index] == 2 && number < 4) {\r\n                            if (two === false && this.values[this.index] === '0') {\r\n                                this.values[this.index] = '';\r\n                            }\r\n                            this.date[3] = this.values[this.index] += v;\r\n                            this.index++;\r\n                        } else if (this.values[this.index] < 2 && number < 10) {\r\n                            if (two === false && this.values[this.index] === '0') {\r\n                                this.values[this.index] = '';\r\n                            }\r\n                            this.date[3] = this.values[this.index] += v;\r\n                            this.index++;\r\n                        } else {\r\n                            test = true;\r\n                        }\r\n                    }\r\n                } else {\r\n                    test = true;\r\n                }\r\n\r\n                // Re-test\r\n                if (test === true) {\r\n                    var t = parseInt(this.values[this.index]);\r\n                    if (t >= 0 && t < 24) {\r\n                        // Pad single digit with leading zero for HH24 format\r\n                        if (two !== false && this.values[this.index] && this.values[this.index].length === 1) {\r\n                            this.values[this.index] = '0' + this.values[this.index];\r\n                        }\r\n                        this.date[3] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'HH': function(v) {\r\n                parseMethods['HH24'].call(this, v, true);\r\n            },\r\n            'H': function(v) {\r\n                parseMethods['HH24'].call(this, v, false);\r\n            },\r\n            '\\\\[H\\\\]': function(v) {\r\n                if (this.values[this.index] == undefined) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                if (v.match(/[0-9]/g)) {\r\n                    this.date[3] = this.values[this.index] += v;\r\n                } else {\r\n                    if (this.values[this.index].match(/[0-9]/g)) {\r\n                        this.date[3] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'N60': function(v, i, two) {\r\n                let test = false;\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (number >= 0 && number < 10) {\r\n                    if (isBlank(this.values[this.index])) {\r\n                        if (number > 5 && number < 10) {\r\n                            if (two) {\r\n                                v = '0' + v;\r\n                            }\r\n                            this.date[i] = this.values[this.index] = v;\r\n                            this.index++;\r\n                        } else if (number < 10) {\r\n                            this.values[this.index] = v;\r\n                        }\r\n                    } else {\r\n                        if (this.values[this.index] < 6 && number < 10) {\r\n                            if (! two && this.values[this.index] === '0') {\r\n                                this.values[this.index] = '';\r\n                            }\r\n                            this.date[i] = this.values[this.index] += v;\r\n                            this.index++;\r\n                        } else {\r\n                            test = true;\r\n                        }\r\n                    }\r\n                } else {\r\n                    test = true;\r\n                }\r\n\r\n                // Re-test\r\n                if (test === true) {\r\n                    var t = parseInt(this.values[this.index]);\r\n                    if (t >= 0 && t < 60) {\r\n                        this.date[i] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'MI': function(v) {\r\n                parseMethods.N60.call(this, v, 4, true);\r\n            },\r\n            'SS': function(v) {\r\n                parseMethods.N60.call(this, v, 5, true);\r\n            },\r\n            'I': function(v) {\r\n                parseMethods.N60.call(this, v, 4, false);\r\n            },\r\n            'S': function(v) {\r\n                parseMethods.N60.call(this, v, 5, false);\r\n            },\r\n            'AM/PM': function(v) {\r\n                if (typeof(this.values[this.index]) === 'undefined') {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                if (this.values[this.index] === '') {\r\n                    if (v.match(/a/i) && this.date[3] < 13) {\r\n                        this.values[this.index] += 'A';\r\n                    } else if (v.match(/p/i)) {\r\n                        this.values[this.index] += 'P';\r\n                    }\r\n                } else if (this.values[this.index] === 'A' || this.values[this.index] === 'P') {\r\n                    this.values[this.index] += 'M';\r\n                    this.index++;\r\n                }\r\n            },\r\n            'WD': function(v) {\r\n                if (typeof(this.values[this.index]) === 'undefined') {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (number >= 0 && number < 7) {\r\n                    this.values[this.index] = v;\r\n                }\r\n                if (this.values[this.index].length == 1) {\r\n                    this.index++;\r\n                }\r\n            },\r\n            // Numeric Methods\r\n            '[0#]+([.,]{1}0*#*)?': function(v) {\r\n                if (v === '.' && inputIsANumber(this.raw)) {\r\n                    v = this.decimal;\r\n                }\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                if (v === '-') {\r\n                    // Transform the number into negative if it is not already\r\n                    if (this.values[this.index][0] != '-') {\r\n                        this.values[this.index] = '-' + this.values[this.index];\r\n                    }\r\n                } else if (v === '+') {\r\n                    // Transform the number into positive if it is negative\r\n                    if (this.values[this.index][0] == '-') {\r\n                        this.values[this.index] = this.values[this.index].replace('-', '');\r\n                    }\r\n                } else if (v == '0') {\r\n                    // Only adds zero if there's a non-zero number before\r\n                    if (this.values[this.index] != '0' && this.values[this.index] != '-0') {\r\n                        this.values[this.index] += v;\r\n                    }\r\n                } else if (v > 0 && v < 10) {\r\n                    // Verify if there's a zero to remove it, avoiding left zeros\r\n                    if (this.values[this.index] == '0' || this.values[this.index] == '-0') {\r\n                        this.values[this.index] = this.values[this.index].replace('0', '');\r\n                    }\r\n                    this.values[this.index] += v;\r\n                } else if (v === this.decimal) {\r\n                    // Only adds decimal when there's a number value on its left\r\n                    if (! this.values[this.index].includes(this.decimal)) {\r\n                        if (! this.values[this.index].replace('-', '').length) {\r\n                            this.values[this.index] += '0';\r\n                        }\r\n                        this.values[this.index] += this.decimal;\r\n                    }\r\n                }\r\n            },\r\n            '[0#]+([.,]{1}0*#*)?%': function(v) {\r\n                parseMethods['[0#]+([.,]{1}0*#*)?'].call(this, v);\r\n\r\n                // Adds the % only if it has a number value\r\n                if (this.values[this.index].match(/[\\-0-9]/g)) {\r\n                    if (this.values[this.index].indexOf('%') !== -1) {\r\n                        this.values[this.index] = this.values[this.index].replaceAll('%', '');\r\n                    }\r\n                    this.values[this.index] += '%';\r\n                } else {\r\n                    this.values[this.index] = '';\r\n                }\r\n            },\r\n            '#(.{1})##0?(.{1}[0#]+)?( ?;(.*)?)?': function(v) {\r\n                // Process first the number\r\n                parseMethods['[0#]+([.,]{1}0*#*)?'].call(this, v, true);\r\n                // Create the separators\r\n                let separator = this.tokens[this.index].substring(1,2);\r\n\r\n\r\n                let currentValue = this.values[this.index];\r\n                // Remove existing separators and negative sign\r\n                currentValue = currentValue.replaceAll(separator, '');\r\n                // Process separators\r\n                let val = currentValue.split(this.decimal);\r\n                if (val[0].length > 3) {\r\n                    let number = [];\r\n                    let count = 0;\r\n                    for (var j = val[0].length - 1; j >= 0 ; j--) {\r\n                        let c = val[0][j];\r\n                        if (c >= 0 && c <= 9) {\r\n                            if (count && ! (count % 3)) {\r\n                                number.unshift(separator);\r\n                            }\r\n                            count++;\r\n                        }\r\n                        number.unshift(c);\r\n                    }\r\n                    val[0] = number.join('');\r\n                }\r\n                // Reconstruct the value\r\n                this.values[this.index] = val.join(this.decimal);\r\n            },\r\n            '[0#]+([.,]{1}0*#*)?E{1}\\\\+0+': function(v) {\r\n                parseMethods['[0#]+([.,]{1}0*#*)?'].call(this, v);\r\n            },\r\n            '#{0,1}.*?\\\\?+\\\\/[0-9?]+': function (v) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                const token = this.tokens[this.index]; // e.g. \"# ?/?\", \"?/2\", \"# ??/16\"\r\n                let cur = this.values[this.index];\r\n\r\n                // Parse RHS of mask to decide denominator rule\r\n                const rhsRaw = (token.split('/')[1] || '').replace(/\\s+/g, '');\r\n                const allowDen = /^\\d+$/.test(rhsRaw) ? rhsRaw : /^\\?+$/.test(rhsRaw) ? '?' : '?';\r\n\r\n                // ----- NEW: allow '-' as first char -----\r\n                if (v === '-') {\r\n                    if (cur.length === 0) {\r\n                        this.values[this.index] = '-';\r\n                    }\r\n                    return; // never return false\r\n                }\r\n                // ----------------------------------------\r\n\r\n                // Only accept digits / space / slash; ignore everything else\r\n                if (!(/[0-9\\/ ]/.test(v))) {\r\n                    return;\r\n                }\r\n\r\n                // If we already have a slash and denominator is fixed but not yet appended,\r\n                // auto-complete immediately regardless of what the user typed now.\r\n                const hasSlashNow = cur.includes('/');\r\n                if (hasSlashNow && allowDen !== '?') {\r\n                    const afterSlash = cur.slice(cur.indexOf('/') + 1);\r\n                    if (afterSlash.length === 0) {\r\n                        this.values[this.index] = cur + allowDen;\r\n                        this.index++; // move to next token\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                // Empty -> only digits (or a leading '-' handled above)\r\n                if (cur.length === 0) {\r\n                    if (/\\d/.test(v)) this.values[this.index] = v;\r\n                    return;\r\n                }\r\n\r\n                const hasSpace = cur.includes(' ');\r\n                const hasSlash = cur.includes('/');\r\n                const last = cur[cur.length - 1];\r\n\r\n                // Space rules: only one, must be before slash, must follow a digit\r\n                if (v === ' ') {\r\n                    if (!hasSpace && !hasSlash && /\\d/.test(last)) {\r\n                        this.values[this.index] = cur + ' ';\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                // Slash rules: only one slash, not right after a space, must follow a digit\r\n                if (v === '/') {\r\n                    if (!hasSlash && last !== ' ' && /\\d/.test(last)) {\r\n                        if (allowDen === '?') {\r\n                            this.values[this.index] = cur + '/';\r\n                        } else {\r\n                            this.values[this.index] = cur + '/' + allowDen;\r\n                            this.index++; // conclude this token\r\n                        }\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                // Digit rules\r\n                if (/\\d/.test(v)) {\r\n                    if (!hasSlash) {\r\n                        // Before slash: digits always fine\r\n                        this.values[this.index] = cur + v;\r\n                        return;\r\n                    }\r\n\r\n                    // After slash\r\n                    if (allowDen === '?') {\r\n                        this.values[this.index] = cur + v;\r\n                        return;\r\n                    }\r\n\r\n                    // Fixed denominator: enforce prefix and advance when complete\r\n                    const afterSlash = cur.slice(cur.indexOf('/') + 1);\r\n                    const nextDen = afterSlash + v;\r\n                    if (allowDen.startsWith(nextDen)) {\r\n                        this.values[this.index] = cur + v;\r\n                        if (nextDen.length === allowDen.length) {\r\n                            this.index++;\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            '[a-zA-Z\\\\$]+': function(v) {\r\n                // Token to be added to the value\r\n                let word = this.tokens[this.index];\r\n                // Value\r\n                if (typeof(this.values[this.index]) === 'undefined') {\r\n                    this.values[this.index] = '';\r\n                }\r\n                if (v === null) {\r\n                    let size = this.values[this.index].length;\r\n                    v = word.substring(size, size+1);\r\n                }\r\n                // Add the value\r\n                this.values[this.index] += v;\r\n                // Only if caret is before the change\r\n                let current = this.values[this.index];\r\n                // Add token to the values\r\n                if (current !== word.substring(0,current.length)) {\r\n                    this.values[this.index] = word;\r\n                    // Next token to process\r\n                    this.index++;\r\n                    return false;\r\n                } else if (current === word) {\r\n                    // Next token to process\r\n                    this.index++;\r\n                }\r\n            },\r\n            'A': function(v) {\r\n                return parseMethods['[a-zA-Z\\\\$]+'].call(this, v);\r\n            },\r\n            'a': function(v) {\r\n                return parseMethods['[a-zA-Z\\\\$]+'].call(this, v);\r\n            },\r\n            '.': function(v) {\r\n                return parseMethods['[a-zA-Z\\\\$]+'].call(this, v);\r\n            },\r\n            '&': function(v) {\r\n                if (v.match(/^[a-zA-Z ]+$/)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '\\\\*': function() {\r\n                this.values[this.index] = '';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            'C': function(v) {\r\n                parseMethods['&'].call(this, v);\r\n            },\r\n            // General Methods\r\n            '0': function(v) {\r\n                if (v.match(/[0-9]/g)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '9': function(v) {\r\n                parseMethods['0'].call(this, v);\r\n            },\r\n            '#': function(v) {\r\n                parseMethods['0'].call(this, v);\r\n            },\r\n            'L': function(v) {\r\n                if (v.match(/[a-zA-Z]/gi)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '\\\\?': function(v) {\r\n                if (v.match(/[1-9]/g)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '@': function(v) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                this.values[this.index] += v;\r\n            },\r\n            '_[.\\\\s\\\\S]': function() {\r\n                this.values[this.index] = ' ';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            '\\\\(': function() {\r\n                if (this.type === 'currency' && this.parenthesisForNegativeNumbers) {\r\n                    this.values[this.index] = '';\r\n                } else {\r\n                    this.values[this.index] = '(';\r\n                }\r\n                this.index++;\r\n                return false;\r\n            },\r\n            '\\\\)': function() {\r\n                if (this.type === 'currency' && this.parenthesisForNegativeNumbers) {\r\n                    this.values[this.index] = '';\r\n                } else {\r\n                    this.values[this.index] = ')';\r\n                }\r\n                this.index++;\r\n                return false;\r\n            },\r\n            ',,M': function() {\r\n                this.values[this.index] = 'M';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            ',,,B': function() {\r\n                this.values[this.index] = 'B';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            '\\\\\\\\[.\\\\s\\\\S]': function(v) {\r\n                this.values[this.index] = this.tokens[this.index].replace('\\\\', '');\r\n                this.index++;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        const extractDate = function() {\r\n            let v = '';\r\n            if (! (this.date[0] && this.date[1] && this.date[2]) && (this.date[3] || this.date[4])) {\r\n                if (this.mask.toLowerCase().indexOf('[h]') !== -1) {\r\n                    v = parseInt(this.date[3]);\r\n                } else {\r\n                    let h = parseInt(this.date[3]);\r\n                    if (h < 13 && this.values.indexOf('PM') !== -1) {\r\n                        v = (h+12) % 24;\r\n                    } else {\r\n                        v = h % 24;\r\n                    }\r\n                }\r\n                if (this.date[4]) {\r\n                    v += parseFloat(this.date[4] / 60);\r\n                }\r\n                if (this.date[5]) {\r\n                    v += parseFloat(this.date[5] / 3600);\r\n                }\r\n                v /= 24;\r\n            } else if (this.date[0] || this.date[1] || this.date[2] || this.date[3] || this.date[4] || this.date[5]) {\r\n                if (this.date[0] && this.date[1] && ! this.date[2]) {\r\n                    this.date[2] = 1;\r\n                }\r\n                var t = Helpers.now(this.date);\r\n                v = Helpers.dateToNum(t);\r\n            }\r\n\r\n            if (isNaN(v)) {\r\n                v = '';\r\n            }\r\n\r\n            return v;\r\n        }\r\n\r\n        // Types TODO: Generate types so we can garantee that text,scientific, numeric,percentage, current are not duplicates. If they are, it will be general or broken.\r\n\r\n        const getTokens = function(str) {\r\n            // Check cache first - direct access, undefined check is fast\r\n            let result = tokensCache[str];\r\n            if (result !== undefined) {\r\n                return result;\r\n            }\r\n\r\n            allExpressionsRegex.lastIndex = 0; // Reset for global regex\r\n            result = str.match(allExpressionsRegex);\r\n            tokensCache[str] = result;\r\n            return result;\r\n        }\r\n\r\n        /**\r\n         * Get the method of one given token\r\n         */\r\n        const getMethod = function(str, temporary) {\r\n            str = str.toString().toUpperCase();\r\n\r\n            // Check cache first - direct access, undefined check is fast\r\n            let cached = methodCache[str];\r\n            if (cached !== undefined) {\r\n                return cached;\r\n            }\r\n\r\n            // Check for datetime mask\r\n            const datetime = temporary.every(t => t.type === 'datetime' || t.type === 'general' || t.type === 'escape');\r\n\r\n            // Use priority order for faster matching with pre-compiled regexes\r\n            for (const type of tokenPriority) {\r\n                if (!datetime && type === 'datetime') continue;\r\n\r\n                for (const compiled of compiledTokens[type]) {\r\n                    if (compiled.regex.test(str)) {\r\n                        const result = { type: type, method: compiled.method };\r\n                        methodCache[str] = result;\r\n                        return result;\r\n                    }\r\n                }\r\n            }\r\n            methodCache[str] = null;\r\n            return null;\r\n        }\r\n\r\n        const fixMinuteToken = function(t) {\r\n            const len = t.length;\r\n            for (let i = 0; i < len; i++) {\r\n                const token = t[i];\r\n                if (token === 'M' || token === 'MM') {\r\n                    // Check if this M is a minute (near H or S) rather than month\r\n                    let isMinute = false;\r\n\r\n                    // Check previous 2 tokens for H (hour indicator)\r\n                    if (i > 0) {\r\n                        const prev1 = t[i - 1];\r\n                        // Use includes for fast check - covers H, HH, HH24, HH12, [H], etc\r\n                        if (prev1 && prev1.includes('H')) {\r\n                            isMinute = true;\r\n                        } else if (i > 1) {\r\n                            const prev2 = t[i - 2];\r\n                            if (prev2 && prev2.includes('H')) {\r\n                                isMinute = true;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Check next 2 tokens for S (seconds indicator) if not already determined\r\n                    if (!isMinute && i < len - 1) {\r\n                        const next1 = t[i + 1];\r\n                        // Use includes for fast check - covers S, SS, MS, etc\r\n                        if (next1 && next1.includes('S')) {\r\n                            isMinute = true;\r\n                        } else if (i < len - 2) {\r\n                            const next2 = t[i + 2];\r\n                            if (next2 && next2.includes('S')) {\r\n                                isMinute = true;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (isMinute) {\r\n                        t[i] = token === 'M' ? 'I' : 'MI';\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Identify each method for each token\r\n         */\r\n        const getMethodsFromTokens = function(t) {\r\n            // Uppercase\r\n            t = t.map(v => {\r\n                return v.toString().toUpperCase();\r\n            });\r\n\r\n            // Compatibility with Excel\r\n            fixMinuteToken(t);\r\n\r\n            let result = [];\r\n            for (let i = 0; i < t.length; i++) {\r\n                var m = getMethod(t[i], result);\r\n                if (m) {\r\n                    result.push(m);\r\n                } else {\r\n                    result.push(null);\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        const getMethodByPosition = function(control) {\r\n            let methodName;\r\n            if (control.methods[control.index] && typeof(control.value[control.position]) !== 'undefined') {\r\n                methodName = control.methods[control.index].method;\r\n            }\r\n\r\n            let m = parseMethods[methodName];\r\n            if (typeof(m) === 'function') {\r\n                return m;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        const processPaddingZeros = function(token, value, decimal) {\r\n            if (! value) {\r\n                return value;\r\n            }\r\n            let m = token.split(decimal);\r\n            let desiredNumOfPaddingZeros = m[0].match(/[0]+/g);\r\n            if (desiredNumOfPaddingZeros && desiredNumOfPaddingZeros[0]) {\r\n                desiredNumOfPaddingZeros = desiredNumOfPaddingZeros[0].length\r\n                let v = value.toString().split(decimal);\r\n                let len = v[0].length;\r\n                if (desiredNumOfPaddingZeros > len) {\r\n                    v[0] = v[0].padStart(desiredNumOfPaddingZeros, '0');\r\n                    return v.join(decimal);\r\n                }\r\n            }\r\n        }\r\n\r\n        const processNumOfPaddingZeros = function(control) {\r\n            let negativeSignal = false;\r\n            control.methods.forEach((method, k) => {\r\n                if (method) {\r\n                    if (method.type === 'numeric' || method.type === 'percentage' || method.type === 'scientific') {\r\n                        let ret = processPaddingZeros(control.tokens[k], control.values[k], control.decimal);\r\n                        if (ret) {\r\n                            control.values[k] = ret;\r\n                        }\r\n                    }\r\n\r\n                    if (isNumeric(control.type) && control.parenthesisForNegativeNumbers === true) {\r\n                        if (isNumeric(method.type)) {\r\n                            if (control.values[k] && control.values[k].toString().includes('-')) {\r\n                                control.values[k] = control.values[k].replace('-', '');\r\n\r\n                                negativeSignal = true;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n\r\n\r\n            if (isNumeric(control.type) && control.parenthesisForNegativeNumbers === true && negativeSignal) {\r\n                control.methods.forEach((method, k) => {\r\n                    if (! control.values[k] && control.tokens[k] === '(') {\r\n                        control.values[k] = '(';\r\n                    } else if (! control.values[k] && control.tokens[k] === ')') {\r\n                        control.values[k] = ')';\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        const getValue = function(control) {\r\n            let value = control.values.join('');\r\n            if (isNumeric(control.type)) {\r\n                if (value.indexOf('--') !== false) {\r\n                    value = value.replace('--', '-');\r\n                }\r\n                if (Number(control.raw) < 0 && value.includes('-')) {\r\n                    value = '-' + value.replace('-', '');\r\n                }\r\n            }\r\n            return value;\r\n        }\r\n\r\n        const inputIsANumber = function(num) {\r\n            if (typeof(num) === 'string') {\r\n                num = num.trim();\r\n            }\r\n            return !isNaN(num) && num !== null && num !== '';\r\n        }\r\n\r\n        const getType = function(control) {\r\n            // Mask type\r\n            let type = 'general';\r\n            // Process other types\r\n            for (var i = 0; i < control.methods.length; i++) {\r\n                let m = control.methods[i];\r\n                if (m) {\r\n                    let t = m.type;\r\n                    if (t !== 'general' && t !== 'escape' && t !== type) {\r\n                        if (type === 'general') {\r\n                            type = t;\r\n                        } else {\r\n                            type = 'general';\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return type;\r\n        }\r\n\r\n        const isNumber = function(num) {\r\n            if (typeof(num) === 'string') {\r\n                num = num.trim();\r\n            }\r\n            return !isNaN(num) && num !== null && num !== '';\r\n        }\r\n\r\n        // TODO, get negative mask automatically based on the input sign?\r\n\r\n        const getConfig = function(config, value) {\r\n            // Internal default control of the mask system\r\n            const control = {\r\n                // Mask options\r\n                options: {},\r\n                // New values for each token found\r\n                values: [],\r\n                // Token position\r\n                index: 0,\r\n                // Character position\r\n                position: 0,\r\n                // Date raw values\r\n                date: [0,0,0,0,0,0],\r\n                // Raw number for the numeric values\r\n                number: 0,\r\n            }\r\n\r\n            if (typeof(value) === 'undefined' || value === null) {\r\n                value = '';\r\n            }\r\n\r\n            // Value to be masked\r\n            control.value = value.toString();\r\n            control.raw = value;\r\n\r\n\r\n            // Options defined by the user\r\n            if (typeof(config) == 'string') {\r\n                // Mask\r\n                control.mask = config;\r\n            } else if (config) {\r\n                // Mask\r\n                let k = Object.keys(config);\r\n                for (var i = 0; i < k.length; i++) {\r\n                    control[k[i]] = config[k[i]];\r\n                }\r\n            }\r\n\r\n            // Controls of Excel that should be ignored\r\n            let mask = control.mask;\r\n            if (mask) {\r\n                if (mask.indexOf(';') !== -1) {\r\n                    let d = mask.split(';');\r\n\r\n                    // Mask\r\n                    mask = d[0];\r\n\r\n                    if (typeof (value) === 'number' || isNumber(value)) {\r\n                        if (Number(value) < 0 && d[1]) {\r\n                            mask = d[1];\r\n                        } else if (Number(value) === 0 && d[2]) {\r\n                            mask = d[2];\r\n                        } else {\r\n                            mask = d[0];\r\n                        }\r\n                    } else {\r\n                        if (typeof(d[3]) !== 'undefined') {\r\n                            mask = d[3];\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Transform Excel locale patterns (e.g., [$$-409]#,##0.00) - only if pattern exists\r\n                if (mask.indexOf('[$') !== -1) {\r\n                    mask = transformExcelLocaleMask(mask);\r\n                }\r\n\r\n                // Cleaning the mask\r\n                mask = cleanMask(mask, control);\r\n                // Get only the first mask for now and remove\r\n                control.mask = mask;\r\n                // Get tokens which are the methods for parsing\r\n                let tokens = control.tokens = getTokens(mask);\r\n                // Get methods from the tokens\r\n                control.methods = getMethodsFromTokens(tokens);\r\n                // Type\r\n                control.type = getType(control);\r\n            }\r\n\r\n            // Decimal only for numbers\r\n            if (isNumeric(control.type) || control.locale) {\r\n                control.decimal = getDecimal.call(control);\r\n            }\r\n\r\n            return control;\r\n        }\r\n\r\n        const toPlainString = function(num) {\r\n            // Convert number to string if it isn't already\r\n            num = String(num);\r\n\r\n            // If it's not in exponential form, return as-is\r\n            if (!/e/i.test(num)) return num;\r\n\r\n            // Decompose scientific notation\r\n            const [coefficient, exponent] = num.toLowerCase().split('e');\r\n            const exp = parseInt(exponent, 10);\r\n\r\n            // Handle sign\r\n            const sign = coefficient[0] === '-' ? '-' : '';\r\n            const [intPart, fracPart = ''] = coefficient.replace('-', '').split('.');\r\n\r\n            const digits = intPart + fracPart;\r\n            const decimalPos = intPart.length;\r\n\r\n            let newPos = decimalPos + exp;\r\n\r\n            if (newPos <= 0) {\r\n                // Decimal point moves left\r\n                return sign + '0.' + '0'.repeat(-newPos) + digits;\r\n            } else if (newPos >= digits.length) {\r\n                // Decimal point moves right, add trailing zeros\r\n                return sign + digits + '0'.repeat(newPos - digits.length);\r\n            } else {\r\n                // Decimal point moves into the number\r\n                return sign + digits.slice(0, newPos) + '.' + digits.slice(newPos);\r\n            }\r\n        };\r\n\r\n        const adjustNumberOfDecimalPlaces = function(config, value) {\r\n            let temp = value;\r\n            let mask = config.mask;\r\n\r\n            if (config.type === 'scientific') {\r\n                // Scientific notation handling\r\n                mask = config.mask.toUpperCase().split('E')[0];\r\n\r\n                let numOfDecimalPlaces = mask.split(config.decimal);\r\n                // Handle masks without decimal (e.g., '0E+00')\r\n                if (numOfDecimalPlaces[1]) {\r\n                    numOfDecimalPlaces = numOfDecimalPlaces[1].match(/[0#]+/g);\r\n                    numOfDecimalPlaces = numOfDecimalPlaces[0]?.length ?? 0;\r\n                } else {\r\n                    numOfDecimalPlaces = 0;\r\n                }\r\n                temp = temp.toExponential(numOfDecimalPlaces);\r\n                // Split by 'e' to handle both positive (e+) and negative (e-) exponents\r\n                let expo = temp.toString().split('e');\r\n                // Keep coefficient as string to preserve decimal places (e.g., '1.00' not 1)\r\n                temp = expo[0];\r\n\r\n                // Process padding zeros for coefficient\r\n                let ret = processPaddingZeros(mask, temp, config.decimal);\r\n                if (ret) {\r\n                    temp = ret;\r\n                }\r\n                expo[0] = temp;\r\n\r\n                // Handle both E+ and E- in mask for exponent\r\n                mask = config.mask.toUpperCase().split(/E[+-]?/)[1];\r\n                ret = processPaddingZeros(mask, expo[1]?.replace(/^[+-]/, ''), config.decimal);\r\n                if (ret) {\r\n                    // Preserve the sign from the original exponent\r\n                    let sign = expo[1]?.charAt(0);\r\n                    expo[1] = (sign === '-' ? '-' : '+') + ret;\r\n                }\r\n\r\n                temp = expo.join('e');\r\n            } else {\r\n                // Non-scientific decimal adjustment\r\n                if (mask.indexOf(config.decimal) === -1) {\r\n                    // No decimal places\r\n                    if (! Number.isInteger(temp)) {\r\n                        temp = temp.toFixed(0);\r\n                    }\r\n                } else {\r\n                    // Length of the decimal\r\n                    let mandatoryDecimalPlaces = mask.split(config.decimal);\r\n                    mandatoryDecimalPlaces = mandatoryDecimalPlaces[1].match(/0+/g);\r\n                    if (mandatoryDecimalPlaces) {\r\n                        mandatoryDecimalPlaces = mandatoryDecimalPlaces[0].length;\r\n                    } else {\r\n                        mandatoryDecimalPlaces = 0;\r\n                    }\r\n\r\n                    // Amount of decimal (use original value to check decimal separator)\r\n                    let valueStr = value.toString();\r\n                    let numOfDecimalPlaces = valueStr.split(valueStr.includes('.') ? '.' : (config.decimal || '.'))\r\n                    numOfDecimalPlaces = numOfDecimalPlaces[1]?.length ?? 0;\r\n                    // Necessary adjustment\r\n                    let necessaryAdjustment = 0;\r\n                    if (numOfDecimalPlaces < mandatoryDecimalPlaces) {\r\n                        necessaryAdjustment = mandatoryDecimalPlaces;\r\n                    } else {\r\n                        // Optional\r\n                        let optionalDecimalPlaces = mask.split(config.decimal);\r\n                        optionalDecimalPlaces = optionalDecimalPlaces[1].match(/[0#]+/g);\r\n                        if (optionalDecimalPlaces) {\r\n                            optionalDecimalPlaces = optionalDecimalPlaces[0].length;\r\n                            if (numOfDecimalPlaces > optionalDecimalPlaces) {\r\n                                necessaryAdjustment = optionalDecimalPlaces;\r\n                            }\r\n                        }\r\n                    }\r\n                    // Adjust decimal numbers if applicable\r\n                    if (necessaryAdjustment) {\r\n                        let t = temp.toFixed(necessaryAdjustment);\r\n                        let n = temp.toString().split('.');\r\n                        let fraction = n[1];\r\n                        if (fraction && fraction.length > necessaryAdjustment && fraction[fraction.length - 1] === '5') {\r\n                            t = parseFloat(n[0] + '.' + fraction + '1').toFixed(necessaryAdjustment);\r\n                        }\r\n                        temp = t;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return temp;\r\n        }\r\n\r\n        const formatFraction = function(value, mask) {\r\n            let maxDenominator;\r\n            let fixedDenominator = null;\r\n            let allowWholeNumber = true;\r\n\r\n            // Check for fixed denominator like # ?/8 or ?/8\r\n            const fixed = mask.match(/\\/(\\d+)/);\r\n            if (fixed) {\r\n                fixedDenominator = parseInt(fixed[1], 10);\r\n                maxDenominator = fixedDenominator;\r\n            } else {\r\n                // Determine based on question marks in mask\r\n                const match = mask.match(/\\?\\/(\\?+)/);\r\n                if (match) {\r\n                    maxDenominator = Math.pow(10, match[1].length) - 1;\r\n                } else {\r\n                    maxDenominator = 9; // Default for # ?/? or ?/?\r\n                }\r\n            }\r\n            // Check if mask allows whole number (e.g., ?/? or ?/8 implies no whole number)\r\n            allowWholeNumber = mask.includes('#');\r\n\r\n            // If we have a fixed denominator, use it exactly (don't simplify)\r\n            if (fixedDenominator) {\r\n                const isNegative = value < 0;\r\n                const absValue = Math.abs(value);\r\n                const numerator = Math.round(absValue * fixedDenominator);\r\n\r\n                // For masks like ?/8, always output as pure fraction (no whole number)\r\n                if (!allowWholeNumber) {\r\n                    return isNegative ? `-${numerator}/${fixedDenominator}` : `${numerator}/${fixedDenominator}`;\r\n                }\r\n\r\n                // For masks like # ?/8, allow whole number\r\n                const whole = Math.floor(numerator / fixedDenominator);\r\n                const remainder = numerator % fixedDenominator;\r\n                if (remainder === 0) {\r\n                    return isNegative ? `-${whole}` : `${whole}`;\r\n                }\r\n                if (whole === 0) {\r\n                    return isNegative ? `-${numerator}/${fixedDenominator}` : `${numerator}/${fixedDenominator}`;\r\n                }\r\n                return isNegative ? `-${whole} ${remainder}/${fixedDenominator}` : `${whole} ${remainder}/${fixedDenominator}`;\r\n            }\r\n\r\n            // Use continued fractions algorithm for better approximation\r\n            function continuedFraction(value, maxDenom) {\r\n                if (value === 0) return [0, 1];\r\n                let sign = value < 0 ? -1 : 1;\r\n                value = Math.abs(value);\r\n                let whole = Math.floor(value);\r\n                let frac = value - whole;\r\n                if (frac === 0) return [sign * whole, 1];\r\n\r\n                let h1 = 1, h2 = 0;\r\n                let k1 = 0, k2 = 1;\r\n                let x = frac;\r\n                while (k1 <= maxDenom) {\r\n                    let a = Math.floor(x);\r\n                    let h0 = a * h1 + h2;\r\n                    let k0 = a * k1 + k2;\r\n                    if (k0 > maxDenom) break;\r\n                    h2 = h1; h1 = h0;\r\n                    k2 = k1; k1 = k0;\r\n                    if (Math.abs(x - a) < 1e-10) break;\r\n                    x = 1 / (x - a);\r\n                }\r\n\r\n                // Add the whole part back only if allowed\r\n                let finalNum = sign * (allowWholeNumber ? whole * k1 + h1 : Math.round(value * k1));\r\n                let finalDen = k1;\r\n                return [finalNum, finalDen];\r\n            }\r\n\r\n            const [numerator, denominator] = continuedFraction(value, maxDenominator);\r\n\r\n            // Handle the result\r\n            const isNegative = numerator < 0;\r\n            const absNumerator = Math.abs(numerator);\r\n            const whole = allowWholeNumber ? Math.floor(absNumerator / denominator) : 0;\r\n            const remainder = absNumerator % denominator;\r\n            const sign = isNegative ? '-' : '';\r\n\r\n            if (remainder === 0) {\r\n                return `${sign}${whole || 0}`;\r\n            }\r\n            if (whole === 0 || !allowWholeNumber) {\r\n                return `${sign}${absNumerator}/${denominator}`;\r\n            }\r\n            return `${sign}${whole} ${remainder}/${denominator}`;\r\n        }\r\n\r\n        const extractDateAndTime = function(value) {\r\n            value = value.toString().substring(0,19);\r\n            let splitStr = (value.indexOf('T') !== -1) ? 'T' : ' ';\r\n            value = value.split(splitStr);\r\n\r\n            let y = null;\r\n            let m = null;\r\n            let d = null;\r\n            let h = '0';\r\n            let i = '0';\r\n            let s = '0';\r\n\r\n            if (! value[1]) {\r\n                if (value[0].indexOf(':') !== -1) {\r\n                    value[0] = value[0].split(':');\r\n                    h = value[0][0];\r\n                    i = value[0][1];\r\n                    s = value[0][2];\r\n                } else {\r\n                    value[0] = value[0].split('-');\r\n                    y = value[0][0];\r\n                    m = value[0][1];\r\n                    d = value[0][2];\r\n                }\r\n            } else {\r\n                value[0] = value[0].split('-');\r\n                y = value[0][0];\r\n                m = value[0][1];\r\n                d = value[0][2];\r\n\r\n                value[1] = value[1].split(':');\r\n                h = value[1][0];\r\n                i = value[1][1];\r\n                s = value[1][2];\r\n            }\r\n\r\n            return [y,m,d,h,i,s];\r\n        }\r\n\r\n        const format = function(str, config) {\r\n            // Extract numeric value from formatted or unformatted string (e.g., \"₹3.00\" -> 3)\r\n            // Using same logic as ParseValue to handle already-formatted strings\r\n            let numericValue;\r\n            const decimal = config.decimal || '.';\r\n            let v = String(str).split(decimal);\r\n\r\n            // Detect negative sign\r\n            let signal = v[0].includes('-');\r\n\r\n            // Extract digits only\r\n            v[0] = v[0].match(/[0-9]+/g);\r\n            if (v[0]) {\r\n                if (signal) v[0].unshift('-');\r\n                v[0] = v[0].join('');\r\n            } else {\r\n                v[0] = signal ? '-0' : '0';\r\n            }\r\n\r\n            if (v[1] !== undefined) {\r\n                v[1] = v[1].match(/[0-9]+/g);\r\n                v[1] = v[1] ? v[1].join('') : '';\r\n            }\r\n\r\n            // Convert to number\r\n            numericValue = v[0] || v[1] ? parseFloat(v.join('.')) : 0;\r\n\r\n            let ret = new Intl.NumberFormat(config.locale, config.options || {}).format(numericValue);\r\n\r\n            config.values.push(ret);\r\n        }\r\n\r\n        const Component = function(str, config, returnObject) {\r\n            // Get configuration\r\n            const control = getConfig(config, str);\r\n\r\n            if (control.locale) {\r\n                format(str, control);\r\n            } else if (control.mask) {\r\n                // Walk every character on the value\r\n                let method;\r\n                while (method = getMethodByPosition(control)) {\r\n                    let char = control.value[control.position];\r\n                    if (char === hiddenCaret) {\r\n                        control.caret = {\r\n                            index: control.index,\r\n                            position: control.values[control.index]?.length ?? 0,\r\n                        }\r\n                        control.position++;\r\n                    } else {\r\n                        // Get the method name to handle the current token\r\n                        let ret = method.call(control, char);\r\n                        // Next position\r\n                        if (ret !== false) {\r\n                            control.position++;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Move index\r\n                if (control.methods[control.index]) {\r\n                    let type = control.methods[control.index].type;\r\n                    if (isNumeric(type) && control.methods[++control.index]) {\r\n                        let next;\r\n                        while (next = control.methods[control.index]) {\r\n                            if (control.methods[control.index].type === 'general') {\r\n                                let method = control.methods[control.index].method;\r\n                                if (method && typeof(parseMethods[method]) === 'function') {\r\n                                    parseMethods[method].call(control, null);\r\n                                }\r\n                            } else {\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            if (control.caret) {\r\n                let index = control.caret.index;\r\n                let position = control.caret.position;\r\n                let value = String(control.values[index] ?? '');\r\n                // Re-apply the caret to the original position\r\n                control.values[index] = value.substring(0, position) + hiddenCaret + value.substring(position);\r\n            }\r\n\r\n            control.value = getValue(control);\r\n\r\n            if (returnObject) {\r\n                return control;\r\n            } else {\r\n                return control.value;\r\n            }\r\n        }\r\n\r\n        // Helper: Compare rendered value to original input\r\n        const testMask = function(mask, value, original) {\r\n            const rendered = Component.render(value, { mask }, true);\r\n            return rendered.replace(/\\s/g, '') === original.replace(/\\s/g, '');\r\n        }\r\n\r\n        const autoCastingFractions = function(value) {\r\n            const fractionPattern = /^\\s*(-?\\d+\\s+)?(-?\\d+)\\/(\\d+)\\s*$/;\r\n            const fractionMatch = value.match(fractionPattern);\r\n            if (fractionMatch) {\r\n                const sign = value.trim().startsWith('-') ? -1 : 1;\r\n                const whole = fractionMatch[1] ? Math.abs(parseInt(fractionMatch[1])) : 0;\r\n                const numerator = Math.abs(parseInt(fractionMatch[2]));\r\n                const denominator = parseInt(fractionMatch[3]);\r\n\r\n                if (denominator === 0) return null;\r\n\r\n                const decimalValue = sign * (whole + (numerator / denominator));\r\n\r\n                // Determine the mask\r\n                let mask;\r\n                if ([2, 4, 8, 16, 32].includes(denominator)) {\r\n                    mask = whole !== 0 ? `# ?/${denominator}` : `?/${denominator}`;\r\n                } else if (denominator <= 9) {\r\n                    mask = whole !== 0 ? '# ?/?' : '?/?';\r\n                } else {\r\n                    mask = whole !== 0 ? '# ??/??' : '??/??';\r\n                }\r\n\r\n                if (testMask(mask, decimalValue, value.trim())) {\r\n                    return { mask, value: decimalValue, type: 'fraction', category: 'fraction' };\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        const autoCastingPercent = function(value) {\r\n            const percentPattern = /^\\s*([+-]?\\d+(?:[.,]\\d+)?)%\\s*$/;\r\n            const percentMatch = value.match(percentPattern);\r\n            if (percentMatch) {\r\n                const rawNumber = percentMatch[1].replace(',', '.');\r\n                const decimalValue = parseFloat(rawNumber) / 100;\r\n\r\n                const decimalPart = rawNumber.split('.')[1];\r\n                const decimalPlaces = decimalPart ? decimalPart.length : 0;\r\n                const mask = decimalPlaces > 0 ? `0.${'0'.repeat(decimalPlaces)}%` : '0%';\r\n\r\n                if (testMask(mask, decimalValue, value.trim())) {\r\n                    return { mask: mask, value: decimalValue, type: 'percent', category: 'numeric' };\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        const autoCastingDates = function(value) {\r\n            if (!value || typeof value !== 'string') {\r\n                return null;\r\n            }\r\n\r\n            // Smart pattern detection based on the structure of the string\r\n\r\n            // 1. Analyze the structure to determine possible formats\r\n            const analyzeStructure = function(str) {\r\n                const patterns = [];\r\n\r\n                // Check for date with forward slashes: XX/XX/XXXX or XX/XX/XX\r\n                if (str.match(/^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}$/)) {\r\n                    const parts = str.split('/');\r\n                    const p1 = parseInt(parts[0]);\r\n                    const p2 = parseInt(parts[1]);\r\n                    const p3 = parseInt(parts[2]);\r\n\r\n                    // Determine likely format based on values\r\n                    if (p1 <= 12 && p2 <= 31 && p2 > 12) {\r\n                        // Likely mm/dd/yyyy\r\n                        patterns.push('mm/dd/yyyy', 'mm/dd/yy', 'm/d/yyyy', 'm/d/yy');\r\n                    } else if (p1 <= 31 && p2 <= 12 && p1 > 12) {\r\n                        // Likely dd/mm/yyyy\r\n                        patterns.push('dd/mm/yyyy', 'dd/mm/yy', 'd/m/yyyy', 'd/m/yy');\r\n                    } else if (p1 <= 12 && p2 <= 12) {\r\n                        // Ambiguous - could be either, use locale preference\r\n                        if (userLocale.startsWith('en-US')) {\r\n                            patterns.push('mm/dd/yyyy', 'dd/mm/yyyy', 'mm/dd/yy', 'dd/mm/yy');\r\n                        } else {\r\n                            patterns.push('dd/mm/yyyy', 'mm/dd/yyyy', 'dd/mm/yy', 'mm/dd/yy');\r\n                        }\r\n                    }\r\n\r\n                    // Add variations\r\n                    if (p3 < 100) {\r\n                        patterns.push('dd/mm/yy', 'mm/dd/yy', 'd/m/yy', 'm/d/yy');\r\n                    } else {\r\n                        patterns.push('dd/mm/yyyy', 'mm/dd/yyyy', 'd/m/yyyy', 'm/d/yyyy');\r\n                    }\r\n                }\r\n\r\n                // Check for date with dashes: XX-XX-XXXX\r\n                else if (str.match(/^\\d{1,2}-\\d{1,2}-\\d{2,4}$/)) {\r\n                    const parts = str.split('-');\r\n                    const p1 = parseInt(parts[0]);\r\n                    const p2 = parseInt(parts[1]);\r\n\r\n                    if (p1 <= 12 && p2 <= 31 && p2 > 12) {\r\n                        patterns.push('mm-dd-yyyy', 'mm-dd-yy', 'm-d-yyyy', 'm-d-yy');\r\n                    } else if (p1 <= 31 && p2 <= 12 && p1 > 12) {\r\n                        patterns.push('dd-mm-yyyy', 'dd-mm-yy', 'd-m-yyyy', 'd-m-yy');\r\n                    } else {\r\n                        patterns.push('dd-mm-yyyy', 'mm-dd-yyyy', 'dd-mm-yy', 'mm-dd-yy');\r\n                    }\r\n                }\r\n\r\n                // Check for ISO format: YYYY-MM-DD\r\n                else if (str.match(/^\\d{4}-\\d{1,2}-\\d{1,2}$/)) {\r\n                    patterns.push('yyyy-mm-dd', 'yyyy-m-d');\r\n                }\r\n\r\n                // Check for format: YYYY/MM/DD\r\n                else if (str.match(/^\\d{4}\\/\\d{1,2}\\/\\d{1,2}$/)) {\r\n                    patterns.push('yyyy/mm/dd', 'yyyy/m/d');\r\n                }\r\n\r\n                // Check for dates with month names\r\n                else if (str.match(/\\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i)) {\r\n                    // DD Mon YYYY or DD Month YYYY\r\n                    if (str.match(/^\\d{1,2}\\s+\\w+\\s+\\d{2,4}$/i)) {\r\n                        patterns.push('dd mmm yyyy', 'dd mmmm yyyy', 'd mmm yyyy', 'd mmmm yyyy',\r\n                            'dd mmm yy', 'dd mmmm yy', 'd mmm yy', 'd mmmm yy');\r\n                    }\r\n                    // Mon DD, YYYY or Month DD, YYYY\r\n                    else if (str.match(/^\\w+\\s+\\d{1,2},?\\s+\\d{2,4}$/i)) {\r\n                        patterns.push('mmm dd, yyyy', 'mmmm dd, yyyy', 'mmm d, yyyy', 'mmmm d, yyyy',\r\n                            'mmm dd yyyy', 'mmmm dd yyyy', 'mmm d yyyy', 'mmmm d yyyy');\r\n                    }\r\n                    // DD-Mon-YYYY\r\n                    else if (str.match(/^\\d{1,2}-\\w+-\\d{2,4}$/i)) {\r\n                        patterns.push('dd-mmm-yyyy', 'dd-mmmm-yyyy', 'd-mmm-yyyy', 'd-mmmm-yyyy',\r\n                            'dd-mmm-yy', 'dd-mmmm-yy', 'd-mmm-yy', 'd-mmmm-yy');\r\n                    }\r\n                }\r\n\r\n                // Check for weekday formats\r\n                else if (str.match(/^(mon|tue|wed|thu|fri|sat|sun)/i)) {\r\n                    if (str.match(/^\\w+,\\s+\\d{1,2}\\s+\\w+\\s+\\d{4}$/i)) {\r\n                        patterns.push('ddd, dd mmm yyyy', 'ddd, d mmm yyyy',\r\n                            'dddd, dd mmmm yyyy', 'dddd, d mmmm yyyy');\r\n                    }\r\n                }\r\n\r\n                // Check for datetime formats\r\n                else if (str.includes(' ') && str.match(/\\d{1,2}:\\d{2}/)) {\r\n                    const parts = str.split(' ');\r\n                    if (parts.length >= 2) {\r\n                        const datePart = parts[0];\r\n                        const timePart = parts.slice(1).join(' ');\r\n\r\n                        // Determine date format\r\n                        let dateMasks = [];\r\n                        if (datePart.includes('/')) {\r\n                            dateMasks = ['dd/mm/yyyy', 'mm/dd/yyyy', 'd/m/yyyy', 'm/d/yyyy'];\r\n                        } else if (datePart.includes('-')) {\r\n                            if (datePart.match(/^\\d{4}-/)) {\r\n                                dateMasks = ['yyyy-mm-dd', 'yyyy-m-d'];\r\n                            } else {\r\n                                dateMasks = ['dd-mm-yyyy', 'mm-dd-yyyy', 'd-m-yyyy', 'm-d-yyyy'];\r\n                            }\r\n                        }\r\n\r\n                        // Determine time format\r\n                        let timeMasks = [];\r\n                        if (timePart.match(/\\d{1,2}:\\d{2}:\\d{2}/)) {\r\n                            timeMasks = ['hh:mm:ss', 'h:mm:ss'];\r\n                        } else {\r\n                            timeMasks = ['hh:mm', 'h:mm'];\r\n                        }\r\n\r\n                        // Add AM/PM variants if present\r\n                        if (timePart.match(/[ap]m/i)) {\r\n                            timeMasks = timeMasks.map(t => t + ' am/pm');\r\n                        }\r\n\r\n                        // Combine date and time masks\r\n                        for (const dateMask of dateMasks) {\r\n                            for (const timeMask of timeMasks) {\r\n                                patterns.push(`${dateMask} ${timeMask}`);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Check for time-only formats\r\n                else if (str.match(/^\\d{1,2}:\\d{2}(:\\d{2})?(\\s*(am|pm))?$/i)) {\r\n                    if (str.match(/:\\d{2}:\\d{2}/)) {\r\n                        patterns.push('hh:mm:ss', 'h:mm:ss');\r\n                        if (str.match(/[ap]m/i)) {\r\n                            patterns.push('hh:mm:ss am/pm', 'h:mm:ss am/pm');\r\n                        }\r\n                    } else {\r\n                        patterns.push('hh:mm', 'h:mm');\r\n                        if (str.match(/[ap]m/i)) {\r\n                            patterns.push('hh:mm am/pm', 'h:mm am/pm');\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Check for extended hour format [h]:mm:ss\r\n                else if (str.match(/^\\[?\\d+\\]?:\\d{2}:\\d{2}$/)) {\r\n                    patterns.push('[h]:mm:ss');\r\n                }\r\n\r\n                return [...new Set(patterns)]; // Remove duplicates\r\n            };\r\n\r\n            // Get candidate masks based on the string structure\r\n            const candidateMasks = analyzeStructure(value);\r\n\r\n            // If no patterns detected, try some common formats as fallback\r\n            if (candidateMasks.length === 0) {\r\n                if (userLocale.startsWith('en-US')) {\r\n                    candidateMasks.push(\r\n                        'mm/dd/yyyy', 'mm-dd-yyyy', 'yyyy-mm-dd',\r\n                        'mm/dd/yy', 'mm-dd-yy',\r\n                        'hh:mm:ss', 'hh:mm', 'h:mm am/pm'\r\n                    );\r\n                } else {\r\n                    candidateMasks.push(\r\n                        'dd/mm/yyyy', 'dd-mm-yyyy', 'yyyy-mm-dd',\r\n                        'dd/mm/yy', 'dd-mm-yy',\r\n                        'hh:mm:ss', 'hh:mm', 'h:mm'\r\n                    );\r\n                }\r\n            }\r\n\r\n            // Try each candidate mask\r\n            for (const mask of candidateMasks) {\r\n                try {\r\n                    // Use Component.extractDateFromString to parse the date\r\n                    const isoDate = Component.extractDateFromString(value, mask);\r\n\r\n                    if (isoDate && isoDate !== '') {\r\n                        // Parse the ISO date string to components\r\n                        const parts = isoDate.split(' ');\r\n                        const dateParts = parts[0].split('-');\r\n                        const timeParts = parts[1] ? parts[1].split(':') : ['0', '0', '0'];\r\n\r\n                        const year = parseInt(dateParts[0]);\r\n                        const month = parseInt(dateParts[1]);\r\n                        const day = parseInt(dateParts[2]);\r\n                        const hour = parseInt(timeParts[0]);\r\n                        const minute = parseInt(timeParts[1]);\r\n                        const second = parseInt(timeParts[2]);\r\n\r\n                        // Validate the date components\r\n                        if (year > 0 && month >= 1 && month <= 12 && day >= 1 && day <= 31 &&\r\n                            hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 && second < 60) {\r\n\r\n                            // Convert to Excel serial number\r\n                            const excelNumber = Helpers.dateToNum(isoDate);\r\n\r\n                            // Verify by rendering back\r\n                            const rendered = Component.render(excelNumber, { mask: mask }, true);\r\n\r\n                            // Case-insensitive comparison for month names\r\n                            if (rendered.toLowerCase() === value.toLowerCase()) {\r\n                                return {\r\n                                    mask: mask,\r\n                                    value: excelNumber,\r\n                                    type: 'date',\r\n                                    category: 'datetime'\r\n                                };\r\n                            }\r\n                        }\r\n                    }\r\n                } catch (e) {\r\n                }\r\n            }\r\n\r\n            // No matching format found\r\n            return null;\r\n        };\r\n\r\n        const autoCastingCurrency = function (input, filterDecimal) {\r\n            if (typeof input !== 'string') return null;\r\n\r\n            const str = input.trim();\r\n            if (!str) return null;\r\n\r\n            const len = str.length;\r\n            let isNegative = false;\r\n            let hasParens = false;\r\n            let symbol = '';\r\n            let numericPart = '';\r\n            let letterBuffer = '';\r\n            let firstCommaPos = -1;\r\n            let lastCommaPos = -1;\r\n            let firstDotPos = -1;\r\n            let lastDotPos = -1;\r\n            let commaCount = 0;\r\n            let dotCount = 0;\r\n            let hasInvalidChars = false;\r\n            let hasCurrencySymbol = false;\r\n\r\n            // Single pass through the string\r\n            for (let i = 0; i < len; i++) {\r\n                const char = str[i];\r\n\r\n                // Check for negative signs and parentheses\r\n                if (char === '-' && !numericPart) {\r\n                    isNegative = true;\r\n                    continue;\r\n                }\r\n                if (char === '(') {\r\n                    hasParens = true;\r\n                    isNegative = true;\r\n                    continue;\r\n                }\r\n                if (char === ')') continue;\r\n\r\n                // Skip whitespace\r\n                if (char === ' ' || char === '\\t') {\r\n                    if (letterBuffer) {\r\n                        letterBuffer += char;\r\n                    }\r\n                    continue;\r\n                }\r\n\r\n                // Currency symbols\r\n                if (char === '$' || char === '€' || char === '£' || char === '¥' ||\r\n                    char === '₹' || char === '₽' || char === '₩' || char === '₫' || char === '¢') {\r\n                    hasCurrencySymbol = true;\r\n                    // Validate letter buffer: max 2 letters before symbol\r\n                    const trimmedBuffer = letterBuffer.trim();\r\n                    if (trimmedBuffer.length > 2) {\r\n                        return null;\r\n                    }\r\n                    if (letterBuffer) {\r\n                        symbol = letterBuffer + char;\r\n                        letterBuffer = '';\r\n                    } else {\r\n                        symbol = char;\r\n                    }\r\n                    // Check if next char is a space to include it in symbol\r\n                    if (i + 1 < len && (str[i + 1] === ' ' || str[i + 1] === '\\t')) {\r\n                        symbol += ' ';\r\n                        i++; // Skip the space\r\n                    }\r\n                    continue;\r\n                }\r\n\r\n                // Letters (only valid BEFORE currency symbol, max 2 letters)\r\n                if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {\r\n                    // Letters after symbol or numeric part are invalid\r\n                    if (hasCurrencySymbol || numericPart) {\r\n                        return null;\r\n                    }\r\n                    letterBuffer += char;\r\n                    continue;\r\n                }\r\n\r\n                // Digits\r\n                if (char >= '0' && char <= '9') {\r\n                    // Reject if we have letters but no currency symbol\r\n                    if (letterBuffer && !hasCurrencySymbol) {\r\n                        return null;\r\n                    }\r\n                    letterBuffer = '';\r\n                    numericPart += char;\r\n                    continue;\r\n                }\r\n\r\n                // Comma and dot separators\r\n                if (char === ',') {\r\n                    if (firstCommaPos === -1) firstCommaPos = numericPart.length;\r\n                    lastCommaPos = numericPart.length;\r\n                    commaCount++;\r\n                    numericPart += char;\r\n                    continue;\r\n                }\r\n                if (char === '.') {\r\n                    if (firstDotPos === -1) firstDotPos = numericPart.length;\r\n                    lastDotPos = numericPart.length;\r\n                    dotCount++;\r\n                    numericPart += char;\r\n                    continue;\r\n                }\r\n\r\n                // Invalid character\r\n                hasInvalidChars = true;\r\n            }\r\n\r\n            // Reject if no currency symbol was found\r\n            if (!hasCurrencySymbol) {\r\n                return null;\r\n            }\r\n\r\n            // Reject if there are any invalid characters\r\n            if (hasInvalidChars) {\r\n                return null;\r\n            }\r\n\r\n            // If no numeric part, reject\r\n            if (!numericPart) return null;\r\n\r\n            // Ensure numeric part contains at least one digit (not just separators)\r\n            if (!/\\d/.test(numericPart)) return null;\r\n\r\n            // Infer decimal and group separators\r\n            let decimal = '.';\r\n            let group = ',';\r\n\r\n            // If filterDecimal is provided, use it to determine separators\r\n            if (filterDecimal) {\r\n                decimal = filterDecimal;\r\n                group = filterDecimal === ',' ? '.' : ',';\r\n\r\n                // Validate that the input matches this interpretation\r\n                if (commaCount > 0 && dotCount > 0) {\r\n                    // Both present: check if filterDecimal matches the last one (which should be decimal)\r\n                    const lastIsComma = lastCommaPos > lastDotPos;\r\n                    if ((filterDecimal === ',' && !lastIsComma) || (filterDecimal === '.' && lastIsComma)) {\r\n                        return null;\r\n                    }\r\n                } else if (dotCount === 1 && commaCount === 0) {\r\n                    // Only one dot: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                    const afterDot = numericPart.substring(lastDotPos + 1);\r\n                    if (afterDot.length !== 3) {\r\n                        // It's a decimal separator, must match filterDecimal\r\n                        if (filterDecimal !== '.') {\r\n                            return null;\r\n                        }\r\n                    }\r\n                } else if (commaCount === 1 && dotCount === 0) {\r\n                    // Only one comma: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                    const afterComma = numericPart.substring(lastCommaPos + 1);\r\n                    if (afterComma.length !== 3) {\r\n                        // It's a decimal separator, must match filterDecimal\r\n                        if (filterDecimal !== ',') {\r\n                            return null;\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                // Infer from the input pattern\r\n                if (commaCount > 0 && dotCount > 0) {\r\n                    // Both present: the one that appears last is decimal\r\n                    if (lastCommaPos > lastDotPos) {\r\n                        decimal = ',';\r\n                        group = '.';\r\n                    }\r\n                } else if (dotCount === 1 && commaCount === 0) {\r\n                    // Only one dot: check if it's followed by exactly 3 digits\r\n                    const afterDot = numericPart.substring(lastDotPos + 1);\r\n                    if (afterDot.length === 3) {\r\n                        // Likely a thousands separator\r\n                        decimal = ',';\r\n                        group = '.';\r\n                    }\r\n                } else if (commaCount === 1 && dotCount === 0) {\r\n                    // Only one comma: check if it's followed by exactly 3 digits\r\n                    const afterComma = numericPart.substring(lastCommaPos + 1);\r\n                    if (afterComma.length !== 3) {\r\n                        // Likely a decimal separator\r\n                        decimal = ',';\r\n                        group = '.';\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Normalize: remove group separator, convert decimal to '.'\r\n            let normalized = '';\r\n            for (let i = 0; i < numericPart.length; i++) {\r\n                const char = numericPart[i];\r\n                if (char === group) continue;\r\n                if (char === decimal) {\r\n                    normalized += '.';\r\n                } else {\r\n                    normalized += char;\r\n                }\r\n            }\r\n\r\n            const parsed = parseFloat(normalized);\r\n            if (isNaN(parsed)) return null;\r\n\r\n            const finalValue = isNegative ? -parsed : parsed;\r\n\r\n            // Build mask\r\n            const dotPos = normalized.indexOf('.');\r\n            const decimalPlaces = dotPos !== -1 ? normalized.length - dotPos - 1 : 0;\r\n            const maskDecimal = decimalPlaces ? decimal + '0'.repeat(decimalPlaces) : '';\r\n            const groupMask = '#' + group + '##0';\r\n            const needsSpace = symbol && !symbol.endsWith(' ') && !symbol.endsWith('\\t') && !hasParens;\r\n            let mask = symbol + (needsSpace ? ' ' : '') + groupMask + maskDecimal;\r\n\r\n            if (hasParens) {\r\n                mask = `(${mask})`;\r\n            }\r\n\r\n            return {\r\n                mask,\r\n                value: finalValue,\r\n                type: 'currency',\r\n                category: 'numeric'\r\n            };\r\n        }\r\n\r\n        const autoCastingNumber = function (input, filterDecimal) {\r\n            // If you currently support numeric inputs directly, keep this:\r\n            if (typeof input === 'number' && Number.isFinite(input)) {\r\n                return { mask: '0', value: input, type: 'number', category: 'numeric' };\r\n            }\r\n\r\n            if (typeof input !== 'string') {\r\n                return null;\r\n            }\r\n\r\n            const sRaw = input.trim();\r\n\r\n            // Check for simple integers first (with optional sign)\r\n            if (/^[+-]?\\d+$/.test(sRaw)) {\r\n                const sign = /^[+-]/.test(sRaw) ? sRaw[0] : '';\r\n                const digitsClean = (sign ? sRaw.slice(1) : sRaw);\r\n                const rawDigits = sign ? sRaw.slice(1) : sRaw;\r\n                const m = rawDigits.match(/^0+/);\r\n                const leadingZeros = m ? m[0].length : 0;\r\n                const mask = leadingZeros > 0 ? '0'.repeat(rawDigits.length) : '0';\r\n                const value = Number(sign + digitsClean);\r\n                return { mask, value, type: 'number', category: 'numeric' };\r\n            }\r\n\r\n            // Check for formatted numbers with thousand separators (no letters, no symbols)\r\n            // Examples: \"1,000.25\", \"1.000,25\", \"-1,234.56\"\r\n            if (/^[+-]?[\\d,.]+$/.test(sRaw)) {\r\n                let isNegative = sRaw[0] === '-';\r\n                let numStr = isNegative ? sRaw.slice(1) : sRaw;\r\n\r\n                // Count separators\r\n                const commaCount = (numStr.match(/,/g) || []).length;\r\n                const dotCount = (numStr.match(/\\./g) || []).length;\r\n\r\n                // Must have at least one digit\r\n                if (!/\\d/.test(numStr)) return null;\r\n\r\n                // Infer decimal and group separators\r\n                let decimal = '.';\r\n                let group = ',';\r\n\r\n                const lastCommaPos = numStr.lastIndexOf(',');\r\n                const lastDotPos = numStr.lastIndexOf('.');\r\n\r\n                // If filterDecimal is provided, use it to determine separators\r\n                if (filterDecimal) {\r\n                    decimal = filterDecimal;\r\n                    group = filterDecimal === ',' ? '.' : ',';\r\n\r\n                    // Validate that the input matches this interpretation\r\n                    if (commaCount > 0 && dotCount > 0) {\r\n                        // Both present: check if filterDecimal matches the last one (which should be decimal)\r\n                        const lastIsComma = lastCommaPos > lastDotPos;\r\n                        if ((filterDecimal === ',' && !lastIsComma) || (filterDecimal === '.' && lastIsComma)) {\r\n                            return null;\r\n                        }\r\n                    } else if (dotCount === 1 && commaCount === 0) {\r\n                        // Only one dot: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                        const afterDot = numStr.substring(lastDotPos + 1);\r\n                        if (afterDot.length !== 3 || /[,.]/.test(afterDot)) {\r\n                            // It's a decimal separator, must match filterDecimal\r\n                            if (filterDecimal !== '.') {\r\n                                return null;\r\n                            }\r\n                        }\r\n                    } else if (commaCount === 1 && dotCount === 0) {\r\n                        // Only one comma: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                        const afterComma = numStr.substring(lastCommaPos + 1);\r\n                        if (afterComma.length !== 3 || /[,.]/.test(afterComma)) {\r\n                            // It's a decimal separator, must match filterDecimal\r\n                            if (filterDecimal !== ',') {\r\n                                return null;\r\n                            }\r\n                        }\r\n                    }\r\n                } else {\r\n                    // Infer from the input pattern\r\n                    if (commaCount > 0 && dotCount > 0) {\r\n                        // Both present: the one that appears last is decimal\r\n                        if (lastCommaPos > lastDotPos) {\r\n                            decimal = ',';\r\n                            group = '.';\r\n                        }\r\n                    } else if (dotCount === 1 && commaCount === 0) {\r\n                        // Only one dot: check if it's followed by exactly 3 digits (thousands separator)\r\n                        const afterDot = numStr.substring(lastDotPos + 1);\r\n                        if (afterDot.length === 3 && !/[,.]/.test(afterDot)) {\r\n                            decimal = ',';\r\n                            group = '.';\r\n                        }\r\n                    } else if (commaCount === 1 && dotCount === 0) {\r\n                        // Only one comma: check if it's NOT followed by exactly 3 digits (decimal separator)\r\n                        const afterComma = numStr.substring(lastCommaPos + 1);\r\n                        if (afterComma.length !== 3 || /[,.]/.test(afterComma)) {\r\n                            decimal = ',';\r\n                            group = '.';\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Check if group separator is actually used in the input\r\n                const hasGroupSeparator = (group === ',' && commaCount > 1) || (group === '.' && dotCount > 1) ||\r\n                    (group === ',' && decimal === '.' && commaCount > 0) ||\r\n                    (group === '.' && decimal === ',' && dotCount > 0);\r\n\r\n                // Normalize: remove group separator, convert decimal to '.'\r\n                let normalized = numStr.replace(new RegExp('\\\\' + group, 'g'), '').replace(decimal, '.');\r\n                const parsed = parseFloat(normalized);\r\n                if (isNaN(parsed)) return null;\r\n\r\n                const value = isNegative ? -parsed : parsed;\r\n\r\n                // Build mask\r\n                const dotPos = normalized.indexOf('.');\r\n                const decimalPlaces = dotPos !== -1 ? normalized.length - dotPos - 1 : 0;\r\n                const maskDecimal = decimalPlaces ? decimal + '0'.repeat(decimalPlaces) : '';\r\n                const mask = (hasGroupSeparator ? '#' + group + '##0' : '0') + maskDecimal;\r\n\r\n                return { mask, value, type: 'number', category: 'numeric' };\r\n            }\r\n\r\n            return null;\r\n        };\r\n\r\n        const autoCastingScientific = function(input) {\r\n            if (typeof input !== 'string') return null;\r\n\r\n            const original = input.trim();\r\n\r\n            // Match scientific notation: 1e3, -2.5E-4, etc.\r\n            const sciPattern = /^[-+]?\\d*\\.?\\d+[eE][-+]?\\d+$/;\r\n            if (!sciPattern.test(original)) return null;\r\n\r\n            const parsed = parseFloat(original);\r\n            if (isNaN(parsed)) return null;\r\n\r\n            // Extract parts to determine mask\r\n            const [coefficient, exponent] = original.toLowerCase().split('e');\r\n            const decimalPlaces = coefficient.includes('.') ? coefficient.split('.')[1].length : 0;\r\n            const mask = `0${decimalPlaces ? '.' + '0'.repeat(decimalPlaces) : ''}E+00`;\r\n\r\n            return {\r\n                mask,\r\n                value: parsed,\r\n                type: 'scientific',\r\n                category: 'scientific'\r\n            };\r\n        }\r\n\r\n        const autoCastingTime = function (input) {\r\n            if (typeof input !== 'string') return null;\r\n            const original = input.trim();\r\n\r\n            // hh:mm[:ss][ am/pm]\r\n            const m = original.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?(?:\\s*(am|pm))?$/i);\r\n            if (!m) return null;\r\n\r\n            let h = parseInt(m[1], 10);\r\n            const i = parseInt(m[2], 10);\r\n            const s = m[3] ? parseInt(m[3], 10) : 0;\r\n            const mer = m[4] && m[4].toLowerCase();\r\n\r\n            // basic range checks\r\n            if (i > 59 || s > 59) return null;\r\n            if (mer) {\r\n                if (h < 1 || h > 12) return null;\r\n                if (mer === 'pm' && h < 12) h += 12;\r\n                if (mer === 'am' && h === 12) h = 0;\r\n            } else {\r\n                if (h > 23) return null;\r\n            }\r\n\r\n            // Excel serial for time-of-day = hours/24 + minutes/1440 + seconds/86400\r\n            const excel = (h + i / 60 + s / 3600) / 24;\r\n\r\n            // Build mask according to how user typed it\r\n            const hourToken = m[1].length === 1 ? 'h' : 'hh';\r\n            const base = s !== 0 || m[3] ? `${hourToken}:mm:ss` : `${hourToken}:mm`;\r\n            const mask = mer ? `${base} am/pm` : base;\r\n\r\n            // Verify we can render back exactly what the user typed\r\n            if (testMask(mask, excel, original)) {            // uses Component.render under the hood\r\n                return { mask: mask, value: excel, type: 'time', category: 'datetime' };\r\n            }\r\n\r\n            // Try alternate hour width if needed\r\n            const altHour = hourToken === 'hh' ? 'h' : 'hh';\r\n            const alt = mer\r\n                ? `${altHour}${base.slice(hourToken.length)} am/pm`\r\n                : `${altHour}${base.slice(hourToken.length)}`;\r\n\r\n            if (testMask(alt, excel, original)) {\r\n                return { mask: alt, value: excel, type: 'time', category: 'datetime' };\r\n            }\r\n\r\n            return null;\r\n        };\r\n\r\n        const ParseValue = function(v, config) {\r\n            if (v === '') return '';\r\n\r\n            const originalInput = '' + v;\r\n            const decimal = config.decimal || '.';\r\n\r\n            // Validate that the input looks like a reasonable number format before extracting digits\r\n            // Reject strings that are clearly not intended to be numbers (e.g., \"test123\", \"abc\", etc.)\r\n            const hasLetters = /[a-zA-Z]/.test(originalInput);\r\n            const hasDigits = /[0-9]/.test(originalInput);\r\n\r\n            if (hasLetters && hasDigits) {\r\n                // Mixed letters and digits - check if it's a valid numeric format\r\n                // Allow currency symbols, currency codes (3 letters), percentage, and separators\r\n\r\n                // Remove all valid numeric characters and symbols\r\n                let cleaned = originalInput.replace(/[\\d\\s.,\\-+()]/g, ''); // Remove digits, spaces, separators, signs, parentheses\r\n                cleaned = cleaned.replace(/[A-Z]{1,2}[€$£¥₹₽₩₫¢]/gi, ''); // Remove 1-2 letter prefix + currency symbol (R$, U$, etc.)\r\n                cleaned = cleaned.replace(/[€$£¥₹₽₩₫¢]/g, ''); // Remove remaining currency symbols\r\n                cleaned = cleaned.replace(/%/g, ''); // Remove percentage\r\n                cleaned = cleaned.replace(/\\b[A-Z]{3}\\b/g, ''); // Remove 3-letter currency codes (USD, BRL, etc.)\r\n\r\n                // If anything remains, it's likely invalid (like \"test\" in \"test123\")\r\n                if (cleaned.trim().length > 0) {\r\n                    return null; // Reject patterns like \"test123\", \"abc123\", etc.\r\n                }\r\n            }\r\n\r\n            v = originalInput.split(decimal);\r\n\r\n            // Detect negative sign\r\n            let signal = v[0].includes('-');\r\n\r\n            v[0] = v[0].match(/[0-9]+/g);\r\n            if (v[0]) {\r\n                if (signal) v[0].unshift('-');\r\n                v[0] = v[0].join('');\r\n            } else {\r\n                v[0] = signal ? '-' : '';\r\n            }\r\n\r\n            if (v[1] !== undefined) {\r\n                v[1] = v[1].match(/[0-9]+/g);\r\n                v[1] = v[1] ? v[1].join('') : '';\r\n            }\r\n\r\n            return v[0] || v[1] ? v : '';\r\n        }\r\n\r\n        const Extract = function(v, config) {\r\n            const parsed = ParseValue(v, config);\r\n            if (parsed) {\r\n                if (parsed[0] === '-') {\r\n                    parsed[0] = '-0';\r\n                }\r\n                return parseFloat(parsed.join('.'));\r\n            }\r\n            return null;\r\n        }\r\n\r\n        /**\r\n         * Try to get which mask that can transform the number in that format\r\n         * @param {string|number} value - The value to detect the mask for\r\n         * @param {string} [decimal] - Optional decimal separator filter ('.' or ',')\r\n         */\r\n        Component.autoCasting = function(value, decimal) {\r\n            // Check cache first - use string value and decimal as key\r\n            const cacheKey = decimal ? String(value) + '|' + decimal : String(value);\r\n            let cached = autoCastingCache[cacheKey];\r\n            if (cached !== undefined) {\r\n                return cached;\r\n            }\r\n\r\n            const methods = [\r\n                autoCastingDates,        // Most structured, the least ambiguous\r\n                autoCastingTime,\r\n                autoCastingFractions,    // Specific pattern with slashes\r\n                autoCastingPercent,      // Recognizable with \"%\"\r\n                autoCastingScientific,\r\n                (v) => autoCastingNumber(v, decimal),       // Only picks up basic digits, decimals, leading 0s\r\n                (v) => autoCastingCurrency(v, decimal),     // Complex formats, but recognizable\r\n            ];\r\n\r\n            let result = null;\r\n            for (let method of methods) {\r\n                const test = method(value);\r\n                if (test) {\r\n                    result = test;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // Cache the result (even if null)\r\n            autoCastingCache[cacheKey] = result;\r\n            return result;\r\n        }\r\n\r\n        Component.extract = function(value, options, returnObject) {\r\n            if (! value || typeof options !== 'object') {\r\n                return value;\r\n            }\r\n\r\n            if (options.locale) {\r\n                const config = getConfig(options, value);\r\n                config.value = Extract(value, config);\r\n                if (value.toString().indexOf('%') !== -1) {\r\n                    config.value /= 100;\r\n                }\r\n                return returnObject ? config : config.value;\r\n            } else if (options.mask) {\r\n                let mask = options.mask.split(';')[0];\r\n                if (mask) {\r\n                    options.mask = mask;\r\n                }\r\n\r\n                // Get decimal, group, type, etc.\r\n                const config = getConfig(options, value);\r\n                const type = config.type;\r\n\r\n                let result;\r\n                let o = options;\r\n\r\n                if (type === 'text') {\r\n                    result = value;\r\n                } else if (type === 'general') {\r\n                    result = Component(value, options);\r\n                } else if (type === 'datetime') {\r\n                    if (value instanceof Date) {\r\n                        value = Component.getDateString(value, config.mask);\r\n                    }\r\n\r\n                    o = Component(value, options, true);\r\n\r\n                    result = typeof o.value === 'number' ? o.value : extractDate.call(o);\r\n                } else if (type === 'scientific') {\r\n                    result = typeof value === 'string' ? Number(value) : value;\r\n                } else if (type === 'fraction') {\r\n                    // Parse a fraction string according to the mask (supports mixed \"# ?/d\" or simple \"?/d\")\r\n                    const mask = config.mask;\r\n\r\n                    // Detect fixed denominator (e.g. \"# ?/16\" or \"?/8\")\r\n                    const fixedDenMatch = mask.match(/\\/\\s*(\\d+)\\s*$/);\r\n                    const fixedDen = fixedDenMatch ? parseInt(fixedDenMatch[1], 10) : null;\r\n\r\n                    // Whether a mask allows a whole part (e.g. \"# ?/?\")\r\n                    const allowWhole = mask.includes('#');\r\n\r\n                    let s = ('' + value).trim();\r\n                    if (!s) {\r\n                        result = null;\r\n                    } else {\r\n                        // Allow leading parentheses or '-' for negatives\r\n                        let sign = 1;\r\n                        if (/^\\(.*\\)$/.test(s)) {\r\n                            sign = -1;\r\n                            s = s.slice(1, -1).trim();\r\n                        }\r\n                        if (/^\\s*-/.test(s)) {\r\n                            sign = -1;\r\n                            s = s.replace(/^\\s*-/, '').trim();\r\n                        }\r\n\r\n                        let out = null;\r\n\r\n                        if (s.includes('/')) {\r\n                            // sign? (whole )? numerator / denominator\r\n                            // Examples:\r\n                            //  \"1 1/2\" => whole=1, num=1, den=2\r\n                            //  \"1/2\"   => whole=undefined, num=1, den=2\r\n                            const m = s.match(/^\\s*(?:(\\d+)\\s+)?(\\d+)\\s*\\/\\s*(\\d+)\\s*$/);\r\n                            if (m) {\r\n                                const whole = allowWhole && m[1] ? parseInt(m[1], 10) : 0;\r\n                                const num = parseInt(m[2], 10);\r\n                                let den = parseInt(m[3], 10);\r\n\r\n                                // If mask fixes the denominator, enforce it\r\n                                if (fixedDen) den = fixedDen;\r\n\r\n                                if (den !== 0) {\r\n                                    out = sign * (whole + num / den);\r\n                                }\r\n                            }\r\n                        } else {\r\n                            // No slash → treats as a plain number (e.g., whole only)\r\n                            const plain = Number(s.replace(',', '.'));\r\n                            if (!Number.isNaN(plain)) {\r\n                                out = sign * Math.abs(plain);\r\n                            }\r\n                        }\r\n\r\n                        result = out;\r\n                    }\r\n                } else {\r\n                    // Default fallback — numeric/currency/percent/etc.\r\n                    result = Extract(value, config);\r\n                    // Adjust percent\r\n                    if (type === 'percentage' && ('' + value).indexOf('%') !== -1) {\r\n                        result = result / 100;\r\n                    }\r\n                }\r\n\r\n                o.value = result;\r\n\r\n                if (!o.type && type) {\r\n                    o.type = type;\r\n                }\r\n\r\n                return returnObject ? o : result;\r\n            }\r\n\r\n            return value;\r\n        };\r\n\r\n        Component.render = function(value, options, fullMask, strict) {\r\n            // Nothing to render\r\n            if (value === '' || value === undefined || value === null) {\r\n                return '';\r\n            }\r\n\r\n            // Store original value for strict mode\r\n            const originalValue = value;\r\n\r\n            // Config\r\n            const config = getConfig(options, value);\r\n\r\n            if (config.locale) {\r\n                value = Component(value, options);\r\n            } else if (config.mask) {\r\n                // Percentage\r\n                if (config.type === 'datetime') {\r\n                    var t = Component.getDateString(value, config.mask);\r\n                    if (t) {\r\n                        value = t;\r\n                    } else {\r\n                        return '';\r\n                    }\r\n                } else if (config.type === 'text') {\r\n                    // Parse number\r\n                    if (typeof (value) === 'number') {\r\n                        value = value.toString();\r\n                    }\r\n                } else {\r\n                    // Strict mode: for numeric masks, if string input is not a valid number,\r\n                    // return original value unchanged (Excel-like behavior)\r\n                    if (strict && typeof(originalValue) === 'string' && !isNumber(originalValue)) {\r\n                        return originalValue;\r\n                    }\r\n                    if (config.type === 'percentage') {\r\n                        if (typeof (value) === 'string' && value.indexOf('%') !== -1) {\r\n                            value = value.replace('%', '');\r\n                        } else {\r\n                            value = adjustPrecision(Number(value) * 100);\r\n                        }\r\n                    } else {\r\n                        if (config.mask.includes(',,M')) {\r\n                            if (typeof (value) === 'string' && value.indexOf('M') !== -1) {\r\n                                value = value.replace('M', '');\r\n                            } else {\r\n                                value = Number(value) / 1000000;\r\n                            }\r\n                        } else if (config.mask.includes(',,,B')) {\r\n                            if (typeof (value) === 'string' && value.indexOf('B') !== -1) {\r\n                                value = value.replace('B', '');\r\n                            } else {\r\n                                value = Number(value) / 1000000000;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (typeof (value) === 'string' && isNumber(value)) {\r\n                        value = Number(value);\r\n                    }\r\n\r\n                    if (typeof value === 'number') {\r\n                        // Temporary value\r\n                        let temp = value;\r\n\r\n                        if (config.type === 'fraction') {\r\n                            temp = formatFraction(value, config.mask);\r\n                        } else {\r\n                            if (fullMask) {\r\n                                temp = adjustNumberOfDecimalPlaces(config, value);\r\n\r\n                                if (config.type === 'scientific') {\r\n                                    return temp;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        value = toPlainString(temp);\r\n\r\n                        if (config.decimal === ',') {\r\n                            value = value.replace('.', config.decimal);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Process mask\r\n                let control = Component(value, options, true);\r\n                // Complement render\r\n                if (fullMask) {\r\n                    processNumOfPaddingZeros(control);\r\n                }\r\n\r\n                value = getValue(control);\r\n\r\n                // If numeric mask but no numbers in input, return empty\r\n                if (isNumeric(control.type)) {\r\n                    // Check if any numeric digit was actually extracted\r\n                    const hasNumericValue = control.values.some(v => v && /\\d/.test(v));\r\n                    if (! hasNumericValue) {\r\n                        value = '';\r\n                    }\r\n                }\r\n\r\n                if (options.input && options.input.tagName) {\r\n                    if (options.input.contentEditable) {\r\n                        options.input.textContent = value;\r\n                    } else {\r\n                        options.input.value = value;\r\n                    }\r\n                    focus(options.input);\r\n                }\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        // Helper to extract date from a string\r\n        Component.extractDateFromString = function (date, format) {\r\n            let o = Component(date, { mask: format }, true);\r\n\r\n            // Check if in format Excel (Need difference with format date or type detected is numeric)\r\n            if (date > 0 && Number(date) == date && (o.values.join(\"\") !== o.value || o.type == \"numeric\")) {\r\n                var d = new Date(Math.round((date - 25569) * 86400 * 1000));\r\n                return d.getFullYear() + \"-\" + Helpers.two(d.getMonth()) + \"-\" + Helpers.two(d.getDate()) + ' 00:00:00';\r\n            }\r\n\r\n            let complete = false;\r\n\r\n            if (o.values && o.values.length === o.tokens.length && o.values[o.values.length - 1].length >= o.tokens[o.tokens.length - 1].length) {\r\n                complete = true;\r\n            }\r\n\r\n            if (o.date[0] && o.date[1] && (o.date[2] || complete)) {\r\n                if (!o.date[2]) {\r\n                    o.date[2] = 1;\r\n                }\r\n\r\n                return o.date[0] + '-' + Helpers.two(o.date[1]) + '-' + Helpers.two(o.date[2]) + ' ' + Helpers.two(o.date[3]) + ':' + Helpers.two(o.date[4]) + ':' + Helpers.two(o.date[5]);\r\n            }\r\n\r\n            return '';\r\n        }\r\n\r\n        // Tokens\r\n        const dateTokens = ['DAY', 'WD', 'DDDD', 'DDD', 'DD', 'D', 'Q', 'HH24', 'HH12', 'HH', '\\\\[H\\\\]', 'H', 'AM/PM', 'MI', 'SS', 'MS', 'YYYY', 'YYY', 'YY', 'Y', 'MONTH', 'MON', 'MMMMM', 'MMMM', 'MMM', 'MM', 'M', '.'];\r\n        // All date tokens\r\n        const allDateTokens = dateTokens.join('|')\r\n\r\n        Component.getDateString = function(value, options) {\r\n            if (! options) {\r\n                options = {};\r\n            }\r\n\r\n            // Labels\r\n            let format;\r\n\r\n            if (options && typeof(options) == 'object') {\r\n                if (options.format) {\r\n                    format = options.format;\r\n                } else if (options.mask) {\r\n                    format = options.mask;\r\n                }\r\n            } else {\r\n                format = options;\r\n            }\r\n\r\n            if (! format) {\r\n                format = 'YYYY-MM-DD';\r\n            }\r\n\r\n            format = format.toUpperCase();\r\n\r\n            // Date instance\r\n            if (value instanceof Date) {\r\n                value = Helpers.now(value);\r\n            } else if (isNumber(value)) {\r\n                value = Helpers.numToDate(value);\r\n            }\r\n\r\n\r\n            // Expression to extract all tokens from the string\r\n            let e = new RegExp(allDateTokens, 'gi');\r\n            // Extract\r\n            let t = format.match(e);\r\n\r\n            // Compatibility with Excel\r\n            fixMinuteToken(t);\r\n\r\n            // Object\r\n            const o = {\r\n                tokens: t\r\n            }\r\n\r\n            // Value\r\n            if (value) {\r\n                try {\r\n                    // Data\r\n                    o.data = extractDateAndTime(value);\r\n\r\n                    if (o.data[1] && o.data[1] > 12) {\r\n                        throw new Error('Invalid date');\r\n                    } else if (o.data[4] && o.data[4] > 59) {\r\n                        throw new Error('Invalid date');\r\n                    } else if (o.data[5] && o.data[5] > 59) {\r\n                        throw new Error('Invalid date');\r\n                    } else if (o.data[0] != null && o.data[1] != null) {\r\n                        let day = new Date(o.data[0], o.data[1], 0).getDate();\r\n                        if (o.data[2] > day) {\r\n                            throw new Error('Invalid date');\r\n                        }\r\n                    }\r\n\r\n                    // Value\r\n                    o.value = [];\r\n\r\n                    // Calendar instance\r\n                    let calendar = new Date(o.data[0], o.data[1] - 1, o.data[2], o.data[3], o.data[4], o.data[5]);\r\n\r\n                    if (o.data[0] === null && o.data[1] === null && o.data[2] === null) {\r\n                        // Do nothing\r\n                    } else {\r\n                        if (isNaN(calendar.getTime())) {\r\n                            throw new Error('Invalid date');\r\n                        }\r\n                    }\r\n\r\n                    // Get method\r\n                    const get = function (i) {\r\n                        // Token\r\n                        let t = this.tokens[i];\r\n\r\n                        // Case token\r\n                        let s = t.toUpperCase();\r\n                        let v = null;\r\n\r\n                        if (s === 'YYYY') {\r\n                            v = this.data[0];\r\n                        } else if (s === 'YYY') {\r\n                            v = this.data[0];\r\n                            if (v) {\r\n                                v = v.substring(1, 4);\r\n                            }\r\n                        } else if (s === 'YY') {\r\n                            v = this.data[0];\r\n                            if (v) {\r\n                                v = v.substring(2, 4);\r\n                            }\r\n                        } else if (s === 'Y') {\r\n                            v = this.data[0];\r\n                            if (v) {\r\n                                v = v.substring(3, 4);\r\n                            }\r\n                        } else if (t === 'MON') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3).toUpperCase();\r\n                            }\r\n                        } else if (t === 'mon') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3).toLowerCase();\r\n                            }\r\n                        } else if (t === 'MONTH') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.toUpperCase();\r\n                            }\r\n                        } else if (t === 'month') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.toLowerCase();\r\n                            }\r\n                        } else if (s === 'MMMMM') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 1);\r\n                            }\r\n                        } else if (s === 'MMMM' || t === 'Month') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                        } else if (s === 'MMM' || t == 'Mon') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3);\r\n                            }\r\n                        } else if (s === 'MM') {\r\n                            v = Helpers.two(this.data[1]);\r\n                        } else if (s === 'M') {\r\n                            v = calendar.getMonth() + 1;\r\n                        } else if (t === 'DAY') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                            if (v) {\r\n                                v = v.toUpperCase();\r\n                            }\r\n                        } else if (t === 'day') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                            if (v) {\r\n                                v = v.toLowerCase();\r\n                            }\r\n                        } else if (s === 'DDDD' || t == 'Day') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                        } else if (s === 'DDD') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3);\r\n                            }\r\n                        } else if (s === 'DD') {\r\n                            v = Helpers.two(this.data[2]);\r\n                        } else if (s === 'D') {\r\n                            v = parseInt(this.data[2]);\r\n                        } else if (s === 'Q') {\r\n                            v = Math.floor((calendar.getMonth() + 3) / 3);\r\n                        } else if (s === 'HH24' || s === 'HH') {\r\n                            v = this.data[3]%24;\r\n                            if (this.tokens.indexOf('AM/PM') !== -1) {\r\n                                if (v > 12) {\r\n                                    v -= 12;\r\n                                } else if (v == '0' || v == '00') {\r\n                                    v = 12;\r\n                                }\r\n                            }\r\n                            v = Helpers.two(v);\r\n                        } else if (s === 'HH12') {\r\n                            v = this.data[3]%24;\r\n                            if (v > 12) {\r\n                                v = Helpers.two(v - 12);\r\n                            } else {\r\n                                v = Helpers.two(v);\r\n                            }\r\n                        } else if (s === 'H') {\r\n                            v = this.data[3]%24;\r\n                            if (this.tokens.indexOf('AM/PM') !== -1) {\r\n                                if (v > 12) {\r\n                                    v -= 12;\r\n                                } else if (v == '0' || v == '00') {\r\n                                    v = 12;\r\n                                }\r\n                            }\r\n                        } else if (s === '[H]') {\r\n                            v = this.data[3];\r\n                        } else if (s === 'MI') {\r\n                            v = Helpers.two(this.data[4]);\r\n                        } else if (s === 'I') {\r\n                            v = parseInt(this.data[4]);\r\n                        } else if (s === 'SS') {\r\n                            v = Helpers.two(this.data[5]);\r\n                        } else if (s === 'S') {\r\n                            v = parseInt(this.data[5]);\r\n                        } else if (s === 'MS') {\r\n                            v = calendar.getMilliseconds();\r\n                        } else if (s === 'AM/PM') {\r\n                            if (this.data[3] >= 12) {\r\n                                v = 'PM';\r\n                            } else {\r\n                                v = 'AM';\r\n                            }\r\n                        } else if (s === 'WD') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                        }\r\n\r\n                        if (v === null) {\r\n                            this.value[i] = this.tokens[i];\r\n                        } else {\r\n                            this.value[i] = v;\r\n                        }\r\n                    }\r\n\r\n                    for (let i = 0; i < o.tokens.length; i++) {\r\n                        get.call(o, i);\r\n                    }\r\n\r\n                    value = o.value.join('');\r\n                } catch (e) {\r\n                    value = '';\r\n                }\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        Component.getDate = function(value, format) {\r\n            if (! format) {\r\n                format = 'YYYY-MM-DD';\r\n            }\r\n\r\n            let ret = value;\r\n            if (ret && Number(ret) == ret) {\r\n                ret = Helpers.numToDate(ret);\r\n            }\r\n\r\n            // Try a formatted date\r\n            if (! Helpers.isValidDateFormat(ret)) {\r\n                let tmp = Component.extractDateFromString(ret, format);\r\n                if (tmp) {\r\n                    ret = tmp;\r\n                }\r\n            }\r\n\r\n            return Component.getDateString(ret, format);\r\n        }\r\n\r\n        Component.oninput = function(e, mask) {\r\n            // Element\r\n            let element = e.target;\r\n            // Property\r\n            let property = 'value';\r\n            // Get the value of the input\r\n            if (element.tagName !== 'INPUT') {\r\n                property = 'textContent';\r\n            }\r\n            // Value\r\n            let value = element[property];\r\n            // Get the mask\r\n            if (! mask) {\r\n                mask = element.getAttribute('data-mask') || element.mask;\r\n            }\r\n            // Keep the current caret position\r\n            let caret = getCaret(element);\r\n            if (caret) {\r\n                value = value.substring(0, caret) + hiddenCaret + value.substring(caret);\r\n            }\r\n\r\n            if (typeof mask === 'string') {\r\n                mask = { mask: mask };\r\n            }\r\n\r\n            if (mask.locale) {\r\n                return;\r\n            }\r\n\r\n            // Run mask\r\n            let result = Component(value, mask, true);\r\n\r\n            // New value\r\n            let newValue = result.values.join('');\r\n            // Apply the result back to the element\r\n            if (newValue !== value && ! e.inputType.includes('delete')) {\r\n                // Set the caret to the position before transformation\r\n                let caret = newValue.indexOf(hiddenCaret);\r\n                if (caret !== -1) {\r\n                    // Apply value\r\n                    element[property] = newValue.replace(hiddenCaret, \"\");\r\n                    // Set caret\r\n                    setCaret.call(element, caret);\r\n                } else {\r\n                    // Apply value\r\n                    element[property] = newValue;\r\n                    // Make sure the caret is positioned in the end\r\n                    focus(element);\r\n                }\r\n            }\r\n        }\r\n\r\n        Component.getType = function(config) {\r\n            // Get configuration\r\n            const control = getConfig(config, null);\r\n\r\n            return control.type;\r\n        };\r\n\r\n        Component.adjustPrecision = adjustPrecision;\r\n\r\n        return Component;\r\n    })();\r\n\r\n    return { Mask: Mask, Helpers: Helpers };\r\n})));\n\n/***/ }),\n\n/***/ 763:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (! lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\nif (! Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(72);\r\n}\r\n\r\nif (! utils && \"function\" === 'function') {\r\n    var utils = __webpack_require__(791);\r\n}\r\n\r\nconst Helpers = utils.Helpers;\r\nconst Mask = utils.Mask;\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Translations\r\n    const T = function(t) {\r\n        if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n            return document.dictionary[t] || t;\r\n        } else {\r\n            return t;\r\n        }\r\n    }\r\n\r\n    const filterData = function(year, month) {\r\n        // Data for the month\r\n        let data = {};\r\n        if (Array.isArray(this.data)) {\r\n            this.data.map(function (v) {\r\n                if (!v || typeof v !== 'object' || typeof v.date !== 'string') {\r\n                    return;\r\n                }\r\n                let d = year + '-' + Helpers.two(month + 1);\r\n                if (v.date.substring(0, 7) === d) {\r\n                    if (!data[v.date]) {\r\n                        data[v.date] = [];\r\n                    }\r\n                    data[v.date].push(v);\r\n                }\r\n            });\r\n        }\r\n        return data;\r\n    }\r\n\r\n    // Get the short weekdays name\r\n    const getWeekdays = function(firstDayOfWeek) {\r\n        const reorderedWeekdays = [];\r\n        for (let i = 0; i < 7; i++) {\r\n            const dayIndex = (firstDayOfWeek + i) % 7;\r\n            reorderedWeekdays.push(Helpers.weekdays[dayIndex]);\r\n        }\r\n\r\n        return reorderedWeekdays.map(w => {\r\n            return { title: w.substring(0, 1) };\r\n        });\r\n    }\r\n\r\n    const Views = function(self) {\r\n        const view = {};\r\n\r\n        // Create years container\r\n        view.years = [];\r\n        view.months = [];\r\n        view.days = [];\r\n        view.hours = [];\r\n        view.minutes = [];\r\n\r\n        for (let i = 0; i < 16; i++) {\r\n            view.years.push({\r\n                title: null,\r\n                value: null,\r\n                selected: false,\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 12; i++) {\r\n            view.months.push({\r\n                title: null,\r\n                value: null,\r\n                selected: false,\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 42; i++) {\r\n            view.days.push({\r\n                title: null,\r\n                value: null,\r\n                selected: false,\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 24; i++) {\r\n            view.hours.push({\r\n                title: Helpers.two(i),\r\n                value: i\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 60; i++) {\r\n            view.minutes.push({\r\n                title: Helpers.two(i),\r\n                value: i\r\n            });\r\n        }\r\n\r\n        view.years.update = function(date) {\r\n            let year = date.getUTCFullYear();\r\n            let start = year - (year % 16);\r\n\r\n            for (let i = 0; i < 16; i++) {\r\n                let item = view.years[i];\r\n                let value = start + i;\r\n\r\n                item.title = value\r\n                item.value = value;\r\n\r\n                if (self.cursor.y === value) {\r\n                    item.selected = true;\r\n                    // Current item\r\n                    self.cursor.current = item;\r\n                } else {\r\n                    item.selected = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        view.months.update = function(date) {\r\n            let year = date.getUTCFullYear();\r\n\r\n            for (let i = 0; i < 12; i++) {\r\n                let item = view.months[i];\r\n\r\n                item.title = Helpers.months[i].substring(0,3);\r\n                item.value = i;\r\n\r\n                if (self.cursor.y === year && self.cursor.m === i) {\r\n                    item.selected = true;\r\n                    // Current item\r\n                    self.cursor.current = item;\r\n                } else {\r\n                    item.selected = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        view.days.update = function(date) {\r\n            let year = date.getUTCFullYear();\r\n            let month = date.getUTCMonth();\r\n            let data = filterData.call(self, year, month);\r\n\r\n            // First day\r\n            let tmp = new Date(Date.UTC(year, month, 1, 0, 0, 0));\r\n            let firstDayOfMonth = tmp.getUTCDay();\r\n            let firstDayOfWeek = self.startingDay ?? 0;\r\n\r\n            // Calculate offset based on desired first day of week. firstDayOfWeek: 0 = Sunday, 1 = Monday, 2 = Tuesday, etc.\r\n            let offset = (firstDayOfMonth - firstDayOfWeek + 7) % 7;\r\n\r\n            let index = -1 * offset;\r\n\r\n            for (let i = 0; i < 42; i++) {\r\n                index++;\r\n                // Item\r\n                let item = view.days[i];\r\n                // Get the day\r\n                tmp = new Date(Date.UTC(year, month, index, 0, 0, 0));\r\n                // Day\r\n                let day = tmp.getUTCDate();\r\n\r\n                // Create the item\r\n                item.title = day;\r\n                item.value = index;\r\n                item.number = Helpers.dateToNum(tmp.toISOString().substring(0, 10));\r\n\r\n                // Reset range properties for each item\r\n                item.start = false;\r\n                item.end = false;\r\n                item.range = false;\r\n                item.last = false;\r\n                item.disabled = false;\r\n                item.data = null;\r\n\r\n                // Check selections\r\n                if (tmp.getUTCMonth() !== month) {\r\n                    // Days are not in the current month\r\n                    item.grey = true;\r\n                } else {\r\n                    // Check for data\r\n                    let d = [ year, Helpers.two(month+1), Helpers.two(day) ].join('-');\r\n\r\n                    if (data && data[d]) {\r\n                        item.data = data[d];\r\n                    }\r\n\r\n                    item.grey = false;\r\n                }\r\n                // Month\r\n                let m = tmp.getUTCMonth();\r\n\r\n                // Select cursor\r\n                if (self.cursor.y === year && self.cursor.m === m && self.cursor.d === day) {\r\n                    item.selected = true;\r\n                    // Current item\r\n                    self.cursor.current = item;\r\n                } else {\r\n                    item.selected = false;\r\n                }\r\n\r\n\r\n                // Valid ranges\r\n                if (self.validRange) {\r\n                    if (typeof self.validRange === 'function') {\r\n                        let ret = self.validRange(day,m,year,item);\r\n                        if (typeof ret !== 'undefined') {\r\n                            item.disabled = ret;\r\n                        }\r\n                    } else {\r\n                        let current = year + '-' + Helpers.two(m+1) + '-' + Helpers.two(day);\r\n\r\n                        let test1 = !self.validRange[0] || current >= self.validRange[0].substr(0, 10);\r\n                        let test2 = !self.validRange[1] || current <= self.validRange[1].substr(0, 10);\r\n\r\n                        if (! (test1 && test2)) {\r\n                            item.disabled = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Select range\r\n                if (self.range && self.rangeValues) {\r\n                    // Only mark start/end if the number matches\r\n                    item.start = self.rangeValues[0] === item.number;\r\n                    item.end = self.rangeValues[1] === item.number;\r\n                    // Mark as part of range if between start and end\r\n                    item.range = self.rangeValues[0] && self.rangeValues[1] && self.rangeValues[0] <= item.number && self.rangeValues[1] >= item.number;\r\n                }\r\n            }\r\n        }\r\n\r\n        return view;\r\n    }\r\n\r\n    const isTrue = function(v) {\r\n        return v === true || v === 'true';\r\n    }\r\n\r\n    const isNumber = function (num) {\r\n        if (typeof(num) === 'string') {\r\n            num = num.trim();\r\n        }\r\n        return !isNaN(num) && num !== null && num !== '';\r\n    }\r\n\r\n    const Calendar = function(children, { onchange, onload, track }) {\r\n        let self = this;\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Coerce startingDay to a number so string inputs ('1') don't trigger string concat in modulo math\r\n        if (typeof self.startingDay !== 'number') {\r\n            self.startingDay = Number(self.startingDay) || 0;\r\n        }\r\n\r\n        // Weekdays\r\n        self.weekdays = getWeekdays(self.startingDay);\r\n\r\n        // Cursor\r\n        self.cursor = {};\r\n\r\n        // Time\r\n        self.time = !! self.time;\r\n\r\n        // Range values\r\n        self.rangeValues = null;\r\n\r\n        // Calendar date\r\n        let date = new Date();\r\n\r\n        // Views\r\n        const views = Views(self);\r\n        const hours = views.hours;\r\n        const minutes = views.minutes;\r\n\r\n        // Initial view\r\n        self.view = 'days';\r\n\r\n        // Auto Input\r\n        if (self.input === 'auto') {\r\n            self.input = document.createElement('input');\r\n            self.input.type = 'text';\r\n        }\r\n\r\n\r\n        // Get the position of the data based on the view\r\n        const getPosition = function() {\r\n            let position = 2;\r\n            if (self.view === 'years') {\r\n                position = 0;\r\n            } else if (self.view === 'months') {\r\n                position = 1;\r\n            }\r\n            return position;\r\n        }\r\n\r\n        const setView = function(e) {\r\n            if (typeof e === 'object') {\r\n                e = this.getAttribute('data-view');\r\n            }\r\n\r\n            // Valid views\r\n            const validViews = ['days', 'months', 'years'];\r\n\r\n            // Define new view\r\n            if (validViews.includes(e) && self.view !== e) {\r\n                self.view = e;\r\n            }\r\n        }\r\n\r\n        const reloadView = function(reset) {\r\n            if (reset) {\r\n                // Update options to the view\r\n                self.options = views[self.view];\r\n            }\r\n            // Update the values of hte options of hte view\r\n            views[self.view]?.update.call(self, date);\r\n        }\r\n\r\n        const getValue = function() {\r\n            let value = null;\r\n            if (isTrue(self.range)) {\r\n                if (Array.isArray(self.rangeValues)) {\r\n                    if (isTrue(self.numeric)) {\r\n                        value = self.rangeValues;\r\n                    } else {\r\n                        value = [\r\n                            Helpers.numToDate(self.rangeValues[0]).substring(0, 10),\r\n                            Helpers.numToDate(self.rangeValues[1]).substring(0, 10)\r\n                        ];\r\n                    }\r\n                }\r\n            } else {\r\n                value = getDate();\r\n                if (isTrue(self.numeric)) {\r\n                    value = Helpers.dateToNum(value);\r\n                }\r\n            }\r\n            return value;\r\n        }\r\n\r\n        const setValue = function(v) {\r\n            let d = new Date();\r\n            if (v) {\r\n                // Accept native Date objects by converting to ISO string\r\n                if (v instanceof Date) {\r\n                    v = v.toISOString().substring(0, 10);\r\n                }\r\n                if (isTrue(self.range)) {\r\n                    if (v) {\r\n                        if (! Array.isArray(v)) {\r\n                            v = v.toString().split(',');\r\n                        }\r\n                        self.rangeValues = [...v];\r\n\r\n                        if (v[0] && typeof (v[0]) === 'string' && v[0].indexOf('-')) {\r\n                            self.rangeValues[0] = Helpers.dateToNum(v[0]);\r\n                        }\r\n                        if (v[1] && typeof (v[1]) === 'string' && v[1].indexOf('-')) {\r\n                            self.rangeValues[1] = Helpers.dateToNum(v[1]);\r\n                        }\r\n\r\n                        v = v[0];\r\n                    }\r\n                } else if (typeof v === 'string' && v.includes(',')) {\r\n                    v = v.split(',')[0];\r\n                }\r\n\r\n                if (v) {\r\n                    v = isNumber(v) ? Helpers.numToDate(v) : v;\r\n                    d = new Date(v + '  GMT+0');\r\n                }\r\n\r\n                // if no date is defined\r\n                if (! Helpers.isValidDate(d)) {\r\n                    d = new Date();\r\n                }\r\n            }\r\n\r\n            // Update the internal calendar date\r\n            setDate(d, true);\r\n            // Update the view\r\n            reloadView();\r\n        }\r\n\r\n        const getDate = function() {\r\n            let v = [ self.cursor.y, self.cursor.m, self.cursor.d, self.hour, self.minute ];\r\n            let d = new Date(Date.UTC(...v));\r\n            // Update the headers of the calendar\r\n            if (self.time) {\r\n                return d.toISOString().substring(0, 19).replace('T', ' ');\r\n            } else {\r\n                return d.toISOString().substring(0, 10);\r\n            }\r\n        }\r\n\r\n        const setDate = function(d, update) {\r\n            if (Array.isArray(d)) {\r\n                d = new Date(Date.UTC(...d));\r\n            } else if (typeof(d) === 'string') {\r\n                d = new Date(d);\r\n            }\r\n\r\n            // Update the date\r\n            let value = d.toISOString().substring(0,10).split('-');\r\n            let month = Helpers.months[parseInt(value[1])-1];\r\n            let year = parseInt(value[0]);\r\n\r\n            if (self.month !== month) {\r\n                self.month = month;\r\n            }\r\n            if (self.year !== year) {\r\n                self.year = year;\r\n            }\r\n\r\n            // Update the time\r\n            let time = d.toISOString().substring(11,19).split(':');\r\n            let hour = parseInt(time[0]);\r\n            let minute = parseInt(time[1]);\r\n\r\n            if (self.hour !== hour) {\r\n                self.hour = hour;\r\n            }\r\n            if (self.minute !== minute) {\r\n                self.minute = minute;\r\n            }\r\n\r\n            // Update internal date\r\n            date = d;\r\n\r\n            // Update cursor information\r\n            if (update) {\r\n                updateCursor();\r\n            }\r\n        }\r\n\r\n        const updateCursor = function() {\r\n            self.cursor.y = date.getUTCFullYear();\r\n            self.cursor.m = date.getUTCMonth();\r\n            self.cursor.d = date.getUTCDate();\r\n        }\r\n\r\n        const resetCursor = function() {\r\n            // Remove selection from the current object\r\n            let current = self.cursor.current;\r\n            // Current item\r\n            if (typeof current !== 'undefined') {\r\n                current.selected = false;\r\n            }\r\n        }\r\n\r\n        const setCursor = function(s) {\r\n            // Reset current visual cursor\r\n            resetCursor();\r\n            // Update cursor based on the object position\r\n            if (s) {\r\n                // Update current\r\n                self.cursor.current = s;\r\n                // Update selected property\r\n                s.selected = true;\r\n            }\r\n\r\n            updateCursor();\r\n\r\n            // Update range\r\n            if (isTrue(self.range)) {\r\n                updateRange(s)\r\n            }\r\n\r\n            Dispatch.call(self, self.onupdate, 'update', {\r\n                instance: self,\r\n                value: date.toISOString(),\r\n            });\r\n        }\r\n\r\n        const select = function(e, s) {\r\n            if (self.disabled === true) {\r\n                return;\r\n            }\r\n            // Get new date content\r\n            let d = updateDate(s.value, getPosition());\r\n            // New date\r\n            setDate(new Date(Date.UTC(...d)))\r\n            // Based where was the click\r\n            if (self.view !== 'days') {\r\n                // Back to the days\r\n                self.view = 'days';\r\n            } else if (! s.disabled) {\r\n                if (isTrue(self.range)) {\r\n                    // Start a new range\r\n                    if (self.rangeValues && (self.rangeValues[0] >= s.number || self.rangeValues[1])) {\r\n                        destroyRange();\r\n                    }\r\n                    // Range\r\n                    s.range = true;\r\n                    // Update range\r\n                    if (! self.rangeValues) {\r\n                        s.start = true;\r\n                        self.rangeValues = [s.number, null];\r\n                    } else {\r\n                        s.end = true;\r\n                        self.rangeValues[1] = s.number;\r\n                    }\r\n                    setCursor(s);\r\n                } else {\r\n                    setCursor(s);\r\n\r\n                    update(e);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Update Calendar\r\n        const update = function(e) {\r\n            self.setValue(getValue());\r\n\r\n            if (! (e && e.type === 'click' && e.target.tagName === 'DIV' && self.time === true)) {\r\n                self.close({ origin: 'button' });\r\n            }\r\n        }\r\n\r\n        const reset = function() {\r\n            self.setValue('');\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        const updateDate = function(v, position) {\r\n            // Current internal date\r\n            let value = [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), self.hour, self.minute, 0];\r\n            // Update internal date\r\n            value[position] = v;\r\n            // Return new value\r\n            return value;\r\n        }\r\n\r\n        const move = function(direction) {\r\n            // Reset visual cursor\r\n            resetCursor();\r\n\r\n            // Value\r\n            let value;\r\n\r\n            // Update the new internal date\r\n            if (self.view === 'days') {\r\n                // Select the new internal date\r\n                value = updateDate(date.getUTCMonth()+direction, 1);\r\n            } else if (self.view === 'months') {\r\n                // Select the new internal date\r\n                value = updateDate(date.getUTCFullYear()+direction, 0);\r\n            } else if (self.view === 'years') {\r\n                // Select the new internal date\r\n                value = updateDate(date.getUTCFullYear()+(direction*16), 0);\r\n            }\r\n\r\n            // Update view\r\n            setDate(value);\r\n\r\n            // Reload content of the view\r\n            reloadView();\r\n        }\r\n\r\n        const getJump = function(e) {\r\n            if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\r\n                return self.view === 'days' ? 7 : 4;\r\n            }\r\n\r\n            return 1;\r\n        }\r\n\r\n        const prev = function(e) {\r\n            if (e && e.type === 'keydown') {\r\n                // Current index\r\n                let total = self.options.length;\r\n                let position = self.options.indexOf(self.cursor.current) - getJump(e);\r\n                if (position < 0) {\r\n                    // Next month\r\n                    move(-1);\r\n                    // New position\r\n                    position = total + position;\r\n                }\r\n                // Update cursor\r\n                setCursor(self.options[position])\r\n            } else {\r\n                move(-1);\r\n            }\r\n        }\r\n\r\n        const next = function(e) {\r\n            if (e && e.type === 'keydown') {\r\n                // Current index\r\n                let total = self.options.length;\r\n                let position = self.options.indexOf(self.cursor.current) + getJump(e);\r\n                if (position >= total) {\r\n                    // Next month\r\n                    move(1);\r\n                    // New position\r\n                    position = position - total;\r\n                }\r\n                // Update cursor\r\n                setCursor(self.options[position])\r\n            } else {\r\n                move(1);\r\n            }\r\n        }\r\n\r\n        const getInput = function() {\r\n            let input = self.input;\r\n            if (input && input.current) {\r\n                input = input.current;\r\n            } else {\r\n                if (self.input) {\r\n                    input = self.input;\r\n                }\r\n            }\r\n\r\n            return input;\r\n        }\r\n\r\n        const updateRange = function(s) {\r\n            if (self.range && self.view === 'days' && self.rangeValues) {\r\n                // Creating a range\r\n                if (self.rangeValues[0] && ! self.rangeValues[1]) {\r\n                    let number = s.number;\r\n                    if (number) {\r\n                        // Update range properties\r\n                        for (let i = 0; i < self.options.length; i++) {\r\n                            let v = self.options[i].number;\r\n                            // Update property condition\r\n                            self.options[i].range = v >= self.rangeValues[0] && v <= number;\r\n                            self.options[i].last = (v === number);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const destroyRange = function() {\r\n            if (self.range) {\r\n                for (let i = 0; i < self.options.length; i++) {\r\n                    if (self.options[i].range !== false) {\r\n                        self.options[i].range = false;\r\n                    }\r\n                    if (self.options[i].start !== false) {\r\n                        self.options[i].start = false;\r\n                    }\r\n                    if (self.options[i].end !== false) {\r\n                        self.options[i].end = false;\r\n                    }\r\n                    if (self.options[i].last !== false) {\r\n                        self.options[i].last = false;\r\n                    }\r\n                }\r\n                self.rangeValues = null;\r\n            }\r\n        }\r\n\r\n        const render = function(v) {\r\n            if (v) {\r\n                if (! Array.isArray(v)) {\r\n                    v = v.toString().split(',');\r\n                }\r\n\r\n                v = v.map(entry => {\r\n                    return Mask.render(entry, self.format || 'YYYY-MM-DD');\r\n                }).join(',');\r\n            }\r\n            return v;\r\n        }\r\n\r\n        const normalize = function(v) {\r\n            if (v instanceof Date) {\r\n                v = Helpers.dateToString ? Helpers.dateToString(v) : v.toISOString().substring(0, 10);\r\n            }\r\n            if (! Array.isArray(v)) {\r\n                v = v.toString().split(',');\r\n            }\r\n\r\n            return v.map(item => {\r\n                if (item instanceof Date) {\r\n                    return Helpers.dateToString ? Helpers.dateToString(item) : item.toISOString().substring(0, 10);\r\n                }\r\n                if (Number(item) == item) {\r\n                    return Helpers.numToDate(item);\r\n                } else {\r\n                    if (Helpers.isValidDateFormat(item)) {\r\n                        return item;\r\n                    } else if (self.format) {\r\n                        let tmp = Mask.extractDateFromString(item, self.format);\r\n                        if (tmp) {\r\n                            return tmp;\r\n                        }\r\n                    }\r\n                }\r\n            })\r\n        }\r\n\r\n        const extractValueFromInput = function() {\r\n            let input = getInput();\r\n            if (input) {\r\n                let v;\r\n                if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {\r\n                    v = input.value;\r\n                } else if (input.isContentEditable) {\r\n                    v = input.textContent;\r\n                }\r\n                if (v) {\r\n                    return normalize(v).join(',');\r\n                }\r\n                return v;\r\n            }\r\n        }\r\n\r\n        const onopen = function() {\r\n            let isEditable = false;\r\n            let value = self.value;\r\n\r\n            let input = getInput();\r\n            if (input) {\r\n                if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {\r\n                    isEditable = !input.hasAttribute('readonly') && !input.hasAttribute('disabled');\r\n                } else if (input.isContentEditable) {\r\n                    isEditable = true;\r\n                }\r\n\r\n                let ret = extractValueFromInput();\r\n                if (ret && ret !== value) {\r\n                    value = ret;\r\n                }\r\n            }\r\n\r\n            if (! isEditable) {\r\n                self.content.focus();\r\n            }\r\n\r\n            // Update the internal date values\r\n            setValue(value);\r\n\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function(modal, origin) {\r\n            // Cancel range events\r\n            destroyRange();\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                origin: origin,\r\n            });\r\n        }\r\n\r\n        const dispatchOnChangeEvent = function() {\r\n            // Destroy range\r\n            destroyRange();\r\n            // Update the internal controllers\r\n            setValue(self.value);\r\n            // Events\r\n            Dispatch.call(self, change, 'change', {\r\n                instance: self,\r\n                value: self.value,\r\n            });\r\n            // Update input\r\n            let input = getInput();\r\n            if (input) {\r\n                // Update input value\r\n                input.value = render(self.value);\r\n                // Dispatch event\r\n                Dispatch.call(input, null, 'change', {\r\n                    instance: self,\r\n                    value: self.value,\r\n                });\r\n            }\r\n        }\r\n\r\n        const events = {\r\n            focusin: (e) => {\r\n                if (self.modal && self.isClosed()) {\r\n                    self.open();\r\n                }\r\n            },\r\n            focusout: (e) => {\r\n                if (self.modal && ! self.isClosed()) {\r\n                    if (! (e.relatedTarget && self.modal.el.contains(e.relatedTarget))) {\r\n                        self.modal.close({ origin: 'focusout' });\r\n                    }\r\n                }\r\n            },\r\n            click: (e) => {\r\n                if (e.target.classList.contains('lm-calendar-input')) {\r\n                    self.open();\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (self.modal) {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\r\n                        if (! self.isClosed()) {\r\n                            self.content.focus();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (! self.isClosed()) {\r\n                            update(e);\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Escape') {\r\n                        if (! self.isClosed()) {\r\n                            self.modal.close({origin: 'escape'});\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            input: (e) => {\r\n                let input = e.target;\r\n                if (input.classList.contains('lm-calendar-input')) {\r\n                    if (! isTrue(self.range)) {\r\n                        // TODO: process with range\r\n                        // Apply mask\r\n                        if (self.format) {\r\n                            Mask.oninput(e, self.format);\r\n                        }\r\n                        let value = null;\r\n                        // Content\r\n                        let content = (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') ? input.value : input.textContent;\r\n                        // Check if that is a valid date\r\n                        if (Helpers.isValidDateFormat(content)) {\r\n                            value = content;\r\n                        } else if (self.format) {\r\n                            let tmp = Mask.extractDateFromString(content, self.format);\r\n                            if (tmp) {\r\n                                value = tmp;\r\n                            }\r\n                        }\r\n                        // Change the calendar view\r\n                        if (value) {\r\n                            setValue(value);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Onload\r\n        onload(() => {\r\n            if (self.type !== \"inline\") {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    width: 300,\r\n                    closed: true,\r\n                    focus: false,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    position: 'absolute',\r\n                    'auto-close': false,\r\n                    'auto-adjust': true,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el, self.modal);\r\n            }\r\n\r\n            let ret;\r\n\r\n            // Create input controls\r\n            if (self.input && self.initInput !== false) {\r\n                if (! self.input.parentNode) {\r\n                    self.el.parentNode.insertBefore(self.input, self.el);\r\n                }\r\n\r\n                let input = getInput();\r\n                if (input && input.tagName) {\r\n                    input.classList.add('lm-input');\r\n                    input.classList.add('lm-calendar-input');\r\n                    input.addEventListener('click', events.click);\r\n                    input.addEventListener('input', events.input);\r\n                    input.addEventListener('keydown', events.keydown);\r\n                    input.addEventListener('focusin', events.focusin);\r\n                    input.addEventListener('focusout', events.focusout);\r\n                    if (self.placeholder) {\r\n                        input.setAttribute('placeholder', self.placeholder);\r\n                    }\r\n                    if (self.onChange) {\r\n                        input.addEventListener('change', self.onChange);\r\n                    }\r\n\r\n                    // Retrieve the value\r\n                    if (self.value) {\r\n                        input.value = render(self.value);\r\n                    } else {\r\n                        let value = extractValueFromInput();\r\n                        if (value && value !== self.value) {\r\n                            ret = value;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Update the internal date values\r\n            if (ret) {\r\n                self.setValue(ret);\r\n            } else {\r\n                setValue(self.value);\r\n            }\r\n\r\n            // Reload view\r\n            reloadView(true);\r\n\r\n            /**\r\n             * Handler keyboard\r\n             * @param {object} e - event\r\n             */\r\n            self.el.addEventListener('keydown', function(e) {\r\n                let prevent = false;\r\n                if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\r\n                    if (e.target !== self.content) {\r\n                        self.content.focus();\r\n                    }\r\n                    prev(e);\r\n                    prevent = true;\r\n                } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\r\n                    if (e.target !== self.content) {\r\n                        self.content.focus();\r\n                    }\r\n                    next(e);\r\n                    prevent = true;\r\n                } else if (e.key === 'Enter') {\r\n                    if (e.target === self.content) {\r\n                        // Item\r\n                        if (self.cursor.current) {\r\n                            // Select\r\n                            select(e, self.cursor.current);\r\n                            prevent = true;\r\n                        }\r\n                    }\r\n                } else if (e.key === 'Escape') {\r\n                    if (! self.isClosed()) {\r\n                        self.close({ origin: 'escape' });\r\n                        prevent = true;\r\n                    }\r\n                }\r\n\r\n                if (prevent) {\r\n                    e.preventDefault();\r\n                    e.stopImmediatePropagation();\r\n                }\r\n            });\r\n\r\n            /**\r\n             * Mouse wheel handler\r\n             * @param {object} e - mouse event\r\n             */\r\n            self.content.addEventListener('wheel', function(e){\r\n                if (self.wheel !== false) {\r\n                    if (e.deltaY < 0) {\r\n                        prev(e);\r\n                    } else {\r\n                        next(e);\r\n                    }\r\n                    e.preventDefault();\r\n                }\r\n            }, { passive: false });\r\n\r\n            /**\r\n             * Range handler\r\n             * @param {object} e - mouse event\r\n             */\r\n            self.content.addEventListener('mouseover', function(e){\r\n                let parent = e.target.parentNode\r\n                if (parent === self.content) {\r\n                    let index = Array.prototype.indexOf.call(parent.children, e.target);\r\n                    updateRange(self.options[index]);\r\n                }\r\n            });\r\n\r\n            // Create event for focus out\r\n            self.el.addEventListener(\"focusout\", (e) => {\r\n                let input = getInput();\r\n                if (e.relatedTarget !== input && ! self.el.contains(e.relatedTarget)) {\r\n                    self.close({ origin: 'focusout' });\r\n                }\r\n            });\r\n        });\r\n\r\n        onchange((prop) => {\r\n            if (prop === 'view') {\r\n                reloadView(true);\r\n            } else if (prop === 'startingDay') {\r\n                if (typeof self.startingDay !== 'number') {\r\n                    self.startingDay = Number(self.startingDay) || 0;\r\n                }\r\n                self.weekdays = getWeekdays(self.startingDay);\r\n            } else if (prop === 'value') {\r\n                dispatchOnChangeEvent();\r\n            }\r\n        })\r\n\r\n        // Tracking variables\r\n        track('value');\r\n\r\n        // Public methods\r\n\r\n        self.open = function(e) {\r\n            if (self.modal) {\r\n                if (self.type === 'auto') {\r\n                    self.type = window.innerWidth > 640 ? self.type = 'default' : 'picker';\r\n                }\r\n                self.modal.open();\r\n            }\r\n        }\r\n\r\n        self.close = function(options) {\r\n            if (self.modal) {\r\n                if (options && options.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            // Update value\r\n            if (v) {\r\n                let ret = normalize(v);\r\n                if (isTrue(self.numeric)) {\r\n                    ret = ret.map(entry => {\r\n                        return Helpers.dateToNum(entry);\r\n                    })\r\n                }\r\n\r\n                if (! Array.isArray(v)) {\r\n                    ret = ret.join(',');\r\n                }\r\n\r\n                if (ret == Number(ret)) {\r\n                    ret = Number(ret);\r\n                }\r\n\r\n                v = ret;\r\n            }\r\n\r\n            // Events\r\n            if (v !== self.value) {\r\n                self.value = v;\r\n            }\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        self.update = update;\r\n        self.next = next;\r\n        self.prev = prev;\r\n        self.reset = reset;\r\n        self.setView = setView;\r\n        self.helpers = Helpers;\r\n        self.helpers.getDate = Mask.getDate;\r\n\r\n        return render => render`<div class=\"lm-calendar\" data-grid=\"{{self.grid}}\" data-type=\"{{self.type}}\" data-disabled=\"{{self.disabled}}\" data-starting-day=\"{{self.startingDay}}\">\r\n            <div class=\"lm-calendar-options\">\r\n                <button type=\"button\" onclick=\"${reset}\">${T('Reset')}</button>\r\n                <button type=\"button\" onclick=\"${update}\">${T('Done')}</button>\r\n            </div>\r\n            <div class=\"lm-calendar-container\" data-view=\"{{self.view}}\">\r\n                <div class=\"lm-calendar-header\">\r\n                    <div>\r\n                        <div class=\"lm-calendar-labels\"><button type=\"button\" onclick=\"${setView}\" data-view=\"months\">{{self.month}}</button> <button type=\"button\" onclick=\"${setView}\" data-view=\"years\">{{self.year}}</button></div> \r\n                        <div class=\"lm-calendar-navigation\">\r\n                            <button type=\"button\" class=\"lm-calendar-icon lm-ripple\" onclick=\"${prev}\" tabindex=\"0\">expand_less</button>\r\n                            <button type=\"button\" class=\"lm-calendar-icon lm-ripple\" onclick=\"${next}\" tabindex=\"0\">expand_more</button>\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"lm-calendar-weekdays\" :loop=\"self.weekdays\"><div>{{self.title}}</div></div>\r\n                </div>\r\n                <div class=\"lm-calendar-content\" :loop=\"self.options\" tabindex=\"0\" :ref=\"self.content\">\r\n                    <div data-start=\"{{self.start}}\" data-end=\"{{self.end}}\" data-last=\"{{self.last}}\" data-range=\"{{self.range}}\" data-event=\"{{self.data}}\" data-grey=\"{{self.grey}}\" data-bold=\"{{self.bold}}\" data-selected=\"{{self.selected}}\" data-disabled=\"{{self.disabled}}\" onclick=\"${select}\">{{self.title}}</div>\r\n                </div>\r\n                <div class=\"lm-calendar-footer\" data-visible=\"{{self.footer}}\">\r\n                    <div class=\"lm-calendar-time\" data-visible=\"{{self.time}}\"><select :loop=\"${hours}\" :bind=\"self.hour\" class=\"lm-calendar-control\"><option value=\"{{self.value}}\">{{self.title}}</option></select>:<select :loop=\"${minutes}\" :bind=\"self.minute\" class=\"lm-calendar-control\"><option value=\"{{self.value}}\">{{self.title}}</option></select></div>\r\n                    <div class=\"lm-calendar-update\"><input type=\"button\" value=\"${T('Update')}\" onclick=\"${update}\" class=\"lm-ripple lm-input\"></div>\r\n                </div>\r\n            </div>\r\n        </div>`\r\n    }\r\n\r\n    // Register the LemonadeJS Component\r\n    lemonade.setComponents({ Calendar: Calendar });\r\n    // Register the web component\r\n    lemonade.createWebComponent('calendar', Calendar);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Calendar, root, options)\r\n            return options;\r\n        } else {\r\n            return Calendar.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 541:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (! lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\nif (! Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(72);\r\n}\r\n\r\nif (! Tabs && \"function\" === 'function') {\r\n    var Tabs = __webpack_require__(560);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            method(...a);\r\n        } else if (this.tagName) {\r\n            // Fallback: dispatch a custom event\r\n            const event = new CustomEvent(type, {\r\n                bubbles: true,\r\n                cancelable: true,\r\n                detail: options,\r\n            });\r\n            this.dispatchEvent(event);\r\n        }\r\n    }\r\n\r\n    const defaultPalette =  [\r\n        [\"#ffebee\", \"#fce4ec\", \"#f3e5f5\", \"#e8eaf6\", \"#e3f2fd\", \"#e0f7fa\", \"#e0f2f1\", \"#e8f5e9\", \"#f1f8e9\", \"#f9fbe7\", \"#fffde7\", \"#fff8e1\", \"#fff3e0\", \"#fbe9e7\", \"#efebe9\", \"#fafafa\", \"#eceff1\"],\r\n        [\"#ffcdd2\", \"#f8bbd0\", \"#e1bee7\", \"#c5cae9\", \"#bbdefb\", \"#b2ebf2\", \"#b2dfdb\", \"#c8e6c9\", \"#dcedc8\", \"#f0f4c3\", \"#fff9c4\", \"#ffecb3\", \"#ffe0b2\", \"#ffccbc\", \"#d7ccc8\", \"#f5f5f5\", \"#cfd8dc\"],\r\n        [\"#ef9a9a\", \"#f48fb1\", \"#ce93d8\", \"#9fa8da\", \"#90caf9\", \"#80deea\", \"#80cbc4\", \"#a5d6a7\", \"#c5e1a5\", \"#e6ee9c\", \"#fff59d\", \"#ffe082\", \"#ffcc80\", \"#ffab91\", \"#bcaaa4\", \"#eeeeee\", \"#b0bec5\"],\r\n        [\"#e57373\", \"#f06292\", \"#ba68c8\", \"#7986cb\", \"#64b5f6\", \"#4dd0e1\", \"#4db6ac\", \"#81c784\", \"#aed581\", \"#dce775\", \"#fff176\", \"#ffd54f\", \"#ffb74d\", \"#ff8a65\", \"#a1887f\", \"#e0e0e0\", \"#90a4ae\"],\r\n        [\"#ef5350\", \"#ec407a\", \"#ab47bc\", \"#5c6bc0\", \"#42a5f5\", \"#26c6da\", \"#26a69a\", \"#66bb6a\", \"#9ccc65\", \"#d4e157\", \"#ffee58\", \"#ffca28\", \"#ffa726\", \"#ff7043\", \"#8d6e63\", \"#bdbdbd\", \"#78909c\"],\r\n        [\"#f44336\", \"#e91e63\", \"#9c27b0\", \"#3f51b5\", \"#2196f3\", \"#00bcd4\", \"#009688\", \"#4caf50\", \"#8bc34a\", \"#cddc39\", \"#ffeb3b\", \"#ffc107\", \"#ff9800\", \"#ff5722\", \"#795548\", \"#9e9e9e\", \"#607d8b\"],\r\n        [\"#e53935\", \"#d81b60\", \"#8e24aa\", \"#3949ab\", \"#1e88e5\", \"#00acc1\", \"#00897b\", \"#43a047\", \"#7cb342\", \"#c0ca33\", \"#fdd835\", \"#ffb300\", \"#fb8c00\", \"#f4511e\", \"#6d4c41\", \"#757575\", \"#546e7a\"],\r\n        [\"#d32f2f\", \"#c2185b\", \"#7b1fa2\", \"#303f9f\", \"#1976d2\", \"#0097a7\", \"#00796b\", \"#388e3c\", \"#689f38\", \"#afb42b\", \"#fbc02d\", \"#ffa000\", \"#f57c00\", \"#e64a19\", \"#5d4037\", \"#616161\", \"#455a64\"],\r\n        [\"#c62828\", \"#ad1457\", \"#6a1b9a\", \"#283593\", \"#1565c0\", \"#00838f\", \"#00695c\", \"#2e7d32\", \"#558b2f\", \"#9e9d24\", \"#f9a825\", \"#ff8f00\", \"#ef6c00\", \"#d84315\", \"#4e342e\", \"#424242\", \"#37474f\"],\r\n        [\"#b71c1c\", \"#880e4f\", \"#4a148c\", \"#1a237e\", \"#0d47a1\", \"#006064\", \"#004d40\", \"#1b5e20\", \"#33691e\", \"#827717\", \"#f57f17\", \"#ff6f00\", \"#e65100\", \"#bf360c\", \"#3e2723\", \"#212121\", \"#263238\"],\r\n    ]\r\n\r\n    const Grid = function(children, { onchange }) {\r\n        const self = this;\r\n\r\n        if (! self.palette) {\r\n            self.palette = defaultPalette;\r\n        }\r\n\r\n        const select = (event) => {\r\n            if (event.target.tagName === 'TD') {\r\n                let color = event.target.getAttribute('data-value')\r\n\r\n                // Remove current selected mark\r\n                let selected = self.el.querySelector('.lm-color-selected');\r\n                if (selected) {\r\n                    selected.classList.remove('lm-color-selected');\r\n                }\r\n\r\n                // Mark cell as selected\r\n                if (color) {\r\n                    event.target.classList.add('lm-color-selected');\r\n                    self.set(color);\r\n                }\r\n            }\r\n        }\r\n\r\n        self.constructRows = function (e) {\r\n            let tbody = [];\r\n            e.textContent = '';\r\n            for (let j = 0; j < self.palette.length; j++) {\r\n                let tr = document.createElement('tr');\r\n                e.appendChild(tr);\r\n\r\n                for (let i = 0; i < self.palette[j].length; i++) {\r\n                    let color = self.palette[j][i];\r\n                    let td = document.createElement('td');\r\n                    td.setAttribute('data-value', color);\r\n                    td.style.backgroundColor = color;\r\n                    tr.appendChild(td);\r\n                }\r\n            }\r\n        }\r\n\r\n        onchange(property => {\r\n            if (property === 'palette') {\r\n                self.constructRows()\r\n            }\r\n        });\r\n\r\n        return render => render`<div class=\"lm-color-grid\" :palette=\"self.palette\">\r\n            <table cellpadding=\"7\" cellspacing=\"0\" onclick=\"${select}\" :ref=\"self.table\" :ready=\"self.constructRows\"></table>\r\n        </div>`\r\n    }\r\n\r\n    const Spectrum = function(children, { onload }) {\r\n        let self = this;\r\n        let context = null;\r\n\r\n        let decToHex = function(num) {\r\n            let hex = num.toString(16);\r\n            return hex.length === 1 ? \"0\" + hex : hex;\r\n        }\r\n        let rgbToHex = function(r, g, b) {\r\n            return \"#\" + decToHex(r) + decToHex(g) + decToHex(b);\r\n        }\r\n\r\n        onload(() => {\r\n            context = self.canvas.getContext(\"2d\", { willReadFrequently: true });\r\n            draw();\r\n        })\r\n\r\n        // Drsaw\r\n        const draw = function() {\r\n            let g = context.createLinearGradient(0, 0, self.canvas.width, 0);\r\n            // Create color gradient\r\n            g.addColorStop(0,    \"rgb(255,0,0)\");\r\n            g.addColorStop(0.15, \"rgb(255,0,255)\");\r\n            g.addColorStop(0.33, \"rgb(0,0,255)\");\r\n            g.addColorStop(0.49, \"rgb(0,255,255)\");\r\n            g.addColorStop(0.67, \"rgb(0,255,0)\");\r\n            g.addColorStop(0.84, \"rgb(255,255,0)\");\r\n            g.addColorStop(1,    \"rgb(255,0,0)\");\r\n            context.fillStyle = g;\r\n            context.fillRect(0, 0, self.canvas.width, self.canvas.height);\r\n            g = context.createLinearGradient(0, 0, 0, self.canvas.height);\r\n            g.addColorStop(0,   \"rgba(255,255,255,1)\");\r\n            g.addColorStop(0.5, \"rgba(255,255,255,0)\");\r\n            g.addColorStop(0.5, \"rgba(0,0,0,0)\");\r\n            g.addColorStop(1,   \"rgba(0,0,0,1)\");\r\n            context.fillStyle = g;\r\n            context.fillRect(0, 0, self.canvas.width, self.canvas.height);\r\n        }\r\n\r\n        // Moves the marquee point to the specified position\r\n        const update = (e) => {\r\n            let x;\r\n            let y;\r\n            let buttons = 1;\r\n            if (e.type === 'touchmove') {\r\n                x = e.changedTouches[0].clientX;\r\n                y = e.changedTouches[0].clientY;\r\n            } else {\r\n                buttons = e.buttons;\r\n                x = e.clientX;\r\n                y = e.clientY;\r\n            }\r\n\r\n            if (buttons === 1) {\r\n                let rect = self.el.getBoundingClientRect();\r\n                let left = x - rect.left;\r\n                let top = y - rect.top;\r\n                // Get the color in this pixel\r\n                let pixel = context.getImageData(left, top, 1, 1).data;\r\n                // Position pointer\r\n                self.point.style.left = left + 'px';\r\n                self.point.style.top = top + 'px';\r\n                // Return color\r\n                self.set(rgbToHex(pixel[0], pixel[1], pixel[2]));\r\n            }\r\n        }\r\n\r\n        return render => render`<div class=\"lm-color-hsl\">\r\n            <canvas width=\"240\" height=\"140\" :ref=\"self.canvas\" onmousedown=\"${update}\" onmousemove=\"${update}\" ontouchmove=\"${update}\"></canvas>\r\n            <div class=\"lm-color-point\" :ref=\"self.point\"></div>\r\n        </div>`;\r\n    }\r\n\r\n    const Color = function(children, { onchange, onload }) {\r\n        let self = this;\r\n        let value = null;\r\n\r\n        const change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Decide the type based on the size of the screen\r\n        let autoType = self.type === 'auto';\r\n\r\n        const applyValue = function(v) {\r\n            if (self.value !== v) {\r\n                self.value = v;\r\n            }\r\n        }\r\n\r\n        const onopen = function(e) {\r\n            self.open();\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function(modal, origin) {\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                origin: origin,\r\n            });\r\n        }\r\n\r\n        const update = function() {\r\n            applyValue(value);\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        const getInput = function() {\r\n            let input = self.input;\r\n            if (input && input.current) {\r\n                input = input.current;\r\n            } else {\r\n                if (self.input) {\r\n                    input = self.input;\r\n                }\r\n            }\r\n\r\n            return input;\r\n        }\r\n\r\n        const events = {\r\n            focusin: (e) => {\r\n                if (self.modal && self.isClosed()) {\r\n                    self.open();\r\n                }\r\n            },\r\n            focusout: (e) => {\r\n                if (self.modal && ! self.isClosed()) {\r\n                    if (! (e.relatedTarget && self.modal.el.contains(e.relatedTarget))) {\r\n                        self.modal.close({ origin: 'focusout' });\r\n                    }\r\n                }\r\n            },\r\n            click: (e) => {\r\n                if (e.target.classList.contains('lm-color-input')) {\r\n                    self.open();\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (self.modal) {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\r\n                        if (self.isClosed()) {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (! self.isClosed()) {\r\n                            update();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Escape') {\r\n                        if (! self.isClosed()) {\r\n                            self.modal.close({origin: 'escape'});\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const set = function(v) {\r\n            value = v;\r\n            // Close\r\n            if (self.closeOnChange === true) {\r\n                // Update value\r\n                self.setValue(v);\r\n                // Close modal\r\n                self.close({ origin: 'select' });\r\n            }\r\n        }\r\n\r\n        self.open = function(e) {\r\n            if (self.modal) {\r\n                if (autoType) {\r\n                    self.type = window.innerWidth > 640 ? self.type = 'default' : 'picker';\r\n                }\r\n                value = self.value;\r\n                // Table\r\n                let table = self.grid.table;\r\n                // Remove any selection\r\n                let o = table.querySelector('.lm-color-selected');\r\n                if (o) {\r\n                    o.classList.remove('lm-color-selected');\r\n                }\r\n                // Selected\r\n                o = table.querySelector('[data-value=\"'+self.value+'\"]');\r\n                if (o) {\r\n                    o.classList.add('lm-color-selected');\r\n                }\r\n                // Open modal\r\n                self.modal.open();\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Close the modal\r\n         */\r\n        self.close = function(options) {\r\n            if (self.modal) {\r\n                if (options && options.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.reset = function() {\r\n            self.setValue('');\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            self.value = value = v;\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        onchange(prop => {\r\n            if (prop === 'value') {\r\n                let input = getInput();\r\n                if (input) {\r\n                    input.value = self.value;\r\n                    if (self.value) {\r\n                        input.style.color = self.value;\r\n                    } else {\r\n                        input.style.color = '';\r\n                    }\r\n                }\r\n\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: self.value,\r\n                });\r\n            }\r\n        });\r\n\r\n        // Input\r\n        if (self.input === 'auto') {\r\n            self.input = document.createElement('input');\r\n            self.input.type = 'text';\r\n        }\r\n\r\n        onload(() => {\r\n            if (self.type !== \"inline\") {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    closed: true,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    focus: false,\r\n                    position: 'absolute',\r\n                    'auto-close': false,\r\n                    'auto-adjust': true,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el, self.modal);\r\n            }\r\n\r\n            // Create input controls\r\n            if (self.input && self.initInput !== false) {\r\n                if (! self.input.parentNode) {\r\n                    self.el.parentNode.insertBefore(self.input, self.el);\r\n                }\r\n\r\n                let input = getInput();\r\n                if (input && input.tagName) {\r\n                    input.classList.add('lm-input');\r\n                    input.classList.add('lm-color-input');\r\n                    input.addEventListener('click', events.click);\r\n                    input.addEventListener('focusin', events.focusin);\r\n                    input.addEventListener('focusout', events.focusout);\r\n                    if (self.placeholder) {\r\n                        input.setAttribute('placeholder', self.placeholder);\r\n                    }\r\n                    if (self.onChange) {\r\n                        input.addEventListener('change', self.onChange);\r\n                    }\r\n\r\n                    // Retrieve the value\r\n                    if (self.value) {\r\n                        input.value = self.value;\r\n                    } else if (input.value && input.value !== self.value) {\r\n                        self.value = input.value;\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Create event for focus out\r\n            self.el.addEventListener(\"focusout\", (e) => {\r\n                let input = getInput();\r\n                if (e.relatedTarget !== input && ! self.el.contains(e.relatedTarget)) {\r\n                    self.close({ origin: 'focusout' });\r\n                }\r\n            });\r\n        });\r\n\r\n        return render => render`<div class=\"lm-color\" :value=\"self.value\">\r\n            <div class=\"lm-color-options\">\r\n                <button type=\"button\" onclick=\"${self.reset}\">Reset</button>\r\n                <button type=\"button\" onclick=\"${update}\">Done</button>\r\n            </div>\r\n            <lm-tabs selected=\"0\" position=\"center\" :ref=\"self.tabs\">\r\n                <div title=\"Grid\"><${Grid} :palette=\"self.palette\" :ref=\"self.grid\" :set=\"${set}\" /></div>\r\n                <div title=\"Spectrum\"><${Spectrum} :ref=\"self.spectrum\" :set=\"${set}\" /></div>\r\n            </lm-tabs>\r\n        </div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Color: Color });\r\n    // Register the web component\r\n    lemonade.createWebComponent('color', Color);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Color, root, options)\r\n            return options;\r\n        } else {\r\n            return Color.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 238:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (! lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\nif (! Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(72);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Get the coordinates of the action\r\n    const getCoords = function(e) {\r\n        let x;\r\n        let y;\r\n\r\n        if (e.changedTouches && e.changedTouches[0]) {\r\n            x = e.changedTouches[0].clientX;\r\n            y = e.changedTouches[0].clientY;\r\n        } else {\r\n            x = e.clientX;\r\n            y = e.clientY;\r\n        }\r\n\r\n        return [x,y];\r\n    }\r\n\r\n    const Item = function() {\r\n        let self = this;\r\n\r\n        self.onload = function() {\r\n            if (typeof(self.render) === 'function') {\r\n                self.render.call(self, self.el);\r\n            }\r\n        }\r\n\r\n        // Initialize expanded state\r\n        self.expanded = false;\r\n\r\n        if (self.type === 'line' || self.type === 'divisor') {\r\n            return `<hr role=\"separator\" />`;\r\n        } else if (self.type === 'inline') {\r\n            return `<div></div>`;\r\n        } else {\r\n            return `<div class=\"lm-menu-item\" role=\"menuitem\" data-disabled=\"{{self.disabled}}\" data-cursor=\"{{self.cursor}}\" data-icon=\"{{self.icon}}\" title=\"{{self.tooltip}}\" data-submenu=\"${!!self.submenu}\" aria-haspopup=\"${!!self.submenu}\" aria-expanded=\"{{self.expanded}}\" aria-label=\"{{self.title}}\" tabindex=\"-1\" onmouseup=\"self.parent.mouseUp\" onmouseenter=\"self.parent.mouseEnter\" onmouseleave=\"self.parent.mouseLeave\">\r\n                <span>{{self.title}}</span> <div>{{self.shortcut}}</div>\r\n            </div>`;\r\n        }\r\n    }\r\n\r\n    const Create = function() {\r\n        let self = this;\r\n\r\n        // Delay on open\r\n        let delayTimer;\r\n        // Save the position of this modal\r\n        let index = self.parent.modals.length;\r\n\r\n        // Blank options\r\n        self.options = [];\r\n\r\n        // Close handler\r\n        self.onclose = function() {\r\n            // Reset any cursor\r\n            resetCursor.call(self);\r\n            // Parent\r\n            if (typeof(self.parent.onclose) === 'function') {\r\n                self.parent.onclose(self.parent, self);\r\n            }\r\n        }\r\n\r\n        self.onopen = function() {\r\n            // Parent\r\n            if (typeof(self.parent.onopen) === 'function') {\r\n                self.parent.onopen(self.parent, self);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Close the modal\r\n         */\r\n        self.close = function() {\r\n            // Close modals with higher level\r\n            self.parent.close(index);\r\n        }\r\n\r\n        /**\r\n         * Open submenu handler\r\n         * @param {object} s\r\n         * @param {boolean} cursor - Activate the first item\r\n         */\r\n        self.open = function(s, cursor) {\r\n            if (s.submenu) {\r\n                // Get the modal in the container of modals\r\n                let current = self.parent.modals[index+1];\r\n                // Do not exist yet, create it.\r\n                if (! current) {\r\n                    // Modal needs to be created\r\n                    current = self.parent.create();\r\n                }\r\n                // Get the parent from this one\r\n                let parent = self.parent.modals[index];\r\n                // Update modal content\r\n                if (current.options !== s.submenu) {\r\n                    // Close modals with higher level\r\n                    current.options = s.submenu;\r\n                    // Close other modals\r\n                    self.parent.close(index+1);\r\n                }\r\n                // Update the selected modal\r\n                self.parent.modalIndex = index+1;\r\n                let rect = parent.modal.el.getBoundingClientRect();\r\n                // Update modal\r\n                current.modal.open();\r\n\r\n                // Calculate initial position using item's actual screen position (accounts for scroll)\r\n                let itemRect = s.el.getBoundingClientRect();\r\n                let submenuWidth = 250;\r\n                let submenuTop = itemRect.y;\r\n                let submenuLeft = rect.x + rect.width - 2; // Position to the right of parent\r\n\r\n                // Check if parent was positioned to the left (has negative margin or is on left side)\r\n                let parentOpenedLeft = parent.openedLeft || false;\r\n\r\n                // Check horizontal space\r\n                let spaceOnRight = window.innerWidth - (rect.x + rect.width);\r\n                let spaceOnLeft = rect.x;\r\n\r\n                // Determine which side to open the submenu\r\n                let openLeft = parentOpenedLeft; // Follow parent's direction by default\r\n\r\n                // If parent opened to right, check if we still have space\r\n                if (!parentOpenedLeft && spaceOnRight < submenuWidth + 10) {\r\n                    // Not enough space on right, switch to left\r\n                    openLeft = true;\r\n                }\r\n                // If parent opened to left, check if we still have space on left\r\n                if (parentOpenedLeft && spaceOnLeft < submenuWidth + 10) {\r\n                    // Not enough space on left, switch to right if possible\r\n                    if (spaceOnRight >= submenuWidth + 10) {\r\n                        openLeft = false;\r\n                    }\r\n                }\r\n\r\n                if (openLeft) {\r\n                    // Position to the left of parent menu\r\n                    submenuLeft = rect.x - submenuWidth + 2;\r\n                    // Ensure it doesn't go off the left edge\r\n                    if (submenuLeft < 10) {\r\n                        submenuLeft = 10;\r\n                    }\r\n                    current.openedLeft = true;\r\n                } else {\r\n                    current.openedLeft = false;\r\n                }\r\n\r\n                // Set position\r\n                current.modal.top = submenuTop;\r\n                current.modal.left = submenuLeft;\r\n\r\n                // Adjust vertical position after render\r\n                queueMicrotask(() => {\r\n                    let submenuEl = current.modal.el;\r\n                    let submenuRect = submenuEl.getBoundingClientRect();\r\n\r\n                    // Check if submenu goes off the bottom\r\n                    if (submenuRect.bottom > window.innerHeight - 10) {\r\n                        let overflow = submenuRect.bottom - (window.innerHeight - 10);\r\n                        let newTop = submenuTop - overflow;\r\n                        // Don't go above the top of the screen\r\n                        if (newTop < 10) {\r\n                            newTop = 10;\r\n                        }\r\n                        current.modal.top = newTop;\r\n                    }\r\n                });\r\n\r\n                // Keep current item for each modal\r\n                current.item = s;\r\n                s.expanded = true;\r\n\r\n                // Activate the cursor\r\n                if (cursor === true) {\r\n                    // Place cursor in the first position\r\n                    current.options[0].cursor = true;\r\n                    // Position cursor\r\n                    current.cursor = 0;\r\n                }\r\n\r\n                onopen(current, s.submenu)\r\n            } else {\r\n                // Close modals with higher level\r\n                self.parent.close(index+1);\r\n            }\r\n        }\r\n\r\n        // Mouse open\r\n        self.mouseUp = function(e, s) {\r\n            if (typeof(s.onclick) === 'function') {\r\n                s.onclick.call(s, e, s.el);\r\n            }\r\n            if (! s.submenu) {\r\n                self.close();\r\n            }\r\n        }\r\n\r\n        self.mouseEnter = function(e, s) {\r\n            if (delayTimer) {\r\n                clearTimeout(delayTimer);\r\n            }\r\n            delayTimer = setTimeout(function() {\r\n                self.open(s);\r\n            }, 200);\r\n        }\r\n\r\n        self.mouseLeave = function(e, s) {\r\n            if (delayTimer) {\r\n                clearTimeout(delayTimer);\r\n            }\r\n        }\r\n\r\n        let template = `<lm-modal :overflow=\"true\" :closed=\"true\" :ref=\"self.modal\" :responsive=\"false\" :auto-adjust=\"true\" :focus=\"false\" :layers=\"false\" :onopen=\"self.onopen\" :onclose=\"self.onclose\">\r\n            <div class=\"lm-menu-submenu\" role=\"menu\" aria-orientation=\"vertical\">\r\n                <Item :loop=\"self.options\" />\r\n            </div>\r\n        </lm-modal>`;\r\n\r\n        return lemonade.element(template, self, { Item: Item });\r\n    }\r\n\r\n    const findNextEnabledCursor = function(startIndex, direction) {\r\n        if (!this.options || this.options.length === 0) {\r\n            return null;\r\n        }\r\n        \r\n        let cursor = startIndex;\r\n        let attempts = 0;\r\n        const maxAttempts = this.options.length;\r\n        \r\n        while (attempts < maxAttempts) {\r\n            if (direction) {\r\n                // Down\r\n                if (cursor >= this.options.length) {\r\n                    cursor = 0;\r\n                }\r\n            } else {\r\n                // Up\r\n                if (cursor < 0) {\r\n                    cursor = this.options.length - 1;\r\n                }\r\n            }\r\n            \r\n            let item = this.options[cursor];\r\n            if (item && !item.disabled && item.type !== 'line') {\r\n                return cursor;\r\n            }\r\n            \r\n            cursor = direction ? cursor + 1 : cursor - 1;\r\n            attempts++;\r\n        }\r\n        return null;\r\n    };\r\n\r\n    const setCursor = function(direction) {\r\n        let cursor = null;\r\n\r\n        if (typeof(this.cursor) !== 'undefined') {\r\n            if (! direction) {\r\n                // Up\r\n                cursor = findNextEnabledCursor.call(this, this.cursor - 1, false);\r\n            } else {\r\n                // Down\r\n                cursor = findNextEnabledCursor.call(this, this.cursor + 1, true);\r\n            }\r\n        }\r\n\r\n        // Remove the cursor\r\n        if (cursor === null) {\r\n            if (direction) {\r\n                cursor = findNextEnabledCursor.call(this, 0, true);\r\n            } else {\r\n                cursor = findNextEnabledCursor.call(this, this.options.length - 1, false);\r\n            }\r\n        } else if (typeof(this.cursor) !== 'undefined') {\r\n            this.options[this.cursor].cursor = false;\r\n        }\r\n\r\n        // Add the cursor if found\r\n        if (cursor !== null) {\r\n            this.options[cursor].cursor = true;\r\n            this.cursor = cursor;\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Reset the cursor for a contextmenu\r\n     */\r\n    const resetCursor = function() {\r\n        // Contextmenu modal\r\n        let item = this.options[this.cursor];\r\n        // Cursor is found so reset it\r\n        if (typeof(item) !== 'undefined') {\r\n            // Remove the cursor style\r\n            item.cursor = false;\r\n            // Delete reference index\r\n            delete this.cursor;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Go through all items of a menu\r\n     * @param s\r\n     * @param options\r\n     */\r\n    const onopen = function(s, options) {\r\n        // Onopen\r\n        for (let i = 0; i < options.length; i++) {\r\n            if (typeof(options[i].onopen) === 'function') {\r\n                options[i].onopen(s);\r\n            }\r\n        }\r\n    }\r\n\r\n    const Contextmenu = function(children, { onload }) {\r\n        let self = this;\r\n\r\n        // Container for all modals\r\n        self.modals = [];\r\n        self.modalIndex = 0;\r\n\r\n        self.create = function() {\r\n            // Create a new self for each modal\r\n            let s = {\r\n                parent: self,\r\n            };\r\n            // Render the modal inside the main container\r\n            lemonade.render(Create, self.el, s);\r\n            // Add the reference of the modal in a container#\r\n            self.modals.push(s);\r\n            // Return self\r\n            return s;\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            return self.modals[0].modal.closed === true;\r\n        }\r\n\r\n        self.openAt = function(a, b) {\r\n            let x, y;\r\n            if (a instanceof Event || (a && a.clientX !== undefined)) {\r\n                // openAt(event)\r\n                x = a.clientX;\r\n                y = a.clientY;\r\n            } else {\r\n                // openAt(x, y)\r\n                x = a;\r\n                y = b;\r\n            }\r\n            self.open(self.options, x, y, true);\r\n        };\r\n\r\n        self.open = function(options, x, y, adjust) {\r\n            // Get the main modal\r\n            let menu = self.modals[0];\r\n            // Reset cursor\r\n            resetCursor.call(menu);\r\n            // Define new position\r\n            menu.modal.top = y;\r\n            menu.modal.left = x;\r\n            // Open\r\n            menu.modal.open();\r\n            // If the modal is open and the content is different from what is shown. Close modals with higher level\r\n            self.close(1);\r\n            // Update the data\r\n            if (options && menu.options !== options) {\r\n                // Refresh content\r\n                menu.options = options;\r\n            }\r\n            onopen(self, options);\r\n\r\n            // Adjust position to respect mouse cursor after auto-adjust\r\n            // Use queueMicrotask to ensure it runs after the modal's auto-adjust\r\n            if (adjust === true) {\r\n                queueMicrotask(() => {\r\n                    let modalEl = menu.modal.el;\r\n                    let rect = modalEl.getBoundingClientRect();\r\n                    let marginLeft = parseFloat(modalEl.style.marginLeft) || 0;\r\n                    let marginTop = parseFloat(modalEl.style.marginTop) || 0;\r\n\r\n                    // Check if horizontal adjustment was applied (margin is non-zero)\r\n                    if (marginLeft !== 0) {\r\n                        // Position modal so its right edge is at x - 1 (cursor 1px to the right of modal)\r\n                        // Formula: left + margin + width = x - 1, where left = x\r\n                        // Therefore: margin = -width - 1\r\n                        let newMarginLeft = -rect.width - 1;\r\n                        // Check if this would push modal off the left edge\r\n                        let newLeft = x + newMarginLeft;\r\n                        if (newLeft < 10) {\r\n                            // Keep a 10px margin from the left edge\r\n                            newMarginLeft = 10 - x;\r\n                        }\r\n                        modalEl.style.marginLeft = newMarginLeft + 'px';\r\n                    }\r\n\r\n                    // Check if vertical adjustment was applied (margin is non-zero)\r\n                    if (marginTop !== 0) {\r\n                        // Position modal so its bottom edge is at y - 1 (cursor 1px below modal)\r\n                        // Formula: top + margin + height = y - 1, where top = y\r\n                        // Therefore: margin = -height - 1\r\n                        let newMarginTop = -rect.height - 1;\r\n                        // Check if this would push modal off the top edge\r\n                        let newTop = y + newMarginTop;\r\n                        if (newTop < 10) {\r\n                            // Keep a 10px margin from the top edge\r\n                            newMarginTop = 10 - y;\r\n                        }\r\n                        modalEl.style.marginTop = newMarginTop + 'px';\r\n                    }\r\n                });\r\n            }\r\n            // Focus\r\n            self.el.classList.add('lm-menu-focus');\r\n            // Focus on the contextmenu. preventScroll stops the browser from\r\n            // scrolling this in-flow element into view, which would jump the page\r\n            self.el.focus({ preventScroll: true });\r\n        }\r\n\r\n        self.close = function(level) {\r\n            // Close all modals from the level specified\r\n            self.modals.forEach(function(menu, k) {\r\n                if (k >= level) {\r\n                    if (menu.item) {\r\n                        menu.item.expanded = false;\r\n                        menu.item = null;\r\n                    }\r\n                    menu.openedLeft = false;\r\n                    menu.modal.close();\r\n                }\r\n            });\r\n            // Keep the index of the modal that is opened\r\n            self.modalIndex = level ? level - 1 : 0;\r\n\r\n            // Close event\r\n            if (level === 0) {\r\n                self.el.classList.remove('lm-menu-focus');\r\n\r\n                Dispatch.call(self, self.onclose, 'close', {\r\n                    instance: self,\r\n                });\r\n            }\r\n        }\r\n\r\n        onload(() => {\r\n            // Create first menu\r\n            self.create();\r\n\r\n            // Create event for focus out\r\n            self.el.addEventListener(\"focusout\", (e) => {\r\n                if (! (e.relatedTarget && (self.el.contains(e.relatedTarget) || self.root?.contains(e.relatedTarget)))) {\r\n                    self.close(0);\r\n                }\r\n            });\r\n\r\n            // Keyboard event\r\n            self.el.addEventListener(\"keydown\", function(e) {\r\n                // Menu object\r\n                let menu = self.modals[self.modalIndex];\r\n                // Modal must be opened\r\n                if (! menu.modal.closed) {\r\n                    // Something happens\r\n                    let ret = false;\r\n                    // Control\r\n                    if (e.key === 'ArrowLeft') {\r\n                        if (self.modalIndex > 0) {\r\n                            // Close modal\r\n                            menu.close();\r\n                            // Action happened\r\n                            ret = true;\r\n                        }\r\n                    } else if (e.key === 'ArrowRight') {\r\n                        // Get the selected cursor\r\n                        let item = menu.options[menu.cursor];\r\n                        // Open submenu\r\n                        if (typeof (item) !== 'undefined') {\r\n                            // Open submenu in case that exists\r\n                            if (item.submenu && !item.disabled) {\r\n                                // Open modal\r\n                                menu.open(item, true);\r\n                                // Action happened\r\n                                ret = true;\r\n                            }\r\n                        }\r\n                    } else if (e.key === 'ArrowUp') {\r\n                        ret = setCursor.call(menu, 0);\r\n                    } else if (e.key === 'ArrowDown') {\r\n                        ret = setCursor.call(menu, 1);\r\n                    } else if (e.key === 'Enter') {\r\n                        // Contextmenu modal\r\n                        let item = menu.options[menu.cursor];\r\n                        // Cursor is found so reset it\r\n                        if (typeof(item) !== 'undefined') {\r\n                            // Execute action\r\n                            if (typeof (item.onclick) === 'function') {\r\n                                item.onclick.call(item, e, item.el);\r\n                            }\r\n                            // Open sub menu in case exists\r\n                            if (item.submenu) {\r\n                                // Open menu\r\n                                menu.open(item, true);\r\n                                // Action happened\r\n                                ret = true;\r\n                            } else {\r\n                                // Close all menu\r\n                                self.close(0);\r\n                                // Action happened\r\n                                ret = true;\r\n                            }\r\n                        }\r\n                    } else if (e.key === 'Escape') {\r\n                        self.close(0);\r\n                    }\r\n\r\n                    // Something important happen so block any progression\r\n                    if (ret === true) {\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                }\r\n            });\r\n\r\n            if (! self.root) {\r\n                if (self.tagName) {\r\n                    self.root = self.el.parentNode.parentNode;\r\n                } else {\r\n                    self.root = self.el.parentNode;\r\n                }\r\n            }\r\n\r\n            // Parent\r\n            self.root.addEventListener(\"contextmenu\", function(e) {\r\n                if (Array.isArray(self.options) && self.options.length) {\r\n                    let [x, y] = getCoords(e);\r\n                    self.open(self.options, x, y, true);\r\n                    e.preventDefault();\r\n                    e.stopImmediatePropagation();\r\n                }\r\n            });\r\n        });\r\n\r\n        return `<div class=\"lm-menu\" role=\"menu\" aria-orientation=\"vertical\" tabindex=\"0\"></div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Contextmenu: Contextmenu });\r\n\r\n    lemonade.createWebComponent('contextmenu', Contextmenu);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Contextmenu, root, options)\r\n            return options;\r\n        } else {\r\n            return Contextmenu.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 692:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n/**\r\n * Implement page up and down navigation\r\n * Implement color attribute for items\r\n */\r\n\r\nif (!lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\nif (!Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(72);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            return this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Default row height\r\n    let defaultRowHeight = 24;\r\n\r\n    // Translations\r\n    const T = function(t) {\r\n        if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n            return document.dictionary[t] || t;\r\n        } else {\r\n            return t;\r\n        }\r\n    }\r\n\r\n    const isEmpty = function(v) {\r\n        return v === '' || v === null || v === undefined || (Array.isArray(v) && v.length === 0);\r\n    }\r\n\r\n    /**\r\n     * Compare two values (arrays, strings, numbers, etc.)\r\n     * Returns true if both are equal or empty\r\n     * @param {*} a1\r\n     * @param {*} a2\r\n     */\r\n    const compareValues = function(a1, a2) {\r\n        if (a1 === a2 || (isEmpty(a1) && isEmpty(a2))) {\r\n            return true;\r\n        }\r\n\r\n        if (!a1 || !a2) {\r\n            return false;\r\n        }\r\n\r\n        if (Array.isArray(a1) && Array.isArray(a2)) {\r\n            if (a1.length !== a2.length) {\r\n                return false;\r\n            }\r\n            for (let i = 0; i < a1.length; i++) {\r\n                if (a1[i] !== a2[i]) {\r\n                    return false;\r\n                }\r\n            }\r\n            return true;\r\n        }\r\n\r\n        return a1 === a2;\r\n    }\r\n\r\n    const lazyLoading = function (self) {\r\n        /**\r\n         * Get the position from top of a row by its index\r\n         * @param item\r\n         * @returns {number}\r\n         */\r\n        const getRowPosition = function (item) {\r\n            // Position from top\r\n            let top = 0;\r\n            if (item) {\r\n                let items = self.rows;\r\n                if (items && items.length) {\r\n                    let index = self.rows.indexOf(item);\r\n                    // Go through the items\r\n                    for (let j = 0; j < index; j++) {\r\n                        top += items[j].height || defaultRowHeight;\r\n                    }\r\n                }\r\n            }\r\n            return top;\r\n        }\r\n\r\n        const updateScroll = function () {\r\n            let items = self.rows;\r\n            if (items) {\r\n                // Before control\r\n                let before = true;\r\n                // Total of items in the container\r\n                let numOfItems = items.length;\r\n                // Position from top\r\n                let height = 0;\r\n                // Size of the adjustment\r\n                let size = 0;\r\n                // Go through the items\r\n                for (let j = 0; j < numOfItems; j++) {\r\n                    let h = items[j].height || defaultRowHeight;\r\n                    // Height\r\n                    height += h;\r\n                    // Start tracking all items as before\r\n                    if (items[j] === self.result[0]) {\r\n                        before = false;\r\n                    }\r\n                    // Adjustment\r\n                    if (before) {\r\n                        size += h;\r\n                    }\r\n                }\r\n                // Update height\r\n                scroll.style.height = height + 'px';\r\n                // Adjust scroll position\r\n                return size;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        const getVisibleRows = function (reset) {\r\n            let items = self.rows;\r\n            if (items) {\r\n                let adjust;\r\n                // Total of items in the container\r\n                let numOfItems = items.length;\r\n                // Get the position from top\r\n                let y = el.scrollTop;\r\n                // Get the height\r\n                let h = null;\r\n                if (self.type === 'searchbar' || self.type === 'picker') {\r\n                    // Priority should be the size used on the viewport\r\n                    h = y + (el.offsetHeight || self.height);\r\n                } else {\r\n                    // Priority is the height define during initialization\r\n                    h = y + (self.height || el.offsetHeight);\r\n                }\r\n                // Go through the items\r\n                let rows = [];\r\n                // Height\r\n                let height = 0;\r\n                // Go through all items\r\n                for (let j = 0; j < numOfItems; j++) {\r\n                    if (items[j].visible !== false) {\r\n                        // Height\r\n                        let rowHeight = items[j].height || defaultRowHeight;\r\n                        // Return on partial width\r\n                        if (height + rowHeight > y && height < h) {\r\n                            rows.push(items[j]);\r\n                        }\r\n                        height += rowHeight;\r\n                    }\r\n                }\r\n\r\n                // Update visible rows\r\n                if (reset || !compareValues(rows, self.result)) {\r\n                    // Render the items\r\n                    self.result = rows;\r\n                    // Adjust scroll height\r\n                    let adjustScroll = reset;\r\n                    // Adjust scrolling\r\n                    for (let i = 0; i < rows.length; i++) {\r\n                        // Item\r\n                        let item = rows[i];\r\n                        // Item height\r\n                        let h = item.el.offsetHeight;\r\n                        // Update row height\r\n                        if (!item.height || h !== item.height) {\r\n                            // Keep item height\r\n                            item.height = h;\r\n                            // Adjust total height\r\n                            adjustScroll = true;\r\n                        }\r\n                    }\r\n\r\n                    // Update scroll if the height of one element has been changed\r\n                    if (adjustScroll) {\r\n                        // Adjust the scroll height\r\n                        adjust = updateScroll();\r\n                    }\r\n                }\r\n\r\n                // Adjust position of the first element\r\n                let position = getRowPosition(self.result[0]);\r\n                let diff = position - el.scrollTop;\r\n                if (diff > 0) {\r\n                    diff = 0;\r\n                }\r\n                self.container.style.top = diff + 'px';\r\n\r\n                return adjust;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Move the position to the top and re-render based on the scroll\r\n         * @param reset\r\n         */\r\n        const render = function (reset) {\r\n            // Move scroll to the top\r\n            el.scrollTop = 0;\r\n            // Reset scroll\r\n            updateScroll();\r\n            // Append first batch\r\n            getVisibleRows(reset);\r\n        }\r\n\r\n        /**\r\n         * Will adjust the items based on the scroll position offset\r\n         */\r\n        self.adjustPosition = function (item) {\r\n            if (item.el) {\r\n                let h = item.el.offsetHeight;\r\n                let calc = item.el.offsetTop + h;\r\n                if (calc > el.offsetHeight) {\r\n                    let size = calc - el.offsetHeight;\r\n                    if (size < h) {\r\n                        size = h;\r\n                    }\r\n                    el.scrollTop -= -1 * size;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Controls\r\n        const scrollControls = function () {\r\n            getVisibleRows(false);\r\n        }\r\n\r\n        // Element for scrolling\r\n        let el = self.container.parentNode;\r\n        el.classList.add('lm-lazy');\r\n        // Div to represent the height of the content\r\n        const scroll = document.createElement('div');\r\n        scroll.classList.add('lm-lazy-scroll');\r\n        // Force the height and add scrolling\r\n        el.appendChild(scroll);\r\n        el.addEventListener('scroll', scrollControls, { passive: true });\r\n        el.addEventListener('wheel', scrollControls, { passive: true });\r\n        self.container.classList.add('lm-lazy-items');\r\n\r\n        self.goto = function (item) {\r\n            el.scrollTop = getRowPosition(item);\r\n            let adjust = getVisibleRows(false);\r\n            if (adjust) {\r\n                el.scrollTop = adjust;\r\n                // Last adjust on the visible rows\r\n                getVisibleRows(false);\r\n            }\r\n        }\r\n\r\n        return (prop) => {\r\n            if (prop === 'rows') {\r\n                render(true);\r\n            }\r\n        }\r\n    }\r\n\r\n    const getAttributeName = function(prop) {\r\n        if (prop.substring(0,1) === ':') {\r\n            prop = prop.substring(1);\r\n        } else if (prop.substring(0,3) === 'lm-') {\r\n            prop = prop.substring(3);\r\n        }\r\n        return prop.toLowerCase();\r\n    }\r\n\r\n    const extractFromHtml =  function(element) {\r\n        let data = [];\r\n        // Content\r\n        for (let i = 0; i < element.children.length; i++) {\r\n            let e = element.children[i];\r\n            let item = {\r\n                text: e.textContent || e.getAttribute('title'),\r\n                value: e.getAttribute('value'),\r\n            }\r\n            if (item.value == null) {\r\n                item.value = item.text;\r\n            }\r\n            data.push(item);\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    const extract = function(children) {\r\n        let data = [];\r\n\r\n        if (this.tagName) {\r\n            data = extractFromHtml(this);\r\n            // Remove all elements\r\n            this.textContent = '';\r\n        } else {\r\n            // Get data\r\n            if (typeof(children) === 'string') {\r\n                // Version 4\r\n                let d = document.createElement('div');\r\n                d.innerHTML = children;\r\n                data = extractFromHtml(d);\r\n            } else if (children && children.length) {\r\n                // Version 5\r\n                children.forEach((v) => {\r\n                    let item = {}\r\n                    v.props.forEach((prop) => {\r\n                        item[getAttributeName(prop.name)] = prop.value;\r\n                    });\r\n                    if (! item.text) {\r\n                        item.text = v.children[0]?.props[0]?.value || '';\r\n                    }\r\n                    data.push(item);\r\n                });\r\n                // Block children\r\n                children.length = 0;\r\n            }\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    const isDOM = function(o) {\r\n        return (o instanceof Element || o instanceof HTMLDocument || o instanceof DocumentFragment);\r\n    }\r\n\r\n    const Dropdown = function (children, { onchange, onload }) {\r\n        let self = this;\r\n        // Data\r\n        let data = [];\r\n        // Internal value controllers\r\n        let value = [];\r\n        // Cursor\r\n        let cursor = null;\r\n        // Control events\r\n        let ignoreEvents = false;\r\n        // Lazy loading global instance\r\n        let lazyloading = null;\r\n        // Tracking changes\r\n        let changesDetected = false;\r\n        // Debounce timer for search\r\n        let searchTimeout = null;\r\n\r\n        // Data\r\n        if (! Array.isArray(self.data)) {\r\n            self.data = [];\r\n        }\r\n\r\n        let d = extract.call(this, children);\r\n        if (d) {\r\n            d.forEach((v) => {\r\n                self.data.push(v)\r\n            })\r\n        }\r\n\r\n        // Decide the type based on the size of the screen\r\n        let autoType = self.type === 'auto';\r\n\r\n        // Custom events defined by the user\r\n        let load = self.onload;\r\n        self.onload = null;\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Compatibility\r\n        if (typeof self.newOptions !== 'undefined') {\r\n            self.insert = self.newOptions;\r\n        }\r\n\r\n        // Cursor controllers\r\n        const setCursor = function (index, force) {\r\n            let item = self.rows[index];\r\n            if (typeof (item) !== 'undefined') {\r\n                // Set the cursor number\r\n                cursor = index;\r\n                // Set visual indication\r\n                item.cursor = true;\r\n                // Go to the item on the scroll in case the item is not on the viewport\r\n                if (!(item.el && item.el.parentNode) || force === true) {\r\n                    // Goto method\r\n                    self.goto(item);\r\n                }\r\n                // Adjust cursor position\r\n                setTimeout(function () {\r\n                    self.adjustPosition(item);\r\n                });\r\n            }\r\n        }\r\n\r\n        const removeCursor = function (reset) {\r\n            if (cursor !== null) {\r\n                if (typeof (self.rows[cursor]) !== 'undefined') {\r\n                    self.rows[cursor].cursor = false;\r\n                }\r\n                if (reset) {\r\n                    // Cursor is null\r\n                    cursor = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        const moveCursor = function (direction, jump) {\r\n            // Remove cursor\r\n            removeCursor();\r\n            // Last item\r\n            let last = self.rows.length - 1;\r\n            if (jump) {\r\n                if (direction < 0) {\r\n                    cursor = 0;\r\n                } else {\r\n                    cursor = last;\r\n                }\r\n            } else {\r\n                // Position\r\n                if (cursor === null) {\r\n                    cursor = 0;\r\n                } else {\r\n                    // Move previous\r\n                    cursor = cursor + direction;\r\n                }\r\n                // Reach the boundaries\r\n                if (direction < 0) {\r\n                    // Back to the last one\r\n                    if (cursor < 0) {\r\n                        cursor = last;\r\n                    }\r\n                } else {\r\n                    // Back to the first one\r\n                    if (cursor > last) {\r\n                        cursor = 0;\r\n                    }\r\n                }\r\n            }\r\n            // Add cursor\r\n            setCursor(cursor);\r\n        }\r\n\r\n        const adjustDimensions = function(data) {\r\n            // Estimate width\r\n            let width = self.width ?? 0;\r\n            // Adjust the width\r\n            let w = getInput().offsetWidth;\r\n            if (width < w) {\r\n                width = w;\r\n            }\r\n            // Width && values\r\n            data.map(function (s) {\r\n                // Estimated width of the element\r\n                if (s.text) {\r\n                    let w = Math.max(width, s.text.length * 7.5);\r\n                    if (width < w) {\r\n                        width = w;\r\n                    }\r\n                }\r\n            });\r\n            // Min width for the container\r\n            self.container.parentNode.style.width = (width - 2) + 'px';\r\n        }\r\n\r\n        const setData = function () {\r\n            // Data\r\n            data = JSON.parse(JSON.stringify(self.data));\r\n            // Re-order to make sure groups are in sequence\r\n            if (data && data.length) {\r\n                // Adjust width and height\r\n                adjustDimensions(data);\r\n                // Groups\r\n                data.sort((a, b) => {\r\n                    // Compare groups\r\n                    if (a.group && b.group) {\r\n                        return a.group.localeCompare(b.group);\r\n                    }\r\n                    return 0;\r\n                });\r\n                let group = '';\r\n                // Define group headers\r\n                data.map((v) => {\r\n                    // Compare groups\r\n                    if (v && v.group && v.group !== group) {\r\n                        v.header = v.group;\r\n                        group = v.group;\r\n                    }\r\n                });\r\n            }\r\n            // Data to be listed\r\n            self.rows = data;\r\n        }\r\n\r\n        const updateLabel = function () {\r\n            if (value && value.length) {\r\n                getInput().textContent = value.filter(v => v.selected).map(i => i.text).join('; ');\r\n            } else {\r\n                getInput().textContent = '';\r\n            }\r\n        }\r\n\r\n        const setValue = function (v, ignoreEvent) {\r\n            // Values\r\n            let newValue;\r\n            if (! Array.isArray(v)) {\r\n                if (typeof(v) === 'string') {\r\n                    newValue = v.split(self.divisor ?? ';');\r\n                } else {\r\n                    newValue = [v];\r\n                }\r\n            } else {\r\n                newValue = v;\r\n            }\r\n\r\n            // Width && values\r\n            value = [];\r\n\r\n            if (Array.isArray(data)) {\r\n                data.map(function (s) {\r\n                    s.selected = newValue.some(v => {\r\n                        // Use strict equality when either value is empty string to avoid '' == 0 being true\r\n                        if (v === '' || s.value === '') {\r\n                            return v === s.value;\r\n                        }\r\n                        return v == s.value;\r\n                    });\r\n                    if (s.selected) {\r\n                        value.push(s);\r\n                    }\r\n                });\r\n            }\r\n\r\n            // Update label\r\n            if (self.isClosed()) {\r\n                updateLabel();\r\n            }\r\n\r\n            // Component onchange\r\n            if (! ignoreEvent) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: getValue(),\r\n                });\r\n            }\r\n        }\r\n\r\n        const getValue = function () {\r\n            if (self.multiple) {\r\n                if (value && value.length) {\r\n                    return value.filter(v => v.selected).map(i => i.value);\r\n                }\r\n            } else {\r\n                if (value && value.length) {\r\n                    return value[0].value;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        const getText = function () {\r\n            if (self.multiple) {\r\n                if (value && value.length) {\r\n                    return value.filter(v => v.selected).map(i => i.text);\r\n                }\r\n            } else {\r\n                if (value && value.length) {\r\n                    return value[0].text;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        const onopen = function () {\r\n            self.state = true;\r\n            // Value\r\n            let v = value[value.length - 1];\r\n            // Make sure goes back to the top of the scroll\r\n            if (self.container.parentNode.scrollTop > 0) {\r\n                self.container.parentNode.scrollTop = 0;\r\n            }\r\n            // Move to the correct position\r\n            if (v) {\r\n                // Mark the position of the cursor to the same element\r\n                setCursor(self.rows.indexOf(v), true);\r\n            }\r\n            // Prepare search field\r\n            if (self.autocomplete) {\r\n                // Get the input\r\n                let input = getInput();\r\n                // Editable\r\n                input.setAttribute('contenteditable', true);\r\n                // Clear input\r\n                input.textContent = '';\r\n                // Focus on the item\r\n                input.focus();\r\n            }\r\n            // Adjust width and height\r\n            adjustDimensions(self.data);\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function (options, origin) {\r\n            // Cursor\r\n            removeCursor(true);\r\n            // Reset search\r\n            if (self.autocomplete) {\r\n                // Go to begin of the data\r\n                self.rows = data;\r\n                // Get the input\r\n                let input = getInput();\r\n                if (input) {\r\n                    // Remove editable attribute\r\n                    input.removeAttribute('contenteditable');\r\n                    // Clear input\r\n                    input.textContent = '';\r\n                }\r\n            }\r\n\r\n            if (origin === 'escape') {\r\n                // Cancel operation and keep the same previous value\r\n                setValue(self.value, true);\r\n            } else {\r\n                // Current value\r\n                let newValue = getValue();\r\n\r\n                // If that is different from the component value\r\n                if (changesDetected === true && ! compareValues(newValue, self.value)) {\r\n                    self.value = newValue;\r\n                } else {\r\n                    // Update label\r\n                    updateLabel();\r\n                }\r\n            }\r\n\r\n            // Identify the new state of the dropdown\r\n            self.state = false;\r\n\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                ...options\r\n            });\r\n        }\r\n\r\n        const normalizeData = function(result) {\r\n            if (result && result.length) {\r\n                return result.map((v) => {\r\n                    if (typeof v === 'string' || typeof v === 'number') {\r\n                        return { value: v, text: v };\r\n                    } else if (typeof v === 'object' && v.hasOwnProperty('name')) {\r\n                        return { value: v.id, text: v.name };\r\n                    } else {\r\n                        return v;\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        const loadData = function(result) {\r\n            result = normalizeData(result);\r\n            // Loading controls\r\n            lazyloading = lazyLoading(self);\r\n            // Loading new data from a remote source\r\n            if (result) {\r\n                result.forEach((v) => {\r\n                    self.data.push(v);\r\n                });\r\n            }\r\n            // Process the data\r\n            setData();\r\n            // Set value\r\n            if (typeof(self.value) !== 'undefined') {\r\n                setValue(self.value, true);\r\n            }\r\n            // Onload method\r\n            Dispatch.call(self, load, 'load', {\r\n                instance: self\r\n            });\r\n            // Remove loading spin\r\n            self.input.classList.remove('lm-dropdown-loading');\r\n        }\r\n\r\n        const resetData = function(result) {\r\n            result = normalizeData(result);\r\n            // Reset cursor\r\n            removeCursor(true);\r\n            let r = data.filter(item => {\r\n                return item.selected === true;\r\n            });\r\n            // Loading new data from a remote source\r\n            if (result) {\r\n                result.forEach((v) => {\r\n                    r.push(v);\r\n                });\r\n            }\r\n            self.rows = r;\r\n            // Remove loading spin\r\n            self.input.classList.remove('lm-dropdown-loading');\r\n\r\n            // Event\r\n            Dispatch.call(self, self.onsearch, 'search', {\r\n                instance: self,\r\n                result: result,\r\n            });\r\n        }\r\n\r\n        const getInput = function() {\r\n            return self.input;\r\n        }\r\n\r\n        const search = function(query) {\r\n            if (! self.isClosed() && self.autocomplete) {\r\n\r\n                // Remote or normal search\r\n                if (self.remote === true && self.url) {\r\n                    // Clear existing timeout\r\n                    if (searchTimeout) {\r\n                        clearTimeout(searchTimeout);\r\n                    }\r\n                    // Loading spin\r\n                    self.input.classList.add('lm-dropdown-loading');\r\n                    // Headers\r\n                    let http = {\r\n                        headers: {\r\n                            'Content-Type': 'text/json',\r\n                        }\r\n                    }\r\n                    let ret = Dispatch.call(self, self.onbeforesearch, 'beforesearch', {\r\n                        instance: self,\r\n                        http: http,\r\n                        query: query,\r\n                    });\r\n\r\n                    if (ret === false) {\r\n                        return;\r\n                    }\r\n\r\n                    // Debounce the search with 300ms delay\r\n                    searchTimeout = setTimeout(() => {\r\n                        let url = self.url;\r\n                        url += url.indexOf('?') === -1 ? '?' : '&';\r\n                        url += `q=${query}`;\r\n\r\n                        fetch(url, http).then(r => r.json()).then(resetData).catch((error) => {\r\n                            resetData([]);\r\n                        });\r\n                    }, 300);\r\n                } else {\r\n                    // Filter options\r\n                    let temp;\r\n\r\n                    const find = (prop) => {\r\n                        if (prop) {\r\n                            if (Array.isArray(prop)) {\r\n                                // match if ANY element contains the query (case-insensitive)\r\n                                return prop.some(v => v != null && v.toString().toLowerCase().includes(query));\r\n                            }\r\n                            // handle strings/numbers/others\r\n                            return prop.toString().toLowerCase().includes(query);\r\n                        }\r\n                        return false;\r\n                    };\r\n\r\n                    if (! query) {\r\n                        temp = data;\r\n                    } else {\r\n                        temp = data.filter(item => {\r\n                            return item.selected === true || find(item.text) || find(item.group) || find(item.keywords) || find(item.synonym);\r\n                        });\r\n                    }\r\n\r\n                    // Cursor\r\n                    removeCursor(true);\r\n                    // Update the data from the dropdown\r\n                    self.rows = temp;\r\n                }\r\n            }\r\n        }\r\n\r\n        const events = {\r\n            focusout: (e) => {\r\n                if (self.modal) {\r\n                    if (! (e.relatedTarget && self.el.contains(e.relatedTarget))) {\r\n                        if (! self.isClosed()) {\r\n                            self.close({ origin: 'focusout '});\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (! self.isClosed()) {\r\n                    let prevent = false;\r\n                    if (e.code === 'ArrowUp') {\r\n                        moveCursor(-1);\r\n                        prevent = true;\r\n                    } else if (e.code === 'ArrowDown') {\r\n                        moveCursor(1);\r\n                        prevent = true;\r\n                    } else if (e.code === 'Home') {\r\n                        moveCursor(-1, true);\r\n                        if (!self.autocomplete) {\r\n                            prevent = true;\r\n                        }\r\n                    } else if (e.code === 'End') {\r\n                        moveCursor(1, true);\r\n                        if (!self.autocomplete) {\r\n                            prevent = true;\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (e.target.tagName === 'BUTTON') {\r\n                            e.target.click();\r\n                            let input = getInput();\r\n                            input.focus();\r\n                        } else {\r\n                            select(e, self.rows[cursor]);\r\n                        }\r\n                        prevent = true;\r\n                    } else if (e.code === 'Escape') {\r\n                        self.close({ origin: 'escape'});\r\n                        prevent = true;\r\n                    } else {\r\n                        if (e.keyCode === 32 && !self.autocomplete) {\r\n                            select(e, self.rows[cursor]);\r\n                        }\r\n                    }\r\n\r\n                    if (prevent) {\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                } else {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown' || e.code === 'Enter') {\r\n                        self.open();\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                }\r\n            },\r\n            mousedown: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    if (self.autocomplete) {\r\n                        let x;\r\n                        if (e.changedTouches && e.changedTouches[0]) {\r\n                            x = e.changedTouches[0].clientX;\r\n                        } else {\r\n                            x = e.clientX;\r\n                        }\r\n                        if (e.target.offsetWidth - (x - e.target.offsetLeft) < 20) {\r\n                            toggle();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else {\r\n                        toggle();\r\n                    }\r\n                }\r\n            },\r\n            paste: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    let text;\r\n                    if (e.clipboardData || e.originalEvent.clipboardData) {\r\n                        text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n                    } else if (window.clipboardData) {\r\n                        text = window.clipboardData.getData('Text');\r\n                    }\r\n                    text = text.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\r\n                    document.execCommand('insertText', false, text)\r\n                    e.preventDefault();\r\n                }\r\n            },\r\n            input: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    search(e.target.textContent.toLowerCase());\r\n                }\r\n            },\r\n        }\r\n\r\n        const selectItem = function(s) {\r\n            if (self.remote === true) {\r\n                if (data.indexOf(s) === -1) {\r\n                    self.data.push(s);\r\n                    data.push(s);\r\n                }\r\n            }\r\n\r\n            if (self.multiple === true) {\r\n                let position = value.indexOf(s);\r\n                if (position === -1) {\r\n                    value.push(s);\r\n                    s.selected = true;\r\n                } else {\r\n                    value.splice(position, 1);\r\n                    s.selected = false;\r\n                }\r\n            } else {\r\n                if (value[0] === s) {\r\n                    if (self.allowEmpty === false) {\r\n                        s.selected = true;\r\n                    } else {\r\n                        s.selected = !s.selected;\r\n                    }\r\n                } else {\r\n                    if (value[0]) {\r\n                        value[0].selected = false;\r\n                    }\r\n                    s.selected = true;\r\n                }\r\n                if (s.selected) {\r\n                    value = [s];\r\n                } else {\r\n                    value = [];\r\n                }\r\n            }\r\n\r\n            changesDetected = true;\r\n        }\r\n\r\n        const add = async function (e) {\r\n            let input = getInput();\r\n            let text = input.textContent;\r\n            if (! text) {\r\n                return false;\r\n            }\r\n\r\n            // New item\r\n            let s = {\r\n                text: text,\r\n                value: text,\r\n            }\r\n\r\n            self.add(s);\r\n\r\n            e.preventDefault();\r\n        }\r\n\r\n        const select = function (e, s) {\r\n            if (s && s.disabled !== true) {\r\n                selectItem(s);\r\n                // Close the modal\r\n                if (self.multiple !== true) {\r\n                    self.close({ origin: 'button' });\r\n                }\r\n            }\r\n        }\r\n\r\n        const toggle = function () {\r\n            if (self.modal) {\r\n                if (self.isClosed()) {\r\n                    self.open();\r\n                } else {\r\n                    self.close({ origin: 'button' });\r\n                }\r\n            }\r\n        }\r\n\r\n        self.add = async function (newItem) {\r\n            // Event\r\n            if (typeof(self.onbeforeinsert) === 'function') {\r\n                self.input.classList.add('lm-dropdown-loading');\r\n                let ret = await self.onbeforeinsert(self, newItem);\r\n                self.input.classList.remove('lm-dropdown-loading');\r\n                if (ret === false) {\r\n                    return;\r\n                } else if (ret) {\r\n                    newItem = ret;\r\n                }\r\n            }\r\n            // Process the data\r\n            data.push(newItem);\r\n            self.data.push(newItem);\r\n            // Refresh screen\r\n            self.result.unshift(newItem);\r\n            self.rows.unshift(newItem);\r\n            self.refresh('result');\r\n\r\n            Dispatch.call(self, self.oninsert, 'insert', {\r\n                instance: self,\r\n                item: newItem,\r\n            });\r\n        }\r\n\r\n        self.open = function () {\r\n            if (self.modal && ! self.disabled) {\r\n                if (self.isClosed()) {\r\n                    if (autoType) {\r\n                        self.type = window.innerWidth > 640 ? self.type = 'default' : (self.autocomplete ? 'searchbar' : 'picker');\r\n                    }\r\n                    // Track\r\n                    changesDetected = false;\r\n                    // Open the modal\r\n                    self.modal.open();\r\n                }\r\n            }\r\n        }\r\n\r\n        self.close = function (options) {\r\n            if (self.modal) {\r\n                if (options?.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.setData = function(data) {\r\n            self.data = data;\r\n        }\r\n\r\n        self.getData = function() {\r\n            return self.data;\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.getText = function() {\r\n            return getText();\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            self.value = v;\r\n        }\r\n\r\n        self.reset = function() {\r\n            self.value = null;\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        // Init with a\r\n        let input = self.input;\r\n\r\n        onload(() => {\r\n            if (self.type === \"inline\") {\r\n                // For inline dropdown\r\n                self.el.setAttribute('tabindex', 0);\r\n                // Remove search\r\n                self.input.remove();\r\n            } else {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    closed: true,\r\n                    focus: false,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    position: 'absolute',\r\n                    'auto-adjust': true,\r\n                    'auto-close': false,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el.children[1], self.modal);\r\n            }\r\n\r\n            if (self.remote === 'true') {\r\n                self.remote = true;\r\n            }\r\n\r\n            if (self.autocomplete === 'true') {\r\n                self.autocomplete = true;\r\n            }\r\n\r\n            if (self.multiple === 'true') {\r\n                self.multiple = true;\r\n            }\r\n\r\n            if (self.insert === 'true') {\r\n                self.insert = true;\r\n            }\r\n\r\n            // Autocomplete will be forced to be true when insert action is active\r\n            if ((self.insert === true || self.type === 'searchbar' || self.remote === true) && ! self.autocomplete) {\r\n                self.autocomplete = true;\r\n            }\r\n\r\n            if (typeof(input) !== 'undefined') {\r\n                // Remove the native element\r\n                if (isDOM(input)) {\r\n                    input.classList.add('lm-dropdown-input');\r\n                }\r\n                // Remove search\r\n                self.input.remove();\r\n                // New input\r\n                self.input = input;\r\n            } else {\r\n                self.el.children[0].style.position = 'relative';\r\n            }\r\n\r\n            // Default width\r\n            if (self.width) {\r\n                // Dropdown\r\n                self.el.style.width = self.width + 'px';\r\n            }\r\n\r\n            // Height\r\n            self.height = 400;\r\n\r\n            // Animation for mobile\r\n            if (document.documentElement.clientWidth < 800) {\r\n                self.animation = true;\r\n            }\r\n\r\n            // Events\r\n            self.el.addEventListener('focusout', events.focusout);\r\n            self.el.addEventListener('keydown', events.keydown);\r\n            self.el.addEventListener('mousedown', events.mousedown);\r\n            self.el.addEventListener('paste', events.paste);\r\n            self.el.addEventListener('input', events.input);\r\n\r\n            // Load remote data\r\n            if (self.url) {\r\n                if (self.remote === true) {\r\n                    loadData();\r\n                } else {\r\n                    // Loading spin\r\n                    self.input.classList.add('lm-dropdown-loading');\r\n                    // Load remote data\r\n                    fetch(self.url, {\r\n                        headers: {\r\n                            'Content-Type': 'text/json',\r\n                        }\r\n                    }).then(r => r.json()).then(loadData).catch(() => {\r\n                        loadData();\r\n                    });\r\n                }\r\n            } else {\r\n                loadData();\r\n            }\r\n        });\r\n\r\n        onchange(prop => {\r\n            if (prop === 'value') {\r\n                setValue(self.value);\r\n            } else if (prop === 'rows') {\r\n                // The number of results changes the modal height, so the position needs to be recalculated\r\n                if (self.modal && typeof (self.modal.refreshPosition) === 'function') {\r\n                    self.modal.refreshPosition();\r\n                }\r\n            } else if (prop === 'data') {\r\n                // Store current value before resetting data\r\n                let currentValue = self.value;\r\n                setData();\r\n\r\n                // Only reset value if it's not in the new data\r\n                if (currentValue !== null && currentValue !== undefined && currentValue !== '') {\r\n                    let valuesToCheck = Array.isArray(currentValue) ? currentValue : [currentValue];\r\n\r\n                    // Filter to keep only values that exist in the new data\r\n                    let validValues = valuesToCheck.filter(v => {\r\n                        return self.data.some(item => {\r\n                            if (v === '' || item.value === '') {\r\n                                return v === item.value;\r\n                            }\r\n                            return v == item.value;\r\n                        });\r\n                    });\r\n\r\n                    if (validValues.length === 0) {\r\n                        // No valid values remain, reset to null\r\n                        self.value = null;\r\n                    } else if (self.multiple) {\r\n                        // Multi-select: keep only valid values\r\n                        self.value = validValues;\r\n                    } else {\r\n                        // Single select: re-apply the value\r\n                        self.value = validValues[0];\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (typeof (lazyloading) === 'function') {\r\n                lazyloading(prop);\r\n            }\r\n        });\r\n\r\n        return render => render`<div class=\"lm-dropdown\" data-state=\"{{self.state}}\" data-insert=\"{{self.insert}}\" data-type=\"{{self.type}}\" data-disabled=\"{{self.disabled}}\" :value=\"self.value\" :data=\"self.data\">\r\n            <div class=\"lm-dropdown-header\">\r\n                <div class=\"lm-dropdown-input\" placeholder=\"{{self.placeholder}}\" :ref=\"self.input\" tabindex=\"0\"></div>\r\n                <button class=\"lm-dropdown-add\" onclick=\"${add}\" tabindex=\"0\"></button>\r\n                <div class=\"lm-dropdown-header-controls\">\r\n                    <button onclick=\"self.reset\" class=\"lm-dropdown-done\">${T('Reset')}</button>\r\n                    <button onclick=\"self.close\" class=\"lm-dropdown-done\">${T('Done')}</button>\r\n                </div>\r\n            </div>\r\n            <div class=\"lm-dropdown-content\">\r\n                <div>\r\n                    <div :loop=\"self.result\" :ref=\"self.container\" :rows=\"self.rows\">\r\n                        <div class=\"lm-dropdown-item\" onclick=\"${select}\" data-cursor=\"{{self.cursor}}\" data-disabled=\"{{self.disabled}}\" data-selected=\"{{self.selected}}\" data-group=\"{{self.header}}\">\r\n                            <div><img :src=\"self.image\" /> <div>{{self.text}}</div></div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Dropdown: Dropdown });\r\n\r\n    lemonade.createWebComponent('dropdown', Dropdown);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Dropdown, root, options)\r\n            return options;\r\n        } else {\r\n            return Dropdown.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 72:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n/**\r\n * pin the modal to the left panel\r\n */\r\nif (!lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n        0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (!(key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function (method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // References\r\n    const modals = [];\r\n    // State of the resize and move modal\r\n    let state = {};\r\n    // Internal controls of the action of resize and move\r\n    let controls = {};\r\n    // Width of the border\r\n    let cornerSize = 10;\r\n    // Container with minimized modals\r\n    const minimizedModals = [];\r\n    // Default z-index for the modals\r\n    const defaultZIndex = 20;\r\n\r\n    /**\r\n     * Send the modal to the front\r\n     * @param container\r\n     */\r\n    const sendToFront = function (container) {\r\n        let highestXIndex = defaultZIndex;\r\n        for (let i = 0; i < modals.length; i++) {\r\n            const zIndex = parseInt(modals[i].el.style.zIndex);\r\n            if (zIndex > highestXIndex) {\r\n                highestXIndex = zIndex;\r\n            }\r\n        }\r\n        container.style.zIndex = highestXIndex + 1;\r\n    }\r\n\r\n    /**\r\n     * Send modal to the back\r\n     * @param container\r\n     */\r\n    const sendToBack = function (container) {\r\n        container.style.zIndex = defaultZIndex;\r\n    }\r\n\r\n    // Get the coordinates of the action\r\n    const getCoords = function (e) {\r\n        let x;\r\n        let y;\r\n\r\n        if (e.changedTouches && e.changedTouches[0]) {\r\n            x = e.changedTouches[0].clientX;\r\n            y = e.changedTouches[0].clientY;\r\n        } else {\r\n            x = e.clientX;\r\n            y = e.clientY;\r\n        }\r\n\r\n        return [x, y];\r\n    }\r\n\r\n    // Get the button status\r\n    const getButton = function (e) {\r\n        e = e || window.event;\r\n        if (e.buttons) {\r\n            return e.buttons;\r\n        } else if (e.button) {\r\n            return e.button;\r\n        } else {\r\n            return e.which;\r\n        }\r\n    }\r\n\r\n    // Finalize any potential action\r\n    const mouseUp = function (e) {\r\n        // Finalize all actions\r\n        if (typeof (controls.action) === 'function') {\r\n            controls.action();\r\n        }\r\n        setTimeout(function () {\r\n            // Remove cursor\r\n            if (controls.e) {\r\n                controls.e.style.cursor = '';\r\n            }\r\n            // Reset controls\r\n            controls = {};\r\n            // Reset state controls\r\n            state = {\r\n                x: null,\r\n                y: null,\r\n            }\r\n        }, 0)\r\n    }\r\n\r\n    const mouseMove = function (e) {\r\n        if (!getButton(e)) {\r\n            return false;\r\n        }\r\n        // Get mouse coordinates\r\n        let [x, y] = getCoords(e);\r\n\r\n        // Move modal\r\n        if (controls.type === 'move') {\r\n            if (state && state.x == null && state.y == null) {\r\n                state.x = x;\r\n                state.y = y;\r\n            }\r\n\r\n            let dx = x - state.x;\r\n            let dy = y - state.y;\r\n            let top = controls.e.offsetTop + dy;\r\n            let left = controls.e.offsetLeft + dx;\r\n\r\n            // Update position\r\n            controls.top = top;\r\n            controls.left = left;\r\n            controls.e.style.top = top + 'px';\r\n            controls.e.style.left = left + 'px';\r\n\r\n            state.x = x;\r\n            state.y = y;\r\n            state.top = top;\r\n            state.left = left;\r\n        } else if (controls.type === 'resize') {\r\n            let top = null;\r\n            let left = null;\r\n            let width = null;\r\n            let height = null;\r\n\r\n            if (controls.d === 'e-resize' || controls.d === 'ne-resize' || controls.d === 'se-resize') {\r\n                width = controls.w + (x - controls.x);\r\n\r\n                if (e.shiftKey) {\r\n                    height = controls.h + (x - controls.x) * (controls.h / controls.w);\r\n                }\r\n            } else if (controls.d === 'w-resize' || controls.d === 'nw-resize' || controls.d === 'sw-resize') {\r\n                left = controls.l + (x - controls.x);\r\n                // Do not move further\r\n                if (left >= controls.l) {\r\n                    left = controls.l;\r\n                }\r\n                // Update width\r\n                width = controls.l + controls.w - left;\r\n                // Consider shift to update height\r\n                if (e.shiftKey) {\r\n                    height = controls.h - (x - controls.x) * (controls.h / controls.w);\r\n                }\r\n            }\r\n\r\n            if (controls.d === 's-resize' || controls.d === 'se-resize' || controls.d === 'sw-resize') {\r\n                if (!height) {\r\n                    height = controls.h + (y - controls.y);\r\n                }\r\n            } else if (controls.d === 'n-resize' || controls.d === 'ne-resize' || controls.d === 'nw-resize') {\r\n                top = controls.t + (y - controls.y);\r\n                // Do not move further\r\n                if (top >= controls.t) {\r\n                    top = controls.t;\r\n                }\r\n                // Update height\r\n                height = controls.t + controls.h - top;\r\n            }\r\n\r\n            if (top) {\r\n                controls.e.style.top = top + 'px';\r\n            }\r\n            if (left) {\r\n                controls.e.style.left = left + 'px';\r\n            }\r\n            if (width) {\r\n                controls.e.style.width = width + 'px';\r\n            }\r\n            if (height) {\r\n                controls.e.style.height = height + 'px';\r\n            }\r\n        }\r\n    }\r\n\r\n    if (typeof (document) !== \"undefined\") {\r\n        document.addEventListener('mouseup', mouseUp);\r\n        document.addEventListener('mousemove', mouseMove);\r\n    }\r\n\r\n    const isTrue = function (e) {\r\n        return e === true || e === 1 || e === 'true';\r\n    }\r\n\r\n    const refreshMinimized = function () {\r\n        let items = minimizedModals;\r\n        let numOfItems = items.length;\r\n        let width = 10;\r\n        let height = 55;\r\n        let offsetWidth = window.innerWidth;\r\n        let offsetHeight = window.innerHeight;\r\n        for (let i = 0; i < numOfItems; i++) {\r\n            let item = items[i];\r\n            item.el.style.left = width + 'px';\r\n            item.el.style.top = offsetHeight - height + 'px';\r\n            width += 205;\r\n\r\n            if (offsetWidth - width < 205) {\r\n                width = 10;\r\n                height += 50;\r\n            }\r\n        }\r\n    }\r\n\r\n    const delayAction = function (self, action) {\r\n        // Make sure to remove the transformation before minimize to preserve the animation\r\n        if (self.el.style.marginLeft || self.el.style.marginTop) {\r\n            // Make sure no animation during this process\r\n            self.el.classList.add('action');\r\n            // Remove adjustment\r\n            removeMargin(self);\r\n            // Make sure to continue with minimize\r\n            setTimeout(function () {\r\n                // Remove class\r\n                self.el.classList.remove('action');\r\n                // Call action\r\n                action(self);\r\n            }, 0)\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    const setMini = function (self) {\r\n        if (delayAction(self, setMini)) {\r\n            return;\r\n        }\r\n\r\n        // Minimize modals\r\n        minimizedModals.push(self);\r\n\r\n        self.el.top = self.el.offsetTop;\r\n        self.el.left = self.el.offsetLeft;\r\n\r\n        if (!self.el.style.top) {\r\n            self.el.style.top = self.el.top + 'px';\r\n        }\r\n        if (!self.el.style.left) {\r\n            self.el.style.left = self.el.left + 'px';\r\n        }\r\n\r\n        self.el.translateY = 0;\r\n        self.el.translateX = 0;\r\n\r\n        // Refresh positions\r\n        setTimeout(function () {\r\n            refreshMinimized();\r\n            self.minimized = true;\r\n        }, 10)\r\n    }\r\n\r\n    const removeMini = function (self) {\r\n        minimizedModals.splice(minimizedModals.indexOf(self), 1);\r\n        self.minimized = false;\r\n        self.el.style.top = self.el.top + 'px';\r\n        self.el.style.left = self.el.left + 'px';\r\n        // Refresh positions\r\n        setTimeout(() => {\r\n            refreshMinimized();\r\n        }, 10);\r\n        // Refresh positions\r\n        setTimeout(() => {\r\n            if (self.top === '') {\r\n                self.el.style.top = '';\r\n            }\r\n            if (self.left === '') {\r\n                self.el.style.left = '';\r\n            }\r\n        }, 400);\r\n    }\r\n\r\n    const removeMargin = function (self) {\r\n        if (self.el.style.marginLeft) {\r\n            let y = self.el.offsetLeft;\r\n            self.el.style.marginLeft = '';\r\n            self.left = y;\r\n        }\r\n\r\n        if (self.el.style.marginTop) {\r\n            let x = self.el.offsetTop;\r\n            self.el.style.marginTop = '';\r\n            self.top = x;\r\n        }\r\n    }\r\n\r\n    const adjustHorizontal = function (self) {\r\n        if (!isTrue(self['auto-adjust'])) {\r\n            return false;\r\n        }\r\n\r\n        self.el.style.marginLeft = '';\r\n        let viewportWidth = window.innerWidth;\r\n        let margin = 10;\r\n\r\n        if (self.position) {\r\n            if (self.position === 'absolute') {\r\n                let w = document.documentElement.offsetWidth;\r\n                if (w > viewportWidth) {\r\n                    //viewportWidth = w;\r\n                }\r\n            } else if (self.position !== 'center') {\r\n                margin = 0;\r\n            }\r\n        }\r\n\r\n        let el = self.el.getBoundingClientRect();\r\n\r\n        let rightEdgeDistance = viewportWidth - (el.left + el.width);\r\n        let transformX = 0;\r\n\r\n        if (self.position === 'absolute') {\r\n            if (rightEdgeDistance < 0) {\r\n                transformX = rightEdgeDistance - margin - 10; // 10 is the scroll width\r\n            }\r\n        } else {\r\n            if (rightEdgeDistance < 0) {\r\n                transformX = rightEdgeDistance - margin;\r\n            }\r\n        }\r\n\r\n        if (el.left < 0) {\r\n            transformX = margin - el.left;\r\n        }\r\n        if (transformX !== 0) {\r\n            self.el.style.marginLeft = transformX + 'px';\r\n        }\r\n    }\r\n\r\n    const adjustVertical = function (self) {\r\n        if (!isTrue(self['auto-adjust'])) {\r\n            return false;\r\n        }\r\n\r\n        self.el.style.marginTop = '';\r\n        let viewportHeight = window.innerHeight;\r\n        let margin = 10;\r\n\r\n        if (self.position) {\r\n            if (self.position === 'absolute') {\r\n                let h = document.documentElement.offsetHeight;\r\n                if (h > viewportHeight) {\r\n                    //viewportHeight = h;\r\n                }\r\n            } else if (self.position !== 'center') {\r\n                margin = 0;\r\n            }\r\n        }\r\n\r\n        let el = self.el.getBoundingClientRect();\r\n\r\n        let bottomEdgeDistance = viewportHeight - (el.top + el.height);\r\n        let transformY = 0;\r\n\r\n        if (self.position === 'absolute') {\r\n            if (bottomEdgeDistance < 5) {\r\n                transformY = (-1 * el.height) - margin - 12;\r\n                if (el.top + transformY < 0) {\r\n                    transformY = -el.top + 10;\r\n                }\r\n            }\r\n        } else {\r\n            if (bottomEdgeDistance < 0) {\r\n                transformY = bottomEdgeDistance - margin;\r\n            }\r\n        }\r\n\r\n        if (el.top < 0) {\r\n            transformY = margin - el.top;\r\n        }\r\n        if (transformY !== 0) {\r\n            self.el.style.marginTop = transformY + 'px';\r\n        }\r\n    }\r\n\r\n    const removeElements = function (root) {\r\n        // Keep the DOM elements\r\n        let elements = [];\r\n        if (root) {\r\n            while (root.firstChild) {\r\n                elements.push(root.firstChild);\r\n                root.firstChild.remove();\r\n            }\r\n        }\r\n        return elements;\r\n    }\r\n\r\n    const appendElements = function (root, elements) {\r\n        if (elements && elements.length) {\r\n            while (elements[0]) {\r\n                root.appendChild(elements.shift());\r\n            }\r\n        }\r\n    }\r\n\r\n    const Modal = function (template, {onchange, onload, track}) {\r\n        let self = this;\r\n        let backdrop = null;\r\n        let elements = null;\r\n\r\n        if (this.tagName) {\r\n            // Remove elements from the DOM\r\n            elements = removeElements(this);\r\n\r\n            this.addEventListener('dragstart', (e) => {\r\n                e.preventDefault();\r\n            });\r\n        }\r\n\r\n        // Make sure keep the state as boolean\r\n        self.closed = !!self.closed;\r\n\r\n        // Keep all modals references\r\n        modals.push(self);\r\n\r\n        // External onload remove from the lifecycle\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        let load = self.onload;\r\n        self.onload = null;\r\n\r\n        let ignoreEvents = false;\r\n\r\n        const click = function (e) {\r\n            if (e.target.classList.contains('lm-modal-close')) {\r\n                self.close({origin: 'button'});\r\n            }\r\n\r\n            if (e.target.classList.contains('lm-modal-minimize')) {\r\n                // Handles minimized modal positioning\r\n                if (self.minimized === true) {\r\n                    removeMini(self);\r\n                } else {\r\n                    setMini(self);\r\n                }\r\n            }\r\n        }\r\n\r\n        const mousemove = function (e) {\r\n            if (getButton(e)) {\r\n                return;\r\n            }\r\n\r\n            // Get mouse coordinates\r\n            let [x, y] = getCoords(e);\r\n            // Root element of the component\r\n            let item = self.el;\r\n            // Get the position and dimensions\r\n            let rect = item.getBoundingClientRect();\r\n\r\n            controls.type = null;\r\n            controls.d = null;\r\n            controls.e = item;\r\n            controls.w = rect.width;\r\n            controls.h = rect.height;\r\n            controls.t = rect.top;\r\n            controls.l = rect.left;\r\n\r\n            // When resizable\r\n            if (isTrue(self.resizable)) {\r\n                if (e.clientY - rect.top < cornerSize) {\r\n                    if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                        item.style.cursor = 'ne-resize';\r\n                    } else if (e.clientX - rect.left < cornerSize) {\r\n                        item.style.cursor = 'nw-resize';\r\n                    } else {\r\n                        item.style.cursor = 'n-resize';\r\n                    }\r\n                } else if (rect.height - (e.clientY - rect.top) < cornerSize) {\r\n                    if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                        item.style.cursor = 'se-resize';\r\n                    } else if (e.clientX - rect.left < cornerSize) {\r\n                        item.style.cursor = 'sw-resize';\r\n                    } else {\r\n                        item.style.cursor = 's-resize';\r\n                    }\r\n                } else if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                    item.style.cursor = 'e-resize';\r\n                } else if (e.clientX - rect.left < cornerSize) {\r\n                    item.style.cursor = 'w-resize';\r\n                } else {\r\n                    item.style.cursor = '';\r\n                }\r\n\r\n                if (item.style.cursor) {\r\n                    controls.type = 'resize';\r\n                    controls.d = item.style.cursor;\r\n                } else {\r\n                    controls.type = null;\r\n                    controls.d = null;\r\n                }\r\n            }\r\n\r\n            if (controls.type == null && isTrue(self.draggable)) {\r\n                if (y - rect.top < 40) {\r\n                    item.style.cursor = 'move';\r\n                } else {\r\n                    item.style.cursor = '';\r\n                }\r\n\r\n                if (item.style.cursor) {\r\n                    controls.type = 'move';\r\n                    controls.d = item.style.cursor;\r\n                } else {\r\n                    controls.type = null;\r\n                    controls.d = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        const mousedown = function (e) {\r\n            if (!self.minimized) {\r\n                // Get mouse coordinates\r\n                let [x, y] = getCoords(e);\r\n                controls.x = x;\r\n                controls.y = y;\r\n                // Root element of the component\r\n                let item = self.el;\r\n                // Get the position and dimensions\r\n                let rect = item.getBoundingClientRect();\r\n                controls.e = item;\r\n                controls.w = rect.width;\r\n                controls.h = rect.height;\r\n                controls.t = rect.top;\r\n                controls.l = rect.left;\r\n                // If is not minimized\r\n                if (controls.type === 'resize') {\r\n                    // Make sure the width and height is defined for the modal\r\n                    if (!item.style.width) {\r\n                        item.style.width = controls.w + 'px';\r\n                    }\r\n                    if (!item.style.height) {\r\n                        item.style.height = controls.h + 'px';\r\n                    }\r\n                    // This will be the callback when finalize the resize\r\n                    controls.action = function () {\r\n                        self.width = parseInt(item.style.width);\r\n                        self.height = parseInt(item.style.height);\r\n                        controls.e.classList.remove('action');\r\n                        // Event\r\n                        Dispatch.call(self, self.onresize, 'resize', {\r\n                            instance: self,\r\n                            width: self.width,\r\n                            height: self.height,\r\n                        });\r\n                    }\r\n                    controls.e.classList.add('action');\r\n                } else if (isTrue(self.draggable) && y - rect.top < 40) {\r\n                    // Callback\r\n                    controls.action = function () {\r\n                        self.top = parseInt(item.style.top);\r\n                        self.left = parseInt(item.style.left);\r\n                        controls.e.classList.remove('action');\r\n                        // Open event\r\n                        Dispatch.call(self, self.onmove, 'move', {\r\n                            instance: self,\r\n                            top: self.top,\r\n                            left: self.left,\r\n                        });\r\n                    }\r\n                    controls.e.classList.add('action');\r\n                    // Remove transform\r\n                    removeMargin(self);\r\n                }\r\n            }\r\n        }\r\n\r\n        self.back = function () {\r\n            sendToBack(self.el);\r\n        }\r\n\r\n        self.front = function () {\r\n            sendToFront(self.el);\r\n        }\r\n\r\n        self.open = function () {\r\n            if (self.closed === true) {\r\n                self.closed = false;\r\n                // Close event\r\n                Dispatch.call(self, self.onopen, 'open', {\r\n                    instance: self\r\n                });\r\n            }\r\n        }\r\n\r\n        self.close = function (options) {\r\n            if (self.closed === false) {\r\n                self.closed = true;\r\n                // Close event\r\n                Dispatch.call(self, self.onclose, 'close', {\r\n                    instance: self,\r\n                    ...options\r\n                });\r\n            }\r\n        }\r\n\r\n        self.isClosed = function () {\r\n            return self.closed;\r\n        }\r\n\r\n        /**\r\n         * Recalculate the auto-adjust position when the modal dimensions change,\r\n         * since the margin compensation depends on the current size of the modal.\r\n         * NOTE: cannot be named refresh, since lemonade registers its own refresh on self\r\n         */\r\n        self.refreshPosition = function () {\r\n            if (self.closed === false) {\r\n                // Auto adjust\r\n                queueMicrotask(() => {\r\n                    adjustHorizontal(self);\r\n                    adjustVertical(self);\r\n                });\r\n            }\r\n        }\r\n\r\n        if (!template || typeof (template) !== 'string') {\r\n            template = '';\r\n        }\r\n\r\n        // Custom Root Configuration\r\n        self.settings = {\r\n            getRoot: function () {\r\n                return self.root;\r\n            }\r\n        }\r\n\r\n        // Native lemonade\r\n        onload(() => {\r\n            // Dimensions\r\n            if (self.width) {\r\n                self.el.style.width = self.width + 'px';\r\n            }\r\n            if (self.height) {\r\n                self.el.style.height = self.height + 'px';\r\n            }\r\n            // Position\r\n            if (self.top) {\r\n                self.el.style.top = self.top + 'px';\r\n            }\r\n            if (self.left) {\r\n                self.el.style.left = self.left + 'px';\r\n            }\r\n\r\n            if (self.position === 'absolute' || self.position === 'right' || self.position === 'bottom' || self.position === 'left') {\r\n\r\n            } else {\r\n                if (!self.width && self.el.offsetWidth) {\r\n                    self.width = self.el.offsetWidth;\r\n                }\r\n                if (!self.height && self.el.offsetHeight) {\r\n                    self.height = self.el.offsetHeight;\r\n                }\r\n\r\n                // Initial centralize\r\n                if (self.position === 'center' || !self.top) {\r\n                    self.top = (window.innerHeight - self.height) / 2;\r\n                }\r\n                if (self.position === 'center' || !self.left) {\r\n                    self.left = (window.innerWidth - self.width) / 2;\r\n                }\r\n\r\n                // Responsive\r\n                if (document.documentElement.clientWidth < 800) {\r\n                    // Full screen\r\n                    if (self.height > 300) {\r\n                        self.el.classList.add('fullscreen');\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Auto adjust\r\n            adjustHorizontal(self);\r\n            adjustVertical(self);\r\n\r\n            // Backdrop\r\n            if (self.backdrop === true) {\r\n                backdrop = document.createElement('div');\r\n                backdrop.classList.add('lm-modal-backdrop');\r\n                backdrop.addEventListener('click', () => {\r\n                    self.close({origin: 'backdrop'});\r\n                });\r\n\r\n                if (self.closed === false) {\r\n                    self.el.parentNode.insertBefore(backdrop, self.el);\r\n                }\r\n            }\r\n\r\n            // Import content from DOM\r\n            if (self.content) {\r\n                if (typeof (self.content) === 'string') {\r\n                    template = self.content;\r\n                } else if (typeof (self.content) === 'object' && self.content.tagName) {\r\n                    self.root.appendChild(self.content);\r\n                }\r\n            }\r\n\r\n            // Focus out of the component\r\n            self.el.addEventListener('focusout', function (e) {\r\n                if (!self.el.contains(e.relatedTarget)) {\r\n                    if (isTrue(self['auto-close'])) {\r\n                        self.close({origin: 'focusout'});\r\n                    }\r\n                    // Remove focus\r\n                    self.el.classList.remove('lm-modal-focus');\r\n                }\r\n            });\r\n\r\n            // Focus out of the component\r\n            self.el.addEventListener('focusin', function (e) {\r\n                self.el.classList.add('lm-modal-focus');\r\n            });\r\n\r\n            // Close and stop propagation\r\n            self.el.addEventListener('keydown', (e) => {\r\n                if (e.key === 'Escape') {\r\n                    if (self.closed === false) {\r\n                        self.close({origin: 'escape'});\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                } else if (e.key === 'Enter') {\r\n                    click(e);\r\n                }\r\n            });\r\n\r\n            // Append elements to the container\r\n            appendElements(self.el.children[1], elements);\r\n\r\n            if (self.url) {\r\n                fetch(self.url)\r\n                    .then(response => response.clone().body)\r\n                    .then(body => {\r\n                        let reader = body.getReader();\r\n                        reader.read().then(({done, value}) => {\r\n                            // Add HTML to the modal\r\n                            self.root.innerHTML = new TextDecoder().decode(value.buffer);\r\n                            // Call onload event\r\n                            Dispatch.call(self, load, 'load', {\r\n                                instance: self\r\n                            });\r\n                        });\r\n                    });\r\n            } else {\r\n                // Call onload event\r\n                Dispatch.call(self, load, 'load', {\r\n                    instance: self\r\n                });\r\n            }\r\n        });\r\n\r\n        onchange((property) => {\r\n            if (ignoreEvents) {\r\n                return false;\r\n            }\r\n\r\n            if (property === 'closed') {\r\n                if (self.closed === false) {\r\n                    // Focus on the modal\r\n                    if (self.focus !== false) {\r\n                        self.el.focus();\r\n                    }\r\n                    // Show backdrop\r\n                    if (backdrop) {\r\n                        self.el.parentNode.insertBefore(backdrop, self.el);\r\n                    }\r\n\r\n                    // Auto adjust\r\n                    queueMicrotask(() => {\r\n                        adjustHorizontal(self);\r\n                        adjustVertical(self);\r\n                    });\r\n                } else {\r\n                    // Hide backdrop\r\n                    if (backdrop) {\r\n                        backdrop.remove();\r\n                    }\r\n                }\r\n            } else if (property === 'top' || property === 'left' || property === 'width' || property === 'height') {\r\n                if (self[property] !== '') {\r\n                    self.el.style[property] = self[property] + 'px';\r\n                } else {\r\n                    self.el.style[property] = '';\r\n                }\r\n\r\n                if (self.closed === false) {\r\n                    queueMicrotask(() => {\r\n                        if (property === 'top') {\r\n                            adjustVertical(self);\r\n                        }\r\n                        if (property === 'left') {\r\n                            adjustHorizontal(self);\r\n                        }\r\n                    });\r\n                }\r\n            } else if (property === 'position') {\r\n                if (self.position) {\r\n                    if (self.position === 'center') {\r\n                        self.top = (window.innerHeight - self.el.offsetHeight) / 2;\r\n                        self.left = (window.innerWidth - self.el.offsetWidth) / 2;\r\n                    } else {\r\n                        self.top = '';\r\n                        self.left = '';\r\n                    }\r\n                } else {\r\n                    if (!self.top) {\r\n                        self.top = (window.innerHeight - self.el.offsetHeight) / 2;\r\n                    }\r\n                    if (!self.left) {\r\n                        self.left = (window.innerWidth - self.el.offsetWidth) / 2;\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n        track('top');\r\n        track('left');\r\n        track('width');\r\n        track('height');\r\n\r\n        return render => render`<div class=\"lm-modal\" animation=\"{{self.animation}}\" position=\"{{self.position}}\" closed=\"{{self.closed}}\" closable=\"{{self.closable}}\" minimizable=\"{{self.minimizable}}\" minimized=\"{{self.minimized}}\" overflow=\"{{self.overflow}}\" tabindex=\"-1\" role=\"modal\" onmousedown=\"${mousedown}\" onmousemove=\"${mousemove}\" onclick=\"${click}\">\r\n            <div class=\"lm-modal-title\" data-title=\"{{self.title}}\" data-icon=\"{{self.icon}}\"><div class=\"lm-modal-icon\">{{self.icon}}</div><div>{{self.title}}</div><div class=\"lm-modal-icon lm-modal-minimize\" tabindex=\"0\"></div><div class=\"lm-modal-icon lm-modal-close\" tabindex=\"0\"></div></div>\r\n            <div :ref=\"self.root\">${template}</div>\r\n        </div>`\r\n    }\r\n\r\n    const Component = function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            // Remove elements from the DOM\r\n            let elements = removeElements(root);\r\n            // Create the modal\r\n            let e = lemonade.render(Modal, root, options);\r\n            // Add elements to the container\r\n            appendElements(e.children[1], elements);\r\n\r\n            return options;\r\n        } else {\r\n            return Modal.call(this);\r\n        }\r\n    }\r\n\r\n    // Create LemonadeJS Component\r\n    lemonade.setComponents({Modal: Modal});\r\n    // Create Web Component\r\n    lemonade.createWebComponent('modal', Modal)\r\n\r\n    return Component;\r\n})));\n\n/***/ }),\n\n/***/ 867:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (!lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    const Rating = function(children, { onchange, onload }) {\r\n        let self = this;\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        if (! self.number) {\r\n            self.number = 5;\r\n        }\r\n\r\n        self.stars = [];\r\n\r\n        // Current self star\r\n        let current = null;\r\n\r\n        /**\r\n         * Update the number of stars\r\n         */\r\n        const len = function () {\r\n            // Remove stars\r\n            if (self.number < self.stars.length) {\r\n                self.stars.splice(self.number, self.stars.length);\r\n                if (self.value > self.number) {\r\n                    self.value = self.number;\r\n                }\r\n            }\r\n            // Add missing stars\r\n            for (let i = 0; i < self.number; i++) {\r\n                if (! self.stars[i]) {\r\n                    self.stars[i] = {\r\n                        icon: 'star',\r\n                    };\r\n                    if (self.tooltip[i]) {\r\n                        self.stars[i].title = self.tooltip[i];\r\n                    }\r\n                }\r\n            }\r\n            // Refresh\r\n            self.refresh('stars');\r\n        }\r\n\r\n        const val = function (index, events) {\r\n            if (typeof(index) === 'string') {\r\n                index = Number(index);\r\n            }\r\n            // Apply value to the selected property in each star\r\n            for (let i = 0; i < self.number; i++) {\r\n                self.stars[i].selected = i <= index - 1 ? 1 : 0;\r\n            }\r\n            // Keep current value\r\n            current = index;\r\n            // Dispatch method\r\n            if (events !== false) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: index,\r\n                });\r\n            }\r\n        }\r\n\r\n        const getElementPosition = function(child) {\r\n            if (child.tagName === 'I') {\r\n                let root = self.el;\r\n                for (let i = 0; i < root.children.length; i++) {\r\n                    let c = root.children[i];\r\n                    if (c === child) {\r\n                        return i;\r\n                    }\r\n                }\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        const click = function(e, s) {\r\n            let ret = getElementPosition(e.target);\r\n            if (ret !== -1) {\r\n                let index = ret + 1;\r\n                if (index === current) {\r\n                    index = 0;\r\n                }\r\n                self.value = index;\r\n            }\r\n        }\r\n\r\n        const mouseover = function(e, s) {\r\n            let index = getElementPosition(e.target);\r\n            if (index !== -1) {\r\n                for (let i = 0; i < self.number; i++) {\r\n                    if (i <= index) {\r\n                        self.stars[i].hover = 1;\r\n                    } else {\r\n                        self.stars[i].hover = 0;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const mouseout = function(e, s) {\r\n            for (let i = 0; i < self.number; i++) {\r\n                self.stars[i].hover = 0;\r\n            }\r\n        }\r\n\r\n        onchange((prop) => {\r\n            if (prop === 'number') {\r\n                len();\r\n            } else if (prop === 'value') {\r\n                val(self.value);\r\n            } else if (prop === 'tooltip') {\r\n                if (typeof(self.tooltip) === 'string') {\r\n                    self.tooltip = self.tooltip.split(',')\r\n                }\r\n                len();\r\n            }\r\n        })\r\n\r\n        onload(() => {\r\n            // Bind global method to be compatible with LemonadeJS forms\r\n            self.el.val = function (v) {\r\n                if (typeof (v) === 'undefined') {\r\n                    return self.value;\r\n                } else {\r\n                    self.value = v;\r\n                }\r\n            }\r\n\r\n            if (self.tooltip && typeof(self.tooltip) === 'string') {\r\n                self.tooltip = self.tooltip.split(',')\r\n            } else {\r\n                self.tooltip = '';\r\n            }\r\n            len();\r\n            // Ignore events\r\n            val(self.value, false);\r\n\r\n            self.el.addEventListener('click', click);\r\n            self.el.addEventListener('mouseout', mouseout);\r\n            self.el.addEventListener('mouseover', mouseover);\r\n        });\r\n\r\n        self.getValue = function () {\r\n            return Number(self.value);\r\n        }\r\n\r\n        self.setValue = function (index) {\r\n            self.value = index;\r\n        }\r\n\r\n        return `<div class=\"lm-rating\" value=\"{{self.value}}\" number=\"{{self.number}}\" name=\"{{self.name}}\" data-size=\"{{self.size}}\" :loop=\"self.stars\">\r\n            <i class=\"material-symbols-outlined material-icons\" data-selected=\"{{self.selected}}\" data-hover=\"{{self.hover}}\" title=\"{{self.title}}\">star</i>\r\n        </div>`;\r\n    }\r\n\r\n    // Register the LemonadeJS Component\r\n    lemonade.setComponents({ Rating: Rating });\r\n    // Register the web component\r\n    lemonade.createWebComponent('rating', Rating);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Rating, root, options)\r\n            return options;\r\n        } else {\r\n            return Rating.call(this, root)\r\n        }\r\n    }\r\n\r\n})));\n\n/***/ }),\n\n/***/ 539:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (!lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    const Switch = function (children, { onchange, onload }) {\r\n        let self = this;\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        const state = () => {\r\n            let s = self.el.firstChild.checked;\r\n            if (s !== self.checked) {\r\n                self.checked = s;\r\n            }\r\n        }\r\n\r\n        onchange((prop, a, b, c, d) => {\r\n            if (a !== b) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: self.value,\r\n                });\r\n            }\r\n\r\n            state();\r\n        })\r\n\r\n        onload(state);\r\n\r\n        return render => render`<label class=\"lm-switch\" position=\"{{self.position}}\" data-color=\"{{self.color}}\">\r\n            <input type=\"checkbox\" name=\"{{self.name}}\" disabled=\"{{self.disabled}}\" checked=\"{{self.checked}}\" :bind=\"self.value\" /> <span>{{self.text}}</span>\r\n        </label>`\r\n    }\r\n\r\n    // Create LemonadeJS references\r\n    lemonade.setComponents({ Switch: Switch });\r\n    // Create web-component\r\n    lemonade.createWebComponent('switch', Switch);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Switch, root, options)\r\n            return options;\r\n        } else {\r\n            return Switch.call(this, root);\r\n        }\r\n    }\r\n\r\n})));\n\n/***/ }),\n\n/***/ 560:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (! lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    const extract = function(root, self) {\r\n        if (! Array.isArray(self.data)) {\r\n            self.data = [];\r\n        }\r\n\r\n        if (root.tagName) {\r\n            for (let i = 0; i < root.children.length; i++) {\r\n                self.data.push({\r\n                    el: root.children[i],\r\n                })\r\n            }\r\n        } else {\r\n            root.forEach((child) => {\r\n                self.data.push({\r\n                    el: child.element,\r\n                })\r\n            });\r\n        }\r\n    }\r\n\r\n    const sorting = function(el, options) {\r\n        const obj = {};\r\n\r\n        let dragElement = null;\r\n\r\n        el.addEventListener('dragstart', function(e) {\r\n            let target = e.target;\r\n            if (target.nodeType === 3) {\r\n                if (target.parentNode.getAttribute('draggable') === 'true') {\r\n                    target = target.parentNode;\r\n                } else {\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (target.getAttribute('draggable') === 'true') {\r\n                let position = Array.prototype.indexOf.call(target.parentNode.children, target);\r\n                dragElement = {\r\n                    element: target,\r\n                    o: position,\r\n                    d: position\r\n                }\r\n                target.style.opacity = '0.25';\r\n                e.dataTransfer.setDragImage(target,0,0);\r\n            }\r\n        });\r\n\r\n        el.addEventListener('dragover', function(e) {\r\n            e.preventDefault();\r\n\r\n            if (dragElement && getElement(e.target) && e.target.getAttribute('draggable') == 'true' && dragElement.element != e.target) {\r\n                let element = e.target.clientWidth / 2 > e.offsetX ? e.target : e.target.nextSibling;\r\n                e.target.parentNode.insertBefore(dragElement.element, element);\r\n                dragElement.d = Array.prototype.indexOf.call(e.target.parentNode.children, dragElement.element);\r\n            }\r\n        });\r\n\r\n        el.addEventListener('dragleave', function(e) {\r\n            e.preventDefault();\r\n        });\r\n\r\n        el.addEventListener('dragend', function(e) {\r\n            e.preventDefault();\r\n\r\n            if (dragElement) {\r\n                let element = dragElement.o < dragElement.d ? e.target.parentNode.children[dragElement.o] : e.target.parentNode.children[dragElement.o].nextSibling\r\n                e.target.parentNode.insertBefore(dragElement.element, element);\r\n                dragElement.element.style.opacity = '';\r\n                dragElement = null;\r\n            }\r\n        });\r\n\r\n        el.addEventListener('drop', function(e) {\r\n            e.preventDefault();\r\n\r\n            if (dragElement) {\r\n                if (dragElement.o !== dragElement.d) {\r\n                    if (typeof(options.ondrop) == 'function') {\r\n                        options.ondrop(el, dragElement.o, dragElement.d, dragElement.element, e.target, e);\r\n                    }\r\n                }\r\n\r\n                dragElement.element.style.opacity = '';\r\n                dragElement = null;\r\n            }\r\n        });\r\n\r\n        const getElement = function(element) {\r\n            var sorting = false;\r\n\r\n            function path (element) {\r\n                if (element === el) {\r\n                    sorting = true;\r\n                }\r\n\r\n                if (! sorting) {\r\n                    path(element.parentNode);\r\n                }\r\n            }\r\n\r\n            path(element);\r\n\r\n            return sorting;\r\n        }\r\n\r\n        for (let i = 0; i < el.children.length; i++) {\r\n            if (! el.children[i].hasAttribute('draggable')) {\r\n                el.children[i].setAttribute('draggable', 'true');\r\n            }\r\n        }\r\n\r\n        return el;\r\n    }\r\n\r\n    const Tabs = function(children, { onchange, onload }) {\r\n        let self = this\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Add new tab\r\n        let createButton;\r\n\r\n        // Get the references from the root web component\r\n        let root;\r\n        let template = '';\r\n        if (this.tagName) {\r\n            root = this;\r\n        } else {\r\n            // References from LemonadeJS\r\n            if (typeof(children) === 'string') {\r\n                // Version 4\r\n                template = children;\r\n            } else if (children && children.length) {\r\n                // Version 5\r\n                root = children;\r\n            }\r\n        }\r\n\r\n        if (root) {\r\n            extract(root, self);\r\n        }\r\n\r\n        // Process the data\r\n        if (self.data) {\r\n            for (let i = 0; i < self.data.length; i++) {\r\n                if (! self.data[i].el) {\r\n                    // Create element\r\n                    self.data[i].el = document.createElement('div');\r\n                    // Create from content\r\n                    if (self.data[i].content) {\r\n                        self.data[i].el.innerHTML = self.data[i].content;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let props = ['title', 'selected', 'data-icon'];\r\n\r\n        const select = function(index) {\r\n            // Make sure the index is a number\r\n            index = parseInt(index);\r\n            // Do not select tabs that does not exist\r\n            if (index >= 0 && index < self.data.length) {\r\n                for (let i = 0; i < self.root.children.length; i++) {\r\n                    self.headers.children[i].classList.remove('selected');\r\n                    self.root.children[i].classList.remove('selected');\r\n                }\r\n                self.headers.children[index].classList.add('selected');\r\n                self.root.children[index].classList.add('selected');\r\n            }\r\n        }\r\n\r\n        const init = function(selected) {\r\n            let tabs = [];\r\n\r\n            for (let i = 0; i < self.data.length; i++) {\r\n                // Extract meta information from the DOM\r\n                if (props) {\r\n                    props.forEach((prop) => {\r\n                        let short = prop.replace('data-', '');\r\n                        if (! self.data[i][short]) {\r\n                            let ret = self.data[i].el.getAttribute(prop);\r\n                            if (ret != null) {\r\n                                self.data[i][short] = ret;\r\n                            }\r\n                        }\r\n                    });\r\n                }\r\n                // Create tabs object\r\n                tabs[i] = {\r\n                    title: self.data[i].title,\r\n                }\r\n                // Which one is selected by default\r\n                if (self.data[i].selected) {\r\n                    selected = i;\r\n                }\r\n                if (self.data[i].icon) {\r\n                    tabs[i].icon = self.data[i].icon;\r\n                }\r\n\r\n                self.root.appendChild(self.data[i].el);\r\n            }\r\n\r\n            // Create headers\r\n            self.tabs = tabs;\r\n\r\n            // Default selected\r\n            if (typeof(selected) !== 'undefined') {\r\n                self.selected = selected;\r\n            }\r\n\r\n            if (props) {\r\n                // Add create new tab button\r\n                if (createButton) {\r\n                    self.headers.appendChild(createButton);\r\n                }\r\n                // Add sorting\r\n                sorting(self.el.firstChild.firstChild, {\r\n                    ondrop: (el, fromIndex, toIndex) => {\r\n                        // Remove the item from its original position\r\n                        const [movedItem] = self.data.splice(fromIndex, 1);\r\n                        // Insert it into the new position\r\n                        self.data.splice(toIndex, 0, movedItem);\r\n                        // Make sure correct order\r\n                        for (let i = 0; i < self.data.length; i++) {\r\n                            self.root.appendChild(self.data[i].el);\r\n                        }\r\n                        // Select new position\r\n                        self.selected = toIndex;\r\n                        // Dispatch event\r\n                        Dispatch.call(self, self.onchangeposition, 'changeposition', {\r\n                            instance: self,\r\n                            fromIndex: fromIndex,\r\n                            toIndex: toIndex,\r\n                        });\r\n                    }\r\n                })\r\n            }\r\n\r\n            props = null;\r\n        }\r\n\r\n        const create = function() {\r\n            // Create a new item\r\n            self.create({ title: 'Untitled' }, null, true);\r\n        }\r\n\r\n        const open = function(e) {\r\n            if (e.target.tagName === 'LI') {\r\n                // Avoid select something already selected\r\n                let index = Array.prototype.indexOf.call(e.target.parentNode.children, e.target);\r\n                if (index !== self.selected) {\r\n                    self.selected = index;\r\n                }\r\n            }\r\n        }\r\n\r\n        const keydown = function(e, s) {\r\n            let index = null;\r\n            if (e.key === 'Enter') {\r\n                self.click(e, s);\r\n            } else if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\r\n                index = self.selected - 1;\r\n                if (index < 0) {\r\n                    index = 0;\r\n                }\r\n            } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\r\n                index = self.selected + 1;\r\n                if (index > self.tabs.length-1) {\r\n                    index = self.tabs.length-1;\r\n                }\r\n            }\r\n\r\n            // Make selection\r\n            if (index !== null) {\r\n                self.tabs[index].el.focus();\r\n            }\r\n        }\r\n\r\n        onload(() => {\r\n            if (template) {\r\n                extract(self.root, self);\r\n            }\r\n\r\n            init(self.selected || 0);\r\n        })\r\n\r\n        onchange((property) => {\r\n            if (property === 'selected') {\r\n                select(self.selected);\r\n\r\n                Dispatch.call(self, self.onopen, 'open', {\r\n                    instance: self,\r\n                    selected: self.selected,\r\n                });\r\n\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: self.selected,\r\n                });\r\n            }\r\n        })\r\n\r\n        self.open = function (index) {\r\n            self.selected = index;\r\n        }\r\n\r\n        self.create = function(item, position, select) {\r\n            // Create element\r\n            if (typeof(item) !== 'object') {\r\n                console.error('Item must be an object');\r\n            } else {\r\n\r\n                let ret = Dispatch.call(self, self.onbeforecreate, 'beforecreate', {\r\n                    instance: self,\r\n                    item: item,\r\n                    position: position,\r\n                });\r\n\r\n                if (ret === false) {\r\n                    return false;\r\n                }\r\n\r\n                // Create DOM\r\n                item.el = document.createElement('div');\r\n                // Create from content\r\n                if (item.content) {\r\n                    item.el.innerHTML = item.content;\r\n                }\r\n\r\n                // Add the new item in the end\r\n                if (typeof(position) === 'undefined' || position === null) {\r\n                    // Mew item\r\n                    position = self.data.length;\r\n                    // Add in the end\r\n                    self.data.push(item);\r\n                } else {\r\n                    self.data.splice(position, 0, item);\r\n                }\r\n                // New position\r\n                if (select) {\r\n                    // Refresh\r\n                    init(self.data.indexOf(item));\r\n                } else {\r\n                    init(self.selected);\r\n                }\r\n\r\n                self.tabs.forEach(item => {\r\n                    item.el.setAttribute('draggable', 'true');\r\n                })\r\n\r\n                Dispatch.call(self, self.oncreate, 'create', {\r\n                    instance: self,\r\n                    item: item,\r\n                    position: position,\r\n                });\r\n            }\r\n        }\r\n\r\n        self.allowCreate = !! self.allowCreate;\r\n\r\n        return render => render`<div class=\"lm-tabs\" data-position=\"{{self.position}}\" data-round=\"{{self.round}}\">\r\n            <div role=\"tabs\" class=\"lm-tabs-headers\">\r\n                <ul :ref=\"self.headers\" :loop=\"self.tabs\" :selected=\"self.selected\" onclick=\"${open}\" onkeydown=\"${keydown}\" onfocusin=\"${open}\"><li class=\"lm-tab\" tabindex=\"0\" role=\"tab\" data-icon=\"{{self.icon}}\">{{self.title}}</li></ul>\r\n                <div data-visible=\"{{self.allowCreate}}\" class=\"lm-tabs-insert-button\" role=\"insert-tab\" onclick=\"${create}\">add</div>\r\n            </div>\r\n            <div :ref=\"self.root\" class=\"lm-tabs-content\">${template}</div>\r\n        </div>`\r\n    }\r\n\r\n    lemonade.setComponents({ Tabs: Tabs });\r\n\r\n    lemonade.createWebComponent('tabs', Tabs);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            if (typeof(options) !== 'object') {\r\n                options = {};\r\n            }\r\n            // Extract DOM references\r\n            extract(root, options);\r\n            // Create the modal\r\n            lemonade.render(Tabs, root, options);\r\n            // Return self\r\n            return options;\r\n        } else {\r\n            return Tabs.call(this);\r\n        }\r\n    };\r\n})));\n\n/***/ }),\n\n/***/ 330:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nif (!lemonade && \"function\" === 'function') {\r\n    var lemonade = __webpack_require__(966);\r\n}\r\n\r\nif (! Contextmenu && \"function\" === 'function') {\r\n    var Contextmenu = __webpack_require__(238);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    const Topmenu = function(children, { onload, onchange }) {\r\n        let self = this;\r\n\r\n        // Current selection\r\n        let currentIndex = null;\r\n\r\n        const getElementPosition = function(child) {\r\n            let root = self.el.children[0];\r\n            for (let i = 0; i < root.children.length; i++) {\r\n                let c = root.children[i];\r\n                if (c === child) {\r\n                    return i;\r\n                }\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        const select = function(e, s) {\r\n            if (! self.menu.isClosed()) {\r\n                let index = self.options.indexOf(s);\r\n                if (index !== currentIndex) {\r\n                    open(index);\r\n                }\r\n            }\r\n        }\r\n\r\n        const deselect = function() {\r\n            if (self.options) {\r\n                self.options.forEach(v => v.selected = false);\r\n            }\r\n        }\r\n\r\n        const selectIndex = function(newIndex) {\r\n            if (self.options) {\r\n                let s = self.options[newIndex];\r\n                if (s && ! s.disabled) {\r\n                    deselect();\r\n                    // Make it selected\r\n                    s.selected = true;\r\n                    // New index\r\n                    currentIndex = newIndex;\r\n                    // Focus\r\n                    s.el.focus();\r\n                }\r\n            }\r\n        }\r\n\r\n        const open = function(index) {\r\n            // Update cursor position\r\n            selectIndex(index);\r\n            let s = self.options[currentIndex];\r\n            if (s && s.submenu) {\r\n                let x = s.el.offsetLeft;\r\n                let y = s.el.offsetTop + s.el.offsetHeight + 2;\r\n                self.menu.open(s.submenu, x, y);\r\n                s.expanded = true;\r\n            }\r\n        }\r\n\r\n        const close = function() {\r\n            self.menu.close(0);\r\n            let s = self.options[currentIndex];\r\n            if (s) {\r\n                s.el.focus();\r\n                s.expanded = false;\r\n            }\r\n        }\r\n\r\n        const toggle = function(e, s) {\r\n            if (s.submenu && ! s.disabled) {\r\n                let index = self.options.indexOf(s);\r\n                if (index === currentIndex && ! self.menu.isClosed()) {\r\n                    close();\r\n                } else {\r\n                    open(index);\r\n                }\r\n                cancel(e);\r\n            }\r\n        }\r\n\r\n        const findNextEnabledIndex = function(startIndex) {\r\n            if (!self.options || self.options.length === 0) {\r\n                return null;\r\n            }\r\n            \r\n            let index = startIndex;\r\n            let attempts = 0;\r\n            const maxAttempts = self.options.length;\r\n            \r\n            while (attempts < maxAttempts) {\r\n                if (index >= self.options.length) {\r\n                    index = 0;\r\n                }\r\n                if (!self.options[index].disabled) {\r\n                    return index;\r\n                }\r\n                index++;\r\n                attempts++;\r\n            }\r\n            return null;\r\n        };\r\n\r\n        const findPreviousEnabledIndex = function(startIndex) {\r\n            if (!self.options || self.options.length === 0) {\r\n                return null;\r\n            }\r\n            \r\n            let index = startIndex;\r\n            let attempts = 0;\r\n            const maxAttempts = self.options.length;\r\n            \r\n            while (attempts < maxAttempts) {\r\n                if (index < 0) {\r\n                    index = self.options.length - 1;\r\n                }\r\n                if (!self.options[index].disabled) {\r\n                    return index;\r\n                }\r\n                index--;\r\n                attempts++;\r\n            }\r\n            return null;\r\n        };\r\n\r\n        const adjustOptionProperties = function() {\r\n            if (self.options) {\r\n                self.options.forEach(v => {\r\n                    v.haspopup = !!v.submenu;\r\n                    v.expanded = false;\r\n\r\n                    if (v.disabled) {\r\n                        v.el.removeAttribute('tabindex');\r\n                    } else {\r\n                        v.el.setAttribute('tabindex', '0');\r\n                    }\r\n                })\r\n            }\r\n        };\r\n\r\n        /**\r\n         * Open a submenu programaticaly. Default 0\r\n         * @param {number} index\r\n         */\r\n        self.open = function(index) {\r\n            if (typeof index === 'undefined') {\r\n                index = currentIndex;\r\n            }\r\n            if (! index) {\r\n                index = 0;\r\n            }\r\n\r\n            let s = self.options[index];\r\n            if (s) {\r\n                open(index);\r\n            }\r\n        }\r\n\r\n        onchange((prop) => {\r\n            if (prop === 'options') {\r\n                adjustOptionProperties();\r\n            }\r\n        });\r\n\r\n        // Keyboard event\r\n        onload(() => {\r\n            self.el.addEventListener(\"focusin\", function(e) {\r\n                let index = getElementPosition(e.target);\r\n                if (index !== -1) {\r\n                    if (e.relatedTarget === self.menu.el) {\r\n                        close();\r\n                    } else {\r\n                        selectIndex(index);\r\n                    }\r\n                }\r\n            });\r\n\r\n            self.el.addEventListener(\"focusout\", function(e) {\r\n                if (! (e.relatedTarget && self.el.contains(e.relatedTarget))) {\r\n                    if (self.options[currentIndex]) {\r\n                        self.options[currentIndex].selected = false;\r\n                    }\r\n                }\r\n            });\r\n\r\n            self.el.addEventListener(\"keydown\", function(e) {\r\n                let o = self.options;\r\n                // Select top menu\r\n                let select = null;\r\n\r\n                if (e.key === 'Enter') {\r\n                    toggle(e, o[currentIndex])\r\n                } else if (e.key === 'ArrowLeft') {\r\n                    select = findPreviousEnabledIndex(currentIndex - 1);\r\n                } else if (e.key === 'ArrowRight') {\r\n                    select = findNextEnabledIndex(currentIndex + 1);\r\n                }\r\n\r\n                if (select !== null) {\r\n                    if (self.menu.isClosed()) {\r\n                        selectIndex(select);\r\n                    } else {\r\n                        open(select);\r\n                    }\r\n                }\r\n            });\r\n\r\n            adjustOptionProperties();\r\n        });\r\n\r\n        const cancel = function(e) {\r\n            e.preventDefault();\r\n            e.stopImmediatePropagation();\r\n        }\r\n\r\n        return render => render`<div class=\"lm-topmenu\" role=\"menubar\" aria-orientation=\"horizontal\" oncontextmenu=\"${cancel}\">\r\n            <div class=\"lm-topmenu-options\" :loop=\"self.options\">\r\n                <div class=\"lm-topmenu-title\" role=\"menuitem\" data-disabled=\"{{self.disabled}}\" data-selected=\"{{self.selected}}\" tabindex=\"0\" aria-haspopup=\"{{self.haspopup}}\" aria-expanded=\"{{self.expanded}}\" aria-label=\"{{self.title}}\" onmousedown=\"${toggle}\" onmouseenter=\"${select}\">{{self.title}}</div>\r\n            </div>\r\n            <Contextmenu :ref=\"self.menu\" :root=\"self.el\" />\r\n        </div>`\r\n    }\r\n\r\n    lemonade.setComponents({ Topmenu: Topmenu });\r\n\r\n    // Register the web component\r\n    lemonade.createWebComponent('topmenu', Topmenu);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Topmenu, root, options)\r\n            return options;\r\n        } else {\r\n            return Topmenu.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 966:\n/***/ (function(module) {\n\n/**\r\n * LemonadeJS v5\r\n *\r\n * Website: https://lemonadejs.com\r\n * Description: Create amazing web based reusable components.\r\n *\r\n * This software is distributed under MIT License\r\n * @Roadmap\r\n * Accept interpolated values on properties `<div test=\"test: ${state}\"></div>\r\n */\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    'use strict';\r\n\r\n    /**\r\n     * Global control element\r\n     */\r\n    let R = {\r\n        queue: [],\r\n        container: {},\r\n        tracking: new Map,\r\n        components: {},\r\n        version: 5,\r\n    };\r\n\r\n    // Global LemonadeJS controllers\r\n    if (typeof(document) !== \"undefined\") {\r\n        if (! document.lemonadejs) {\r\n            document.lemonadejs = R;\r\n        } else {\r\n            R = document.lemonadejs;\r\n        }\r\n    }\r\n\r\n    // Get any conflict of versions\r\n    if (! R.version) {\r\n        console.error('This project seems to be using version 4 and version 5 causing a conflict of versions.');\r\n    }\r\n\r\n    // Script expression inside LemonadeJS templates\r\n    let isScript = /{{(.*?)}}/g;\r\n\r\n    /**\r\n     * Apply value in a object based on the address\r\n     */\r\n    const Path = function(str, val, remove) {\r\n        str = str.split('.');\r\n        if (str.length) {\r\n            let o = this;\r\n            let p = null;\r\n            while (str.length > 1) {\r\n                // Get the property\r\n                p = str.shift();\r\n                // Check if the property exists\r\n                if (o.hasOwnProperty(p)) {\r\n                    o = o[p];\r\n                } else {\r\n                    // Property does not exist\r\n                    if (typeof(val) === 'undefined') {\r\n                        return undefined;\r\n                    } else {\r\n                        // Create the property\r\n                        o[p] = {};\r\n                        // Next property\r\n                        o = o[p];\r\n                    }\r\n                }\r\n            }\r\n            // Get the property\r\n            p = str.shift();\r\n            // Set or get the value\r\n            if (typeof(val) !== 'undefined') {\r\n                if (remove === true) {\r\n                    delete o[p];\r\n                } else {\r\n                    o[p] = val;\r\n                }\r\n                // Success\r\n                return true;\r\n            } else {\r\n                // Return the value\r\n                if (o) {\r\n                    return o[p];\r\n                }\r\n            }\r\n        }\r\n        // Something went wrong\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Show a better error developers\r\n     */\r\n    const createError = function() {\r\n        throw new Error('LemonadeJS ' + Array.from(arguments).join(' '));\r\n    }\r\n\r\n    /**\r\n     * Reference token is a string that define a token and not an expression\r\n     * @param {string} token\r\n     * @param {boolean?} topLevelOnly\r\n     * @returns {boolean}\r\n     */\r\n    function isReferenceToken(token, topLevelOnly) {\r\n        if (topLevelOnly) {\r\n            return /^(this|self)(\\.\\w+)$/gm.test(token);\r\n        } else {\r\n            return /^(this|self)(\\.\\w+|\\[\\d+])*$/gm.test(token);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Extract all valid tokens from a string\r\n     * @param {string} content\r\n     * @returns {string[]}\r\n     */\r\n    function extractTokens(content) {\r\n        // Input validation\r\n        if (typeof content !== 'string') {\r\n            throw new TypeError('Content must be a string');\r\n        }\r\n        // Single regex pattern to match both 'self.' and 'this.' prefixed identifiers Negative lookahead (?!\\.\\w) prevents matching nested properties\r\n        //const pattern =  /(?:self|this)\\.\\w+\\b(?!\\.\\w)/g;\r\n        const pattern = /(?<=(?:this|self)\\.)[a-zA-Z_]\\w*/gm\r\n\r\n        // If no matches found, return empty array early\r\n        const matches = content.match(pattern);\r\n        if (!matches) {\r\n            return [];\r\n        }\r\n        // Create Set directly from matches array with map transform This is more efficient than adding items one by one\r\n        return [...new Set(matches.map(match => match.slice(match.indexOf('.') + 1)))];\r\n    }\r\n\r\n    /**\r\n     * Bind a property to one action and start tracking\r\n     * @param {object} lemon\r\n     * @param {string} prop\r\n     */\r\n    const trackProperty = function(lemon, prop) {\r\n        // Lemon handler\r\n        let s = lemon.self;\r\n        if (typeof(s) === 'object') {\r\n            // Change\r\n            let change = lemon.change;\r\n            // Events\r\n            let events = lemon.events[prop];\r\n            // Current value\r\n            let value = s[prop];\r\n            // Do not allow undefined\r\n            if (typeof(value) === 'undefined') {\r\n                value = '';\r\n            }\r\n            // Create the observer\r\n            Object.defineProperty(s, prop, {\r\n                set: function(v) {\r\n                    // Old value\r\n                    let oldValue = value;\r\n                    // New value\r\n                    value = v;\r\n                    // Dispatch reactions\r\n                    if (events) {\r\n                        events.forEach((action) => {\r\n                            action();\r\n                        });\r\n                    }\r\n                    // Refresh bound elements\r\n                    if (change && change.length) {\r\n                        change.forEach((action) => {\r\n                            if (typeof (action) === 'function') {\r\n                                action.call(s, prop, oldValue, v);\r\n                            }\r\n                        })\r\n                    }\r\n                },\r\n                get: function () {\r\n                    // Get value\r\n                    return value;\r\n                },\r\n                configurable: true,\r\n                enumerable: true,\r\n            });\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if an element is appended to the DOM or a shadowRoot\r\n     * @param {HTMLElement} node\r\n     * @return {boolean}\r\n     */\r\n    const isAppended = function(node) {\r\n        while (node) {\r\n            if (node === document.body) {\r\n                return true; // Node is in main document\r\n            }\r\n\r\n            if (node.parentNode === null) {\r\n                if (node.host) {\r\n                    node = node.host; // Traverse up through ShadowRoot\r\n                } else {\r\n                    return false; // Detached node\r\n                }\r\n            } else {\r\n                node = node.parentNode; // Traverse up through parentNode\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n    const elementNotReady = new Set;\r\n\r\n    /**\r\n     * Execute all pending events from onload\r\n     * @param lemon\r\n     */\r\n    const executeOnload = function(lemon) {\r\n        let s = lemon.self;\r\n        // Ready event\r\n        while (lemon.ready.length) {\r\n            lemon.ready.shift()();\r\n        }\r\n        // Native onload\r\n        if (typeof(s.onload) === 'function') {\r\n            s.onload.call(s, s.el);\r\n        }\r\n        // Current self\r\n        if (typeof(lemon.load) === 'function') {\r\n            lemon.load.call(s, s.el);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Process the onload methods\r\n     */\r\n    const processOnload = function(lemon) {\r\n        let root = lemon.tree.element;\r\n        if (root.tagName === 'ROOT' && lemon.elements) {\r\n            root = lemon.elements[0];\r\n        }\r\n        // Add to the queue\r\n        elementNotReady.add(lemon);\r\n        // Check if the element is appended to the DOM\r\n        if (isAppended(root)) {\r\n            elementNotReady.forEach((item) => {\r\n                // Remove from the list\r\n                elementNotReady.delete(item);\r\n                // Run onload and ready events\r\n                executeOnload(item);\r\n            })\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Return the element based on the type\r\n     * @param item\r\n     * @returns {*}\r\n     */\r\n    const getElement = function(item) {\r\n        return typeof(item.type) === 'function' ? item.self : item.element;\r\n    }\r\n\r\n    const HTMLParser = function(html, values) {\r\n        /**\r\n         * process the scape chars\r\n         * @param char\r\n         * @returns {*|string}\r\n         */\r\n        function escape(char) {\r\n            const escapeMap = {\r\n                'n': String.fromCharCode(0x0A),\r\n                'r': String.fromCharCode(0x0D),\r\n                't': String.fromCharCode(0x09),\r\n                'b': String.fromCharCode(0x08),\r\n                'f': String.fromCharCode(0x0C),\r\n                'v': String.fromCharCode(0x0B),\r\n                '0': String.fromCharCode(0x00)\r\n            };\r\n\r\n            return escapeMap[char] || char;\r\n        }\r\n\r\n        /**\r\n         * Check if is a self-closing tag\r\n         * @param {string|function} type - Tag name or component function\r\n         * @returns {boolean}\r\n         */\r\n        function isSelfClosing(type) {\r\n            if (! type) {\r\n                return false;\r\n            } else {\r\n                // List of self-closing or void HTML elements\r\n                const selfClosingTags = [\r\n                    'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source', 'track', 'wbr'\r\n                ];\r\n                // Convert tagName to lowercase to ensure case-insensitive comparison\r\n                return typeof(type) === 'function' || selfClosingTags.includes(type.toLowerCase());\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Create a text node and add it to current node's children\r\n         * @param {Object} tag - Text node properties\r\n         */\r\n        const createTextNode = function(tag) {\r\n            if (! this.current.children) {\r\n                this.current.children = [];\r\n            }\r\n\r\n            this.current.children.push({\r\n                type: '#text',\r\n                parent: this.current,\r\n                props: [tag],\r\n            });\r\n        }\r\n\r\n        /**\r\n         * Find the parent node by tag name\r\n         * @param {Object} node - Current node\r\n         * @param {string} type - Tag name to find\r\n         * @returns {Object|undefined}\r\n         */\r\n        const findParentByTagName = function(node, type) {\r\n            if (node && type) {\r\n                if (node.type === type) {\r\n                    return node;\r\n                } else {\r\n                    return findParentByTagName(node.parent, type);\r\n                }\r\n            }\r\n\r\n            return undefined;\r\n        }\r\n\r\n        /**\r\n         * Get expression value and update tag metadata\r\n         * @param {Object} tag - Tag to update\r\n         * @returns {*} Expression value\r\n         */\r\n        const getExpression = function(tag) {\r\n            // Get value\r\n            const v = values && values[this.index] !== undefined ? values[this.index] : '';\r\n            if (tag) {\r\n                // Keep the reference\r\n                tag.expression = this.reference;\r\n                // Keep the index\r\n                tag.index = this.index;\r\n            }\r\n            // Move the value index\r\n            this.index++;\r\n            // Delete reference\r\n            delete this.reference;\r\n            // Return value\r\n            return v;\r\n        }\r\n\r\n        /**\r\n         * Handle the text node creation\r\n         */\r\n        const commitText = function() {\r\n            if (typeof(this.text) !== 'undefined') {\r\n                const text = this.text.replace(/\\r?\\n\\s+/g, '');\r\n                if (text) {\r\n                    createTextNode.call(this, { name: 'textContent', value: text });\r\n                }\r\n                delete this.text;\r\n            }\r\n        }\r\n\r\n        const commitComments = function() {\r\n            if (typeof(this.comments) !== 'undefined') {\r\n                let comments = this.comments;\r\n                if (comments) {\r\n                    comments = comments\r\n                        .replace('<!--', '')\r\n                        .replace('-->', '')\r\n\r\n                    if (! this.current.children) {\r\n                        this.current.children = [];\r\n                    }\r\n\r\n                    this.current.children.push({\r\n                        type: '#comments',\r\n                        parent: this.current,\r\n                        props: [{ name: 'text', value: comments }],\r\n                    });\r\n                }\r\n                delete this.comments;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Save the attribute to the tag\r\n         */\r\n        const commitAttribute = function() {\r\n            if (this.tag.attributeName) {\r\n                // Commit any current attribute\r\n                if (! this.tag.props) {\r\n                    this.tag.props = [];\r\n                }\r\n\r\n                let k = this.tag.attributeName;\r\n                let v = this.tag.attributeValue;\r\n\r\n                if (typeof(v) === 'undefined') {\r\n                    v = k;\r\n                }\r\n\r\n                let tag = {\r\n                    name: k,\r\n                    value: v,\r\n                };\r\n\r\n                if (typeof(this.tag.expression) !== 'undefined') {\r\n                    tag.index = this.tag.index;\r\n                    tag.expression = this.tag.expression;\r\n                }\r\n\r\n                this.tag.props.push(tag);\r\n\r\n                // Clean up temporary properties\r\n                delete this.tag.attributeName;\r\n                delete this.tag.attributeValue;\r\n                delete this.tag.index;\r\n                delete this.tag.expression;\r\n\r\n                if (this.tag.attributeIsReadyToClose) {\r\n                    delete this.tag.attributeIsReadyToClose;\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Actions controller\r\n         * @param {Object} control - Parser control object\r\n         * @param {string} char - Current character\r\n         */\r\n        const actions = function(control, char) {\r\n            const method = control.action || 'text';\r\n            if (typeof actions[method] === 'function') {\r\n                actions[method].call(control, char);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Extract content between expression markers, handling quoted content\r\n         * @param {string} html - Full HTML string\r\n         * @param {number} startIndex - Starting index (position after ${})\r\n         * @returns {Object} Expression content and ending position\r\n         */\r\n        function extractExpressionContent(html, startIndex) {\r\n            let text = '';\r\n            let i = startIndex;\r\n            let insideQuotes = null;\r\n\r\n            while (i < html.length) {\r\n                const char = html[i];\r\n\r\n                // Handle quotes\r\n                if ((char === '\"' || char === \"'\" || char === '`')) {\r\n                    if (!insideQuotes) {\r\n                        insideQuotes = char;\r\n                    } else if (char === insideQuotes) {\r\n                        insideQuotes = null;\r\n                    }\r\n                }\r\n\r\n                // Found closing brace outside quotes\r\n                if (char === '}' && !insideQuotes) {\r\n                    return {\r\n                        content: text,\r\n                        position: i\r\n                    };\r\n                }\r\n\r\n                text += char;\r\n                i++;\r\n            }\r\n\r\n            return {\r\n                content: text,\r\n                position: i\r\n            };\r\n        }\r\n\r\n        /**\r\n         * Process a new tag\r\n         * @param char\r\n         */\r\n        actions.processTag = function(char) {\r\n            // Just to check if there are any text to commit\r\n            commitText.call(this);\r\n\r\n            // Process the tag\r\n            if (char === '<') {\r\n                // Create new tag\r\n                this.tag = {\r\n                    type: '',\r\n                    parent: this.current\r\n                };\r\n            } else if (char.match(/[a-zA-Z0-9-]/)) {\r\n                // Tag name\r\n                this.tag.type += char;\r\n            } else {\r\n                if (char === '$' && this.reference) {\r\n                    // Custom tags\r\n                    this.tag.type = getExpression.call(this);\r\n                }\r\n                // Finished with tag name, move to attribute handling\r\n                this.action = 'attributeName';\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Handle tag closing\r\n         * @param char\r\n         */\r\n        actions.closeTag = function(char) {\r\n            // Make sure to commit attribute\r\n            commitAttribute.call(this);\r\n            // Close the tag\r\n            if (char === '>') {\r\n                // Get the new parent\r\n                if (isSelfClosing(this.tag.type)) {\r\n                    // Push new tag to the parent\r\n                    if (! this.tag.parent.children) {\r\n                        this.tag.parent.children = [];\r\n                    }\r\n                    this.tag.parent.children.push(this.tag);\r\n                } else if (this.tag.closingTag) {\r\n                    // Need to find the parent on the chain\r\n                    const parentNode = findParentByTagName(this.tag.parent, this.tag.type);\r\n                    if (parentNode) {\r\n                        this.current = parentNode.parent;\r\n                    }\r\n                } else {\r\n                    if (this.tag.closing) {\r\n                        // Current is the parent\r\n                        this.current = this.tag.parent;\r\n                    } else {\r\n                        this.current = this.tag;\r\n                    }\r\n\r\n                    // Push new tag to the parent\r\n                    if (! this.tag.parent.children) {\r\n                        this.tag.parent.children = [];\r\n                    }\r\n                    this.tag.parent.children.push(this.tag);\r\n                }\r\n\r\n                // Remote temporary properties\r\n                delete this.tag.insideQuote;\r\n                delete this.tag.closingTag;\r\n                delete this.tag.closing;\r\n                // Finalize tag\r\n                this.tag = null;\r\n                // New action\r\n                this.action = 'text';\r\n            } else if (! this.tag.locked) {\r\n                if (char === '/') {\r\n                    if (! this.tag.type) {\r\n                        // This is a closing tag\r\n                        this.tag.closingTag = true;\r\n                    }\r\n                    // Closing character is found\r\n                    this.tag.closing = true;\r\n                } else if (char.match(/[a-zA-Z0-9-]/)) {\r\n                    // If is a closing tag, get the tag name\r\n                    if (this.tag.closingTag) {\r\n                        this.tag.type += char;\r\n                    }\r\n                } else {\r\n                    // Wait to the closing sign\r\n                    if (this.tag.type) {\r\n                        this.locked = true;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        actions.attributeName = function(char) {\r\n            // There is another attribute to commit\r\n            if (this.tag.attributeIsReadyToClose) {\r\n                commitAttribute.call(this);\r\n            }\r\n\r\n            // Build attribute name\r\n            if (char.match(/[a-zA-Z0-9-:]/)) {\r\n                if (! this.tag.attributeName) {\r\n                    this.tag.attributeName = '';\r\n                }\r\n                this.tag.attributeName += char;\r\n            } else if (char === '=') {\r\n                // Move to attribute value\r\n                if (this.tag.attributeName) {\r\n                    this.action = 'attributeValue';\r\n                    delete this.tag.attributeIsReadyToClose;\r\n                }\r\n            } else if (char.match(/\\s/)) {\r\n                if (this.tag.attributeName) {\r\n                    this.tag.attributeIsReadyToClose = true;\r\n                }\r\n            }\r\n        };\r\n\r\n        actions.attributeValue = function(char) {\r\n            if (! this.tag.attributeValue) {\r\n                this.tag.attributeValue = '';\r\n            }\r\n\r\n            if (char === '\"' || char === \"'\") {\r\n                if (this.tag.insideQuote) {\r\n                    if (this.tag.insideQuote === char) {\r\n                        this.tag.insideQuote = false;\r\n                    } else {\r\n                        this.tag.attributeValue += char;\r\n                    }\r\n                } else {\r\n                    this.tag.insideQuote = char;\r\n                }\r\n            } else {\r\n                if (char === '$' && this.reference) {\r\n                    // Custom tags\r\n                    char = getExpression.call(this, this.tag);\r\n                }\r\n                // Inside quotes, keep appending to the attribute value\r\n                if (this.tag.insideQuote) {\r\n                    if (this.tag.attributeValue) {\r\n                        this.tag.attributeValue += char;\r\n                    } else {\r\n                        this.tag.attributeValue = char;\r\n                    }\r\n                } else if (typeof(char) === 'string' && char.match(/\\s/)) {\r\n                    if (this.tag.attributeValue) {\r\n                        this.action = 'attributeName';\r\n                    }\r\n                    this.tag.attributeIsReadyToClose = true;\r\n                } else {\r\n                    if (this.tag.attributeIsReadyToClose) {\r\n                        this.action = 'attributeName';\r\n                        actions.attributeName.call(this, char);\r\n                    } else {\r\n                        if (this.tag.attributeValue) {\r\n                            this.tag.attributeValue += char;\r\n                        } else {\r\n                            this.tag.attributeValue = char;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        actions.text = function(char) {\r\n            if (char === '$' && this.reference) {\r\n                // Just to check if there are any text to commit\r\n                commitText.call(this);\r\n                // Custom tags\r\n                let tag = { name: 'textContent' }\r\n                tag.value = getExpression.call(this, tag);\r\n                // Add node tag\r\n                createTextNode.call(this, tag);\r\n            } else {\r\n                if (referenceControl === 1) {\r\n                    // Just to check if there are any text to commit\r\n                    commitText.call(this);\r\n                }\r\n\r\n                // Normal text processing\r\n                if (! this.text) {\r\n                    this.text = '';\r\n                }\r\n                this.text += char; // Keep appending to text content\r\n\r\n                if (referenceControl === 2) {\r\n                    // Just to check if there are any text to commit\r\n                    commitText.call(this);\r\n                }\r\n            }\r\n        }\r\n\r\n        actions.comments = function(char) {\r\n            if (! this.comments) {\r\n                this.comments = '';\r\n            }\r\n            this.comments += char;\r\n\r\n            if (this.comments.endsWith('-->')) {\r\n                commitComments.call(this);\r\n                this.action = 'text';\r\n            }\r\n        }\r\n\r\n        // Control the LemonadeJS native references\r\n        let referenceControl = null;\r\n\r\n        const result = { type: 'template' };\r\n        const control = {\r\n            current: result,\r\n            action: 'text',\r\n            index: 0,\r\n        };\r\n\r\n        // Input validation\r\n        if (typeof html !== 'string') {\r\n            throw new TypeError('HTML input must be a string');\r\n        }\r\n\r\n        // Main loop to process the HTML string\r\n        for (let i = 0; i < html.length; i++) {\r\n            // Current char\r\n            let char = html[i];\r\n\r\n            if (control.action === 'text' && char === '<' && html[i+1] === '!' && html[i+2] === '-' && html[i+3] === '-') {\r\n                control.action = 'comments';\r\n            }\r\n\r\n            if (control.action !== 'comments') {\r\n                let escaped = false;\r\n\r\n                if (values !== null) {\r\n                    // Handle scape\r\n                    if (char === '\\\\') {\r\n                        // This is a escaped char\r\n                        escaped = true;\r\n                        // Parse escape char\r\n                        char = escape(html[i+1]);\r\n                        // Move to the next char\r\n                        i++;\r\n                    }\r\n                }\r\n\r\n                // Global control logic\r\n                if (control.tag) {\r\n                    if (char === '>' || char === '/') {\r\n                        // End of tag, commit any attributes and go back to text parsing\r\n                        if (!control.tag.insideQuote) {\r\n                            control.action = 'closeTag';\r\n                        }\r\n                    }\r\n                } else {\r\n                    if (char === '<') {\r\n                        control.action = 'processTag';\r\n                    }\r\n                }\r\n\r\n                // Register references for a dynamic template\r\n                if (!escaped && char === '$' && html[i + 1] === '{') {\r\n                    const result = extractExpressionContent(html, i + 2);\r\n                    control.reference = result.content;\r\n                    i = result.position;\r\n                }\r\n\r\n                // Control node references\r\n                if (char === '{' && html[i + 1] === '{') {\r\n                    referenceControl = 1;\r\n                } else if (char === '}' && html[i - 1] === '}') {\r\n                    referenceControl = 2;\r\n                }\r\n            }\r\n\r\n            // Execute action\r\n            actions(control, char);\r\n\r\n            // Reference control\r\n            referenceControl = null;\r\n        }\r\n\r\n        // Handle any remaining text\r\n        commitText.call(control);\r\n\r\n        return result.children && result.children[0];\r\n    }\r\n\r\n    const generateHTML = function(lemon) {\r\n\r\n        const appendEvent = function(token, event, exec) {\r\n            if (! lemon.events[token]) {\r\n                lemon.events[token] = []\r\n            }\r\n            // Push the event\r\n            lemon.events[token].push(event);\r\n            // Execute\r\n            if (exec) {\r\n                event();\r\n            }\r\n        }\r\n\r\n        const createEventsFromExpression = function(expression, event, exec) {\r\n            // Get the tokens should be updated to populate this attribute\r\n            let tokens = extractTokens(expression);\r\n            if (tokens.length) {\r\n                // Process all the tokens\r\n                for (let i = 0; i < tokens.length; i++) {\r\n                    appendEvent(tokens[i], event);\r\n                }\r\n            }\r\n            // Execute method\r\n            if (exec) {\r\n                event();\r\n            }\r\n        }\r\n\r\n        const setDynamicValue = function(item, prop, attributeName) {\r\n            // Create a reference to the DOM element\r\n            let property = prop.expression || prop.value;\r\n\r\n            if (isReferenceToken(property)) {\r\n                // Event\r\n                let event = function() {\r\n                    // Reference\r\n                    let value = extractFromPath.call(lemon.self, property);\r\n                    // Update reference\r\n                    setAttribute(getElement(item), attributeName, value);\r\n                }\r\n                // Append event only for the top level properties in the self\r\n                if (isReferenceToken(property, true)) {\r\n                    let p = extractFromPath.call(lemon.self, property, true);\r\n                    if (p) {\r\n                        // Append event to the token change\r\n                        let token = p[1]\r\n                        // Append event\r\n                        appendEvent(token, event);\r\n                    }\r\n                }\r\n                // Execute the event in the first time\r\n                event();\r\n            } else {\r\n                setAttribute(getElement(item), attributeName, castProperty(prop.value));\r\n            }\r\n        }\r\n\r\n        const dynamicContent = function(text) {\r\n            try {\r\n                // Cast value\r\n                let cast = null;\r\n                // Replace the text\r\n                text = text.replace(isScript, function (a, b) {\r\n                    let s = lemon.self;\r\n                    // Try to find the property\r\n                    let result = extractFromPath.call(s, b);\r\n                    // Evaluation for legacy purposes\r\n                    if (typeof(result) === 'undefined') {\r\n                        // This is deprecated and will be dropped on LemonadeJS 6\r\n                        result = run.call(s, b);\r\n                        if (typeof (result) === 'undefined') {\r\n                            result = '';\r\n                        }\r\n                    } else if (result === null) {\r\n                        result = '';\r\n                    }\r\n                    // Parse correct type\r\n                    if (typeof(result) !== 'string' && a === text) {\r\n                        cast = result;\r\n                    }\r\n                    // Return\r\n                    return result;\r\n                });\r\n\r\n                if (cast !== null) {\r\n                    return cast;\r\n                }\r\n\r\n                return text;\r\n            } catch (e) {\r\n            }\r\n        }\r\n\r\n        const isHTML = function(str) {\r\n            return /<[^>]*>/.test(str);\r\n        }\r\n\r\n        const appendHTMLBeforeNode = function(item, value) {\r\n            // Remove previous elements\r\n            if (item.current) {\r\n                item.current.forEach(e => e?.remove());\r\n            }\r\n            item.current = [];\r\n            // Node container\r\n            let node = getElement(item);\r\n            // Append content\r\n            if (! isHTML(value)) {\r\n                node.textContent = value;\r\n            } else {\r\n                // TODO: improve that\r\n                queueMicrotask(() => {\r\n                    // Create a temporary container\r\n                    const t = document.createElement('div');\r\n                    t.innerHTML = value;\r\n                    // Insert elements and store references\r\n                    while (t.firstChild) {\r\n                        item.current.push(t.firstChild);\r\n                        node.parentNode.insertBefore(t.firstChild, node);\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        const applyElementAttribute = function(item, prop) {\r\n            if (typeof(prop.expression) !== 'undefined') {\r\n                // Event to update the designed position\r\n                let event = function() {\r\n                    // Extra value from the template\r\n                    let value = lemon.view(parseTemplate)[prop.index];\r\n                    // Process the NODE\r\n                    if (item.type === '#text') {\r\n                        appendHTMLBeforeNode(item, value);\r\n                    } else {\r\n                        // Set attribute\r\n                        setAttribute(getElement(item), prop.name, value);\r\n                    }\r\n                }\r\n                // Bind event to any tokens change\r\n                createEventsFromExpression(prop.expression, event, true);\r\n                // Register event for state changes\r\n                lemon.events[prop.index] = event;\r\n            } else {\r\n                // Get the tokens should be updated to populate this attribute\r\n                let tokens = extractTokens(prop.value);\r\n                if (tokens.length) {\r\n                    // Dynamic\r\n                    createEventsFromExpression(prop.value, function() {\r\n                        // Dynamic text\r\n                        let value = dynamicContent(prop.value);\r\n                        // Get the dynamic value\r\n                        setAttribute(getElement(item), prop.name, value);\r\n                    }, true)\r\n                } else {\r\n                    let value = prop.value;\r\n                    if (value.match(isScript)) {\r\n                        value = dynamicContent(value);\r\n                    }\r\n\r\n                    setAttribute(getElement(item), prop.name, value, true);\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Create a LemonadeJS self bind\r\n         * @param item\r\n         * @param prop\r\n         */\r\n        const applyBindHandler = function(item, prop) {\r\n            // Create a reference to the DOM element\r\n            let property = prop.expression || prop.value;\r\n\r\n            if (isReferenceToken(property, true)) {\r\n                let prop = property.split('.')[1];\r\n\r\n                // Event from component to the property\r\n                let event = function () {\r\n                    let value = getAttribute(getElement(item), 'value');\r\n                    if (lemon.self[prop] !== value) {\r\n                        lemon.self[prop] = value;\r\n                    }\r\n                }\r\n\r\n                if (typeof (item.type) === 'function') {\r\n                    item.bind = event;\r\n                } else {\r\n                    item.element.addEventListener('input', event);\r\n                }\r\n\r\n                // Event property to the element\r\n                event = () => {\r\n                    setAttribute(getElement(item), 'value', lemon.self[prop]);\r\n                }\r\n                // Append event\r\n                appendEvent(prop, event, true);\r\n            } else if (prop.value instanceof state) {\r\n                // TODO: implement :bind states\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Create a LemonadeJS self render\r\n         * @param item\r\n         * @param prop\r\n         */\r\n        const applyRenderHandler = function(item, prop) {\r\n            // Create a reference to the DOM element\r\n            let property = prop.expression || prop.value;\r\n            let getValue = null;\r\n            let token = null;\r\n\r\n            if (isReferenceToken(property, true)) {\r\n                token = property.split('.')[1];\r\n                // Get value\r\n                getValue = () => {\r\n                    return lemon.self[token];\r\n                }\r\n            } else {\r\n                if (typeof(prop.expression) !== 'undefined') {\r\n                    getValue = () => {\r\n                        // Extra value from the template\r\n                        let data = lemon.view(parseTemplate)[prop.index];\r\n                        if (data instanceof state) {\r\n                            data = data.value;\r\n                        }\r\n                        return data;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (getValue) {\r\n                // Create container to keep the elements\r\n                item.container = [];\r\n\r\n                // Event property to the element\r\n                let event = () => {\r\n                    // Root element\r\n                    let root = typeof(item.type) === 'function' ? item.self.el : item.element;\r\n                    // Curren value\r\n                    let value = getValue();\r\n                    if (value) {\r\n                        item.container.forEach(e => {\r\n                            root.appendChild(e);\r\n                        });\r\n                    } else {\r\n                        while (root.firstChild) {\r\n                            item.container.push(root.firstChild);\r\n                            root.firstChild.remove();\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (token) {\r\n                    // Append event\r\n                    appendEvent(token, event);\r\n                } else {\r\n                    if (typeof(prop.expression) !== 'undefined') {\r\n                        lemon.events[prop.index] = event;\r\n                        createEventsFromExpression(prop.expression, event);\r\n                    }\r\n                }\r\n\r\n                // Execute event\r\n                let root = typeof(item.type) === 'function' ? item.self.el : item.element;\r\n                if (root) {\r\n                    event();\r\n                } else {\r\n                    lemon.ready.push(event);\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Create a dynamic reference\r\n         * @param item\r\n         * @param prop\r\n         */\r\n        const createReference = function(item, prop) {\r\n            let ref = getElement(item);\r\n            if (typeof(prop.value) === 'function') {\r\n                prop.value(ref);\r\n            } else {\r\n                // Create a reference to the DOM element\r\n                let property = prop.expression || prop.value;\r\n                // Reference\r\n                if (isReferenceToken(property)) {\r\n                    let p = extractFromPath.call(lemon.self, property, true);\r\n                    if (p) {\r\n                        lemon.self[p[1]] = ref;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Process the :ready. Call when DOM is ready\r\n         * @param item\r\n         * @param prop\r\n         */\r\n        const whenIsReady = function(item, prop) {\r\n            let value = prop.value;\r\n            // If not a method, should be converted to a method\r\n            if (typeof(value) !== 'function') {\r\n                let t = extractFromPath.call(lemon.self, value);\r\n                if (t) {\r\n                    value = t;\r\n                }\r\n            }\r\n            // Must be a function\r\n            if (typeof(value) === 'function') {\r\n                lemon.ready.push(function() {\r\n                    value(getElement(item), lemon.self);\r\n                });\r\n            } else {\r\n                createError(`:ready ${value} is not a function`)\r\n            }\r\n        }\r\n\r\n        const getRoot = function(item) {\r\n            if (typeof(item.type) === 'function') {\r\n                if (item.parent.type === 'template') {\r\n                    return lemon.root;\r\n                } else {\r\n                    return item.parent.element;\r\n                }\r\n            }\r\n\r\n            return item.element;\r\n        }\r\n\r\n        const registerLoop = function(item, prop) {\r\n            // Create a reference to the DOM element\r\n            let property = prop.expression || prop.value;\r\n\r\n            // Append the template back to the correct position\r\n            if (lemon.self.settings?.loop) {\r\n                lemon.self.settings.loop(item)\r\n            }\r\n\r\n            // Event\r\n            let updateLoop = function(data) {\r\n                // Component\r\n                let method = typeof(item.type) === 'function' ? item.type : Basic;\r\n                // Remove all DOM\r\n                let root = getRoot(item);\r\n                if (root) {\r\n                    while (root.firstChild) {\r\n                        root.firstChild.remove();\r\n                    }\r\n                }\r\n                // Process the data\r\n                if (data && Array.isArray(data)) {\r\n                    // Process data\r\n                    data.forEach(function(self) {\r\n                        let el = self.el;\r\n                        if (el) {\r\n                            root.appendChild(el);\r\n                        } else {\r\n                            // Register parent\r\n                            register(self, 'parent', lemon.self);\r\n                            // Pass parent view for expressions in loop templates\r\n                            item.parentView = lemon.view;\r\n                            // Render\r\n                            L.render(method, root, self, item);\r\n                        }\r\n\r\n                        if (root?.getAttribute('unique') === 'false') {\r\n                            delete self.el;\r\n                        }\r\n                    })\r\n                }\r\n            }\r\n\r\n            // Event\r\n            let event;\r\n\r\n            // Type of property\r\n            if (isReferenceToken(property)) {\r\n                // Event\r\n                event = function() {\r\n                    // Reference\r\n                    let data = extractFromPath.call(lemon.self, property);\r\n                    // Update reference\r\n                    updateLoop(data);\r\n                }\r\n\r\n                // Append event only for the top level properties in the self\r\n                if (isReferenceToken(property, true)) {\r\n                    let p = extractFromPath.call(lemon.self, property, true);\r\n                    if (p) {\r\n                        // Append event to the token change\r\n                        appendEvent(p[1], event);\r\n                    }\r\n                }\r\n            } else {\r\n                if (typeof(prop.expression) !== 'undefined') {\r\n                    event = function() {\r\n                        // Extra value from the template\r\n                        let data = lemon.view(parseTemplate)[prop.index];\r\n                        if (data instanceof state) {\r\n                            data = data.value;\r\n                        }\r\n                        // Update the data\r\n                        updateLoop(data);\r\n                    }\r\n                    // Register event for state changes\r\n                    lemon.events[prop.index] = event;\r\n                }\r\n            }\r\n\r\n            // Defer event since the dom is not ready\r\n            if (event) {\r\n                if (getRoot(item)) {\r\n                    event();\r\n                } else {\r\n                    lemon.ready.push(event);\r\n                }\r\n            }\r\n        }\r\n\r\n        const isLoopAttribute = function(props) {\r\n            let test = false;\r\n            props.forEach(function(prop) {\r\n                if (prop.name === ':loop' || prop.name === 'lm-loop' || prop.name === '@loop') {\r\n                    test = true;\r\n                }\r\n            });\r\n            return test;\r\n        }\r\n\r\n        const registerPath = function(item, prop) {\r\n            if (! lemon.path.elements) {\r\n                lemon.path.elements = [];\r\n            }\r\n\r\n            let element = getElement(item);\r\n\r\n            lemon.path.elements.push({\r\n                element: element,\r\n                path: prop.value\r\n            });\r\n\r\n            // Event from component to the property\r\n            let event = function () {\r\n                // Get the current value of my HTML form element or component\r\n                let value = getAttribute(element, 'value');\r\n                // Apply the new value on the path on the object\r\n                if (lemon.path.value) {\r\n                    Path.call(lemon.path.value, prop.value, value);\r\n                    // Call the callback when exist\r\n                    if (typeof(lemon.path.change) === 'function') {\r\n                        lemon.path.change(value, prop.value, element);\r\n                    }\r\n                } else {\r\n                    console.log('Use setPath to define the form container before using lm-path');\r\n                }\r\n            }\r\n\r\n            if (typeof(item.type) === 'function') {\r\n                item.path = event;\r\n            } else {\r\n                item.element.addEventListener('input', event);\r\n            }\r\n        }\r\n\r\n        const appendChildren = function(container, children) {\r\n            if (container && children) {\r\n                for (let i = 0; i < children.length; i++) {\r\n                    let child = children[i];\r\n                    if (typeof(child) === 'string') {\r\n                        container.appendChild(document.createTextNode(child));\r\n                    } else if (child.element) {\r\n                        if (child.element.tagName === 'ROOT') {\r\n                            while (child.element.firstChild) {\r\n                                container.appendChild(child.element.firstChild);\r\n                            }\r\n                        } else {\r\n                            container.appendChild(child.element);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const getAttributeName = function(prop) {\r\n            return prop[0] === ':' || prop[0] === '@' ? prop.substring(1) : prop.substring(3);\r\n        }\r\n\r\n        const getAttributeEvent = function(event) {\r\n            event = event.toLowerCase();\r\n            if (event.startsWith('on')) {\r\n                return event.toLowerCase();\r\n            } else if (event.startsWith(':on')) {\r\n                return getAttributeName(event);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * CHeck if the event name is a valid DOM event name\r\n         * @param element\r\n         * @param eventName\r\n         * @returns {boolean}\r\n         */\r\n        const isValidEventName = function(element, eventName) {\r\n            const validEventPattern = /^on[a-z]+$/;\r\n            return validEventPattern.test(eventName);\r\n        }\r\n\r\n        /**\r\n         * Create element from the string tagname\r\n         * @param tagName\r\n         * @returns {*}\r\n         */\r\n        const createElementFromString = function(tagName) {\r\n            // List of SVG tags (you can expand this list if needed)\r\n            const svgTags = [\r\n                \"svg\", \"path\", \"circle\", \"rect\", \"line\", \"polygon\", \"polyline\", \"text\"\r\n            ];\r\n\r\n            if (svgTags.includes(tagName)) {\r\n                // For SVG elements, use createElementNS with the correct namespace\r\n                return document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\r\n            } else {\r\n                // For regular HTML elements, use createElement\r\n                return document.createElement(tagName);\r\n            }\r\n        }\r\n\r\n        const reorderProps = function(arr) {\r\n            // Define the desired order of names\r\n            const orderPriority = ['ref', 'bind', 'loop', 'ready'];\r\n\r\n            // Separate items into prioritized and non-prioritized\r\n            const prioritized = [];\r\n            const others = [];\r\n\r\n            // Sort items into respective arrays\r\n            arr.forEach(item => {\r\n                if (orderPriority.includes(item.name.substring(1)) || orderPriority.includes(item.name.substring(3))) {\r\n                    prioritized.push(item);\r\n                } else {\r\n                    others.push(item);\r\n                }\r\n            });\r\n\r\n            // Return combined array with prioritized items at the end\r\n            return [...others, ...prioritized];\r\n        }\r\n\r\n\r\n        const createElements = function(item) {\r\n            if (typeof(item) === 'object') {\r\n                // Create an element\r\n                if (item.type === '#comments') {\r\n                    item.element = document.createComment(item.props[0].value);\r\n                } else if (item.type === '#text') {\r\n                    // Text node\r\n                    item.element = document.createTextNode('');\r\n                    // Check for dynamic content\r\n                    applyElementAttribute(item, item.props[0]);\r\n                } else {\r\n                    // Apply attributes if they exist\r\n                    if (item.props && ! Array.isArray(item.props)) {\r\n                        let props = [];\r\n                        let keys = Object.keys(item.props);\r\n                        for (let i = 0; i < keys.length; i++) {\r\n                            props.push({ name: keys[i], value: item.props[keys[i]] });\r\n                        }\r\n                        item.props = props;\r\n                    } else if (! item.props) {\r\n                        item.props = [];\r\n                    }\r\n\r\n                    // This item is a parent for a loop\r\n                    if (isLoopAttribute(item.props)) {\r\n                        // Mark this item as a loop\r\n                        item.loop = true;\r\n                    }\r\n\r\n                    if (! item.type) {\r\n                        item.type = 'root';\r\n                    }\r\n\r\n                    if (typeof(item.type) === 'string') {\r\n                        if (item.type.match(/^[A-Z][a-zA-Z0-9\\-]*$/g)) {\r\n                            let controller = item.type.toUpperCase();\r\n                            if (typeof(R.components[controller]) === 'function') {\r\n                                item.type = R.components[controller];\r\n                            } else if (typeof (lemon.components[controller]) === 'function') {\r\n                                item.type = lemon.components[controller];\r\n                            } else {\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (typeof(item.type) === 'string') {\r\n                        item.element = createElementFromString(item.type);\r\n                    } else if (typeof(item.type) === 'function') {\r\n                        // Create instance without calling constructor\r\n                        if (isClass(item.type)) {\r\n                            item.self = new item.type;\r\n                        } else {\r\n                            item.self = {};\r\n                        }\r\n                    }\r\n\r\n                    // Create all children\r\n                    if (! item.loop) {\r\n                        if (item.children && Array.isArray(item.children)) {\r\n                            item.children.forEach(child => {\r\n                                createElements(child);\r\n                            });\r\n                        }\r\n                        if (item.element) {\r\n                            appendChildren(item.element, item.children);\r\n                        }\r\n                    }\r\n\r\n                    // Process attributes\r\n                    if (item.props.length) {\r\n                        // Reorder props\r\n                        item.props = reorderProps(item.props);\r\n                        // Order by priority\r\n                        item.props.forEach(function(prop) {\r\n                            try {\r\n                                // If the property is an event\r\n                                let event = getAttributeEvent(prop.name);\r\n                                // When event for a DOM\r\n                                if (event) {\r\n                                    // Element\r\n                                    let element = item.element;\r\n                                    // Value\r\n                                    let value = prop.value;\r\n                                    if (value) {\r\n                                        let handler = null; // Reset handler for each iteration\r\n                                        if (typeof (value) === 'function') {\r\n                                            handler = value;\r\n                                        } else {\r\n                                            let t = extractFromPath.call(lemon.self, value);\r\n                                            if (t) {\r\n                                                if (typeof (t) === 'function') {\r\n                                                    prop.value = handler = t;\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                        // When the element is a DOM\r\n                                        if (isDOM(element)) {\r\n                                            // Create the event handler\r\n                                            let eventHandler;\r\n                                            // Bind event\r\n                                            if (typeof(handler) === 'function') {\r\n                                                eventHandler = function(e, a, b) {\r\n                                                    return handler.call(element, e, lemon.self, a, b);\r\n                                                }\r\n                                            } else {\r\n                                                // Legacy compatibility. Inline scripting is non-Compliance with Content Security Policy (CSP).\r\n                                                eventHandler = function (e) {\r\n                                                    return Function('e', 'self', value).call(element, e, lemon.self); // TODO, quebra tudo se mudar\r\n                                                }\r\n                                            }\r\n\r\n                                            if (isValidEventName(element, prop.name)) {\r\n                                                element.addEventListener(event.substring(2), eventHandler);\r\n                                            } else {\r\n                                                if (element.tagName?.includes('-')) {\r\n                                                    element[event] = handler;\r\n                                                } else {\r\n                                                    element[event] = eventHandler;\r\n                                                }\r\n                                            }\r\n                                        } else {\r\n                                            item.self[event] = handler || value;\r\n                                        }\r\n                                    }\r\n                                } else if (prop.name.startsWith(':') || prop.name.startsWith('@') || prop.name.startsWith('lm-')) {\r\n                                    // Special lemonade attribute name\r\n                                    let attrName = getAttributeName(prop.name);\r\n                                    // Special properties bound to the self\r\n                                    if (attrName === 'ready') {\r\n                                        whenIsReady(item, prop);\r\n                                    } else if (attrName === 'ref') {\r\n                                        createReference(item, prop);\r\n                                    } else if (attrName === 'loop') {\r\n                                        registerLoop(item, prop);\r\n                                    } else if (attrName === 'bind') {\r\n                                        applyBindHandler(item, prop);\r\n                                    } else if (attrName === 'path') {\r\n                                        registerPath(item, prop);\r\n                                    } else if (attrName === 'render') {\r\n                                        applyRenderHandler(item, prop);\r\n                                    } else {\r\n                                        setDynamicValue(item, prop, attrName);\r\n                                    }\r\n                                } else {\r\n                                    applyElementAttribute(item, prop);\r\n                                }\r\n                            } catch (e) {\r\n                                let propValue = prop.expression || prop.value;\r\n                                console.error(`${prop.name}=\"${propValue}\" - ${e.message}`, item);\r\n                            }\r\n                        })\r\n                    }\r\n\r\n                    // Do not create elements at this state if this is a loop\r\n                    if (! item.loop) {\r\n                        if (typeof(item.type) === 'function') {\r\n                            // Execute component\r\n                            item.element = L.render(item.type, null, item.self, item);\r\n\r\n                            // Create all children\r\n                            if (item.children) {\r\n                                let root = item.element;\r\n                                if (typeof(item.self?.settings?.getRoot) === 'function') {\r\n                                    root = item.self.settings.getRoot();\r\n                                }\r\n                                appendChildren(root, item.children);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Create DOM elements\r\n        createElements(lemon.tree);\r\n\r\n        return lemon.tree.element;\r\n    }\r\n\r\n    /**\r\n     * Extract a property from a nested object using a string address\r\n     * @param {string} str address inside the nested object\r\n     * @param {boolean} config get the configuration obj => property\r\n     */\r\n    const extractFromPath = function(str, config) {\r\n        try {\r\n            let t = str.toString().replace(/[\\[\\]]/g, '.').split('.');\r\n            if (t[0] === 'self' || t[0] === 'this') {\r\n                t.shift();\r\n            }\r\n            // Remove blanks\r\n            t = t.filter(item => item !== '');\r\n            // Object\r\n            let o = this;\r\n            let lastObject;\r\n            while (t.length) {\r\n                // Get the property\r\n                let p = t.shift();\r\n                // Process config\r\n                if (config) {\r\n                    if (typeof(o) === 'object' && ! Array.isArray(o)) {\r\n                        lastObject = [o,p];\r\n                    }\r\n                    if (t.length === 0) {\r\n                        return lastObject;\r\n                    }\r\n                }\r\n                // Check if the property exists\r\n                if (o.hasOwnProperty(p) || typeof(o[p]) !== 'undefined') {\r\n                    o = o[p];\r\n                } else {\r\n                    return undefined;\r\n                }\r\n            }\r\n\r\n            if (typeof(o) !== 'undefined') {\r\n                return o;\r\n            }\r\n        } catch (e) {}\r\n\r\n        // Something went wrong\r\n        return undefined;\r\n    }\r\n\r\n    /**\r\n     * Cast the value of an attribute\r\n     */\r\n    const castProperty = function(attr) {\r\n        // Parse type\r\n        try {\r\n            if (typeof(attr) === 'string' && attr) {\r\n                // Remove any white spaces\r\n                attr = attr.trim();\r\n                if (attr === 'true') {\r\n                    return true;\r\n                } else if (attr === 'false') {\r\n                    return false;\r\n                } else if (! isNaN(attr)) {\r\n                    return Number(attr);\r\n                } else {\r\n                    let firstChar = attr[0];\r\n                    if (firstChar === '{' || firstChar === '[') {\r\n                        if (attr.slice(-1) === '}' || attr.slice(-1) === ']') {\r\n                            return JSON.parse(attr);\r\n                        }\r\n                    } else if (attr.startsWith('self.') || attr.startsWith('this.')) {\r\n                        let v = extractFromPath.call(this, attr);\r\n                        if (typeof(v) !== 'undefined') {\r\n                            return v;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } catch (e) {}\r\n\r\n        return attr;\r\n    }\r\n\r\n    /**\r\n     * This allows to run inline script on LEGACY system. Inline script can lead to security issues so use carefully.\r\n     * @param {string} s string to function\r\n     */\r\n    const run = function(s) {\r\n        return Function('self', '\"use strict\";return (' + s + ')')(this);\r\n    }\r\n\r\n    /**\r\n     * Check if the content {o} is a valid DOM Element\r\n     * @param {HTMLElement|DocumentFragment|object} o - is this a valid dom?\r\n     * @return {boolean}\r\n     */\r\n    const isDOM = function(o) {\r\n        return (o instanceof HTMLElement || o instanceof Element || o instanceof DocumentFragment);\r\n    }\r\n\r\n    /**\r\n     * Check if the method is a method or a class\r\n     * @param {function} f\r\n     * @return {boolean}\r\n     */\r\n    const isClass = function(f) {\r\n        return typeof f === 'function' && /^class\\s/.test(Function.prototype.toString.call(f));\r\n    }\r\n\r\n    /**\r\n     * Basic handler\r\n     * @param {string|object} t - HTML template\r\n     * @return {string|object}\r\n     */\r\n    const Basic = function(t) {\r\n        return t;\r\n    }\r\n\r\n    /**\r\n     * Get the attribute helper\r\n     * @param {object} e Element\r\n     * @param {string} attribute\r\n     */\r\n    const getAttribute = function(e, attribute) {\r\n        let value;\r\n        if (attribute === 'value') {\r\n            if (typeof(e.val) === 'function') {\r\n                value = e.val();\r\n            } else {\r\n                if (e.getAttribute) {\r\n                    if (e.tagName === 'SELECT' && e.getAttribute('multiple') !== null) {\r\n                        value = [];\r\n                        for (let i = 0; i < e.options.length; i++) {\r\n                            if (e.options[i].selected) {\r\n                                value.push(e.options[i].value);\r\n                            }\r\n                        }\r\n                    } else if (e.type === 'checkbox') {\r\n                        value = e.checked && e.getAttribute('value') ? e.value : e.checked;\r\n                    } else if (e.getAttribute('contenteditable')) {\r\n                        value = e.innerHTML;\r\n                    } else {\r\n                        value = e.value;\r\n                    }\r\n                } else {\r\n                    value = e.value;\r\n                }\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * Set attribute value helper\r\n     * @param {object} e Element\r\n     * @param {string} attribute\r\n     * @param {any} value\r\n     * @param {boolean?} propertyValue\r\n     */\r\n    const setAttribute = function(e, attribute, value, propertyValue) {\r\n        // Handle state\r\n        if (value instanceof state) {\r\n            value = value.value;\r\n        } else if (typeof(value) === 'undefined') {\r\n            value = '';\r\n        }\r\n\r\n        if (attribute === 'value' && ! propertyValue) {\r\n            // Update HTML form element\r\n            if (typeof (e.val) === 'function') {\r\n                if (e.val() != value) {\r\n                    e.val(value);\r\n                }\r\n            } else if (e.tagName === 'SELECT' && e.getAttribute('multiple') !== null) {\r\n                for (let j = 0; j < e.children.length; j++) {\r\n                    e.children[j].selected = value.indexOf(e.children[j].value) >= 0;\r\n                }\r\n            } else if (e.type === 'checkbox') {\r\n                e.checked = !(!value || value === '0' || value === 'false');\r\n            } else if (e.type === 'radio') {\r\n                e.checked = e.value == value;\r\n            } else if (e.getAttribute && e.getAttribute('contenteditable')) {\r\n                if (e.innerHTML != value) {\r\n                    e.innerHTML = value;\r\n                }\r\n            } else {\r\n                // Make sure apply that to the value\r\n                e.value = value;\r\n                // Update attribute if exists\r\n                if (e.getAttribute && e.getAttribute('value') !== null) {\r\n                    e.setAttribute('value', value);\r\n                }\r\n            }\r\n        } else if (typeof(value) === 'object' || typeof(value) === 'function') {\r\n            e[attribute] = value;\r\n        } else {\r\n            if (isDOM(e)) {\r\n                if (typeof (e[attribute]) !== 'undefined' && !(e.namespaceURI && e.namespaceURI.includes('svg'))) {\r\n                    e[attribute] = value;\r\n                } else {\r\n                    if (value === '') {\r\n                        e.removeAttribute(attribute);\r\n                    } else {\r\n                        e.setAttribute(attribute, value);\r\n                    }\r\n                }\r\n            } else {\r\n                e[attribute] = value;\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get attributes as an object\r\n     * @param {boolean} props - all attributes that are not undefined\r\n     * @return {object}\r\n     */\r\n    const getAttributes = function(props) {\r\n        let o = {};\r\n        let k = null;\r\n        let a = this.attributes;\r\n        if (a && a.length) {\r\n            for (let i = 0; i < a.length; i++) {\r\n                k = a[i].name;\r\n                if (props && typeof(this[k]) !== 'undefined') {\r\n                    o[k] = this[k];\r\n                } else {\r\n                    o[k] = a[i].value;\r\n                }\r\n            }\r\n        }\r\n        return o;\r\n    }\r\n\r\n    /**\r\n     * Register a getter without setter for a self object\r\n     * @param {object} s - self object\r\n     * @param {string} p - self property\r\n     * @param {string|object|number} v - value\r\n     */\r\n    const register = function(s, p, v) {\r\n        if (typeof(s) === 'object') {\r\n            Object.defineProperty(s, p, {\r\n                enumerable: false,\r\n                configurable: true,\r\n                get: function () {\r\n                    return v;\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Extract variables from the dynamic and append to the self\r\n     * @return {[string, array]} grab the literal injection\r\n     */\r\n    const parseTemplate = function() {\r\n        let args = Array.from(arguments);\r\n        // Remove first\r\n        args.shift()\r\n        // Return the final template\r\n        return args;\r\n    }\r\n\r\n    function cloneChildren(element) {\r\n        // Base case: if an element is null/undefined or not an object, return as is\r\n        if (!element || typeof element !== 'object') {\r\n            return element;\r\n        }\r\n\r\n        // Handle arrays\r\n        if (Array.isArray(element)) {\r\n            return element.map(item => cloneChildren(item));\r\n        }\r\n\r\n        // Create a new object\r\n        const cloned = {};\r\n\r\n        // Clone each property\r\n        for (const key in element) {\r\n            if (key === 'children') {\r\n                // Handle children especially as before\r\n                cloned.children = element.children ? cloneChildren(element.children) : undefined;\r\n            } else if (key === 'props') {\r\n                // Deep clone props array\r\n                cloned.props = element.props.map(prop => ({\r\n                    ...prop,\r\n                    value: prop.value // If value is a function, it will maintain the reference which is what we want\r\n                }));\r\n            } else {\r\n                // Clone other properties\r\n                cloned[key] = element[key];\r\n            }\r\n        }\r\n\r\n        return cloned;\r\n    }\r\n\r\n    // LemonadeJS object\r\n    const L = {};\r\n\r\n    /**\r\n     * Render a lemonade DOM element, method or class into a root DOM element\r\n     * @param {function} component - LemonadeJS component or DOM created\r\n     * @param {HTMLElement} root - root DOM element to receive the new HTML\r\n     * @param {object?} self - self to be used\r\n     * @param {object?} item - item\r\n     * @return {HTMLElement|boolean} o\r\n     */\r\n    L.render = function(component, root, self, item) {\r\n        if (typeof(component) !== 'function') {\r\n            console.error('Component is not a function');\r\n            return false;\r\n        }\r\n\r\n        // In case the self has not initial definition by the developer\r\n        if (typeof(self) === 'undefined') {\r\n            self = {};\r\n        }\r\n\r\n        // Web component\r\n        if (self.tagName && self.tagName.includes('-')) {\r\n            let props = getAttributes.call(self, true);\r\n            // Copy all values to the object\r\n            L.setProperties.call(self, props, true);\r\n        }\r\n\r\n        // Arguments\r\n        let args = Array.from(arguments);\r\n\r\n        // Lemonade component object\r\n        let lemon = {\r\n            self: self,\r\n            ready: [],\r\n            change: [],\r\n            events: {},\r\n            components: {},\r\n            elements: [],\r\n            root: root,\r\n            path: {},\r\n        }\r\n\r\n        // Current onchange\r\n        let externalOnchange = self.onchange;\r\n        let externalOnload = self.onload;\r\n\r\n        if (! item) {\r\n            item = {};\r\n        } else if (typeof(item) === 'string') {\r\n            item = {\r\n                children: item,\r\n            }\r\n        }\r\n\r\n        let view;\r\n        let result;\r\n\r\n        // New self\r\n        if (component === Basic) {\r\n            view = cloneChildren(item.children[0]);\r\n\r\n            if (item.parentView) {\r\n                lemon.view = item.parentView;\r\n            }\r\n        } else {\r\n            R.currentLemon = lemon;\r\n\r\n            const tools = {\r\n                onload: (...args) => setOnload(lemon, ...args),\r\n                onchange: (...args) => setOnchange(lemon, ...args),\r\n                track: (...args) => setTrack(lemon, ...args),\r\n                state: (...args) => setState(lemon, ...args),\r\n                setPath: (...args) => setPath(lemon, ...args),\r\n            };\r\n\r\n            if (isClass(component)) {\r\n                if (! (self instanceof component)) {\r\n                    lemon.self = self = new component(self);\r\n                }\r\n                view = self.render(item.children, tools);\r\n            } else {\r\n                // Execute component\r\n                view = component.call(self, item.children, tools);\r\n            }\r\n\r\n            // Resolve onchange scope conflict\r\n            if (typeof(self.onchange) === 'function' && externalOnchange !== self.onchange) {\r\n                // Keep onchange event in the new onchange format\r\n                lemon.change.push(self.onchange);\r\n                // Keep the external onchange\r\n                self.onchange = externalOnchange;\r\n            }\r\n\r\n            R.currentLemon = null;\r\n        }\r\n\r\n        // Values\r\n        let values = null;\r\n        // Process return\r\n        if (typeof(view) === 'function') {\r\n            values = view(parseTemplate);\r\n            // Curren values\r\n            lemon.values = values;\r\n            // A render template to be executed\r\n            lemon.view = view;\r\n            // Template from the method\r\n            result = view.toString().split('`');\r\n            // Get the original template\r\n            if (result) {\r\n                // Remove the last element\r\n                result.shift();\r\n                result.pop();\r\n                // Join everything else\r\n                result = result.join('`').trim();\r\n            }\r\n        } else {\r\n            result = view;\r\n        }\r\n\r\n        // Virtual DOM tree\r\n        if (typeof(result) === 'string') {\r\n            result = HTMLParser(result.trim(), values);\r\n        }\r\n\r\n        let element;\r\n\r\n        // Process the result\r\n        if (result) {\r\n            // Get the HTML virtual DOM representation\r\n            lemon.tree = result;\r\n\r\n            // Create real DOM and append to the root\r\n            element = generateHTML(lemon);\r\n\r\n            if (element) {\r\n                // Parents\r\n                lemon.elements = [];\r\n                // Append parents\r\n                if (element.tagName === 'ROOT') {\r\n                    element.childNodes.forEach((e) => {\r\n                        lemon.elements.push(e);\r\n                    });\r\n                } else {\r\n                    lemon.elements.push(element);\r\n                }\r\n\r\n                // Register element when is not registered inside the component\r\n                register(lemon.self, 'el', element);\r\n\r\n                const destroy = () => {\r\n                    // Do not add in the same root\r\n                    let div = document.createElement('div');\r\n                    // Append temporary DIV to the same position\r\n                    lemon.elements[0].parentNode.insertBefore(div, lemon.elements[0]);\r\n                    // Remove the old elements\r\n                    lemon.elements.forEach((e) => {\r\n                        e.remove();\r\n                    });\r\n                    // Root element\r\n                    args[1] = div;\r\n                    // Create a new component\r\n                    L.render(...args);\r\n                    // Append elements in the same position in the DOM tree\r\n                    while (div.firstChild) {\r\n                        div.parentNode.insertBefore(div.firstChild, div);\r\n                    }\r\n                    // Remove DIV\r\n                    div.remove();\r\n                    // Object not in use\r\n                    lemon = null;\r\n                }\r\n\r\n                // Refresh\r\n                register(lemon.self, 'refresh', (prop) => {\r\n                    if (prop) {\r\n                        if (prop === true) {\r\n                            destroy();\r\n                        } else {\r\n                            lemon.self[prop] = lemon.self[prop];\r\n                        }\r\n                    } else {\r\n                        if (lemon.view) {\r\n                            runViewValues(lemon);\r\n                        } else {\r\n                            destroy();\r\n                        }\r\n                    }\r\n                });\r\n\r\n                // Append element to the DOM\r\n                if (root) {\r\n                    lemon.elements.forEach((e) => {\r\n                        root.appendChild(e);\r\n                    });\r\n                }\r\n            } else {\r\n                // Refresh\r\n                register(lemon.self, 'refresh', (prop) => {\r\n                    if (prop) {\r\n                        if (prop === true) {\r\n                            runViewValues(lemon);\r\n                        } else {\r\n                            lemon.self[prop] = lemon.self[prop];\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        // Bind to custom component\r\n        if (item.bind || item.path) {\r\n            let token = 'value';\r\n            if (! lemon.events[token]) {\r\n                lemon.events[token] = []\r\n            }\r\n            // Push the event\r\n            if (item.bind) {\r\n                lemon.events[token].push(item.bind);\r\n            }\r\n            if (item.path) {\r\n                lemon.events[token].push(item.path);\r\n            }\r\n        }\r\n\r\n        // In case initial exists\r\n        if (typeof(lemon.path.initial) === 'object') {\r\n            // Get the value of the draft\r\n            let newValue = lemon.path.initial;\r\n            // Delete draft\r\n            delete lemon.path.initial;\r\n            // Apply new values\r\n            lemon.path.setValue(newValue);\r\n\r\n        }\r\n\r\n        // Apply events\r\n        if (lemon.events) {\r\n            let props = Object.keys(lemon.events);\r\n            if (props.length) {\r\n                for (let i = 0; i <props.length; i++) {\r\n                    let prop = props[i];\r\n                    if (prop != Number(prop)) {\r\n                        trackProperty(lemon, prop);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Process the onload\r\n        if (element) {\r\n            processOnload(lemon);\r\n        }\r\n\r\n        return element;\r\n    }\r\n\r\n    const registerComponents = function(components) {\r\n        if (components && R.currentLemon) {\r\n            for (const key in components) {\r\n                R.currentLemon.components[key.toUpperCase()] = components[key];\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Deprecated\r\n     * @param {string} template\r\n     * @param {object?} s (self)\r\n     * @param {object?} components\r\n     */\r\n    L.element = function(template, s, components) {\r\n        if (R.currentLemon && s && typeof(s) === 'object') {\r\n            if (s !== R.currentLemon.self) {\r\n                R.currentLemon.self = s;\r\n            }\r\n        }\r\n        registerComponents(components);\r\n        return template;\r\n    }\r\n\r\n    /**\r\n     * Apply self to an existing appended DOM element\r\n     * @param {HTMLElement} el - element root\r\n     * @param {object} s - self to associate to the template\r\n     * @param {object?} components - object with component declarations\r\n     */\r\n    L.apply = function(el, s, components) {\r\n        let template = el.innerHTML;\r\n        el.textContent = '';\r\n        let Component = function() {\r\n            registerComponents(components);\r\n            return `<>${template}</>`;\r\n        }\r\n        return L.render(Component,el,s);\r\n    }\r\n\r\n    /**\r\n     * Get all properties existing in {o} and create a new object with the values from {this};\r\n     * @param {object} o - reference object with the properties relevant to the new object\r\n     * @return {object} n - the new object with all new values\r\n     */\r\n    L.getProperties = function(o) {\r\n        // The new object with all properties found in {o} with values from {this}\r\n        let n = {};\r\n        for (let p in o) {\r\n            n[p] = this[p];\r\n        }\r\n        return n;\r\n    }\r\n\r\n    /**\r\n     * Set the values from {o} to {this}\r\n     * @param {object} o set the values of {this} when the `this[property]` is found in {o}, or when flag force is true\r\n     * @param {boolean} f create a new property when that does not exist yet, but is found in {o}\r\n     * @return {object} this is redundant since object {this} is a reference and is already available in the caller\r\n     */\r\n    L.setProperties = function(o, f) {\r\n        for (let p in o) {\r\n            if (this.hasOwnProperty(p) || f) {\r\n                this[p] = o[p];\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Reset the values of any common property name between this and a given object\r\n     * @param {object} o - all properties names in the object {o} found in {this} will be reset.\r\n     */\r\n    L.resetProperties = function(o) {\r\n        for (let p in o) {\r\n            this[p] = '';\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Lemonade CC (common container) helps you share a self or function through the whole application\r\n     * @param {string} name alias for your declared object(self) or function\r\n     * @returns {Object | Function} - registered element\r\n     */\r\n    L.get = function(name) {\r\n        return R.container[name];\r\n    }\r\n\r\n    /**\r\n     * Register something to the Lemonade CC (common container)\r\n     * @param {string} name - alias for your declared object(self) or function\r\n     * @param {object|function} e - the element to be added to the common container. Can be an object(self) or function.\r\n     * @param {boolean} persistence - optional the persistence flag. Only applicable for functions.\r\n     */\r\n    L.set = function(name, e, persistence) {\r\n        // Applicable only when the o is a function\r\n        if (typeof(e) === 'function' && persistence === true) {\r\n            // Keep the flag\r\n            e.storage = true;\r\n            // Any existing values\r\n            let t = window.localStorage.getItem(name);\r\n            if (t) {\r\n                // Parse JSON\r\n                t = JSON.parse(t);\r\n                // Execute method with the existing values\r\n                e(t);\r\n            }\r\n        }\r\n        // Save to the sugar container\r\n        R.container[name] = e;\r\n    }\r\n\r\n    /**\r\n     * Dispatch the new values to the function\r\n     * @param {string} name - alias to the element saved on the Lemonade CC (common container)\r\n     * @param {object?} data - data to be dispatched\r\n     */\r\n    L.dispatch = function(name, data) {\r\n        // Get from the container\r\n        let e = R.container[name];\r\n        // Confirm that the alias is a function\r\n        if (typeof(e) === 'function') {\r\n            // Save the data to the local storage\r\n            if (e.storage === true) {\r\n                window.localStorage.setItem(name, JSON.stringify(data));\r\n            }\r\n            // Dispatch the data to the function\r\n            return e(data);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Register components\r\n     * @param {object} components - register components\r\n     */\r\n    L.setComponents = function(components) {\r\n        if (typeof(components) === 'object') {\r\n            // Component names\r\n            let k = Object.keys(components);\r\n            // Make sure they follow the standard\r\n            for (let i = 0; i < k.length; i++) {\r\n                R.components[k[i].toUpperCase()] = components[k[i]];\r\n            }\r\n        }\r\n    }\r\n\r\n    L.component = class {}\r\n\r\n    /**\r\n     * Create a Web Component\r\n     * @param {string} name - web component name\r\n     * @param {function} handler - lemonadejs component\r\n     * @param {object} options - options to create the web components\r\n     */\r\n    L.createWebComponent = function(name, handler, options) {\r\n        if (typeof(window) === 'undefined') {\r\n            return;\r\n        }\r\n\r\n        if (typeof(handler) !== 'function') {\r\n            return 'Handler should be an function';\r\n        }\r\n        // Prefix\r\n        let prefix = options && options.prefix ? options.prefix : 'lm';\r\n\r\n        // Component name\r\n        const componentName = prefix + '-' + name;\r\n\r\n        // Check if the component is already defined\r\n        if (! window.customElements.get(componentName)) {\r\n            class Component extends HTMLElement {\r\n                constructor() {\r\n                    super();\r\n                }\r\n\r\n                connectedCallback() {\r\n                    // LemonadeJS self\r\n                    let self = this;\r\n                    // First call\r\n                    let state = typeof(this.el) === 'undefined';\r\n                    // LemonadeJS is already rendered\r\n                    if (state === true) {\r\n                        // Render\r\n                        if (options && options.applyOnly === true) {\r\n                            // Merge component\r\n                            handler.call(this);\r\n                            // Apply\r\n                            L.apply(this, self);\r\n                        } else {\r\n                            let root = this;\r\n                            if (options && options.shadowRoot === true) {\r\n                                this.attachShadow({ mode: 'open' });\r\n                                root = document.createElement('div');\r\n                                this.shadowRoot.appendChild(root);\r\n                            }\r\n                            // Give the browser time to calculate all width and heights\r\n                            L.render(handler, root, self);\r\n                        }\r\n                    }\r\n\r\n                    queueMicrotask(() => {\r\n                        // Event\r\n                        if (typeof(self.onconnect) === 'function') {\r\n                            self.onconnect(self, state);\r\n                        }\r\n                    });\r\n                }\r\n\r\n                disconnectedCallback() {\r\n                    if (typeof(this.ondisconnect) === 'function') {\r\n                        this.ondisconnect(this);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (! window.customElements.get(componentName)) {\r\n                window.customElements.define(componentName, Component);\r\n            }\r\n        }\r\n    }\r\n\r\n    L.h = function(type, props, ...children) {\r\n        return { type, props: props || {}, children };\r\n    }\r\n\r\n    L.Fragment = function(props) {\r\n        return props.children;\r\n    }\r\n\r\n    const wrongLevel = 'Hooks must be called at the top level of your component';\r\n\r\n    const setOnload = function(lemon, event) {\r\n        lemon.load = event;\r\n    }\r\n\r\n    const setOnchange = function(lemon, event) {\r\n        lemon.change.push(event);\r\n    }\r\n\r\n    const setTrack = function(lemon, prop) {\r\n        if (! lemon.events[prop]) {\r\n            lemon.events[prop] = [];\r\n        }\r\n    }\r\n\r\n    const setPath = function(lemon, initialValues, change) {\r\n        // My value object\r\n        let value = {};\r\n        // Create a method to update the state\r\n        const setValue = (newValue) => {\r\n            if (typeof(lemon.path.initial) === 'undefined') {\r\n                if (typeof (newValue) === 'object') {\r\n                    // If my has been declared\r\n                    let elements = lemon.path.elements;\r\n                    if (elements) {\r\n                        for (let i = 0; i < elements.length; i++) {\r\n                            let v = Path.call(newValue, elements[i].path)\r\n                            setAttribute(elements[i].element, 'value', v);\r\n                            // Also sync value to the data object (use '' for undefined to match form behavior)\r\n                            Path.call(lemon.path.value, elements[i].path, v !== undefined ? v : '');\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                lemon.path.initial = newValue;\r\n            }\r\n        }\r\n\r\n        const getValue = () => {\r\n            let ret = {};\r\n            // If my has been declared\r\n            let elements = lemon.path.elements;\r\n            if (elements) {\r\n                for (let i = 0; i < elements.length; i++) {\r\n                    let v = getAttribute(elements[i].element, 'value');\r\n                    Path.call(ret, elements[i].path, v);\r\n                }\r\n            }\r\n            return ret;\r\n        }\r\n\r\n        lemon.path = {\r\n            setValue: setValue,\r\n            value: value,\r\n            change: change,\r\n            initial: initialValues || {}\r\n        };\r\n\r\n        return [value, setValue, getValue];\r\n    }\r\n\r\n    const setState = function(lemon, value, callback) {\r\n        // Create a state container\r\n        const s = new state();\r\n        // Create a method to update the state\r\n        const setValue = (newValue) => {\r\n            let oldValue = value;\r\n            // Update original value\r\n            value = typeof newValue === 'function' ? newValue(value) : newValue;\r\n            // Values from the view\r\n            runViewValues(lemon, s);\r\n            // Call back\r\n            callback?.(value, oldValue);\r\n        }\r\n        // Make the value attribute dynamic\r\n        Object.defineProperty(s, 'value', {\r\n            set: setValue,\r\n            get: () => value\r\n        });\r\n\r\n        return s;\r\n    }\r\n\r\n    L.onload = function(event) {\r\n        if (! R.currentLemon) {\r\n            createError(wrongLevel);\r\n        }\r\n        return setOnload(R.currentLemon, event);\r\n    }\r\n\r\n    L.onchange = function(event) {\r\n        if (! R.currentLemon) {\r\n            createError(wrongLevel);\r\n        }\r\n        return setOnchange(R.currentLemon, event);\r\n    }\r\n\r\n    L.track = function(prop) {\r\n        if (! R.currentLemon) {\r\n            createError(wrongLevel);\r\n        }\r\n        return setTrack(R.currentLemon, prop);\r\n    }\r\n\r\n    L.setPath = function(initialValues, change) {\r\n        if (! R.currentLemon) {\r\n            createError(wrongLevel);\r\n        }\r\n        return setPath(R.currentLemon, initialValues, change);\r\n    }\r\n\r\n    /**\r\n     * Run view values\r\n     * @param lemon\r\n     * @param s - refresh from state\r\n     */\r\n    const runViewValues = function(lemon, s) {\r\n        let values = lemon.view(parseTemplate);\r\n        if (values && values.length) {\r\n            values.forEach((v, k) => {\r\n                let current = lemon.values[k];\r\n                // Compare if the previous value\r\n                if (s && s === v || v !== current) {\r\n                    // Update current value\r\n                    lemon.values[k] = v;\r\n                    // Trigger state events\r\n                    if (typeof(lemon.events[k]) === 'function') {\r\n                        lemon.events[k]();\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    const state = function() {}\r\n\r\n    state.prototype.toString = function() {\r\n        return this.value.toString();\r\n    }\r\n\r\n    state.prototype.valueOf = function() {\r\n        return this.value;\r\n    }\r\n\r\n    state.prototype[Symbol.toPrimitive] = function(hint) {\r\n        if (hint === 'string') {\r\n            return this.value.toString();\r\n        }\r\n        return this.value;\r\n    }\r\n\r\n    // TODO: Proxy for Objects and Arrays\r\n    L.state = function(value, callback) {\r\n        if (! R.currentLemon) {\r\n            createError(wrongLevel);\r\n        }\r\n\r\n        return setState(R.currentLemon, value, callback);\r\n    }\r\n\r\n    L.helpers = {\r\n        path: extractFromPath,\r\n        properties: {\r\n            get: L.getProperties,\r\n            set: L.setProperties,\r\n            reset: L.resetProperties,\r\n        }\r\n    }\r\n\r\n    L.events = (function() {\r\n        class CustomEvents extends Event {\r\n            constructor(type, props, options) {\r\n                super(type, {\r\n                    bubbles: true,\r\n                    composed: true,\r\n                    ...options,\r\n                });\r\n\r\n                if (props) {\r\n                    for (const key in props) {\r\n                        // Avoid assigning if property already exists anywhere on `this`\r\n                        if (! (key in this)) {\r\n                            this[key] = props[key];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const create = function(type, props, options) {\r\n            return new CustomEvents(type, props, options);\r\n        };\r\n\r\n        return {\r\n            create: create,\r\n            dispatch(element, event, options) {\r\n                if (typeof event === 'string') {\r\n                    event = create(event, options);\r\n                }\r\n                element.dispatchEvent(event);\r\n            }\r\n        };\r\n    })();\r\n\r\n    return L;\r\n})));\n\n/***/ }),\n\n/***/ 195:\n/***/ (function(module) {\n\n/**\r\n * (c) jSuites Javascript Plugins and Web Components (v4)\r\n *\r\n * Website: https://jsuites.net\r\n * Description: Create amazing web based applications.\r\n * Plugin: Organogram\r\n *\r\n * MIT License\r\n */\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    return (function(str) {\r\n        function int64(msint_32, lsint_32) {\r\n            this.highOrder = msint_32;\r\n            this.lowOrder = lsint_32;\r\n        }\r\n\r\n        var H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),\r\n            new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),\r\n            new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),\r\n            new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];\r\n\r\n        var K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),\r\n            new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),\r\n            new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),\r\n            new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),\r\n            new int64(0xd807aa98, 0xa3030242), new int64(0x12835b01, 0x45706fbe),\r\n            new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, 0xd5ffb4e2),\r\n            new int64(0x72be5d74, 0xf27b896f), new int64(0x80deb1fe, 0x3b1696b1),\r\n            new int64(0x9bdc06a7, 0x25c71235), new int64(0xc19bf174, 0xcf692694),\r\n            new int64(0xe49b69c1, 0x9ef14ad2), new int64(0xefbe4786, 0x384f25e3),\r\n            new int64(0x0fc19dc6, 0x8b8cd5b5), new int64(0x240ca1cc, 0x77ac9c65),\r\n            new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),\r\n            new int64(0x5cb0a9dc, 0xbd41fbd4), new int64(0x76f988da, 0x831153b5),\r\n            new int64(0x983e5152, 0xee66dfab), new int64(0xa831c66d, 0x2db43210),\r\n            new int64(0xb00327c8, 0x98fb213f), new int64(0xbf597fc7, 0xbeef0ee4),\r\n            new int64(0xc6e00bf3, 0x3da88fc2), new int64(0xd5a79147, 0x930aa725),\r\n            new int64(0x06ca6351, 0xe003826f), new int64(0x14292967, 0x0a0e6e70),\r\n            new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),\r\n            new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, 0x9d95b3df),\r\n            new int64(0x650a7354, 0x8baf63de), new int64(0x766a0abb, 0x3c77b2a8),\r\n            new int64(0x81c2c92e, 0x47edaee6), new int64(0x92722c85, 0x1482353b),\r\n            new int64(0xa2bfe8a1, 0x4cf10364), new int64(0xa81a664b, 0xbc423001),\r\n            new int64(0xc24b8b70, 0xd0f89791), new int64(0xc76c51a3, 0x0654be30),\r\n            new int64(0xd192e819, 0xd6ef5218), new int64(0xd6990624, 0x5565a910),\r\n            new int64(0xf40e3585, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),\r\n            new int64(0x19a4c116, 0xb8d2d0c8), new int64(0x1e376c08, 0x5141ab53),\r\n            new int64(0x2748774c, 0xdf8eeb99), new int64(0x34b0bcb5, 0xe19b48a8),\r\n            new int64(0x391c0cb3, 0xc5c95a63), new int64(0x4ed8aa4a, 0xe3418acb),\r\n            new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, 0xd6b2b8a3),\r\n            new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),\r\n            new int64(0x84c87814, 0xa1f0ab72), new int64(0x8cc70208, 0x1a6439ec),\r\n            new int64(0x90befffa, 0x23631e28), new int64(0xa4506ceb, 0xde82bde9),\r\n            new int64(0xbef9a3f7, 0xb2c67915), new int64(0xc67178f2, 0xe372532b),\r\n            new int64(0xca273ece, 0xea26619c), new int64(0xd186b8c7, 0x21c0c207),\r\n            new int64(0xeada7dd6, 0xcde0eb1e), new int64(0xf57d4f7f, 0xee6ed178),\r\n            new int64(0x06f067aa, 0x72176fba), new int64(0x0a637dc5, 0xa2c898a6),\r\n            new int64(0x113f9804, 0xbef90dae), new int64(0x1b710b35, 0x131c471b),\r\n            new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),\r\n            new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, 0x9c100d4c),\r\n            new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),\r\n            new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];\r\n\r\n        var W = new Array(64);\r\n        var a, b, c, d, e, f, g, h, i, j;\r\n        var T1, T2;\r\n        var charsize = 8;\r\n\r\n        function utf8_encode(str) {\r\n            return unescape(encodeURIComponent(str));\r\n        }\r\n\r\n        function str2binb(str) {\r\n            var bin = [];\r\n            var mask = (1 << charsize) - 1;\r\n            var len = str.length * charsize;\r\n\r\n            for (var i = 0; i < len; i += charsize) {\r\n                bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 - charsize - (i % 32));\r\n            }\r\n\r\n            return bin;\r\n        }\r\n\r\n        function binb2hex(binarray) {\r\n            var hex_tab = \"0123456789abcdef\";\r\n            var str = \"\";\r\n            var length = binarray.length * 4;\r\n            var srcByte;\r\n\r\n            for (var i = 0; i < length; i += 1) {\r\n                srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8);\r\n                str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);\r\n            }\r\n\r\n            return str;\r\n        }\r\n\r\n        function safe_add_2(x, y) {\r\n            var lsw, msw, lowOrder, highOrder;\r\n\r\n            lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);\r\n            msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);\r\n            lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n            lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16);\r\n            msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16);\r\n            highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n            return new int64(highOrder, lowOrder);\r\n        }\r\n\r\n        function safe_add_4(a, b, c, d) {\r\n            var lsw, msw, lowOrder, highOrder;\r\n\r\n            lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);\r\n            msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);\r\n            lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n            lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16);\r\n            msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16);\r\n            highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n            return new int64(highOrder, lowOrder);\r\n        }\r\n\r\n        function safe_add_5(a, b, c, d, e) {\r\n            var lsw, msw, lowOrder, highOrder;\r\n\r\n            lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);\r\n            msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);\r\n            lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n            lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (e.highOrder & 0xFFFF) + (msw >>> 16);\r\n            msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (e.highOrder >>> 16) + (lsw >>> 16);\r\n            highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF);\r\n\r\n            return new int64(highOrder, lowOrder);\r\n        }\r\n\r\n        function maj(x, y, z) {\r\n            return new int64(\r\n                (x.highOrder & y.highOrder) ^ (x.highOrder & z.highOrder) ^ (y.highOrder & z.highOrder),\r\n                (x.lowOrder & y.lowOrder) ^ (x.lowOrder & z.lowOrder) ^ (y.lowOrder & z.lowOrder)\r\n            );\r\n        }\r\n\r\n        function ch(x, y, z) {\r\n            return new int64(\r\n                (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder),\r\n                (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder)\r\n            );\r\n        }\r\n\r\n        function rotr(x, n) {\r\n            if (n <= 32) {\r\n                return new int64(\r\n                    (x.highOrder >>> n) | (x.lowOrder << (32 - n)),\r\n                    (x.lowOrder >>> n) | (x.highOrder << (32 - n))\r\n                );\r\n            } else {\r\n                return new int64(\r\n                    (x.lowOrder >>> n) | (x.highOrder << (32 - n)),\r\n                    (x.highOrder >>> n) | (x.lowOrder << (32 - n))\r\n                );\r\n            }\r\n        }\r\n\r\n        function sigma0(x) {\r\n            var rotr28 = rotr(x, 28);\r\n            var rotr34 = rotr(x, 34);\r\n            var rotr39 = rotr(x, 39);\r\n\r\n            return new int64(\r\n                rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,\r\n                rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder\r\n            );\r\n        }\r\n\r\n        function sigma1(x) {\r\n            var rotr14 = rotr(x, 14);\r\n            var rotr18 = rotr(x, 18);\r\n            var rotr41 = rotr(x, 41);\r\n\r\n            return new int64(\r\n                rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,\r\n                rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder\r\n            );\r\n        }\r\n\r\n        function gamma0(x) {\r\n            var rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);\r\n\r\n            return new int64(\r\n                rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,\r\n                rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder\r\n            );\r\n        }\r\n\r\n        function gamma1(x) {\r\n            var rotr19 = rotr(x, 19);\r\n            var rotr61 = rotr(x, 61);\r\n            var shr6 = shr(x, 6);\r\n\r\n            return new int64(\r\n                rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,\r\n                rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder\r\n            );\r\n        }\r\n\r\n        function shr(x, n) {\r\n            if (n <= 32) {\r\n                return new int64(\r\n                    x.highOrder >>> n,\r\n                    x.lowOrder >>> n | (x.highOrder << (32 - n))\r\n                );\r\n            } else {\r\n                return new int64(\r\n                    0,\r\n                    x.highOrder << (32 - n)\r\n                );\r\n            }\r\n        }\r\n\r\n        var str = utf8_encode(str);\r\n        var strlen = str.length*charsize;\r\n        str = str2binb(str);\r\n\r\n        str[strlen >> 5] |= 0x80 << (24 - strlen % 32);\r\n        str[(((strlen + 128) >> 10) << 5) + 31] = strlen;\r\n\r\n        for (var i = 0; i < str.length; i += 32) {\r\n            a = H[0];\r\n            b = H[1];\r\n            c = H[2];\r\n            d = H[3];\r\n            e = H[4];\r\n            f = H[5];\r\n            g = H[6];\r\n            h = H[7];\r\n\r\n            for (var j = 0; j < 80; j++) {\r\n                if (j < 16) {\r\n                    W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);\r\n                } else {\r\n                    W[j] = safe_add_4(gamma1(W[j - 2]), W[j - 7], gamma0(W[j - 15]), W[j - 16]);\r\n                }\r\n\r\n                T1 = safe_add_5(h, sigma1(e), ch(e, f, g), K[j], W[j]);\r\n                T2 = safe_add_2(sigma0(a), maj(a, b, c));\r\n                h = g;\r\n                g = f;\r\n                f = e;\r\n                e = safe_add_2(d, T1);\r\n                d = c;\r\n                c = b;\r\n                b = a;\r\n                a = safe_add_2(T1, T2);\r\n            }\r\n\r\n            H[0] = safe_add_2(a, H[0]);\r\n            H[1] = safe_add_2(b, H[1]);\r\n            H[2] = safe_add_2(c, H[2]);\r\n            H[3] = safe_add_2(d, H[3]);\r\n            H[4] = safe_add_2(e, H[4]);\r\n            H[5] = safe_add_2(f, H[5]);\r\n            H[6] = safe_add_2(g, H[6]);\r\n            H[7] = safe_add_2(h, H[7]);\r\n        }\r\n\r\n        var binarray = [];\r\n        for (var i = 0; i < H.length; i++) {\r\n            binarray.push(H[i].highOrder);\r\n            binarray.push(H[i].lowOrder);\r\n        }\r\n\r\n        return binb2hex(binarray);\r\n    });\r\n\r\n})));\r\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n!function() {\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  \"default\": function() { return /* binding */ jsuites; }\n});\n\n;// CONCATENATED MODULE: ./src/utils/dictionary.js\n// Update dictionary\r\nconst setDictionary = function(d) {\r\n    if (! document.dictionary) {\r\n        document.dictionary = {}\r\n    }\r\n    // Replace the key into the dictionary and append the new ones\r\n    let k = Object.keys(d);\r\n    for (let i = 0; i < k.length; i++) {\r\n        document.dictionary[k[i]] = d[k[i]];\r\n    }\r\n}\r\n\r\n// Translate\r\nconst translate = function(t) {\r\n    if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n        return document.dictionary[t] || t;\r\n    } else {\r\n        return t;\r\n    }\r\n}\r\n\r\n\r\n/* harmony default export */ var dictionary = ({ setDictionary, translate });\n;// CONCATENATED MODULE: ./src/utils/tracking.js\n const Tracking = function(component, state) {\r\n    if (state === true) {\r\n        window['jSuitesStateControl'] = window['jSuitesStateControl'].filter(function(v) {\r\n            return v !== null;\r\n        });\r\n\r\n        // Start after all events\r\n        setTimeout(function() {\r\n            window['jSuitesStateControl'].push(component);\r\n        }, 0);\r\n\r\n    } else {\r\n        var index = window['jSuitesStateControl'].indexOf(component);\r\n        if (index >= 0) {\r\n            window['jSuitesStateControl'].splice(index, 1);\r\n        }\r\n    }\r\n}\r\n\r\n/* harmony default export */ var tracking = (Tracking);\n;// CONCATENATED MODULE: ./src/utils/helpers.js\nconst Helpers = {};\r\n\r\n// Two digits\r\nHelpers.two = function(value) {\r\n    value = '' + value;\r\n    if (value.length == 1) {\r\n        value = '0' + value;\r\n    }\r\n    return value;\r\n}\r\n\r\nHelpers.focus = function(el) {\r\n    if (el.textContent.length) {\r\n        // Handle contenteditable elements\r\n        const range = document.createRange();\r\n        const sel = window.getSelection();\r\n\r\n        let node = el;\r\n        // Go as deep as possible to the last text node\r\n        while (node.lastChild) node = node.lastChild;\r\n        // Ensure it's a text node\r\n        if (node.nodeType === Node.TEXT_NODE) {\r\n            range.setStart(node, node.length);\r\n        } else {\r\n            range.setStart(node, node.childNodes.length);\r\n        }\r\n        range.collapse(true);\r\n        sel.removeAllRanges();\r\n        sel.addRange(range);\r\n\r\n        el.scrollLeft = el.scrollWidth;\r\n    }\r\n}\r\n\r\nHelpers.isNumeric = (function (num) {\r\n    if (typeof(num) === 'string') {\r\n        num = num.trim();\r\n    }\r\n    return !isNaN(num) && num !== null && num !== '';\r\n});\r\n\r\nHelpers.guid = function() {\r\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n        let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n        return v.toString(16);\r\n    });\r\n}\r\n\r\nHelpers.getNode = function() {\r\n    let node = document.getSelection().anchorNode;\r\n    if (node) {\r\n        return (node.nodeType == 3 ? node.parentNode : node);\r\n    } else {\r\n        return null;\r\n    }\r\n}\r\n/**\r\n * Generate hash from a string\r\n */\r\nHelpers.hash = function(str) {\r\n    let hash = 0, i, chr;\r\n\r\n    if (str.length === 0) {\r\n        return hash;\r\n    } else {\r\n        for (i = 0; i < str.length; i++) {\r\n            chr = str.charCodeAt(i);\r\n            if (chr > 32) {\r\n                hash = ((hash << 5) - hash) + chr;\r\n                hash |= 0;\r\n            }\r\n        }\r\n    }\r\n    return hash;\r\n}\r\n\r\n/**\r\n * Generate a random color\r\n */\r\nHelpers.randomColor = function(h) {\r\n    let lum = -0.25;\r\n    let hex = String('#' + Math.random().toString(16).slice(2, 8).toUpperCase()).replace(/[^0-9a-f]/gi, '');\r\n    if (hex.length < 6) {\r\n        hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n    }\r\n    let rgb = [], c;\r\n    for (let i = 0; i < 3; i++) {\r\n        c = parseInt(hex.substr(i * 2, 2), 16);\r\n        c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);\r\n        rgb.push((\"00\" + c).substr(c.length));\r\n    }\r\n\r\n    // Return hex\r\n    if (h === true) {\r\n        return '#' + Helpers.two(rgb[0].toString(16)) + Helpers.two(rgb[1].toString(16)) + Helpers.two(rgb[2].toString(16));\r\n    }\r\n\r\n    return rgb;\r\n}\r\n\r\nHelpers.getWindowWidth = function() {\r\n    let w = window,\r\n    d = document,\r\n    e = d.documentElement,\r\n    g = d.getElementsByTagName('body')[0],\r\n    x = w.innerWidth || e.clientWidth || g.clientWidth;\r\n    return x;\r\n}\r\n\r\nHelpers.getWindowHeight = function() {\r\n    let w = window,\r\n    d = document,\r\n    e = d.documentElement,\r\n    g = d.getElementsByTagName('body')[0],\r\n    y = w.innerHeight|| e.clientHeight|| g.clientHeight;\r\n    return  y;\r\n}\r\n\r\nHelpers.getPosition = function(e) {\r\n    let x;\r\n    let y;\r\n    if (e.changedTouches && e.changedTouches[0]) {\r\n        x = e.changedTouches[0].pageX;\r\n        y = e.changedTouches[0].pageY;\r\n    } else {\r\n        x = (window.Event) ? e.pageX : e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\r\n        y = (window.Event) ? e.pageY : e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);\r\n    }\r\n\r\n    return [ x, y ];\r\n}\r\n\r\nHelpers.click = function(el) {\r\n    if (el.click) {\r\n        el.click();\r\n    } else {\r\n        let evt = new MouseEvent('click', {\r\n            bubbles: true,\r\n            cancelable: true,\r\n            view: window\r\n        });\r\n        el.dispatchEvent(evt);\r\n    }\r\n}\r\n\r\nHelpers.findElement = function(element, condition) {\r\n    let foundElement = false;\r\n\r\n    function path (element) {\r\n        if (element && ! foundElement) {\r\n            if (typeof(condition) == 'function') {\r\n                foundElement = condition(element)\r\n            } else if (typeof(condition) == 'string') {\r\n                if (element.classList && element.classList.contains(condition)) {\r\n                    foundElement = element;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (element.parentNode && ! foundElement) {\r\n            path(element.parentNode);\r\n        }\r\n    }\r\n\r\n    path(element);\r\n\r\n    return foundElement;\r\n}\r\n\r\n/* harmony default export */ var helpers = (Helpers);\n;// CONCATENATED MODULE: ./src/utils/path.js\nconst isValidPathObj = function(o) {\r\n    return o !== null && (typeof o === 'object' || typeof o === 'function');\r\n}\r\n\r\nfunction Path(pathString, value, remove) {\r\n    // Ensure the path is a valid, non-empty string\r\n    if (typeof pathString !== 'string' || pathString.length === 0) {\r\n        return undefined;\r\n    }\r\n\r\n    // Split the path into individual keys and filter out empty keys\r\n    const keys = pathString.split('.');\r\n    if (keys.length === 0) {\r\n        return undefined;\r\n    }\r\n\r\n    // Start with the root object\r\n    let currentObject = this;\r\n\r\n    // Read mode: retrieve a value\r\n    if (typeof value === 'undefined' && typeof remove === 'undefined') {\r\n        // Traverse all keys\r\n        for (let i = 0; i < keys.length; i++) {\r\n            const key = keys[i];\r\n            // Check if the current object is valid and has the key\r\n            if (currentObject != null && isValidPathObj(currentObject) && key in currentObject) {\r\n                currentObject = currentObject[key];\r\n            } else {\r\n                // Return undefined if the path is invalid or currentObject is null/undefined\r\n                return undefined;\r\n            }\r\n        }\r\n        // Return the final value\r\n        return currentObject;\r\n    }\r\n\r\n    // Write mode: set or delete a value\r\n    // Traverse all keys except the last one\r\n    for (let i = 0; i < keys.length - 1; i++) {\r\n        const key = keys[i];\r\n\r\n        // Check if the current object is invalid (null/undefined or non-object)\r\n        if (currentObject == null || ! isValidPathObj(currentObject)) {\r\n            console.warn(`Cannot set value: path '${pathString}' blocked by invalid object at '${key}'`);\r\n            return false;\r\n        }\r\n\r\n        // If the key exists but is null/undefined or a non-object, replace it with an empty object\r\n        if (\r\n            key in currentObject &&\r\n            (currentObject[key] == null || ! isValidPathObj(currentObject[key]))\r\n        ) {\r\n            currentObject[key] = {};\r\n        } else if (!(key in currentObject)) {\r\n            // If the key doesn't exist, create an empty object\r\n            currentObject[key] = {};\r\n        }\r\n\r\n        // Move to the next level\r\n        currentObject = currentObject[key];\r\n    }\r\n\r\n    // Handle the final key\r\n    const finalKey = keys[keys.length - 1];\r\n\r\n    // Check if the current object is valid for setting/deleting\r\n    if (currentObject == null || ! isValidPathObj(currentObject)) {\r\n        return false;\r\n    }\r\n\r\n    // Delete the property if remove is true\r\n    if (remove === true) {\r\n        if (finalKey in currentObject) {\r\n            delete currentObject[finalKey];\r\n            return true;\r\n        }\r\n        return false; // Nothing to delete\r\n    }\r\n\r\n    // Set the value\r\n    currentObject[finalKey] = value;\r\n    return true;\r\n}\n;// CONCATENATED MODULE: ./src/utils/sorting.js\nfunction Sorting(el, options) {\r\n    var obj = {};\r\n    obj.options = {};\r\n\r\n    var defaults = {\r\n        pointer: null,\r\n        direction: null,\r\n        ondragstart: null,\r\n        ondragend: null,\r\n        ondrop: null,\r\n    }\r\n\r\n    var dragElement = null;\r\n\r\n    // Loop through the initial configuration\r\n    for (var property in defaults) {\r\n        if (options && options.hasOwnProperty(property)) {\r\n            obj.options[property] = options[property];\r\n        } else {\r\n            obj.options[property] = defaults[property];\r\n        }\r\n    }\r\n\r\n    el.classList.add('jsorting');\r\n\r\n    el.addEventListener('dragstart', function(e) {\r\n        let target = e.target;\r\n        if (target.nodeType === 3) {\r\n            if (target.parentNode.getAttribute('draggable') === 'true') {\r\n                target = target.parentNode;\r\n            } else {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n                return;\r\n            }\r\n        }\r\n\r\n        if (target.getAttribute('draggable') === 'true') {\r\n            let position = Array.prototype.indexOf.call(target.parentNode.children, target);\r\n            dragElement = {\r\n                element: target,\r\n                o: position,\r\n                d: position\r\n            }\r\n            target.style.opacity = '0.25';\r\n\r\n            if (typeof (obj.options.ondragstart) == 'function') {\r\n                obj.options.ondragstart(el, target, e);\r\n            }\r\n\r\n            e.dataTransfer.setDragImage(target,0,0);\r\n        }\r\n    });\r\n\r\n    el.addEventListener('dragover', function(e) {\r\n        e.preventDefault();\r\n\r\n        if (dragElement) {\r\n            if (getElement(e.target)) {\r\n                if (e.target.getAttribute('draggable') == 'true' && dragElement.element != e.target) {\r\n                    if (!obj.options.direction) {\r\n                        var condition = e.target.clientHeight / 2 > e.offsetY;\r\n                    } else {\r\n                        var condition = e.target.clientWidth / 2 > e.offsetX;\r\n                    }\r\n\r\n                    if (condition) {\r\n                        e.target.parentNode.insertBefore(dragElement.element, e.target);\r\n                    } else {\r\n                        e.target.parentNode.insertBefore(dragElement.element, e.target.nextSibling);\r\n                    }\r\n\r\n                    dragElement.d = Array.prototype.indexOf.call(e.target.parentNode.children, dragElement.element);\r\n                }\r\n            }\r\n        }\r\n    });\r\n\r\n    el.addEventListener('dragleave', function(e) {\r\n        e.preventDefault();\r\n    });\r\n\r\n    el.addEventListener('dragend', function(e) {\r\n        e.preventDefault();\r\n\r\n        if (dragElement) {\r\n            if (typeof(obj.options.ondragend) == 'function') {\r\n                obj.options.ondragend(el, dragElement.element, e);\r\n            }\r\n\r\n            // Cancelled put element to the original position\r\n            if (dragElement.o < dragElement.d) {\r\n                e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o]);\r\n            } else {\r\n                e.target.parentNode.insertBefore(dragElement.element, e.target.parentNode.children[dragElement.o].nextSibling);\r\n            }\r\n\r\n            dragElement.element.style.opacity = '';\r\n            dragElement = null;\r\n        }\r\n    });\r\n\r\n    el.addEventListener('drop', function(e) {\r\n        e.preventDefault();\r\n\r\n        if (dragElement) {\r\n            if (dragElement.o !== dragElement.d) {\r\n                if (typeof (obj.options.ondrop) == 'function') {\r\n                    obj.options.ondrop(el, dragElement.o, dragElement.d, dragElement.element, e.target, e);\r\n                }\r\n            }\r\n\r\n            dragElement.element.style.opacity = '';\r\n            dragElement = null;\r\n        }\r\n    });\r\n\r\n    var getElement = function(element) {\r\n        var sorting = false;\r\n\r\n        function path (element) {\r\n            if (element.className) {\r\n                if (element.classList.contains('jsorting')) {\r\n                    sorting = true;\r\n                }\r\n            }\r\n\r\n            if (! sorting) {\r\n                path(element.parentNode);\r\n            }\r\n        }\r\n\r\n        path(element);\r\n\r\n        return sorting;\r\n    }\r\n\r\n    for (var i = 0; i < el.children.length; i++) {\r\n        if (! el.children[i].hasAttribute('draggable')) {\r\n            el.children[i].setAttribute('draggable', 'true');\r\n        }\r\n    }\r\n\r\n    el.val = function() {\r\n        var id = null;\r\n        var data = [];\r\n        for (var i = 0; i < el.children.length; i++) {\r\n            if (id = el.children[i].getAttribute('data-id')) {\r\n                data.push(id);\r\n            }\r\n        }\r\n        return data;\r\n    }\r\n\r\n    return el;\r\n}\n;// CONCATENATED MODULE: ./src/utils/lazyloading.js\nfunction LazyLoading(el, options) {\r\n    var obj = {}\r\n\r\n    // Mandatory options\r\n    if (! options.loadUp || typeof(options.loadUp) != 'function') {\r\n        options.loadUp = function() {\r\n            return false;\r\n        }\r\n    }\r\n    if (! options.loadDown || typeof(options.loadDown) != 'function') {\r\n        options.loadDown = function() {\r\n            return false;\r\n        }\r\n    }\r\n    // Timer ms\r\n    if (! options.timer) {\r\n        options.timer = 100;\r\n    }\r\n\r\n    // Timer\r\n    var timeControlLoading = null;\r\n\r\n    // Controls\r\n    var scrollControls = function(e) {\r\n        if (timeControlLoading == null) {\r\n            var event = false;\r\n            var scrollTop = el.scrollTop;\r\n            if (el.scrollTop + (el.clientHeight * 2) >= el.scrollHeight) {\r\n                if (options.loadDown()) {\r\n                    if (scrollTop == el.scrollTop) {\r\n                        el.scrollTop = el.scrollTop - (el.clientHeight);\r\n                    }\r\n                    event = true;\r\n                }\r\n            } else if (el.scrollTop <= el.clientHeight) {\r\n                if (options.loadUp()) {\r\n                    if (scrollTop == el.scrollTop) {\r\n                        el.scrollTop = el.scrollTop + (el.clientHeight);\r\n                    }\r\n                    event = true;\r\n                }\r\n            }\r\n\r\n            timeControlLoading = setTimeout(function() {\r\n                timeControlLoading = null;\r\n            }, options.timer);\r\n\r\n            if (event) {\r\n                if (typeof(options.onupdate) == 'function') {\r\n                    options.onupdate();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Onscroll\r\n    el.onscroll = function(e) {\r\n        scrollControls(e);\r\n    }\r\n\r\n    el.onwheel = function(e) {\r\n        scrollControls(e);\r\n    }\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/ajax.js\nfunction Ajax() {\r\n    var Component = (function(options, complete) {\r\n        if (Array.isArray(options)) {\r\n            // Create multiple request controller\r\n            var multiple = {\r\n                instance: [],\r\n                complete: complete,\r\n            }\r\n\r\n            if (options.length > 0) {\r\n                for (var i = 0; i < options.length; i++) {\r\n                    options[i].multiple = multiple;\r\n                    multiple.instance.push(Component(options[i]));\r\n                }\r\n            }\r\n\r\n            return multiple;\r\n        }\r\n\r\n        if (! options.data) {\r\n            options.data = {};\r\n        }\r\n\r\n        if (options.type) {\r\n            options.method = options.type;\r\n        }\r\n\r\n        // Default method\r\n        if (! options.method) {\r\n            options.method = 'GET';\r\n        }\r\n\r\n        // Default type\r\n        if (! options.dataType) {\r\n            options.dataType = 'json';\r\n        }\r\n\r\n        if (options.data) {\r\n            // Parse object to variables format\r\n            var parseData = function (value, key) {\r\n                var vars = [];\r\n                if (value) {\r\n                    var keys = Object.keys(value);\r\n                    if (keys.length) {\r\n                        for (var i = 0; i < keys.length; i++) {\r\n                            if (key) {\r\n                                var k = key + '[' + keys[i] + ']';\r\n                            } else {\r\n                                var k = keys[i];\r\n                            }\r\n\r\n                            if (value[k] instanceof FileList) {\r\n                                vars[k] = value[keys[i]];\r\n                            } else if (value[keys[i]] === null || value[keys[i]] === undefined) {\r\n                                vars[k] = '';\r\n                            } else if (typeof(value[keys[i]]) == 'object') {\r\n                                var r = parseData(value[keys[i]], k);\r\n                                var o = Object.keys(r);\r\n                                for (var j = 0; j < o.length; j++) {\r\n                                    vars[o[j]] = r[o[j]];\r\n                                }\r\n                            } else {\r\n                                vars[k] = value[keys[i]];\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return vars;\r\n            }\r\n\r\n            var d = parseData(options.data);\r\n            var k = Object.keys(d);\r\n\r\n            // Data form\r\n            if (options.method == 'GET') {\r\n                if (k.length) {\r\n                    var data = [];\r\n                    for (var i = 0; i < k.length; i++) {\r\n                        data.push(k[i] + '=' + encodeURIComponent(d[k[i]]));\r\n                    }\r\n\r\n                    if (options.url.indexOf('?') < 0) {\r\n                        options.url += '?';\r\n                    }\r\n                    options.url += data.join('&');\r\n                }\r\n            } else {\r\n                var data = new FormData();\r\n                for (var i = 0; i < k.length; i++) {\r\n                    if (d[k[i]] instanceof FileList) {\r\n                        if (d[k[i]].length) {\r\n                            for (var j = 0; j < d[k[i]].length; j++) {\r\n                                data.append(k[i], d[k[i]][j], d[k[i]][j].name);\r\n                            }\r\n                        }\r\n                    } else {\r\n                        data.append(k[i], d[k[i]]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        var httpRequest = new XMLHttpRequest();\r\n        httpRequest.open(options.method, options.url, true);\r\n\r\n        if (options.requestedWith) {\r\n            httpRequest.setRequestHeader('X-Requested-With', options.requestedWith);\r\n        } else {\r\n            if (options.requestedWith !== false) {\r\n                httpRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n            }\r\n        }\r\n\r\n        // Content type\r\n        if (options.contentType) {\r\n            httpRequest.setRequestHeader('Content-Type', options.contentType);\r\n        }\r\n\r\n        // Headers\r\n        if (options.method === 'POST') {\r\n            httpRequest.setRequestHeader('Accept', 'application/json');\r\n        } else {\r\n            if (options.dataType === 'blob') {\r\n                httpRequest.responseType = \"blob\";\r\n            } else {\r\n                if (! options.contentType) {\r\n                    if (options.dataType === 'json') {\r\n                        httpRequest.setRequestHeader('Content-Type', 'text/json');\r\n                    } else if (options.dataType === 'html') {\r\n                        httpRequest.setRequestHeader('Content-Type', 'text/html');\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // No cache\r\n        if (options.cache !== true) {\r\n            httpRequest.setRequestHeader('pragma', 'no-cache');\r\n            httpRequest.setRequestHeader('cache-control', 'no-cache');\r\n        }\r\n\r\n        // Authentication\r\n        if (options.withCredentials === true) {\r\n            httpRequest.withCredentials = true\r\n        }\r\n\r\n        // Before send\r\n        if (typeof(options.beforeSend) == 'function') {\r\n            options.beforeSend(httpRequest);\r\n        }\r\n\r\n        // Before send\r\n        if (typeof(Component.beforeSend) == 'function') {\r\n            Component.beforeSend(httpRequest);\r\n        }\r\n\r\n        if (document.ajax && typeof(document.ajax.beforeSend) == 'function') {\r\n            document.ajax.beforeSend(httpRequest);\r\n        }\r\n\r\n        httpRequest.onerror = function() {\r\n            if (options.error && typeof(options.error) == 'function') {\r\n                options.error({\r\n                    message: 'Network error: Unable to reach the server.',\r\n                    status: 0\r\n                });\r\n            }\r\n        }\r\n\r\n        httpRequest.ontimeout = function() {\r\n            if (options.error && typeof(options.error) == 'function') {\r\n                options.error({\r\n                    message: 'Request timed out after ' + httpRequest.timeout + 'ms.',\r\n                    status: 0\r\n                });\r\n            }\r\n        }\r\n\r\n        httpRequest.onload = function() {\r\n            if (httpRequest.status >= 200 && httpRequest.status < 300) {\r\n                if (options.dataType === 'json') {\r\n                    try {\r\n                        var result = JSON.parse(httpRequest.responseText);\r\n\r\n                        if (options.success && typeof(options.success) == 'function') {\r\n                            options.success(result);\r\n                        }\r\n                    } catch(err) {\r\n                        if (options.error && typeof(options.error) == 'function') {\r\n                            options.error(err, result);\r\n                        }\r\n                    }\r\n                } else {\r\n                    if (options.dataType === 'blob') {\r\n                        var result = httpRequest.response;\r\n                    } else {\r\n                        var result = httpRequest.responseText;\r\n                    }\r\n\r\n                    if (options.success && typeof(options.success) == 'function') {\r\n                        options.success(result);\r\n                    }\r\n                }\r\n            } else {\r\n                if (options.error && typeof(options.error) == 'function') {\r\n                    options.error(httpRequest.responseText, httpRequest.status);\r\n                }\r\n            }\r\n\r\n            // Global queue\r\n            if (Component.queue && Component.queue.length > 0) {\r\n                Component.send(Component.queue.shift());\r\n            }\r\n\r\n            // Global complete method\r\n            if (Component.requests && Component.requests.length) {\r\n                // Get index of this request in the container\r\n                var index = Component.requests.indexOf(httpRequest);\r\n                // Remove from the ajax requests container\r\n                Component.requests.splice(index, 1);\r\n                // Deprecated: Last one?\r\n                if (! Component.requests.length) {\r\n                    // Object event\r\n                    if (options.complete && typeof(options.complete) == 'function') {\r\n                        options.complete(result);\r\n                    }\r\n                }\r\n                // Group requests\r\n                if (options.group) {\r\n                    if (Component.oncomplete && typeof(Component.oncomplete[options.group]) == 'function') {\r\n                        if (! Component.pending(options.group)) {\r\n                            Component.oncomplete[options.group]();\r\n                            Component.oncomplete[options.group] = null;\r\n                        }\r\n                    }\r\n                }\r\n                // Multiple requests controller\r\n                if (options.multiple && options.multiple.instance) {\r\n                    // Get index of this request in the container\r\n                    var index = options.multiple.instance.indexOf(httpRequest);\r\n                    // Remove from the ajax requests container\r\n                    options.multiple.instance.splice(index, 1);\r\n                    // If this is the last one call method complete\r\n                    if (! options.multiple.instance.length) {\r\n                        if (options.multiple.complete && typeof(options.multiple.complete) == 'function') {\r\n                            options.multiple.complete(result);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Keep the options\r\n        httpRequest.options = options;\r\n        // Data\r\n        httpRequest.data = data;\r\n\r\n        // Queue\r\n        if (options.queue === true && Component.requests.length > 0) {\r\n            Component.queue.push(httpRequest);\r\n        } else {\r\n            Component.send(httpRequest)\r\n        }\r\n\r\n        return httpRequest;\r\n    });\r\n\r\n    Component.send = function(httpRequest) {\r\n        if (httpRequest.data) {\r\n            if (Array.isArray(httpRequest.data)) {\r\n                httpRequest.send(httpRequest.data.join('&'));\r\n            } else {\r\n                httpRequest.send(httpRequest.data);\r\n            }\r\n        } else {\r\n            httpRequest.send();\r\n        }\r\n\r\n        Component.requests.push(httpRequest);\r\n    }\r\n\r\n    Component.exists = function(url, __callback) {\r\n        var http = new XMLHttpRequest();\r\n        http.open('HEAD', url, false);\r\n        http.send();\r\n        if (http.status) {\r\n            __callback(http.status);\r\n        }\r\n    }\r\n\r\n    Component.pending = function(group) {\r\n        var n = 0;\r\n        var o = Component.requests;\r\n        if (o && o.length) {\r\n            for (var i = 0; i < o.length; i++) {\r\n                if (! group || group == o[i].options.group) {\r\n                    n++\r\n                }\r\n            }\r\n        }\r\n        return n;\r\n    }\r\n\r\n    Component.oncomplete = {};\r\n    Component.requests = [];\r\n    Component.queue = [];\r\n\r\n    return Component\r\n}\r\n\r\n/* harmony default export */ var ajax = (Ajax());\n;// CONCATENATED MODULE: ./src/plugins/animation.js\nfunction Animation() {\r\n    const Component = {\r\n        loading: {}\r\n    }\r\n    \r\n    Component.loading.show = function(timeout) {\r\n        if (! Component.loading.element) {\r\n            Component.loading.element = document.createElement('div');\r\n            Component.loading.element.className = 'jloading';\r\n        }\r\n        document.body.appendChild(Component.loading.element);\r\n    \r\n        // Max timeout in seconds\r\n        if (timeout > 0) {\r\n            setTimeout(function() {\r\n                Component.loading.hide();\r\n            }, timeout * 1000)\r\n        }\r\n    }\r\n    \r\n    Component.loading.hide = function() {\r\n        if (Component.loading.element && Component.loading.element.parentNode) {\r\n            document.body.removeChild(Component.loading.element);\r\n        }\r\n    }\r\n    \r\n    Component.slideLeft = function (element, direction, done) {\r\n        if (direction == true) {\r\n            element.classList.add('jslide-left-in');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-left-in');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        } else {\r\n            element.classList.add('jslide-left-out');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-left-out');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        }\r\n    }\r\n    \r\n    Component.slideRight = function (element, direction, done) {\r\n        if (direction === true) {\r\n            element.classList.add('jslide-right-in');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-right-in');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        } else {\r\n            element.classList.add('jslide-right-out');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-right-out');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        }\r\n    }\r\n    \r\n    Component.slideTop = function (element, direction, done) {\r\n        if (direction === true) {\r\n            element.classList.add('jslide-top-in');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-top-in');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        } else {\r\n            element.classList.add('jslide-top-out');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-top-out');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        }\r\n    }\r\n    \r\n    Component.slideBottom = function (element, direction, done) {\r\n        if (direction === true) {\r\n            element.classList.add('jslide-bottom-in');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-bottom-in');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 400);\r\n        } else {\r\n            element.classList.add('jslide-bottom-out');\r\n            setTimeout(function () {\r\n                element.classList.remove('jslide-bottom-out');\r\n                if (typeof (done) == 'function') {\r\n                    done();\r\n                }\r\n            }, 100);\r\n        }\r\n    }\r\n    \r\n    Component.fadeIn = function (element, done) {\r\n        element.style.display = '';\r\n        element.classList.add('jfade-in');\r\n        setTimeout(function () {\r\n            element.classList.remove('jfade-in');\r\n            if (typeof (done) == 'function') {\r\n                done();\r\n            }\r\n        }, 2000);\r\n    }\r\n    \r\n    Component.fadeOut = function (element, done) {\r\n        element.classList.add('jfade-out');\r\n        setTimeout(function () {\r\n            element.style.display = 'none';\r\n            element.classList.remove('jfade-out');\r\n            if (typeof (done) == 'function') {\r\n                done();\r\n            }\r\n        }, 1000);\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var animation = (Animation());\n// EXTERNAL MODULE: ./node_modules/@jsuites/utils/dist/index.js\nvar dist = __webpack_require__(791);\nvar dist_default = /*#__PURE__*/__webpack_require__.n(dist);\n;// CONCATENATED MODULE: ./src/plugins/calendar.js\n\r\n\r\n\r\n\r\n\r\n\r\nconst Mask = (dist_default()).Mask;\r\nconst HelpersDate = (dist_default()).Helpers;\r\n\r\nfunction Calendar() {\r\n    var Component = (function (el, options) {\r\n        // Already created, update options\r\n        if (el.calendar) {\r\n            return el.calendar.setOptions(options, true);\r\n        }\r\n\r\n        // New instance\r\n        var obj = {type: 'calendar'};\r\n        obj.options = {};\r\n\r\n        // Date\r\n        obj.date = null;\r\n\r\n        /**\r\n         * Update options\r\n         */\r\n        obj.setOptions = function (options, reset) {\r\n            // Default configuration\r\n            var defaults = {\r\n                // Render type: [ default | year-month-picker ]\r\n                type: 'default',\r\n                // Restrictions\r\n                validRange: null,\r\n                // Starting weekday - 0 for sunday, 6 for saturday\r\n                startingDay: null,\r\n                // Date format\r\n                format: 'DD/MM/YYYY',\r\n                // Allow keyboard date entry\r\n                readonly: true,\r\n                // Today is default\r\n                today: false,\r\n                // Show timepicker\r\n                time: false,\r\n                // Show the reset button\r\n                resetButton: true,\r\n                // Placeholder\r\n                placeholder: '',\r\n                // Translations can be done here\r\n                months: HelpersDate.monthsShort,\r\n                monthsFull: HelpersDate.months,\r\n                weekdays: HelpersDate.weekdays,\r\n                textDone: dictionary.translate('Done'),\r\n                textReset: dictionary.translate('Reset'),\r\n                textUpdate: dictionary.translate('Update'),\r\n                // Value\r\n                value: null,\r\n                // Fullscreen (this is automatic set for screensize < 800)\r\n                fullscreen: false,\r\n                // Create the calendar closed as default\r\n                opened: false,\r\n                // Events\r\n                onopen: null,\r\n                onclose: null,\r\n                onchange: null,\r\n                onupdate: null,\r\n                // Internal mode controller\r\n                mode: null,\r\n                position: null,\r\n                // Data type\r\n                dataType: null,\r\n                // Controls\r\n                controls: true,\r\n                // Auto select\r\n                autoSelect: true,\r\n            }\r\n\r\n            // Loop through our object\r\n            for (var property in defaults) {\r\n                if (options && options.hasOwnProperty(property)) {\r\n                    obj.options[property] = options[property];\r\n                } else {\r\n                    if (typeof (obj.options[property]) == 'undefined' || reset === true) {\r\n                        obj.options[property] = defaults[property];\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Register custom months and weekdays with the dictionary for translation\r\n            if (obj.options.monthsFull && obj.options.monthsFull !== defaults.monthsFull) {\r\n                const englishMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n                const translations = {};\r\n                for (let i = 0; i < 12; i++) {\r\n                    if (obj.options.monthsFull[i]) {\r\n                        translations[englishMonths[i]] = obj.options.monthsFull[i];\r\n                    }\r\n                }\r\n                dictionary.setDictionary(translations);\r\n            }\r\n\r\n            if (obj.options.weekdays && obj.options.weekdays !== defaults.weekdays) {\r\n                const englishWeekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n                const translations = {};\r\n                for (let i = 0; i < 7; i++) {\r\n                    if (obj.options.weekdays[i]) {\r\n                        translations[englishWeekdays[i]] = obj.options.weekdays[i];\r\n                    }\r\n                }\r\n                dictionary.setDictionary(translations);\r\n            }\r\n\r\n            // Reset button\r\n            if (obj.options.resetButton == false) {\r\n                calendarReset.style.display = 'none';\r\n            } else {\r\n                calendarReset.style.display = '';\r\n            }\r\n\r\n            // Readonly\r\n            if (obj.options.readonly) {\r\n                el.setAttribute('readonly', 'readonly');\r\n            } else {\r\n                el.removeAttribute('readonly');\r\n            }\r\n\r\n            // Placeholder\r\n            if (obj.options.placeholder) {\r\n                el.setAttribute('placeholder', obj.options.placeholder);\r\n            } else {\r\n                el.removeAttribute('placeholder');\r\n            }\r\n\r\n            if (helpers.isNumeric(obj.options.value) && obj.options.value > 0) {\r\n                obj.options.value = Component.numToDate(obj.options.value);\r\n                // Data type numeric\r\n                obj.options.dataType = 'numeric';\r\n            }\r\n\r\n            // Texts\r\n            calendarReset.innerHTML = obj.options.textReset;\r\n            calendarConfirm.innerHTML = obj.options.textDone;\r\n            calendarControlsUpdateButton.innerHTML = obj.options.textUpdate;\r\n\r\n            // Define mask\r\n            if (obj.options.format) {\r\n                el.setAttribute('data-mask', obj.options.format.toLowerCase());\r\n            }\r\n\r\n            // Value\r\n            if (!obj.options.value && obj.options.today) {\r\n                var value = Component.now();\r\n            } else {\r\n                var value = obj.options.value;\r\n            }\r\n\r\n            // Set internal date\r\n            if (value) {\r\n                // Force the update\r\n                obj.options.value = null;\r\n                // New value\r\n                obj.setValue(value);\r\n            }\r\n\r\n            return obj;\r\n        }\r\n\r\n        /**\r\n         * Open the calendar\r\n         */\r\n        obj.open = function (value) {\r\n            if (!calendar.classList.contains('jcalendar-focus')) {\r\n                if (!calendar.classList.contains('jcalendar-inline')) {\r\n                    // Current\r\n                    Component.current = obj;\r\n                    // Start tracking\r\n                    tracking(obj, true);\r\n                    // Create the days\r\n                    obj.getDays();\r\n                    // Render months\r\n                    if (obj.options.type == 'year-month-picker') {\r\n                        obj.getMonths();\r\n                    }\r\n                    // Get time\r\n                    if (obj.options.time) {\r\n                        calendarSelectHour.value = obj.date[3];\r\n                        calendarSelectMin.value = obj.date[4];\r\n                    }\r\n\r\n                    // Show calendar\r\n                    calendar.classList.add('jcalendar-focus');\r\n\r\n                    // Get the position of the corner helper\r\n                    if (helpers.getWindowWidth() < 800 || obj.options.fullscreen) {\r\n                        calendar.classList.add('jcalendar-fullsize');\r\n                        // Animation\r\n                        animation.slideBottom(calendarContent, 1);\r\n                    } else {\r\n                        calendar.classList.remove('jcalendar-fullsize');\r\n\r\n                        var rect = el.getBoundingClientRect();\r\n                        var rectContent = calendarContent.getBoundingClientRect();\r\n\r\n                        if (obj.options.position) {\r\n                            calendarContainer.style.position = 'fixed';\r\n                            if (window.innerHeight < rect.bottom + rectContent.height) {\r\n                                calendarContainer.style.top = (rect.top - (rectContent.height + 2)) + 'px';\r\n                            } else {\r\n                                calendarContainer.style.top = (rect.top + rect.height + 2) + 'px';\r\n                            }\r\n                            calendarContainer.style.left = rect.left + 'px';\r\n                        } else {\r\n                            if (window.innerHeight < rect.bottom + rectContent.height) {\r\n                                var d = -1 * (rect.height + rectContent.height + 2);\r\n                                if (d + rect.top < 0) {\r\n                                    d = -1 * (rect.top + rect.height);\r\n                                }\r\n                                calendarContainer.style.top = d + 'px';\r\n                            } else {\r\n                                calendarContainer.style.top = 2 + 'px';\r\n                            }\r\n\r\n                            if (window.innerWidth < rect.left + rectContent.width) {\r\n                                var d = window.innerWidth - (rect.left + rectContent.width + 20);\r\n                                calendarContainer.style.left = d + 'px';\r\n                            } else {\r\n                                calendarContainer.style.left = '0px';\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Events\r\n                    if (typeof (obj.options.onopen) == 'function') {\r\n                        obj.options.onopen(el);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.close = function (ignoreEvents, update) {\r\n            if (obj.options.autoSelect !== true && typeof(update) === 'undefined') {\r\n                update = false;\r\n            }\r\n            if (calendar.classList.contains('jcalendar-focus')) {\r\n                if (update !== false) {\r\n                    var element = calendar.querySelector('.jcalendar-selected');\r\n\r\n                    if (typeof (update) == 'string') {\r\n                        var value = update;\r\n                    } else if (!element || element.classList.contains('jcalendar-disabled')) {\r\n                        var value = obj.options.value\r\n                    } else {\r\n                        var value = obj.getValue();\r\n                    }\r\n\r\n                    obj.setValue(value);\r\n                } else {\r\n                    let value = obj.options.value || '';\r\n                    obj.options.value = null;\r\n                    obj.setValue(value)\r\n                }\r\n\r\n                // Events\r\n                if (!ignoreEvents && typeof (obj.options.onclose) == 'function') {\r\n                    obj.options.onclose(el);\r\n                }\r\n                // Hide\r\n                calendar.classList.remove('jcalendar-focus');\r\n                // Stop tracking\r\n                tracking(obj, false);\r\n                // Current\r\n                Component.current = null;\r\n            }\r\n\r\n            return obj.options.value;\r\n        }\r\n\r\n        obj.prev = function () {\r\n            // Check if the visualization is the days picker or years picker\r\n            if (obj.options.mode == 'years') {\r\n                obj.date[0] = obj.date[0] - 12;\r\n\r\n                // Update picker table of days\r\n                obj.getYears();\r\n            } else if (obj.options.mode == 'months') {\r\n                obj.date[0] = parseInt(obj.date[0]) - 1;\r\n                // Update picker table of months\r\n                obj.getMonths();\r\n            } else {\r\n                // Go to the previous month\r\n                if (obj.date[1] < 2) {\r\n                    obj.date[0] = obj.date[0] - 1;\r\n                    obj.date[1] = 12;\r\n                } else {\r\n                    obj.date[1] = obj.date[1] - 1;\r\n                }\r\n\r\n                // Update picker table of days\r\n                obj.getDays();\r\n            }\r\n        }\r\n\r\n        obj.next = function () {\r\n            // Check if the visualization is the days picker or years picker\r\n            if (obj.options.mode == 'years') {\r\n                obj.date[0] = parseInt(obj.date[0]) + 12;\r\n\r\n                // Update picker table of days\r\n                obj.getYears();\r\n            } else if (obj.options.mode == 'months') {\r\n                obj.date[0] = parseInt(obj.date[0]) + 1;\r\n                // Update picker table of months\r\n                obj.getMonths();\r\n            } else {\r\n                // Go to the previous month\r\n                if (obj.date[1] > 11) {\r\n                    obj.date[0] = parseInt(obj.date[0]) + 1;\r\n                    obj.date[1] = 1;\r\n                } else {\r\n                    obj.date[1] = parseInt(obj.date[1]) + 1;\r\n                }\r\n\r\n                // Update picker table of days\r\n                obj.getDays();\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Set today\r\n         */\r\n        obj.setToday = function () {\r\n            // Today\r\n            var value = new Date().toISOString().substr(0, 10);\r\n            // Change value\r\n            obj.setValue(value);\r\n            // Value\r\n            return value;\r\n        }\r\n\r\n        obj.setValue = function (val) {\r\n            if (!val) {\r\n                val = '' + val;\r\n            }\r\n            // Values\r\n            var newValue = val;\r\n            var oldValue = obj.options.value;\r\n\r\n            if (oldValue != newValue) {\r\n                // Set label\r\n                if (!newValue) {\r\n                    obj.date = null;\r\n                    var val = '';\r\n                    el.classList.remove('jcalendar_warning');\r\n                    el.title = '';\r\n                } else {\r\n                    var value = obj.setLabel(newValue, obj.options);\r\n                    var date = newValue.split(' ');\r\n                    if (!date[1]) {\r\n                        date[1] = '00:00:00';\r\n                    }\r\n                    var time = date[1].split(':')\r\n                    var date = date[0].split('-');\r\n                    var y = parseInt(date[0]);\r\n                    var m = parseInt(date[1]);\r\n                    var d = parseInt(date[2]);\r\n                    var h = parseInt(time[0]);\r\n                    var i = parseInt(time[1]);\r\n                    obj.date = [y, m, d, h, i, 0];\r\n                    var val = obj.setLabel(newValue, obj.options);\r\n\r\n                    // Current selection day\r\n                    var current = Component.now(new Date(y, m - 1, d), true);\r\n\r\n                    // Available ranges\r\n                    if (obj.options.validRange) {\r\n                        if (!obj.options.validRange[0] || current >= obj.options.validRange[0]) {\r\n                            var test1 = true;\r\n                        } else {\r\n                            var test1 = false;\r\n                        }\r\n\r\n                        if (!obj.options.validRange[1] || current <= obj.options.validRange[1]) {\r\n                            var test2 = true;\r\n                        } else {\r\n                            var test2 = false;\r\n                        }\r\n\r\n                        if (!(test1 && test2)) {\r\n                            el.classList.add('jcalendar_warning');\r\n                            el.title = dictionary.translate('Date outside the valid range');\r\n                        } else {\r\n                            el.classList.remove('jcalendar_warning');\r\n                            el.title = '';\r\n                        }\r\n                    } else {\r\n                        el.classList.remove('jcalendar_warning');\r\n                        el.title = '';\r\n                    }\r\n                }\r\n\r\n                // New value\r\n                obj.options.value = newValue;\r\n\r\n                if (typeof (obj.options.onchange) == 'function') {\r\n                    obj.options.onchange(el, newValue, oldValue);\r\n                }\r\n\r\n                // Lemonade JS\r\n                if (el.value != val) {\r\n                    el.value = val;\r\n                    if (typeof (el.oninput) == 'function') {\r\n                        el.oninput({\r\n                            type: 'input',\r\n                            target: el,\r\n                            value: el.value\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (obj.date) {\r\n                obj.getDays();\r\n                // Render months\r\n                if (obj.options.type == 'year-month-picker') {\r\n                    obj.getMonths();\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.getValue = function () {\r\n            if (obj.date) {\r\n                if (obj.options.time) {\r\n                    return helpers.two(obj.date[0]) + '-' + helpers.two(obj.date[1]) + '-' + helpers.two(obj.date[2]) + ' ' + helpers.two(obj.date[3]) + ':' + helpers.two(obj.date[4]) + ':' + helpers.two(0);\r\n                } else {\r\n                    return helpers.two(obj.date[0]) + '-' + helpers.two(obj.date[1]) + '-' + helpers.two(obj.date[2]) + ' ' + helpers.two(0) + ':' + helpers.two(0) + ':' + helpers.two(0);\r\n                }\r\n            } else {\r\n                return \"\";\r\n            }\r\n        }\r\n\r\n        /**\r\n         *  Calendar\r\n         */\r\n        obj.update = function (element, v) {\r\n            if (element.classList.contains('jcalendar-disabled')) {\r\n                // Do nothing\r\n            } else {\r\n                var elements = calendar.querySelector('.jcalendar-selected');\r\n                if (elements) {\r\n                    elements.classList.remove('jcalendar-selected');\r\n                }\r\n                element.classList.add('jcalendar-selected');\r\n\r\n                if (element.classList.contains('jcalendar-set-month')) {\r\n                    obj.date[1] = v;\r\n                    obj.date[2] = 1; // first day of the month\r\n                } else {\r\n                    obj.date[2] = element.innerText;\r\n                }\r\n\r\n                if (!obj.options.time) {\r\n                    obj.close(null, true);\r\n                } else {\r\n                    obj.date[3] = calendarSelectHour.value;\r\n                    obj.date[4] = calendarSelectMin.value;\r\n                }\r\n            }\r\n\r\n            // Update\r\n            updateActions();\r\n        }\r\n\r\n        /**\r\n         * Set to blank\r\n         */\r\n        obj.reset = function () {\r\n            // Close calendar\r\n            obj.setValue('');\r\n            obj.date = null;\r\n            obj.close(false, false);\r\n        }\r\n\r\n        /**\r\n         * Get calendar days\r\n         */\r\n        obj.getDays = function () {\r\n            // Mode\r\n            obj.options.mode = 'days';\r\n\r\n            // Setting current values in case of NULLs\r\n            var date = new Date();\r\n\r\n            // Current selection\r\n            var year = obj.date && helpers.isNumeric(obj.date[0]) ? obj.date[0] : parseInt(date.getFullYear());\r\n            var month = obj.date && helpers.isNumeric(obj.date[1]) ? obj.date[1] : parseInt(date.getMonth()) + 1;\r\n            var day = obj.date && helpers.isNumeric(obj.date[2]) ? obj.date[2] : parseInt(date.getDate());\r\n            var hour = obj.date && helpers.isNumeric(obj.date[3]) ? obj.date[3] : parseInt(date.getHours());\r\n            var min = obj.date && helpers.isNumeric(obj.date[4]) ? obj.date[4] : parseInt(date.getMinutes());\r\n\r\n            // Selection container\r\n            obj.date = [year, month, day, hour, min, 0];\r\n\r\n            // Update title\r\n            calendarLabelYear.innerHTML = year;\r\n            calendarLabelMonth.innerHTML = obj.options.months[month - 1];\r\n\r\n            // Current month and Year\r\n            var isCurrentMonthAndYear = (date.getMonth() == month - 1) && (date.getFullYear() == year) ? true : false;\r\n            var currentDay = date.getDate();\r\n\r\n            // Number of days in the month\r\n            var date = new Date(year, month, 0, 0, 0);\r\n            var numberOfDays = date.getDate();\r\n\r\n            // First day\r\n            var date = new Date(year, month - 1, 0, 0, 0);\r\n            var firstDay = date.getDay() + 1;\r\n\r\n            // Index value\r\n            var index = obj.options.startingDay || 0;\r\n\r\n            // First of day relative to the starting calendar weekday\r\n            firstDay = firstDay - index;\r\n\r\n            // Reset table\r\n            calendarBody.innerHTML = '';\r\n\r\n            // Weekdays Row\r\n            var row = document.createElement('tr');\r\n            row.setAttribute('align', 'center');\r\n            calendarBody.appendChild(row);\r\n\r\n            // Create weekdays row\r\n            for (var i = 0; i < 7; i++) {\r\n                var cell = document.createElement('td');\r\n                cell.classList.add('jcalendar-weekday')\r\n                cell.innerHTML = obj.options.weekdays[index].substr(0, 1);\r\n                row.appendChild(cell);\r\n                // Next week day\r\n                index++;\r\n                // Restart index\r\n                if (index > 6) {\r\n                    index = 0;\r\n                }\r\n            }\r\n\r\n            // Index of days\r\n            var index = 0;\r\n            var d = 0;\r\n\r\n            // Calendar table\r\n            for (var j = 0; j < 6; j++) {\r\n                // Reset cells container\r\n                var row = document.createElement('tr');\r\n                row.setAttribute('align', 'center');\r\n                row.style.height = '34px';\r\n\r\n                // Create cells\r\n                for (var i = 0; i < 7; i++) {\r\n                    // Create cell\r\n                    var cell = document.createElement('td');\r\n                    cell.classList.add('jcalendar-set-day');\r\n\r\n                    if (index >= firstDay && index < (firstDay + numberOfDays)) {\r\n                        // Day cell\r\n                        d++;\r\n                        cell.innerHTML = d;\r\n\r\n                        // Selected\r\n                        if (d == day) {\r\n                            cell.classList.add('jcalendar-selected');\r\n                        }\r\n\r\n                        // Current selection day is today\r\n                        if (isCurrentMonthAndYear && currentDay == d) {\r\n                            cell.style.fontWeight = 'bold';\r\n                        }\r\n\r\n                        // Current selection day\r\n                        var current = Component.now(new Date(year, month - 1, d), true);\r\n\r\n                        // Available ranges\r\n                        if (obj.options.validRange) {\r\n                            if (!obj.options.validRange[0] || current >= obj.options.validRange[0]) {\r\n                                var test1 = true;\r\n                            } else {\r\n                                var test1 = false;\r\n                            }\r\n\r\n                            if (!obj.options.validRange[1] || current <= obj.options.validRange[1]) {\r\n                                var test2 = true;\r\n                            } else {\r\n                                var test2 = false;\r\n                            }\r\n\r\n                            if (!(test1 && test2)) {\r\n                                cell.classList.add('jcalendar-disabled');\r\n                            }\r\n                        }\r\n                    }\r\n                    // Day cell\r\n                    row.appendChild(cell);\r\n                    // Index\r\n                    index++;\r\n                }\r\n\r\n                // Add cell to the calendar body\r\n                calendarBody.appendChild(row);\r\n            }\r\n\r\n            // Show time controls\r\n            if (obj.options.time) {\r\n                calendarControlsTime.style.display = '';\r\n            } else {\r\n                calendarControlsTime.style.display = 'none';\r\n            }\r\n\r\n            // Update\r\n            updateActions();\r\n        }\r\n\r\n        obj.getMonths = function () {\r\n            // Mode\r\n            obj.options.mode = 'months';\r\n\r\n            // Loading month labels\r\n            var months = obj.options.months;\r\n\r\n            // Value\r\n            var value = obj.options.value;\r\n\r\n            // Current date\r\n            var date = new Date();\r\n            var currentYear = parseInt(date.getFullYear());\r\n            var currentMonth = parseInt(date.getMonth()) + 1;\r\n            var selectedYear = obj.date && helpers.isNumeric(obj.date[0]) ? obj.date[0] : currentYear;\r\n            var selectedMonth = obj.date && helpers.isNumeric(obj.date[1]) ? obj.date[1] : currentMonth;\r\n\r\n            // Update title\r\n            calendarLabelYear.innerHTML = obj.date[0];\r\n            calendarLabelMonth.innerHTML = months[selectedMonth - 1];\r\n\r\n            // Table\r\n            var table = document.createElement('table');\r\n            table.setAttribute('width', '100%');\r\n\r\n            // Row\r\n            var row = null;\r\n\r\n            // Calendar table\r\n            for (var i = 0; i < 12; i++) {\r\n                if (!(i % 4)) {\r\n                    // Reset cells container\r\n                    var row = document.createElement('tr');\r\n                    row.setAttribute('align', 'center');\r\n                    table.appendChild(row);\r\n                }\r\n\r\n                // Create cell\r\n                var cell = document.createElement('td');\r\n                cell.classList.add('jcalendar-set-month');\r\n                cell.setAttribute('data-value', i + 1);\r\n                cell.innerText = months[i];\r\n\r\n                if (obj.options.validRange) {\r\n                    var current = selectedYear + '-' + helpers.two(i + 1);\r\n                    if (!obj.options.validRange[0] || current >= obj.options.validRange[0].substr(0, 7)) {\r\n                        var test1 = true;\r\n                    } else {\r\n                        var test1 = false;\r\n                    }\r\n\r\n                    if (!obj.options.validRange[1] || current <= obj.options.validRange[1].substr(0, 7)) {\r\n                        var test2 = true;\r\n                    } else {\r\n                        var test2 = false;\r\n                    }\r\n\r\n                    if (!(test1 && test2)) {\r\n                        cell.classList.add('jcalendar-disabled');\r\n                    }\r\n                }\r\n\r\n                if (i + 1 == selectedMonth) {\r\n                    cell.classList.add('jcalendar-selected');\r\n                }\r\n\r\n                if (currentYear == selectedYear && i + 1 == currentMonth) {\r\n                    cell.style.fontWeight = 'bold';\r\n                }\r\n\r\n                row.appendChild(cell);\r\n            }\r\n\r\n            calendarBody.innerHTML = '<tr><td colspan=\"7\"></td></tr>';\r\n            calendarBody.children[0].children[0].appendChild(table);\r\n\r\n            // Update\r\n            updateActions();\r\n        }\r\n\r\n        obj.getYears = function () {\r\n            // Mode\r\n            obj.options.mode = 'years';\r\n\r\n            // Current date\r\n            var date = new Date();\r\n            var currentYear = date.getFullYear();\r\n            var selectedYear = obj.date && helpers.isNumeric(obj.date[0]) ? obj.date[0] : parseInt(date.getFullYear());\r\n\r\n            // Array of years\r\n            var y = [];\r\n            for (var i = 0; i < 25; i++) {\r\n                y[i] = parseInt(obj.date[0]) + (i - 12);\r\n            }\r\n\r\n            // Assembling the year tables\r\n            var table = document.createElement('table');\r\n            table.setAttribute('width', '100%');\r\n\r\n            for (var i = 0; i < 25; i++) {\r\n                if (!(i % 5)) {\r\n                    // Reset cells container\r\n                    var row = document.createElement('tr');\r\n                    row.setAttribute('align', 'center');\r\n                    table.appendChild(row);\r\n                }\r\n\r\n                // Create cell\r\n                var cell = document.createElement('td');\r\n                cell.classList.add('jcalendar-set-year');\r\n                cell.innerText = y[i];\r\n\r\n                if (selectedYear == y[i]) {\r\n                    cell.classList.add('jcalendar-selected');\r\n                }\r\n\r\n                if (currentYear == y[i]) {\r\n                    cell.style.fontWeight = 'bold';\r\n                }\r\n\r\n                row.appendChild(cell);\r\n            }\r\n\r\n            calendarBody.innerHTML = '<tr><td colspan=\"7\"></td></tr>';\r\n            calendarBody.firstChild.firstChild.appendChild(table);\r\n\r\n            // Update\r\n            updateActions();\r\n        }\r\n\r\n        obj.setLabel = function (value, mixed) {\r\n            return Component.getDateString(value, mixed);\r\n        }\r\n\r\n        obj.fromFormatted = function (value, format) {\r\n            return Component.extractDateFromString(value, format);\r\n        }\r\n\r\n        var mouseUpControls = function (e) {\r\n            var element = helpers.findElement(e.target, 'jcalendar-container');\r\n            if (element) {\r\n                var action = e.target.className;\r\n\r\n                // Object id\r\n                if (action == 'jcalendar-prev') {\r\n                    obj.prev();\r\n                } else if (action == 'jcalendar-next') {\r\n                    obj.next();\r\n                } else if (action == 'jcalendar-month') {\r\n                    obj.getMonths();\r\n                } else if (action == 'jcalendar-year') {\r\n                    obj.getYears();\r\n                } else if (action == 'jcalendar-set-year') {\r\n                    obj.date[0] = e.target.innerText;\r\n                    if (obj.options.type == 'year-month-picker') {\r\n                        obj.getMonths();\r\n                    } else {\r\n                        obj.getDays();\r\n                    }\r\n                } else if (e.target.classList.contains('jcalendar-set-month')) {\r\n                    var month = parseInt(e.target.getAttribute('data-value'));\r\n                    if (obj.options.type == 'year-month-picker') {\r\n                        obj.update(e.target, month);\r\n                    } else {\r\n                        obj.date[1] = month;\r\n                        obj.getDays();\r\n                    }\r\n                } else if (action == 'jcalendar-confirm' || action == 'jcalendar-update' || action == 'jcalendar-close') {\r\n                    obj.close(null, true);\r\n                } else if (action == 'jcalendar-backdrop') {\r\n                    obj.close(false, false);\r\n                } else if (action == 'jcalendar-reset') {\r\n                    obj.reset();\r\n                } else if (e.target.classList.contains('jcalendar-set-day') && e.target.innerText) {\r\n                    obj.update(e.target);\r\n                }\r\n            } else {\r\n                obj.close(false, false);\r\n            }\r\n        }\r\n\r\n        var keyUpControls = function (e) {\r\n            if (e.target.value && e.target.value.length > 3) {\r\n                var test = Component.extractDateFromString(e.target.value, obj.options.format);\r\n                if (test) {\r\n                    obj.setValue(test);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Update actions button\r\n        var updateActions = function () {\r\n            var currentDay = calendar.querySelector('.jcalendar-selected');\r\n\r\n            if (currentDay && currentDay.classList.contains('jcalendar-disabled')) {\r\n                calendarControlsUpdateButton.setAttribute('disabled', 'disabled');\r\n                calendarSelectHour.setAttribute('disabled', 'disabled');\r\n                calendarSelectMin.setAttribute('disabled', 'disabled');\r\n            } else {\r\n                calendarControlsUpdateButton.removeAttribute('disabled');\r\n                calendarSelectHour.removeAttribute('disabled');\r\n                calendarSelectMin.removeAttribute('disabled');\r\n            }\r\n\r\n            // Event\r\n            if (typeof (obj.options.onupdate) == 'function') {\r\n                obj.options.onupdate(el, obj.getValue());\r\n            }\r\n        }\r\n\r\n        var calendar = null;\r\n        var calendarReset = null;\r\n        var calendarConfirm = null;\r\n        var calendarContainer = null;\r\n        var calendarContent = null;\r\n        var calendarLabelYear = null;\r\n        var calendarLabelMonth = null;\r\n        var calendarTable = null;\r\n        var calendarBody = null;\r\n\r\n        var calendarControls = null;\r\n        var calendarControlsTime = null;\r\n        var calendarControlsUpdate = null;\r\n        var calendarControlsUpdateButton = null;\r\n        var calendarSelectHour = null;\r\n        var calendarSelectMin = null;\r\n\r\n        var init = function () {\r\n            // Get value from initial element if that is an input\r\n            if (el.tagName == 'INPUT' && el.value) {\r\n                options.value = el.value;\r\n            }\r\n\r\n            // Calendar DOM elements\r\n            calendarReset = document.createElement('div');\r\n            calendarReset.className = 'jcalendar-reset';\r\n\r\n            calendarConfirm = document.createElement('div');\r\n            calendarConfirm.className = 'jcalendar-confirm';\r\n\r\n            calendarControls = document.createElement('div');\r\n            calendarControls.className = 'jcalendar-controls'\r\n            calendarControls.style.borderBottom = '1px solid #ddd';\r\n            calendarControls.appendChild(calendarReset);\r\n            calendarControls.appendChild(calendarConfirm);\r\n\r\n            calendarContainer = document.createElement('div');\r\n            calendarContainer.className = 'jcalendar-container';\r\n            calendarContent = document.createElement('div');\r\n            calendarContent.className = 'jcalendar-content';\r\n            calendarContainer.appendChild(calendarContent);\r\n\r\n            // Main element\r\n            if (el.tagName == 'DIV') {\r\n                calendar = el;\r\n                calendar.classList.add('jcalendar-inline');\r\n            } else {\r\n                // Add controls to the screen\r\n                calendarContent.appendChild(calendarControls);\r\n\r\n                calendar = document.createElement('div');\r\n                calendar.className = 'jcalendar';\r\n            }\r\n            calendar.classList.add('jcalendar-container');\r\n            calendar.appendChild(calendarContainer);\r\n\r\n            // Table container\r\n            var calendarTableContainer = document.createElement('div');\r\n            calendarTableContainer.className = 'jcalendar-table';\r\n            calendarContent.appendChild(calendarTableContainer);\r\n\r\n            // Previous button\r\n            var calendarHeaderPrev = document.createElement('td');\r\n            calendarHeaderPrev.setAttribute('colspan', '2');\r\n            calendarHeaderPrev.className = 'jcalendar-prev';\r\n\r\n            // Header with year and month\r\n            calendarLabelYear = document.createElement('span');\r\n            calendarLabelYear.className = 'jcalendar-year';\r\n            calendarLabelMonth = document.createElement('span');\r\n            calendarLabelMonth.className = 'jcalendar-month';\r\n\r\n            var calendarHeaderTitle = document.createElement('td');\r\n            calendarHeaderTitle.className = 'jcalendar-header';\r\n            calendarHeaderTitle.setAttribute('colspan', '3');\r\n            calendarHeaderTitle.appendChild(calendarLabelMonth);\r\n            calendarHeaderTitle.appendChild(calendarLabelYear);\r\n\r\n            var calendarHeaderNext = document.createElement('td');\r\n            calendarHeaderNext.setAttribute('colspan', '2');\r\n            calendarHeaderNext.className = 'jcalendar-next';\r\n\r\n            var calendarHeader = document.createElement('thead');\r\n            var calendarHeaderRow = document.createElement('tr');\r\n            calendarHeaderRow.appendChild(calendarHeaderPrev);\r\n            calendarHeaderRow.appendChild(calendarHeaderTitle);\r\n            calendarHeaderRow.appendChild(calendarHeaderNext);\r\n            calendarHeader.appendChild(calendarHeaderRow);\r\n\r\n            calendarTable = document.createElement('table');\r\n            calendarBody = document.createElement('tbody');\r\n            calendarTable.setAttribute('cellpadding', '0');\r\n            calendarTable.setAttribute('cellspacing', '0');\r\n            calendarTable.appendChild(calendarHeader);\r\n            calendarTable.appendChild(calendarBody);\r\n            calendarTableContainer.appendChild(calendarTable);\r\n\r\n            calendarSelectHour = document.createElement('select');\r\n            calendarSelectHour.className = 'jcalendar-select';\r\n            calendarSelectHour.onchange = function () {\r\n                obj.date[3] = this.value;\r\n\r\n                // Event\r\n                if (typeof (obj.options.onupdate) == 'function') {\r\n                    obj.options.onupdate(el, obj.getValue());\r\n                }\r\n            }\r\n\r\n                for (var i = 0; i < 24; i++) {\r\n                    var element = document.createElement('option');\r\n                    element.value = i;\r\n                    element.innerHTML = helpers.two(i);\r\n                    calendarSelectHour.appendChild(element);\r\n                }\r\n\r\n            calendarSelectMin = document.createElement('select');\r\n            calendarSelectMin.className = 'jcalendar-select';\r\n            calendarSelectMin.onchange = function () {\r\n                obj.date[4] = this.value;\r\n\r\n                // Event\r\n                if (typeof (obj.options.onupdate) == 'function') {\r\n                    obj.options.onupdate(el, obj.getValue());\r\n                }\r\n            }\r\n\r\n            for (var i = 0; i < 60; i++) {\r\n                var element = document.createElement('option');\r\n                element.value = i;\r\n                element.innerHTML = helpers.two(i);\r\n                calendarSelectMin.appendChild(element);\r\n            }\r\n\r\n            // Footer controls\r\n            var calendarControlsFooter = document.createElement('div');\r\n            calendarControlsFooter.className = 'jcalendar-controls';\r\n\r\n            calendarControlsTime = document.createElement('div');\r\n            calendarControlsTime.className = 'jcalendar-time';\r\n            calendarControlsTime.style.maxWidth = '140px';\r\n            calendarControlsTime.appendChild(calendarSelectHour);\r\n            calendarControlsTime.appendChild(calendarSelectMin);\r\n\r\n            calendarControlsUpdateButton = document.createElement('button');\r\n            calendarControlsUpdateButton.setAttribute('type', 'button');\r\n            calendarControlsUpdateButton.className = 'jcalendar-update';\r\n\r\n            calendarControlsUpdate = document.createElement('div');\r\n            calendarControlsUpdate.style.flexGrow = '10';\r\n            calendarControlsUpdate.appendChild(calendarControlsUpdateButton);\r\n            calendarControlsFooter.appendChild(calendarControlsTime);\r\n\r\n            // Only show the update button for input elements\r\n            if (el.tagName == 'INPUT') {\r\n                calendarControlsFooter.appendChild(calendarControlsUpdate);\r\n            }\r\n\r\n            calendarContent.appendChild(calendarControlsFooter);\r\n\r\n            var calendarBackdrop = document.createElement('div');\r\n            calendarBackdrop.className = 'jcalendar-backdrop';\r\n            calendar.appendChild(calendarBackdrop);\r\n\r\n            // Handle events\r\n            el.addEventListener(\"keyup\", keyUpControls);\r\n\r\n            // Add global events\r\n            calendar.addEventListener(\"swipeleft\", function (e) {\r\n                animation.slideLeft(calendarTable, 0, function () {\r\n                    obj.next();\r\n                    animation.slideRight(calendarTable, 1);\r\n                });\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n            });\r\n\r\n            calendar.addEventListener(\"swiperight\", function (e) {\r\n                animation.slideRight(calendarTable, 0, function () {\r\n                    obj.prev();\r\n                    animation.slideLeft(calendarTable, 1);\r\n                });\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n            });\r\n\r\n            if ('ontouchend' in document.documentElement === true) {\r\n                calendar.addEventListener(\"touchend\", mouseUpControls);\r\n                el.addEventListener(\"touchend\", obj.open);\r\n            } else {\r\n                calendar.addEventListener(\"mouseup\", mouseUpControls);\r\n                el.addEventListener(\"mouseup\", obj.open);\r\n            }\r\n\r\n            // Global controls\r\n            if (!Component.hasEvents) {\r\n                // Execute only one time\r\n                Component.hasEvents = true;\r\n                // Enter and Esc\r\n                document.addEventListener(\"keydown\", Component.keydown);\r\n            }\r\n\r\n            // Set configuration\r\n            obj.setOptions(options);\r\n\r\n            // Append element to the DOM\r\n            if (el.tagName == 'INPUT') {\r\n                el.parentNode.insertBefore(calendar, el.nextSibling);\r\n                // Add properties\r\n                el.setAttribute('autocomplete', 'off');\r\n                // Element\r\n                el.classList.add('jcalendar-input');\r\n                // Value\r\n                el.value = obj.setLabel(obj.getValue(), obj.options);\r\n            } else {\r\n                // Get days\r\n                obj.getDays();\r\n                // Hour\r\n                if (obj.options.time) {\r\n                    calendarSelectHour.value = obj.date[3];\r\n                    calendarSelectMin.value = obj.date[4];\r\n                }\r\n            }\r\n\r\n            // Controls - must be set before open() for correct height calculations\r\n            if (obj.options.controls == false) {\r\n                calendarContainer.classList.add('jcalendar-hide-controls');\r\n            }\r\n\r\n            // Default opened\r\n            if (obj.options.opened == true) {\r\n                obj.open();\r\n            }\r\n\r\n            // Change method\r\n            el.change = obj.setValue;\r\n\r\n            // Global generic value handler\r\n            el.val = function (val) {\r\n                if (val === undefined) {\r\n                    return obj.getValue();\r\n                } else {\r\n                    obj.setValue(val);\r\n                }\r\n            }\r\n\r\n            // Keep object available from the node\r\n            el.calendar = calendar.calendar = obj;\r\n        }\r\n\r\n        init();\r\n\r\n        return obj;\r\n    });\r\n\r\n    Component.keydown = function (e) {\r\n        var calendar = null;\r\n        if (calendar = Component.current) {\r\n            if (e.which == 13) {\r\n                // ENTER\r\n                calendar.close(false, true);\r\n            } else if (e.which == 27) {\r\n                // ESC\r\n                calendar.close(false, false);\r\n            }\r\n        }\r\n    }\r\n\r\n    Component.prettify = function (d, texts) {\r\n        if (!texts) {\r\n            var texts = {\r\n                justNow: 'Just now',\r\n                xMinutesAgo: '{0}m ago',\r\n                xHoursAgo: '{0}h ago',\r\n                xDaysAgo: '{0}d ago',\r\n                xWeeksAgo: '{0}w ago',\r\n                xMonthsAgo: '{0} mon ago',\r\n                xYearsAgo: '{0}y ago',\r\n            }\r\n        }\r\n\r\n        if (d.indexOf('GMT') === -1 && d.indexOf('Z') === -1) {\r\n            d += ' GMT';\r\n        }\r\n\r\n        var d1 = new Date();\r\n        var d2 = new Date(d);\r\n        var total = parseInt((d1 - d2) / 1000 / 60);\r\n\r\n        String.prototype.format = function (o) {\r\n            return this.replace('{0}', o);\r\n        }\r\n\r\n        if (total == 0) {\r\n            var text = texts.justNow;\r\n        } else if (total < 90) {\r\n            var text = texts.xMinutesAgo.format(total);\r\n        } else if (total < 1440) { // One day\r\n            var text = texts.xHoursAgo.format(Math.round(total / 60));\r\n        } else if (total < 20160) { // 14 days\r\n            var text = texts.xDaysAgo.format(Math.round(total / 1440));\r\n        } else if (total < 43200) { // 30 days\r\n            var text = texts.xWeeksAgo.format(Math.round(total / 10080));\r\n        } else if (total < 1036800) { // 24 months\r\n            var text = texts.xMonthsAgo.format(Math.round(total / 43200));\r\n        } else { // 24 months+\r\n            var text = texts.xYearsAgo.format(Math.round(total / 525600));\r\n        }\r\n\r\n        return text;\r\n    }\r\n\r\n    Component.prettifyAll = function () {\r\n        var elements = document.querySelectorAll('.prettydate');\r\n        for (var i = 0; i < elements.length; i++) {\r\n            if (elements[i].getAttribute('data-date')) {\r\n                elements[i].innerHTML = Component.prettify(elements[i].getAttribute('data-date'));\r\n            } else {\r\n                if (elements[i].innerHTML) {\r\n                    elements[i].setAttribute('title', elements[i].innerHTML);\r\n                    elements[i].setAttribute('data-date', elements[i].innerHTML);\r\n                    elements[i].innerHTML = Component.prettify(elements[i].innerHTML);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    Component.now = HelpersDate.now;\r\n    Component.toArray = HelpersDate.toArray;\r\n    Component.dateToNum = HelpersDate.dateToNum\r\n    Component.numToDate = HelpersDate.numToDate;\r\n    Component.weekdays = HelpersDate.weekdays;\r\n    Component.months = HelpersDate.months;\r\n    Component.weekdaysShort = HelpersDate.weekdaysShort;\r\n    Component.monthsShort = HelpersDate.monthsShort;\r\n\r\n    // Legacy shortcut\r\n    Component.extractDateFromString = Mask.extractDateFromString;\r\n    Component.getDateString = Mask.getDateString;\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var calendar = (Calendar());\n;// CONCATENATED MODULE: ./src/plugins/palette.js\n// More palettes https://coolors.co/ or https://gka.github.io/palettes/#/10|s|003790,005647,ffffe0|ffffe0,ff005e,93003a|1|1\r\n\r\nfunction Palette() {\r\n\r\n    var palette = {\r\n        material: [\r\n            [\"#ffebee\", \"#fce4ec\", \"#f3e5f5\", \"#e8eaf6\", \"#e3f2fd\", \"#e0f7fa\", \"#e0f2f1\", \"#e8f5e9\", \"#f1f8e9\", \"#f9fbe7\", \"#fffde7\", \"#fff8e1\", \"#fff3e0\", \"#fbe9e7\", \"#efebe9\", \"#fafafa\", \"#eceff1\"],\r\n            [\"#ffcdd2\", \"#f8bbd0\", \"#e1bee7\", \"#c5cae9\", \"#bbdefb\", \"#b2ebf2\", \"#b2dfdb\", \"#c8e6c9\", \"#dcedc8\", \"#f0f4c3\", \"#fff9c4\", \"#ffecb3\", \"#ffe0b2\", \"#ffccbc\", \"#d7ccc8\", \"#f5f5f5\", \"#cfd8dc\"],\r\n            [\"#ef9a9a\", \"#f48fb1\", \"#ce93d8\", \"#9fa8da\", \"#90caf9\", \"#80deea\", \"#80cbc4\", \"#a5d6a7\", \"#c5e1a5\", \"#e6ee9c\", \"#fff59d\", \"#ffe082\", \"#ffcc80\", \"#ffab91\", \"#bcaaa4\", \"#eeeeee\", \"#b0bec5\"],\r\n            [\"#e57373\", \"#f06292\", \"#ba68c8\", \"#7986cb\", \"#64b5f6\", \"#4dd0e1\", \"#4db6ac\", \"#81c784\", \"#aed581\", \"#dce775\", \"#fff176\", \"#ffd54f\", \"#ffb74d\", \"#ff8a65\", \"#a1887f\", \"#e0e0e0\", \"#90a4ae\"],\r\n            [\"#ef5350\", \"#ec407a\", \"#ab47bc\", \"#5c6bc0\", \"#42a5f5\", \"#26c6da\", \"#26a69a\", \"#66bb6a\", \"#9ccc65\", \"#d4e157\", \"#ffee58\", \"#ffca28\", \"#ffa726\", \"#ff7043\", \"#8d6e63\", \"#bdbdbd\", \"#78909c\"],\r\n            [\"#f44336\", \"#e91e63\", \"#9c27b0\", \"#3f51b5\", \"#2196f3\", \"#00bcd4\", \"#009688\", \"#4caf50\", \"#8bc34a\", \"#cddc39\", \"#ffeb3b\", \"#ffc107\", \"#ff9800\", \"#ff5722\", \"#795548\", \"#9e9e9e\", \"#607d8b\"],\r\n            [\"#e53935\", \"#d81b60\", \"#8e24aa\", \"#3949ab\", \"#1e88e5\", \"#00acc1\", \"#00897b\", \"#43a047\", \"#7cb342\", \"#c0ca33\", \"#fdd835\", \"#ffb300\", \"#fb8c00\", \"#f4511e\", \"#6d4c41\", \"#757575\", \"#546e7a\"],\r\n            [\"#d32f2f\", \"#c2185b\", \"#7b1fa2\", \"#303f9f\", \"#1976d2\", \"#0097a7\", \"#00796b\", \"#388e3c\", \"#689f38\", \"#afb42b\", \"#fbc02d\", \"#ffa000\", \"#f57c00\", \"#e64a19\", \"#5d4037\", \"#616161\", \"#455a64\"],\r\n            [\"#c62828\", \"#ad1457\", \"#6a1b9a\", \"#283593\", \"#1565c0\", \"#00838f\", \"#00695c\", \"#2e7d32\", \"#558b2f\", \"#9e9d24\", \"#f9a825\", \"#ff8f00\", \"#ef6c00\", \"#d84315\", \"#4e342e\", \"#424242\", \"#37474f\"],\r\n            [\"#b71c1c\", \"#880e4f\", \"#4a148c\", \"#1a237e\", \"#0d47a1\", \"#006064\", \"#004d40\", \"#1b5e20\", \"#33691e\", \"#827717\", \"#f57f17\", \"#ff6f00\", \"#e65100\", \"#bf360c\", \"#3e2723\", \"#212121\", \"#263238\"],\r\n        ],\r\n        fire: [\r\n            [\"0b1a6d\", \"840f38\", \"b60718\", \"de030b\", \"ff0c0c\", \"fd491c\", \"fc7521\", \"faa331\", \"fbb535\", \"ffc73a\"],\r\n            [\"071147\", \"5f0b28\", \"930513\", \"be0309\", \"ef0000\", \"fa3403\", \"fb670b\", \"f9991b\", \"faad1e\", \"ffc123\"],\r\n            [\"03071e\", \"370617\", \"6a040f\", \"9d0208\", \"d00000\", \"dc2f02\", \"e85d04\", \"f48c06\", \"faa307\", \"ffba08\"],\r\n            [\"020619\", \"320615\", \"61040d\", \"8c0207\", \"bc0000\", \"c82a02\", \"d05203\", \"db7f06\", \"e19405\", \"efab00\"],\r\n            [\"020515\", \"2d0513\", \"58040c\", \"7f0206\", \"aa0000\", \"b62602\", \"b94903\", \"c57205\", \"ca8504\", \"d89b00\"],\r\n        ],\r\n        baby: [\r\n            [\"eddcd2\", \"fff1e6\", \"fde2e4\", \"fad2e1\", \"c5dedd\", \"dbe7e4\", \"f0efeb\", \"d6e2e9\", \"bcd4e6\", \"99c1de\"],\r\n            [\"e1c4b3\", \"ffd5b5\", \"fab6ba\", \"f5a8c4\", \"aacecd\", \"bfd5cf\", \"dbd9d0\", \"baceda\", \"9dc0db\", \"7eb1d5\"],\r\n            [\"daa990\", \"ffb787\", \"f88e95\", \"f282a9\", \"8fc4c3\", \"a3c8be\", \"cec9b3\", \"9dbcce\", \"82acd2\", \"649dcb\"],\r\n            [\"d69070\", \"ff9c5e\", \"f66770\", \"f05f8f\", \"74bbb9\", \"87bfae\", \"c5b993\", \"83aac3\", \"699bca\", \"4d89c2\"],\r\n            [\"c97d5d\", \"f58443\", \"eb4d57\", \"e54a7b\", \"66a9a7\", \"78ae9c\", \"b5a67e\", \"7599b1\", \"5c88b7\", \"4978aa\"],\r\n        ],\r\n        chart: [\r\n            ['#C1D37F', '#4C5454', '#FFD275', '#66586F', '#D05D5B', '#C96480', '#95BF8F', '#6EA240', '#0F0F0E', '#EB8258', '#95A3B3', '#995D81'],\r\n        ],\r\n    }\r\n\r\n    var Component = function (o) {\r\n        // Otherwise get palette value\r\n        if (palette[o]) {\r\n            return palette[o];\r\n        } else {\r\n            return palette.material;\r\n        }\r\n    }\r\n\r\n    Component.get = function (o) {\r\n        // Otherwise get palette value\r\n        if (palette[o]) {\r\n            return palette[o];\r\n        } else {\r\n            return palette;\r\n        }\r\n    }\r\n\r\n    Component.set = function (o, v) {\r\n        palette[o] = v;\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var palette = (Palette());\n;// CONCATENATED MODULE: ./src/plugins/tabs.js\n\r\n\r\n\r\n\r\nfunction Tabs(el, options) {\r\n    var obj = {};\r\n    obj.options = {};\r\n\r\n    // Default configuration\r\n    var defaults = {\r\n        data: [],\r\n        position: null,\r\n        allowCreate: false,\r\n        allowChangePosition: false,\r\n        onclick: null,\r\n        onload: null,\r\n        onchange: null,\r\n        oncreate: null,\r\n        ondelete: null,\r\n        onbeforecreate: null,\r\n        onchangeposition: null,\r\n        animation: false,\r\n        hideHeaders: false,\r\n        padding: null,\r\n        palette: null,\r\n        maxWidth: null,\r\n    }\r\n\r\n    // Loop through the initial configuration\r\n    for (var property in defaults) {\r\n        if (options && options.hasOwnProperty(property)) {\r\n            obj.options[property] = options[property];\r\n        } else {\r\n            obj.options[property] = defaults[property];\r\n        }\r\n    }\r\n\r\n    // Class\r\n    el.classList.add('jtabs');\r\n\r\n    var prev = null;\r\n    var next = null;\r\n    var border = null;\r\n    var header = null;\r\n    var controls = null;\r\n    var add = null;\r\n\r\n    // Event handler references for cleanup\r\n    var headersClickHandler = null;\r\n    var headersContextMenuHandler = null;\r\n\r\n    // Helpers\r\n    const setBorder = function(index) {\r\n        if (obj.options.animation) {\r\n            setTimeout(function() {\r\n                // Guard against destroyed state\r\n                if (!obj.headers || !obj.headers.children[index]) {\r\n                    return;\r\n                }\r\n                let rect = obj.headers.children[index].getBoundingClientRect();\r\n\r\n                if (obj.options.palette === 'modern') {\r\n                    border.style.width = rect.width - 4 + 'px';\r\n                    border.style.left = obj.headers.children[index].offsetLeft + 2 + 'px';\r\n                } else {\r\n                    border.style.width = rect.width + 'px';\r\n                    border.style.left = obj.headers.children[index].offsetLeft + 'px';\r\n                }\r\n\r\n                if (obj.options.position === 'bottom') {\r\n                    border.style.top = '0px';\r\n                } else {\r\n                    border.style.bottom = '0px';\r\n                }\r\n            }, 50);\r\n        }\r\n    }\r\n\r\n    var updateControls = function(x) {\r\n        // Guard against destroyed state\r\n        if (!obj.headers) {\r\n            return;\r\n        }\r\n        if (typeof(obj.headers.scrollTo) == 'function') {\r\n            obj.headers.scrollTo({\r\n                left: x,\r\n                behavior: 'smooth',\r\n            });\r\n        } else {\r\n            obj.headers.scrollLeft = x;\r\n        }\r\n\r\n        if (x <= 1) {\r\n            prev.classList.add('disabled');\r\n        } else {\r\n            prev.classList.remove('disabled');\r\n        }\r\n\r\n        if (x >= obj.headers.scrollWidth - obj.headers.offsetWidth) {\r\n            next.classList.add('disabled');\r\n        } else {\r\n            next.classList.remove('disabled');\r\n        }\r\n\r\n        if (obj.headers.scrollWidth <= obj.headers.offsetWidth) {\r\n            prev.style.display = 'none';\r\n            next.style.display = 'none';\r\n        } else {\r\n            prev.style.display = '';\r\n            next.style.display = '';\r\n        }\r\n    }\r\n\r\n    obj.setBorder = setBorder;\r\n\r\n    // Set value\r\n    obj.open = function(index) {\r\n        // This is to force safari to update the children\r\n        const items = Array.from(obj.content.children);\r\n        if (! obj.content.children[index]) {\r\n            return;\r\n        }\r\n\r\n        var previous = null;\r\n        for (var i = 0; i < obj.headers.children.length; i++) {\r\n            if (obj.headers.children[i].classList.contains('jtabs-selected')) {\r\n                // Current one\r\n                previous = i;\r\n            }\r\n            // Remote selected\r\n            obj.headers.children[i].classList.remove('jtabs-selected');\r\n            obj.headers.children[i].removeAttribute('aria-selected')\r\n            if (obj.content.children[i]) {\r\n                obj.content.children[i].classList.remove('jtabs-selected');\r\n            }\r\n        }\r\n\r\n        obj.headers.children[index].classList.add('jtabs-selected');\r\n        obj.headers.children[index].setAttribute('aria-selected', 'true')\r\n\r\n        if (obj.content.children[index]) {\r\n            obj.content.children[index].classList.add('jtabs-selected');\r\n        }\r\n\r\n        if (previous != index && typeof(obj.options.onchange) == 'function') {\r\n            if (obj.content.children[index]) {\r\n                obj.options.onchange(el, obj, index, obj.headers.children[index], obj.content.children[index]);\r\n            }\r\n        }\r\n\r\n        // Hide\r\n        if (obj.options.hideHeaders == true && (obj.headers.children.length < 3 && obj.options.allowCreate == false)) {\r\n            obj.headers.parentNode.style.display = 'none';\r\n        } else {\r\n            obj.headers.parentNode.style.display = '';\r\n\r\n            var x1 = obj.headers.children[index].offsetLeft;\r\n            var x2 = x1 + obj.headers.children[index].offsetWidth;\r\n            var r1 = obj.headers.scrollLeft;\r\n            var r2 = r1 + obj.headers.offsetWidth;\r\n\r\n            if (! (r1 <= x1 && r2 >= x2)) {\r\n                // Out of the viewport\r\n                updateControls(x1 - 1);\r\n            }\r\n\r\n            // Set border\r\n            setBorder(index);\r\n        }\r\n    }\r\n\r\n    obj.selectIndex = function(a) {\r\n        var index = Array.prototype.indexOf.call(obj.headers.children, a);\r\n        if (index >= 0) {\r\n            obj.open(index);\r\n        }\r\n\r\n        return index;\r\n    }\r\n\r\n    obj.rename = function(i, title) {\r\n        if (! title) {\r\n            title = prompt('New title', obj.headers.children[i].innerText);\r\n        }\r\n        obj.headers.children[i].innerText = title;\r\n        setBorder(obj.getActive());\r\n    }\r\n\r\n    obj.create = function(title, url) {\r\n        if (typeof(obj.options.onbeforecreate) == 'function') {\r\n            var ret = obj.options.onbeforecreate(el, title);\r\n            if (ret === false) {\r\n                return false;\r\n            } else {\r\n                title = ret;\r\n            }\r\n        }\r\n\r\n        var div = obj.appendElement(title);\r\n\r\n        if (typeof(obj.options.oncreate) == 'function') {\r\n            obj.options.oncreate(el, div)\r\n        }\r\n\r\n        setBorder(obj.getActive());\r\n\r\n        return div;\r\n    }\r\n\r\n    obj.remove = function(index) {\r\n        return obj.deleteElement(index);\r\n    }\r\n\r\n    obj.nextNumber = function() {\r\n        var num = 0;\r\n        for (var i = 0; i < obj.headers.children.length; i++) {\r\n            var tmp = obj.headers.children[i].innerText.match(/[0-9].*/);\r\n            if (tmp > num) {\r\n                num = parseInt(tmp);\r\n            }\r\n        }\r\n        if (! num) {\r\n            num = 1;\r\n        } else {\r\n            num++;\r\n        }\r\n\r\n        return num;\r\n    }\r\n\r\n    obj.deleteElement = function(index) {\r\n        let current = obj.getActive();\r\n\r\n        if (! obj.headers.children[index]) {\r\n            return false;\r\n        } else {\r\n            obj.headers.removeChild(obj.headers.children[index]);\r\n            obj.content.removeChild(obj.content.children[index]);\r\n        }\r\n\r\n        if (current === index) {\r\n            obj.open(0);\r\n        } else {\r\n            let current = obj.getActive() || 0;\r\n            setBorder(current);\r\n        }\r\n\r\n        if (typeof(obj.options.ondelete) == 'function') {\r\n            obj.options.ondelete(el, index)\r\n        }\r\n    }\r\n\r\n    obj.appendElement = function(title, cb, openTab, position) {\r\n        if (! title) {\r\n            var title = prompt('Title?', '');\r\n        }\r\n\r\n        if (title) {\r\n            let headerId = helpers.guid();\r\n            let contentId = helpers.guid();\r\n            // Add content\r\n            var div = document.createElement('div');\r\n            div.setAttribute('id', contentId);\r\n            div.setAttribute('role', 'tabpanel');\r\n            div.setAttribute('aria-labelledby', headerId);\r\n\r\n            // Add headers\r\n            var h = document.createElement('div');\r\n            h.setAttribute('id', headerId);\r\n            h.setAttribute('role', 'tab');\r\n            h.setAttribute('aria-controls', contentId);\r\n\r\n            h.textContent = title;\r\n            h.content = div;\r\n\r\n            if (typeof(position) === 'undefined') {\r\n                obj.content.appendChild(div);\r\n                obj.headers.insertBefore(h, obj.headers.lastChild);\r\n            } else {\r\n                let r = obj.content.children[position];\r\n                if (r) {\r\n                    obj.content.insertBefore(div, r);\r\n                } else {\r\n                    obj.content.appendChild(div);\r\n                }\r\n                r = obj.headers.children[position] || obj.headers.lastChild;\r\n                obj.headers.insertBefore(h, r);\r\n            }\r\n\r\n            // Sortable\r\n            if (obj.options.allowChangePosition) {\r\n                h.setAttribute('draggable', 'true');\r\n            }\r\n\r\n            // Open new tab\r\n            if (openTab !== false) {\r\n                // Open new tab\r\n                obj.selectIndex(h);\r\n            }\r\n\r\n            // Callback\r\n            if (typeof(cb) == 'function') {\r\n                cb(div, h);\r\n            }\r\n\r\n            // Return element\r\n            return div;\r\n        }\r\n    }\r\n\r\n    obj.getActive = function() {\r\n        for (var i = 0; i < obj.headers.children.length; i++) {\r\n            if (obj.headers.children[i].classList.contains('jtabs-selected')) {\r\n                return i;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n    obj.updateContent = function(position, newContent) {\r\n        if (typeof newContent !== 'string') {\r\n            var contentItem = newContent;\r\n        } else {\r\n            var contentItem = document.createElement('div');\r\n            contentItem.innerHTML = newContent;\r\n        }\r\n\r\n        if (obj.content.children[position].classList.contains('jtabs-selected')) {\r\n            newContent.classList.add('jtabs-selected');\r\n        }\r\n\r\n        obj.content.replaceChild(newContent, obj.content.children[position]);\r\n\r\n        setBorder();\r\n    }\r\n\r\n    obj.updatePosition = function(f, t, ignoreEvents, openTab) {\r\n        // Ondrop update position of content\r\n        if (f > t) {\r\n            obj.content.insertBefore(obj.content.children[f], obj.content.children[t]);\r\n        } else {\r\n            obj.content.insertBefore(obj.content.children[f], obj.content.children[t].nextSibling);\r\n        }\r\n\r\n        // Open destination tab\r\n        if (openTab !== false) {\r\n            obj.open(t);\r\n        } else {\r\n            const activeIndex = obj.getActive();\r\n\r\n            if (t < activeIndex) {\r\n                obj.setBorder(activeIndex);\r\n            }\r\n        }\r\n\r\n        // Call event\r\n        if (! ignoreEvents && typeof(obj.options.onchangeposition) == 'function') {\r\n            obj.options.onchangeposition(obj.headers, f, t);\r\n        }\r\n    }\r\n\r\n    obj.move = function(f, t, ignoreEvents, openTab) {\r\n        if (f > t) {\r\n            obj.headers.insertBefore(obj.headers.children[f], obj.headers.children[t]);\r\n        } else {\r\n            obj.headers.insertBefore(obj.headers.children[f], obj.headers.children[t].nextSibling);\r\n        }\r\n\r\n        obj.updatePosition(f, t, ignoreEvents, openTab);\r\n    }\r\n\r\n    obj.setBorder = setBorder;\r\n\r\n    obj.init = function() {\r\n        el.textContent = '';\r\n\r\n        // Make sure the component is blank\r\n        obj.headers = document.createElement('div');\r\n        obj.content = document.createElement('div');\r\n        obj.headers.classList.add('jtabs-headers');\r\n        obj.headers.setAttribute('role', 'tablist');\r\n        obj.content.classList.add('jtabs-content');\r\n        obj.content.setAttribute('role', 'region');\r\n        obj.content.setAttribute('aria-label', 'Tab Panels');\r\n\r\n        if (obj.options.palette) {\r\n            el.classList.add('jtabs-modern');\r\n        } else {\r\n            el.classList.remove('jtabs-modern');\r\n        }\r\n\r\n        // Padding\r\n        if (obj.options.padding) {\r\n            obj.content.style.padding = parseInt(obj.options.padding) + 'px';\r\n        }\r\n\r\n        // Header\r\n        header = document.createElement('div');\r\n        header.className = 'jtabs-headers-container';\r\n        header.appendChild(obj.headers);\r\n        if (obj.options.maxWidth) {\r\n            header.style.maxWidth = parseInt(obj.options.maxWidth) + 'px';\r\n        }\r\n\r\n        // Controls\r\n        controls = document.createElement('div');\r\n        controls.className = 'jtabs-controls';\r\n        controls.setAttribute('draggable', 'false');\r\n        header.appendChild(controls);\r\n\r\n        // Append DOM elements\r\n        if (obj.options.position == 'bottom') {\r\n            el.appendChild(obj.content);\r\n            el.appendChild(header);\r\n        } else {\r\n            el.appendChild(header);\r\n            el.appendChild(obj.content);\r\n        }\r\n\r\n        // New button\r\n        if (obj.options.allowCreate == true) {\r\n            add = document.createElement('div');\r\n            add.className = 'jtabs-add';\r\n            add.onclick = function() {\r\n                obj.create();\r\n            }\r\n            controls.appendChild(add);\r\n        }\r\n\r\n        prev = document.createElement('div');\r\n        prev.className = 'jtabs-prev';\r\n        prev.onclick = function() {\r\n            updateControls(obj.headers.scrollLeft - obj.headers.offsetWidth);\r\n        }\r\n        controls.appendChild(prev);\r\n\r\n        next = document.createElement('div');\r\n        next.className = 'jtabs-next';\r\n        next.onclick = function() {\r\n            updateControls(obj.headers.scrollLeft + obj.headers.offsetWidth);\r\n        }\r\n        controls.appendChild(next);\r\n\r\n        // Data\r\n        for (var i = 0; i < obj.options.data.length; i++) {\r\n            // Title\r\n            if (obj.options.data[i].titleElement) {\r\n                var headerItem = obj.options.data[i].titleElement;\r\n            } else {\r\n                var headerItem = document.createElement('div');\r\n            }\r\n            // Icon\r\n            if (obj.options.data[i].icon) {\r\n                var iconContainer = document.createElement('div');\r\n                var icon = document.createElement('i');\r\n                icon.classList.add('material-icons');\r\n                icon.textContent = obj.options.data[i].icon;\r\n                iconContainer.appendChild(icon);\r\n                headerItem.appendChild(iconContainer);\r\n            }\r\n            // Title\r\n            if (obj.options.data[i].title) {\r\n                var title = document.createTextNode(obj.options.data[i].title);\r\n                headerItem.appendChild(title);\r\n            }\r\n            // Width\r\n            if (obj.options.data[i].width) {\r\n                headerItem.style.width = obj.options.data[i].width;\r\n            }\r\n            // Content\r\n            if (obj.options.data[i].contentElement) {\r\n                var contentItem = obj.options.data[i].contentElement;\r\n            } else {\r\n                var contentItem = document.createElement('div');\r\n                contentItem.innerHTML = obj.options.data[i].content;\r\n            }\r\n            obj.headers.appendChild(headerItem);\r\n            obj.content.appendChild(contentItem);\r\n        }\r\n\r\n        // Animation\r\n        border = document.createElement('div');\r\n        border.className = 'jtabs-border';\r\n        obj.headers.appendChild(border);\r\n\r\n        if (obj.options.animation) {\r\n            el.classList.add('jtabs-animation');\r\n        }\r\n\r\n        // Events\r\n        headersClickHandler = function(e) {\r\n            if (e.target.parentNode.classList.contains('jtabs-headers')) {\r\n                var target = e.target;\r\n            } else {\r\n                if (e.target.tagName == 'I') {\r\n                    var target = e.target.parentNode.parentNode;\r\n                } else {\r\n                    var target = e.target.parentNode;\r\n                }\r\n            }\r\n\r\n            var index = obj.selectIndex(target);\r\n\r\n            if (typeof(obj.options.onclick) == 'function') {\r\n                obj.options.onclick(el, obj, index, obj.headers.children[index], obj.content.children[index]);\r\n            }\r\n        };\r\n        obj.headers.addEventListener(\"click\", headersClickHandler);\r\n\r\n        headersContextMenuHandler = function(e) {\r\n            obj.selectIndex(e.target);\r\n        };\r\n        obj.headers.addEventListener(\"contextmenu\", headersContextMenuHandler);\r\n\r\n        if (obj.headers.children.length) {\r\n            // Open first tab\r\n            obj.open(0);\r\n        }\r\n\r\n        // Update controls\r\n        setTimeout(() => {\r\n            updateControls(0);\r\n        })\r\n\r\n        if (obj.options.allowChangePosition == true) {\r\n            Sorting(obj.headers, {\r\n                direction: 1,\r\n                ondrop: function(a,b,c) {\r\n                    obj.updatePosition(b,c);\r\n                },\r\n            });\r\n        }\r\n\r\n        if (typeof(obj.options.onload) == 'function') {\r\n            obj.options.onload(el, obj);\r\n        }\r\n    }\r\n\r\n    // Loading existing nodes as the data\r\n    if (el.children[0] && el.children[0].children.length) {\r\n        // Create from existing elements\r\n        for (var i = 0; i < el.children[0].children.length; i++) {\r\n            var item = obj.options.data && obj.options.data[i] ? obj.options.data[i] : {};\r\n\r\n            if (el.children[1] && el.children[1].children[i]) {\r\n                item.titleElement = el.children[0].children[i];\r\n                item.contentElement = el.children[1].children[i];\r\n            } else {\r\n                item.contentElement = el.children[0].children[i];\r\n            }\r\n\r\n            obj.options.data[i] = item;\r\n        }\r\n    }\r\n\r\n    // Remote controller flag\r\n    var loadingRemoteData = false;\r\n\r\n    // Create from data\r\n    if (obj.options.data) {\r\n        // Append children\r\n        for (var i = 0; i < obj.options.data.length; i++) {\r\n            if (obj.options.data[i].url) {\r\n                ajax({\r\n                    url: obj.options.data[i].url,\r\n                    type: 'GET',\r\n                    dataType: 'text/html',\r\n                    index: i,\r\n                    success: function(result) {\r\n                        obj.options.data[this.index].content = result;\r\n                    },\r\n                    complete: function() {\r\n                        obj.init();\r\n                    }\r\n                });\r\n\r\n                // Flag loading\r\n                loadingRemoteData = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (! loadingRemoteData) {\r\n        obj.init();\r\n    }\r\n\r\n    /**\r\n     * Destroy the tabs instance and release all resources\r\n     */\r\n    obj.destroy = function() {\r\n        // Remove event listeners from headers\r\n        if (obj.headers) {\r\n            if (headersClickHandler) {\r\n                obj.headers.removeEventListener('click', headersClickHandler);\r\n            }\r\n            if (headersContextMenuHandler) {\r\n                obj.headers.removeEventListener('contextmenu', headersContextMenuHandler);\r\n            }\r\n        }\r\n\r\n        // Clear onclick handlers\r\n        if (prev) {\r\n            prev.onclick = null;\r\n        }\r\n        if (next) {\r\n            next.onclick = null;\r\n        }\r\n        if (add) {\r\n            add.onclick = null;\r\n        }\r\n\r\n        // Remove DOM elements\r\n        if (header && header.parentNode) {\r\n            header.parentNode.removeChild(header);\r\n        }\r\n        if (obj.content && obj.content.parentNode) {\r\n            obj.content.parentNode.removeChild(obj.content);\r\n        }\r\n\r\n        // Remove class from element\r\n        el.classList.remove('jtabs');\r\n        el.classList.remove('jtabs-animation');\r\n        el.classList.remove('jtabs-modern');\r\n\r\n        // Remove instance reference\r\n        delete el.tabs;\r\n\r\n        // Clear options callbacks to release closures\r\n        if (obj.options) {\r\n            obj.options.onclick = null;\r\n            obj.options.onload = null;\r\n            obj.options.onchange = null;\r\n            obj.options.oncreate = null;\r\n            obj.options.ondelete = null;\r\n            obj.options.onbeforecreate = null;\r\n            obj.options.onchangeposition = null;\r\n        }\r\n\r\n        // Clear references\r\n        obj.headers = null;\r\n        obj.content = null;\r\n        header = null;\r\n        controls = null;\r\n        prev = null;\r\n        next = null;\r\n        border = null;\r\n        add = null;\r\n        headersClickHandler = null;\r\n        headersContextMenuHandler = null;\r\n    }\r\n\r\n    el.tabs = obj;\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/color.js\n\r\n\r\n\r\n\r\n\r\n\r\nfunction Color(el, options) {\r\n    // Already created, update options\r\n    if (el.color) {\r\n        return el.color.setOptions(options, true);\r\n    }\r\n\r\n    // New instance\r\n    var obj = { type: 'color' };\r\n    obj.options = {};\r\n\r\n    var container = null;\r\n    var backdrop = null;\r\n    var content = null;\r\n    var resetButton = null;\r\n    var closeButton = null;\r\n    var tabs = null;\r\n    var jsuitesTabs = null;\r\n\r\n    /**\r\n     * Update options\r\n     */\r\n    obj.setOptions = function(options, reset) {\r\n        /**\r\n         * @typedef {Object} defaults\r\n         * @property {(string|Array)} value - Initial value of the compontent\r\n         * @property {string} placeholder - The default instruction text on the element\r\n         * @property {requestCallback} onchange - Method to be execute after any changes on the element\r\n         * @property {requestCallback} onclose - Method to be execute when the element is closed\r\n         * @property {string} doneLabel - Label for button done\r\n         * @property {string} resetLabel - Label for button reset\r\n         * @property {string} resetValue - Value for button reset\r\n         * @property {Bool} showResetButton - Active or note for button reset - default false\r\n         */\r\n        var defaults = {\r\n            placeholder: '',\r\n            value: null,\r\n            onopen: null,\r\n            onclose: null,\r\n            onchange: null,\r\n            closeOnChange: true,\r\n            palette: null,\r\n            position: null,\r\n            doneLabel: 'Done',\r\n            resetLabel: 'Reset',\r\n            fullscreen: false,\r\n            opened: false,\r\n        }\r\n\r\n        if (! options) {\r\n            options = {};\r\n        }\r\n\r\n        if (options && ! options.palette) {\r\n            // Default palette\r\n            options.palette = palette();\r\n        }\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n                    obj.options[property] = defaults[property];\r\n                }\r\n            }\r\n        }\r\n\r\n        // Update the text of the controls, if they have already been created\r\n        if (resetButton) {\r\n            resetButton.innerHTML = obj.options.resetLabel;\r\n        }\r\n        if (closeButton) {\r\n            closeButton.innerHTML = obj.options.doneLabel;\r\n        }\r\n\r\n        // Update the pallete\r\n        if (obj.options.palette && jsuitesTabs) {\r\n            jsuitesTabs.updateContent(0, table());\r\n        }\r\n\r\n        // Value\r\n        if (typeof obj.options.value === 'string') {\r\n            el.value = obj.options.value;\r\n            if (el.tagName === 'INPUT') {\r\n                el.style.color = el.value;\r\n                el.style.backgroundColor = el.value;\r\n            }\r\n        }\r\n\r\n        // Placeholder\r\n        if (obj.options.placeholder) {\r\n            el.setAttribute('placeholder', obj.options.placeholder);\r\n        } else {\r\n            if (el.getAttribute('placeholder')) {\r\n                el.removeAttribute('placeholder');\r\n            }\r\n        }\r\n\r\n        return obj;\r\n    }\r\n\r\n    obj.select = function(color) {\r\n        // Remove current selected mark\r\n        var selected = container.querySelector('.jcolor-selected');\r\n        if (selected) {\r\n            selected.classList.remove('jcolor-selected');\r\n        }\r\n\r\n        // Mark cell as selected\r\n        if (obj.values[color]) {\r\n            obj.values[color].classList.add('jcolor-selected');\r\n        }\r\n\r\n        obj.options.value = color;\r\n    }\r\n\r\n    /**\r\n     * Open color pallete\r\n     */\r\n    obj.open = function() {\r\n        if (! container.classList.contains('jcolor-focus')) {\r\n            // Start tracking\r\n            tracking(obj, true);\r\n\r\n            // Show color picker\r\n            container.classList.add('jcolor-focus');\r\n\r\n            // Select current color\r\n            if (obj.options.value) {\r\n                obj.select(obj.options.value);\r\n            }\r\n\r\n            // Reset margin\r\n            content.style.marginTop = '';\r\n            content.style.marginLeft = '';\r\n\r\n            var rectContent = content.getBoundingClientRect();\r\n            var availableWidth = helpers.getWindowWidth();\r\n            var availableHeight = helpers.getWindowHeight();\r\n\r\n            if (availableWidth < 800 || obj.options.fullscreen == true) {\r\n                content.classList.add('jcolor-fullscreen');\r\n                animation.slideBottom(content, 1);\r\n                backdrop.style.display = 'block';\r\n            } else {\r\n                if (content.classList.contains('jcolor-fullscreen')) {\r\n                    content.classList.remove('jcolor-fullscreen');\r\n                    backdrop.style.display = '';\r\n                }\r\n\r\n                if (obj.options.position) {\r\n                    content.style.position = 'fixed';\r\n                } else {\r\n                    content.style.position = '';\r\n                }\r\n\r\n                if (rectContent.left + rectContent.width > availableWidth) {\r\n                    content.style.marginLeft = -1 * (rectContent.left + rectContent.width - (availableWidth - 20)) + 'px';\r\n                }\r\n                if (rectContent.top + rectContent.height > availableHeight) {\r\n                    content.style.marginTop = -1 * (rectContent.top + rectContent.height - (availableHeight - 20)) + 'px';\r\n                }\r\n            }\r\n\r\n\r\n            if (typeof(obj.options.onopen) == 'function') {\r\n                obj.options.onopen(el, obj);\r\n            }\r\n\r\n            jsuitesTabs.setBorder(jsuitesTabs.getActive());\r\n\r\n            // Update sliders\r\n            if (obj.options.value) {\r\n                var rgb = HexToRgb(obj.options.value);\r\n\r\n                rgbInputs.forEach(function(rgbInput, index) {\r\n                    rgbInput.value = rgb[index];\r\n                    rgbInput.dispatchEvent(new Event('input'));\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Close color pallete\r\n     */\r\n    obj.close = function(ignoreEvents) {\r\n        if (container && container.classList.contains('jcolor-focus')) {\r\n            // Remove focus\r\n            container.classList.remove('jcolor-focus');\r\n            // Make sure backdrop is hidden\r\n            if (backdrop) {\r\n                backdrop.style.display = '';\r\n            }\r\n            // Call related events\r\n            if (! ignoreEvents && typeof(obj.options.onclose) == 'function') {\r\n                obj.options.onclose(el, obj);\r\n            }\r\n            // Stop  the object\r\n            tracking(obj, false);\r\n        }\r\n\r\n        return obj.options.value ? obj.options.value : null;\r\n    }\r\n\r\n    /**\r\n     * Set value\r\n     */\r\n    obj.setValue = function(color) {\r\n        if (! color) {\r\n            color = '';\r\n        }\r\n\r\n        if (color != obj.options.value) {\r\n            obj.options.value = color;\r\n            slidersResult = color;\r\n\r\n            // Remove current selecded mark\r\n            obj.select(color);\r\n\r\n            // Onchange\r\n            if (typeof(obj.options.onchange) == 'function') {\r\n                obj.options.onchange(el, color, obj);\r\n            }\r\n\r\n            // Changes\r\n            if (el.value != obj.options.value) {\r\n                // Set input value\r\n                el.value = obj.options.value;\r\n                if (el.tagName === 'INPUT') {\r\n                    el.style.color = el.value;\r\n                    el.style.backgroundColor = el.value;\r\n                }\r\n\r\n                // Element onchange native\r\n                if (typeof(el.oninput) == 'function') {\r\n                    el.oninput({\r\n                        type: 'input',\r\n                        target: el,\r\n                        value: el.value\r\n                    });\r\n                }\r\n            }\r\n\r\n            if (obj.options.closeOnChange == true) {\r\n                obj.close();\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get value\r\n     */\r\n    obj.getValue = function() {\r\n        return obj.options.value;\r\n    }\r\n\r\n    var backdropClickControl = false;\r\n\r\n    // Converts a number in decimal to hexadecimal\r\n    var decToHex = function(num) {\r\n        var hex = num.toString(16);\r\n        return hex.length === 1 ? \"0\" + hex : hex;\r\n    }\r\n\r\n    // Converts a color in rgb to hexadecimal\r\n    var rgbToHex = function(r, g, b) {\r\n        return \"#\" + decToHex(r) + decToHex(g) + decToHex(b);\r\n    }\r\n\r\n    // Converts a number in hexadecimal to decimal\r\n    var hexToDec = function(hex) {\r\n        return parseInt('0x' + hex);\r\n    }\r\n\r\n    // Converts a color in hexadecimal to rgb\r\n    var HexToRgb = function(hex) {\r\n        return [hexToDec(hex.substr(1, 2)), hexToDec(hex.substr(3, 2)), hexToDec(hex.substr(5, 2))]\r\n    }\r\n\r\n    var table = function() {\r\n        // Content of the first tab\r\n        var tableContainer = document.createElement('div');\r\n        tableContainer.className = 'jcolor-grid';\r\n\r\n        // Cells\r\n        obj.values = [];\r\n\r\n        // Table pallete\r\n        var t = document.createElement('table');\r\n        t.setAttribute('cellpadding', '7');\r\n        t.setAttribute('cellspacing', '0');\r\n\r\n        for (var j = 0; j < obj.options.palette.length; j++) {\r\n            var tr = document.createElement('tr');\r\n            for (var i = 0; i < obj.options.palette[j].length; i++) {\r\n                var td = document.createElement('td');\r\n                var color = obj.options.palette[j][i];\r\n                if (color.length < 7 && color.substr(0,1) !== '#') {\r\n                    color = '#' + color;\r\n                }\r\n                td.style.backgroundColor = color;\r\n                td.setAttribute('data-value', color);\r\n                td.innerHTML = '';\r\n                tr.appendChild(td);\r\n\r\n                // Selected color\r\n                if (obj.options.value == color) {\r\n                    td.classList.add('jcolor-selected');\r\n                }\r\n\r\n                // Possible values\r\n                obj.values[color] = td;\r\n            }\r\n            t.appendChild(tr);\r\n        }\r\n\r\n        // Append to the table\r\n        tableContainer.appendChild(t);\r\n\r\n        return tableContainer;\r\n    }\r\n\r\n    // Canvas where the image will be rendered\r\n    var canvas = document.createElement('canvas');\r\n    canvas.width = 200;\r\n    canvas.height = 160;\r\n    var context = canvas.getContext(\"2d\");\r\n\r\n    var resizeCanvas = function() {\r\n        // Specifications necessary to correctly obtain colors later in certain positions\r\n        var m = tabs.firstChild.getBoundingClientRect();\r\n        canvas.width = m.width - 14;\r\n        gradient()\r\n    }\r\n\r\n    var gradient = function() {\r\n        var g = context.createLinearGradient(0, 0, canvas.width, 0);\r\n        // Create color gradient\r\n        g.addColorStop(0,    \"rgb(255,0,0)\");\r\n        g.addColorStop(0.15, \"rgb(255,0,255)\");\r\n        g.addColorStop(0.33, \"rgb(0,0,255)\");\r\n        g.addColorStop(0.49, \"rgb(0,255,255)\");\r\n        g.addColorStop(0.67, \"rgb(0,255,0)\");\r\n        g.addColorStop(0.84, \"rgb(255,255,0)\");\r\n        g.addColorStop(1,    \"rgb(255,0,0)\");\r\n        context.fillStyle = g;\r\n        context.fillRect(0, 0, canvas.width, canvas.height);\r\n        g = context.createLinearGradient(0, 0, 0, canvas.height);\r\n        g.addColorStop(0,   \"rgba(255,255,255,1)\");\r\n        g.addColorStop(0.5, \"rgba(255,255,255,0)\");\r\n        g.addColorStop(0.5, \"rgba(0,0,0,0)\");\r\n        g.addColorStop(1,   \"rgba(0,0,0,1)\");\r\n        context.fillStyle = g;\r\n        context.fillRect(0, 0, canvas.width, canvas.height);\r\n    }\r\n\r\n    var hsl = function() {\r\n        var element = document.createElement('div');\r\n        element.className = \"jcolor-hsl\";\r\n\r\n        var point = document.createElement('div');\r\n        point.className = 'jcolor-point';\r\n\r\n        var div = document.createElement('div');\r\n        div.appendChild(canvas);\r\n        div.appendChild(point);\r\n        element.appendChild(div);\r\n\r\n        // Moves the marquee point to the specified position\r\n        var update = function(buttons, x, y) {\r\n            if (buttons === 1) {\r\n                var rect = element.getBoundingClientRect();\r\n                var left = x - rect.left;\r\n                var top = y - rect.top;\r\n                if (left < 0) {\r\n                    left = 0;\r\n                }\r\n                if (top < 0) {\r\n                    top = 0;\r\n                }\r\n                if (left > rect.width) {\r\n                    left = rect.width;\r\n                }\r\n                if (top > rect.height) {\r\n                    top = rect.height;\r\n                }\r\n                point.style.left = left + 'px';\r\n                point.style.top = top + 'px';\r\n                var pixel = context.getImageData(left, top, 1, 1).data;\r\n                slidersResult = rgbToHex(pixel[0], pixel[1], pixel[2]);\r\n            }\r\n        }\r\n\r\n        // Applies the point's motion function to the div that contains it\r\n        element.addEventListener('mousedown', function(e) {\r\n            update(e.buttons, e.clientX, e.clientY);\r\n        });\r\n\r\n        element.addEventListener('mousemove', function(e) {\r\n            update(e.buttons, e.clientX, e.clientY);\r\n        });\r\n\r\n        element.addEventListener('touchmove', function(e) {\r\n            update(1, e.changedTouches[0].clientX, e.changedTouches[0].clientY);\r\n        });\r\n\r\n        return element;\r\n    }\r\n\r\n    var slidersResult = '';\r\n\r\n    var rgbInputs = [];\r\n\r\n    var changeInputColors = function() {\r\n        if (slidersResult !== '') {\r\n            for (var j = 0; j < rgbInputs.length; j++) {\r\n                var currentColor = HexToRgb(slidersResult);\r\n\r\n                currentColor[j] = 0;\r\n\r\n                var newGradient = 'linear-gradient(90deg, rgb(';\r\n                newGradient += currentColor.join(', ');\r\n                newGradient += '), rgb(';\r\n\r\n                currentColor[j] = 255;\r\n\r\n                newGradient += currentColor.join(', ');\r\n                newGradient += '))';\r\n\r\n                rgbInputs[j].style.backgroundImage = newGradient;\r\n            }\r\n        }\r\n    }\r\n\r\n    var sliders = function() {\r\n        // Content of the third tab\r\n        var slidersElement = document.createElement('div');\r\n        slidersElement.className = 'jcolor-sliders';\r\n\r\n        var slidersBody = document.createElement('div');\r\n\r\n        // Creates a range-type input with the specified name\r\n        var createSliderInput = function(name) {\r\n            var inputContainer = document.createElement('div');\r\n            inputContainer.className = 'jcolor-sliders-input-container';\r\n\r\n            var label = document.createElement('label');\r\n            label.innerText = name;\r\n\r\n            var subContainer = document.createElement('div');\r\n            subContainer.className = 'jcolor-sliders-input-subcontainer';\r\n\r\n            var input = document.createElement('input');\r\n            input.type = 'range';\r\n            input.min = 0;\r\n            input.max = 255;\r\n            input.value = 0;\r\n\r\n            input.setAttribute('aria-label', \"Color value\");\r\n            input.setAttribute('aria-valuemin', \"0\");\r\n            input.setAttribute('aria-valuemax', \"255\");\r\n            input.setAttribute('aria-valuenow', \"0\");\r\n\r\n            inputContainer.appendChild(label);\r\n            subContainer.appendChild(input);\r\n\r\n            var value = document.createElement('div');\r\n            value.innerText = input.value;\r\n\r\n            input.addEventListener('input', function() {\r\n                value.innerText = input.value;\r\n            });\r\n\r\n            subContainer.appendChild(value);\r\n            inputContainer.appendChild(subContainer);\r\n\r\n            slidersBody.appendChild(inputContainer);\r\n\r\n            return input;\r\n        }\r\n\r\n        // Creates red, green and blue inputs\r\n        rgbInputs = [\r\n            createSliderInput('Red'),\r\n            createSliderInput('Green'),\r\n            createSliderInput('Blue'),\r\n        ];\r\n\r\n        slidersElement.appendChild(slidersBody);\r\n\r\n        // Element that prints the current color\r\n        var slidersResultColor = document.createElement('div');\r\n        slidersResultColor.className = 'jcolor-sliders-final-color';\r\n\r\n        var resultElement = document.createElement('div');\r\n        resultElement.style.visibility = 'hidden';\r\n        resultElement.innerText = 'a';\r\n        slidersResultColor.appendChild(resultElement)\r\n\r\n        // Update the element that prints the current color\r\n        var updateResult = function() {\r\n            var resultColor = rgbToHex(parseInt(rgbInputs[0].value), parseInt(rgbInputs[1].value), parseInt(rgbInputs[2].value));\r\n\r\n            resultElement.innerText = resultColor;\r\n            resultElement.style.color = resultColor;\r\n            resultElement.style.removeProperty('visibility');\r\n\r\n            slidersResult = resultColor;\r\n        }\r\n\r\n        // Apply the update function to color inputs\r\n        rgbInputs.forEach(function(rgbInput) {\r\n            rgbInput.addEventListener('input', function() {\r\n                updateResult();\r\n                changeInputColors();\r\n            });\r\n        });\r\n\r\n        slidersElement.appendChild(slidersResultColor);\r\n\r\n        return slidersElement;\r\n    }\r\n\r\n    var init = function() {\r\n        // Initial options\r\n        obj.setOptions(options);\r\n\r\n        // Add a proper input tag when the element is an input\r\n        if (el.tagName == 'INPUT') {\r\n            el.classList.add('jcolor-input');\r\n            el.readOnly = true;\r\n        }\r\n\r\n        // Table container\r\n        container = document.createElement('div');\r\n        container.className = 'jcolor';\r\n\r\n        // Table container\r\n        backdrop = document.createElement('div');\r\n        backdrop.className = 'jcolor-backdrop';\r\n        container.appendChild(backdrop);\r\n\r\n        // Content\r\n        content = document.createElement('div');\r\n        content.className = 'jcolor-content';\r\n\r\n        // Controls\r\n        var controls = document.createElement('div');\r\n        controls.className = 'jcolor-controls';\r\n        content.appendChild(controls);\r\n\r\n        // Reset button\r\n        resetButton  = document.createElement('div');\r\n        resetButton.className = 'jcolor-reset';\r\n        resetButton.innerHTML = obj.options.resetLabel;\r\n        controls.appendChild(resetButton);\r\n\r\n        // Close button\r\n        closeButton  = document.createElement('div');\r\n        closeButton.className = 'jcolor-close';\r\n        closeButton.innerHTML = obj.options.doneLabel;\r\n        controls.appendChild(closeButton);\r\n\r\n        // Element that will be used to create the tabs\r\n        tabs = document.createElement('div');\r\n        content.appendChild(tabs);\r\n\r\n        // Starts the jSuites tabs component\r\n        jsuitesTabs = Tabs(tabs, {\r\n            animation: true,\r\n            data: [\r\n                {\r\n                    title: 'Grid',\r\n                    contentElement: table(),\r\n                },\r\n                {\r\n                    title: 'Spectrum',\r\n                    contentElement: hsl(),\r\n                },\r\n                {\r\n                    title: 'Sliders',\r\n                    contentElement: sliders(),\r\n                }\r\n            ],\r\n            onchange: function(element, instance, index) {\r\n                if (index === 1) {\r\n                    resizeCanvas();\r\n                } else {\r\n                    var color = slidersResult !== '' ? slidersResult : obj.getValue();\r\n\r\n                    if (index === 2 && color) {\r\n                        var rgb = HexToRgb(color);\r\n\r\n                        rgbInputs.forEach(function(rgbInput, index) {\r\n                            rgbInput.value = rgb[index];\r\n                            rgbInput.dispatchEvent(new Event('input'));\r\n                        });\r\n                    }\r\n                }\r\n            },\r\n            palette: 'modern',\r\n        });\r\n\r\n        container.appendChild(content);\r\n\r\n        // Insert picker after the element\r\n        if (el.tagName == 'INPUT') {\r\n            el.parentNode.insertBefore(container, el.nextSibling);\r\n        } else {\r\n            el.appendChild(container);\r\n        }\r\n\r\n        containerClickHandler = function(e) {\r\n            if (e.target.tagName == 'TD') {\r\n                var value = e.target.getAttribute('data-value');\r\n                if (value) {\r\n                    obj.setValue(value);\r\n                }\r\n            } else if (e.target.classList.contains('jcolor-reset')) {\r\n                obj.setValue('');\r\n                obj.close();\r\n            } else if (e.target.classList.contains('jcolor-close')) {\r\n                if (jsuitesTabs.getActive() > 0) {\r\n                    obj.setValue(slidersResult);\r\n                }\r\n                obj.close();\r\n            } else if (e.target.classList.contains('jcolor-backdrop')) {\r\n                obj.close();\r\n            } else {\r\n                obj.open();\r\n            }\r\n        };\r\n        container.addEventListener(\"click\", containerClickHandler);\r\n\r\n        /**\r\n         * If element is focus open the picker\r\n         */\r\n        elMouseupHandler = function(e) {\r\n            obj.open();\r\n        };\r\n        el.addEventListener(\"mouseup\", elMouseupHandler);\r\n\r\n        // If the picker is open on the spectrum tab, it changes the canvas size when the window size is changed\r\n        windowResizeHandler = function() {\r\n            if (container.classList.contains('jcolor-focus') && jsuitesTabs.getActive() == 1) {\r\n                resizeCanvas();\r\n            }\r\n        };\r\n        window.addEventListener('resize', windowResizeHandler);\r\n\r\n        // Default opened\r\n        if (obj.options.opened == true) {\r\n            obj.open();\r\n        }\r\n\r\n        // Change\r\n        el.change = obj.setValue;\r\n\r\n        // Global generic value handler\r\n        el.val = function(val) {\r\n            if (val === undefined) {\r\n                return obj.getValue();\r\n            } else {\r\n                obj.setValue(val);\r\n            }\r\n        }\r\n\r\n        // Keep object available from the node\r\n        el.color = obj;\r\n\r\n        // Container shortcut\r\n        container.color = obj;\r\n    }\r\n\r\n    obj.toHex = function(rgb) {\r\n        var hex = function(x) {\r\n            return (\"0\" + parseInt(x).toString(16)).slice(-2);\r\n        }\r\n        if (rgb) {\r\n            if (/^#[0-9A-F]{6}$/i.test(rgb)) {\r\n                return rgb;\r\n            } else {\r\n                rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\r\n                if (rgb && rgb.length) {\r\n                    return \"#\" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);\r\n                } else {\r\n                    return \"\";\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Store event handler references for cleanup\r\n    var containerClickHandler = null;\r\n    var elMouseupHandler = null;\r\n    var windowResizeHandler = null;\r\n\r\n    /**\r\n     * Destroy the color picker instance and release all resources\r\n     */\r\n    obj.destroy = function() {\r\n        // Close if open (removes from tracking)\r\n        obj.close(true);\r\n\r\n        // Remove event listeners\r\n        if (container && containerClickHandler) {\r\n            container.removeEventListener('click', containerClickHandler);\r\n        }\r\n        if (el && elMouseupHandler) {\r\n            el.removeEventListener('mouseup', elMouseupHandler);\r\n        }\r\n        if (windowResizeHandler) {\r\n            window.removeEventListener('resize', windowResizeHandler);\r\n        }\r\n\r\n        // Destroy the tabs component if it has destroy method\r\n        if (jsuitesTabs && typeof jsuitesTabs.destroy === 'function') {\r\n            jsuitesTabs.destroy();\r\n        }\r\n\r\n        // Clear rgbInputs references\r\n        rgbInputs = [];\r\n\r\n        // Remove container from DOM\r\n        if (container && container.parentNode) {\r\n            container.parentNode.removeChild(container);\r\n        }\r\n\r\n        // Clean up element\r\n        if (el.tagName === 'INPUT') {\r\n            el.classList.remove('jcolor-input');\r\n            el.readOnly = false;\r\n            el.style.color = '';\r\n            el.style.backgroundColor = '';\r\n        }\r\n\r\n        // Remove instance properties from el\r\n        delete el.color;\r\n        delete el.change;\r\n        delete el.val;\r\n\r\n        // Clear options callbacks to release closures\r\n        if (obj.options) {\r\n            obj.options.onchange = null;\r\n            obj.options.onclose = null;\r\n            obj.options.onopen = null;\r\n            obj.options.onload = null;\r\n        }\r\n\r\n        // Clear references\r\n        container = null;\r\n        backdrop = null;\r\n        content = null;\r\n        resetButton = null;\r\n        closeButton = null;\r\n        tabs = null;\r\n        jsuitesTabs = null;\r\n    }\r\n\r\n    init();\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/contextmenu.js\n\r\n\r\n\r\nfunction Contextmenu() {\r\n\r\n    var Component = function(el, options) {\r\n        // New instance\r\n        var obj = {type: 'contextmenu'};\r\n        obj.options = {};\r\n\r\n        // Default configuration\r\n        var defaults = {\r\n            items: null,\r\n            onclick: null,\r\n        };\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                obj.options[property] = defaults[property];\r\n            }\r\n        }\r\n\r\n        // Class definition\r\n        el.classList.add('jcontextmenu');\r\n\r\n        /**\r\n         * Open contextmenu\r\n         */\r\n        obj.open = function (e, items) {\r\n            if (items) {\r\n                // Update content\r\n                obj.options.items = items;\r\n                // Create items\r\n                obj.create(items);\r\n            }\r\n\r\n            // Close current contextmenu\r\n            if (Component.current) {\r\n                Component.current.close();\r\n            }\r\n\r\n            // Add to the opened components monitor\r\n            tracking(obj, true);\r\n\r\n            // Show context menu\r\n            el.classList.add('jcontextmenu-focus');\r\n\r\n            // Current\r\n            Component.current = obj;\r\n\r\n            // Coordinates\r\n            if ((obj.options.items && obj.options.items.length > 0) || el.children.length) {\r\n                if (e.target) {\r\n                    if (e.changedTouches && e.changedTouches[0]) {\r\n                        x = e.changedTouches[0].clientX;\r\n                        y = e.changedTouches[0].clientY;\r\n                    } else {\r\n                        var x = e.clientX;\r\n                        var y = e.clientY;\r\n                    }\r\n                } else {\r\n                    var x = e.x;\r\n                    var y = e.y;\r\n                }\r\n\r\n                var rect = el.getBoundingClientRect();\r\n\r\n                if (window.innerHeight < y + rect.height) {\r\n                    var h = y - rect.height;\r\n                    if (h < 0) {\r\n                        h = 0;\r\n                    }\r\n                    el.style.top = h + 'px';\r\n                } else {\r\n                    el.style.top = y + 'px';\r\n                }\r\n\r\n                if (window.innerWidth < x + rect.width) {\r\n                    if (x - rect.width > 0) {\r\n                        el.style.left = (x - rect.width) + 'px';\r\n                    } else {\r\n                        el.style.left = '10px';\r\n                    }\r\n                } else {\r\n                    el.style.left = x + 'px';\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.isOpened = function () {\r\n            return el.classList.contains('jcontextmenu-focus') ? true : false;\r\n        }\r\n\r\n        /**\r\n         * Close menu\r\n         */\r\n        obj.close = function () {\r\n            if (el.classList.contains('jcontextmenu-focus')) {\r\n                el.classList.remove('jcontextmenu-focus');\r\n            }\r\n            tracking(obj, false);\r\n        }\r\n\r\n        /**\r\n         * Create items based on the declared objectd\r\n         * @param {object} items - List of object\r\n         */\r\n        obj.create = function (items) {\r\n            // Update content\r\n            el.innerHTML = '';\r\n\r\n            // Add header contextmenu\r\n            var itemHeader = createHeader();\r\n            el.appendChild(itemHeader);\r\n\r\n            // Append items\r\n            for (var i = 0; i < items.length; i++) {\r\n                var itemContainer = createItemElement(items[i]);\r\n                el.appendChild(itemContainer);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * createHeader for context menu\r\n         * @private\r\n         * @returns {HTMLElement}\r\n         */\r\n        function createHeader() {\r\n            var header = document.createElement('div');\r\n            header.classList.add(\"header\");\r\n            header.addEventListener(\"click\", function (e) {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n            });\r\n            var title = document.createElement('a');\r\n            title.classList.add(\"title\");\r\n            title.innerHTML = dictionary.translate(\"Menu\");\r\n\r\n            header.appendChild(title);\r\n\r\n            var closeButton = document.createElement('a');\r\n            closeButton.classList.add(\"close\");\r\n            closeButton.innerHTML = dictionary.translate(\"close\");\r\n            closeButton.addEventListener(\"click\", function (e) {\r\n                obj.close();\r\n            });\r\n\r\n            header.appendChild(closeButton);\r\n\r\n            return header;\r\n        }\r\n\r\n        /**\r\n         * Private function for create a new Item element\r\n         * @param {type} item\r\n         * @returns {jsuitesL#15.jSuites.contextmenu.createItemElement.itemContainer}\r\n         */\r\n        function createItemElement(item) {\r\n            if (item.type && (item.type == 'line' || item.type == 'divisor')) {\r\n                var itemContainer = document.createElement('hr');\r\n            } else {\r\n                var itemContainer = document.createElement('div');\r\n                var itemText = document.createElement('a');\r\n                itemText.innerHTML = item.title;\r\n\r\n                if (item.tooltip) {\r\n                    itemContainer.setAttribute('title', item.tooltip);\r\n                }\r\n\r\n                if (item.icon) {\r\n                    itemContainer.setAttribute('data-icon', item.icon);\r\n                }\r\n\r\n                if (item.id) {\r\n                    itemContainer.id = item.id;\r\n                }\r\n\r\n                if (item.disabled) {\r\n                    itemContainer.className = 'jcontextmenu-disabled';\r\n                } else if (item.onclick) {\r\n                    let method = item.onclick;\r\n                    itemContainer.addEventListener(\"mousedown\", function (e) {\r\n                        e.preventDefault();\r\n                    });\r\n                    itemContainer.addEventListener(\"mouseup\", function (e) {\r\n                        method(this, e);\r\n                    });\r\n                }\r\n                itemContainer.appendChild(itemText);\r\n\r\n                if (item.submenu) {\r\n                    var itemIconSubmenu = document.createElement('span');\r\n                    itemIconSubmenu.innerHTML = \"&#9658;\";\r\n                    itemContainer.appendChild(itemIconSubmenu);\r\n                    itemContainer.classList.add('jcontexthassubmenu');\r\n                    var el_submenu = document.createElement('div');\r\n                    // Class definition\r\n                    el_submenu.classList.add('jcontextmenu');\r\n                    // Focusable\r\n                    el_submenu.setAttribute('tabindex', '900');\r\n\r\n                    // Append items\r\n                    var submenu = item.submenu;\r\n                    for (var i = 0; i < submenu.length; i++) {\r\n                        var itemContainerSubMenu = createItemElement(submenu[i]);\r\n                        el_submenu.appendChild(itemContainerSubMenu);\r\n                    }\r\n\r\n                    itemContainer.appendChild(el_submenu);\r\n\r\n                    // Submenu positioning logic:\r\n                    // Case 1: Default (enough space to the right) - submenu opens to the right of the parent menu item.\r\n                    // Case 2: Not enough space to the right, but enough to the left - submenu opens to the left of the parent menu item.\r\n                    // Case 3: Not enough space on either side (e.g., very narrow viewport) - submenu opens below the parent menu item.\r\n                    itemContainer.addEventListener('mouseenter', function () {\r\n                        // Reset to default\r\n                        el_submenu.style.left = '';\r\n                        el_submenu.style.right = '';\r\n                        el_submenu.style.minWidth = itemContainer.offsetWidth + 'px';\r\n\r\n                        // Temporarily show submenu to measure\r\n                        el_submenu.style.display = 'block';\r\n                        el_submenu.style.opacity = '0';\r\n                        el_submenu.style.pointerEvents = 'none';\r\n\r\n                        // Use getBoundingClientRect to determine position\r\n                        var parentRect = itemContainer.getBoundingClientRect();\r\n                        var submenuRect = el_submenu.getBoundingClientRect();\r\n                        var viewportWidth = window.innerWidth || document.documentElement.clientWidth;\r\n\r\n                        // Calculate the right edge if rendered to the right\r\n                        var rightEdge = parentRect.right + submenuRect.width;\r\n                        var leftEdge = parentRect.left - submenuRect.width;\r\n\r\n                        // If rendering to the right would overflow, render to the left\r\n                        if (rightEdge > viewportWidth && leftEdge >= 0) {\r\n                            el_submenu.style.left = 'auto';\r\n                            el_submenu.style.right = '99%';\r\n                        } \r\n                        // If both right and left would overflow, render to the right of the left border (worst case)\r\n                        else if (rightEdge > viewportWidth && leftEdge < 0) {\r\n                            el_submenu.style.left = '32px';\r\n                            el_submenu.style.right = 'auto';\r\n                            el_submenu.style.top = '100%';\r\n                        }\r\n                        // Default: render to the right\r\n                        else {\r\n                            el_submenu.style.left = '99%';\r\n                            el_submenu.style.right = 'auto';\r\n                        }\r\n\r\n                        // Restore visibility\r\n                        el_submenu.style.opacity = '';\r\n                        el_submenu.style.pointerEvents = '';\r\n                        el_submenu.style.display = '';\r\n                    });\r\n\r\n                    // Also reset submenu position on mouseleave to avoid stale styles\r\n                    itemContainer.addEventListener('mouseleave', function () {\r\n                        el_submenu.style.left = '';\r\n                        el_submenu.style.right = '';\r\n                        el_submenu.style.minWidth = '';\r\n                    });\r\n                } else if (item.shortcut) {\r\n                    var itemShortCut = document.createElement('span');\r\n                    itemShortCut.innerHTML = item.shortcut;\r\n                    itemContainer.appendChild(itemShortCut);\r\n                }\r\n            }\r\n            return itemContainer;\r\n        }\r\n\r\n        if (typeof (obj.options.onclick) == 'function') {\r\n            el.addEventListener('click', function (e) {\r\n                obj.options.onclick(obj, e);\r\n            });\r\n        }\r\n\r\n        // Create items\r\n        if (obj.options.items) {\r\n            obj.create(obj.options.items);\r\n        }\r\n\r\n        window.addEventListener(\"mousewheel\", function () {\r\n            obj.close();\r\n        });\r\n\r\n        el.contextmenu = obj;\r\n\r\n        return obj;\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var contextmenu = (Contextmenu());\n;// CONCATENATED MODULE: ./src/plugins/dropdown.js\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nfunction Dropdown() {\r\n\r\n    var Component = (function (el, options) {\r\n        // Already created, update options\r\n        if (el.dropdown) {\r\n            return el.dropdown.setOptions(options, true);\r\n        }\r\n\r\n        // New instance\r\n        var obj = {type: 'dropdown'};\r\n        obj.options = {};\r\n\r\n        // Success\r\n        var success = function (data, val) {\r\n            // Set data\r\n            if (data && data.length) {\r\n                // Sort\r\n                if (obj.options.sortResults !== false) {\r\n                    if (typeof obj.options.sortResults == \"function\") {\r\n                        data.sort(obj.options.sortResults);\r\n                    } else {\r\n                        data.sort(sortData);\r\n                    }\r\n                }\r\n\r\n                obj.setData(data);\r\n            }\r\n\r\n            // Onload method\r\n            if (typeof (obj.options.onload) == 'function') {\r\n                obj.options.onload(el, obj, data, val);\r\n            }\r\n\r\n            // Set value\r\n            if (val) {\r\n                applyValue(val);\r\n            }\r\n\r\n            // Component value\r\n            if (val === undefined || val === null) {\r\n                obj.options.value = '';\r\n            }\r\n            el.value = obj.options.value;\r\n\r\n            // Open dropdown\r\n            if (obj.options.opened == true) {\r\n                obj.open();\r\n            }\r\n        }\r\n\r\n\r\n        // Default sort\r\n        var sortData = function (itemA, itemB) {\r\n            var testA, testB;\r\n            if (typeof itemA == \"string\") {\r\n                testA = itemA;\r\n            } else {\r\n                if (itemA.text) {\r\n                    testA = itemA.text;\r\n                } else if (itemA.name) {\r\n                    testA = itemA.name;\r\n                }\r\n            }\r\n\r\n            if (typeof itemB == \"string\") {\r\n                testB = itemB;\r\n            } else {\r\n                if (itemB.text) {\r\n                    testB = itemB.text;\r\n                } else if (itemB.name) {\r\n                    testB = itemB.name;\r\n                }\r\n            }\r\n\r\n            if (typeof testA == \"string\" || typeof testB == \"string\") {\r\n                if (typeof testA != \"string\") {\r\n                    testA = \"\" + testA;\r\n                }\r\n                if (typeof testB != \"string\") {\r\n                    testB = \"\" + testB;\r\n                }\r\n                return testA.localeCompare(testB);\r\n            } else {\r\n                return testA - testB;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Reset the options for the dropdown\r\n         */\r\n        var resetValue = function () {\r\n            // Reset value container\r\n            obj.value = {};\r\n            // Remove selected\r\n            for (var i = 0; i < obj.items.length; i++) {\r\n                if (obj.items[i].selected == true) {\r\n                    if (obj.items[i].element) {\r\n                        obj.items[i].element.classList.remove('jdropdown-selected')\r\n                    }\r\n                    obj.items[i].selected = null;\r\n                }\r\n            }\r\n            // Reset options\r\n            obj.options.value = '';\r\n            // Reset value\r\n            el.value = '';\r\n        }\r\n\r\n        /**\r\n         * Apply values to the dropdown\r\n         */\r\n        var applyValue = function (values) {\r\n            // Reset the current values\r\n            resetValue();\r\n\r\n            // Read values\r\n            if (values !== null) {\r\n                if (!values) {\r\n                    if (typeof (obj.value['']) !== 'undefined') {\r\n                        obj.value[''] = '';\r\n                    }\r\n                } else {\r\n                    if (!Array.isArray(values)) {\r\n                        values = ('' + values).split(';');\r\n                    }\r\n                    for (var i = 0; i < values.length; i++) {\r\n                        obj.value[values[i]] = '';\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Update the DOM\r\n            for (var i = 0; i < obj.items.length; i++) {\r\n                if (typeof (obj.value[Value(i)]) !== 'undefined') {\r\n                    if (obj.items[i].element) {\r\n                        obj.items[i].element.classList.add('jdropdown-selected')\r\n                    }\r\n                    obj.items[i].selected = true;\r\n\r\n                    // Keep label\r\n                    obj.value[Value(i)] = Text(i);\r\n                }\r\n            }\r\n\r\n            // Global value\r\n            obj.options.value = Object.keys(obj.value).join(';');\r\n\r\n            // Update labels\r\n            obj.header.value = obj.getText();\r\n        }\r\n\r\n        // Get the value of one item\r\n        var Value = function (k, v) {\r\n            // Legacy purposes\r\n            if (!obj.options.format) {\r\n                var property = 'value';\r\n            } else {\r\n                var property = 'id';\r\n            }\r\n\r\n            if (obj.items[k]) {\r\n                if (v !== undefined) {\r\n                    return obj.items[k].data[property] = v;\r\n                } else {\r\n                    return obj.items[k].data[property];\r\n                }\r\n            }\r\n\r\n            return '';\r\n        }\r\n\r\n        // Get the label of one item\r\n        var Text = function (k, v) {\r\n            // Legacy purposes\r\n            if (!obj.options.format) {\r\n                var property = 'text';\r\n            } else {\r\n                var property = 'name';\r\n            }\r\n\r\n            if (obj.items[k]) {\r\n                if (v !== undefined) {\r\n                    return obj.items[k].data[property] = v;\r\n                } else {\r\n                    return obj.items[k].data[property];\r\n                }\r\n            }\r\n\r\n            return '';\r\n        }\r\n\r\n        var getValue = function () {\r\n            return Object.keys(obj.value);\r\n        }\r\n\r\n        var getText = function () {\r\n            var data = [];\r\n            var k = Object.keys(obj.value);\r\n            for (var i = 0; i < k.length; i++) {\r\n                data.push(obj.value[k[i]]);\r\n            }\r\n            return data;\r\n        }\r\n\r\n        obj.setOptions = function (options, reset) {\r\n            if (!options) {\r\n                options = {};\r\n            }\r\n\r\n            // Default configuration\r\n            var defaults = {\r\n                url: null,\r\n                data: [],\r\n                format: 0,\r\n                multiple: false,\r\n                autocomplete: false,\r\n                remoteSearch: false,\r\n                lazyLoading: false,\r\n                type: null,\r\n                width: null,\r\n                maxWidth: null,\r\n                opened: false,\r\n                value: null,\r\n                placeholder: '',\r\n                newOptions: false,\r\n                position: false,\r\n                onchange: null,\r\n                onload: null,\r\n                onopen: null,\r\n                onclose: null,\r\n                onfocus: null,\r\n                onblur: null,\r\n                oninsert: null,\r\n                onbeforeinsert: null,\r\n                onsearch: null,\r\n                onbeforesearch: null,\r\n                sortResults: false,\r\n                autofocus: false,\r\n                prompt: null,\r\n                allowEmpty: true,\r\n            }\r\n\r\n            // Loop through our object\r\n            for (var property in defaults) {\r\n                if (options && options.hasOwnProperty(property)) {\r\n                    obj.options[property] = options[property];\r\n                } else {\r\n                    if (typeof (obj.options[property]) == 'undefined' || reset === true) {\r\n                        obj.options[property] = defaults[property];\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Force autocomplete search\r\n            if (obj.options.remoteSearch == true || obj.options.type === 'searchbar') {\r\n                obj.options.autocomplete = true;\r\n            }\r\n\r\n            // New options\r\n            if (obj.options.newOptions == true) {\r\n                obj.header.classList.add('jdropdown-add');\r\n            } else {\r\n                obj.header.classList.remove('jdropdown-add');\r\n            }\r\n\r\n            // Autocomplete\r\n            if (obj.options.autocomplete == true) {\r\n                obj.header.removeAttribute('readonly');\r\n            } else {\r\n                obj.header.setAttribute('readonly', 'readonly');\r\n            }\r\n\r\n            // Place holder\r\n            if (obj.options.placeholder) {\r\n                obj.header.setAttribute('placeholder', obj.options.placeholder);\r\n            } else {\r\n                obj.header.removeAttribute('placeholder');\r\n            }\r\n\r\n            // Remove specific dropdown typing to add again\r\n            el.classList.remove('jdropdown-searchbar');\r\n            el.classList.remove('jdropdown-picker');\r\n            el.classList.remove('jdropdown-list');\r\n\r\n            if (obj.options.type == 'searchbar') {\r\n                el.classList.add('jdropdown-searchbar');\r\n            } else if (obj.options.type == 'list') {\r\n                el.classList.add('jdropdown-list');\r\n            } else if (obj.options.type == 'picker') {\r\n                el.classList.add('jdropdown-picker');\r\n            } else {\r\n                if (helpers.getWindowWidth() < 800) {\r\n                    if (obj.options.autocomplete) {\r\n                        el.classList.add('jdropdown-searchbar');\r\n                        obj.options.type = 'searchbar';\r\n                    } else {\r\n                        el.classList.add('jdropdown-picker');\r\n                        obj.options.type = 'picker';\r\n                    }\r\n                } else {\r\n                    if (obj.options.width) {\r\n                        el.style.width = obj.options.width;\r\n                        el.style.minWidth = obj.options.width;\r\n                    } else {\r\n                        el.style.removeProperty('width');\r\n                        el.style.removeProperty('min-width');\r\n                    }\r\n\r\n                    el.classList.add('jdropdown-default');\r\n                    obj.options.type = 'default';\r\n                }\r\n            }\r\n\r\n            // Close button\r\n            if (obj.options.type == 'searchbar') {\r\n                containerHeader.appendChild(closeButton);\r\n            } else {\r\n                container.insertBefore(closeButton, container.firstChild);\r\n            }\r\n\r\n            // Load the content\r\n            if (obj.options.url && !options.data) {\r\n                ajax({\r\n                    url: obj.options.url,\r\n                    method: 'GET',\r\n                    dataType: 'json',\r\n                    success: function (data) {\r\n                        if (data) {\r\n                            success(data, obj.options.value);\r\n                        }\r\n                    }\r\n                });\r\n            } else {\r\n                success(obj.options.data, obj.options.value);\r\n            }\r\n\r\n            // Return the instance\r\n            return obj;\r\n        }\r\n\r\n        // Helpers\r\n        var containerHeader = null;\r\n        var container = null;\r\n        var content = null;\r\n        var closeButton = null;\r\n        var resetButton = null;\r\n        var backdrop = null;\r\n\r\n        var keyTimer = null;\r\n\r\n        /**\r\n         * Init dropdown\r\n         */\r\n        var init = function () {\r\n            // Do not accept null\r\n            if (!options) {\r\n                options = {};\r\n            }\r\n\r\n            // If the element is a SELECT tag, create a configuration object\r\n            if (el.tagName == 'SELECT') {\r\n                var ret = Component.extractFromDom(el, options);\r\n                el = ret.el;\r\n                options = ret.options;\r\n            }\r\n\r\n            // Place holder\r\n            if (!options.placeholder && el.getAttribute('placeholder')) {\r\n                options.placeholder = el.getAttribute('placeholder');\r\n            }\r\n\r\n            // Value container\r\n            obj.value = {};\r\n            // Containers\r\n            obj.items = [];\r\n            obj.groups = [];\r\n            // Search options\r\n            obj.search = '';\r\n            obj.results = null;\r\n\r\n            // Create dropdown\r\n            el.classList.add('jdropdown');\r\n\r\n            // Header container\r\n            containerHeader = document.createElement('div');\r\n            containerHeader.className = 'jdropdown-container-header';\r\n\r\n            // Header\r\n            obj.header = document.createElement('input');\r\n            obj.header.className = 'jdropdown-header jss_object';\r\n            obj.header.type = 'text';\r\n            obj.header.setAttribute('autocomplete', 'off');\r\n            obj.header.onfocus = function () {\r\n                if (typeof (obj.options.onfocus) == 'function') {\r\n                    obj.options.onfocus(el);\r\n                }\r\n            }\r\n\r\n            obj.header.onblur = function () {\r\n                if (typeof (obj.options.onblur) == 'function') {\r\n                    obj.options.onblur(el);\r\n                }\r\n            }\r\n\r\n            obj.header.onkeyup = function (e) {\r\n                if (obj.options.autocomplete == true && !keyTimer) {\r\n                    if (obj.search != obj.header.value.trim()) {\r\n                        keyTimer = setTimeout(function () {\r\n                            obj.find(obj.header.value.trim());\r\n                            keyTimer = null;\r\n                        }, 400);\r\n                    }\r\n\r\n                    if (!el.classList.contains('jdropdown-focus')) {\r\n                        obj.open();\r\n                    }\r\n                } else {\r\n                    if (!obj.options.autocomplete) {\r\n                        obj.next(e.key);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Global controls\r\n            if (!Component.hasEvents) {\r\n                // Execute only one time\r\n                Component.hasEvents = true;\r\n                // Enter and Esc\r\n                document.addEventListener(\"keydown\", Component.keydown);\r\n            }\r\n\r\n            // Container\r\n            container = document.createElement('div');\r\n            container.className = 'jdropdown-container';\r\n\r\n            // Dropdown content\r\n            content = document.createElement('div');\r\n            content.className = 'jdropdown-content';\r\n\r\n            // Close button\r\n            closeButton = document.createElement('div');\r\n            closeButton.className = 'jdropdown-close';\r\n            closeButton.textContent = 'Done';\r\n\r\n            // Reset button\r\n            resetButton = document.createElement('div');\r\n            resetButton.className = 'jdropdown-reset';\r\n            resetButton.textContent = 'x';\r\n            resetButton.onclick = function () {\r\n                obj.reset();\r\n                obj.close();\r\n            }\r\n\r\n            // Create backdrop\r\n            backdrop = document.createElement('div');\r\n            backdrop.className = 'jdropdown-backdrop';\r\n\r\n            // Append elements\r\n            containerHeader.appendChild(obj.header);\r\n\r\n            container.appendChild(content);\r\n            el.appendChild(containerHeader);\r\n            el.appendChild(container);\r\n            el.appendChild(backdrop);\r\n\r\n            // Set the otiptions\r\n            obj.setOptions(options);\r\n\r\n            if ('ontouchsend' in document.documentElement === true) {\r\n                el.addEventListener('touchsend', Component.mouseup);\r\n            } else {\r\n                el.addEventListener('mouseup', Component.mouseup);\r\n            }\r\n\r\n            // Lazyloading\r\n            if (obj.options.lazyLoading == true) {\r\n                LazyLoading(content, {\r\n                    loadUp: obj.loadUp,\r\n                    loadDown: obj.loadDown,\r\n                });\r\n            }\r\n\r\n            content.onwheel = function (e) {\r\n                e.stopPropagation();\r\n            }\r\n\r\n            // Change method\r\n            el.change = obj.setValue;\r\n\r\n            // Global generic value handler\r\n            el.val = function (val) {\r\n                if (val === undefined) {\r\n                    return obj.getValue(obj.options.multiple ? true : false);\r\n                } else {\r\n                    obj.setValue(val);\r\n                }\r\n            }\r\n\r\n            // Keep object available from the node\r\n            el.dropdown = obj;\r\n        }\r\n\r\n        /**\r\n         * Get the current remote source of data URL\r\n         */\r\n        obj.getUrl = function () {\r\n            return obj.options.url;\r\n        }\r\n\r\n        /**\r\n         * Set the new data from a remote source\r\n         * @param {string} url - url from the remote source\r\n         * @param {function} callback - callback when the data is loaded\r\n         */\r\n        obj.setUrl = function (url, callback) {\r\n            obj.options.url = url;\r\n\r\n            ajax({\r\n                url: obj.options.url,\r\n                method: 'GET',\r\n                dataType: 'json',\r\n                success: function (data) {\r\n                    obj.setData(data);\r\n                    // Callback\r\n                    if (typeof (callback) == 'function') {\r\n                        callback(obj);\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        /**\r\n         * Set ID for one item\r\n         */\r\n        obj.setId = function (item, v) {\r\n            // Legacy purposes\r\n            if (!obj.options.format) {\r\n                var property = 'value';\r\n            } else {\r\n                var property = 'id';\r\n            }\r\n\r\n            if (typeof (item) == 'object') {\r\n                item[property] = v;\r\n            } else {\r\n                obj.items[item].data[property] = v;\r\n            }\r\n        }\r\n\r\n        const add = function(title, id) {\r\n            if (! title) {\r\n                let current = obj.options.autocomplete == true ? obj.header.value : '';\r\n                title = prompt(dictionary.translate('Add A New Option'), current);\r\n                if (! title) {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            // Id\r\n            if (! id) {\r\n                id = helpers.guid();\r\n            }\r\n\r\n            // Create new item\r\n            if (!obj.options.format) {\r\n                var item = {\r\n                    value: id,\r\n                    text: title,\r\n                }\r\n            } else {\r\n                var item = {\r\n                    id: id,\r\n                    name: title,\r\n                }\r\n            }\r\n\r\n            // Callback\r\n            if (typeof (obj.options.onbeforeinsert) == 'function') {\r\n                let ret = obj.options.onbeforeinsert(obj, item);\r\n                if (ret === false) {\r\n                    return false;\r\n                } else if (ret) {\r\n                    item = ret;\r\n                }\r\n            }\r\n\r\n            // Add item to the main list\r\n            obj.options.data.push(item);\r\n\r\n            // Create DOM\r\n            var newItem = obj.createItem(item);\r\n\r\n            // Append DOM to the list\r\n            content.appendChild(newItem.element);\r\n\r\n            // Callback\r\n            if (typeof (obj.options.oninsert) == 'function') {\r\n                obj.options.oninsert(obj, item, newItem);\r\n            }\r\n\r\n            // Show content\r\n            if (content.style.display == 'none') {\r\n                content.style.display = '';\r\n            }\r\n\r\n            // Search?\r\n            if (obj.results) {\r\n                obj.results.push(newItem);\r\n            }\r\n\r\n            return item;\r\n        }\r\n\r\n        /**\r\n         * Add a new item\r\n         * @param {string} title - title of the new item\r\n         * @param {string} id - value/id of the new item\r\n         */\r\n        obj.add = function (title, id) {\r\n            if (typeof (obj.options.prompt) == 'function') {\r\n                return obj.options.prompt.call(obj, add);\r\n            }\r\n            return add(title, id);\r\n        }\r\n\r\n        /**\r\n         * Create a new item\r\n         */\r\n        obj.createItem = function (data, group, groupName) {\r\n            // Keep the correct source of data\r\n            if (!obj.options.format) {\r\n                if (!data.value && data.id !== undefined) {\r\n                    data.value = data.id;\r\n                    //delete data.id;\r\n                }\r\n                if (!data.text && data.name !== undefined) {\r\n                    data.text = data.name;\r\n                    //delete data.name;\r\n                }\r\n            } else {\r\n                if (!data.id && data.value !== undefined) {\r\n                    data.id = data.value;\r\n                    //delete data.value;\r\n                }\r\n                if (!data.name && data.text !== undefined) {\r\n                    data.name = data.text\r\n                    //delete data.text;\r\n                }\r\n            }\r\n\r\n            // Create item\r\n            var item = {};\r\n            item.element = document.createElement('div');\r\n            item.element.className = 'jdropdown-item';\r\n            item.element.indexValue = obj.items.length;\r\n            item.data = data;\r\n\r\n            // Groupd DOM\r\n            if (group) {\r\n                item.group = group;\r\n            }\r\n\r\n            // Id\r\n            if (data.id) {\r\n                item.element.setAttribute('id', data.id);\r\n            }\r\n\r\n            // Disabled\r\n            if (data.disabled == true) {\r\n                item.element.setAttribute('data-disabled', true);\r\n            }\r\n\r\n            // Tooltip\r\n            if (data.tooltip) {\r\n                item.element.setAttribute('title', data.tooltip);\r\n            }\r\n\r\n            // Image\r\n            if (data.image) {\r\n                var image = document.createElement('img');\r\n                image.className = 'jdropdown-image';\r\n                image.src = data.image;\r\n                if (!data.title) {\r\n                    image.classList.add('jdropdown-image-small');\r\n                }\r\n                item.element.appendChild(image);\r\n            } else if (data.icon) {\r\n                var icon = document.createElement('span');\r\n                icon.className = \"jdropdown-icon material-icons\";\r\n                icon.innerText = data.icon;\r\n                if (!data.title) {\r\n                    icon.classList.add('jdropdown-icon-small');\r\n                }\r\n                if (data.color) {\r\n                    icon.style.color = data.color;\r\n                }\r\n                item.element.appendChild(icon);\r\n            } else if (data.color) {\r\n                var color = document.createElement('div');\r\n                color.className = 'jdropdown-color';\r\n                color.style.backgroundColor = data.color;\r\n                item.element.appendChild(color);\r\n            }\r\n\r\n            // Set content\r\n            if (!obj.options.format) {\r\n                var text = data.text;\r\n            } else {\r\n                var text = data.name;\r\n            }\r\n\r\n            var node = document.createElement('div');\r\n            node.className = 'jdropdown-description';\r\n            node.textContent = text || '&nbsp;';\r\n\r\n            // Title\r\n            if (data.title) {\r\n                var title = document.createElement('div');\r\n                title.className = 'jdropdown-title';\r\n                title.innerText = data.title;\r\n                node.appendChild(title);\r\n            }\r\n\r\n            // Set content\r\n            if (!obj.options.format) {\r\n                var val = data.value;\r\n            } else {\r\n                var val = data.id;\r\n            }\r\n\r\n            // Value\r\n            if (obj.value[val]) {\r\n                item.element.classList.add('jdropdown-selected');\r\n                item.selected = true;\r\n            }\r\n\r\n            // Keep DOM accessible\r\n            obj.items.push(item);\r\n\r\n            // Add node to item\r\n            item.element.appendChild(node);\r\n\r\n            return item;\r\n        }\r\n\r\n        obj.appendData = function (data) {\r\n            // Create elements\r\n            if (data.length) {\r\n                // Helpers\r\n                var items = [];\r\n                var groups = [];\r\n\r\n                // Prepare data\r\n                for (var i = 0; i < data.length; i++) {\r\n                    // Process groups\r\n                    if (data[i].group) {\r\n                        if (!groups[data[i].group]) {\r\n                            groups[data[i].group] = [];\r\n                        }\r\n                        groups[data[i].group].push(i);\r\n                    } else {\r\n                        items.push(i);\r\n                    }\r\n                }\r\n\r\n                // Number of items counter\r\n                var counter = 0;\r\n\r\n                // Groups\r\n                var groupNames = Object.keys(groups);\r\n\r\n                // Append groups in case exists\r\n                if (groupNames.length > 0) {\r\n                    for (var i = 0; i < groupNames.length; i++) {\r\n                        // Group container\r\n                        var group = document.createElement('div');\r\n                        group.className = 'jdropdown-group';\r\n                        // Group name\r\n                        var groupName = document.createElement('div');\r\n                        groupName.className = 'jdropdown-group-name';\r\n                        groupName.textContent = groupNames[i];\r\n                        // Group arrow\r\n                        var groupArrow = document.createElement('i');\r\n                        groupArrow.className = 'jdropdown-group-arrow jdropdown-group-arrow-down';\r\n                        groupName.appendChild(groupArrow);\r\n                        // Group items\r\n                        var groupContent = document.createElement('div');\r\n                        groupContent.className = 'jdropdown-group-items';\r\n                        for (var j = 0; j < groups[groupNames[i]].length; j++) {\r\n                            var item = obj.createItem(data[groups[groupNames[i]][j]], group, groupNames[i]);\r\n\r\n                            if (obj.options.lazyLoading == false || counter < 200) {\r\n                                groupContent.appendChild(item.element);\r\n                                counter++;\r\n                            }\r\n                        }\r\n                        // Group itens\r\n                        group.appendChild(groupName);\r\n                        group.appendChild(groupContent);\r\n                        // Keep group DOM\r\n                        obj.groups.push(group);\r\n                        // Only add to the screen if children on the group\r\n                        if (groupContent.children.length > 0) {\r\n                            // Add DOM to the content\r\n                            content.appendChild(group);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (items.length) {\r\n                    for (var i = 0; i < items.length; i++) {\r\n                        var item = obj.createItem(data[items[i]]);\r\n                        if (obj.options.lazyLoading == false || counter < 200) {\r\n                            content.appendChild(item.element);\r\n                            counter++;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.setData = function (data) {\r\n            // Reset current value\r\n            resetValue();\r\n\r\n            // Make sure the content container is blank\r\n            content.textContent = '';\r\n\r\n            // Reset\r\n            obj.header.value = '';\r\n\r\n            // Reset items and values\r\n            obj.items = [];\r\n\r\n            // Prepare data\r\n            if (data && data.length) {\r\n                for (var i = 0; i < data.length; i++) {\r\n                    // Compatibility\r\n                    if (typeof (data[i]) != 'object') {\r\n                        // Correct format\r\n                        if (!obj.options.format) {\r\n                            data[i] = {\r\n                                value: data[i],\r\n                                text: data[i]\r\n                            }\r\n                        } else {\r\n                            data[i] = {\r\n                                id: data[i],\r\n                                name: data[i]\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Append data\r\n                obj.appendData(data);\r\n\r\n                // Update data\r\n                obj.options.data = data;\r\n            } else {\r\n                // Update data\r\n                obj.options.data = [];\r\n            }\r\n\r\n            obj.close();\r\n        }\r\n\r\n        obj.getData = function () {\r\n            return obj.options.data;\r\n        }\r\n\r\n        /**\r\n         * Get position of the item\r\n         */\r\n        obj.getPosition = function (val) {\r\n            for (var i = 0; i < obj.items.length; i++) {\r\n                if (Value(i) == val) {\r\n                    return i;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n\r\n        /**\r\n         * Get dropdown current text\r\n         */\r\n        obj.getText = function (asArray) {\r\n            // Get value\r\n            var v = getText();\r\n            // Return value\r\n            if (asArray) {\r\n                return v;\r\n            } else {\r\n                return v.join('; ');\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Get dropdown current value\r\n         */\r\n        obj.getValue = function (asArray) {\r\n            // Get value\r\n            var v = getValue();\r\n            // Return value\r\n            if (asArray) {\r\n                return v;\r\n            } else {\r\n                return v.join(';');\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Change event\r\n         */\r\n        var change = function (oldValue) {\r\n            // Lemonade JS\r\n            if (el.value != obj.options.value) {\r\n                el.value = obj.options.value;\r\n                if (typeof (el.oninput) == 'function') {\r\n                    el.oninput({\r\n                        type: 'input',\r\n                        target: el,\r\n                        value: el.value\r\n                    });\r\n                }\r\n            }\r\n\r\n            // Events\r\n            if (typeof (obj.options.onchange) == 'function') {\r\n                obj.options.onchange(el, obj, oldValue, obj.options.value);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Set value\r\n         */\r\n        obj.setValue = function (newValue) {\r\n            // Current value\r\n            var oldValue = obj.getValue();\r\n            // New value\r\n            if (Array.isArray(newValue)) {\r\n                newValue = newValue.join(';')\r\n            }\r\n\r\n            if (oldValue !== newValue) {\r\n                // Set value\r\n                applyValue(newValue);\r\n\r\n                // Change\r\n                change(oldValue);\r\n            }\r\n        }\r\n\r\n        obj.resetSelected = function () {\r\n            obj.setValue(null);\r\n        }\r\n\r\n        obj.selectIndex = function (index, force) {\r\n            // Make sure is a number\r\n            var index = parseInt(index);\r\n\r\n            // Only select those existing elements\r\n            if (obj.items && obj.items[index] && (force === true || obj.items[index].data.disabled !== true)) {\r\n                // Reset cursor to a new position\r\n                obj.setCursor(index, false);\r\n\r\n                // Behaviour\r\n                if (!obj.options.multiple) {\r\n                    // Update value\r\n                    if (obj.items[index].selected) {\r\n                        if (obj.options.allowEmpty !== false) {\r\n                            obj.setValue(null);\r\n                        }\r\n                    } else {\r\n                        obj.setValue(Value(index));\r\n                    }\r\n\r\n                    // Close component\r\n                    obj.close();\r\n                } else {\r\n                    // Old value\r\n                    var oldValue = obj.options.value;\r\n\r\n                    // Toggle option\r\n                    if (obj.items[index].selected) {\r\n                        obj.items[index].element.classList.remove('jdropdown-selected');\r\n                        obj.items[index].selected = false;\r\n\r\n                        delete obj.value[Value(index)];\r\n                    } else {\r\n                        // Select element\r\n                        obj.items[index].element.classList.add('jdropdown-selected');\r\n                        obj.items[index].selected = true;\r\n\r\n                        // Set value\r\n                        obj.value[Value(index)] = Text(index);\r\n                    }\r\n\r\n                    // Global value\r\n                    obj.options.value = Object.keys(obj.value).join(';');\r\n\r\n                    // Update labels for multiple dropdown\r\n                    if (obj.options.autocomplete == false) {\r\n                        obj.header.value = getText().join('; ');\r\n                    }\r\n\r\n                    // Events\r\n                    change(oldValue);\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.selectItem = function (item) {\r\n            obj.selectIndex(item.indexValue);\r\n        }\r\n\r\n        var exists = function (k, result) {\r\n            for (var j = 0; j < result.length; j++) {\r\n                if (!obj.options.format) {\r\n                    if (result[j].value == k) {\r\n                        return true;\r\n                    }\r\n                } else {\r\n                    if (result[j].id == k) {\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n\r\n        obj.find = function (str) {\r\n            if (obj.search == str.trim()) {\r\n                return false;\r\n            }\r\n\r\n            // Search term\r\n            obj.search = str;\r\n\r\n            // Reset index\r\n            obj.setCursor();\r\n\r\n            // Remove nodes from all groups\r\n            if (obj.groups.length) {\r\n                for (var i = 0; i < obj.groups.length; i++) {\r\n                    obj.groups[i].lastChild.textContent = '';\r\n                }\r\n            }\r\n\r\n            // Remove all nodes\r\n            content.textContent = '';\r\n\r\n            // Remove current items in the remote search\r\n            if (obj.options.remoteSearch == true) {\r\n                // Reset results\r\n                obj.results = null;\r\n                // URL\r\n                var url = obj.options.url;\r\n\r\n                // Ajax call\r\n                let o = {\r\n                    url: url,\r\n                    method: 'GET',\r\n                    data: { q: str },\r\n                    dataType: 'json',\r\n                    success: function (result) {\r\n                        // Reset items\r\n                        obj.items = [];\r\n\r\n                        // Add the current selected items to the results in case they are not there\r\n                        var current = Object.keys(obj.value);\r\n                        if (current.length) {\r\n                            for (var i = 0; i < current.length; i++) {\r\n                                if (!exists(current[i], result)) {\r\n                                    if (!obj.options.format) {\r\n                                        result.unshift({value: current[i], text: obj.value[current[i]]});\r\n                                    } else {\r\n                                        result.unshift({id: current[i], name: obj.value[current[i]]});\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        // Append data\r\n                        obj.appendData(result);\r\n                        // Show or hide results\r\n                        if (!result.length) {\r\n                            content.style.display = 'none';\r\n                        } else {\r\n                            content.style.display = '';\r\n                        }\r\n\r\n                        if (typeof(obj.options.onsearch) === 'function') {\r\n                            obj.options.onsearch(obj, result);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (typeof(obj.options.onbeforesearch) === 'function') {\r\n                    let ret = obj.options.onbeforesearch(obj, o);\r\n                    if (ret === false) {\r\n                        return;\r\n                    } else if (typeof(ret) === 'object') {\r\n                        o = ret;\r\n                    }\r\n                }\r\n\r\n                // Remote search\r\n                ajax(o);\r\n            } else {\r\n                // Search terms\r\n                str = new RegExp(str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\r\n\r\n                // Reset search\r\n                var results = [];\r\n\r\n                // Append options\r\n                for (var i = 0; i < obj.items.length; i++) {\r\n                    // Item label\r\n                    var label = Text(i);\r\n                    // Item title\r\n                    var title = obj.items[i].data.title || '';\r\n                    // Group name\r\n                    var groupName = obj.items[i].data.group || '';\r\n                    // Synonym\r\n                    var synonym = obj.items[i].data.synonym || '';\r\n                    if (synonym) {\r\n                        synonym = synonym.join(' ');\r\n                    }\r\n\r\n                    if (str == null || obj.items[i].selected == true || label.toString().match(str) || title.match(str) || groupName.match(str) || synonym.match(str)) {\r\n                        results.push(obj.items[i]);\r\n                    }\r\n                }\r\n\r\n                if (!results.length) {\r\n                    content.style.display = 'none';\r\n\r\n                    // Results\r\n                    obj.results = null;\r\n                } else {\r\n                    content.style.display = '';\r\n\r\n                    // Results\r\n                    obj.results = results;\r\n\r\n                    // Show 200 items at once\r\n                    var number = results.length || 0;\r\n\r\n                    // Lazyloading\r\n                    if (obj.options.lazyLoading == true && number > 200) {\r\n                        number = 200;\r\n                    }\r\n\r\n                    for (var i = 0; i < number; i++) {\r\n                        if (obj.results[i].group) {\r\n                            if (!obj.results[i].group.parentNode) {\r\n                                content.appendChild(obj.results[i].group);\r\n                            }\r\n                            obj.results[i].group.lastChild.appendChild(obj.results[i].element);\r\n                        } else {\r\n                            content.appendChild(obj.results[i].element);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Auto focus\r\n            if (obj.options.autofocus == true) {\r\n                obj.first();\r\n            }\r\n        }\r\n\r\n        obj.open = function () {\r\n            // Focus\r\n            if (!el.classList.contains('jdropdown-focus')) {\r\n                // Current dropdown\r\n                Component.current = obj;\r\n\r\n                // Start tracking\r\n                tracking(obj, true);\r\n\r\n                // Add focus\r\n                el.classList.add('jdropdown-focus');\r\n\r\n                // Animation\r\n                if (helpers.getWindowWidth() < 800) {\r\n                    if (obj.options.type == null || obj.options.type == 'picker') {\r\n                        animation.slideBottom(container, 1);\r\n                    }\r\n                }\r\n\r\n                // Filter\r\n                if (obj.options.autocomplete == true) {\r\n                    obj.header.value = obj.search;\r\n                    obj.header.focus();\r\n                }\r\n\r\n                // Set cursor for the first or first selected element\r\n                var k = getValue();\r\n                if (k[0]) {\r\n                    var cursor = obj.getPosition(k[0]);\r\n                    if (cursor !== false) {\r\n                        obj.setCursor(cursor);\r\n                    }\r\n                }\r\n\r\n                // Container Size\r\n                if (!obj.options.type || obj.options.type == 'default') {\r\n                    var rect = el.getBoundingClientRect();\r\n                    var rectContainer = container.getBoundingClientRect();\r\n\r\n                    if (obj.options.position) {\r\n                        container.style.position = 'fixed';\r\n                        if (window.innerHeight < rect.bottom + rectContainer.height) {\r\n                            container.style.top = '';\r\n                            container.style.bottom = (window.innerHeight - rect.top) + 1 + 'px';\r\n                        } else {\r\n                            container.style.top = rect.bottom + 'px';\r\n                            container.style.bottom = '';\r\n                        }\r\n                        container.style.left = rect.left + 'px';\r\n                    } else {\r\n                        if (window.innerHeight < rect.bottom + rectContainer.height) {\r\n                            container.style.top = '';\r\n                            container.style.bottom = rect.height + 1 + 'px';\r\n                        } else {\r\n                            container.style.top = '';\r\n                            container.style.bottom = '';\r\n                        }\r\n                    }\r\n\r\n                    container.style.minWidth = rect.width + 'px';\r\n\r\n                    if (obj.options.maxWidth) {\r\n                        container.style.maxWidth = obj.options.maxWidth;\r\n                    }\r\n\r\n                    if (!obj.items.length && obj.options.autocomplete == true) {\r\n                        content.style.display = 'none';\r\n                    } else {\r\n                        content.style.display = '';\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Events\r\n            if (typeof (obj.options.onopen) == 'function') {\r\n                obj.options.onopen(el);\r\n            }\r\n        }\r\n\r\n        obj.close = function (ignoreEvents) {\r\n            if (el.classList.contains('jdropdown-focus')) {\r\n                // Update labels\r\n                obj.header.value = obj.getText();\r\n                // Remove cursor\r\n                obj.setCursor();\r\n                // Events\r\n                if (!ignoreEvents && typeof (obj.options.onclose) == 'function') {\r\n                    obj.options.onclose(el);\r\n                }\r\n                // Blur\r\n                if (obj.header.blur) {\r\n                    obj.header.blur();\r\n                }\r\n                // Remove focus\r\n                el.classList.remove('jdropdown-focus');\r\n                // Start tracking\r\n                tracking(obj, false);\r\n                // Current dropdown\r\n                Component.current = null;\r\n            }\r\n\r\n            return obj.getValue();\r\n        }\r\n\r\n        /**\r\n         * Set cursor\r\n         */\r\n        obj.setCursor = function (index, setPosition) {\r\n            // Remove current cursor\r\n            if (obj.currentIndex != null) {\r\n                // Remove visual cursor\r\n                if (obj.items && obj.items[obj.currentIndex]) {\r\n                    obj.items[obj.currentIndex].element.classList.remove('jdropdown-cursor');\r\n                }\r\n            }\r\n\r\n            if (index == undefined) {\r\n                obj.currentIndex = null;\r\n            } else {\r\n                index = parseInt(index);\r\n\r\n                // Cursor only for visible items\r\n                if (obj.items[index].element.parentNode) {\r\n                    obj.items[index].element.classList.add('jdropdown-cursor');\r\n                    obj.currentIndex = index;\r\n\r\n                    // Update scroll to the cursor element\r\n                    if (setPosition !== false && obj.items[obj.currentIndex].element) {\r\n                        var container = content.scrollTop;\r\n                        var element = obj.items[obj.currentIndex].element;\r\n                        content.scrollTop = element.offsetTop - element.scrollTop + element.clientTop - 95;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Compatibility\r\n        obj.resetCursor = obj.setCursor;\r\n        obj.updateCursor = obj.setCursor;\r\n\r\n        /**\r\n         * Reset cursor and selected items\r\n         */\r\n        obj.reset = function () {\r\n            // Reset cursor\r\n            obj.setCursor();\r\n\r\n            // Reset selected\r\n            obj.setValue(null);\r\n        }\r\n\r\n        /**\r\n         * First available item\r\n         */\r\n        obj.first = function () {\r\n            if (obj.options.lazyLoading === true) {\r\n                obj.loadFirst();\r\n            }\r\n\r\n            var items = content.querySelectorAll('.jdropdown-item');\r\n            if (items.length) {\r\n                var newIndex = items[0].indexValue;\r\n                obj.setCursor(newIndex);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Last available item\r\n         */\r\n        obj.last = function () {\r\n            if (obj.options.lazyLoading === true) {\r\n                obj.loadLast();\r\n            }\r\n\r\n            var items = content.querySelectorAll('.jdropdown-item');\r\n            if (items.length) {\r\n                var newIndex = items[items.length - 1].indexValue;\r\n                obj.setCursor(newIndex);\r\n            }\r\n        }\r\n\r\n        obj.next = function (letter) {\r\n            var newIndex = null;\r\n\r\n            if (letter) {\r\n                if (letter.length == 1) {\r\n                    // Current index\r\n                    var current = obj.currentIndex || -1;\r\n                    // Letter\r\n                    letter = letter.toLowerCase();\r\n\r\n                    var e = null;\r\n                    var l = null;\r\n                    var items = content.querySelectorAll('.jdropdown-item');\r\n                    if (items.length) {\r\n                        for (var i = 0; i < items.length; i++) {\r\n                            if (items[i].indexValue > current) {\r\n                                if (e = obj.items[items[i].indexValue]) {\r\n                                    if (l = e.element.innerText[0]) {\r\n                                        l = l.toLowerCase();\r\n                                        if (letter == l) {\r\n                                            newIndex = items[i].indexValue;\r\n                                            break;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        obj.setCursor(newIndex);\r\n                    }\r\n                }\r\n            } else {\r\n                if (obj.currentIndex == undefined || obj.currentIndex == null) {\r\n                    obj.first();\r\n                } else {\r\n                    var element = obj.items[obj.currentIndex].element;\r\n\r\n                    var next = element.nextElementSibling;\r\n                    if (next) {\r\n                        if (next.classList.contains('jdropdown-group')) {\r\n                            next = next.lastChild.firstChild;\r\n                        }\r\n                        newIndex = next.indexValue;\r\n                    } else {\r\n                        if (element.parentNode.classList.contains('jdropdown-group-items')) {\r\n                            if (next = element.parentNode.parentNode.nextElementSibling) {\r\n                                if (next.classList.contains('jdropdown-group')) {\r\n                                    next = next.lastChild.firstChild;\r\n                                } else if (next.classList.contains('jdropdown-item')) {\r\n                                    newIndex = next.indexValue;\r\n                                } else {\r\n                                    next = null;\r\n                                }\r\n                            }\r\n\r\n                            if (next) {\r\n                                newIndex = next.indexValue;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (newIndex !== null) {\r\n                        obj.setCursor(newIndex);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.prev = function () {\r\n            var newIndex = null;\r\n\r\n            if (obj.currentIndex === null) {\r\n                obj.first();\r\n            } else {\r\n                var element = obj.items[obj.currentIndex].element;\r\n\r\n                var prev = element.previousElementSibling;\r\n                if (prev) {\r\n                    if (prev.classList.contains('jdropdown-group')) {\r\n                        prev = prev.lastChild.lastChild;\r\n                    }\r\n                    newIndex = prev.indexValue;\r\n                } else {\r\n                    if (element.parentNode.classList.contains('jdropdown-group-items')) {\r\n                        if (prev = element.parentNode.parentNode.previousElementSibling) {\r\n                            if (prev.classList.contains('jdropdown-group')) {\r\n                                prev = prev.lastChild.lastChild;\r\n                            } else if (prev.classList.contains('jdropdown-item')) {\r\n                                newIndex = prev.indexValue;\r\n                            } else {\r\n                                prev = null\r\n                            }\r\n                        }\r\n\r\n                        if (prev) {\r\n                            newIndex = prev.indexValue;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (newIndex !== null) {\r\n                obj.setCursor(newIndex);\r\n            }\r\n        }\r\n\r\n        obj.loadFirst = function () {\r\n            // Search\r\n            if (obj.results) {\r\n                var results = obj.results;\r\n            } else {\r\n                var results = obj.items;\r\n            }\r\n\r\n            // Show 200 items at once\r\n            var number = results.length || 0;\r\n\r\n            // Lazyloading\r\n            if (obj.options.lazyLoading == true && number > 200) {\r\n                number = 200;\r\n            }\r\n\r\n            // Reset container\r\n            content.textContent = '';\r\n\r\n            // First 200 items\r\n            for (var i = 0; i < number; i++) {\r\n                if (results[i].group) {\r\n                    if (!results[i].group.parentNode) {\r\n                        content.appendChild(results[i].group);\r\n                    }\r\n                    results[i].group.lastChild.appendChild(results[i].element);\r\n                } else {\r\n                    content.appendChild(results[i].element);\r\n                }\r\n            }\r\n\r\n            // Scroll go to the begin\r\n            content.scrollTop = 0;\r\n        }\r\n\r\n        obj.loadLast = function () {\r\n            // Search\r\n            if (obj.results) {\r\n                var results = obj.results;\r\n            } else {\r\n                var results = obj.items;\r\n            }\r\n\r\n            // Show first page\r\n            var number = results.length;\r\n\r\n            // Max 200 items\r\n            if (number > 200) {\r\n                number = number - 200;\r\n\r\n                // Reset container\r\n                content.textContent = '';\r\n\r\n                // First 200 items\r\n                for (var i = number; i < results.length; i++) {\r\n                    if (results[i].group) {\r\n                        if (!results[i].group.parentNode) {\r\n                            content.appendChild(results[i].group);\r\n                        }\r\n                        results[i].group.lastChild.appendChild(results[i].element);\r\n                    } else {\r\n                        content.appendChild(results[i].element);\r\n                    }\r\n                }\r\n\r\n                // Scroll go to the begin\r\n                content.scrollTop = content.scrollHeight;\r\n            }\r\n        }\r\n\r\n        obj.loadUp = function () {\r\n            var test = false;\r\n\r\n            // Search\r\n            if (obj.results) {\r\n                var results = obj.results;\r\n            } else {\r\n                var results = obj.items;\r\n            }\r\n\r\n            var items = content.querySelectorAll('.jdropdown-item');\r\n            var fistItem = items[0].indexValue;\r\n            fistItem = obj.items[fistItem];\r\n            var index = results.indexOf(fistItem) - 1;\r\n\r\n            if (index > 0) {\r\n                var number = 0;\r\n\r\n                while (index > 0 && results[index] && number < 200) {\r\n                    if (results[index].group) {\r\n                        if (!results[index].group.parentNode) {\r\n                            content.insertBefore(results[index].group, content.firstChild);\r\n                        }\r\n                        results[index].group.lastChild.insertBefore(results[index].element, results[index].group.lastChild.firstChild);\r\n                    } else {\r\n                        content.insertBefore(results[index].element, content.firstChild);\r\n                    }\r\n\r\n                    index--;\r\n                    number++;\r\n                }\r\n\r\n                // New item added\r\n                test = true;\r\n            }\r\n\r\n            return test;\r\n        }\r\n\r\n        obj.loadDown = function () {\r\n            var test = false;\r\n\r\n            // Search\r\n            if (obj.results) {\r\n                var results = obj.results;\r\n            } else {\r\n                var results = obj.items;\r\n            }\r\n\r\n            var items = content.querySelectorAll('.jdropdown-item');\r\n            var lastItem = items[items.length - 1].indexValue;\r\n            lastItem = obj.items[lastItem];\r\n            var index = results.indexOf(lastItem) + 1;\r\n\r\n            if (index < results.length) {\r\n                var number = 0;\r\n                while (index < results.length && results[index] && number < 200) {\r\n                    if (results[index].group) {\r\n                        if (!results[index].group.parentNode) {\r\n                            content.appendChild(results[index].group);\r\n                        }\r\n                        results[index].group.lastChild.appendChild(results[index].element);\r\n                    } else {\r\n                        content.appendChild(results[index].element);\r\n                    }\r\n\r\n                    index++;\r\n                    number++;\r\n                }\r\n\r\n                // New item added\r\n                test = true;\r\n            }\r\n\r\n            return test;\r\n        }\r\n\r\n        init();\r\n\r\n        return obj;\r\n    });\r\n\r\n    Component.keydown = function (e) {\r\n        var dropdown = null;\r\n        if (dropdown = Component.current) {\r\n            if (e.which == 13 || e.which == 9) {  // enter or tab\r\n                if (dropdown.header.value && dropdown.currentIndex == null && dropdown.options.newOptions) {\r\n                    // if they typed something in, but it matched nothing, and newOptions are allowed, start that flow\r\n                    dropdown.add();\r\n                } else {\r\n                    // Quick Select/Filter\r\n                    if (dropdown.currentIndex == null && dropdown.options.autocomplete == true && dropdown.header.value != \"\") {\r\n                        dropdown.find(dropdown.header.value);\r\n                    }\r\n                    dropdown.selectIndex(dropdown.currentIndex);\r\n                }\r\n            } else if (e.which == 38) {  // up arrow\r\n                if (dropdown.currentIndex == null) {\r\n                    dropdown.first();\r\n                } else if (dropdown.currentIndex > 0) {\r\n                    dropdown.prev();\r\n                }\r\n                e.preventDefault();\r\n            } else if (e.which == 40) {  // down arrow\r\n                if (dropdown.currentIndex == null) {\r\n                    dropdown.first();\r\n                } else if (dropdown.currentIndex + 1 < dropdown.items.length) {\r\n                    dropdown.next();\r\n                }\r\n                e.preventDefault();\r\n            } else if (e.which == 36) {\r\n                dropdown.first();\r\n                if (!e.target.classList.contains('jdropdown-header')) {\r\n                    e.preventDefault();\r\n                }\r\n            } else if (e.which == 35) {\r\n                dropdown.last();\r\n                if (!e.target.classList.contains('jdropdown-header')) {\r\n                    e.preventDefault();\r\n                }\r\n            } else if (e.which == 27) {\r\n                dropdown.close();\r\n            } else if (e.which == 33) {  // page up\r\n                if (dropdown.currentIndex == null) {\r\n                    dropdown.first();\r\n                } else if (dropdown.currentIndex > 0) {\r\n                    for (var i = 0; i < 7; i++) {\r\n                        dropdown.prev()\r\n                    }\r\n                }\r\n                e.preventDefault();\r\n            } else if (e.which == 34) {  // page down\r\n                if (dropdown.currentIndex == null) {\r\n                    dropdown.first();\r\n                } else if (dropdown.currentIndex + 1 < dropdown.items.length) {\r\n                    for (var i = 0; i < 7; i++) {\r\n                        dropdown.next()\r\n                    }\r\n                }\r\n                e.preventDefault();\r\n            }\r\n        }\r\n    }\r\n\r\n    Component.mouseup = function (e) {\r\n        var element = helpers.findElement(e.target, 'jdropdown');\r\n        if (element) {\r\n            var dropdown = element.dropdown;\r\n            if (e.target.classList.contains('jdropdown-header')) {\r\n                if (element.classList.contains('jdropdown-focus') && element.classList.contains('jdropdown-default')) {\r\n                    var rect = element.getBoundingClientRect();\r\n\r\n                    if (e.changedTouches && e.changedTouches[0]) {\r\n                        var x = e.changedTouches[0].clientX;\r\n                        var y = e.changedTouches[0].clientY;\r\n                    } else {\r\n                        var x = e.clientX;\r\n                        var y = e.clientY;\r\n                    }\r\n\r\n                    if (rect.width - (x - rect.left) < 30) {\r\n                        if (e.target.classList.contains('jdropdown-add')) {\r\n                            dropdown.add();\r\n                        } else {\r\n                            dropdown.close();\r\n                        }\r\n                    } else {\r\n                        if (dropdown.options.autocomplete == false) {\r\n                            dropdown.close();\r\n                        }\r\n                    }\r\n                } else {\r\n                    dropdown.open();\r\n                }\r\n            } else if (e.target.classList.contains('jdropdown-group-name')) {\r\n                var items = e.target.nextSibling.children;\r\n                if (e.target.nextSibling.style.display != 'none') {\r\n                    for (var i = 0; i < items.length; i++) {\r\n                        if (items[i].style.display != 'none') {\r\n                            dropdown.selectItem(items[i]);\r\n                        }\r\n                    }\r\n                }\r\n            } else if (e.target.classList.contains('jdropdown-group-arrow')) {\r\n                if (e.target.classList.contains('jdropdown-group-arrow-down')) {\r\n                    e.target.classList.remove('jdropdown-group-arrow-down');\r\n                    e.target.classList.add('jdropdown-group-arrow-up');\r\n                    e.target.parentNode.nextSibling.style.display = 'none';\r\n                } else {\r\n                    e.target.classList.remove('jdropdown-group-arrow-up');\r\n                    e.target.classList.add('jdropdown-group-arrow-down');\r\n                    e.target.parentNode.nextSibling.style.display = '';\r\n                }\r\n            } else if (e.target.classList.contains('jdropdown-item')) {\r\n                dropdown.selectItem(e.target);\r\n            } else if (e.target.classList.contains('jdropdown-image')) {\r\n                dropdown.selectItem(e.target.parentNode);\r\n            } else if (e.target.classList.contains('jdropdown-description')) {\r\n                dropdown.selectItem(e.target.parentNode);\r\n            } else if (e.target.classList.contains('jdropdown-title')) {\r\n                dropdown.selectItem(e.target.parentNode.parentNode);\r\n            } else if (e.target.classList.contains('jdropdown-close') || e.target.classList.contains('jdropdown-backdrop')) {\r\n                dropdown.close();\r\n            }\r\n        }\r\n    }\r\n\r\n    Component.extractFromDom = function (el, options) {\r\n        // Keep reference\r\n        var select = el;\r\n        if (!options) {\r\n            options = {};\r\n        }\r\n        // Prepare configuration\r\n        if (el.getAttribute('multiple') && (!options || options.multiple == undefined)) {\r\n            options.multiple = true;\r\n        }\r\n        if (el.getAttribute('placeholder') && (!options || options.placeholder == undefined)) {\r\n            options.placeholder = el.getAttribute('placeholder');\r\n        }\r\n        if (el.getAttribute('data-autocomplete') && (!options || options.autocomplete == undefined)) {\r\n            options.autocomplete = true;\r\n        }\r\n        if (!options || options.width == undefined) {\r\n            options.width = el.offsetWidth;\r\n        }\r\n        if (el.value && (!options || options.value == undefined)) {\r\n            options.value = el.value;\r\n        }\r\n        if (!options || options.data == undefined) {\r\n            options.data = [];\r\n            for (var j = 0; j < el.children.length; j++) {\r\n                if (el.children[j].tagName == 'OPTGROUP') {\r\n                    for (var i = 0; i < el.children[j].children.length; i++) {\r\n                        options.data.push({\r\n                            value: el.children[j].children[i].value,\r\n                            text: el.children[j].children[i].textContent,\r\n                            group: el.children[j].getAttribute('label'),\r\n                        });\r\n                    }\r\n                } else {\r\n                    options.data.push({\r\n                        value: el.children[j].value,\r\n                        text: el.children[j].textContent,\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        if (!options || options.onchange == undefined) {\r\n            options.onchange = function (a, b, c, d) {\r\n                if (options.multiple == true) {\r\n                    if (obj.items[b].classList.contains('jdropdown-selected')) {\r\n                        select.options[b].setAttribute('selected', 'selected');\r\n                    } else {\r\n                        select.options[b].removeAttribute('selected');\r\n                    }\r\n                } else {\r\n                    select.value = d;\r\n                }\r\n            }\r\n        }\r\n        // Create DIV\r\n        var div = document.createElement('div');\r\n        el.parentNode.insertBefore(div, el);\r\n        el.style.display = 'none';\r\n        el = div;\r\n\r\n        return {el: el, options: options};\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var dropdown = (Dropdown());\n;// CONCATENATED MODULE: ./src/plugins/picker.js\n\r\n\r\n\r\nfunction Picker(el, options) {\r\n    // Already created, update options\r\n    if (el.picker) {\r\n        return el.picker.setOptions(options, true);\r\n    }\r\n\r\n    // New instance\r\n    var obj = { type: 'picker' };\r\n    obj.options = {};\r\n\r\n    var dropdownHeader = null;\r\n    var dropdownContent = null;\r\n\r\n    /**\r\n     * The element passed is a DOM element\r\n     */\r\n    var isDOM = function(o) {\r\n        return (o instanceof Element || o instanceof HTMLDocument);\r\n    }\r\n\r\n    /**\r\n     * Create the content options\r\n     */\r\n    var createContent = function() {\r\n        dropdownContent.innerHTML = '';\r\n\r\n        // Create items\r\n        var keys = Object.keys(obj.options.data);\r\n\r\n        // Go though all options\r\n        for (var i = 0; i < keys.length; i++) {\r\n            // Item\r\n            var dropdownItem = document.createElement('div');\r\n            dropdownItem.classList.add('jpicker-item');\r\n            dropdownItem.setAttribute('role', 'option');\r\n            dropdownItem.k = keys[i];\r\n            dropdownItem.v = obj.options.data[keys[i]];\r\n            // Label\r\n            var item = obj.getLabel(keys[i], dropdownItem);\r\n            if (isDOM(item)) {\r\n                dropdownItem.appendChild(item);\r\n            } else {\r\n                dropdownItem.innerHTML = item;\r\n            }\r\n            // Append\r\n            dropdownContent.appendChild(dropdownItem);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Set or reset the options for the picker\r\n     */\r\n    obj.setOptions = function(options, reset) {\r\n        // Default configuration\r\n        var defaults = {\r\n            value: 0,\r\n            data: null,\r\n            render: null,\r\n            onchange: null,\r\n            onmouseover: null,\r\n            onselect: null,\r\n            onopen: null,\r\n            onclose: null,\r\n            onload: null,\r\n            width: null,\r\n            header: true,\r\n            right: false,\r\n            bottom: false,\r\n            content: false,\r\n            columns: null,\r\n            grid: null,\r\n            height: null,\r\n        }\r\n\r\n        // Legacy purpose only\r\n        if (options && options.options) {\r\n            options.data = options.options;\r\n        }\r\n\r\n        // Loop through the initial configuration\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n                    obj.options[property] = defaults[property];\r\n                }\r\n            }\r\n        }\r\n\r\n        // Start using the options\r\n        if (obj.options.header === false) {\r\n            dropdownHeader.style.display = 'none';\r\n        } else {\r\n            dropdownHeader.style.display = '';\r\n        }\r\n\r\n        // Width\r\n        if (obj.options.width) {\r\n            dropdownHeader.style.width = parseInt(obj.options.width) + 'px';\r\n        } else {\r\n            dropdownHeader.style.width = '';\r\n        }\r\n\r\n        // Height\r\n        if (obj.options.height) {\r\n            dropdownContent.style.maxHeight = obj.options.height + 'px';\r\n            dropdownContent.style.overflow = 'scroll';\r\n        } else {\r\n            dropdownContent.style.overflow = '';\r\n        }\r\n\r\n        if (obj.options.columns > 0) {\r\n            if (! obj.options.grid) {\r\n                dropdownContent.classList.add('jpicker-columns');\r\n                dropdownContent.style.width = obj.options.width ? obj.options.width : 36 * obj.options.columns + 'px';\r\n            } else {\r\n                dropdownContent.classList.add('jpicker-grid');\r\n                dropdownContent.style.gridTemplateColumns = 'repeat(' + obj.options.grid + ', 1fr)';\r\n            }\r\n        }\r\n\r\n        if (isNaN(parseInt(obj.options.value))) {\r\n            obj.options.value = 0;\r\n        }\r\n\r\n        // Create list from data\r\n        createContent();\r\n\r\n        // Set value\r\n        obj.setValue(obj.options.value);\r\n\r\n        // Set options all returns the own instance\r\n        return obj;\r\n    }\r\n\r\n    obj.getValue = function() {\r\n        return obj.options.value;\r\n    }\r\n\r\n    obj.setValue = function(k, e) {\r\n        // Set label\r\n        obj.setLabel(k);\r\n\r\n        // Update value\r\n        obj.options.value = String(k);\r\n\r\n        // Lemonade JS\r\n        if (el.value != obj.options.value) {\r\n            el.value = obj.options.value;\r\n            if (typeof(el.oninput) == 'function') {\r\n                el.oninput({\r\n                    type: 'input',\r\n                    target: el,\r\n                    value: el.value\r\n                });\r\n            }\r\n        }\r\n\r\n        if (dropdownContent.children[k] && dropdownContent.children[k].getAttribute('type') !== 'generic') {\r\n            obj.close();\r\n        }\r\n\r\n        // Call method\r\n        if (e) {\r\n            if (typeof (obj.options.onchange) == 'function') {\r\n                var v = obj.options.data[k];\r\n\r\n                obj.options.onchange(el, obj, v, v, k, e);\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.getLabel = function(v, item) {\r\n        var label = obj.options.data[v] || null;\r\n        if (typeof(obj.options.render) == 'function') {\r\n            label = obj.options.render(label, item);\r\n        }\r\n        return label;\r\n    }\r\n\r\n    obj.setLabel = function(v) {\r\n        var item;\r\n\r\n        if (obj.options.content) {\r\n            item = document.createElement('i');\r\n            item.textContent = obj.options.content;\r\n            item.classList.add('material-icons');\r\n        } else {\r\n            item = obj.getLabel(v, null);\r\n        }\r\n\r\n        // Label\r\n        if (isDOM(item)) {\r\n            dropdownHeader.textContent = '';\r\n            dropdownHeader.appendChild(item);\r\n        } else {\r\n            dropdownHeader.innerHTML = item;\r\n        }\r\n    }\r\n\r\n    obj.open = function() {\r\n        if (! el.classList.contains('jpicker-focus')) {\r\n            // Start tracking the element\r\n            tracking(obj, true);\r\n\r\n            // Open picker\r\n            el.classList.add('jpicker-focus');\r\n            el.focus();\r\n\r\n            var top = 0;\r\n            var left = 0;\r\n\r\n            dropdownContent.style.marginLeft = '';\r\n\r\n            var rectHeader = dropdownHeader.getBoundingClientRect();\r\n            var rectContent = dropdownContent.getBoundingClientRect();\r\n\r\n            if (window.innerHeight < rectHeader.bottom + rectContent.height || obj.options.bottom) {\r\n                top = -1 * (rectContent.height + 4);\r\n            } else {\r\n                top = rectHeader.height + 4;\r\n            }\r\n\r\n            if (obj.options.right === true) {\r\n                left = -1 * rectContent.width + rectHeader.width;\r\n            }\r\n\r\n            if (rectContent.left + left < 0) {\r\n                left = left + rectContent.left + 10;\r\n            }\r\n            if (rectContent.left + rectContent.width > window.innerWidth) {\r\n                left = -1 * (10 + rectContent.left + rectContent.width - window.innerWidth);\r\n            }\r\n\r\n            dropdownContent.style.marginTop = parseInt(top) + 'px';\r\n            dropdownContent.style.marginLeft = parseInt(left) + 'px';\r\n\r\n            //dropdownContent.style.marginTop\r\n            if (typeof obj.options.onopen == 'function') {\r\n                obj.options.onopen(el, obj);\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.close = function() {\r\n        if (el.classList.contains('jpicker-focus')) {\r\n            el.classList.remove('jpicker-focus');\r\n\r\n            // Start tracking the element\r\n            tracking(obj, false);\r\n\r\n            if (typeof obj.options.onclose == 'function') {\r\n                obj.options.onclose(el, obj);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Destroy the picker instance and release all resources\r\n     */\r\n    obj.destroy = function() {\r\n        // Close if open (removes from tracking)\r\n        obj.close();\r\n\r\n        // Remove event listeners\r\n        el.onmousedown = null;\r\n        if (dropdownContent) {\r\n            dropdownContent.onclick = null;\r\n        }\r\n\r\n        // Remove created DOM elements\r\n        if (dropdownHeader && dropdownHeader.parentNode) {\r\n            dropdownHeader.parentNode.removeChild(dropdownHeader);\r\n        }\r\n        if (dropdownContent && dropdownContent.parentNode) {\r\n            dropdownContent.parentNode.removeChild(dropdownContent);\r\n        }\r\n\r\n        // Remove classes and attributes from el\r\n        el.classList.remove('jpicker');\r\n        el.classList.remove('jpicker-focus');\r\n        el.removeAttribute('role');\r\n        el.removeAttribute('aria-haspopup');\r\n        el.removeAttribute('aria-expanded');\r\n        el.removeAttribute('aria-controls');\r\n        el.removeAttribute('tabindex');\r\n\r\n        // Remove instance properties from el\r\n        delete el.picker;\r\n        delete el.value;\r\n        delete el.change;\r\n        delete el.val;\r\n\r\n        // Clear options callbacks to release closures\r\n        if (obj.options) {\r\n            obj.options.onchange = null;\r\n            obj.options.onclose = null;\r\n            obj.options.onopen = null;\r\n            obj.options.onload = null;\r\n            obj.options.onselect = null;\r\n            obj.options.onmouseover = null;\r\n            obj.options.render = null;\r\n        }\r\n\r\n        // Clear references\r\n        dropdownHeader = null;\r\n        dropdownContent = null;\r\n    }\r\n\r\n    /**\r\n     * Create floating picker\r\n     */\r\n    var init = function() {\r\n        let id = helpers.guid();\r\n\r\n        // Class\r\n        el.classList.add('jpicker');\r\n        el.setAttribute('role', 'combobox');\r\n        el.setAttribute('aria-haspopup', 'listbox');\r\n        el.setAttribute('aria-expanded', 'false');\r\n        el.setAttribute('aria-controls', id);\r\n        el.setAttribute('tabindex', '0');\r\n        el.onmousedown = function(e) {\r\n            if (! el.classList.contains('jpicker-focus')) {\r\n                obj.open();\r\n            }\r\n        }\r\n\r\n        // Dropdown Header\r\n        dropdownHeader = document.createElement('div');\r\n        dropdownHeader.classList.add('jpicker-header');\r\n\r\n        // Dropdown content\r\n        dropdownContent = document.createElement('div');\r\n        dropdownContent.setAttribute('id', id);\r\n        dropdownContent.setAttribute('role', 'listbox');\r\n        dropdownContent.classList.add('jpicker-content');\r\n        dropdownContent.onclick = function(e) {\r\n            var item = helpers.findElement(e.target, 'jpicker-item');\r\n            if (item) {\r\n                if (item.parentNode === dropdownContent) {\r\n                    // Update label\r\n                    obj.setValue(item.k, e);\r\n                }\r\n            }\r\n        }\r\n        // Append content and header\r\n        el.appendChild(dropdownHeader);\r\n        el.appendChild(dropdownContent);\r\n\r\n        // Default value\r\n        el.value = options.value || 0;\r\n\r\n        // Set options\r\n        obj.setOptions(options);\r\n\r\n        if (typeof(obj.options.onload) == 'function') {\r\n            obj.options.onload(el, obj);\r\n        }\r\n\r\n        // Change\r\n        el.change = obj.setValue;\r\n\r\n        // Global generic value handler\r\n        el.val = function(val) {\r\n            if (val === undefined) {\r\n                return obj.getValue();\r\n            } else {\r\n                obj.setValue(val);\r\n            }\r\n        }\r\n\r\n        // Reference\r\n        el.picker = obj;\r\n    }\r\n\r\n    init();\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/toolbar.js\n\r\n\r\n\r\n\r\n\r\nfunction Toolbar(el, options) {\r\n    // New instance\r\n    var obj = { type:'toolbar' };\r\n    obj.options = {};\r\n\r\n    // Track internal components for cleanup\r\n    var internalComponents = [];\r\n\r\n    // Event handler references for cleanup\r\n    var elClickHandler = null;\r\n    var windowResizeHandler = null;\r\n\r\n    // Default configuration\r\n    var defaults = {\r\n        app: null,\r\n        container: false,\r\n        badge: false,\r\n        title: false,\r\n        responsive: false,\r\n        maxWidth: null,\r\n        bottom: true,\r\n        items: [],\r\n    }\r\n\r\n    // Loop through our object\r\n    for (var property in defaults) {\r\n        if (options && options.hasOwnProperty(property)) {\r\n            obj.options[property] = options[property];\r\n        } else {\r\n            obj.options[property] = defaults[property];\r\n        }\r\n    }\r\n\r\n    if (! el && options.app && options.app.el) {\r\n        el = document.createElement('div');\r\n        options.app.el.appendChild(el);\r\n    }\r\n\r\n    // Arrow\r\n    var toolbarArrow = document.createElement('div');\r\n    toolbarArrow.classList.add('jtoolbar-item');\r\n    toolbarArrow.classList.add('jtoolbar-arrow');\r\n\r\n    let arrow = document.createElement('i');\r\n    arrow.classList.add('material-icons');\r\n    arrow.textContent = 'more_vert';\r\n    toolbarArrow.appendChild(arrow);\r\n\r\n    var toolbarFloating = document.createElement('div');\r\n    toolbarFloating.classList.add('jtoolbar-floating');\r\n    toolbarArrow.appendChild(toolbarFloating);\r\n\r\n    obj.selectItem = function(element) {\r\n        var elements = toolbarContent.children;\r\n        for (var i = 0; i < elements.length; i++) {\r\n            if (element != elements[i]) {\r\n                elements[i].classList.remove('jtoolbar-selected');\r\n            }\r\n        }\r\n        element.classList.add('jtoolbar-selected');\r\n    }\r\n\r\n    obj.hide = function() {\r\n        animation.slideBottom(el, 0, function() {\r\n            el.style.display = 'none';\r\n        });\r\n    }\r\n\r\n    obj.show = function() {\r\n        el.style.display = '';\r\n        animation.slideBottom(el, 1);\r\n    }\r\n\r\n    obj.get = function() {\r\n        return el;\r\n    }\r\n\r\n    obj.setBadge = function(index, value) {\r\n        toolbarContent.children[index].children[1].firstChild.innerHTML = value;\r\n    }\r\n\r\n    obj.destroy = function() {\r\n        // Close if open (removes from tracking)\r\n        obj.close();\r\n\r\n        // Destroy all internal components (pickers, etc.)\r\n        for (var i = 0; i < internalComponents.length; i++) {\r\n            var comp = internalComponents[i];\r\n            if (comp) {\r\n                // First destroy any nested components created in onload (stored on the picker instance)\r\n                if (comp.components && comp.components.length) {\r\n                    for (var j = 0; j < comp.components.length; j++) {\r\n                        if (comp.components[j] && typeof comp.components[j].destroy === 'function') {\r\n                            comp.components[j].destroy();\r\n                        }\r\n                    }\r\n                    comp.components = null;\r\n                }\r\n                // Then destroy the picker/component itself\r\n                if (typeof comp.destroy === 'function') {\r\n                    comp.destroy();\r\n                }\r\n            }\r\n        }\r\n        internalComponents = [];\r\n\r\n        // Clear onclick handlers from DOM elements (releases bound function references)\r\n        if (toolbarContent) {\r\n            var items = toolbarContent.querySelectorAll('.jtoolbar-item');\r\n            for (var i = 0; i < items.length; i++) {\r\n                items[i].onclick = null;\r\n                items[i].updateState = null;\r\n            }\r\n        }\r\n        if (toolbarFloating) {\r\n            var items = toolbarFloating.querySelectorAll('.jtoolbar-item');\r\n            for (var i = 0; i < items.length; i++) {\r\n                items[i].onclick = null;\r\n                items[i].updateState = null;\r\n            }\r\n        }\r\n\r\n        // Clear options items callbacks to release closures\r\n        if (obj.options && obj.options.items) {\r\n            for (var i = 0; i < obj.options.items.length; i++) {\r\n                var item = obj.options.items[i];\r\n                // Clear all callback references\r\n                item.onclick = null;\r\n                item.onchange = null;\r\n                item.onload = null;\r\n                item.render = null;\r\n                item.updateState = null;\r\n                item.onopen = null;\r\n                item.onclose = null;\r\n            }\r\n            obj.options.items = null;\r\n        }\r\n\r\n        // Remove event listeners\r\n        if (elClickHandler) {\r\n            el.removeEventListener('click', elClickHandler);\r\n            elClickHandler = null;\r\n        }\r\n        if (windowResizeHandler) {\r\n            window.removeEventListener('resize', windowResizeHandler);\r\n            windowResizeHandler = null;\r\n        }\r\n\r\n        // Clear DOM\r\n        el.innerHTML = '';\r\n\r\n        // Clear references\r\n        toolbarContent = null;\r\n        toolbarFloating = null;\r\n        toolbarArrow = null;\r\n\r\n        // Remove classes\r\n        el.classList.remove('jtoolbar');\r\n        el.classList.remove('jtoolbar-container');\r\n        el.classList.remove('jtoolbar-mobile');\r\n        el.classList.remove('jtoolbar-disabled');\r\n\r\n        // Remove instance reference\r\n        delete el.toolbar;\r\n    }\r\n\r\n    obj.update = function(a, b) {\r\n        for (var i = 0; i < toolbarContent.children.length; i++) {\r\n            // Toolbar element\r\n            var toolbarItem = toolbarContent.children[i];\r\n            // State management\r\n            if (typeof(toolbarItem.updateState) == 'function') {\r\n                toolbarItem.updateState(el, obj, toolbarItem, a, b);\r\n            }\r\n        }\r\n        for (var i = 0; i < toolbarFloating.children.length; i++) {\r\n            // Toolbar element\r\n            var toolbarItem = toolbarFloating.children[i];\r\n            // State management\r\n            if (typeof(toolbarItem.updateState) == 'function') {\r\n                toolbarItem.updateState(el, obj, toolbarItem, a, b);\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.create = function(items) {\r\n        // Reset anything in the toolbar\r\n        toolbarContent.innerHTML = '';\r\n        // Create elements in the toolbar\r\n        for (var i = 0; i < items.length; i++) {\r\n            var toolbarItem = document.createElement('div');\r\n            toolbarItem.classList.add('jtoolbar-item');\r\n\r\n            if (items[i].width) {\r\n                toolbarItem.style.width = parseInt(items[i].width) + 'px'; \r\n            }\r\n\r\n            if (items[i].k) {\r\n                toolbarItem.k = items[i].k;\r\n            }\r\n\r\n            if (items[i].tooltip) {\r\n                toolbarItem.setAttribute('title', items[i].tooltip);\r\n                toolbarItem.setAttribute('aria-label', items[i].tooltip);\r\n            }\r\n\r\n            // Id\r\n            if (items[i].id) {\r\n                toolbarItem.setAttribute('id', items[i].id);\r\n            }\r\n\r\n            // Selected\r\n            if (items[i].updateState) {\r\n                toolbarItem.updateState = items[i].updateState;\r\n            }\r\n\r\n            if (items[i].active) {\r\n                toolbarItem.classList.add('jtoolbar-active');\r\n            }\r\n\r\n            if (items[i].disabled) {\r\n                toolbarItem.classList.add('jtoolbar-disabled');\r\n            }\r\n\r\n            if (items[i].type == 'select' || items[i].type == 'dropdown') {\r\n                var picker = Picker(toolbarItem, items[i]);\r\n                internalComponents.push(picker);\r\n            } else if (items[i].type == 'divisor') {\r\n                toolbarItem.classList.add('jtoolbar-divisor');\r\n            } else if (items[i].type == 'label') {\r\n                toolbarItem.classList.add('jtoolbar-label');\r\n                toolbarItem.innerHTML = items[i].content;\r\n            } else {\r\n                // Material icons\r\n                var toolbarIcon = document.createElement('i');\r\n                if (typeof(items[i].class) === 'undefined') {\r\n                    toolbarIcon.classList.add('material-icons');\r\n                } else {\r\n                    var c = items[i].class.split(' ');\r\n                    for (var j = 0; j < c.length; j++) {\r\n                        toolbarIcon.classList.add(c[j]);\r\n                    }\r\n                }\r\n                toolbarIcon.innerHTML = items[i].content ? items[i].content : '';\r\n                toolbarItem.setAttribute('role', 'button');\r\n                toolbarItem.appendChild(toolbarIcon);\r\n\r\n                // Badge options\r\n                if (obj.options.badge == true) {\r\n                    var toolbarBadge = document.createElement('div');\r\n                    toolbarBadge.classList.add('jbadge');\r\n                    var toolbarBadgeContent = document.createElement('div');\r\n                    toolbarBadgeContent.innerHTML = items[i].badge ? items[i].badge : '';\r\n                    toolbarBadge.appendChild(toolbarBadgeContent);\r\n                    toolbarItem.appendChild(toolbarBadge);\r\n                }\r\n\r\n                // Title\r\n                if (items[i].title) {\r\n                    if (obj.options.title == true) {\r\n                        var toolbarTitle = document.createElement('span');\r\n                        toolbarTitle.innerHTML = items[i].title;\r\n                        toolbarItem.appendChild(toolbarTitle);\r\n                    } else {\r\n                        toolbarItem.setAttribute('title', items[i].title);\r\n                    }\r\n                }\r\n\r\n                if (obj.options.app && items[i].route) {\r\n                    // Route\r\n                    toolbarItem.route = items[i].route;\r\n                    // Onclick for route\r\n                    toolbarItem.onclick = function() {\r\n                        obj.options.app.pages(this.route);\r\n                    }\r\n                    // Create pages\r\n                    obj.options.app.pages(items[i].route, {\r\n                        toolbarItem: toolbarItem,\r\n                        closed: true\r\n                    });\r\n                }\r\n\r\n                // Render\r\n                if (typeof(items[i].render) === 'function') {\r\n                    items[i].render(toolbarItem, items[i]);\r\n                }\r\n            }\r\n\r\n            if (items[i].onclick) {\r\n                toolbarItem.onclick = items[i].onclick.bind(items[i], el, obj, toolbarItem);\r\n            }\r\n\r\n            toolbarContent.appendChild(toolbarItem);\r\n        }\r\n\r\n        // Fits to the page\r\n        setTimeout(function() {\r\n            obj.refresh();\r\n        }, 0);\r\n    }\r\n\r\n    obj.open = function() {\r\n        toolbarArrow.classList.add('jtoolbar-arrow-selected');\r\n\r\n        var rectElement = el.getBoundingClientRect();\r\n        var rect = toolbarFloating.getBoundingClientRect();\r\n        if (rect.bottom > window.innerHeight || obj.options.bottom) {\r\n            toolbarFloating.style.bottom = '0';\r\n        } else {\r\n            toolbarFloating.style.removeProperty('bottom');\r\n        }\r\n\r\n        toolbarFloating.style.right = '0';\r\n\r\n        toolbarArrow.children[1].focus();\r\n        // Start tracking\r\n        tracking(obj, true);\r\n    }\r\n\r\n    obj.close = function() {\r\n        if (toolbarArrow) {\r\n            toolbarArrow.classList.remove('jtoolbar-arrow-selected')\r\n        }\r\n        // End tracking\r\n        tracking(obj, false);\r\n    }\r\n\r\n    obj.refresh = function() {\r\n        if (obj.options.responsive == true) {\r\n            // Width of the c\r\n            var rect = el.parentNode.getBoundingClientRect();\r\n            if (! obj.options.maxWidth) {\r\n                obj.options.maxWidth = rect.width;\r\n            }\r\n            // Available parent space\r\n            var available = parseInt(obj.options.maxWidth);\r\n            // Remove arrow\r\n            if (toolbarArrow && toolbarArrow.parentNode) {\r\n                toolbarArrow.parentNode.removeChild(toolbarArrow);\r\n            }\r\n            // Move all items to the toolbar\r\n            while (toolbarFloating && toolbarFloating.firstChild) {\r\n                toolbarContent.appendChild(toolbarFloating.firstChild);\r\n            }\r\n            // Toolbar is larger than the parent, move elements to the floating element\r\n            if (available < toolbarContent.offsetWidth) {\r\n                // Give space to the floating element\r\n                available -= 50;\r\n                // Move to the floating option\r\n                while (toolbarContent.lastChild && available < toolbarContent.offsetWidth) {\r\n                    toolbarFloating.insertBefore(toolbarContent.lastChild, toolbarFloating.firstChild);\r\n                }\r\n            }\r\n            // Show arrow\r\n            if (toolbarFloating && toolbarFloating.children.length > 0) {\r\n                toolbarContent.appendChild(toolbarArrow);\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.setReadonly = function(state) {\r\n        state = state ? 'add' : 'remove';\r\n        el.classList[state]('jtoolbar-disabled');\r\n    }\r\n\r\n    elClickHandler = function(e) {\r\n        var element = helpers.findElement(e.target, 'jtoolbar-item');\r\n        if (element) {\r\n            obj.selectItem(element);\r\n        }\r\n\r\n        if (e.target.classList.contains('jtoolbar-arrow') || e.target.parentNode.classList.contains('jtoolbar-arrow')) {\r\n            obj.open();\r\n        }\r\n    };\r\n    el.addEventListener('click', elClickHandler);\r\n\r\n    windowResizeHandler = function() {\r\n        obj.refresh();\r\n    };\r\n    window.addEventListener('resize', windowResizeHandler);\r\n\r\n    // Toolbar\r\n    el.classList.add('jtoolbar');\r\n    // Reset content\r\n    el.innerHTML = '';\r\n    // Container\r\n    if (obj.options.container == true) {\r\n        el.classList.add('jtoolbar-container');\r\n    }\r\n    // Content\r\n    var toolbarContent = document.createElement('div');\r\n    el.appendChild(toolbarContent);\r\n    // Special toolbar for mobile applications\r\n    if (obj.options.app) {\r\n        el.classList.add('jtoolbar-mobile');\r\n    }\r\n    // Create toolbar\r\n    obj.create(obj.options.items);\r\n    // Shortcut\r\n    el.toolbar = obj;\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/utils/filter.js\n\r\n// Valid tags (removed iframe for security)\r\nconst validTags = [\r\n    'html','body','address','span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'b', 'i', 'blockquote',\r\n    'strong', 'em', 'ul', 'ol', 'li', 'a', 'code', 'pre', 'hr', 'br', 'img',\r\n    'figure', 'picture', 'figcaption', 'table', 'thead', 'tbody', 'tfoot', 'tr',\r\n    'th', 'td', 'caption', 'u', 'del', 'ins', 'sub', 'sup', 'small', 'mark',\r\n    'input', 'textarea', 'select', 'option', 'button', 'label', 'fieldset',\r\n    'legend', 'audio', 'video', 'abbr', 'cite', 'kbd', 'section', 'article',\r\n    'nav', 'aside', 'header', 'footer', 'main', 'details', 'summary', 'svg', 'line', 'source'\r\n];\r\n\r\n// Dangerous tags that should be completely removed\r\nconst dangerousTags = ['script', 'object', 'embed', 'applet', 'meta', 'base', 'link', 'iframe'];\r\n\r\n// Valid properties (added id, class, title, alt for better editor support)\r\nconst validProperty = ['width', 'height', 'align', 'border', 'src', 'href', 'tabindex', 'id', 'class', 'title', 'alt'];\r\n\r\n// Tags that are allowed to have src attribute\r\nconst tagsAllowedSrc = ['img', 'audio', 'video', 'source'];\r\n\r\n// Tags that are allowed to have href attribute\r\nconst tagsAllowedHref = ['a'];\r\n\r\n// Valid CSS attributes\r\nconst validStyle = ['color', 'font-weight', 'font-size', 'background', 'background-color', 'margin', 'padding', 'text-align', 'text-decoration'];\r\n\r\n// Function to decode HTML entities (prevents bypassing with &#106;avascript:)\r\nfunction decodeHTMLEntities(text) {\r\n    if (!text) return '';\r\n    const textArea = document.createElement('textarea');\r\n    textArea.innerHTML = text;\r\n    return textArea.value;\r\n}\r\n\r\n// Function to check if a URL scheme is dangerous\r\nfunction isDangerousURL(url) {\r\n    if (!url) return false;\r\n    const decoded = decodeHTMLEntities(url).toLowerCase().trim();\r\n    // Remove whitespace and null bytes that can be used to bypass filters\r\n    const cleaned = decoded.replace(/[\\s\\0]/g, '');\r\n\r\n    return cleaned.startsWith('javascript:') ||\r\n           cleaned.startsWith('data:text/') ||\r\n           cleaned.startsWith('data:application/') ||\r\n           cleaned.startsWith('vbscript:') ||\r\n           cleaned.includes('<script');\r\n}\r\n\r\n// Function to sanitize CSS value\r\nfunction sanitizeStyleValue(value) {\r\n    if (!value) return '';\r\n    const decoded = decodeHTMLEntities(value).toLowerCase();\r\n\r\n    // Block dangerous CSS content\r\n    if (decoded.includes('javascript:') ||\r\n        decoded.includes('expression(') ||\r\n        decoded.includes('behavior:') ||\r\n        decoded.includes('-moz-binding') ||\r\n        decoded.includes('binding:') ||\r\n        decoded.includes('@import') ||\r\n        decoded.includes('url(') && (decoded.includes('javascript:') || decoded.includes('data:'))) {\r\n        return '';\r\n    }\r\n\r\n    return value;\r\n}\r\n\r\nconst parse = function(element, img) {\r\n    if (!element || !element.tagName) {\r\n        return;\r\n    }\r\n\r\n    const tagName = element.tagName.toLowerCase();\r\n\r\n    // Remove dangerous tags completely\r\n    if (dangerousTags.indexOf(tagName) !== -1) {\r\n        if (element.parentNode) {\r\n            element.parentNode.removeChild(element);\r\n        }\r\n        return;\r\n    }\r\n\r\n    // Remove elements that are not white-listed\r\n    if (validTags.indexOf(tagName) === -1) {\r\n        if (element.innerText) {\r\n            element.innerHTML = element.innerText;\r\n        }\r\n    }\r\n\r\n    // Remove attributes\r\n    if (element.attributes && element.attributes.length) {\r\n        let style = null;\r\n        // Process style attribute\r\n        let elementStyle = element.getAttribute('style');\r\n        if (elementStyle) {\r\n            style = [];\r\n            let t = elementStyle.split(';');\r\n            for (let j = 0; j < t.length; j++) {\r\n                let v = t[j].trim().split(':');\r\n                const property = v[0].trim();\r\n                if (validStyle.indexOf(property) >= 0) {\r\n                    let k = v.shift();\r\n                    v = v.join(':');\r\n                    // Sanitize the CSS value\r\n                    const sanitizedValue = sanitizeStyleValue(v);\r\n                    if (sanitizedValue) {\r\n                        style.push(k + ':' + sanitizedValue);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Process image\r\n        if (tagName === 'img') {\r\n            const src = element.getAttribute('src');\r\n            if (!src || isDangerousURL(src)) {\r\n                if (element.parentNode) {\r\n                    element.parentNode.removeChild(element);\r\n                }\r\n                return;\r\n            } else {\r\n                element.setAttribute('tabindex', '900');\r\n                // Check attributes for persistence\r\n                img.push(src);\r\n            }\r\n        }\r\n\r\n        // Collect all attribute names first\r\n        let attr = [];\r\n        for (let i = 0; i < element.attributes.length; i++) {\r\n            attr.push(element.attributes[i].name);\r\n        }\r\n\r\n        // Process attributes\r\n        if (attr.length) {\r\n            attr.forEach(function (v) {\r\n                const attrName = v.toLowerCase();\r\n\r\n                // Remove all event handlers (onclick, onerror, onload, etc.)\r\n                if (attrName.startsWith('on')) {\r\n                    element.removeAttribute(v);\r\n                    return;\r\n                }\r\n\r\n                // Check if attribute is in whitelist\r\n                if (validProperty.indexOf(attrName) === -1) {\r\n                    element.removeAttribute(v);\r\n                } else {\r\n                    // Validate whitelisted attributes\r\n                    let attrValue = element.getAttribute(v);\r\n\r\n                    // Special handling for src attribute\r\n                    if (attrName === 'src') {\r\n                        if (tagsAllowedSrc.indexOf(tagName) === -1) {\r\n                            // src not allowed on this tag\r\n                            element.removeAttribute(v);\r\n                            return;\r\n                        }\r\n                        if (isDangerousURL(attrValue)) {\r\n                            element.removeAttribute(v);\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    // Special handling for href attribute\r\n                    if (attrName === 'href') {\r\n                        if (tagsAllowedHref.indexOf(tagName) === -1) {\r\n                            // href not allowed on this tag\r\n                            element.removeAttribute(v);\r\n                            return;\r\n                        }\r\n                        if (isDangerousURL(attrValue)) {\r\n                            element.removeAttribute(v);\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    // Protection XSS - check for dangerous characters\r\n                    if (attrValue && attrValue.indexOf('<') !== -1) {\r\n                        element.setAttribute(v, attrValue.replace(/</g, '&#60;'));\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        element.style = '';\r\n        // Add valid style\r\n        if (style && style.length) {\r\n            element.setAttribute('style', style.join(';'));\r\n        }\r\n    }\r\n\r\n    // Parse children recursively\r\n    if (element.children.length) {\r\n        for (let i = element.children.length; i > 0; i--) {\r\n            parse(element.children[i - 1], img);\r\n        }\r\n    }\r\n}\r\n\r\nconst filter = function(data, img) {\r\n    if (data) {\r\n        data = data.replace(new RegExp('<!--(.*?)-->', 'gsi'), '');\r\n    }\r\n    let parser = new DOMParser();\r\n    let d = parser.parseFromString(data, \"text/html\");\r\n    parse(d.body, img);\r\n    let div = document.createElement('div');\r\n    div.innerHTML = d.body.innerHTML;\r\n    return div;\r\n}\r\n\r\n/* harmony default export */ var utils_filter = (filter);\n;// CONCATENATED MODULE: ./src/plugins/editor.js\n\r\n\r\n\r\n\r\n\r\n\r\nfunction Editor() {\r\n    var Component = (function(el, options) {\r\n        // New instance\r\n        var obj = { type:'editor' };\r\n        obj.options = {};\r\n\r\n        // Default configuration\r\n        var defaults = {\r\n            // Load data from a remove location\r\n            url: null,\r\n            // Initial HTML content\r\n            value: '',\r\n            // Initial snippet\r\n            snippet: null,\r\n            // Add toolbar\r\n            toolbar: true,\r\n            toolbarOnTop: false,\r\n            // Website parser is to read websites and images from cross domain\r\n            remoteParser: null,\r\n            // Placeholder\r\n            placeholder: null,\r\n            // Parse URL\r\n            filterPaste: true,\r\n            // Accept drop files\r\n            dropZone: true,\r\n            dropAsSnippet: false,\r\n            acceptImages: true,\r\n            acceptFiles: false,\r\n            maxFileSize: 5000000,\r\n            allowImageResize: true,\r\n            // Style\r\n            maxHeight: null,\r\n            height: null,\r\n            focus: false,\r\n            // Events\r\n            onclick: null,\r\n            onfocus: null,\r\n            onblur: null,\r\n            onload: null,\r\n            onkeyup: null,\r\n            onkeydown: null,\r\n            onchange: null,\r\n            extensions: null,\r\n            type: null,\r\n        };\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                obj.options[property] = defaults[property];\r\n            }\r\n        }\r\n\r\n        // Private controllers\r\n        var editorTimer = null;\r\n        var editorAction = null;\r\n        var files = [];\r\n\r\n        // Keep the reference for the container\r\n        obj.el = el;\r\n\r\n        if (typeof(obj.options.onclick) == 'function') {\r\n            el.onclick = function(e) {\r\n                obj.options.onclick(el, obj, e);\r\n            }\r\n        }\r\n\r\n        // Prepare container\r\n        el.classList.add('jeditor-container');\r\n\r\n        // Snippet\r\n        var snippet = document.createElement('div');\r\n        snippet.className = 'jsnippet';\r\n        snippet.setAttribute('contenteditable', false);\r\n\r\n        // Toolbar\r\n        var toolbar = document.createElement('div');\r\n        toolbar.className = 'jeditor-toolbar';\r\n\r\n        obj.editor = document.createElement('div');\r\n        obj.editor.setAttribute('contenteditable', true);\r\n        obj.editor.setAttribute('spellcheck', false);\r\n        obj.editor.classList.add('jeditor');\r\n\r\n        // Placeholder\r\n        if (obj.options.placeholder) {\r\n            obj.editor.setAttribute('data-placeholder', obj.options.placeholder);\r\n        }\r\n\r\n        // Max height\r\n        if (obj.options.maxHeight || obj.options.height) {\r\n            obj.editor.style.overflowY = 'auto';\r\n\r\n            if (obj.options.maxHeight) {\r\n                obj.editor.style.maxHeight = obj.options.maxHeight;\r\n            }\r\n            if (obj.options.height) {\r\n                obj.editor.style.height = obj.options.height;\r\n            }\r\n        }\r\n\r\n        // Set editor initial value\r\n        if (obj.options.url) {\r\n            ajax({\r\n                url: obj.options.url,\r\n                dataType: 'html',\r\n                success: function(result) {\r\n                    obj.editor.innerHTML = result;\r\n\r\n                    Component.setCursor(obj.editor, obj.options.focus == 'initial' ? true : false);\r\n                }\r\n            })\r\n        } else {\r\n            if (obj.options.value) {\r\n                obj.editor.innerHTML = obj.options.value;\r\n            } else {\r\n                // Create from existing elements\r\n                for (var i = 0; i < el.children.length; i++) {\r\n                    obj.editor.appendChild(el.children[i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Make sure element is empty\r\n        el.innerHTML = '';\r\n\r\n        /**\r\n         * Onchange event controllers\r\n         */\r\n        var change = function(e) {\r\n            if (typeof(obj.options.onchange) == 'function') {\r\n                obj.options.onchange(el, obj, e);\r\n            }\r\n\r\n            // Update value\r\n            obj.options.value = obj.getData();\r\n\r\n            // Lemonade JS\r\n            if (el.value != obj.options.value) {\r\n                el.value = obj.options.value;\r\n                if (typeof(el.oninput) == 'function') {\r\n                    el.oninput({\r\n                        type: 'input',\r\n                        target: el,\r\n                        value: el.value\r\n                    });\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Extract images from a HTML string\r\n         */\r\n        var extractImageFromHtml = function(html) {\r\n            let img = [];\r\n            // Create temp element\r\n            var div = document.createElement('div');\r\n            utils_filter(html, img);\r\n            if (img.length) {\r\n                for (var i = 0; i < img.length; i++) {\r\n                    obj.addImage(img[i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Insert node at caret\r\n         */\r\n        var insertNodeAtCaret = function(newNode) {\r\n            var sel, range;\r\n\r\n            if (window.getSelection) {\r\n                sel = window.getSelection();\r\n                if (sel.rangeCount) {\r\n                    range = sel.getRangeAt(0);\r\n                    var selectedText = range.toString();\r\n                    range.deleteContents();\r\n                    range.insertNode(newNode);\r\n                    // move the cursor after element\r\n                    range.setStartAfter(newNode);\r\n                    range.setEndAfter(newNode);\r\n                    sel.removeAllRanges();\r\n                    sel.addRange(range);\r\n                }\r\n            }\r\n        }\r\n\r\n        var updateTotalImages = function() {\r\n            var o = null;\r\n            if (o = snippet.children[0]) {\r\n                // Make sure is a grid\r\n                if (! o.classList.contains('jslider-grid')) {\r\n                    o.classList.add('jslider-grid');\r\n                }\r\n                // Quantify of images\r\n                var number = o.children.length;\r\n                // Set the configuration of the grid\r\n                o.setAttribute('data-number', number > 4 ? 4 : number);\r\n                // Total of images inside the grid\r\n                if (number > 4) {\r\n                    o.setAttribute('data-total', number - 4);\r\n                } else {\r\n                    o.removeAttribute('data-total');\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Append image to the snippet\r\n         */\r\n        var appendImage = function(image) {\r\n            if (! snippet.innerHTML) {\r\n                obj.appendSnippet({});\r\n            }\r\n            snippet.children[0].appendChild(image);\r\n            updateTotalImages();\r\n        }\r\n\r\n        /**\r\n         * Append snippet\r\n         * @Param object data\r\n         */\r\n        obj.appendSnippet = function(data) {\r\n            // Reset snippet\r\n            snippet.innerHTML = '';\r\n\r\n            // Attributes\r\n            var a = [ 'image', 'title', 'description', 'host', 'url' ];\r\n\r\n            for (var i = 0; i < a.length; i++) {\r\n                var div = document.createElement('div');\r\n                div.className = 'jsnippet-' + a[i];\r\n                div.setAttribute('data-k', a[i]);\r\n                snippet.appendChild(div);\r\n                if (data[a[i]]) {\r\n                    if (a[i] == 'image') {\r\n                        if (! Array.isArray(data.image)) {\r\n                            data.image = [ data.image ];\r\n                        }\r\n                        for (var j = 0; j < data.image.length; j++) {\r\n                            var img = document.createElement('img');\r\n                            img.src = data.image[j];\r\n                            div.appendChild(img);\r\n                        }\r\n                    } else {\r\n                        div.innerHTML = data[a[i]];\r\n                    }\r\n                }\r\n            }\r\n\r\n            obj.editor.appendChild(document.createElement('br'));\r\n            obj.editor.appendChild(snippet);\r\n        }\r\n\r\n        /**\r\n         * Set editor value\r\n         */\r\n        obj.setData = function(o) {\r\n            if (typeof(o) == 'object') {\r\n                obj.editor.innerHTML = o.content;\r\n            } else {\r\n                obj.editor.innerHTML = o;\r\n            }\r\n\r\n            if (obj.options.focus) {\r\n                Component.setCursor(obj.editor, true);\r\n            }\r\n\r\n            // Reset files container\r\n            files = [];\r\n        }\r\n\r\n        obj.getFiles = function() {\r\n            var f = obj.editor.querySelectorAll('.jfile');\r\n            var d = [];\r\n            for (var i = 0; i < f.length; i++) {\r\n                if (files[f[i].src]) {\r\n                    d.push(files[f[i].src]);\r\n                }\r\n            }\r\n            return d;\r\n        }\r\n\r\n        obj.getText = function() {\r\n            return obj.editor.innerText;\r\n        }\r\n\r\n        /**\r\n         * Get editor data\r\n         */\r\n        obj.getData = function(json) {\r\n            if (! json) {\r\n                var data = obj.editor.innerHTML;\r\n            } else {\r\n                var data = {\r\n                    content : '',\r\n                }\r\n\r\n                // Get snippet\r\n                if (snippet.innerHTML) {\r\n                    var index = 0;\r\n                    data.snippet = {};\r\n                    for (var i = 0; i < snippet.children.length; i++) {\r\n                        // Get key from element\r\n                        var key = snippet.children[i].getAttribute('data-k');\r\n                        if (key) {\r\n                            if (key == 'image') {\r\n                                if (! data.snippet.image) {\r\n                                    data.snippet.image = [];\r\n                                }\r\n                                // Get all images\r\n                                for (var j = 0; j < snippet.children[i].children.length; j++) {\r\n                                    data.snippet.image.push(snippet.children[i].children[j].getAttribute('src'))\r\n                                }\r\n                            } else {\r\n                                data.snippet[key] = snippet.children[i].innerHTML;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Get files\r\n                var f = Object.keys(files);\r\n                if (f.length) {\r\n                    data.files = [];\r\n                    for (var i = 0; i < f.length; i++) {\r\n                        data.files.push(files[f[i]]);\r\n                    }\r\n                }\r\n\r\n                // Get content\r\n                var d = document.createElement('div');\r\n                d.innerHTML = obj.editor.innerHTML;\r\n                var s = d.querySelector('.jsnippet');\r\n                if (s) {\r\n                    s.remove();\r\n                }\r\n\r\n                var text = d.innerHTML;\r\n                text = text.replace(/<br>/g, \"\\n\");\r\n                text = text.replace(/<\\/div>/g, \"<\\/div>\\n\");\r\n                text = text.replace(/<(?:.|\\n)*?>/gm, \"\");\r\n                data.content = text.trim();\r\n\r\n                // Process extensions\r\n                processExtensions('getData', data);\r\n            }\r\n\r\n            return data;\r\n        }\r\n\r\n        // Reset\r\n        obj.reset = function() {\r\n            obj.editor.innerHTML = '';\r\n            snippet.innerHTML = '';\r\n            files = [];\r\n        }\r\n\r\n        obj.addPdf = function(data) {\r\n            if (data.result.substr(0,4) != 'data') {\r\n                console.error('Invalid source');\r\n            } else {\r\n                var canvas = document.createElement('canvas');\r\n                canvas.width = 60;\r\n                canvas.height = 60;\r\n\r\n                var img = new Image();\r\n                var ctx = canvas.getContext('2d');\r\n                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n                canvas.toBlob(function(blob) {\r\n                    var newImage = document.createElement('img');\r\n                    newImage.src = window.URL.createObjectURL(blob);\r\n                    newImage.title = data.name;\r\n                    newImage.className = 'jfile pdf';\r\n\r\n                    files[newImage.src] = {\r\n                        file: newImage.src,\r\n                        extension: 'pdf',\r\n                        content: data.result,\r\n                    }\r\n\r\n                    //insertNodeAtCaret(newImage);\r\n                    document.execCommand('insertHtml', false, newImage.outerHTML);\r\n                });\r\n            }\r\n        }\r\n\r\n        obj.addImage = function(src, asSnippet) {\r\n            if (! obj.options.acceptImages) {\r\n                return;\r\n            }\r\n\r\n            if (! src) {\r\n                src = '';\r\n            }\r\n\r\n            if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\r\n                console.error('remoteParser not defined in your initialization');\r\n            } else {\r\n                // This is to process cross domain images\r\n                if (src.substr(0,4) == 'data') {\r\n                    var extension = src.split(';')\r\n                    extension = extension[0].split('/');\r\n                    extension = extension[1];\r\n                } else {\r\n                    var extension = src.substr(src.lastIndexOf('.') + 1);\r\n                    // Work for cross browsers\r\n                    src = obj.options.remoteParser + src;\r\n                }\r\n\r\n                var img = new Image();\r\n\r\n                img.onload = function onload() {\r\n                    var canvas = document.createElement('canvas');\r\n                    canvas.width = img.width;\r\n                    canvas.height = img.height;\r\n\r\n                    var ctx = canvas.getContext('2d');\r\n                    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n                    canvas.toBlob(function(blob) {\r\n                        var newImage = document.createElement('img');\r\n                        newImage.src = window.URL.createObjectURL(blob);\r\n                        newImage.classList.add('jfile');\r\n                        newImage.setAttribute('tabindex', '900');\r\n                        newImage.setAttribute('width', img.width);\r\n                        newImage.setAttribute('height', img.height);\r\n                        files[newImage.src] = {\r\n                            file: newImage.src,\r\n                            extension: extension,\r\n                            content: canvas.toDataURL(),\r\n                        }\r\n\r\n                        if (obj.options.dropAsSnippet || asSnippet) {\r\n                            appendImage(newImage);\r\n                            // Just to understand the attachment is part of a snippet\r\n                            files[newImage.src].snippet = true;\r\n                        } else {\r\n                            //insertNodeAtCaret(newImage);\r\n                            document.execCommand('insertHtml', false, newImage.outerHTML);\r\n                        }\r\n\r\n                        change();\r\n                    });\r\n                };\r\n\r\n                img.src = src;\r\n            }\r\n        }\r\n\r\n        obj.addFile = function(files) {\r\n            var reader = [];\r\n\r\n            for (var i = 0; i < files.length; i++) {\r\n                if (files[i].size > obj.options.maxFileSize) {\r\n                    alert('The file is too big');\r\n                } else {\r\n                    // Only PDF or Images\r\n                    var type = files[i].type.split('/');\r\n\r\n                    if (type[0] == 'image') {\r\n                        type = 1;\r\n                    } else if (type[1] == 'pdf') {\r\n                        type = 2;\r\n                    } else {\r\n                        type = 0;\r\n                    }\r\n\r\n                    if (type) {\r\n                        // Create file\r\n                        reader[i] = new FileReader();\r\n                        reader[i].index = i;\r\n                        reader[i].type = type;\r\n                        reader[i].name = files[i].name;\r\n                        reader[i].date = files[i].lastModified;\r\n                        reader[i].size = files[i].size;\r\n                        reader[i].addEventListener(\"load\", function (data) {\r\n                            // Get result\r\n                            if (data.target.type == 2) {\r\n                                if (obj.options.acceptFiles == true) {\r\n                                    obj.addPdf(data.target);\r\n                                }\r\n                            } else {\r\n                                obj.addImage(data.target.result);\r\n                            }\r\n                        }, false);\r\n\r\n                        reader[i].readAsDataURL(files[i])\r\n                    } else {\r\n                        alert('The extension is not allowed');\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Destroy\r\n        obj.destroy = function() {\r\n            obj.editor.removeEventListener('mouseup', editorMouseUp);\r\n            obj.editor.removeEventListener('mousedown', editorMouseDown);\r\n            obj.editor.removeEventListener('mousemove', editorMouseMove);\r\n            obj.editor.removeEventListener('keyup', editorKeyUp);\r\n            obj.editor.removeEventListener('keydown', editorKeyDown);\r\n            obj.editor.removeEventListener('dragstart', editorDragStart);\r\n            obj.editor.removeEventListener('dragenter', editorDragEnter);\r\n            obj.editor.removeEventListener('dragover', editorDragOver);\r\n            obj.editor.removeEventListener('drop', editorDrop);\r\n            obj.editor.removeEventListener('paste', editorPaste);\r\n            obj.editor.removeEventListener('blur', editorBlur);\r\n            obj.editor.removeEventListener('focus', editorFocus);\r\n\r\n            el.editor = null;\r\n            el.classList.remove('jeditor-container');\r\n\r\n            toolbar.remove();\r\n            snippet.remove();\r\n            obj.editor.remove();\r\n        }\r\n\r\n        obj.upload = function() {\r\n            helpers.click(obj.file);\r\n        }\r\n\r\n        var select = function(e) {\r\n            var s = window.getSelection()\r\n            var r = document.createRange();\r\n            r.selectNode(e);\r\n            s.addRange(r)\r\n        }\r\n\r\n        var editorPaste = function(e) {\r\n            if (obj.options.filterPaste == true) {\r\n                if (e.clipboardData || e.originalEvent.clipboardData) {\r\n                    var html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n                    var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n                    var file = (e.originalEvent || e).clipboardData.files\r\n                } else if (window.clipboardData) {\r\n                    var html = window.clipboardData.getData('Html');\r\n                    var text = window.clipboardData.getData('Text');\r\n                    var file = window.clipboardData.files\r\n                }\r\n\r\n                if (file.length) {\r\n                    // Paste a image from the clipboard\r\n                    obj.addFile(file);\r\n                } else {\r\n                    if (! html) {\r\n                        html = text.split('\\r\\n');\r\n                        if (! e.target.innerText) {\r\n                            html.map(function(v) {\r\n                                var d = document.createElement('div');\r\n                                d.innerText = v;\r\n                                obj.editor.appendChild(d);\r\n                            });\r\n                        } else {\r\n                            html = html.map(function(v) {\r\n                                return '<div>' + v + '</div>';\r\n                            });\r\n                            document.execCommand('insertText', false, html.join(''));\r\n                        }\r\n                    } else {\r\n                        let img = [];\r\n                        var d = utils_filter(html, img);\r\n                        if (img.length) {\r\n                            for (var i = 0; i < img.length; i++) {\r\n                                obj.addImage(img[i]);\r\n                            }\r\n                        }\r\n                        // Paste to the editor\r\n                        //insertNodeAtCaret(d);\r\n                        document.execCommand('insertHtml', false, d.innerHTML);\r\n                    }\r\n                }\r\n\r\n                e.preventDefault();\r\n            }\r\n        }\r\n\r\n        var editorDragStart = function(e) {\r\n            if (editorAction && editorAction.e) {\r\n                e.preventDefault();\r\n            }\r\n        }\r\n\r\n        var editorDragEnter = function(e) {\r\n            if (editorAction || obj.options.dropZone == false) {\r\n                // Do nothing\r\n            } else {\r\n                el.classList.add('jeditor-dragging');\r\n                e.preventDefault();\r\n            }\r\n        }\r\n\r\n        var editorDragOver = function(e) {\r\n            if (editorAction || obj.options.dropZone == false) {\r\n                // Do nothing\r\n            } else {\r\n                if (editorTimer) {\r\n                    clearTimeout(editorTimer);\r\n                }\r\n\r\n                editorTimer = setTimeout(function() {\r\n                    el.classList.remove('jeditor-dragging');\r\n                }, 100);\r\n                e.preventDefault();\r\n            }\r\n        }\r\n\r\n        var editorDrop = function(e) {\r\n            if (editorAction || obj.options.dropZone === false) {\r\n                // Do nothing\r\n            } else {\r\n                // Position caret on the drop\r\n                let range = null;\r\n                if (document.caretRangeFromPoint) {\r\n                    range=document.caretRangeFromPoint(e.clientX, e.clientY);\r\n                } else if (e.rangeParent) {\r\n                    range=document.createRange();\r\n                    range.setStart(e.rangeParent,e.rangeOffset);\r\n                }\r\n                let sel = window.getSelection();\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n                sel.anchorNode.parentNode.focus();\r\n\r\n                let html = (e.originalEvent || e).dataTransfer.getData('text/html');\r\n                let text = (e.originalEvent || e).dataTransfer.getData('text/plain');\r\n                let file = (e.originalEvent || e).dataTransfer.files;\r\n\r\n                if (file.length) {\r\n                    obj.addFile(file);\r\n                } else if (text) {\r\n                    extractImageFromHtml(html);\r\n                }\r\n\r\n                el.classList.remove('jeditor-dragging');\r\n                e.preventDefault();\r\n            }\r\n        }\r\n\r\n        var editorBlur = function(e) {\r\n            // Process extensions\r\n            processExtensions('onevent', e);\r\n            // Apply changes\r\n            change(e);\r\n            // Blur\r\n            if (typeof(obj.options.onblur) == 'function') {\r\n                obj.options.onblur(el, obj, e);\r\n            }\r\n        }\r\n\r\n        var editorFocus = function(e) {\r\n            // Focus\r\n            if (typeof(obj.options.onfocus) == 'function') {\r\n                obj.options.onfocus(el, obj, e);\r\n            }\r\n        }\r\n\r\n        var editorKeyUp = function(e) {\r\n            if (! obj.editor.innerHTML) {\r\n                obj.editor.innerHTML = '<div><br></div>';\r\n            }\r\n            if (typeof(obj.options.onkeyup) == 'function') {\r\n                obj.options.onkeyup(el, obj, e);\r\n            }\r\n        }\r\n\r\n        var editorKeyDown = function(e) {\r\n            // Process extensions\r\n            processExtensions('onevent', e);\r\n\r\n            if (e.key == 'Delete') {\r\n                if (e.target.tagName == 'IMG') {\r\n                    var parent = e.target.parentNode;\r\n                    select(e.target);\r\n                    if (parent.classList.contains('jsnippet-image')) {\r\n                        updateTotalImages();\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (typeof(obj.options.onkeydown) == 'function') {\r\n                obj.options.onkeydown(el, obj, e);\r\n            }\r\n        }\r\n\r\n        var editorMouseUp = function(e) {\r\n            if (editorAction && editorAction.e) {\r\n                editorAction.e.classList.remove('resizing');\r\n\r\n                if (editorAction.e.changed == true) {\r\n                    var image = editorAction.e.cloneNode()\r\n                    image.width = parseInt(editorAction.e.style.width) || editorAction.e.getAttribute('width');\r\n                    image.height = parseInt(editorAction.e.style.height) || editorAction.e.getAttribute('height');\r\n                    editorAction.e.style.width = '';\r\n                    editorAction.e.style.height = '';\r\n                    select(editorAction.e);\r\n                    document.execCommand('insertHtml', false, image.outerHTML);\r\n                }\r\n            }\r\n\r\n            editorAction = false;\r\n        }\r\n\r\n        var editorMouseDown = function(e) {\r\n            var close = function(snippet) {\r\n                var rect = snippet.getBoundingClientRect();\r\n                if (rect.width - (e.clientX - rect.left) < 40 && e.clientY - rect.top < 40) {\r\n                    snippet.innerHTML = '';\r\n                    snippet.remove();\r\n                }\r\n            }\r\n\r\n            if (e.target.tagName == 'IMG') {\r\n                if (e.target.style.cursor) {\r\n                    var rect = e.target.getBoundingClientRect();\r\n                    editorAction = {\r\n                        e: e.target,\r\n                        x: e.clientX,\r\n                        y: e.clientY,\r\n                        w: rect.width,\r\n                        h: rect.height,\r\n                        d: e.target.style.cursor,\r\n                    }\r\n\r\n                    if (! e.target.getAttribute('width')) {\r\n                        e.target.setAttribute('width', rect.width)\r\n                    }\r\n\r\n                    if (! e.target.getAttribute('height')) {\r\n                        e.target.setAttribute('height', rect.height)\r\n                    }\r\n\r\n                    var s = window.getSelection();\r\n                    if (s.rangeCount) {\r\n                        for (var i = 0; i < s.rangeCount; i++) {\r\n                            s.removeRange(s.getRangeAt(i));\r\n                        }\r\n                    }\r\n\r\n                    e.target.classList.add('resizing');\r\n                } else {\r\n                    editorAction = true;\r\n                }\r\n            } else {\r\n                if (e.target.classList.contains('jsnippet')) {\r\n                    close(e.target);\r\n                } else if (e.target.parentNode.classList.contains('jsnippet')) {\r\n                    close(e.target.parentNode);\r\n                }\r\n\r\n                editorAction = true;\r\n            }\r\n        }\r\n\r\n        var editorMouseMove = function(e) {\r\n            if (e.target.tagName == 'IMG' && ! e.target.parentNode.classList.contains('jsnippet-image') && obj.options.allowImageResize == true) {\r\n                if (e.target.getAttribute('tabindex')) {\r\n                    var rect = e.target.getBoundingClientRect();\r\n                    if (e.clientY - rect.top < 5) {\r\n                        if (rect.width - (e.clientX - rect.left) < 5) {\r\n                            e.target.style.cursor = 'ne-resize';\r\n                        } else if (e.clientX - rect.left < 5) {\r\n                            e.target.style.cursor = 'nw-resize';\r\n                        } else {\r\n                            e.target.style.cursor = 'n-resize';\r\n                        }\r\n                    } else if (rect.height - (e.clientY - rect.top) < 5) {\r\n                        if (rect.width - (e.clientX - rect.left) < 5) {\r\n                            e.target.style.cursor = 'se-resize';\r\n                        } else if (e.clientX - rect.left < 5) {\r\n                            e.target.style.cursor = 'sw-resize';\r\n                        } else {\r\n                            e.target.style.cursor = 's-resize';\r\n                        }\r\n                    } else if (rect.width - (e.clientX - rect.left) < 5) {\r\n                        e.target.style.cursor = 'e-resize';\r\n                    } else if (e.clientX - rect.left < 5) {\r\n                        e.target.style.cursor = 'w-resize';\r\n                    } else {\r\n                        e.target.style.cursor = '';\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Move\r\n            if (e.which == 1 && editorAction && editorAction.d) {\r\n                if (editorAction.d == 'e-resize' || editorAction.d == 'ne-resize' ||  editorAction.d == 'se-resize') {\r\n                    editorAction.e.style.width = (editorAction.w + (e.clientX - editorAction.x));\r\n\r\n                    if (e.shiftKey) {\r\n                        var newHeight = (e.clientX - editorAction.x) * (editorAction.h / editorAction.w);\r\n                        editorAction.e.style.height = editorAction.h + newHeight;\r\n                    } else {\r\n                        var newHeight =  null;\r\n                    }\r\n                }\r\n\r\n                if (! newHeight) {\r\n                    if (editorAction.d == 's-resize' || editorAction.d == 'se-resize' || editorAction.d == 'sw-resize') {\r\n                        if (! e.shiftKey) {\r\n                            editorAction.e.style.height = editorAction.h + (e.clientY - editorAction.y);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                editorAction.e.changed = true;\r\n            }\r\n        }\r\n\r\n        var processExtensions = function(method, data) {\r\n            if (obj.options.extensions) {\r\n                var ext = Object.keys(obj.options.extensions);\r\n                if (ext.length) {\r\n                    for (var i = 0; i < ext.length; i++)\r\n                        if (obj.options.extensions[ext[i]] && typeof(obj.options.extensions[ext[i]][method]) == 'function') {\r\n                            obj.options.extensions[ext[i]][method].call(obj, data);\r\n                        }\r\n                }\r\n            }\r\n        }\r\n\r\n        var loadExtensions = function() {\r\n            if (obj.options.extensions) {\r\n                var ext = Object.keys(obj.options.extensions);\r\n                if (ext.length) {\r\n                    for (var i = 0; i < ext.length; i++) {\r\n                        if (obj.options.extensions[ext[i]] && typeof (obj.options.extensions[ext[i]]) == 'function') {\r\n                            obj.options.extensions[ext[i]] = obj.options.extensions[ext[i]](el, obj);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        document.addEventListener('mouseup', editorMouseUp);\r\n        document.addEventListener('mousemove', editorMouseMove);\r\n        obj.editor.addEventListener('mousedown', editorMouseDown);\r\n        obj.editor.addEventListener('keyup', editorKeyUp);\r\n        obj.editor.addEventListener('keydown', editorKeyDown);\r\n        obj.editor.addEventListener('dragstart', editorDragStart);\r\n        obj.editor.addEventListener('dragenter', editorDragEnter);\r\n        obj.editor.addEventListener('dragover', editorDragOver);\r\n        obj.editor.addEventListener('drop', editorDrop);\r\n        obj.editor.addEventListener('paste', editorPaste);\r\n        obj.editor.addEventListener('focus', editorFocus);\r\n        obj.editor.addEventListener('blur', editorBlur);\r\n\r\n        // Append editor to the container\r\n        el.appendChild(obj.editor);\r\n        // Snippet\r\n        if (obj.options.snippet) {\r\n            obj.appendSnippet(obj.options.snippet);\r\n        }\r\n\r\n        // Add toolbar\r\n        if (obj.options.toolbar) {\r\n            // Default toolbar configuration\r\n            if (Array.isArray(obj.options.toolbar)) {\r\n                var toolbarOptions = {\r\n                    container: true,\r\n                    responsive: true,\r\n                    items: obj.options.toolbar\r\n                }\r\n            } else if (obj.options.toolbar === true) {\r\n                var toolbarOptions = {\r\n                    container: true,\r\n                    responsive: true,\r\n                    items: [],\r\n                }\r\n            } else {\r\n                var toolbarOptions = obj.options.toolbar;\r\n            }\r\n\r\n            // Default items\r\n            if (! (toolbarOptions.items && toolbarOptions.items.length)) {\r\n                toolbarOptions.items = Component.getDefaultToolbar(obj);\r\n            }\r\n\r\n            if (obj.options.toolbarOnTop) {\r\n                // Add class\r\n                el.classList.add('toolbar-on-top');\r\n                // Append to the DOM\r\n                el.insertBefore(toolbar, el.firstChild);\r\n            } else {\r\n                // Add padding to the editor\r\n                obj.editor.style.padding = '15px';\r\n                // Append to the DOM\r\n                el.appendChild(toolbar);\r\n            }\r\n\r\n            // Create toolbar\r\n            Toolbar(toolbar, toolbarOptions);\r\n\r\n            toolbar.addEventListener('click', function() {\r\n                obj.editor.focus();\r\n            })\r\n        }\r\n\r\n        // Upload file\r\n        obj.file = document.createElement('input');\r\n        obj.file.style.display = 'none';\r\n        obj.file.type = 'file';\r\n        obj.file.setAttribute('accept', 'image/*');\r\n        obj.file.onchange = function() {\r\n            obj.addFile(this.files);\r\n        }\r\n        el.appendChild(obj.file);\r\n\r\n        // Focus to the editor\r\n        if (obj.options.focus) {\r\n            Component.setCursor(obj.editor, obj.options.focus == 'initial' ? true : false);\r\n        }\r\n\r\n        // Change method\r\n        el.change = obj.setData;\r\n\r\n        // Global generic value handler\r\n        el.val = function(val) {\r\n            if (val === undefined) {\r\n                // Data type\r\n                var o = el.getAttribute('data-html') === 'true' ? false : true;\r\n                return obj.getData(o);\r\n            } else {\r\n                obj.setData(val);\r\n            }\r\n        }\r\n\r\n        loadExtensions();\r\n\r\n        el.editor = obj;\r\n\r\n        // Onload\r\n        if (typeof(obj.options.onload) == 'function') {\r\n            obj.options.onload(el, obj, obj.editor);\r\n        }\r\n\r\n        return obj;\r\n    });\r\n\r\n    Component.setCursor = function(element, first) {\r\n        element.focus();\r\n        document.execCommand('selectAll');\r\n        var sel = window.getSelection();\r\n        var range = sel.getRangeAt(0);\r\n        if (first == true) {\r\n            var node = range.startContainer;\r\n            var size = 0;\r\n        } else {\r\n            var node = range.endContainer;\r\n            var size = node.length;\r\n        }\r\n        range.setStart(node, size);\r\n        range.setEnd(node, size);\r\n        sel.removeAllRanges();\r\n        sel.addRange(range);\r\n    }\r\n\r\n    Component.getDefaultToolbar = function(obj) {\r\n\r\n        var color = function(a,b,c) {\r\n            if (! c.color) {\r\n                var t = null;\r\n                var colorPicker = Color(c, {\r\n                    onchange: function(o, v) {\r\n                        if (c.k === 'color') {\r\n                            document.execCommand('foreColor', false, v);\r\n                        } else {\r\n                            document.execCommand('backColor', false, v);\r\n                        }\r\n                    }\r\n                });\r\n                c.color.open();\r\n            }\r\n        }\r\n\r\n        var items = [];\r\n\r\n        items.push({\r\n            content: 'undo',\r\n            onclick: function() {\r\n                document.execCommand('undo');\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            content: 'redo',\r\n            onclick: function() {\r\n                document.execCommand('redo');\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            type: 'divisor'\r\n        });\r\n\r\n        if (obj.options.toolbarOnTop) {\r\n            items.push({\r\n                type: 'select',\r\n                width: '140px',\r\n                options: ['Default', 'Verdana', 'Arial', 'Courier New'],\r\n                render: function (e) {\r\n                    return '<span style=\"font-family:' + e + '\">' + e + '</span>';\r\n                },\r\n                onchange: function (a,b,c,d,e) {\r\n                    document.execCommand(\"fontName\", false, d);\r\n                }\r\n            });\r\n\r\n            items.push({\r\n                type: 'select',\r\n                content: 'format_size',\r\n                options: ['x-small', 'small', 'medium', 'large', 'x-large'],\r\n                render: function (e) {\r\n                    return '<span style=\"font-size:' + e + '\">' + e + '</span>';\r\n                },\r\n                onchange: function (a,b,c,d,e) {\r\n                    //var html = `<span style=\"font-size: ${c}\">${text}</span>`;\r\n                    //document.execCommand('insertHtml', false, html);\r\n                    document.execCommand(\"fontSize\", false, parseInt(e)+1);\r\n                    //var f = window.getSelection().anchorNode.parentNode\r\n                    //f.removeAttribute(\"size\");\r\n                    //f.style.fontSize = d;\r\n                }\r\n            });\r\n\r\n            items.push({\r\n                type: 'select',\r\n                options: ['format_align_left', 'format_align_center', 'format_align_right', 'format_align_justify'],\r\n                render: function (e) {\r\n                    return '<i class=\"material-icons\">' + e + '</i>';\r\n                },\r\n                onchange: function (a,b,c,d,e) {\r\n                    var options = ['JustifyLeft','justifyCenter','justifyRight','justifyFull'];\r\n                    document.execCommand(options[e]);\r\n                }\r\n            });\r\n\r\n            items.push({\r\n                type: 'divisor'\r\n            });\r\n\r\n            items.push({\r\n                content: 'format_color_text',\r\n                k: 'color',\r\n                onclick: color,\r\n            });\r\n\r\n            items.push({\r\n                content: 'format_color_fill',\r\n                k: 'background-color',\r\n                onclick: color,\r\n            });\r\n        }\r\n\r\n        items.push({\r\n            content: 'format_bold',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('bold');\r\n\r\n                if (document.queryCommandState(\"bold\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            content: 'format_italic',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('italic');\r\n\r\n                if (document.queryCommandState(\"italic\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            content: 'format_underline',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('underline');\r\n\r\n                if (document.queryCommandState(\"underline\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            type:'divisor'\r\n        });\r\n\r\n        items.push({\r\n            content: 'format_list_bulleted',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('insertUnorderedList');\r\n\r\n                if (document.queryCommandState(\"insertUnorderedList\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            content: 'format_list_numbered',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('insertOrderedList');\r\n\r\n                if (document.queryCommandState(\"insertOrderedList\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            content: 'format_indent_increase',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('indent', true, null);\r\n\r\n                if (document.queryCommandState(\"indent\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        items.push({\r\n            content: 'format_indent_decrease',\r\n            onclick: function(a,b,c) {\r\n                document.execCommand('outdent');\r\n\r\n                if (document.queryCommandState(\"outdent\")) {\r\n                    c.classList.add('selected');\r\n                } else {\r\n                    c.classList.remove('selected');\r\n                }\r\n            }\r\n        });\r\n\r\n        if (obj.options.toolbarOnTop) {\r\n            items.push({\r\n                type: 'divisor'\r\n            });\r\n\r\n            items.push({\r\n                content: 'photo',\r\n                onclick: function () {\r\n                    obj.upload();\r\n                }\r\n            });\r\n\r\n            items.push({\r\n                type: 'select',\r\n                content: 'table_view',\r\n                columns: 8,\r\n                grid: 8,\r\n                right: true,\r\n                options: [\r\n                    '0x0', '1x0', '2x0', '3x0', '4x0', '5x0', '6x0', '7x0',\r\n                    '0x1', '1x1', '2x1', '3x1', '4x1', '5x1', '6x1', '7x1',\r\n                    '0x2', '1x2', '2x2', '3x2', '4x2', '5x2', '6x2', '7x2',\r\n                    '0x3', '1x3', '2x3', '3x3', '4x3', '5x3', '6x3', '7x3',\r\n                    '0x4', '1x4', '2x4', '3x4', '4x4', '5x4', '6x4', '7x4',\r\n                    '0x5', '1x5', '2x5', '3x5', '4x5', '5x5', '6x5', '7x5',\r\n                    '0x6', '1x6', '2x6', '3x6', '4x6', '5x6', '6x6', '7x6',\r\n                    '0x7', '1x7', '2x7', '3x7', '4x7', '5x7', '6x7', '7x7',\r\n                ],\r\n                render: function (e, item) {\r\n                    if (item) {\r\n                        item.onmouseover = this.onmouseover;\r\n                        e = e.split('x');\r\n                        item.setAttribute('data-x', e[0]);\r\n                        item.setAttribute('data-y', e[1]);\r\n                    }\r\n                    var element = document.createElement('div');\r\n                    item.style.margin = '1px';\r\n                    item.style.border = '1px solid #ddd';\r\n                    return element;\r\n                },\r\n                onmouseover: function (e) {\r\n                    var x = parseInt(e.target.getAttribute('data-x'));\r\n                    var y = parseInt(e.target.getAttribute('data-y'));\r\n                    for (var i = 0; i < e.target.parentNode.children.length; i++) {\r\n                        var element = e.target.parentNode.children[i];\r\n                        var ex = parseInt(element.getAttribute('data-x'));\r\n                        var ey = parseInt(element.getAttribute('data-y'));\r\n                        if (ex <= x && ey <= y) {\r\n                            element.style.backgroundColor = '#cae1fc';\r\n                            element.style.borderColor = '#2977ff';\r\n                        } else {\r\n                            element.style.backgroundColor = '';\r\n                            element.style.borderColor = '#ddd';\r\n                        }\r\n                    }\r\n                },\r\n                onchange: function (a, b, c) {\r\n                    c = c.split('x');\r\n                    var table = document.createElement('table');\r\n                    var tbody = document.createElement('tbody');\r\n                    for (var y = 0; y <= c[1]; y++) {\r\n                        var tr = document.createElement('tr');\r\n                        for (var x = 0; x <= c[0]; x++) {\r\n                            var td = document.createElement('td');\r\n                            td.innerHTML = '';\r\n                            tr.appendChild(td);\r\n                        }\r\n                        tbody.appendChild(tr);\r\n                    }\r\n                    table.appendChild(tbody);\r\n                    table.setAttribute('width', '100%');\r\n                    table.setAttribute('cellpadding', '6');\r\n                    table.setAttribute('cellspacing', '0');\r\n                    document.execCommand('insertHTML', false, table.outerHTML);\r\n                }\r\n            });\r\n        }\r\n\r\n        return items;\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var editor = (Editor());\r\n\n;// CONCATENATED MODULE: ./src/plugins/floating.js\nfunction Floating() {\r\n    var Component = (function (el, options) {\r\n        var obj = {};\r\n        obj.options = {};\r\n\r\n        // Default configuration\r\n        var defaults = {\r\n            type: 'big',\r\n            title: 'Untitled',\r\n            width: 510,\r\n            height: 472,\r\n        }\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                obj.options[property] = defaults[property];\r\n            }\r\n        }\r\n\r\n        // Private methods\r\n\r\n        var setContent = function () {\r\n            var temp = document.createElement('div');\r\n            while (el.children[0]) {\r\n                temp.appendChild(el.children[0]);\r\n            }\r\n\r\n            obj.content = document.createElement('div');\r\n            obj.content.className = 'jfloating_content';\r\n            obj.content.innerHTML = el.innerHTML;\r\n\r\n            while (temp.children[0]) {\r\n                obj.content.appendChild(temp.children[0]);\r\n            }\r\n\r\n            obj.container = document.createElement('div');\r\n            obj.container.className = 'jfloating';\r\n            obj.container.appendChild(obj.content);\r\n\r\n            if (obj.options.title) {\r\n                obj.container.setAttribute('title', obj.options.title);\r\n            } else {\r\n                obj.container.classList.add('no-title');\r\n            }\r\n\r\n            // validate element dimensions\r\n            if (obj.options.width) {\r\n                obj.container.style.width = parseInt(obj.options.width) + 'px';\r\n            }\r\n\r\n            if (obj.options.height) {\r\n                obj.container.style.height = parseInt(obj.options.height) + 'px';\r\n            }\r\n\r\n            el.innerHTML = '';\r\n            el.appendChild(obj.container);\r\n        }\r\n\r\n        var setEvents = function () {\r\n            if (obj.container) {\r\n                obj.container.addEventListener('click', function (e) {\r\n                    var rect = e.target.getBoundingClientRect();\r\n\r\n                    if (e.target.classList.contains('jfloating')) {\r\n                        if (e.changedTouches && e.changedTouches[0]) {\r\n                            var x = e.changedTouches[0].clientX;\r\n                            var y = e.changedTouches[0].clientY;\r\n                        } else {\r\n                            var x = e.clientX;\r\n                            var y = e.clientY;\r\n                        }\r\n\r\n                        if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n                            setTimeout(function () {\r\n                                obj.close();\r\n                            }, 100);\r\n                        } else {\r\n                            obj.setState();\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        var setType = function () {\r\n            obj.container.classList.add('jfloating-' + obj.options.type);\r\n        }\r\n\r\n        obj.state = {\r\n            isMinized: false,\r\n        }\r\n\r\n        obj.setState = function () {\r\n            if (obj.state.isMinized) {\r\n                obj.container.classList.remove('jfloating-minimized');\r\n            } else {\r\n                obj.container.classList.add('jfloating-minimized');\r\n            }\r\n            obj.state.isMinized = !obj.state.isMinized;\r\n        }\r\n\r\n        obj.close = function () {\r\n            Components.elements.splice(Component.elements.indexOf(obj.container), 1);\r\n            obj.updatePosition();\r\n            el.remove();\r\n        }\r\n\r\n        obj.updatePosition = function () {\r\n            for (var i = 0; i < Component.elements.length; i++) {\r\n                var floating = Component.elements[i];\r\n                var prevFloating = Component.elements[i - 1];\r\n                floating.style.right = i * (prevFloating ? prevFloating.offsetWidth : floating.offsetWidth) * 1.01 + 'px';\r\n            }\r\n        }\r\n\r\n        obj.init = function () {\r\n            // Set content into root\r\n            setContent();\r\n\r\n            // Set dialog events\r\n            setEvents();\r\n\r\n            // Set dialog type\r\n            setType();\r\n\r\n            // Update floating position\r\n            Component.elements.push(obj.container);\r\n            obj.updatePosition();\r\n\r\n            el.floating = obj;\r\n        }\r\n\r\n        obj.init();\r\n\r\n        return obj;\r\n    });\r\n\r\n    Component.elements = [];\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var floating = (Floating());\n;// CONCATENATED MODULE: ./src/plugins/validations.js\n\r\n\r\nconst validations_HelpersDate = (dist_default()).Helpers;\r\nfunction Validations() {\r\n    /**\r\n     * Options: Object,\r\n     * Properties:\r\n     * Constraint,\r\n     * Reference,\r\n     * Value\r\n     */\r\n\r\n    const isNumeric = function(num) {\r\n        return !isNaN(num) && num !== null && (typeof num !== 'string' || num.trim() !== '');\r\n    }\r\n\r\n    const numberCriterias = {\r\n        'between': function(value, range) {\r\n            return value >= range[0] && value <= range[1];\r\n        },\r\n        'not between': function(value, range) {\r\n            return value < range[0] || value > range[1];\r\n        },\r\n        '<': function(value, range) {\r\n            return value < range[0];\r\n        },\r\n        '<=': function(value, range) {\r\n            return value <= range[0];\r\n        },\r\n        '>': function(value, range) {\r\n            return value > range[0];\r\n        },\r\n        '>=': function(value, range) {\r\n            return value >= range[0];\r\n        },\r\n        '=': function(value, range) {\r\n            return value == range[0];\r\n        },\r\n        '!=': function(value, range) {\r\n            return value != range[0];\r\n        },\r\n    }\r\n\r\n    const dateCriterias = {\r\n        'valid date': function() {\r\n            return true;\r\n        },\r\n        '=': function(value, range) {\r\n            return value === range[0];\r\n        },\r\n        '!=': function(value, range) {\r\n            return value !== range[0];\r\n        },\r\n        '<': function(value, range) {\r\n            return value < range[0];\r\n        },\r\n        '<=': function(value, range) {\r\n            return value <= range[0];\r\n        },\r\n        '>': function(value, range) {\r\n            return value > range[0];\r\n        },\r\n        '>=': function(value, range) {\r\n            return value >= range[0];\r\n        },\r\n        'between': function(value, range) {\r\n            return value >= range[0] && value <= range[1];\r\n        },\r\n        'not between': function(value, range) {\r\n            return value < range[0] || value > range[1];\r\n        },\r\n    }\r\n\r\n    const textCriterias = {\r\n        'contains': function(value, range) {\r\n            return value.includes(range[0]);\r\n        },\r\n        'not contains': function(value, range) {\r\n            return !value.includes(range[0]);\r\n        },\r\n        'begins with': function(value, range) {\r\n            return value.startsWith(range[0]);\r\n        },\r\n        'ends with': function(value, range) {\r\n            return value.endsWith(range[0]);\r\n        },\r\n        '=': function(value, range) {\r\n            return value === range[0];\r\n        },\r\n        '!=': function(value, range) {\r\n            return value !== range[0];\r\n        },\r\n        'valid email': function(value) {\r\n            var pattern = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\r\n\r\n            return pattern.test(value);\r\n        },\r\n        'valid url': function(value) {\r\n            var pattern = new RegExp(/(((https?:\\/\\/)|(www\\.))[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]+)/ig);\r\n\r\n            return pattern.test(value);\r\n        },\r\n    }\r\n\r\n    // Component router\r\n    const component = function(value, options) {\r\n        if (typeof(component[options.type]) === 'function') {\r\n            if (options.allowBlank && (typeof value === 'undefined' || value === '' || value === null)) {\r\n                return true;\r\n            }\r\n            return component[options.type].call(this, value, options);\r\n        }\r\n        return null;\r\n    }\r\n    \r\n    component.url = function(data) {\r\n        var pattern = new RegExp(/(((https?:\\/\\/)|(www\\.))[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]+)/ig);\r\n        return pattern.test(data) ? true : false;\r\n    }\r\n\r\n    component.email = function(data) {\r\n        var pattern = new RegExp(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\r\n        return data && pattern.test(data) ? true : false;\r\n    }\r\n    \r\n    component.required = function(data) {\r\n        return data && data.trim() ? true : false;\r\n    }\r\n\r\n    component.empty = function(data) {\r\n        return typeof data === 'undefined' || data === null || (typeof data === 'string' && !data.toString().trim());\r\n    }\r\n\r\n    component['not exist'] = component.empty;\r\n\r\n    component.notEmpty = function(data) {\r\n        return !component.empty(data);\r\n    }\r\n\r\n    component.exist = component.notEmpty;\r\n\r\n    component.number = function(data, options) {\r\n       if (! isNumeric(data)) {\r\n           return false;\r\n       }\r\n\r\n       if (!options || !options.criteria) {\r\n           return true;\r\n       }\r\n\r\n       if (!numberCriterias[options.criteria]) {\r\n           return false;\r\n       }\r\n\r\n       let values = options.value.map(function(num) {\r\n          return parseFloat(num);\r\n       })\r\n\r\n       return numberCriterias[options.criteria](data, values);\r\n   };\r\n\r\n    component.login = function(data) {\r\n        let pattern = new RegExp(/^[a-zA-Z0-9._-]+$/);\r\n        return data && pattern.test(data) ? true : false;\r\n    }\r\n\r\n    component.list = function(data, options) {\r\n        let dataType = typeof data;\r\n        if (dataType !== 'string' && dataType !== 'number') {\r\n            return false;\r\n        }\r\n        let list;\r\n        if (typeof(options.value[0]) === 'string') {\r\n            if (options.source) {\r\n                list = options.source;\r\n            } else {\r\n                list = options.value[0].split(',');\r\n            }\r\n        } else {\r\n            list = options.value[0];\r\n        }\r\n\r\n        if (! Array.isArray(list)) {\r\n            return false;\r\n        } else {\r\n            let validOption = list.findIndex(function (item) {\r\n                return item == data;\r\n            });\r\n\r\n            return validOption > -1;\r\n        }\r\n    }\r\n\r\n    const getCurrentDateWithoutTime = function() {\r\n        let date = new Date();\r\n        date.setHours(0, 0, 0, 0);\r\n        return date;\r\n    }\r\n\r\n    const relativeDates = {\r\n        'one year ago': function() {\r\n            let date = getCurrentDateWithoutTime();\r\n\r\n            date.setFullYear(date.getFullYear() - 1);\r\n\r\n            return date;\r\n        },\r\n        'one month ago': function() {\r\n            let date = getCurrentDateWithoutTime();\r\n\r\n            date.setMonth(date.getMonth() - 1);\r\n\r\n            return date;\r\n        },\r\n        'one week ago': function() {\r\n            let date = getCurrentDateWithoutTime();\r\n\r\n            date.setDate(date.getDate() - 7);\r\n\r\n            return date;\r\n        },\r\n        yesterday: function() {\r\n            let date = getCurrentDateWithoutTime();\r\n\r\n            date.setDate(date.getDate() - 1);\r\n\r\n            return date;\r\n        },\r\n        today: getCurrentDateWithoutTime,\r\n        tomorrow: function() {\r\n            let date = getCurrentDateWithoutTime();\r\n\r\n            date.setDate(date.getDate() + 1);\r\n\r\n            return date;\r\n        },\r\n    };\r\n\r\n    component.date = function(data, options) {\r\n        if (isNumeric(data) && data > 0 && data < 1000000) {\r\n            data = validations_HelpersDate.numToDate(data);\r\n        }\r\n\r\n        if (new Date(data) == 'Invalid Date') {\r\n            return false;\r\n        }\r\n\r\n        if (!options || !options.criteria) {\r\n            return true;\r\n        }\r\n\r\n        if (!dateCriterias[options.criteria]) {\r\n            return false;\r\n        }\r\n\r\n        let values = options.value.map(function(date) {\r\n            if (typeof date === 'string' && relativeDates[date]) {\r\n                return relativeDates[date]().getTime();\r\n            }\r\n\r\n            return new Date(date).getTime();\r\n        });\r\n\r\n        return dateCriterias[options.criteria](new Date(data).getTime(), values);\r\n    }\r\n\r\n    component.text = function(data, options) {\r\n        if (typeof data === 'undefined' || data === null) {\r\n            data = '';\r\n        } else if (typeof data !== 'string') {\r\n            return false;\r\n        }\r\n\r\n        if (!options || !options.criteria) {\r\n            return true;\r\n        }\r\n\r\n        if (!textCriterias[options.criteria]) {\r\n            return false;\r\n        }\r\n\r\n        return textCriterias[options.criteria](data, options.value);\r\n    }\r\n\r\n    component.textLength = function(data, options) {\r\n        let textLength;\r\n        if (typeof data === 'string') {\r\n            textLength = data.length;\r\n        } else if (typeof data !== 'undefined' && data !== null && typeof data.toString === 'function') {\r\n            textLength = data.toString().length;\r\n        } else {\r\n            textLength = 0;\r\n        }\r\n\r\n        return component.number(textLength, options);\r\n    }\r\n\r\n    component.time = function(data, options) {\r\n       if (! isNumeric(data)) {\r\n           return false;\r\n       }\r\n\r\n       if (!options || !options.criteria) {\r\n           return true;\r\n       }\r\n\r\n       if (!numberCriterias[options.criteria]) {\r\n           return false;\r\n       }\r\n\r\n       let values = options.value.map(function(num) {\r\n          return parseInt(parseFloat(num) * 10**17) / 10**17;\r\n       })\r\n\r\n       return numberCriterias[options.criteria](parseInt(parseFloat(data) * 10**17) / 10**17, values);\r\n   };\r\n\r\n    return component;\r\n}\r\n\r\n/* harmony default export */ var validations = (Validations());\n;// CONCATENATED MODULE: ./src/plugins/form.js\n\r\n\r\n\r\n\r\nfunction Form() {\r\n    var Component = (function(el, options) {\r\n        var obj = {};\r\n        obj.options = {};\r\n\r\n        // Default configuration\r\n        var defaults = {\r\n            url: null,\r\n            message: 'Are you sure? There are unsaved information in your form',\r\n            ignore: false,\r\n            currentHash: null,\r\n            submitButton:null,\r\n            validations: null,\r\n            onbeforeload: null,\r\n            onload: null,\r\n            onbeforesave: null,\r\n            onsave: null,\r\n            onbeforeremove: null,\r\n            onremove: null,\r\n            onerror: function(el, message) {\r\n                alert(message);\r\n            }\r\n        };\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                obj.options[property] = defaults[property];\r\n            }\r\n        }\r\n\r\n        // Validations\r\n        if (! obj.options.validations) {\r\n            obj.options.validations = {};\r\n        }\r\n\r\n        // Submit Button\r\n        if (! obj.options.submitButton) {\r\n            obj.options.submitButton = el.querySelector('input[type=submit]');\r\n        }\r\n\r\n        if (obj.options.submitButton && obj.options.url) {\r\n            obj.options.submitButton.onclick = function() {\r\n                obj.save();\r\n            }\r\n        }\r\n\r\n        if (! obj.options.validations.email) {\r\n            obj.options.validations.email = validations.email;\r\n        }\r\n\r\n        if (! obj.options.validations.length) {\r\n            obj.options.validations.length = validations.length;\r\n        }\r\n\r\n        if (! obj.options.validations.required) {\r\n            obj.options.validations.required = validations.required;\r\n        }\r\n\r\n        obj.setUrl = function(url) {\r\n            obj.options.url = url;\r\n        }\r\n\r\n        obj.load = function() {\r\n            ajax({\r\n                url: obj.options.url,\r\n                method: 'GET',\r\n                dataType: 'json',\r\n                queue: true,\r\n                success: function(data) {\r\n                    // Overwrite values from the backend\r\n                    if (typeof(obj.options.onbeforeload) == 'function') {\r\n                        var ret = obj.options.onbeforeload(el, data);\r\n                        if (ret) {\r\n                            data = ret;\r\n                        }\r\n                    }\r\n                    // Apply values to the form\r\n                    Component.setElements(el, data);\r\n                    // Onload methods\r\n                    if (typeof(obj.options.onload) == 'function') {\r\n                        obj.options.onload(el, data);\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        obj.save = function() {\r\n            var test = obj.validate();\r\n\r\n            if (test) {\r\n                obj.options.onerror(el, test);\r\n            } else {\r\n                var data = Component.getElements(el, true);\r\n\r\n                if (typeof(obj.options.onbeforesave) == 'function') {\r\n                    var data = obj.options.onbeforesave(el, data);\r\n\r\n                    if (data === false) {\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                ajax({\r\n                    url: obj.options.url,\r\n                    method: 'POST',\r\n                    dataType: 'json',\r\n                    data: data,\r\n                    success: function(result) {\r\n                        if (typeof(obj.options.onsave) == 'function') {\r\n                            obj.options.onsave(el, data, result);\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        obj.remove = function() {\r\n            if (typeof(obj.options.onbeforeremove) == 'function') {\r\n                var ret = obj.options.onbeforeremove(el, obj);\r\n                if (ret === false) {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            ajax({\r\n                url: obj.options.url,\r\n                method: 'DELETE',\r\n                dataType: 'json',\r\n                success: function(result) {\r\n                    if (typeof(obj.options.onremove) == 'function') {\r\n                        obj.options.onremove(el, obj, result);\r\n                    }\r\n\r\n                    obj.reset();\r\n                }\r\n            });\r\n        }\r\n\r\n        var addError = function(element) {\r\n            // Add error in the element\r\n            element.classList.add('error');\r\n            // Submit button\r\n            if (obj.options.submitButton) {\r\n                obj.options.submitButton.setAttribute('disabled', true);\r\n            }\r\n            // Return error message\r\n            var error = element.getAttribute('data-error') || 'There is an error in the form';\r\n            element.setAttribute('title', error);\r\n            return error;\r\n        }\r\n\r\n        var delError = function(element) {\r\n            var error = false;\r\n            // Remove class from this element\r\n            element.classList.remove('error');\r\n            element.removeAttribute('title');\r\n            // Get elements in the form\r\n            var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n            // Run all elements\r\n            for (var i = 0; i < elements.length; i++) {\r\n                if (elements[i].getAttribute('data-validation')) {\r\n                    if (elements[i].classList.contains('error')) {\r\n                        error = true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (obj.options.submitButton) {\r\n                if (error) {\r\n                    obj.options.submitButton.setAttribute('disabled', true);\r\n                } else {\r\n                    obj.options.submitButton.removeAttribute('disabled');\r\n                }\r\n            }\r\n        }\r\n\r\n        obj.validateElement = function(element) {\r\n            // Test results\r\n            var test = false;\r\n            // Value\r\n            var value = Component.getValue(element);\r\n            // Validation\r\n            var validation = element.getAttribute('data-validation');\r\n            // Parse\r\n            if (typeof(obj.options.validations[validation]) == 'function' && ! obj.options.validations[validation](value, element)) {\r\n                // Not passed in the test\r\n                test = addError(element);\r\n            } else {\r\n                if (element.classList.contains('error')) {\r\n                    delError(element);\r\n                }\r\n            }\r\n\r\n            return test;\r\n        }\r\n\r\n        obj.reset = function() {\r\n            // Get elements in the form\r\n            var name = null;\r\n            var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n            // Run all elements\r\n            for (var i = 0; i < elements.length; i++) {\r\n                if (name = elements[i].getAttribute('name')) {\r\n                    if (elements[i].type == 'checkbox' || elements[i].type == 'radio') {\r\n                        elements[i].checked = false;\r\n                    } else {\r\n                        if (typeof(elements[i].val) == 'function') {\r\n                            elements[i].val('');\r\n                        } else {\r\n                            elements[i].value = '';\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Run form validation\r\n        obj.validate = function() {\r\n            var test = [];\r\n            // Get elements in the form\r\n            var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n            // Run all elements\r\n            for (var i = 0; i < elements.length; i++) {\r\n                // Required\r\n                if (elements[i].getAttribute('data-validation')) {\r\n                    var res = obj.validateElement(elements[i]);\r\n                    if (res) {\r\n                        test.push(res);\r\n                    }\r\n                }\r\n            }\r\n            if (test.length > 0) {\r\n                return test.join('<br>');\r\n            } else {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // Check the form\r\n        obj.getError = function() {\r\n            // Validation\r\n            return obj.validation() ? true : false;\r\n        }\r\n\r\n        // Return the form hash\r\n        obj.setHash = function() {\r\n            return obj.getHash(Component.getElements(el));\r\n        }\r\n\r\n        // Get the form hash\r\n        obj.getHash = function(str) {\r\n            var hash = 0, i, chr;\r\n\r\n            if (str.length === 0) {\r\n                return hash;\r\n            } else {\r\n                for (i = 0; i < str.length; i++) {\r\n                  chr = str.charCodeAt(i);\r\n                  hash = ((hash << 5) - hash) + chr;\r\n                  hash |= 0;\r\n                }\r\n            }\r\n\r\n            return hash;\r\n        }\r\n\r\n        // Is there any change in the form since start tracking?\r\n        obj.isChanged = function() {\r\n            var hash = obj.setHash();\r\n            return (obj.options.currentHash != hash);\r\n        }\r\n\r\n        // Restart tracking\r\n        obj.resetTracker = function() {\r\n            obj.options.currentHash = obj.setHash();\r\n            obj.options.ignore = false;\r\n        }\r\n\r\n        // Ignore flag\r\n        obj.setIgnore = function(ignoreFlag) {\r\n            obj.options.ignore = ignoreFlag ? true : false;\r\n        }\r\n\r\n        // Start tracking in one second\r\n        setTimeout(function() {\r\n            obj.options.currentHash = obj.setHash();\r\n        }, 1000);\r\n\r\n        // Validations\r\n        el.addEventListener(\"keyup\", function(e) {\r\n            if (e.target.getAttribute('data-validation')) {\r\n                obj.validateElement(e.target);\r\n            }\r\n        });\r\n\r\n        // Alert\r\n        if (! Component.hasEvents) {\r\n            window.addEventListener(\"beforeunload\", function (e) {\r\n                if (obj.isChanged() && obj.options.ignore == false) {\r\n                    var confirmationMessage =  obj.options.message? obj.options.message : \"\\o/\";\r\n\r\n                    if (confirmationMessage) {\r\n                        if (typeof e == 'undefined') {\r\n                            e = window.event;\r\n                        }\r\n\r\n                        if (e) {\r\n                            e.returnValue = confirmationMessage;\r\n                        }\r\n\r\n                        return confirmationMessage;\r\n                    } else {\r\n                        return void(0);\r\n                    }\r\n                }\r\n            });\r\n\r\n            Component.hasEvents = true;\r\n        }\r\n\r\n        el.form = obj;\r\n\r\n        return obj;\r\n    });\r\n\r\n    // Get value from one element\r\n    Component.getValue = function(element) {\r\n        var value = null;\r\n        if (element.type == 'checkbox') {\r\n            if (element.checked == true) {\r\n                value = element.value || true;\r\n            }\r\n        } else if (element.type == 'radio') {\r\n            if (element.checked == true) {\r\n                value = element.value;\r\n            }\r\n        } else if (element.type == 'file') {\r\n            value = element.files;\r\n        } else if (element.tagName == 'select' && element.multiple == true) {\r\n            value = [];\r\n            var options = element.querySelectorAll(\"options[selected]\");\r\n            for (var j = 0; j < options.length; j++) {\r\n                value.push(options[j].value);\r\n            }\r\n        } else if (typeof(element.val) == 'function') {\r\n            value = element.val();\r\n        } else {\r\n            value = element.value || '';\r\n        }\r\n\r\n        return value;\r\n    }\r\n\r\n    // Get form elements\r\n    Component.getElements = function(el, asArray) {\r\n        var data = {};\r\n        var name = null;\r\n        var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n\r\n        for (var i = 0; i < elements.length; i++) {\r\n            if (name = elements[i].getAttribute('name')) {\r\n                data[name] = Component.getValue(elements[i]) || '';\r\n            }\r\n        }\r\n\r\n        return asArray == true ? data : JSON.stringify(data);\r\n    }\r\n\r\n    //Get form elements\r\n    Component.setElements = function(el, data) {\r\n        var name = null;\r\n        var value = null;\r\n        var elements = el.querySelectorAll(\"input, select, textarea, div[name]\");\r\n        for (var i = 0; i < elements.length; i++) {\r\n            // Attributes\r\n            var type = elements[i].getAttribute('type');\r\n            if (name = elements[i].getAttribute('name')) {\r\n                // Transform variable names in pathname\r\n                name = name.replace(new RegExp(/\\[(.*?)\\]/ig), '.$1');\r\n                value = null;\r\n                // Seach for the data in the path\r\n                if (name.match(/\\./)) {\r\n                    var tmp = Path.call(data, name) || '';\r\n                    if (typeof(tmp) !== 'undefined') {\r\n                        value = tmp;\r\n                    }\r\n                } else {\r\n                    if (typeof(data[name]) !== 'undefined') {\r\n                        value = data[name];\r\n                    }\r\n                }\r\n                // Set the values\r\n                if (value !== null) {\r\n                    if (type == 'checkbox' || type == 'radio') {\r\n                        elements[i].checked = value ? true : false;\r\n                    } else if (type == 'file') {\r\n                        // Do nothing\r\n                    } else {\r\n                        if (typeof (elements[i].val) == 'function') {\r\n                            elements[i].val(value);\r\n                        } else {\r\n                            elements[i].value = value;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var plugins_form = (Form());\n;// CONCATENATED MODULE: ./src/plugins/mask.js\n/*\r\n Add '*' as a valid symbol\r\n Formats such as 'DD\"th of \"MMMM\", \"YYYY'\r\n Conditional masking\r\n (000) 00000-00\r\n $ (#,##0.00);$ (-#,##0.00)\r\n $ (-#,##0.00)\r\n j.mask.render(0, { mask: 'mm:ss.0' }\r\n j.mask.render(0, { mask: '[h]:mm:ss' }, true)\r\n */\r\n\r\n\r\n\r\n\r\n/* harmony default export */ var mask = (dist.Mask);\r\n\n;// CONCATENATED MODULE: ./src/plugins/modal.js\n\r\n\r\n\r\n\r\nfunction Modal() {\r\n\r\n    var Events = function() {\r\n        //  Position\r\n        var tracker = null;\r\n\r\n        var keyDown = function (e) {\r\n            if (e.which == 27) {\r\n                var modals = document.querySelectorAll('.jmodal');\r\n                for (var i = 0; i < modals.length; i++) {\r\n                    modals[i].parentNode.modal.close();\r\n                }\r\n            }\r\n        }\r\n\r\n        var mouseUp = function (e) {\r\n            let element = e.composedPath();\r\n            var item = helpers.findElement(element[0], 'jmodal');\r\n            if (item) {\r\n                // Get target info\r\n                var rect = item.getBoundingClientRect();\r\n\r\n                if (e.changedTouches && e.changedTouches[0]) {\r\n                    var x = e.changedTouches[0].clientX;\r\n                    var y = e.changedTouches[0].clientY;\r\n                } else {\r\n                    var x = e.clientX;\r\n                    var y = e.clientY;\r\n                }\r\n\r\n                if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n                    item.parentNode.modal.close();\r\n                }\r\n            }\r\n\r\n            if (tracker) {\r\n                tracker.element.style.cursor = 'auto';\r\n                tracker = null;\r\n            }\r\n        }\r\n\r\n        var mouseDown = function (e) {\r\n            let element = e.composedPath();\r\n            var item = helpers.findElement(element[0], 'jmodal');\r\n            if (item) {\r\n                // Get target info\r\n                var rect = item.getBoundingClientRect();\r\n\r\n                if (e.changedTouches && e.changedTouches[0]) {\r\n                    var x = e.changedTouches[0].clientX;\r\n                    var y = e.changedTouches[0].clientY;\r\n                } else {\r\n                    var x = e.clientX;\r\n                    var y = e.clientY;\r\n                }\r\n\r\n                if (rect.width - (x - rect.left) < 50 && (y - rect.top) < 50) {\r\n                    // Do nothing\r\n                } else {\r\n                    if (y - rect.top < 50) {\r\n                        if (document.selection) {\r\n                            document.selection.empty();\r\n                        } else if (window.getSelection) {\r\n                            window.getSelection().removeAllRanges();\r\n                        }\r\n\r\n                        tracker = {\r\n                            left: rect.left,\r\n                            top: rect.top,\r\n                            x: e.clientX,\r\n                            y: e.clientY,\r\n                            width: rect.width,\r\n                            height: rect.height,\r\n                            element: item,\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        var mouseMove = function (e) {\r\n            if (tracker) {\r\n                e = e || window.event;\r\n                if (e.buttons) {\r\n                    var mouseButton = e.buttons;\r\n                } else if (e.button) {\r\n                    var mouseButton = e.button;\r\n                } else {\r\n                    var mouseButton = e.which;\r\n                }\r\n\r\n                if (mouseButton) {\r\n                    tracker.element.style.top = (tracker.top + (e.clientY - tracker.y) + (tracker.height / 2)) + 'px';\r\n                    tracker.element.style.left = (tracker.left + (e.clientX - tracker.x) + (tracker.width / 2)) + 'px';\r\n                    tracker.element.style.cursor = 'move';\r\n                } else {\r\n                    tracker.element.style.cursor = 'auto';\r\n                }\r\n            }\r\n        }\r\n\r\n        document.addEventListener('keydown', keyDown);\r\n        document.addEventListener('mouseup', mouseUp);\r\n        document.addEventListener('mousedown', mouseDown);\r\n        document.addEventListener('mousemove', mouseMove);\r\n    }\r\n\r\n    var Component = (function (el, options) {\r\n        var obj = {};\r\n        obj.options = {};\r\n\r\n        // Default configuration\r\n        var defaults = {\r\n            url: null,\r\n            onopen: null,\r\n            onclose: null,\r\n            onload: null,\r\n            closed: false,\r\n            width: null,\r\n            height: null,\r\n            title: null,\r\n            padding: null,\r\n            backdrop: true,\r\n            icon: null,\r\n        };\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                obj.options[property] = defaults[property];\r\n            }\r\n        }\r\n\r\n        // Title\r\n        if (!obj.options.title && el.getAttribute('title')) {\r\n            obj.options.title = el.getAttribute('title');\r\n        }\r\n\r\n        var temp = document.createElement('div');\r\n        while (el.children[0]) {\r\n            temp.appendChild(el.children[0]);\r\n        }\r\n\r\n        obj.title = document.createElement('div');\r\n        obj.title.className = 'jmodal_title';\r\n        if (obj.options.icon) {\r\n            obj.title.setAttribute('data-icon', obj.options.icon);\r\n        }\r\n\r\n        obj.content = document.createElement('div');\r\n        obj.content.className = 'jmodal_content';\r\n        obj.content.innerHTML = el.innerHTML;\r\n\r\n        while (temp.children[0]) {\r\n            obj.content.appendChild(temp.children[0]);\r\n        }\r\n\r\n        obj.container = document.createElement('div');\r\n        obj.container.className = 'jmodal';\r\n        obj.container.appendChild(obj.title);\r\n        obj.container.appendChild(obj.content);\r\n\r\n        if (obj.options.padding) {\r\n            obj.content.style.padding = obj.options.padding;\r\n        }\r\n        if (obj.options.width) {\r\n            obj.container.style.width = obj.options.width;\r\n        }\r\n        if (obj.options.height) {\r\n            obj.container.style.height = obj.options.height;\r\n        }\r\n        if (obj.options.title) {\r\n            var title = document.createElement('h4');\r\n            title.innerText = obj.options.title;\r\n            obj.title.appendChild(title);\r\n        }\r\n\r\n        el.innerHTML = '';\r\n        el.style.display = 'none';\r\n        el.appendChild(obj.container);\r\n\r\n        // Backdrop\r\n        if (obj.options.backdrop) {\r\n            var backdrop = document.createElement('div');\r\n            backdrop.className = 'jmodal_backdrop';\r\n            backdrop.onclick = function () {\r\n                obj.close();\r\n            }\r\n            el.appendChild(backdrop);\r\n        }\r\n\r\n        obj.open = function () {\r\n            el.style.display = 'block';\r\n            // Fullscreen\r\n            var rect = obj.container.getBoundingClientRect();\r\n            if (helpers.getWindowWidth() < rect.width) {\r\n                obj.container.style.top = '';\r\n                obj.container.style.left = '';\r\n                obj.container.classList.add('jmodal_fullscreen');\r\n                animation.slideBottom(obj.container, 1);\r\n            } else {\r\n                if (obj.options.backdrop) {\r\n                    backdrop.style.display = 'block';\r\n                }\r\n            }\r\n            // Event\r\n            if (typeof (obj.options.onopen) == 'function') {\r\n                obj.options.onopen(el, obj);\r\n            }\r\n        }\r\n\r\n        obj.resetPosition = function () {\r\n            obj.container.style.top = '';\r\n            obj.container.style.left = '';\r\n        }\r\n\r\n        obj.isOpen = function () {\r\n            return el.style.display != 'none' ? true : false;\r\n        }\r\n\r\n        obj.close = function () {\r\n            if (obj.isOpen()) {\r\n                el.style.display = 'none';\r\n                if (obj.options.backdrop) {\r\n                    // Backdrop\r\n                    backdrop.style.display = '';\r\n                }\r\n                // Remove fullscreen class\r\n                obj.container.classList.remove('jmodal_fullscreen');\r\n                // Event\r\n                if (typeof (obj.options.onclose) == 'function') {\r\n                    obj.options.onclose(el, obj);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (obj.options.url) {\r\n            ajax({\r\n                url: obj.options.url,\r\n                method: 'GET',\r\n                dataType: 'text/html',\r\n                success: function (data) {\r\n                    obj.content.innerHTML = data;\r\n\r\n                    if (!obj.options.closed) {\r\n                        obj.open();\r\n                    }\r\n\r\n                    if (typeof (obj.options.onload) === 'function') {\r\n                        obj.options.onload(obj);\r\n                    }\r\n                }\r\n            });\r\n        } else {\r\n            if (!obj.options.closed) {\r\n                obj.open();\r\n            }\r\n\r\n            if (typeof (obj.options.onload) === 'function') {\r\n                obj.options.onload(obj);\r\n            }\r\n        }\r\n\r\n        // Keep object available from the node\r\n        el.modal = obj;\r\n\r\n        // Create events when the first modal is create only\r\n        Events();\r\n\r\n        // Execute the events only once\r\n        Events = function() {};\r\n\r\n        return obj;\r\n    });\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var modal = (Modal());\n;// CONCATENATED MODULE: ./src/plugins/notification.js\n\r\n\r\n\r\nfunction Notification() {\r\n    var Component = function (options) {\r\n        var obj = {};\r\n        obj.options = {};\r\n\r\n        // Default configuration\r\n        var defaults = {\r\n            icon: null,\r\n            name: 'Notification',\r\n            date: null,\r\n            error: null,\r\n            title: null,\r\n            message: null,\r\n            timeout: 4000,\r\n            autoHide: true,\r\n            closeable: true,\r\n        };\r\n\r\n        // Loop through our object\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                obj.options[property] = defaults[property];\r\n            }\r\n        }\r\n\r\n        var notification = document.createElement('div');\r\n        notification.className = 'jnotification';\r\n\r\n        if (obj.options.error) {\r\n            notification.classList.add('jnotification-error');\r\n        }\r\n\r\n        var notificationContainer = document.createElement('div');\r\n        notificationContainer.className = 'jnotification-container';\r\n        notification.appendChild(notificationContainer);\r\n\r\n        var notificationHeader = document.createElement('div');\r\n        notificationHeader.className = 'jnotification-header';\r\n        notificationContainer.appendChild(notificationHeader);\r\n\r\n        var notificationImage = document.createElement('div');\r\n        notificationImage.className = 'jnotification-image';\r\n        notificationHeader.appendChild(notificationImage);\r\n\r\n        if (obj.options.icon) {\r\n            var notificationIcon = document.createElement('img');\r\n            notificationIcon.src = obj.options.icon;\r\n            notificationImage.appendChild(notificationIcon);\r\n        }\r\n\r\n        var notificationName = document.createElement('div');\r\n        notificationName.className = 'jnotification-name';\r\n        notificationName.innerHTML = obj.options.name;\r\n        notificationHeader.appendChild(notificationName);\r\n\r\n        if (obj.options.closeable == true) {\r\n            var notificationClose = document.createElement('div');\r\n            notificationClose.className = 'jnotification-close';\r\n            notificationClose.onclick = function () {\r\n                obj.hide();\r\n            }\r\n            notificationHeader.appendChild(notificationClose);\r\n        }\r\n\r\n        var notificationDate = document.createElement('div');\r\n        notificationDate.className = 'jnotification-date';\r\n        notificationHeader.appendChild(notificationDate);\r\n\r\n        var notificationContent = document.createElement('div');\r\n        notificationContent.className = 'jnotification-content';\r\n        notificationContainer.appendChild(notificationContent);\r\n\r\n        if (obj.options.title) {\r\n            var notificationTitle = document.createElement('div');\r\n            notificationTitle.className = 'jnotification-title';\r\n            notificationTitle.innerHTML = obj.options.title;\r\n            notificationContent.appendChild(notificationTitle);\r\n        }\r\n\r\n        var notificationMessage = document.createElement('div');\r\n        notificationMessage.className = 'jnotification-message';\r\n        notificationMessage.innerHTML = obj.options.message;\r\n        notificationContent.appendChild(notificationMessage);\r\n\r\n        obj.show = function () {\r\n            document.body.appendChild(notification);\r\n            if (helpers.getWindowWidth() > 800) {\r\n                animation.fadeIn(notification);\r\n            } else {\r\n                animation.slideTop(notification, 1);\r\n            }\r\n        }\r\n\r\n        obj.hide = function () {\r\n            if (helpers.getWindowWidth() > 800) {\r\n                animation.fadeOut(notification, function () {\r\n                    if (notification.parentNode) {\r\n                        notification.parentNode.removeChild(notification);\r\n                        if (notificationTimeout) {\r\n                            clearTimeout(notificationTimeout);\r\n                        }\r\n                    }\r\n                });\r\n            } else {\r\n                animation.slideTop(notification, 0, function () {\r\n                    if (notification.parentNode) {\r\n                        notification.parentNode.removeChild(notification);\r\n                        if (notificationTimeout) {\r\n                            clearTimeout(notificationTimeout);\r\n                        }\r\n                    }\r\n                });\r\n            }\r\n        };\r\n\r\n        obj.show();\r\n\r\n        if (obj.options.autoHide == true) {\r\n            var notificationTimeout = setTimeout(function () {\r\n                obj.hide();\r\n            }, obj.options.timeout);\r\n        }\r\n\r\n        if (helpers.getWindowWidth() < 800) {\r\n            notification.addEventListener(\"swipeup\", function (e) {\r\n                obj.hide();\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n            });\r\n        }\r\n\r\n        return obj;\r\n    }\r\n\r\n    Component.isVisible = function () {\r\n        var j = document.querySelector('.jnotification');\r\n        return j && j.parentNode ? true : false;\r\n    }\r\n\r\n    return Component;\r\n}\r\n\r\n/* harmony default export */ var notification = (Notification());\n;// CONCATENATED MODULE: ./src/plugins/progressbar.js\nfunction Progressbar(el, options) {\r\n    var obj = {};\r\n    obj.options = {};\r\n\r\n    // Default configuration\r\n    var defaults = {\r\n        value: 0,\r\n        onchange: null,\r\n        width: null,\r\n    };\r\n\r\n    // Loop through the initial configuration\r\n    for (var property in defaults) {\r\n        if (options && options.hasOwnProperty(property)) {\r\n            obj.options[property] = options[property];\r\n        } else {\r\n            obj.options[property] = defaults[property];\r\n        }\r\n    }\r\n\r\n    // Class\r\n    el.classList.add('jprogressbar');\r\n    el.setAttribute('tabindex', 1);\r\n    el.setAttribute('data-value', obj.options.value);\r\n\r\n    var bar = document.createElement('div');\r\n    bar.style.width = obj.options.value + '%';\r\n    bar.style.color = '#fff';\r\n    el.appendChild(bar);\r\n\r\n    if (obj.options.width) {\r\n        el.style.width = obj.options.width;\r\n    }\r\n\r\n    // Set value\r\n    obj.setValue = function(value) {\r\n        value = parseInt(value);\r\n        obj.options.value = value;\r\n        bar.style.width = value + '%';\r\n        el.setAttribute('data-value', value + '%');\r\n\r\n        if (value < 6) {\r\n            el.style.color = '#000';\r\n        } else {\r\n            el.style.color = '#fff';\r\n        }\r\n\r\n        // Update value\r\n        obj.options.value = value;\r\n\r\n        if (typeof(obj.options.onchange) == 'function') {\r\n            obj.options.onchange(el, value);\r\n        }\r\n\r\n        // Lemonade JS\r\n        if (el.value != obj.options.value) {\r\n            el.value = obj.options.value;\r\n            if (typeof(el.oninput) == 'function') {\r\n                el.oninput({\r\n                    type: 'input',\r\n                    target: el,\r\n                    value: el.value\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.getValue = function() {\r\n        return obj.options.value;\r\n    }\r\n\r\n    var action = function(e) {\r\n        if (e.which) {\r\n            // Get target info\r\n            var rect = el.getBoundingClientRect();\r\n\r\n            if (e.changedTouches && e.changedTouches[0]) {\r\n                var x = e.changedTouches[0].clientX;\r\n                var y = e.changedTouches[0].clientY;\r\n            } else {\r\n                var x = e.clientX;\r\n                var y = e.clientY;\r\n            }\r\n\r\n            obj.setValue(Math.round((x - rect.left) / rect.width * 100));\r\n        }\r\n    }\r\n\r\n    // Events\r\n    if ('touchstart' in document.documentElement === true) {\r\n        el.addEventListener('touchstart', action);\r\n        el.addEventListener('touchend', action);\r\n    } else {\r\n        el.addEventListener('mousedown', action);\r\n        el.addEventListener(\"mousemove\", action);\r\n    }\r\n\r\n    // Change\r\n    el.change = obj.setValue;\r\n\r\n    // Global generic value handler\r\n    el.val = function(val) {\r\n        if (val === undefined) {\r\n            return obj.getValue();\r\n        } else {\r\n            obj.setValue(val);\r\n        }\r\n    }\r\n\r\n    // Reference\r\n    el.progressbar = obj;\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/rating.js\nfunction Rating(el, options) {\r\n    // Already created, update options\r\n    if (el.rating) {\r\n        return el.rating.setOptions(options, true);\r\n    }\r\n\r\n    // New instance\r\n    var obj = {};\r\n    obj.options = {};\r\n\r\n    obj.setOptions = function(options, reset) {\r\n        // Default configuration\r\n        var defaults = {\r\n            number: 5,\r\n            value: 0,\r\n            tooltip: [ 'Very bad', 'Bad', 'Average', 'Good', 'Very good' ],\r\n            onchange: null,\r\n        };\r\n\r\n        // Loop through the initial configuration\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n                    obj.options[property] = defaults[property];\r\n                }\r\n            }\r\n        }\r\n\r\n        // Make sure the container is empty\r\n        el.innerHTML = '';\r\n\r\n        // Add elements\r\n        for (var i = 0; i < obj.options.number; i++) {\r\n            var div = document.createElement('div');\r\n            div.setAttribute('data-index', (i + 1))\r\n            div.setAttribute('title', obj.options.tooltip[i])\r\n            el.appendChild(div);\r\n        }\r\n\r\n        // Selected option\r\n        if (obj.options.value) {\r\n            for (var i = 0; i < obj.options.number; i++) {\r\n                if (i < obj.options.value) {\r\n                    el.children[i].classList.add('jrating-selected');\r\n                }\r\n            }\r\n        }\r\n\r\n        return obj;\r\n    }\r\n\r\n    // Set value\r\n    obj.setValue = function(index) {\r\n        for (var i = 0; i < obj.options.number; i++) {\r\n            if (i < index) {\r\n                el.children[i].classList.add('jrating-selected');\r\n            } else {\r\n                el.children[i].classList.remove('jrating-over');\r\n                el.children[i].classList.remove('jrating-selected');\r\n            }\r\n        }\r\n\r\n        obj.options.value = index;\r\n\r\n        if (typeof(obj.options.onchange) == 'function') {\r\n            obj.options.onchange(el, index);\r\n        }\r\n\r\n        // Lemonade JS\r\n        if (el.value != obj.options.value) {\r\n            el.value = obj.options.value;\r\n            if (typeof(el.oninput) == 'function') {\r\n                el.oninput({\r\n                    type: 'input',\r\n                    target: el,\r\n                    value: el.value\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.getValue = function() {\r\n        return obj.options.value;\r\n    }\r\n\r\n    var init = function() {\r\n        // Start plugin\r\n        obj.setOptions(options);\r\n\r\n        // Class\r\n        el.classList.add('jrating');\r\n\r\n        // Events\r\n        el.addEventListener(\"click\", function(e) {\r\n            var index = e.target.getAttribute('data-index');\r\n            if (index != undefined) {\r\n                if (index == obj.options.value) {\r\n                    obj.setValue(0);\r\n                } else {\r\n                    obj.setValue(index);\r\n                }\r\n            }\r\n        });\r\n\r\n        el.addEventListener(\"mouseover\", function(e) {\r\n            var index = e.target.getAttribute('data-index');\r\n            for (var i = 0; i < obj.options.number; i++) {\r\n                if (i < index) {\r\n                    el.children[i].classList.add('jrating-over');\r\n                } else {\r\n                    el.children[i].classList.remove('jrating-over');\r\n                }\r\n            }\r\n        });\r\n\r\n        el.addEventListener(\"mouseout\", function(e) {\r\n            for (var i = 0; i < obj.options.number; i++) {\r\n                el.children[i].classList.remove('jrating-over');\r\n            }\r\n        });\r\n\r\n        // Change\r\n        el.change = obj.setValue;\r\n\r\n        // Global generic value handler\r\n        el.val = function(val) {\r\n            if (val === undefined) {\r\n                return obj.getValue();\r\n            } else {\r\n                obj.setValue(val);\r\n            }\r\n        }\r\n\r\n        // Reference\r\n        el.rating = obj;\r\n    }\r\n\r\n    init();\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/search.js\n\r\n\r\n\r\nfunction Search(el, options) {\r\n    if (el.search) {\r\n        return el.search;\r\n    }\r\n\r\n    var index =  null;\r\n\r\n    var select = function(e) {\r\n        if (e.target.classList.contains('jsearch_item')) {\r\n            var element = e.target;\r\n        } else {\r\n            var element = e.target.parentNode;\r\n        }\r\n\r\n        obj.selectIndex(element);\r\n        e.preventDefault();\r\n    }\r\n\r\n    var createList = function(data) {\r\n        if (typeof(obj.options.onsearch) == 'function') {\r\n            var ret = obj.options.onsearch(obj, data);\r\n            if (ret) {\r\n                data = ret;\r\n            }\r\n        }\r\n\r\n        // Reset container\r\n        container.innerHTML = '';\r\n        // Print results\r\n        if (! data.length) {\r\n            // Show container\r\n            el.style.display = '';\r\n        } else {\r\n            // Show container\r\n            el.style.display = 'block';\r\n\r\n            // Show items (only 10)\r\n            var len = data.length < 11 ? data.length : 10;\r\n            for (var i = 0; i < len; i++) {\r\n                if (typeof(data[i]) == 'string') {\r\n                    var text = data[i];\r\n                    var value = data[i];\r\n                } else {\r\n                    // Legacy\r\n                    var text = data[i].text;\r\n                    if (! text && data[i].name) {\r\n                        text = data[i].name;\r\n                    }\r\n                    var value = data[i].value;\r\n                    if (! value && data[i].id) {\r\n                        value = data[i].id;\r\n                    }\r\n                }\r\n\r\n                var div = document.createElement('div');\r\n                div.setAttribute('data-value', value);\r\n                div.setAttribute('data-text', text);\r\n                div.className = 'jsearch_item';\r\n\r\n                if (data[i].id) {\r\n                    div.setAttribute('id', data[i].id)\r\n                }\r\n\r\n                if (obj.options.forceSelect && i == 0) {\r\n                    div.classList.add('selected');\r\n                }\r\n                var img = document.createElement('img');\r\n                if (data[i].image) {\r\n                    img.src = data[i].image;\r\n                } else {\r\n                    img.style.display = 'none';\r\n                }\r\n                div.appendChild(img);\r\n\r\n                var item = document.createElement('div');\r\n                item.innerHTML = text;\r\n                div.appendChild(item);\r\n\r\n                // Append item to the container\r\n                container.appendChild(div);\r\n            }\r\n        }\r\n    }\r\n\r\n    var execute = function(str) {\r\n        if (str != obj.terms) {\r\n            // New terms\r\n            obj.terms = str;\r\n            // New index\r\n            if (obj.options.forceSelect) {\r\n                index = 0;\r\n            } else {\r\n                index = null;\r\n            }\r\n            // Array or remote search\r\n            if (Array.isArray(obj.options.data)) {\r\n                var test = function(o) {\r\n                    if (typeof(o) == 'string') {\r\n                        if ((''+o).toLowerCase().search(str.toLowerCase()) >= 0) {\r\n                            return true;\r\n                        }\r\n                    } else {\r\n                        for (var key in o) {\r\n                            var value = o[key];\r\n                            if ((''+value).toLowerCase().search(str.toLowerCase()) >= 0) {\r\n                                return true;\r\n                            }\r\n                        }\r\n                    }\r\n                    return false;\r\n                }\r\n\r\n                var results = obj.options.data.filter(function(item) {\r\n                    return test(item);\r\n                });\r\n\r\n                // Show items\r\n                createList(results);\r\n            } else {\r\n                // Get remove results\r\n                ajax({\r\n                    url: obj.options.data + str,\r\n                    method: 'GET',\r\n                    dataType: 'json',\r\n                    success: function(data) {\r\n                        // Show items\r\n                        createList(data);\r\n                    }\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    // Search timer\r\n    var timer = null;\r\n\r\n    // Search methods\r\n    var obj = function(str) {\r\n        if (timer) {\r\n            clearTimeout(timer);\r\n        }\r\n        timer = setTimeout(function() {\r\n            execute(str);\r\n        }, 500);\r\n    }\r\n    if(options.forceSelect === null) {\r\n        options.forceSelect = true;\r\n    }\r\n    obj.options = {\r\n        data: options.data || null,\r\n        input: options.input || null,\r\n        searchByNode: options.searchByNode || null,\r\n        onselect: options.onselect || null,\r\n        forceSelect: options.forceSelect,\r\n        onsearch: options.onsearch || null,\r\n        onbeforesearch: options.onbeforesearch || null,\r\n    };\r\n\r\n    obj.selectIndex = function(item) {\r\n        var id = item.getAttribute('id');\r\n        var text = item.getAttribute('data-text');\r\n        var value = item.getAttribute('data-value');\r\n        var image = item.children[0].src || '';\r\n        // Onselect\r\n        if (typeof(obj.options.onselect) == 'function') {\r\n            obj.options.onselect(obj, text, value, id, image);\r\n        }\r\n        // Close container\r\n        obj.close();\r\n    }\r\n\r\n    obj.open = function() {\r\n        el.style.display = 'block';\r\n    }\r\n\r\n    obj.close = function() {\r\n        if (timer) {\r\n            clearTimeout(timer);\r\n        }\r\n        // Current terms\r\n        obj.terms = '';\r\n        // Remove results\r\n        container.innerHTML = '';\r\n        // Hide\r\n        el.style.display = '';\r\n    }\r\n\r\n    obj.isOpened = function() {\r\n        return el.style.display ? true : false;\r\n    }\r\n\r\n    obj.keydown = function(e) {\r\n        if (obj.isOpened()) {\r\n            if (e.key == 'Enter') {\r\n                // Enter\r\n                if (index!==null && container.children[index]) {\r\n                    obj.selectIndex(container.children[index]);\r\n                    e.preventDefault();\r\n                } else {\r\n                    obj.close();\r\n                }\r\n            } else if (e.key === 'ArrowUp') {\r\n                // Up\r\n                if (index!==null && container.children[0]) {\r\n                    container.children[index].classList.remove('selected');\r\n                    if(!obj.options.forceSelect && index === 0) {\r\n                        index = null;\r\n                    } else {\r\n                        index = Math.max(0, index-1);\r\n                        container.children[index].classList.add('selected');\r\n                    }\r\n                }\r\n                e.preventDefault();\r\n            } else if (e.key === 'ArrowDown') {\r\n                // Down\r\n                if(index == null) {\r\n                    index = -1;\r\n                } else {\r\n                    container.children[index].classList.remove('selected');\r\n                }\r\n                if (index < 9 && container.children[index+1]) {\r\n                    index++;\r\n                }\r\n                container.children[index].classList.add('selected');\r\n                e.preventDefault();\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.keyup = function(e) {\r\n        if (! obj.options.searchByNode && obj.options.input) {\r\n            if (obj.options.input.tagName === 'DIV') {\r\n                var terms = obj.options.input.innerText;\r\n            } else {\r\n                var terms = obj.options.input.value;\r\n            }\r\n        } else {\r\n            // Current node\r\n            var node = helpers.getNode();\r\n            if (node) {\r\n                var terms = node.innerText;\r\n            }\r\n        }\r\n\r\n        if (typeof(obj.options.onbeforesearch) == 'function') {\r\n            var ret = obj.options.onbeforesearch(obj, terms);\r\n            if (ret) {\r\n                terms = ret;\r\n            } else {\r\n                if (ret === false) {\r\n                    // Ignore event\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        obj(terms);\r\n    }\r\n\r\n    obj.blur = function(e) {\r\n        obj.close();\r\n    }\r\n\r\n    // Add events\r\n    if (obj.options.input) {\r\n        obj.options.input.addEventListener(\"keyup\", obj.keyup);\r\n        obj.options.input.addEventListener(\"keydown\", obj.keydown);\r\n        obj.options.input.addEventListener(\"blur\", obj.blur);\r\n    }\r\n\r\n    // Append element\r\n    var container = document.createElement('div');\r\n    container.classList.add('jsearch_container');\r\n    container.onmousedown = select;\r\n    el.appendChild(container);\r\n\r\n    el.classList.add('jsearch');\r\n    el.search = obj;\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/slider.js\nfunction Slider(el, options) {\r\n    var obj = {};\r\n    obj.options = {};\r\n    obj.currentImage = null;\r\n\r\n    if (options) {\r\n        obj.options = options;\r\n    }\r\n\r\n    // Focus\r\n    el.setAttribute('tabindex', '900')\r\n\r\n    // Items\r\n    obj.options.items = [];\r\n\r\n    if (! el.classList.contains('jslider')) {\r\n        el.classList.add('jslider');\r\n        el.classList.add('unselectable');\r\n\r\n        if (obj.options.height) {\r\n            el.style.minHeight = parseInt(obj.options.height) + 'px';\r\n        }\r\n        if (obj.options.width) {\r\n            el.style.width = parseInt(obj.options.width) + 'px';\r\n        }\r\n        if (obj.options.grid) {\r\n            el.classList.add('jslider-grid');\r\n            var number = el.children.length;\r\n            if (number > 4) {\r\n                el.setAttribute('data-total', number - 4);\r\n            }\r\n            el.setAttribute('data-number', (number > 4 ? 4 : number));\r\n        }\r\n\r\n        // Add slider counter\r\n        var counter = document.createElement('div');\r\n        counter.classList.add('jslider-counter');\r\n\r\n        // Move children inside\r\n        if (el.children.length > 0) {\r\n            // Keep children items\r\n            for (var i = 0; i < el.children.length; i++) {\r\n                obj.options.items.push(el.children[i]);\r\n                \r\n                // counter click event\r\n                var item = document.createElement('div');\r\n                item.onclick = function() {\r\n                    var index = Array.prototype.slice.call(counter.children).indexOf(this);\r\n                    obj.show(obj.currentImage = obj.options.items[index]);\r\n                }\r\n                counter.appendChild(item);\r\n            }\r\n        }\r\n        // Add caption\r\n        var caption = document.createElement('div');\r\n        caption.className = 'jslider-caption';\r\n\r\n        // Add close buttom\r\n        var controls = document.createElement('div');\r\n        var close = document.createElement('div');\r\n        close.className = 'jslider-close';\r\n        close.innerHTML = '';\r\n        \r\n        close.onclick = function() {\r\n            obj.close();\r\n        }\r\n        controls.appendChild(caption);\r\n        controls.appendChild(close);\r\n    }\r\n\r\n    obj.updateCounter = function(index) {\r\n        for (var i = 0; i < counter.children.length; i ++) {\r\n            if (counter.children[i].classList.contains('jslider-counter-focus')) {\r\n                counter.children[i].classList.remove('jslider-counter-focus');\r\n                break;\r\n            }\r\n        }\r\n        counter.children[index].classList.add('jslider-counter-focus');\r\n    }\r\n\r\n    obj.show = function(target) {\r\n        if (! target) {\r\n            var target = el.children[0];\r\n        }\r\n\r\n        // Focus element\r\n        el.classList.add('jslider-focus');\r\n        el.classList.remove('jslider-grid');\r\n        el.appendChild(controls);\r\n        el.appendChild(counter);\r\n\r\n        // Update counter\r\n        var index = obj.options.items.indexOf(target);\r\n        obj.updateCounter(index);\r\n\r\n        // Remove display\r\n        for (var i = 0; i < el.children.length; i++) {\r\n            el.children[i].style.display = '';\r\n        }\r\n        target.style.display = 'block';\r\n\r\n        // Is there any previous\r\n        if (target.previousElementSibling) {\r\n            el.classList.add('jslider-left');\r\n        } else {\r\n            el.classList.remove('jslider-left');\r\n        }\r\n\r\n        // Is there any next\r\n        if (target.nextElementSibling && target.nextElementSibling.tagName == 'IMG') {\r\n            el.classList.add('jslider-right');\r\n        } else {\r\n            el.classList.remove('jslider-right');\r\n        }\r\n\r\n        obj.currentImage = target;\r\n\r\n        // Vertical image\r\n        if (obj.currentImage.offsetHeight > obj.currentImage.offsetWidth) {\r\n            obj.currentImage.classList.add('jslider-vertical');\r\n        }\r\n\r\n        controls.children[0].innerText = obj.currentImage.getAttribute('title');\r\n    }\r\n\r\n    obj.open = function() {\r\n        obj.show();\r\n\r\n        // Event\r\n        if (typeof(obj.options.onopen) == 'function') {\r\n            obj.options.onopen(el);\r\n        }\r\n    }\r\n\r\n    obj.close = function() {\r\n        // Remove control classes\r\n        el.classList.remove('jslider-focus');\r\n        el.classList.remove('jslider-left');\r\n        el.classList.remove('jslider-right');\r\n        // Show as a grid depending on the configuration\r\n        if (obj.options.grid) {\r\n            el.classList.add('jslider-grid');\r\n        }\r\n        // Remove display\r\n        for (var i = 0; i < el.children.length; i++) {\r\n            el.children[i].style.display = '';\r\n        }\r\n        // Remove controls from the component\r\n        counter.remove();\r\n        controls.remove();\r\n        // Current image\r\n        obj.currentImage = null;\r\n        // Event\r\n        if (typeof(obj.options.onclose) == 'function') {\r\n            obj.options.onclose(el);\r\n        }\r\n    }\r\n\r\n    obj.reset = function() {\r\n        el.innerHTML = '';\r\n    }\r\n\r\n    obj.next = function() {\r\n        var nextImage = obj.currentImage.nextElementSibling;\r\n        if (nextImage && nextImage.tagName === 'IMG') {\r\n            obj.show(obj.currentImage.nextElementSibling);\r\n        }\r\n    }\r\n    \r\n    obj.prev = function() {\r\n        if (obj.currentImage.previousElementSibling) {\r\n            obj.show(obj.currentImage.previousElementSibling);\r\n        }\r\n    }\r\n\r\n    var mouseUp = function(e) {\r\n        // Open slider\r\n        if (e.target.tagName == 'IMG') {\r\n            obj.show(e.target);\r\n        } else if (! e.target.classList.contains('jslider-close') && ! (e.target.parentNode.classList.contains('jslider-counter') || e.target.classList.contains('jslider-counter'))){\r\n            // Arrow controls\r\n            var offsetX = e.offsetX || e.changedTouches[0].clientX;\r\n            if (e.target.clientWidth - offsetX < 40) {\r\n                // Show next image\r\n                obj.next();\r\n            } else if (offsetX < 40) {\r\n                // Show previous image\r\n                obj.prev();\r\n            }\r\n        }\r\n    }\r\n\r\n    if ('ontouchend' in document.documentElement === true) {\r\n        el.addEventListener('touchend', mouseUp);\r\n    } else {\r\n        el.addEventListener('mouseup', mouseUp);\r\n    }\r\n\r\n    // Add global events\r\n    el.addEventListener(\"swipeleft\", function(e) {\r\n        obj.next();\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n    });\r\n\r\n    el.addEventListener(\"swiperight\", function(e) {\r\n        obj.prev();\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n    });\r\n\r\n    el.addEventListener('keydown', function(e) {\r\n        if (e.which == 27) {\r\n            obj.close();\r\n        }\r\n    });\r\n\r\n    el.slider = obj;\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/tags.js\n\r\n\r\n\r\n\r\nfunction Tags(el, options) {\r\n    // Redefine configuration\r\n    if (el.tags) {\r\n        return el.tags.setOptions(options, true);\r\n    }\r\n\r\n    var obj = { type:'tags' };\r\n    obj.options = {};\r\n\r\n    // Limit\r\n    var limit = function() {\r\n        return obj.options.limit && el.children.length >= obj.options.limit ? true : false;\r\n    }\r\n\r\n    // Search helpers\r\n    var search = null;\r\n    var searchContainer = null;\r\n\r\n    obj.setOptions = function(options, reset) {\r\n        /**\r\n         * @typedef {Object} defaults\r\n         * @property {(string|Array)} value - Initial value of the compontent\r\n         * @property {number} limit - Max number of tags inside the element\r\n         * @property {string} search - The URL for suggestions\r\n         * @property {string} placeholder - The default instruction text on the element\r\n         * @property {validation} validation - Method to validate the tags\r\n         * @property {requestCallback} onbeforechange - Method to be execute before any changes on the element\r\n         * @property {requestCallback} onchange - Method to be execute after any changes on the element\r\n         * @property {requestCallback} onfocus - Method to be execute when on focus\r\n         * @property {requestCallback} onblur - Method to be execute when on blur\r\n         * @property {requestCallback} onload - Method to be execute when the element is loaded\r\n         */\r\n        var defaults = {\r\n            value: '',\r\n            limit: null,\r\n            search: null,\r\n            placeholder: null,\r\n            validation: null,\r\n            onbeforepaste: null,\r\n            onbeforechange: null,\r\n            onremoveitem: null,\r\n            onlimit: null,\r\n            onchange: null,\r\n            onfocus: null,\r\n            onblur: null,\r\n            onload: null,\r\n        }\r\n\r\n        // Loop through though the default configuration\r\n        for (var property in defaults) {\r\n            if (options && options.hasOwnProperty(property)) {\r\n                obj.options[property] = options[property];\r\n            } else {\r\n                if (typeof(obj.options[property]) == 'undefined' || reset === true) {\r\n                    obj.options[property] = defaults[property];\r\n                }\r\n            }\r\n        }\r\n\r\n        // Placeholder\r\n        if (obj.options.placeholder) {\r\n            el.setAttribute('data-placeholder', obj.options.placeholder);\r\n        } else {\r\n            el.removeAttribute('data-placeholder');\r\n        }\r\n        el.placeholder = obj.options.placeholder;\r\n\r\n        // Update value\r\n        obj.setValue(obj.options.value);\r\n\r\n        // Validate items\r\n        filter();\r\n\r\n        // Create search box\r\n        if (obj.options.search) {\r\n            if (! searchContainer) {\r\n                searchContainer = document.createElement('div');\r\n                el.parentNode.insertBefore(searchContainer, el.nextSibling);\r\n\r\n                // Create container\r\n                search = Search(searchContainer, {\r\n                    data: obj.options.search,\r\n                    onselect: function(a,b,c) {\r\n                        obj.selectIndex(b,c);\r\n                    }\r\n                });\r\n            }\r\n        } else {\r\n            if (searchContainer) {\r\n                search = null;\r\n                searchContainer.remove();\r\n                searchContainer = null;\r\n            }\r\n        }\r\n\r\n        return obj;\r\n    }\r\n\r\n    /**\r\n     * Add a new tag to the element\r\n     * @param {(?string|Array)} value - The value of the new element\r\n     */\r\n    obj.add = function(value, focus) {\r\n        if (typeof(obj.options.onbeforechange) == 'function') {\r\n            var ret = obj.options.onbeforechange(el, obj, obj.options.value, value);\r\n            if (ret === false) {\r\n                return false;\r\n            } else { \r\n                if (ret != null) {\r\n                    value = ret;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Make sure search is closed\r\n        if (search) {\r\n            search.close();\r\n        }\r\n\r\n        if (limit()) {\r\n            if (typeof(obj.options.onlimit) == 'function') {\r\n                obj.options.onlimit(obj, obj.options.limit);\r\n            } else {\r\n                alert(dictionary.translate('You reach the limit number of entries') + ' ' + obj.options.limit);\r\n            }\r\n        } else {\r\n            // Get node\r\n            var node = helpers.getNode();\r\n\r\n            if (node && node.parentNode && node.parentNode.classList.contains('jtags') &&\r\n                node.nextSibling && (! (node.nextSibling.innerText && node.nextSibling.innerText.trim()))) {\r\n                div = node.nextSibling;\r\n            } else {\r\n                // Remove not used last item\r\n                if (el.lastChild) {\r\n                    if (! el.lastChild.innerText.trim()) {\r\n                        el.removeChild(el.lastChild);\r\n                    }\r\n                }\r\n\r\n                // Mix argument string or array\r\n                if (! value || typeof(value) == 'string') {\r\n                    var div = createElement(value, value, node);\r\n                } else {\r\n                    for (var i = 0; i <= value.length; i++) {\r\n                        if (! limit()) {\r\n                            if (! value[i] || typeof(value[i]) == 'string') {\r\n                                var t = value[i] || '';\r\n                                var v = null;\r\n                            } else {\r\n                                var t = value[i].text;\r\n                                var v = value[i].value;\r\n                            }\r\n\r\n                            // Add element\r\n                            var div = createElement(t, v);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Change\r\n                change();\r\n            }\r\n\r\n            // Place caret\r\n            if (focus) {\r\n                setFocus(div);\r\n            }\r\n        }\r\n    }\r\n\r\n    obj.setLimit = function(limit) {\r\n        obj.options.limit = limit;\r\n        var n = el.children.length - limit;\r\n        while (el.children.length > limit) {\r\n            el.removeChild(el.lastChild);\r\n        }\r\n    }\r\n\r\n    // Remove a item node\r\n    obj.remove = function(node) {\r\n        // Remove node\r\n        node.parentNode.removeChild(node);\r\n        // Make sure element is not blank\r\n        if (! el.children.length) {\r\n            obj.add('', true);\r\n        } else {\r\n            change();\r\n        }\r\n\r\n        if (typeof(obj.options.onremoveitem) == 'function') {\r\n            obj.options.onremoveitem(el, obj, node);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get all tags in the element\r\n     * @return {Array} data - All tags as an array\r\n     */\r\n    obj.getData = function() {\r\n        var data = [];\r\n        for (var i = 0; i < el.children.length; i++) {\r\n            // Get value\r\n            var text = el.children[i].innerText.replace(\"\\n\", \"\");\r\n            // Get id\r\n            var value = el.children[i].getAttribute('data-value');\r\n            if (! value) {\r\n                value = text;\r\n            }\r\n            // Item\r\n            if (text || value) {\r\n                data.push({ text: text, value: value });\r\n            }\r\n        }\r\n        return data;\r\n    }\r\n\r\n    /**\r\n     * Get the value of one tag. Null for all tags\r\n     * @param {?number} index - Tag index number. Null for all tags.\r\n     * @return {string} value - All tags separated by comma\r\n     */\r\n    obj.getValue = function(index) {\r\n        var value = null;\r\n\r\n        if (index != null) {\r\n            // Get one individual value\r\n            value = el.children[index].getAttribute('data-value');\r\n            if (! value) {\r\n                value = el.children[index].innerText.replace(\"\\n\", \"\");\r\n            }\r\n        } else {\r\n            // Get all\r\n            var data = [];\r\n            for (var i = 0; i < el.children.length; i++) {\r\n                value = el.children[i].innerText.replace(\"\\n\", \"\");\r\n                if (value) {\r\n                    data.push(obj.getValue(i));\r\n                }\r\n            }\r\n            value = data.join(',');\r\n        }\r\n\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * Set the value of the element based on a string separeted by (,|;|\\r\\n)\r\n     * @param {mixed} value - A string or array object with values\r\n     */\r\n    obj.setValue = function(mixed) {\r\n        if (! mixed) {\r\n            obj.reset();\r\n        } else {\r\n            if (el.value != mixed) {\r\n                if (Array.isArray(mixed)) {\r\n                    obj.add(mixed);\r\n                } else {\r\n                    // Remove whitespaces\r\n                    var text = (''+mixed).trim();\r\n                    // Tags\r\n                    var data = extractTags(text);\r\n                    // Reset\r\n                    el.innerHTML = '';\r\n                    // Add tags to the element\r\n                    obj.add(data);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Reset the data from the element\r\n     */\r\n    obj.reset = function() {\r\n        // Empty class\r\n        el.classList.add('jtags-empty');\r\n        // Empty element\r\n        el.innerHTML = '<div></div>';\r\n        // Execute changes\r\n        change();\r\n    }\r\n\r\n    /**\r\n     * Verify if all tags in the element are valid\r\n     * @return {boolean}\r\n     */\r\n    obj.isValid = function() {\r\n        var test = 0;\r\n        for (var i = 0; i < el.children.length; i++) {\r\n            if (el.children[i].classList.contains('jtags_error')) {\r\n                test++;\r\n            }\r\n        }\r\n        return test == 0 ? true : false;\r\n    }\r\n\r\n    /**\r\n     * Add one element from the suggestions to the element\r\n     * @param {object} item - Node element in the suggestions container\r\n     */ \r\n    obj.selectIndex = function(text, value) {\r\n        var node = helpers.getNode();\r\n        if (node) {\r\n            // Append text to the caret\r\n            node.innerText = text;\r\n            // Set node id\r\n            if (value) {\r\n                node.setAttribute('data-value', value);\r\n            }\r\n            // Remove any error\r\n            node.classList.remove('jtags_error');\r\n            if (! limit()) {\r\n                // Add new item\r\n                obj.add('', true);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Search for suggestions\r\n     * @param {object} node - Target node for any suggestions\r\n     */\r\n    obj.search = function(node) {\r\n        // Search for\r\n        var terms = node.innerText;\r\n    }\r\n\r\n    // Destroy tags element\r\n    obj.destroy = function() {\r\n        // Bind events\r\n        el.removeEventListener('mouseup', tagsMouseUp);\r\n        el.removeEventListener('keydown', tagsKeyDown);\r\n        el.removeEventListener('keyup', tagsKeyUp);\r\n        el.removeEventListener('paste', tagsPaste);\r\n        el.removeEventListener('focus', tagsFocus);\r\n        el.removeEventListener('blur', tagsBlur);\r\n\r\n        // Remove element\r\n        el.parentNode.removeChild(el);\r\n    }\r\n\r\n    var setFocus = function(node) {\r\n        if (el.children.length) {\r\n            var range = document.createRange();\r\n            var sel = window.getSelection();\r\n            if (! node) {\r\n                var node = el.childNodes[el.childNodes.length-1];\r\n            }\r\n            range.setStart(node, node.length)\r\n            range.collapse(true)\r\n            sel.removeAllRanges()\r\n            sel.addRange(range)\r\n            el.scrollLeft = el.scrollWidth;\r\n        }\r\n    }\r\n\r\n    var createElement = function(label, value, node) {\r\n        var div = document.createElement('div');\r\n        div.textContent = label ? label : '';\r\n        if (value) {\r\n            div.setAttribute('data-value', value);\r\n        }\r\n\r\n        if (node && node.parentNode.classList.contains('jtags')) {\r\n            el.insertBefore(div, node.nextSibling);\r\n        } else {\r\n            el.appendChild(div);\r\n        }\r\n\r\n        return div;\r\n    }\r\n\r\n    var change = function() {\r\n        // Value\r\n        var value = obj.getValue();\r\n\r\n        if (value != obj.options.value) {\r\n            obj.options.value = value;\r\n            if (typeof(obj.options.onchange) == 'function') {\r\n                obj.options.onchange(el, obj, obj.options.value);\r\n            }\r\n\r\n            // Lemonade JS\r\n            if (el.value != obj.options.value) {\r\n                el.value = obj.options.value;\r\n                if (typeof(el.oninput) == 'function') {\r\n                    el.oninput({\r\n                        type: 'input',\r\n                        target: el,\r\n                        value: el.value\r\n                    });\r\n                }\r\n            }\r\n        }\r\n\r\n        filter();\r\n    }\r\n\r\n    /**\r\n     * Filter tags\r\n     */\r\n    var filter = function() {\r\n        for (var i = 0; i < el.children.length; i++) {\r\n            if (el.children[i].tagName === 'DIV') {\r\n                // Create label design\r\n                if (!obj.getValue(i)) {\r\n                    el.children[i].classList.remove('jtags_label');\r\n                } else {\r\n                    el.children[i].classList.add('jtags_label');\r\n\r\n                    // Validation in place\r\n                    if (typeof (obj.options.validation) == 'function') {\r\n                        if (obj.getValue(i)) {\r\n                            if (!obj.options.validation(el.children[i], el.children[i].innerText, el.children[i].getAttribute('data-value'))) {\r\n                                el.children[i].classList.add('jtags_error');\r\n                            } else {\r\n                                el.children[i].classList.remove('jtags_error');\r\n                            }\r\n                        } else {\r\n                            el.children[i].classList.remove('jtags_error');\r\n                        }\r\n                    } else {\r\n                        el.children[i].classList.remove('jtags_error');\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        isEmpty();\r\n    }\r\n\r\n    var isEmpty = function() {\r\n        // Can't be empty\r\n        if (! el.innerText.trim()) {\r\n            if (! el.children.length || el.children[0].tagName === 'BR') {\r\n                el.innerHTML = '';\r\n                setFocus(createElement());\r\n            }\r\n        } else {\r\n            el.classList.remove('jtags-empty');\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Extract tags from a string\r\n     * @param {string} text - Raw string\r\n     * @return {Array} data - Array with extracted tags\r\n     */\r\n    var extractTags = function(text) {\r\n        /** @type {Array} */\r\n        var data = [];\r\n\r\n        /** @type {string} */\r\n        var word = '';\r\n\r\n        // Remove whitespaces\r\n        text = text.trim();\r\n\r\n        if (text) {\r\n            for (var i = 0; i < text.length; i++) {\r\n                if (text[i] == ',' || text[i] == ';' || text[i] == '\\n') {\r\n                    if (word) {\r\n                        data.push(word.trim());\r\n                        word = '';\r\n                    }\r\n                } else {\r\n                    word += text[i];\r\n                }\r\n            }\r\n\r\n            if (word) {\r\n                data.push(word);\r\n            }\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    /** @type {number} */\r\n    var anchorOffset = 0;\r\n\r\n    /**\r\n     * Processing event keydown on the element\r\n     * @param e {object}\r\n     */\r\n    var tagsKeyDown = function(e) {\r\n        // Anchoroffset\r\n        anchorOffset = window.getSelection().anchorOffset;\r\n\r\n        // Verify if is empty\r\n        isEmpty();\r\n\r\n        // Comma\r\n        if (e.key === 'Tab'  || e.key === ';' || e.key === ',') {\r\n            var n = window.getSelection().anchorOffset;\r\n            if (n > 1) {\r\n                if (limit()) {\r\n                    if (typeof(obj.options.onlimit) == 'function') {\r\n                        obj.options.onlimit(obj, obj.options.limit)\r\n                    }\r\n                } else {\r\n                    obj.add('', true);\r\n                }\r\n            }\r\n            e.preventDefault();\r\n        } else if (e.key == 'Enter') {\r\n            if (! search || ! search.isOpened()) {\r\n                var n = window.getSelection().anchorOffset;\r\n                if (n > 1) {\r\n                    if (! limit()) {\r\n                        obj.add('', true);\r\n                    }\r\n                }\r\n                e.preventDefault();\r\n            }\r\n        } else if (e.key == 'Backspace') {\r\n            // Back space - do not let last item to be removed\r\n            if (el.children.length == 1 && window.getSelection().anchorOffset < 1) {\r\n                e.preventDefault();\r\n            }\r\n        }\r\n\r\n        // Search events\r\n        if (search) {\r\n            search.keydown(e);\r\n        }\r\n\r\n        // Verify if is empty\r\n        isEmpty();\r\n    }\r\n\r\n    /**\r\n     * Processing event keyup on the element\r\n     * @param e {object}\r\n     */\r\n    var tagsKeyUp = function(e) {\r\n        if (e.which == 39) {\r\n            // Right arrow\r\n            var n = window.getSelection().anchorOffset;\r\n            if (n > 1 && n == anchorOffset) {\r\n                obj.add('', true);\r\n            }\r\n        } else if (e.which == 13 || e.which == 38 || e.which == 40) {\r\n            e.preventDefault();\r\n        } else {\r\n            if (search) {\r\n                search.keyup(e);\r\n            }\r\n        }\r\n\r\n        filter();\r\n    }\r\n\r\n    /**\r\n     * Processing event paste on the element\r\n     * @param e {object}\r\n     */\r\n    var tagsPaste =  function(e) {\r\n        if (e.clipboardData || e.originalEvent.clipboardData) {\r\n            var text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n        } else if (window.clipboardData) {\r\n            var text = window.clipboardData.getData('Text');\r\n        }\r\n\r\n        var data = extractTags(text);\r\n\r\n        if (typeof(obj.options.onbeforepaste) == 'function') {\r\n            var ret = obj.options.onbeforepaste(el, obj, data);\r\n            if (ret === false) {\r\n                e.preventDefault();\r\n                return false;\r\n            } else {\r\n                if (ret) {\r\n                    data = ret;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (data.length > 1) {\r\n            obj.add(data, true);\r\n            e.preventDefault();\r\n        } else if (data[0]) {\r\n            document.execCommand('insertText', false, data[0])\r\n            e.preventDefault();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Processing event mouseup on the element\r\n     * @param e {object}\r\n     */\r\n    var tagsMouseUp = function(e) {\r\n        if (e.target.parentNode && e.target.parentNode.classList.contains('jtags')) {\r\n            if (e.target.classList.contains('jtags_label') || e.target.classList.contains('jtags_error')) {\r\n                var rect = e.target.getBoundingClientRect();\r\n                if (rect.width - (e.clientX - rect.left) < 16) {\r\n                    obj.remove(e.target);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Set focus in the last item\r\n        if (e.target == el) {\r\n            setFocus();\r\n        }\r\n    }\r\n\r\n    var tagsFocus = function() {\r\n        if (! el.classList.contains('jtags-focus')) {\r\n            if (! el.children.length || obj.getValue(el.children.length - 1)) {\r\n                if (! limit()) {\r\n                    createElement('');\r\n                }\r\n            }\r\n\r\n            if (typeof(obj.options.onfocus) == 'function') {\r\n                obj.options.onfocus(el, obj, obj.getValue());\r\n            }\r\n\r\n            el.classList.add('jtags-focus');\r\n        }\r\n    }\r\n\r\n    var tagsBlur = function() {\r\n        if (el.classList.contains('jtags-focus')) {\r\n            if (search) {\r\n                search.close();\r\n            }\r\n\r\n            for (var i = 0; i < el.children.length - 1; i++) {\r\n                // Create label design\r\n                if (! obj.getValue(i)) {\r\n                    el.removeChild(el.children[i]);\r\n                }\r\n            }\r\n\r\n            change();\r\n\r\n            el.classList.remove('jtags-focus');\r\n\r\n            if (typeof(obj.options.onblur) == 'function') {\r\n                obj.options.onblur(el, obj, obj.getValue());\r\n            }\r\n        }\r\n    }\r\n\r\n    var init = function() {\r\n        // Bind events\r\n        if ('touchend' in document.documentElement === true) {\r\n            el.addEventListener('touchend', tagsMouseUp);\r\n        } else {\r\n            el.addEventListener('mouseup', tagsMouseUp);\r\n        }\r\n\r\n        el.addEventListener('keydown', tagsKeyDown);\r\n        el.addEventListener('keyup', tagsKeyUp);\r\n        el.addEventListener('paste', tagsPaste);\r\n        el.addEventListener('focus', tagsFocus);\r\n        el.addEventListener('blur', tagsBlur);\r\n\r\n        // Editable\r\n        el.setAttribute('contenteditable', true);\r\n\r\n        // Prepare container\r\n        el.classList.add('jtags');\r\n\r\n        // Initial options\r\n        obj.setOptions(options);\r\n\r\n        if (typeof(obj.options.onload) == 'function') {\r\n            obj.options.onload(el, obj);\r\n        }\r\n\r\n        // Change methods\r\n        el.change = obj.setValue;\r\n\r\n        // Global generic value handler\r\n        el.val = function(val) {\r\n            if (val === undefined) {\r\n                return obj.getValue();\r\n            } else {\r\n                obj.setValue(val);\r\n            }\r\n        }\r\n\r\n        el.tags = obj;\r\n    }\r\n\r\n    init();\r\n\r\n    return obj;\r\n}\n;// CONCATENATED MODULE: ./src/plugins/upload.js\n\r\n\r\n\r\n\r\n\r\nfunction Upload(el, options) {\r\n    var obj = {};\r\n    obj.options = {};\r\n\r\n    // Default configuration\r\n    var defaults = {\r\n        type: 'image',\r\n        extension: '*',\r\n        input: false,\r\n        minWidth: false,\r\n        maxWidth: null,\r\n        maxHeight: null,\r\n        maxJpegSizeBytes: null, // For example, 350Kb would be 350000\r\n        onchange: null,\r\n        multiple: false,\r\n        remoteParser: null,\r\n    };\r\n\r\n    // Loop through our object\r\n    for (var property in defaults) {\r\n        if (options && options.hasOwnProperty(property)) {\r\n            obj.options[property] = options[property];\r\n        } else {\r\n            obj.options[property] = defaults[property];\r\n        }\r\n    }\r\n\r\n    // Multiple\r\n    if (obj.options.multiple == true) {\r\n        el.setAttribute('data-multiple', true);\r\n    }\r\n\r\n    // Container\r\n    el.content = [];\r\n\r\n    // Upload icon\r\n    el.classList.add('jupload');\r\n\r\n    if (obj.options.input == true) {\r\n        el.classList.add('input');\r\n    }\r\n\r\n    obj.add = function(data) {\r\n        // Reset container for single files\r\n        if (obj.options.multiple == false) {\r\n            el.content = [];\r\n            el.innerText = '';\r\n        }\r\n\r\n        // Append to the element\r\n        if (obj.options.type == 'image') {\r\n            var img = document.createElement('img');\r\n            img.setAttribute('src', data.file);\r\n            img.setAttribute('tabindex', -1);\r\n            if (! el.getAttribute('name')) {\r\n                img.className = 'jfile';\r\n                img.content = data;\r\n            }\r\n            el.appendChild(img);\r\n        } else {\r\n            if (data.name) {\r\n                var name = data.name;\r\n            } else {\r\n                var name = data.file;\r\n            }\r\n            var div = document.createElement('div');\r\n            div.innerText = name || obj.options.type;\r\n            div.classList.add('jupload-item');\r\n            div.setAttribute('tabindex', -1);\r\n            el.appendChild(div);\r\n        }\r\n\r\n        if (data.content) {\r\n            data.file = helpers.guid();\r\n        }\r\n\r\n        // Push content\r\n        el.content.push(data);\r\n\r\n        // Onchange\r\n        if (typeof(obj.options.onchange) == 'function') {\r\n            obj.options.onchange(el, data);\r\n        }\r\n    }\r\n\r\n    obj.addFromFile = function(file) {\r\n        var type = file.type.split('/');\r\n        if (type[0] == obj.options.type) {\r\n            var readFile = new FileReader();\r\n            readFile.addEventListener(\"load\", function (v) {\r\n                var data = {\r\n                    file: v.srcElement.result,\r\n                    extension: file.name.substr(file.name.lastIndexOf('.') + 1),\r\n                    name: file.name,\r\n                    size: file.size,\r\n                    lastmodified: file.lastModified,\r\n                    content: v.srcElement.result,\r\n                }\r\n\r\n                obj.add(data);\r\n            });\r\n\r\n            readFile.readAsDataURL(file);\r\n        } else {\r\n            alert(dictionary.translate('This extension is not allowed'));\r\n        }\r\n    }\r\n\r\n    obj.addFromUrl = function(src) {\r\n        if (src.substr(0,4) != 'data' && ! obj.options.remoteParser) {\r\n            console.error('remoteParser not defined in your initialization');\r\n        } else {\r\n            // This is to process cross domain images\r\n            if (src.substr(0,4) == 'data') {\r\n                var extension = src.split(';')\r\n                extension = extension[0].split('/');\r\n                var type = extension[0].replace('data:','');\r\n                if (type == obj.options.type) {\r\n                    var data = {\r\n                        file: src,\r\n                        name: '',\r\n                        extension: extension[1],\r\n                        content: src,\r\n                    }\r\n                    obj.add(data);\r\n                } else {\r\n                    alert(obj.options.text.extensionNotAllowed);\r\n                }\r\n            } else {\r\n                var extension = src.substr(src.lastIndexOf('.') + 1);\r\n                // Work for cross browsers\r\n                src = obj.options.remoteParser + src;\r\n                // Get remove content\r\n                ajax({\r\n                    url: src,\r\n                    type: 'GET',\r\n                    dataType: 'blob',\r\n                    success: function(data) {\r\n                        //add(extension[0].replace('data:',''), data);\r\n                    }\r\n                })\r\n            }\r\n        }\r\n    }\r\n\r\n    var getDataURL = function(canvas, type) {\r\n        var compression = 0.92;\r\n        var lastContentLength = null;\r\n        var content = canvas.toDataURL(type, compression);\r\n        while (obj.options.maxJpegSizeBytes && type === 'image/jpeg' &&\r\n               content.length > obj.options.maxJpegSizeBytes && content.length !== lastContentLength) {\r\n            // Apply the compression\r\n            compression *= 0.9;\r\n            lastContentLength = content.length;\r\n            content = canvas.toDataURL(type, compression);\r\n        }\r\n        return content;\r\n    }\r\n\r\n    var mime = obj.options.type + '/' + obj.options.extension;\r\n    var input = document.createElement('input');\r\n    input.type = 'file';\r\n    input.setAttribute('accept', mime);\r\n    input.onchange = function() {\r\n        for (var i = 0; i < this.files.length; i++) {\r\n            obj.addFromFile(this.files[i]);\r\n        }\r\n    }\r\n\r\n    // Allow multiple files\r\n    if (obj.options.multiple == true) {\r\n        input.setAttribute('multiple', true);\r\n    }\r\n\r\n    var current = null;\r\n\r\n    el.addEventListener(\"click\", function(e) {\r\n        current = null;\r\n        if (! el.children.length || e.target === el) {\r\n            helpers.click(input);\r\n        } else {\r\n            if (e.target.parentNode == el) {\r\n                current = e.target;\r\n            }\r\n        }\r\n    });\r\n\r\n    el.addEventListener(\"dblclick\", function(e) {\r\n        helpers.click(input);\r\n    });\r\n\r\n    el.addEventListener('dragenter', function(e) {\r\n        el.style.border = '1px dashed #000';\r\n    });\r\n\r\n    el.addEventListener('dragleave', function(e) {\r\n        el.style.border = '1px solid #eee';\r\n    });\r\n\r\n    el.addEventListener('dragstop', function(e) {\r\n        el.style.border = '1px solid #eee';\r\n    });\r\n\r\n    el.addEventListener('dragover', function(e) {\r\n        e.preventDefault();\r\n    });\r\n\r\n    el.addEventListener('keydown', function(e) {\r\n        if (current && e.which == 46) {\r\n            var index = Array.prototype.indexOf.call(el.children, current);\r\n            if (index >= 0) {\r\n                el.content.splice(index, 1);\r\n                current.remove();\r\n                current = null;\r\n            }\r\n        }\r\n    });\r\n\r\n    el.addEventListener('drop', function(e) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n\r\n        var html = (e.originalEvent || e).dataTransfer.getData('text/html');\r\n        var file = (e.originalEvent || e).dataTransfer.files;\r\n\r\n        if (file.length) {\r\n            for (var i = 0; i < e.dataTransfer.files.length; i++) {\r\n                obj.addFromFile(e.dataTransfer.files[i]);\r\n            }\r\n        } else if (html) {\r\n            if (obj.options.multiple == false) {\r\n                el.innerText = '';\r\n            }\r\n\r\n            // Create temp element\r\n            let img = [];\r\n            utils_filter(html, img);\r\n            if (img.length) {\r\n                for (var i = 0; i < img.length; i++) {\r\n                    obj.addFromUrl(img[i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        el.style.border = '1px solid #eee';\r\n\r\n        return false;\r\n    });\r\n\r\n    el.val = function(val) {\r\n        if (val === undefined) {\r\n            return el.content && el.content.length ? el.content : null;\r\n        } else {\r\n            // Reset\r\n            el.innerText = '';\r\n            el.content = [];\r\n\r\n            if (val) {\r\n                if (Array.isArray(val)) {\r\n                    for (var i = 0; i < val.length; i++) {\r\n                        if (typeof(val[i]) == 'string') {\r\n                            obj.add({ file: val[i] });\r\n                        } else {\r\n                            obj.add(val[i]);\r\n                        }\r\n                    }\r\n                } else if (typeof(val) == 'string') {\r\n                    obj.add({ file: val });\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    el.upload = el.image = obj;\r\n\r\n    return obj;\r\n}\r\n\n// EXTERNAL MODULE: ./packages/sha512/sha512.js\nvar sha512 = __webpack_require__(195);\nvar sha512_default = /*#__PURE__*/__webpack_require__.n(sha512);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/calendar/dist/index.js\nvar calendar_dist = __webpack_require__(763);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/color/dist/index.js\nvar color_dist = __webpack_require__(541);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/contextmenu/dist/index.js\nvar contextmenu_dist = __webpack_require__(238);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/dropdown/dist/index.js\nvar dropdown_dist = __webpack_require__(692);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/modal/dist/index.js\nvar modal_dist = __webpack_require__(72);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/switch/dist/index.js\nvar switch_dist = __webpack_require__(539);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/tabs/dist/index.js\nvar tabs_dist = __webpack_require__(560);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/topmenu/dist/index.js\nvar topmenu_dist = __webpack_require__(330);\n// EXTERNAL MODULE: ./node_modules/@lemonadejs/rating/dist/index.js\nvar rating_dist = __webpack_require__(867);\n;// CONCATENATED MODULE: ./src/jsuites.js\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nvar jSuites = {\r\n    // Helpers\r\n    ...dictionary,\r\n    ...helpers,\r\n    /** Current version */\r\n    version: '6.4.0',\r\n    /** Bind new extensions to Jsuites */\r\n    setExtensions: function(o) {\r\n        if (typeof(o) == 'object') {\r\n            var k = Object.keys(o);\r\n            for (var i = 0; i < k.length; i++) {\r\n                jSuites[k[i]] = o[k[i]];\r\n            }\r\n        }\r\n    },\r\n    tracking: tracking,\r\n    path: Path,\r\n    sorting: Sorting,\r\n    lazyLoading: LazyLoading,\r\n    // Plugins\r\n    ajax: ajax,\r\n    animation: animation,\r\n    calendar: calendar,\r\n    color: Color,\r\n    contextmenu: contextmenu,\r\n    dropdown: dropdown,\r\n    editor: editor,\r\n    floating: floating,\r\n    form: plugins_form,\r\n    mask: mask,\r\n    modal: modal,\r\n    notification: notification,\r\n    palette: palette,\r\n    picker: Picker,\r\n    progressbar: Progressbar,\r\n    rating: Rating,\r\n    search: Search,\r\n    slider: Slider,\r\n    tabs: Tabs,\r\n    tags: Tags,\r\n    toolbar: Toolbar,\r\n    upload: Upload,\r\n    validations: validations,\r\n}\r\n\r\n// Legacy\r\njSuites.image = Upload;\r\njSuites.image.create = function(data) {\r\n    var img = document.createElement('img');\r\n    img.setAttribute('src', data.file);\r\n    img.className = 'jfile';\r\n    img.setAttribute('tabindex', -1);\r\n    img.content = data;\r\n\r\n    return img;\r\n}\r\n\r\njSuites.tracker = plugins_form;\r\njSuites.loading = animation.loading;\r\njSuites.sha512 = (sha512_default());\r\n\r\n\r\n/** Core events */\r\nconst Events = function() {\r\n\r\n    if (typeof(window['jSuitesStateControl']) === 'undefined') {\r\n        window['jSuitesStateControl'] = [];\r\n    } else {\r\n        // Do nothing\r\n        return;\r\n    }\r\n\r\n    const find = function(DOMElement, component) {\r\n        if (DOMElement[component.type] && DOMElement[component.type] == component) {\r\n            return true;\r\n        }\r\n        if (DOMElement.component && DOMElement.component == component) {\r\n            return true;\r\n        }\r\n        if (DOMElement.parentNode) {\r\n            return find(DOMElement.parentNode, component);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    const isOpened = function(e) {\r\n        let state = window['jSuitesStateControl'];\r\n        if (state && state.length > 0) {\r\n            for (let i = 0; i < state.length; i++) {\r\n                if (state[i] && ! find(e, state[i])) {\r\n                    state[i].close();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Width of the border\r\n    let cornerSize = 15;\r\n\r\n    // Current element\r\n    let element = null;\r\n\r\n    // Controllers\r\n    let editorAction = false;\r\n\r\n    // Event state\r\n    let state = {\r\n        x: null,\r\n        y: null,\r\n    }\r\n\r\n    // Tooltip element\r\n    let tooltip = document.createElement('div')\r\n    tooltip.classList.add('jtooltip');\r\n\r\n    const isWebcomponent = function(e) {\r\n        return e && (e.shadowRoot || (e.tagName && e.tagName.includes('-')));\r\n    }\r\n\r\n    const getElement = function(e) {\r\n        let d;\r\n        let element;\r\n        // Which component I am clicking\r\n        let path = e.path || (e.composedPath && e.composedPath());\r\n\r\n        // If path available get the first element in the chain\r\n        if (path) {\r\n            element = path[0];\r\n            // Adjustment sales force\r\n            if (element && isWebcomponent(element) && ! element.shadowRoot && e.toElement) {\r\n                element = e.toElement;\r\n            }\r\n        } else {\r\n            // Try to guess using the coordinates\r\n            if (e.target && isWebcomponent(e.target)) {\r\n                d = e.target.shadowRoot;\r\n            } else {\r\n                d = document;\r\n            }\r\n            // Get the first target element\r\n            element = d.elementFromPoint(x, y);\r\n        }\r\n        return element;\r\n    }\r\n\r\n    // Events\r\n    const mouseDown = function(e) {\r\n        // Verify current components tracking\r\n        if (e.changedTouches && e.changedTouches[0]) {\r\n            var x = e.changedTouches[0].clientX;\r\n            var y = e.changedTouches[0].clientY;\r\n        } else {\r\n            var x = e.clientX;\r\n            var y = e.clientY;\r\n        }\r\n\r\n        let element = getElement(e);\r\n        // Editable\r\n        let editable = element && element.tagName === 'DIV' && element.getAttribute('contentEditable');\r\n        // Check if this is the floating\r\n        let item = jSuites.findElement(element, 'jpanel');\r\n        // Jfloating found\r\n        if (item && ! item.classList.contains(\"readonly\") && ! editable) {\r\n            // Keep the tracking information\r\n            let rect = item.getBoundingClientRect();\r\n            let angle = 0;\r\n            if (item.style.rotate) {\r\n                // Extract the angle value from the match and convert it to a number\r\n                angle = parseFloat(item.style.rotate);\r\n            }\r\n            let action = 'move';\r\n            if (element.getAttribute('data-action')) {\r\n                action = element.getAttribute('data-action');\r\n            } else {\r\n                if (item.style.cursor) {\r\n                    action = 'resize';\r\n                } else {\r\n                    item.style.cursor = 'move';\r\n                }\r\n            }\r\n\r\n            // Action\r\n            editorAction = {\r\n                action: action,\r\n                a: angle,\r\n                e: item,\r\n                x: x,\r\n                y: y,\r\n                l: rect.left,\r\n                t: rect.top,\r\n                b: rect.bottom,\r\n                r: rect.right,\r\n                w: rect.width,\r\n                h: rect.height,\r\n                d: item.style.cursor,\r\n                actioned: false,\r\n            }\r\n            // Make sure width and height styling is OK\r\n            if (! item.style.width) {\r\n                item.style.width = rect.width + 'px';\r\n            }\r\n            if (! item.style.height) {\r\n                item.style.height = rect.height + 'px';\r\n            }\r\n        } else {\r\n            // No floating action found\r\n            editorAction = false;\r\n        }\r\n\r\n        isOpened(element);\r\n\r\n        focus(e);\r\n    }\r\n\r\n    const calculateAngle = function(x1, y1, x2, y2, x3, y3) {\r\n        // Calculate dx and dy for the first line\r\n        const dx1 = x2 - x1;\r\n        const dy1 = y2 - y1;\r\n        // Calculate dx and dy for the second line\r\n        const dx2 = x3 - x1;\r\n        const dy2 = y3 - y1;\r\n        // Calculate the angle for the first line\r\n        let angle1 = Math.atan2(dy1, dx1);\r\n        // Calculate the angle for the second line\r\n        let angle2 = Math.atan2(dy2, dx2);\r\n        // Calculate the angle difference in radians\r\n        let angleDifference = angle2 - angle1;\r\n        // Convert the angle difference to degrees\r\n        angleDifference = angleDifference * (180 / Math.PI);\r\n        // Normalize the angle difference to be within [0, 360) degrees\r\n        if (angleDifference < 0) {\r\n            angleDifference += 360;\r\n        }\r\n        return angleDifference;\r\n    }\r\n\r\n    const mouseUp = function(e) {\r\n        if (editorAction && editorAction.e) {\r\n            if (typeof(editorAction.e.refresh) == 'function' && state.actioned) {\r\n                editorAction.e.refresh();\r\n            }\r\n            editorAction.e.style.cursor = '';\r\n        }\r\n\r\n        // Reset\r\n        state = {\r\n            x: null,\r\n            y: null,\r\n        }\r\n\r\n        editorAction = false;\r\n    }\r\n\r\n    const mouseMove = function(e) {\r\n        if (editorAction) {\r\n            let x = e.clientX || e.pageX;\r\n            let y = e.clientY || e.pageY;\r\n\r\n            if (state.x == null && state.y == null) {\r\n                state.x = x;\r\n                state.y = y;\r\n            }\r\n\r\n            // Action on going\r\n            if (editorAction.action === 'move') {\r\n                var dx = x - state.x;\r\n                var dy = y - state.y;\r\n                var top = editorAction.e.offsetTop + dy;\r\n                var left = editorAction.e.offsetLeft + dx;\r\n\r\n                // Update position\r\n                editorAction.e.style.top = top + 'px';\r\n                editorAction.e.style.left = left + 'px';\r\n\r\n                // Update element\r\n                if (typeof (editorAction.e.refresh) == 'function') {\r\n                    state.actioned = true;\r\n                    editorAction.e.refresh('position', top, left);\r\n                }\r\n            } else if (editorAction.action === 'rotate') {\r\n                let ox = editorAction.l+editorAction.w/2;\r\n                let oy = editorAction.t+editorAction.h/2;\r\n                let angle = calculateAngle(ox, oy, editorAction.x, editorAction.y, x, y);\r\n                angle = angle + editorAction.a % 360;\r\n                angle = Math.round(angle / 2) * 2;\r\n                editorAction.e.style.rotate = `${angle}deg`;\r\n                // Update element\r\n                if (typeof (editorAction.e.refresh) == 'function') {\r\n                    state.actioned = true;\r\n                    editorAction.e.refresh('rotate', angle);\r\n                }\r\n            } else if (editorAction.action === 'resize') {\r\n                let top = null;\r\n                let left = null;\r\n                let width = null;\r\n                let height = null;\r\n\r\n                if (editorAction.d == 'e-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'se-resize') {\r\n                    width = editorAction.e.offsetWidth + (x - state.x);\r\n\r\n                    if (e.shiftKey) {\r\n                        height = editorAction.e.offsetHeight + (x - state.x) * (editorAction.e.offsetHeight / editorAction.e.offsetWidth);\r\n                    }\r\n                } else if (editorAction.d === 'w-resize' || editorAction.d == 'nw-resize'|| editorAction.d == 'sw-resize') {\r\n                    left = editorAction.e.offsetLeft + (x - state.x);\r\n                    width = editorAction.e.offsetLeft + editorAction.e.offsetWidth - left;\r\n\r\n                    if (e.shiftKey) {\r\n                        height = editorAction.e.offsetHeight - (x - state.x) * (editorAction.e.offsetHeight / editorAction.e.offsetWidth);\r\n                    }\r\n                }\r\n\r\n                if (editorAction.d == 's-resize' || editorAction.d == 'se-resize' || editorAction.d == 'sw-resize') {\r\n                    if (! height) {\r\n                        height = editorAction.e.offsetHeight + (y - state.y);\r\n                    }\r\n                } else if (editorAction.d === 'n-resize' || editorAction.d == 'ne-resize' || editorAction.d == 'nw-resize') {\r\n                    top = editorAction.e.offsetTop + (y - state.y);\r\n                    height = editorAction.e.offsetTop + editorAction.e.offsetHeight - top;\r\n                }\r\n\r\n                if (top) {\r\n                    editorAction.e.style.top = top + 'px';\r\n                }\r\n                if (left) {\r\n                    editorAction.e.style.left = left + 'px';\r\n                }\r\n                if (width) {\r\n                    editorAction.e.style.width = width + 'px';\r\n                }\r\n                if (height) {\r\n                    editorAction.e.style.height = height + 'px';\r\n                }\r\n\r\n                // Update element\r\n                if (typeof(editorAction.e.refresh) == 'function') {\r\n                    state.actioned = true;\r\n                    editorAction.e.refresh('dimensions', width, height);\r\n                }\r\n            }\r\n\r\n            state.x = x;\r\n            state.y = y;\r\n        } else {\r\n            let element = getElement(e);\r\n            // Resize action\r\n            let item = jSuites.findElement(element, 'jpanel');\r\n            // Found eligible component\r\n            if (item) {\r\n                // Resizing action\r\n                let controls = item.classList.contains('jpanel-controls');\r\n                if (controls) {\r\n                    let position = element.getAttribute('data-position');\r\n                    if (position) {\r\n                        item.style.cursor = position;\r\n                    } else {\r\n                        item.style.cursor = '';\r\n                    }\r\n                } else if (item.getAttribute('tabindex')) {\r\n                    let rect = item.getBoundingClientRect();\r\n                    //console.log(e.clientY - rect.top, rect.width - (e.clientX - rect.left), cornerSize)\r\n                    if (e.clientY - rect.top < cornerSize) {\r\n                        if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                            item.style.cursor = 'ne-resize';\r\n                        } else if (e.clientX - rect.left < cornerSize) {\r\n                            item.style.cursor = 'nw-resize';\r\n                        } else {\r\n                            item.style.cursor = 'n-resize';\r\n                        }\r\n                    } else if (rect.height - (e.clientY - rect.top) < cornerSize) {\r\n                        if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                            item.style.cursor = 'se-resize';\r\n                        } else if (e.clientX - rect.left < cornerSize) {\r\n                            item.style.cursor = 'sw-resize';\r\n                        } else {\r\n                            item.style.cursor = 's-resize';\r\n                        }\r\n                    } else if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                        item.style.cursor = 'e-resize';\r\n                    } else if (e.clientX - rect.left < cornerSize) {\r\n                        item.style.cursor = 'w-resize';\r\n                    } else {\r\n                        item.style.cursor = '';\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let position = ['n','ne','e','se','s','sw','w','nw','rotate'];\r\n    position.forEach(function(v, k) {\r\n        position[k] = document.createElement('div');\r\n        position[k].classList.add('jpanel-action');\r\n        if (v === 'rotate') {\r\n            position[k].setAttribute('data-action', 'rotate');\r\n        } else {\r\n            position[k].setAttribute('data-action', 'resize');\r\n            position[k].setAttribute('data-position', v + '-resize');\r\n        }\r\n    });\r\n\r\n    let currentElement;\r\n\r\n    const focus = function(e) {\r\n        let element = getElement(e);\r\n        // Check if this is the floating\r\n        let item = jSuites.findElement(element, 'jpanel');\r\n        if (item && ! item.classList.contains(\"readonly\") && item.classList.contains('jpanel-controls')) {\r\n            item.append(...position);\r\n\r\n            if (! item.classList.contains('jpanel-rotate')) {\r\n                position[position.length-1].remove();\r\n            }\r\n\r\n            currentElement = item;\r\n        } else {\r\n            blur(e);\r\n        }\r\n    }\r\n\r\n    const blur = function(e) {\r\n        if (currentElement) {\r\n            position.forEach(function(v) {\r\n                v.remove();\r\n            });\r\n            currentElement = null;\r\n        }\r\n    }\r\n\r\n    const mouseOver = function(e) {\r\n        let element = getElement(e);\r\n        var message = element.getAttribute('data-tooltip');\r\n        if (message) {\r\n            // Instructions\r\n            tooltip.innerText = message;\r\n\r\n            // Position\r\n            if (e.changedTouches && e.changedTouches[0]) {\r\n                var x = e.changedTouches[0].clientX;\r\n                var y = e.changedTouches[0].clientY;\r\n            } else {\r\n                var x = e.clientX;\r\n                var y = e.clientY;\r\n            }\r\n\r\n            tooltip.style.top = y + 'px';\r\n            tooltip.style.left = x + 'px';\r\n            document.body.appendChild(tooltip);\r\n        } else if (tooltip.innerText) {\r\n            tooltip.innerText = '';\r\n            document.body.removeChild(tooltip);\r\n        }\r\n    }\r\n\r\n    const contextMenu = function(e) {\r\n        var item = document.activeElement;\r\n        if (item && typeof(item.contextmenu) == 'function') {\r\n            // Create edition\r\n            item.contextmenu(e);\r\n\r\n            e.preventDefault();\r\n            e.stopImmediatePropagation();\r\n        } else {\r\n            // Search for possible context menus\r\n            item = jSuites.findElement(e.target, function(o) {\r\n                return o.tagName && o.getAttribute('aria-contextmenu-id');\r\n            });\r\n\r\n            if (item) {\r\n                var o = document.querySelector('#' + item);\r\n                if (! o) {\r\n                    console.error('JSUITES: contextmenu id not found: ' + item);\r\n                } else {\r\n                    o.contextmenu.open(e);\r\n                    e.preventDefault();\r\n                    e.stopImmediatePropagation();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    const keyDown = function(e) {\r\n        let item = document.activeElement;\r\n        if (item) {\r\n            if (e.key === \"Delete\" && typeof(item.delete) == 'function') {\r\n                item.delete();\r\n                e.preventDefault();\r\n                e.stopImmediatePropagation();\r\n            }\r\n        }\r\n\r\n        let state = window['jSuitesStateControl'];\r\n        if (state && state.length > 0) {\r\n            item = state[state.length - 1];\r\n            if (item) {\r\n                if (e.key === \"Escape\" && typeof(item.isOpened) == 'function' && typeof(item.close) == 'function') {\r\n                    if (item.isOpened()) {\r\n                        item.close();\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    const input = function(e) {\r\n        if (e.target.getAttribute('data-mask') || e.target.mask) {\r\n            jSuites.mask.oninput(e);\r\n        }\r\n    }\r\n\r\n    document.addEventListener('focusin', focus);\r\n    document.addEventListener('mouseup', mouseUp);\r\n    document.addEventListener(\"mousedown\", mouseDown);\r\n    document.addEventListener('mousemove', mouseMove);\r\n    document.addEventListener('mouseover', mouseOver);\r\n    document.addEventListener('keydown', keyDown);\r\n    document.addEventListener('contextmenu', contextMenu);\r\n    document.addEventListener('input', input);\r\n}\r\n\r\nif (typeof(document) !== \"undefined\") {\r\n    Events();\r\n}\r\n\r\n/* harmony default export */ var jsuites = (jSuites);\n}();\njSuites = __webpack_exports__[\"default\"];\n/******/ })()\n;\n\n    return jSuites;\n})));"]}